briareus
Version:
Briareus assists with Feature Branch deploys to ECS
91 lines (78 loc) • 2.85 kB
JavaScript
const express = require('express');
const async = require('async');
const taskDefinitionValidator = require('../../taskDefinitionValidator');
const mw = require('../middleware');
const Variant = require('../variant');
const persistance = require('../persistance');
const errors = require('../errors');
module.exports = function (service) {
let controller = express.Router();
controller.use(mw.auth(service));
/************************
* List Variants ( Feature Branches )
*************************/
controller.get('/', (req, res, next) => {
persistance.listVariants((err, results) => {
if (err) return next(err);
res.status(200).json({
data: results.Items
});
})
});
/************************
* Create Variant
*************************/
function preventSlugConflict(req, res, next) {
let slug = req.body.slug;
persistance.getVariant(slug, (err, data) => {
if (err) return next(err);
if (data) return next(new errors.InputValidationError(`Variant with slug "${slug}" already exists`));
next();
});
}
controller.post('/', [mw.validate(service, 'variant'), preventSlugConflict], (req, res, next) => {
let ctx = req.context;
let data = req.body;
data.ecsClusterArn = service.config.get('ecsClusterArn');
data.baseHostname = service.config.get('baseHostname');
data.hostedZoneId = service.config.get('hostedZoneId');
data.kmsKeyArn = service.config.get('kmsKeyArn');
data.taskExecutionRoleArn = service.config.get('taskExecutionRoleArn');
data.variantsLogGroup = service.config.get('variantsLogGroup');
data.alb = { arn: service.config.get('albArn') };
let variant = new Variant(ctx, data);
async.series([
(next) => {
variant.save((err) => {
if (err) return next(err);
res.status(201).json({ data: variant.data });
next();
})
},
(next) => variant.provision(next),
], (err) => {
// If we have a failure, just log it. This action was async from request flow so nothing to return to client
if (err) return ctx.log.error({ err }, 'Variant provisioning failed');
ctx.log.info(`Variant provisioning complete: ${variant.data.endpoint.host}`);
});
});
/************************
* Get Variant
*************************/
controller.get('/:slug', mw.findVariant(service), (req, res, next) => {
res.status(200).json({ data: req.variant });
});
/************************
* Delete Variant
*************************/
controller.delete('/:slug', mw.findVariant(service), (req, res, next) => {
let ctx = req.context;
let variant = new Variant(ctx, req.variant);
variant.destroy((err) => {
if (err) return next(err);
res.status(204).send("");
});
});
return controller;
};