@salto-io/da-playa
Version:
Deploy locks management (CLI and Slackbot)
83 lines • 4.7 kB
JavaScript
;
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