tools/scheduled-deployments/functions/index.js (95 lines of code) (raw):
/**
* @fileoverview Define Cloud Functions that execute stages of the
* Scheduled Deployments workflow.
*/
'use strict';
const async = require('async');
const constants = require('./constants');
const datastore = require('./datastore');
const deploy = require('./deploy');
const logging = require('./logging');
const schedule = require('./schedule');
/**
* Create, read, update, or delete a Scheduled Deployment entity in Datastore
* according to details from a JSON payload.
*
* @param {!Object} req - HTTP request context.
* @param {!Object} res - HTTP response context.
*/
exports.router = (req, res) => {
const name = schedule.parseNameFromUrl(req.url, req.method);
const data = req.body;
if (req.method === 'POST') {
schedule.create(name, data, res);
} else {
datastore.getEntitiesWithFilter(constants.KIND, 'name', name)
.then((results) => {
const entities = results[0];
if (entities.length === 0) {
res.status(404).send(
`No Scheduled Deployments found with name '${name}'.`);
return;
} else if (entities.length > 1) {
res.status(409).send(
`More than one Scheduled Deployment found with name '${
name
}'.`);
return;
}
const entity = entities[0];
switch (req.method) {
case 'GET':
schedule.read(name, entity, res);
return new Promise.resolve('yay');
break;
case 'PUT':
schedule.update(name, entity, data, res);
break;
case 'DELETE':
schedule.delete(name, entity, res);
break;
default:
res.status(405).send(
{error: `Undefined request type ${req.method}.`});
}
})
.catch((err) => {
res.status(500).send(
{error: `Unable to retrieve Scheduled Deployment '${name}'.` + err.message});
});
}
};
/**
* Check Scheduled Deployment entities in Datastore and make all necessary
* deployments using Deployment Manager.
*
* @param {!Object} event - Event from Pub/Sub trigger.
* @param {!function(?Error=, *=)} callback - Callback function.
*/
exports.deployScheduledDeployments = (event, callback) => {
logging.logMessage('Checking for Scheduled Deployments to deploy.');
datastore.getEntities(constants.KIND)
.then((results) => {
const scheduledDeployments = results[0];
if (scheduledDeployments.length === 0) {
logging.logMessage(
'No Scheduled Deployments entries found in Datastore.');
callback();
return;
}
async.forEachOf(
scheduledDeployments,
(scheduledDeployment, _, asyncCallback) => {
deploy.getTriggers(scheduledDeployment)
.then((triggers) => {
return deploy.getActiveTriggers(
triggers, scheduledDeployment);
})
.then((activeTriggers) => {
deploy.processActiveTriggers(
activeTriggers, scheduledDeployment);
asyncCallback();
})
.catch((err) => {
return asyncCallback(err);
logging.logError(
`Unable to retrieve Trigger entities for Scheduled ` +
`Deployment ${scheduledDeployment.name}.`,
err);
});
},
(err) => {
if (err) {
throw err;
} else {
callback();
}
});
})
.catch((err) => {
throw new Error(
'Unable to retrieve Scheduled Deployment entities.', err);
});
};