@nosana/sdk
Advanced tools
Comparing version 0.1.49 to 0.1.50
@@ -26,3 +26,3 @@ #!/usr/bin/env node | ||
.addOption(new Option('--raw', 'display raw json job and result')) | ||
.addOption(new Option('--finish, --completed', 'wait for job to be completed and show result')) | ||
.addOption(new Option('--completed', 'wait for job to be completed and show result')) | ||
.action(run); | ||
@@ -34,2 +34,3 @@ program | ||
.addOption(new Option('--raw', 'display raw json job and result')) | ||
.addOption(new Option('--completed', 'wait for job to be completed and show result')) | ||
.action(get); | ||
@@ -36,0 +37,0 @@ async function startCLI() { |
@@ -0,3 +1,5 @@ | ||
import { Command } from 'commander'; | ||
import { Client } from '../'; | ||
export declare function get(jobAddress: string, options: { | ||
[key: string]: any; | ||
}): Promise<void>; | ||
}, cmd: Command | undefined, nosana?: Client): Promise<void>; |
import { getSDK } from './index.js'; | ||
import util from 'util'; | ||
import { sleep } from '../utils.js'; | ||
/** | ||
@@ -14,42 +15,135 @@ * Shell swag colors for logging | ||
}; | ||
export async function get(jobAddress, options) { | ||
const nosana = getSDK(); | ||
const job = await nosana.jobs.get(jobAddress); | ||
if (options.raw) { | ||
console.log(util.inspect(job, { showHidden: false, depth: null, colors: true })); | ||
export async function get(jobAddress, options, cmd, nosana) { | ||
if (!nosana) { | ||
nosana = getSDK(); | ||
} | ||
else { | ||
console.log(`Job:\t\t${colors.BLUE}https://explorer.nosana.io/jobs/${jobAddress}${nosana.solana.config.network.includes('devnet') ? '?network=devnet' : ''}${colors.RESET}`); | ||
console.log(`JSON flow:\t${colors.BLUE}${nosana.ipfs.config.gateway}${job.ipfsJob}${colors.RESET}`); | ||
console.log(`Result:\t\t${colors.BLUE}${nosana.ipfs.config.gateway}${job.ipfsResult}${colors.RESET}`); | ||
console.log(`Node:\t\t${colors.BLUE}https://explorer.nosana.io/nodes/${job.node}${nosana.solana.config.network.includes('devnet') ? '?network=devnet' : ''}${colors.RESET}`); | ||
console.log(`Market:\t\t${colors.BLUE}https://explorer.nosana.io/markets/${job.market}${nosana.solana.config.network.includes('devnet') ? '?network=devnet' : ''}${colors.RESET}`); | ||
console.log(`Price:\t\t${colors.CYAN}${job.price} NOS/s${colors.RESET}`); | ||
if (job.timeStart) { | ||
console.log(`Start Time:\t${colors.CYAN}${new Date(job.timeStart * 1000)}${colors.RESET}`); | ||
let job; | ||
while (!job || | ||
(options.completed && job.state !== 'COMPLETED' && job.state !== 'STOPPED')) { | ||
console.log('retrieving job...'); | ||
try { | ||
job = await nosana.jobs.get(jobAddress); | ||
} | ||
if (job.timeEnd) { | ||
console.log(`Duration:\t${colors.CYAN}${job.timeEnd - job.timeStart} s${colors.RESET}`); | ||
catch (e) { | ||
console.error(e); | ||
} | ||
console.log(`Status:\t\t${job.state === 'COMPLETED' ? colors.GREEN : colors.CYAN}${job.state}${colors.RESET}`); | ||
if (job) { | ||
if (!options.completed || | ||
job.state === 'COMPLETED' || | ||
job.state === 'STOPPED') { | ||
if (options.raw) { | ||
console.log(util.inspect(job, { showHidden: false, depth: null, colors: true })); | ||
} | ||
else { | ||
console.log(`Job:\t\t${colors.BLUE}https://explorer.nosana.io/jobs/${jobAddress}${nosana.solana.config.network.includes('devnet') | ||
? '?network=devnet' | ||
: ''}${colors.RESET}`); | ||
console.log(`JSON flow:\t${colors.BLUE}${nosana.ipfs.config.gateway}${job.ipfsJob}${colors.RESET}`); | ||
console.log(`Result:\t\t${colors.BLUE}${nosana.ipfs.config.gateway}${job.ipfsResult}${colors.RESET}`); | ||
console.log(`Node:\t\t${colors.BLUE}https://explorer.nosana.io/nodes/${job.node}${nosana.solana.config.network.includes('devnet') | ||
? '?network=devnet' | ||
: ''}${colors.RESET}`); | ||
console.log(`Market:\t\t${colors.BLUE}https://explorer.nosana.io/markets/${job.market}${nosana.solana.config.network.includes('devnet') | ||
? '?network=devnet' | ||
: ''}${colors.RESET}`); | ||
console.log(`Price:\t\t${colors.CYAN}${job.price} NOS/s${colors.RESET}`); | ||
if (job.timeStart) { | ||
console.log(`Start Time:\t${colors.CYAN}${new Date(job.timeStart * 1000)}${colors.RESET}`); | ||
} | ||
if (job.timeEnd) { | ||
console.log(`Duration:\t${colors.CYAN}${job.timeEnd - job.timeStart} s${colors.RESET}`); | ||
} | ||
console.log(`Status:\t\t${job.state === 'COMPLETED' ? colors.GREEN : colors.CYAN}${job.state}${colors.RESET}`); | ||
} | ||
} | ||
else { | ||
console.log(`${job.state === 'COMPLETED' ? colors.GREEN : colors.CYAN}${job.state}${colors.RESET}`); | ||
await sleep(5); | ||
} | ||
} | ||
else { | ||
await sleep(1); | ||
} | ||
} | ||
if (job.state === 'COMPLETED') { | ||
const result = await nosana.ipfs.retrieve(job.ipfsResult); | ||
const ipfsResult = await nosana.ipfs.retrieve(job.ipfsResult); | ||
if (options.raw) { | ||
console.log(util.inspect(result, { showHidden: false, depth: null, colors: true })); | ||
console.log(util.inspect(ipfsResult, { | ||
showHidden: false, | ||
depth: null, | ||
colors: true, | ||
})); | ||
} | ||
else { | ||
if (result.results) { | ||
if (result.results.run) { | ||
console.log('Logs:'); | ||
const logs = result.results.run[1][1].log; | ||
let logString = ''; | ||
for (let i = 0; i < logs.length; i++) { | ||
logString += logs[i][1]; | ||
console.log('Logs:'); | ||
const result = ipfsResult?.results; | ||
if (result) { | ||
let commands = []; | ||
if (result['run-from-cli']) { | ||
commands.push('run-from-cli'); | ||
} | ||
else { | ||
const jsonFlow = await nosana.ipfs.retrieve(job.ipfsJob); | ||
if (jsonFlow.ops) { | ||
commands = jsonFlow.ops.map((j) => j.name || j.id); | ||
const type = jsonFlow.state && jsonFlow.state['nosana/job-type']; | ||
switch (type) { | ||
case 'Github': | ||
case 'github-flow': | ||
if (!commands.includes('checkout')) | ||
commands.unshift('checkout'); | ||
break; | ||
case 'gitlab': | ||
break; | ||
} | ||
} | ||
console.log(logString); | ||
} | ||
for (let i = 0; i < commands.length; i++) { | ||
const command = commands[i]; | ||
if (result[command] && !command.endsWith('-volume')) { | ||
console.log(`${colors.GREEN}- Executed step ${command}${colors.RESET}`); | ||
// const commandStatus = result[command][0]; | ||
const steps = result[command][1]; | ||
if (Array.isArray(steps)) { | ||
for (let j = 0; j < steps.length; j++) { | ||
const step = steps[j]; | ||
if (step.cmd) { | ||
if (step.cmd.cmd) { | ||
if (!step.cmd.cmd.startsWith('sh -c')) { | ||
console.log(`${colors.CYAN}$ ${step.cmd.cmd}${colors.RESET}`); | ||
} | ||
} | ||
else { | ||
console.log(`${colors.CYAN}$ ${step.cmd}${colors.RESET}`); | ||
} | ||
} | ||
if (step.log && Array.isArray(step.log)) { | ||
let logString = ''; | ||
for (let k = 0; k < step.log.length; k++) { | ||
const log = step.log[k]; | ||
const color = log[0] === 2 && step.status ? colors.RED : ''; | ||
logString += `${color}${log[1]}${colors.RESET}`; | ||
} | ||
console.log(logString); | ||
} | ||
if (step.error) { | ||
console.log(`${colors.RED}${step.error}${colors.RESET}`); | ||
} | ||
if (step.status) { | ||
console.log(`${colors.RED}Exited with code ${step.status}${colors.RESET}`); | ||
} | ||
} | ||
} | ||
else { | ||
console.log('TODO: print nicely'); | ||
console.log(steps); | ||
} | ||
} | ||
} | ||
} | ||
else { | ||
console.log(`${colors.RED}Cannot log results${colors.RESET}`); | ||
} | ||
} | ||
} | ||
} |
@@ -1,4 +0,4 @@ | ||
import { sleep } from '../utils.js'; | ||
import { colors } from './terminal.js'; | ||
import { getSDK } from './index.js'; | ||
import { get } from './get.js'; | ||
import util from 'util'; | ||
@@ -48,3 +48,3 @@ import fs from 'node:fs'; | ||
op: 'container/run', | ||
id: 'run', | ||
id: 'run-from-cli', | ||
args: { | ||
@@ -67,72 +67,6 @@ cmds: runThroughShellFile([command.join(' ')]), | ||
console.log('job posted!', response); | ||
let job; | ||
while (!job || | ||
(options.finish && job.state !== 'COMPLETED' && job.state !== 'STOPPED')) { | ||
console.log('retrieving job..'); | ||
try { | ||
job = await nosana.jobs.get(response.job); | ||
} | ||
catch (e) { | ||
console.error(e); | ||
} | ||
if (job) { | ||
if (!options.finish || | ||
job.state === 'COMPLETED' || | ||
job.state === 'STOPPED') { | ||
if (options.raw) { | ||
console.log(util.inspect(job, { showHidden: false, depth: null, colors: true })); | ||
} | ||
else { | ||
console.log(`Job:\t\t${colors.BLUE}https://explorer.nosana.io/jobs/${response.job}${nosana.solana.config.network.includes('devnet') | ||
? '?network=devnet' | ||
: ''}${colors.RESET}`); | ||
console.log(`JSON flow:\t${colors.BLUE}${nosana.ipfs.config.gateway}${job.ipfsJob}${colors.RESET}`); | ||
console.log(`Result:\t\t${colors.BLUE}${nosana.ipfs.config.gateway}${job.ipfsResult}${colors.RESET}`); | ||
console.log(`Node:\t\t${colors.BLUE}https://explorer.nosana.io/nodes/${job.node}${nosana.solana.config.network.includes('devnet') | ||
? '?network=devnet' | ||
: ''}${colors.RESET}`); | ||
console.log(`Market:\t\t${colors.BLUE}https://explorer.nosana.io/markets/${job.market}${nosana.solana.config.network.includes('devnet') | ||
? '?network=devnet' | ||
: ''}${colors.RESET}`); | ||
console.log(`Price:\t\t${colors.CYAN}${job.price} NOS/s${colors.RESET}`); | ||
if (job.timeStart) { | ||
console.log(`Start Time:\t${colors.CYAN}${new Date(job.timeStart * 1000)}${colors.RESET}`); | ||
} | ||
if (job.timeEnd) { | ||
console.log(`Duration:\t${colors.CYAN}${job.timeEnd - job.timeStart} s${colors.RESET}`); | ||
} | ||
console.log(`Status:\t\t${job.state === 'COMPLETED' ? colors.GREEN : colors.CYAN}${job.state}${colors.RESET}`); | ||
} | ||
} | ||
else { | ||
console.log(`${job.state === 'COMPLETED' ? colors.GREEN : colors.CYAN}${job.state}${colors.RESET}`); | ||
await sleep(5); | ||
} | ||
} | ||
else { | ||
await sleep(1); | ||
} | ||
} | ||
if (options.finish) { | ||
const result = await nosana.ipfs.retrieve(job.ipfsResult); | ||
if (options.raw) { | ||
console.log(util.inspect(result, { showHidden: false, depth: null, colors: true })); | ||
} | ||
else { | ||
if (result.results) { | ||
if (result.results.run) { | ||
console.log('Logs:'); | ||
const logs = result.results.run[1][1].log; | ||
let logString = ''; | ||
for (let i = 0; i < logs.length; i++) { | ||
logString += logs[i][1]; | ||
} | ||
console.log(logString); | ||
} | ||
} | ||
} | ||
} | ||
else { | ||
await get(response.job, options, undefined, nosana); | ||
if (!options.completed) { | ||
console.log(`\nrun ${colors.CYAN}\`nosana get ${response.job}\`${colors.RESET} to retrieve job and result`); | ||
} | ||
} |
{ | ||
"name": "@nosana/sdk", | ||
"version": "0.1.49", | ||
"version": "0.1.50", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
3550566
100975