UNPKG

aws-delivlib

Version:

A fabulous library for defining continuous pipelines for building, testing and releasing code libraries.

81 lines 10.3 kB
"use strict"; // 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==