kes
Version:
Making deployment to AWS using CloudFormation easier and fun
158 lines (140 loc) • 4.48 kB
JavaScript
;
const get = require('lodash.get');
const fs = require('fs');
const path = require('path');
const colors = require('colors/safe');
const yaml = require('js-yaml');
const prompt = require('prompt');
const program = require('commander');
const baseDir = process.cwd();
const kesFolder = path.join(baseDir, '.kes');
require('./readme');
const success = (r) => process.exit(0);
/**
* @name failure
* @private
*/
const failure = (e) => {
console.log(e);
if (e.message) {
console.log(e.message);
}
else {
console.log(e);
}
process.exit(1);
};
const init = function () {
if (fs.existsSync(kesFolder)) {
console.log('.kes folder already exists!');
process.exit(1);
}
const promptSchema = {
properties: {
stack: {
message: colors.white('Name the CloudFormation stack:'),
default: 'kes-cf-template'
},
stage: {
message: colors.white('Name the deployment stage:'),
default: 'dev'
},
bucket: {
message: colors.white('Bucket name used for deployment (required):'),
required: true
}
}
};
prompt.get(promptSchema, function (err, result) {
if (err) {
console.log(err);
process.exit(1);
}
console.log(kesFolder);
fs.mkdirSync(kesFolder);
fs.mkdirSync(path.join(baseDir, 'dist'));
console.log(`.kes folder created at ${kesFolder}`);
// copy simple config file and template
const config = yaml.safeLoad(fs.readFileSync(
path.join(__dirname, '..', 'examples/lambdas/config.yml'), 'utf8'));
config.stackName = result.stack;
config.stage = result.stage;
config.buckets.internal = result.bucket;
fs.writeFileSync(path.join(kesFolder, 'config.yml'), yaml.safeDump(config));
fs.createReadStream(
path.join(__dirname, '..', 'examples/lambdas/cloudformation.template.yml')
).pipe(fs.createWriteStream(path.join(kesFolder, 'cloudformation.template.yml')));
console.log('config files were copied');
});
};
//const configureProgram = function () {
program
.usage('init')
.description('Start a Kes project')
.action(() => {
init();
});
// the CLI activation
program
.usage('TYPE COMMAND [options]')
.option('-p, --profile <profile>', 'AWS profile name to use for authentication', null)
.option('--role <role>', 'AWS role arn to be assumed for the deployment', null)
.option('-c, --config <config>', 'Path to config file')
.option('--stage-file <stageFile>', 'Path to config file')
.option('--env-file <envFile>', 'Path to env file')
.option('--cf-file <cfFile>', 'Path to CloudFormation template')
.option('--kes-class <kesClass>', 'Kes Class override', null)
.option('-k, --kes-folder <kesFolder>', 'Path to config folder')
.option('-r, --region <region>', 'AWS region', null)
.option('--stack <stack>', 'stack name, defaults to the config value')
.option('--stage <stage>', 'stage name, defaults to the config value');
program
.command('cf [create|update|validate|compile]')
.description(`CloudFormation Operations:
create Creates the CF stack
update Updates the CF stack
validate Validates the CF stack
compile Compiles the CF stack`)
.action((cmd) => {
let Kes;
const kesClass = get(program, 'kesClass');
if (kesClass) {
Kes = require(path.join(process.cwd(), kesClass));
}
else {
Kes = require('../index').Kes;
}
const kes = new Kes(program);
switch (cmd) {
case 'create':
kes.createStack().then(r => success(r)).catch(e => failure(e));
break;
case 'update':
kes.updateStack().then(r => success(r)).catch(e => failure(e));
break;
case 'validate':
kes.validateTemplate().then(r => success(r)).catch(e => failure(e));
break;
case 'compile':
kes.compileCF().then(r => success(r)).catch(e => failure(e));
break;
default:
console.log('Wrong choice. Accepted arguments: [create|update|validate|compile|dlq]');
}
});
program
.command('lambda <lambdaName>')
.description('uploads a given lambda function to Lambda service')
.action((cmd, options) => {
if (cmd) {
const Kes = require('../index').Kes;
const kes = new Kes(program);
kes.updateSingleLambda(cmd).then(r => success(r)).catch(e => failure(e));
}
else {
console.log('Lambda name is missing');
}
});
program
.parse(process.argv);