@salto-io/da-playa
Version:
Deploy locks management (CLI and Slackbot)
162 lines (146 loc) • 4.99 kB
text/typescript
import { Command } from 'commander'
import { RunningJobs } from '../running'
import { log, prettify } from './common'
export { RunningJobsModelDetails } from '../running'
export const jobCommands = (
envDynamoDBRegion?: string
): Command => {
const getJobs = async ({
jobname,
ttl,
dynamoDBRegion,
skipped = false,
json = false,
}: {
jobname: string
dynamoDBRegion: string
ttl?: number
skipped?: boolean
json?: boolean
}): Promise<void> => {
const runningJobs = await RunningJobs({ dynamoDBRegion })
const listOfJobs = await runningJobs[skipped ? 'getSkippedJobs' : 'getRunningJobs']({ ttl, jobname })
if (json) {
log(JSON.stringify(listOfJobs))
return
}
log(
`Found ${prettify.misc(listOfJobs.length)} job${listOfJobs.length > 1 || listOfJobs.length === 0 ? 's' : ''} for ${prettify.env(
jobname,
)}${listOfJobs.length > 0 ? ':' : ''}`,
)
listOfJobs.forEach(job => {
log(
`User: ${prettify.user(job.user)}, Version: ${prettify.env(job.version)}`,
)
})
}
const program = new Command('jobs')
.description('Manage running jobs')
program
.command('get')
.description('get a job')
.requiredOption('--jobname <jobname>', 'Name')
.requiredOption('--gitversion <version>', 'Version')
.option('--json', 'Output raw json')
.option(
'--dynamoDBRegion <dynamoDBRegion>',
'DynamoDB Region (Optional, Taken from DAPLAYA_AWS_REGION if set)',
envDynamoDBRegion,
)
.action(async ({ jobname, json, gitversion, ...rest }) => {
const runningJobs = await RunningJobs(rest)
const job = await runningJobs.getJob({ version: gitversion, jobname })
if (!job) {
if (json) {
return
}
log(`No job found for version ${gitversion} on job ${jobname}`)
return
}
if (json) {
log(JSON.stringify(job))
return
}
log(
`Found job ${prettify.env(
job.jobname,
)} for ${prettify.user(job.user)} with version ${prettify.misc(job.version)}${prettify.error(job.skipped ? ' (skipped)' : '')}${prettify.user(job.ended !== undefined ? ' (ended)' : '')}`,
)
})
program
.command('start')
.description('start a job')
.requiredOption('--jobname <jobname>', 'Name')
.requiredOption('--user <user>', 'Trigger user')
.requiredOption('--gitversion <version>', 'Version')
.option(
'--dynamoDBRegion <dynamoDBRegion>',
'DynamoDB Region (Optional, Taken from DAPLAYA_AWS_REGION if set)',
envDynamoDBRegion,
)
.action(async ({ jobname, user, gitversion, ...rest }) => {
const runningJobs = await RunningJobs(rest)
const created = await runningJobs.startJob({ user, version: gitversion, jobname })
log(
`Created job ${prettify.env(
created.jobname,
)} for ${prettify.user(created.user)} with version ${prettify.misc(created.version)}`,
)
})
program
.command('end')
.description('end a job')
.requiredOption('--jobname <jobname>', 'Name')
.requiredOption('--user <user>', 'Trigger user')
.requiredOption('--gitversion <version>', 'Version')
.option(
'--dynamoDBRegion <dynamoDBRegion>',
'DynamoDB Region (Optional, Taken from DAPLAYA_AWS_REGION if set)',
envDynamoDBRegion,
)
.option('--skipped', 'Set job as skipped')
.action(async ({ jobname, user, gitversion, skipped, ...rest }) => {
const runningJobs = await RunningJobs(rest)
const ended = await runningJobs.endJob({ user, version: gitversion, jobname, skipped })
if (!ended) {
log(
'Did not find any job to end!'
)
} else {
log(
`Ended job ${prettify.env(
ended.jobname,
)} for ${prettify.user(ended.user)} with version ${prettify.misc(ended.version)}${skipped
? ` and marked as ${prettify.misc('skipped')}`
: ''
}`,
)
}
})
program
.command('active')
.description('Get\'s all running jobs')
.requiredOption('--jobname <jobname>', 'Job name')
.option(
'--dynamoDBRegion <dynamoDBRegion>',
'DynamoDB Region (Optional, Taken from DAPLAYA_AWS_REGION if set)',
envDynamoDBRegion,
)
.option('--ttl <ttl>', 'Timeframe in milliseconds to lookup active jobs')
.option('--json', 'Output raw json')
.action(getJobs)
program
.command('skipped')
.description('Get\'s all skipped jobs')
.requiredOption('--jobname <jobname>', 'Job Name')
.option(
'--dynamoDBRegion <dynamoDBRegion>',
'DynamoDB Region (Optional, Taken from DAPLAYA_AWS_REGION if set)',
envDynamoDBRegion,
)
.option('--ttl <ttl>', 'Timeframe in milliseconds to lookup active jobs')
.option('--json', 'Output raw json')
.action(params => getJobs({ ...params, skipped: true }))
return program
}