aws-delivlib
Version:
A fabulous library for defining continuous pipelines for building, testing and releasing code libraries.
81 lines • 10.3 kB
JavaScript
;
// eslint-disable-next-line import/no-extraneous-dependencies
Object.defineProperty(exports, "__esModule", { value: true });
exports.handler = void 0;
// eslint-disable-next-line import/no-extraneous-dependencies
const client_s3_1 = require("@aws-sdk/client-s3");
const disable_transition_1 = require("./disable-transition");
const time_window_1 = require("./time-window");
// tslint:disable:no-console
const s3 = new client_s3_1.S3();
/**
* Handler for a lambda function that can be called periodically in order to enforce Change Control calendars. It
* expects the following environment variables to be available:
*
* CHANGE_CONTROL_BUCKET_NAME - the name of the S3 Bucket containing the change control calendar
* CHANGE_CONTROL_OBJECT_KEY - the key in which the change control calendar is at in CHANGE_CONTROL_BUCKET_NAME
* PIPELINE_NAME - the name of the pipeline in which promotions will be managed
* STAGE_NAME - the name of the stage into which transitions are managed
*/
async function handler( /*_event: any, _context: any*/) {
const bucketName = env('CHANGE_CONTROL_BUCKET_NAME');
const objectKey = env('CHANGE_CONTROL_OBJECT_KEY');
const stageName = env('STAGE_NAME');
const pipelineName = env('PIPELINE_NAME');
console.log(`CHANGE_CONTROL_BUCKET_NAME: ${bucketName}`);
console.log(`CHANGE_CONTROL_OBJECT_KEY: ${bucketName}`);
console.log(`STAGE_NAME: ${bucketName}`);
console.log(`PIPELINE_NAME: ${bucketName}`);
try {
const icsData = await tryGetCalendarData(bucketName, objectKey);
const blockingEvent = (0, time_window_1.shouldBlockPipeline)(icsData, new Date());
if (blockingEvent) {
console.log(`Disabling transition into ${pipelineName}.${stageName} with reason ${blockingEvent.summary}`);
await (0, disable_transition_1.disableTransition)(pipelineName, stageName, blockingEvent.summary);
}
else {
console.log(`Enabling transition into ${pipelineName}.${stageName}`);
await (0, disable_transition_1.enableTransition)(pipelineName, stageName);
}
console.log('All Done!');
}
catch (e) {
console.log(`Error: ${e.message} - ${e.stack}`);
throw e;
}
}
exports.handler = handler;
function env(name) {
const x = process.env[name];
if (x === undefined) {
throw new Error(`Environment variable "${name}" is required`);
}
return x;
}
async function tryGetCalendarData(Bucket, Key) {
try {
const icsFile = await s3.getObject({ Bucket, Key });
console.log(`Calendar object version ID: ${icsFile.VersionId || '<unversioned>'}`);
return icsFile.Body.toString();
}
catch (e) {
// If the bucket or key don't exist, default to closed all the time!
if (e.code === 'NoSuchBucket' || e.code === 'NoSuchKey') {
console.log(`Calendar object could not be found (${e.message}), defaulting to closed.`);
return `
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Events Calendar//iCal4j 1.0//EN
BEGIN:VEVENT
DTSTAMP:20190215T095737Z
DTSTART:19700101T000000Z
DTEND:99991231T235959Z
SUMMARY:No change control calendar was found in s3://${Bucket}/${Key} !
END:VEVENT
END:VCALENDAR
`;
}
throw e;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsNkRBQTZEOzs7QUFHN0QsNkRBQTZEO0FBQzdELGtEQUF3QztBQUN4Qyw2REFBMkU7QUFDM0UsK0NBQW9EO0FBRXBELDRCQUE0QjtBQUM1QixNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQUUsRUFBRSxDQUFDO0FBRXBCOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sRUFBQyw4QkFBOEI7SUFDMUQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDckQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDbkQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUUxQyxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBRXpELElBQUk7UUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFtQixFQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSSxhQUFhLEVBQUU7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsWUFBWSxJQUFJLFNBQVMsZ0JBQWdCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzNHLE1BQU0sSUFBQSxzQ0FBaUIsRUFBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN6RTthQUFNO1lBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsWUFBWSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDckUsTUFBTSxJQUFBLHFDQUFnQixFQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDMUI7SUFBQyxPQUFPLENBQU0sRUFBRTtRQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxDQUFDO0tBQ1Q7QUFDSCxDQUFDO0FBMUJELDBCQTBCQztBQUVELFNBQVMsR0FBRyxDQUFDLElBQVk7SUFDdkIsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxlQUFlLENBQUMsQ0FBQztLQUMvRDtJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsR0FBVztJQUMzRCxJQUFJO1FBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsT0FBTyxDQUFDLFNBQVMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sT0FBTyxDQUFDLElBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNqQztJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2Ysb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxjQUFjLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7WUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLE9BQU8sMEJBQTBCLENBQUMsQ0FBQztZQUN4RixPQUFPOzs7Ozs7Ozt1REFRMEMsTUFBTSxJQUFJLEdBQUc7OztPQUc3RCxDQUFDO1NBQ0g7UUFDRCxNQUFNLENBQUMsQ0FBQztLQUNUO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBTMyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQgeyBkaXNhYmxlVHJhbnNpdGlvbiwgZW5hYmxlVHJhbnNpdGlvbiB9IGZyb20gJy4vZGlzYWJsZS10cmFuc2l0aW9uJztcbmltcG9ydCB7IHNob3VsZEJsb2NrUGlwZWxpbmUgfSBmcm9tICcuL3RpbWUtd2luZG93JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tY29uc29sZVxuY29uc3QgczMgPSBuZXcgUzMoKTtcblxuLyoqXG4gKiBIYW5kbGVyIGZvciBhIGxhbWJkYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5IGluIG9yZGVyIHRvIGVuZm9yY2UgQ2hhbmdlIENvbnRyb2wgY2FsZW5kYXJzLiBJdFxuICogZXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBhdmFpbGFibGU6XG4gKlxuICogQ0hBTkdFX0NPTlRST0xfQlVDS0VUX05BTUUgLSB0aGUgbmFtZSBvZiB0aGUgUzMgQnVja2V0IGNvbnRhaW5pbmcgdGhlIGNoYW5nZSBjb250cm9sIGNhbGVuZGFyXG4gKiBDSEFOR0VfQ09OVFJPTF9PQkpFQ1RfS0VZICAtIHRoZSBrZXkgaW4gd2hpY2ggdGhlIGNoYW5nZSBjb250cm9sIGNhbGVuZGFyIGlzIGF0IGluIENIQU5HRV9DT05UUk9MX0JVQ0tFVF9OQU1FXG4gKiBQSVBFTElORV9OQU1FICAgICAgICAgICAgICAtIHRoZSBuYW1lIG9mIHRoZSBwaXBlbGluZSBpbiB3aGljaCBwcm9tb3Rpb25zIHdpbGwgYmUgbWFuYWdlZFxuICogU1RBR0VfTkFNRSAgICAgICAgICAgICAgICAgLSB0aGUgbmFtZSBvZiB0aGUgc3RhZ2UgaW50byB3aGljaCB0cmFuc2l0aW9ucyBhcmUgbWFuYWdlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcigvKl9ldmVudDogYW55LCBfY29udGV4dDogYW55Ki8pIHtcbiAgY29uc3QgYnVja2V0TmFtZSA9IGVudignQ0hBTkdFX0NPTlRST0xfQlVDS0VUX05BTUUnKTtcbiAgY29uc3Qgb2JqZWN0S2V5ID0gZW52KCdDSEFOR0VfQ09OVFJPTF9PQkpFQ1RfS0VZJyk7XG4gIGNvbnN0IHN0YWdlTmFtZSA9IGVudignU1RBR0VfTkFNRScpO1xuICBjb25zdCBwaXBlbGluZU5hbWUgPSBlbnYoJ1BJUEVMSU5FX05BTUUnKTtcblxuICBjb25zb2xlLmxvZyhgQ0hBTkdFX0NPTlRST0xfQlVDS0VUX05BTUU6ICR7YnVja2V0TmFtZX1gKTtcbiAgY29uc29sZS5sb2coYENIQU5HRV9DT05UUk9MX09CSkVDVF9LRVk6ICAke2J1Y2tldE5hbWV9YCk7XG4gIGNvbnNvbGUubG9nKGBTVEFHRV9OQU1FOiAgICAgICAgICAgICAgICAgJHtidWNrZXROYW1lfWApO1xuICBjb25zb2xlLmxvZyhgUElQRUxJTkVfTkFNRTogICAgICAgICAgICAgICR7YnVja2V0TmFtZX1gKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGljc0RhdGEgPSBhd2FpdCB0cnlHZXRDYWxlbmRhckRhdGEoYnVja2V0TmFtZSwgb2JqZWN0S2V5KTtcbiAgICBjb25zdCBibG9ja2luZ0V2ZW50ID0gc2hvdWxkQmxvY2tQaXBlbGluZShpY3NEYXRhLCBuZXcgRGF0ZSgpKTtcbiAgICBpZiAoYmxvY2tpbmdFdmVudCkge1xuICAgICAgY29uc29sZS5sb2coYERpc2FibGluZyB0cmFuc2l0aW9uIGludG8gJHtwaXBlbGluZU5hbWV9LiR7c3RhZ2VOYW1lfSB3aXRoIHJlYXNvbiAke2Jsb2NraW5nRXZlbnQuc3VtbWFyeX1gKTtcbiAgICAgIGF3YWl0IGRpc2FibGVUcmFuc2l0aW9uKHBpcGVsaW5lTmFtZSwgc3RhZ2VOYW1lLCBibG9ja2luZ0V2ZW50LnN1bW1hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgRW5hYmxpbmcgdHJhbnNpdGlvbiBpbnRvICR7cGlwZWxpbmVOYW1lfS4ke3N0YWdlTmFtZX1gKTtcbiAgICAgIGF3YWl0IGVuYWJsZVRyYW5zaXRpb24ocGlwZWxpbmVOYW1lLCBzdGFnZU5hbWUpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnQWxsIERvbmUhJyk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHtlLm1lc3NhZ2V9IC0gJHtlLnN0YWNrfWApO1xuICAgIHRocm93IGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW52KG5hbWU6IHN0cmluZykge1xuICBjb25zdCB4ID0gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVudmlyb25tZW50IHZhcmlhYmxlIFwiJHtuYW1lfVwiIGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyeUdldENhbGVuZGFyRGF0YShCdWNrZXQ6IHN0cmluZywgS2V5OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpY3NGaWxlID0gYXdhaXQgczMuZ2V0T2JqZWN0KHsgQnVja2V0LCBLZXkgfSk7XG4gICAgY29uc29sZS5sb2coYENhbGVuZGFyIG9iamVjdCB2ZXJzaW9uIElEOiAke2ljc0ZpbGUuVmVyc2lvbklkIHx8ICc8dW52ZXJzaW9uZWQ+J31gKTtcbiAgICByZXR1cm4gaWNzRmlsZS5Cb2R5IS50b1N0cmluZygpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAvLyBJZiB0aGUgYnVja2V0IG9yIGtleSBkb24ndCBleGlzdCwgZGVmYXVsdCB0byBjbG9zZWQgYWxsIHRoZSB0aW1lIVxuICAgIGlmIChlLmNvZGUgPT09ICdOb1N1Y2hCdWNrZXQnIHx8IGUuY29kZSA9PT0gJ05vU3VjaEtleScpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBDYWxlbmRhciBvYmplY3QgY291bGQgbm90IGJlIGZvdW5kICgke2UubWVzc2FnZX0pLCBkZWZhdWx0aW5nIHRvIGNsb3NlZC5gKTtcbiAgICAgIHJldHVybiBgXG5CRUdJTjpWQ0FMRU5EQVJcblZFUlNJT046Mi4wXG5QUk9ESUQ6LS8vRXZlbnRzIENhbGVuZGFyLy9pQ2FsNGogMS4wLy9FTlxuQkVHSU46VkVWRU5UXG5EVFNUQU1QOjIwMTkwMjE1VDA5NTczN1pcbkRUU1RBUlQ6MTk3MDAxMDFUMDAwMDAwWlxuRFRFTkQ6OTk5OTEyMzFUMjM1OTU5WlxuU1VNTUFSWTpObyBjaGFuZ2UgY29udHJvbCBjYWxlbmRhciB3YXMgZm91bmQgaW4gczM6Ly8ke0J1Y2tldH0vJHtLZXl9ICFcbkVORDpWRVZFTlRcbkVORDpWQ0FMRU5EQVJcbiAgICAgIGA7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn1cbiJdfQ==