UNPKG

@salto-io/da-playa

Version:

Deploy locks management (CLI and Slackbot)

83 lines 4.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.lockCommands = exports.LockModelDetails = void 0; const commander_1 = require("commander"); const locker_1 = require("../locker"); const common_1 = require("./common"); var locker_2 = require("../locker"); Object.defineProperty(exports, "LockModelDetails", { enumerable: true, get: function () { return locker_2.LockModelDetails; } }); const UBERLOCK_UNIVERSAL_SIGN = '(ノ≥∇≤)ノ'; const RETRY_SECONDS = 5; const lockCommands = (envDynamoDBRegion) => { const program = new commander_1.Command('locks') .description('Manage locks'); program .command('lock') .description('Locks an environment for a user') .requiredOption('--user <user>', 'User to lock for') .requiredOption('--env <env>', 'Environment to lock') .option('--dynamoDBRegion <dynamoDBRegion>', 'DynamoDB Region (Optional, Taken from DAPLAYA_AWS_REGION if set)', envDynamoDBRegion) .option('--uberlock', 'Lock current env until explicitly released') .option('--meta <meta>', 'Extra metadata to save') .action(async ({ user, env, uberlock, meta, ...rest }) => { const locker = await (0, locker_1.Locker)(rest); const lockInterval = setInterval(async () => { const lockResult = await locker.lock({ user, env, uberlock, meta }); if ('currentLock' in lockResult) { const { currentLock } = lockResult; if (currentLock.uberlock) { (0, common_1.log)(`${common_1.prettify.env(env)} is uberlocked ${common_1.prettify.misc(UBERLOCK_UNIVERSAL_SIGN)} by ${common_1.prettify.user(currentLock.user)}`); process.exit(1); } (0, common_1.log)(`${common_1.prettify.env(env)} is currently locked by ${common_1.prettify.user(currentLock.user)}, retrying in ${common_1.prettify.misc(RETRY_SECONDS)} seconds`); } else { (0, common_1.log)(`${common_1.prettify.env(env)} succesfully locked for ${common_1.prettify.user(user)}${lockResult.uberlock ? ` uberlock ${common_1.prettify.misc(UBERLOCK_UNIVERSAL_SIGN)}` : ''}`); clearInterval(lockInterval); } }, RETRY_SECONDS * 1000); }); program .command('release') .description('Releases an environment for a user') .requiredOption('--user <user>', 'User to release') .requiredOption('--env <env>', 'Environment to release') .option('--uberlock', 'Release even if UBERLOCKED') .option('--dynamoDBRegion <dynamoDBRegion>', 'DynamoDB Region (Optional, Taken from DAPLAYA_AWS_REGION if set)', envDynamoDBRegion) .action(async ({ user, env, uberlock, ...rest }) => { const locker = await (0, locker_1.Locker)(rest); const releaseResult = await locker.release({ user, env, uberlock }); if ('notLockedBy' in releaseResult) { (0, common_1.log)(`${common_1.prettify.env(env)} was not locked...`); } else if ('currentLock' in releaseResult) { (0, common_1.log)(`${common_1.prettify.env(env)} is uberlocked ${common_1.prettify.misc(UBERLOCK_UNIVERSAL_SIGN)} by user ${common_1.prettify.user(user)}...`); } else { (0, common_1.log)(`Released ${common_1.prettify.env(env)} for user ${common_1.prettify.user(user)}${releaseResult.uberlock ? ` no longer uberlocked ${common_1.prettify.misc(UBERLOCK_UNIVERSAL_SIGN)}` : ''}`); } }); program .command('list') .description('List current locks') .requiredOption('--env <env>', 'Environment to release') .option('--dynamoDBRegion <dynamoDBRegion>', 'DynamoDB Region (Optional, Taken from DAPLAYA_AWS_REGION if set)', envDynamoDBRegion) .action(async ({ env, ...rest }) => { const locker = await (0, locker_1.Locker)(rest); const locks = await locker.locks(env); if (!locks.length) { (0, common_1.log)(`No locks found for ${common_1.prettify.env(env)}`); } else { (0, common_1.log)(`Found ${common_1.prettify.misc(locks.length)} lock${locks.length > 1 ? 's' : ''} for ${common_1.prettify.env(env)}:`); locks.forEach(lock => { (0, common_1.log)(`User: ${common_1.prettify.user(lock.user)}${lock.uberlock ? ` uberlock ${common_1.prettify.misc(UBERLOCK_UNIVERSAL_SIGN)}` : ''}${lock.meta ? ` ${common_1.prettify.misc(lock.meta)}` : ''}`); }); } }); return program; }; exports.lockCommands = lockCommands; //# sourceMappingURL=locks.js.map