UNPKG

@aws-cdk/integ-tests-alpha

Version:

CDK Integration Testing Constructs

138 lines 14.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CustomResourceHandler = void 0; /* eslint-disable import/no-extraneous-dependencies */ /* eslint-disable no-console */ const https = require("https"); const url = require("url"); const client_sfn_1 = require("@aws-sdk/client-sfn"); class CustomResourceHandler { event; context; physicalResourceId; timeout; timedOut = false; constructor(event, context) { this.event = event; this.context = context; this.timeout = setTimeout(async () => { await this.respond({ status: 'FAILED', reason: 'Lambda Function Timeout', data: this.context.logStreamName, }); this.timedOut = true; }, context.getRemainingTimeInMillis() - 1200); this.event = event; this.physicalResourceId = extractPhysicalResourceId(event); } /** * Handles executing the custom resource event. If `stateMachineArn` is present * in the props then trigger the waiter statemachine */ async handle() { try { if ('stateMachineArn' in this.event.ResourceProperties) { const req = { stateMachineArn: this.event.ResourceProperties.stateMachineArn, name: this.event.RequestId, input: JSON.stringify(this.event), }; await this.startExecution(req); return; } else { const response = await this.processEvent(this.event.ResourceProperties); return response; } } catch (e) { console.log(e); throw e; } finally { clearTimeout(this.timeout); } } /** * Handle async requests from the waiter state machine */ async handleIsComplete() { try { const result = await this.processEvent(this.event.ResourceProperties); return result; } catch (e) { console.log(e); return; } finally { clearTimeout(this.timeout); } } /** * Start a step function state machine which will wait for the request * to be successful. */ async startExecution(req) { try { const sfn = new client_sfn_1.SFN({}); await sfn.startExecution(req); } finally { clearTimeout(this.timeout); } } respond(response) { if (this.timedOut) { return; } const cfResponse = { Status: response.status, Reason: response.reason, PhysicalResourceId: this.physicalResourceId, StackId: this.event.StackId, RequestId: this.event.RequestId, LogicalResourceId: this.event.LogicalResourceId, NoEcho: false, Data: response.data, }; const responseBody = JSON.stringify(cfResponse); console.log('Responding to CloudFormation', responseBody); const parsedUrl = url.parse(this.event.ResponseURL); const requestOptions = { hostname: parsedUrl.hostname, path: parsedUrl.path, method: 'PUT', headers: { 'content-type': '', 'content-length': Buffer.byteLength(responseBody, 'utf8'), }, }; return new Promise((resolve, reject) => { try { const request = https.request(requestOptions, resolve); request.on('error', reject); request.write(responseBody); request.end(); } catch (e) { reject(e); } finally { clearTimeout(this.timeout); } }); } } exports.CustomResourceHandler = CustomResourceHandler; function extractPhysicalResourceId(event) { switch (event.RequestType) { case 'Create': return event.LogicalResourceId; case 'Update': case 'Delete': return event.PhysicalResourceId; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQXNEO0FBQ3RELCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IsMkJBQTJCO0FBRTNCLG9EQUEwQztBQVExQyxNQUFzQixxQkFBcUI7SUFLVjtJQUF1RTtJQUp0RixrQkFBa0IsQ0FBUztJQUMxQixPQUFPLENBQWlCO0lBQ2pDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFekIsWUFBK0IsS0FBa0QsRUFBcUIsT0FBMEI7UUFBakcsVUFBSyxHQUFMLEtBQUssQ0FBNkM7UUFBcUIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFDOUgsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbkMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNqQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLHlCQUF5QjtnQkFDakMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTthQUNqQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLEVBQUUsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzVEO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLE1BQU07UUFDakIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sR0FBRyxHQUF3QjtvQkFDL0IsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsZUFBZTtvQkFDOUQs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QUFDO1FBRUYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM1QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEIsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osQ0FBQztvQkFBUyxDQUFDO2dCQUNULFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0tBQ0o7Q0FDRjtBQXBIRCxzREFvSEM7QUFFRCxTQUFTLHlCQUF5QixDQUFDLEtBQWtEO0lBQ25GLFFBQVEsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFCLEtBQUssUUFBUTtZQUNYLE9BQU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDO1FBQ2pDLEtBQUssUUFBUSxDQUFDO1FBQ2QsS0FBSyxRQUFRO1lBQ1gsT0FBTyxLQUFLLENBQUMsa0JBQWtCLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCAqIGFzIHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IHR5cGUgeyBTdGFydEV4ZWN1dGlvbklucHV0IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNmbic7XG5pbXBvcnQgeyBTRk4gfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc2ZuJztcblxuaW50ZXJmYWNlIEhhbmRsZXJSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHN0YXR1czogJ1NVQ0NFU1MnIHwgJ0ZBSUxFRCc7XG4gIHJlYWRvbmx5IHJlYXNvbjogJ09LJyB8IHN0cmluZztcbiAgcmVhZG9ubHkgZGF0YT86IGFueTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEN1c3RvbVJlc291cmNlSGFuZGxlcjxSZXF1ZXN0IGV4dGVuZHMgb2JqZWN0LCBSZXNwb25zZSBleHRlbmRzIG9iamVjdD4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dDogTm9kZUpTLlRpbWVvdXQ7XG4gIHByaXZhdGUgdGltZWRPdXQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIHByb3RlY3RlZCByZWFkb25seSBjb250ZXh0OiBBV1NMYW1iZGEuQ29udGV4dCkge1xuICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHtcbiAgICAgICAgc3RhdHVzOiAnRkFJTEVEJyxcbiAgICAgICAgcmVhc29uOiAnTGFtYmRhIEZ1bmN0aW9uIFRpbWVvdXQnLFxuICAgICAgICBkYXRhOiB0aGlzLmNvbnRleHQubG9nU3RyZWFtTmFtZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy50aW1lZE91dCA9IHRydWU7XG4gICAgfSwgY29udGV4dC5nZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMoKSAtIDEyMDApO1xuICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgICB0aGlzLnBoeXNpY2FsUmVzb3VyY2VJZCA9IGV4dHJhY3RQaHlzaWNhbFJlc291cmNlSWQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgZXhlY3V0aW5nIHRoZSBjdXN0b20gcmVzb3VyY2UgZXZlbnQuIElmIGBzdGF0ZU1hY2hpbmVBcm5gIGlzIHByZXNlbnRcbiAgICogaW4gdGhlIHByb3BzIHRoZW4gdHJpZ2dlciB0aGUgd2FpdGVyIHN0YXRlbWFjaGluZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPFJlc3BvbnNlIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgnc3RhdGVNYWNoaW5lQXJuJyBpbiB0aGlzLmV2ZW50LlJlc291cmNlUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCByZXE6IFN0YXJ0RXhlY3V0aW9uSW5wdXQgPSB7XG4gICAgICAgICAgc3RhdGVNYWNoaW5lQXJuOiB0aGlzLmV2ZW50LlJlc291cmNlUHJvcGVydGllcy5zdGF0ZU1hY2hpbmVBcm4sXG4gICAgICAgICAgbmFtZTogdGhpcy5ldmVudC5SZXF1ZXN0SWQsXG4gICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHRoaXMuZXZlbnQpLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0RXhlY3V0aW9uKHJlcSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5wcm9jZXNzRXZlbnQodGhpcy5ldmVudC5SZXNvdXJjZVByb3BlcnRpZXMgYXMgdW5rbm93biBhcyBSZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhc3luYyByZXF1ZXN0cyBmcm9tIHRoZSB3YWl0ZXIgc3RhdGUgbWFjaGluZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZUlzQ29tcGxldGUoKTogUHJvbWlzZTxSZXNwb25zZSB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnByb2Nlc3NFdmVudCh0aGlzLmV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyB1bmtub3duIGFzIFJlcXVlc3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgc3RlcCBmdW5jdGlvbiBzdGF0ZSBtYWNoaW5lIHdoaWNoIHdpbGwgd2FpdCBmb3IgdGhlIHJlcXVlc3RcbiAgICogdG8gYmUgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRFeGVjdXRpb24ocmVxOiBTdGFydEV4ZWN1dGlvbklucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNmbiA9IG5ldyBTRk4oe30pO1xuICAgICAgYXdhaXQgc2ZuLnN0YXJ0RXhlY3V0aW9uKHJlcSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwcm9jZXNzRXZlbnQocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2UgfCB1bmRlZmluZWQ+O1xuXG4gIHB1YmxpYyByZXNwb25kKHJlc3BvbnNlOiBIYW5kbGVyUmVzcG9uc2UpIHtcbiAgICBpZiAodGhpcy50aW1lZE91dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjZlJlc3BvbnNlOiBBV1NMYW1iZGEuQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlID0ge1xuICAgICAgU3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBSZWFzb246IHJlc3BvbnNlLnJlYXNvbixcbiAgICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogdGhpcy5waHlzaWNhbFJlc291cmNlSWQsXG4gICAgICBTdGFja0lkOiB0aGlzLmV2ZW50LlN0YWNrSWQsXG4gICAgICBSZXF1ZXN0SWQ6IHRoaXMuZXZlbnQuUmVxdWVzdElkLFxuICAgICAgTG9naWNhbFJlc291cmNlSWQ6IHRoaXMuZXZlbnQuTG9naWNhbFJlc291cmNlSWQsXG4gICAgICBOb0VjaG86IGZhbHNlLFxuICAgICAgRGF0YTogcmVzcG9uc2UuZGF0YSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IEpTT04uc3RyaW5naWZ5KGNmUmVzcG9uc2UpO1xuXG4gICAgY29uc29sZS5sb2coJ1Jlc3BvbmRpbmcgdG8gQ2xvdWRGb3JtYXRpb24nLCByZXNwb25zZUJvZHkpO1xuXG4gICAgY29uc3QgcGFyc2VkVXJsID0gdXJsLnBhcnNlKHRoaXMuZXZlbnQuUmVzcG9uc2VVUkwpO1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaG9zdG5hbWU6IHBhcnNlZFVybC5ob3N0bmFtZSxcbiAgICAgIHBhdGg6IHBhcnNlZFVybC5wYXRoLFxuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICcnLFxuICAgICAgICAnY29udGVudC1sZW5ndGgnOiBCdWZmZXIuYnl0ZUxlbmd0aChyZXNwb25zZUJvZHksICd1dGY4JyksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIHJlc29sdmUpO1xuICAgICAgICByZXF1ZXN0Lm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIHJlcXVlc3Qud3JpdGUocmVzcG9uc2VCb2R5KTtcbiAgICAgICAgcmVxdWVzdC5lbmQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdFBoeXNpY2FsUmVzb3VyY2VJZChldmVudDogQVdTTGFtYmRhLkNsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCk6IHN0cmluZyB7XG4gIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICBjYXNlICdDcmVhdGUnOlxuICAgICAgcmV0dXJuIGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkO1xuICAgIGNhc2UgJ1VwZGF0ZSc6XG4gICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgIHJldHVybiBldmVudC5QaHlzaWNhbFJlc291cmNlSWQ7XG4gIH1cbn1cbiJdfQ==