@liflig/cdk 2.21.3 → 2.21.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +1 -4
- package/lib/index.js +2 -6
- package/package.json +12 -12
- package/lib/cdk-deploy/cdk-deploy.d.ts +0 -63
- package/lib/cdk-deploy/cdk-deploy.js +0 -174
- package/lib/cdk-deploy/index.d.ts +0 -1
- package/lib/cdk-deploy/index.js +0 -6
- package/lib/cdk-deploy/start-deploy-handler.d.ts +0 -8
- package/lib/cdk-deploy/start-deploy-handler.js +0 -65
- package/lib/cdk-deploy/status-handler.d.ts +0 -6
- package/lib/cdk-deploy/status-handler.js +0 -80
- package/lib/ecs-update-image/artifact-status.d.ts +0 -39
- package/lib/ecs-update-image/artifact-status.js +0 -41
- package/lib/ecs-update-image/ecs-update-image.d.ts +0 -41
- package/lib/ecs-update-image/ecs-update-image.js +0 -97
- package/lib/ecs-update-image/index.d.ts +0 -3
- package/lib/ecs-update-image/index.js +0 -10
- package/lib/ecs-update-image/start-deploy-handler.d.ts +0 -6
- package/lib/ecs-update-image/start-deploy-handler.js +0 -95
- package/lib/ecs-update-image/status-handler.d.ts +0 -11
- package/lib/ecs-update-image/status-handler.js +0 -67
- package/lib/ecs-update-image/tag.d.ts +0 -47
- package/lib/ecs-update-image/tag.js +0 -67
- package/lib/pipelines/conventions.d.ts +0 -14
- package/lib/pipelines/conventions.js +0 -24
- package/lib/pipelines/deploy-env.d.ts +0 -18
- package/lib/pipelines/deploy-env.js +0 -96
- package/lib/pipelines/index.d.ts +0 -2
- package/lib/pipelines/index.js +0 -8
- package/lib/pipelines/liflig-cdk-deployer-deps.d.ts +0 -13
- package/lib/pipelines/liflig-cdk-deployer-deps.js +0 -35
- package/lib/pipelines/pipeline.d.ts +0 -78
- package/lib/pipelines/pipeline.js +0 -229
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DeployEnv = void 0;
|
|
4
|
-
const constructs = require("constructs");
|
|
5
|
-
const ec2 = require("aws-cdk-lib/aws-ec2");
|
|
6
|
-
const ecr = require("aws-cdk-lib/aws-ecr");
|
|
7
|
-
const ecs = require("aws-cdk-lib/aws-ecs");
|
|
8
|
-
const iam = require("aws-cdk-lib/aws-iam");
|
|
9
|
-
const logs = require("aws-cdk-lib/aws-logs");
|
|
10
|
-
const sfn = require("aws-cdk-lib/aws-stepfunctions");
|
|
11
|
-
const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks");
|
|
12
|
-
const cdk = require("aws-cdk-lib");
|
|
13
|
-
const conventions_1 = require("./conventions");
|
|
14
|
-
class DeployEnv extends constructs.Construct {
|
|
15
|
-
constructor(scope, id, props) {
|
|
16
|
-
super(scope, id);
|
|
17
|
-
const cluster = this.getOrCreateCluster(props.vpc);
|
|
18
|
-
// We don't reuse the task definition across multiple pipelines
|
|
19
|
-
// so that we can easier find the correct logs for each pipeline.
|
|
20
|
-
const taskDefinition = new ecs.TaskDefinition(this, "TaskDefinition", {
|
|
21
|
-
memoryMiB: "1024",
|
|
22
|
-
cpu: "256",
|
|
23
|
-
compatibility: ecs.Compatibility.FARGATE,
|
|
24
|
-
});
|
|
25
|
-
const containerDefinition = taskDefinition.addContainer("app", {
|
|
26
|
-
image: ecs.ContainerImage.fromEcrRepository(ecr.Repository.fromRepositoryArn(this, "Repository",
|
|
27
|
-
// See https://github.com/capralifecycle/liflig-cdk-deployer
|
|
28
|
-
"arn:aws:ecr:eu-west-1:001112238813:repository/incub-common-liflig-cdk-deployer"), "1-experimental.2"),
|
|
29
|
-
logging: ecs.LogDriver.awsLogs({
|
|
30
|
-
logGroup: new logs.LogGroup(this, "LogGroup", {
|
|
31
|
-
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
32
|
-
retention: logs.RetentionDays.ONE_MONTH,
|
|
33
|
-
}),
|
|
34
|
-
streamPrefix: "app",
|
|
35
|
-
}),
|
|
36
|
-
});
|
|
37
|
-
const cdkRole = iam.Role.fromRoleArn(this, `CdkRole-${props.envName}`, `arn:aws:iam::${props.accountId}:role/${conventions_1.cdkDeployRoleName}`);
|
|
38
|
-
cdkRole.grant(taskDefinition.taskRole, "sts:AssumeRole");
|
|
39
|
-
props.artefactBucket.grantRead(taskDefinition.taskRole);
|
|
40
|
-
this.chain = sfn.Chain.start(new tasks.EcsRunTask(this, `Deploy ${props.envName}`, {
|
|
41
|
-
resultPath: sfn.JsonPath.DISCARD,
|
|
42
|
-
securityGroups: [this.getOrCreateTaskSecurityGroup(props.vpc)],
|
|
43
|
-
integrationPattern: sfn.IntegrationPattern.RUN_JOB,
|
|
44
|
-
cluster,
|
|
45
|
-
assignPublicIp: true,
|
|
46
|
-
launchTarget: new tasks.EcsFargateLaunchTarget(),
|
|
47
|
-
taskDefinition,
|
|
48
|
-
containerOverrides: [
|
|
49
|
-
{
|
|
50
|
-
containerDefinition,
|
|
51
|
-
environment: [
|
|
52
|
-
{
|
|
53
|
-
name: "CDK_TARGET_ROLE_ARN",
|
|
54
|
-
value: cdkRole.roleArn,
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
name: "CDK_ENV_NAME",
|
|
58
|
-
value: props.envName,
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: "CDK_CLOUD_ASSEMBLY",
|
|
62
|
-
value: sfn.JsonPath.stringAt("$.CloudAssembly"),
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
name: "CDK_VARIABLES",
|
|
66
|
-
value: sfn.JsonPath.stringAt("$.Variables"),
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
}));
|
|
72
|
-
if (props.afterSuccessfulDeploy != null) {
|
|
73
|
-
this.chain = this.chain.next(props.afterSuccessfulDeploy);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// Reuse ECS cluster for multiple pipelines in same stack.
|
|
77
|
-
getOrCreateCluster(vpc) {
|
|
78
|
-
var _a;
|
|
79
|
-
const stack = cdk.Stack.of(this);
|
|
80
|
-
const uniqueId = "pipeline.04ad36b1.cluster";
|
|
81
|
-
return ((_a = stack.node.tryFindChild(uniqueId)) !== null && _a !== void 0 ? _a : new ecs.Cluster(stack, uniqueId, {
|
|
82
|
-
vpc,
|
|
83
|
-
}));
|
|
84
|
-
}
|
|
85
|
-
// Reuse security group for multiple pipelines in same stack.
|
|
86
|
-
getOrCreateTaskSecurityGroup(vpc) {
|
|
87
|
-
var _a;
|
|
88
|
-
const stack = cdk.Stack.of(this);
|
|
89
|
-
const uniqueId = "pipeline.04ad36b1.security-group";
|
|
90
|
-
return ((_a = stack.node.tryFindChild(uniqueId)) !== null && _a !== void 0 ? _a : new ec2.SecurityGroup(stack, uniqueId, {
|
|
91
|
-
vpc,
|
|
92
|
-
}));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
exports.DeployEnv = DeployEnv;
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LWVudi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZXMvZGVwbG95LWVudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBd0M7QUFDeEMsMkNBQTBDO0FBQzFDLDJDQUEwQztBQUMxQywyQ0FBMEM7QUFDMUMsMkNBQTBDO0FBQzFDLDZDQUE0QztBQUU1QyxxREFBb0Q7QUFDcEQsNkRBQTREO0FBQzVELG1DQUFrQztBQUNsQywrQ0FBaUQ7QUFVakQsTUFBYSxTQUFVLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFHakQsWUFBWSxLQUEyQixFQUFFLEVBQVUsRUFBRSxLQUFxQjtRQUN4RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFbEQsK0RBQStEO1FBQy9ELGlFQUFpRTtRQUVqRSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ3BFLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLEdBQUcsRUFBRSxLQUFLO1lBQ1YsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTztTQUN6QyxDQUFDLENBQUE7UUFFRixNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzdELEtBQUssRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUN6QyxHQUFHLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUM5QixJQUFJLEVBQ0osWUFBWTtZQUNaLDREQUE0RDtZQUM1RCxnRkFBZ0YsQ0FDakYsRUFDRCxrQkFBa0IsQ0FDbkI7WUFDRCxPQUFPLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQzdCLFFBQVEsRUFBRSxJQUFJLElBQUks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TyxDQUNMLE1BQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUF1QixtQ0FDeEQsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDckMsR0FBRztTQUNKLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBN0dELDhCQTZHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCAqIGFzIGVjciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjclwiXG5pbXBvcnQgKiBhcyBlY3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0ICogYXMgc2ZuIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiXG5pbXBvcnQgKiBhcyB0YXNrcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3NcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBjZGtEZXBsb3lSb2xlTmFtZSB9IGZyb20gXCIuL2NvbnZlbnRpb25zXCJcblxuaW50ZXJmYWNlIERlcGxveUVudlByb3BzIHtcbiAgYWNjb3VudElkOiBzdHJpbmdcbiAgYWZ0ZXJTdWNjZXNzZnVsRGVwbG95Pzogc2ZuLkNoYWluXG4gIGFydGVmYWN0QnVja2V0OiBzMy5JQnVja2V0XG4gIGVudk5hbWU6IHN0cmluZ1xuICB2cGM6IGVjMi5JVnBjXG59XG5cbmV4cG9ydCBjbGFzcyBEZXBsb3lFbnYgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyBjaGFpbjogc2ZuLkNoYWluXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGVwbG95RW52UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBjbHVzdGVyID0gdGhpcy5nZXRPckNyZWF0ZUNsdXN0ZXIocHJvcHMudnBjKVxuXG4gICAgLy8gV2UgZG9uJ3QgcmV1c2UgdGhlIHRhc2sgZGVmaW5pdGlvbiBhY3Jvc3MgbXVsdGlwbGUgcGlwZWxpbmVzXG4gICAgLy8gc28gdGhhdCB3ZSBjYW4gZWFzaWVyIGZpbmQgdGhlIGNvcnJlY3QgbG9ncyBmb3IgZWFjaCBwaXBlbGluZS5cblxuICAgIGNvbnN0IHRhc2tEZWZpbml0aW9uID0gbmV3IGVjcy5UYXNrRGVmaW5pdGlvbih0aGlzLCBcIlRhc2tEZWZpbml0aW9uXCIsIHtcbiAgICAgIG1lbW9yeU1pQjogXCIxMDI0XCIsXG4gICAgICBjcHU6IFwiMjU2XCIsXG4gICAgICBjb21wYXRpYmlsaXR5OiBlY3MuQ29tcGF0aWJpbGl0eS5GQVJHQVRFLFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250YWluZXJEZWZpbml0aW9uID0gdGFza0RlZmluaXRpb24uYWRkQ29udGFpbmVyKFwiYXBwXCIsIHtcbiAgICAgIGltYWdlOiBlY3MuQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoXG4gICAgICAgIGVjci5SZXBvc2l0b3J5LmZyb21SZXBvc2l0b3J5QXJuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJSZXBvc2l0b3J5XCIsXG4gICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXByYWxpZmVjeWNsZS9saWZsaWctY2RrLWRlcGxveWVyXG4gICAgICAgICAgXCJhcm46YXdzOmVjcjpldS13ZXN0LTE6MDAxMTEyMjM4ODEzOnJlcG9zaXRvcnkvaW5jdWItY29tbW9uLWxpZmxpZy1jZGstZGVwbG95ZXJcIixcbiAgICAgICAgKSxcbiAgICAgICAgXCIxLWV4cGVyaW1lbnRhbC4yXCIsXG4gICAgICApLFxuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlci5hd3NMb2dzKHtcbiAgICAgICAgbG9nR3JvdXA6IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsIFwiTG9nR3JvdXBcIiwge1xuICAgICAgICAgIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgcmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgICB9KSxcbiAgICAgICAgc3RyZWFtUHJlZml4OiBcImFwcFwiLFxuICAgICAgfSksXG4gICAgfSlcblxuICAgIGNvbnN0IGNka1JvbGUgPSBpYW0uUm9sZS5mcm9tUm9sZUFybihcbiAgICAgIHRoaXMsXG4gICAgICBgQ2RrUm9sZS0ke3Byb3BzLmVudk5hbWV9YCxcbiAgICAgIGBhcm46YXdzOmlhbTo6JHtwcm9wcy5hY2NvdW50SWR9OnJvbGUvJHtjZGtEZXBsb3lSb2xlTmFtZX1gLFxuICAgIClcblxuICAgIGNka1JvbGUuZ3JhbnQodGFza0RlZmluaXRpb24udGFza1JvbGUsIFwic3RzOkFzc3VtZVJvbGVcIilcblxuICAgIHByb3BzLmFydGVmYWN0QnVja2V0LmdyYW50UmVhZCh0YXNrRGVmaW5pdGlvbi50YXNrUm9sZSlcblxuICAgIHRoaXMuY2hhaW4gPSBzZm4uQ2hhaW4uc3RhcnQoXG4gICAgICBuZXcgdGFza3MuRWNzUnVuVGFzayh0aGlzLCBgRGVwbG95ICR7cHJvcHMuZW52TmFtZX1gLCB7XG4gICAgICAgIHJlc3VsdFBhdGg6IHNmbi5Kc29uUGF0aC5ESVNDQVJELFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZ2V0T3JDcmVhdGVUYXNrU2VjdXJpdHlHcm91cChwcm9wcy52cGMpXSxcbiAgICAgICAgaW50ZWdyYXRpb25QYXR0ZXJuOiBzZm4uSW50ZWdyYXRpb25QYXR0ZXJuLlJVTl9KT0IsXG4gICAgICAgIGNsdXN0ZXIsXG4gICAgICAgIGFzc2lnblB1YmxpY0lwOiB0cnVlLFxuICAgICAgICBsYXVuY2hUYXJnZXQ6IG5ldyB0YXNrcy5FY3NGYXJnYXRlTGF1bmNoVGFyZ2V0KCksXG4gICAgICAgIHRhc2tEZWZpbml0aW9uLFxuICAgICAgICBjb250YWluZXJPdmVycmlkZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250YWluZXJEZWZpbml0aW9uLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ0RLX1RBUkdFVF9ST0xFX0FSTlwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjZGtSb2xlLnJvbGVBcm4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkNES19FTlZfTkFNRVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wcy5lbnZOYW1lLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJDREtfQ0xPVURfQVNTRU1CTFlcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KFwiJC5DbG91ZEFzc2VtYmx5XCIpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJDREtfVkFSSUFCTEVTXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdChcIiQuVmFyaWFibGVzXCIpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgaWYgKHByb3BzLmFmdGVyU3VjY2Vzc2Z1bERlcGxveSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmNoYWluID0gdGhpcy5jaGFpbi5uZXh0KHByb3BzLmFmdGVyU3VjY2Vzc2Z1bERlcGxveSlcbiAgICB9XG4gIH1cblxuICAvLyBSZXVzZSBFQ1MgY2x1c3RlciBmb3IgbXVsdGlwbGUgcGlwZWxpbmVzIGluIHNhbWUgc3RhY2suXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVDbHVzdGVyKHZwYzogZWMyLklWcGMpOiBlY3MuQ2x1c3RlciB7XG4gICAgY29uc3Qgc3RhY2sgPSBjZGsuU3RhY2sub2YodGhpcylcbiAgICBjb25zdCB1bmlxdWVJZCA9IFwicGlwZWxpbmUuMDRhZDM2YjEuY2x1c3RlclwiXG4gICAgcmV0dXJuIChcbiAgICAgIChzdGFjay5ub2RlLnRyeUZpbmRDaGlsZCh1bmlxdWVJZCkgYXMgZWNzLkNsdXN0ZXIpID8/XG4gICAgICBuZXcgZWNzLkNsdXN0ZXIoc3RhY2ssIHVuaXF1ZUlkLCB7XG4gICAgICAgIHZwYyxcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgLy8gUmV1c2Ugc2VjdXJpdHkgZ3JvdXAgZm9yIG11bHRpcGxlIHBpcGVsaW5lcyBpbiBzYW1lIHN0YWNrLlxuICBwcml2YXRlIGdldE9yQ3JlYXRlVGFza1NlY3VyaXR5R3JvdXAodnBjOiBlYzIuSVZwYyk6IGVjMi5TZWN1cml0eUdyb3VwIHtcbiAgICBjb25zdCBzdGFjayA9IGNkay5TdGFjay5vZih0aGlzKVxuICAgIGNvbnN0IHVuaXF1ZUlkID0gXCJwaXBlbGluZS4wNGFkMzZiMS5zZWN1cml0eS1ncm91cFwiXG4gICAgcmV0dXJuIChcbiAgICAgIChzdGFjay5ub2RlLnRyeUZpbmRDaGlsZCh1bmlxdWVJZCkgYXMgZWMyLlNlY3VyaXR5R3JvdXApID8/XG4gICAgICBuZXcgZWMyLlNlY3VyaXR5R3JvdXAoc3RhY2ssIHVuaXF1ZUlkLCB7XG4gICAgICAgIHZwYyxcbiAgICAgIH0pXG4gICAgKVxuICB9XG59XG4iXX0=
|
package/lib/pipelines/index.d.ts
DELETED
package/lib/pipelines/index.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Pipeline = exports.LifligCdkDeployerDeps = void 0;
|
|
4
|
-
var liflig_cdk_deployer_deps_1 = require("./liflig-cdk-deployer-deps");
|
|
5
|
-
Object.defineProperty(exports, "LifligCdkDeployerDeps", { enumerable: true, get: function () { return liflig_cdk_deployer_deps_1.LifligCdkDeployerDeps; } });
|
|
6
|
-
var pipeline_1 = require("./pipeline");
|
|
7
|
-
Object.defineProperty(exports, "Pipeline", { enumerable: true, get: function () { return pipeline_1.Pipeline; } });
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVFQUdtQztBQUZqQyxpSUFBQSxxQkFBcUIsT0FBQTtBQUd2Qix1Q0FBeUU7QUFBaEUsb0dBQUEsUUFBUSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtcbiAgTGlmbGlnQ2RrRGVwbG95ZXJEZXBzLFxuICBMaWZsaWdDZGtEZXBsb3llckRlcHNQcm9wcyxcbn0gZnJvbSBcIi4vbGlmbGlnLWNkay1kZXBsb3llci1kZXBzXCJcbmV4cG9ydCB7IFBpcGVsaW5lLCBQaXBlbGluZUVudmlyb25tZW50LCBQaXBlbGluZVByb3BzIH0gZnJvbSBcIi4vcGlwZWxpbmVcIlxuIl19
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import * as constructs from "constructs";
|
|
2
|
-
export interface LifligCdkDeployerDepsProps {
|
|
3
|
-
trustedAccountIds: string[];
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Resources needed so liflig-cdk-deployer can deploy to the account.
|
|
7
|
-
*
|
|
8
|
-
* This must exist in each target account that the pipeline should
|
|
9
|
-
* be able to deploy into.
|
|
10
|
-
*/
|
|
11
|
-
export declare class LifligCdkDeployerDeps extends constructs.Construct {
|
|
12
|
-
constructor(scope: constructs.Construct, id: string, props: LifligCdkDeployerDepsProps);
|
|
13
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LifligCdkDeployerDeps = void 0;
|
|
4
|
-
const constructs = require("constructs");
|
|
5
|
-
const iam = require("aws-cdk-lib/aws-iam");
|
|
6
|
-
const cdk = require("aws-cdk-lib");
|
|
7
|
-
const conventions_1 = require("./conventions");
|
|
8
|
-
/**
|
|
9
|
-
* Resources needed so liflig-cdk-deployer can deploy to the account.
|
|
10
|
-
*
|
|
11
|
-
* This must exist in each target account that the pipeline should
|
|
12
|
-
* be able to deploy into.
|
|
13
|
-
*/
|
|
14
|
-
class LifligCdkDeployerDeps extends constructs.Construct {
|
|
15
|
-
constructor(scope, id, props) {
|
|
16
|
-
super(scope, id);
|
|
17
|
-
const account = cdk.Stack.of(this).account;
|
|
18
|
-
// The role used when running "cdk deploy".
|
|
19
|
-
const cdkRole = new iam.Role(this, "CdkRole", {
|
|
20
|
-
roleName: conventions_1.cdkDeployRoleName,
|
|
21
|
-
assumedBy: new iam.CompositePrincipal(...props.trustedAccountIds.map((it) => new iam.AccountPrincipal(it))),
|
|
22
|
-
});
|
|
23
|
-
// Roles used by CDK CLI for the actual deployment.
|
|
24
|
-
// (For use under new-style synthesize.)
|
|
25
|
-
cdkRole.addToPolicy(new iam.PolicyStatement({
|
|
26
|
-
actions: ["sts:AssumeRole"],
|
|
27
|
-
resources: [
|
|
28
|
-
`arn:aws:iam::${account}:role/*-deploy-role-*`,
|
|
29
|
-
`arn:aws:iam::${account}:role/*-publishing-role-*`,
|
|
30
|
-
],
|
|
31
|
-
}));
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
exports.LifligCdkDeployerDeps = LifligCdkDeployerDeps;
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmbGlnLWNkay1kZXBsb3llci1kZXBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lcy9saWZsaWctY2RrLWRlcGxveWVyLWRlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDJDQUEwQztBQUMxQyxtQ0FBa0M7QUFDbEMsK0NBQWlEO0FBTWpEOzs7OztHQUtHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSxVQUFVLENBQUMsU0FBUztJQUM3RCxZQUNFLEtBQTJCLEVBQzNCLEVBQVUsRUFDVixLQUFpQztRQUVqQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQTtRQUUxQywyQ0FBMkM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDNUMsUUFBUSxFQUFFLCtCQUFpQjtZQUMzQixTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsa0JBQWtCLENBQ25DLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDckU7U0FDRixDQUFDLENBQUE7UUFFRixtREFBbUQ7UUFDbkQsd0NBQXdDO1FBQ3hDLE9BQU8sQ0FBQyxXQUFXLENBQ2pCLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMzQixTQUFTLEVBQUU7Z0JBQ1QsZ0JBQWdCLE9BQU8sdUJBQXVCO2dCQUM5QyxnQkFBZ0IsT0FBTywyQkFBMkI7YUFDbkQ7U0FDRixDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQTlCRCxzREE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IGNka0RlcGxveVJvbGVOYW1lIH0gZnJvbSBcIi4vY29udmVudGlvbnNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmxpZ0Nka0RlcGxveWVyRGVwc1Byb3BzIHtcbiAgdHJ1c3RlZEFjY291bnRJZHM6IHN0cmluZ1tdXG59XG5cbi8qKlxuICogUmVzb3VyY2VzIG5lZWRlZCBzbyBsaWZsaWctY2RrLWRlcGxveWVyIGNhbiBkZXBsb3kgdG8gdGhlIGFjY291bnQuXG4gKlxuICogVGhpcyBtdXN0IGV4aXN0IGluIGVhY2ggdGFyZ2V0IGFjY291bnQgdGhhdCB0aGUgcGlwZWxpbmUgc2hvdWxkXG4gKiBiZSBhYmxlIHRvIGRlcGxveSBpbnRvLlxuICovXG5leHBvcnQgY2xhc3MgTGlmbGlnQ2RrRGVwbG95ZXJEZXBzIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTGlmbGlnQ2RrRGVwbG95ZXJEZXBzUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGNvbnN0IGFjY291bnQgPSBjZGsuU3RhY2sub2YodGhpcykuYWNjb3VudFxuXG4gICAgLy8gVGhlIHJvbGUgdXNlZCB3aGVuIHJ1bm5pbmcgXCJjZGsgZGVwbG95XCIuXG4gICAgY29uc3QgY2RrUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBcIkNka1JvbGVcIiwge1xuICAgICAgcm9sZU5hbWU6IGNka0RlcGxveVJvbGVOYW1lLFxuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkNvbXBvc2l0ZVByaW5jaXBhbChcbiAgICAgICAgLi4ucHJvcHMudHJ1c3RlZEFjY291bnRJZHMubWFwKChpdCkgPT4gbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKGl0KSksXG4gICAgICApLFxuICAgIH0pXG5cbiAgICAvLyBSb2xlcyB1c2VkIGJ5IENESyBDTEkgZm9yIHRoZSBhY3R1YWwgZGVwbG95bWVudC5cbiAgICAvLyAoRm9yIHVzZSB1bmRlciBuZXctc3R5bGUgc3ludGhlc2l6ZS4pXG4gICAgY2RrUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3RzOkFzc3VtZVJvbGVcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGBhcm46YXdzOmlhbTo6JHthY2NvdW50fTpyb2xlLyotZGVwbG95LXJvbGUtKmAsXG4gICAgICAgICAgYGFybjphd3M6aWFtOjoke2FjY291bnR9OnJvbGUvKi1wdWJsaXNoaW5nLXJvbGUtKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApXG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import * as constructs from "constructs";
|
|
2
|
-
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
3
|
-
import * as s3 from "aws-cdk-lib/aws-s3";
|
|
4
|
-
import * as sfn from "aws-cdk-lib/aws-stepfunctions";
|
|
5
|
-
export interface PipelineProps {
|
|
6
|
-
/**
|
|
7
|
-
* Bucket holding pipeline configuration and trigger file.
|
|
8
|
-
*
|
|
9
|
-
* @default - use existing bucket based on Griid conventions
|
|
10
|
-
*/
|
|
11
|
-
artifactsBucket?: s3.IBucket;
|
|
12
|
-
/**
|
|
13
|
-
* Environments for this pipeline. Each environment is deployed sequentially
|
|
14
|
-
* in the order given.
|
|
15
|
-
*/
|
|
16
|
-
environments: PipelineEnvironment[];
|
|
17
|
-
/**
|
|
18
|
-
* Name of pipeline. This is used for the path where configuration
|
|
19
|
-
* is stored in S3.
|
|
20
|
-
*/
|
|
21
|
-
pipelineName: string;
|
|
22
|
-
/**
|
|
23
|
-
* Trigger the pipeline when the trigger file is written.
|
|
24
|
-
*
|
|
25
|
-
* @default - true
|
|
26
|
-
*/
|
|
27
|
-
triggerEnabled?: boolean;
|
|
28
|
-
/**
|
|
29
|
-
* VPC used for Fargate resources.
|
|
30
|
-
*/
|
|
31
|
-
vpc: ec2.IVpc;
|
|
32
|
-
}
|
|
33
|
-
export interface PipelineEnvironment {
|
|
34
|
-
/**
|
|
35
|
-
* Account number hosting the environment.
|
|
36
|
-
*/
|
|
37
|
-
accountId: string;
|
|
38
|
-
/**
|
|
39
|
-
* Additional tasks to run after the environment has been deployed.
|
|
40
|
-
*/
|
|
41
|
-
afterSuccessfulDeploy?: sfn.Chain;
|
|
42
|
-
/**
|
|
43
|
-
* Name of environment.
|
|
44
|
-
*/
|
|
45
|
-
name: string;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Pipeline for doing a multi-account CDK deployment based
|
|
49
|
-
* on a built CDK Cloud Assembly and parameters stored in S3.
|
|
50
|
-
*
|
|
51
|
-
* The accounts being deployed to must be provisioned with
|
|
52
|
-
* the LifligCdkDeployerDeps construct so expected IAM
|
|
53
|
-
* roles is present.
|
|
54
|
-
*
|
|
55
|
-
* The pipeline starts by writing an empty file to
|
|
56
|
-
* s3://<artifacts-bucket>/pipelines/<pipeline-name>/trigger
|
|
57
|
-
*
|
|
58
|
-
* The CDK deploy process is handled by liflig-cdk-deployer.
|
|
59
|
-
* See https://github.com/capralifecycle/liflig-cdk-deployer
|
|
60
|
-
*
|
|
61
|
-
* Configuration files are read from S3 at the path
|
|
62
|
-
* s3://<artifacts-bucket>/pipelines/<pipeline-name>/
|
|
63
|
-
*
|
|
64
|
-
* - cloud-assembly.json which has the format described as
|
|
65
|
-
* CDK_CLOUD_ASSEMBLY in liflig-cdk-deployer
|
|
66
|
-
*
|
|
67
|
-
* - variables*.json which can be zero or more files
|
|
68
|
-
* with string-string map that will be concatenated to
|
|
69
|
-
* form the format described as CDK_VARIABLES in
|
|
70
|
-
* liflig-cdk-deployer
|
|
71
|
-
*
|
|
72
|
-
* The separation of Cloud Assembly details and variables enables
|
|
73
|
-
* separation of IaC code and application code if they are not
|
|
74
|
-
* colocated in the same repository.
|
|
75
|
-
*/
|
|
76
|
-
export declare class Pipeline extends constructs.Construct {
|
|
77
|
-
constructor(scope: constructs.Construct, id: string, props: PipelineProps);
|
|
78
|
-
}
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Pipeline = void 0;
|
|
4
|
-
const constructs = require("constructs");
|
|
5
|
-
const events = require("aws-cdk-lib/aws-events");
|
|
6
|
-
const eventsTargets = require("aws-cdk-lib/aws-events-targets");
|
|
7
|
-
const iam = require("aws-cdk-lib/aws-iam");
|
|
8
|
-
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
9
|
-
const sfn = require("aws-cdk-lib/aws-stepfunctions");
|
|
10
|
-
const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions");
|
|
11
|
-
const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks");
|
|
12
|
-
const cdk = require("aws-cdk-lib");
|
|
13
|
-
const griid_1 = require("../griid");
|
|
14
|
-
const conventions_1 = require("./conventions");
|
|
15
|
-
const deploy_env_1 = require("./deploy-env");
|
|
16
|
-
/**
|
|
17
|
-
* Pipeline for doing a multi-account CDK deployment based
|
|
18
|
-
* on a built CDK Cloud Assembly and parameters stored in S3.
|
|
19
|
-
*
|
|
20
|
-
* The accounts being deployed to must be provisioned with
|
|
21
|
-
* the LifligCdkDeployerDeps construct so expected IAM
|
|
22
|
-
* roles is present.
|
|
23
|
-
*
|
|
24
|
-
* The pipeline starts by writing an empty file to
|
|
25
|
-
* s3://<artifacts-bucket>/pipelines/<pipeline-name>/trigger
|
|
26
|
-
*
|
|
27
|
-
* The CDK deploy process is handled by liflig-cdk-deployer.
|
|
28
|
-
* See https://github.com/capralifecycle/liflig-cdk-deployer
|
|
29
|
-
*
|
|
30
|
-
* Configuration files are read from S3 at the path
|
|
31
|
-
* s3://<artifacts-bucket>/pipelines/<pipeline-name>/
|
|
32
|
-
*
|
|
33
|
-
* - cloud-assembly.json which has the format described as
|
|
34
|
-
* CDK_CLOUD_ASSEMBLY in liflig-cdk-deployer
|
|
35
|
-
*
|
|
36
|
-
* - variables*.json which can be zero or more files
|
|
37
|
-
* with string-string map that will be concatenated to
|
|
38
|
-
* form the format described as CDK_VARIABLES in
|
|
39
|
-
* liflig-cdk-deployer
|
|
40
|
-
*
|
|
41
|
-
* The separation of Cloud Assembly details and variables enables
|
|
42
|
-
* separation of IaC code and application code if they are not
|
|
43
|
-
* colocated in the same repository.
|
|
44
|
-
*/
|
|
45
|
-
class Pipeline extends constructs.Construct {
|
|
46
|
-
constructor(scope, id, props) {
|
|
47
|
-
var _a, _b;
|
|
48
|
-
super(scope, id);
|
|
49
|
-
const s3Prefix = (0, conventions_1.pipelineS3Prefix)(props.pipelineName);
|
|
50
|
-
const s3TriggerKey = (0, conventions_1.pipelineS3TriggerKey)(props.pipelineName);
|
|
51
|
-
const artifactsBucket = (_a = props.artifactsBucket) !== null && _a !== void 0 ? _a : (0, griid_1.getGriidArtefactBucket)(this);
|
|
52
|
-
const checkCanRunFn = new lambda.SingletonFunction(this, "CheckCanRunFn", {
|
|
53
|
-
uuid: "30ad3abb-f774-4804-a6ef-2c2f4a247362",
|
|
54
|
-
code: new lambda.InlineCode(`exports.handler = ${checkCanRunHandler.toString()};`),
|
|
55
|
-
runtime: lambda.Runtime.NODEJS_18_X,
|
|
56
|
-
handler: "index.handler",
|
|
57
|
-
timeout: cdk.Duration.seconds(10),
|
|
58
|
-
});
|
|
59
|
-
const checkCanRunTask = new tasks.LambdaInvoke(this, "Check if the process can run", {
|
|
60
|
-
lambdaFunction: checkCanRunFn,
|
|
61
|
-
outputPath: "$.Payload",
|
|
62
|
-
payload: sfn.TaskInput.fromObject({
|
|
63
|
-
"stateMachineId.$": "$$.StateMachine.Id",
|
|
64
|
-
"executionId.$": "$$.Execution.Id",
|
|
65
|
-
}),
|
|
66
|
-
});
|
|
67
|
-
const wait = new sfn.Wait(this, "Wait before rechecking status", {
|
|
68
|
-
time: sfn.WaitTime.duration(cdk.Duration.seconds(15)),
|
|
69
|
-
});
|
|
70
|
-
const skip = new sfn.Succeed(this, "Skip");
|
|
71
|
-
const collectFilesFn = new lambda.SingletonFunction(this, "CollectFilesFn", {
|
|
72
|
-
uuid: "c49cbfe1-50e0-4721-8964-fb20f4e5a7ad",
|
|
73
|
-
code: new lambda.InlineCode(`exports.handler = ${collectFilesHandler.toString()};`),
|
|
74
|
-
runtime: lambda.Runtime.NODEJS_18_X,
|
|
75
|
-
handler: "index.handler",
|
|
76
|
-
timeout: cdk.Duration.seconds(30),
|
|
77
|
-
});
|
|
78
|
-
artifactsBucket.grantRead(collectFilesFn);
|
|
79
|
-
const collectFilesTask = new tasks.LambdaInvoke(this, "Collect files from S3", {
|
|
80
|
-
lambdaFunction: collectFilesFn,
|
|
81
|
-
outputPath: "$.Payload",
|
|
82
|
-
payload: sfn.TaskInput.fromObject({
|
|
83
|
-
bucketName: artifactsBucket.bucketName,
|
|
84
|
-
bucketPrefix: s3Prefix,
|
|
85
|
-
envNames: props.environments.map((it) => it.name),
|
|
86
|
-
}),
|
|
87
|
-
});
|
|
88
|
-
let run = sfn.Chain.start(collectFilesTask);
|
|
89
|
-
const ifHavingStacks = (name, work) => new sfn.Choice(this, `Check if ${name} has stacks`)
|
|
90
|
-
.when(aws_stepfunctions_1.Condition.or(aws_stepfunctions_1.Condition.isNull(`$.StackCountPerEnv.${name}`), aws_stepfunctions_1.Condition.numberEquals(`$.StackCountPerEnv.${name}`, 0)), new sfn.Pass(this, `Skip ${name}`))
|
|
91
|
-
.otherwise(work)
|
|
92
|
-
.afterwards();
|
|
93
|
-
for (const env of props.environments) {
|
|
94
|
-
const it = new deploy_env_1.DeployEnv(this, env.name, {
|
|
95
|
-
accountId: env.accountId,
|
|
96
|
-
afterSuccessfulDeploy: env.afterSuccessfulDeploy,
|
|
97
|
-
artefactBucket: artifactsBucket,
|
|
98
|
-
envName: env.name,
|
|
99
|
-
vpc: props.vpc,
|
|
100
|
-
});
|
|
101
|
-
run = run.next(ifHavingStacks(env.name, it.chain));
|
|
102
|
-
}
|
|
103
|
-
const definition = sfn.Chain.start(checkCanRunTask).next(new sfn.Choice(this, "Can run?")
|
|
104
|
-
.when(aws_stepfunctions_1.Condition.stringEquals("$.CanRunState", "CONTINUE"), run)
|
|
105
|
-
.when(aws_stepfunctions_1.Condition.stringEquals("$.CanRunState", "SKIP"), skip)
|
|
106
|
-
.otherwise(wait.next(checkCanRunTask)));
|
|
107
|
-
const machine = new sfn.StateMachine(this, "StateMachine", {
|
|
108
|
-
definition,
|
|
109
|
-
// https://docs.aws.amazon.com/step-functions/latest/dg/sfn-stuck-execution.html
|
|
110
|
-
timeout: cdk.Duration.hours(3),
|
|
111
|
-
});
|
|
112
|
-
new iam.Policy(this, "CheckCanRunPolicy", {
|
|
113
|
-
roles: [checkCanRunFn.role],
|
|
114
|
-
statements: [
|
|
115
|
-
new iam.PolicyStatement({
|
|
116
|
-
actions: ["states:ListExecutions"],
|
|
117
|
-
resources: [machine.stateMachineArn],
|
|
118
|
-
}),
|
|
119
|
-
],
|
|
120
|
-
});
|
|
121
|
-
if ((_b = props.triggerEnabled) !== null && _b !== void 0 ? _b : true) {
|
|
122
|
-
artifactsBucket.onCloudTrailWriteObject("Trigger", {
|
|
123
|
-
paths: [s3TriggerKey],
|
|
124
|
-
target: new eventsTargets.SfnStateMachine(machine, {
|
|
125
|
-
input: events.RuleTargetInput.fromObject({}),
|
|
126
|
-
}),
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
exports.Pipeline = Pipeline;
|
|
132
|
-
// This is a self-contained function that will be serialized as a lambda.
|
|
133
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
134
|
-
const collectFilesHandler = async (event) => {
|
|
135
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment
|
|
136
|
-
const { S3Client, ListObjectsV2Command, GetObjectCommand } = await Promise.resolve().then(() => require("@aws-sdk/client-s3"));
|
|
137
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
138
|
-
const s3Client = new S3Client();
|
|
139
|
-
console.log("Event received: ", event);
|
|
140
|
-
const bucketName = event.bucketName;
|
|
141
|
-
const bucketPrefix = event.bucketPrefix;
|
|
142
|
-
const envNames = event.envNames;
|
|
143
|
-
if (bucketPrefix.slice(-1) !== "/") {
|
|
144
|
-
throw new Error(`Expected bucket prefix to end with '/' but its value is '${bucketPrefix}'`);
|
|
145
|
-
}
|
|
146
|
-
async function listObjects() {
|
|
147
|
-
const { Contents } = await s3Client.send(new ListObjectsV2Command({
|
|
148
|
-
Bucket: bucketName,
|
|
149
|
-
Prefix: bucketPrefix,
|
|
150
|
-
}));
|
|
151
|
-
return Contents;
|
|
152
|
-
}
|
|
153
|
-
async function getObject(key) {
|
|
154
|
-
const { Body } = await s3Client.send(new GetObjectCommand({
|
|
155
|
-
Bucket: bucketName,
|
|
156
|
-
Key: key,
|
|
157
|
-
}));
|
|
158
|
-
return Body.toString();
|
|
159
|
-
}
|
|
160
|
-
let cloudAssembly = null;
|
|
161
|
-
let variables = {};
|
|
162
|
-
const files = await listObjects();
|
|
163
|
-
for (const file of files !== null && files !== void 0 ? files : []) {
|
|
164
|
-
const key = file.Key;
|
|
165
|
-
const filename = key.slice(bucketPrefix.length);
|
|
166
|
-
console.log(`File: ${filename}`);
|
|
167
|
-
if (filename === "cloud-assembly.json") {
|
|
168
|
-
console.log("Found Cloud Assembly");
|
|
169
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
170
|
-
cloudAssembly = JSON.parse(await getObject(key));
|
|
171
|
-
}
|
|
172
|
-
else if (/^variables.*\.json$/.test(filename)) {
|
|
173
|
-
console.log("Found variables file");
|
|
174
|
-
variables = {
|
|
175
|
-
...variables,
|
|
176
|
-
...JSON.parse(await getObject(key)),
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
console.log("Ignoring unknown file");
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
if (cloudAssembly === null) {
|
|
184
|
-
throw new Error("cloud-assembly.json not found");
|
|
185
|
-
}
|
|
186
|
-
return {
|
|
187
|
-
CloudAssembly: JSON.stringify(cloudAssembly),
|
|
188
|
-
Variables: JSON.stringify(variables),
|
|
189
|
-
StackCountPerEnv: Object.fromEntries(envNames.map((name) => {
|
|
190
|
-
var _a, _b;
|
|
191
|
-
return [
|
|
192
|
-
name,
|
|
193
|
-
(_b = (_a = cloudAssembly.environments.find((it) => it.name === name)) === null || _a === void 0 ? void 0 : _a.stackNames.length) !== null && _b !== void 0 ? _b : 0,
|
|
194
|
-
];
|
|
195
|
-
})),
|
|
196
|
-
};
|
|
197
|
-
};
|
|
198
|
-
// This is a self-contained function that will be serialized as a lambda.
|
|
199
|
-
const checkCanRunHandler = async (event) => {
|
|
200
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment
|
|
201
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
202
|
-
const { SFNClient, ListExecutionsCommand, ExecutionStatus } = await Promise.resolve().then(() => require("@aws-sdk/client-sfn"));
|
|
203
|
-
const sfnClient = new SFNClient();
|
|
204
|
-
console.log("Event received: ", event);
|
|
205
|
-
const stateMachineArn = event["stateMachineId"];
|
|
206
|
-
const currentExecutionArn = event["executionId"];
|
|
207
|
-
const { executions } = await sfnClient.send(new ListExecutionsCommand({
|
|
208
|
-
stateMachineArn,
|
|
209
|
-
statusFilter: ExecutionStatus.RUNNING,
|
|
210
|
-
}));
|
|
211
|
-
if (!executions) {
|
|
212
|
-
throw new Error("Could not list executions");
|
|
213
|
-
}
|
|
214
|
-
console.log("Executions: ", executions);
|
|
215
|
-
const currentExecution = executions.find((it) => it.executionArn == currentExecutionArn);
|
|
216
|
-
if (!currentExecution) {
|
|
217
|
-
throw new Error("Could not find current execution");
|
|
218
|
-
}
|
|
219
|
-
const newer = executions.filter((it) => {
|
|
220
|
-
if (!it.startDate || !currentExecution.startDate) {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
return it.startDate > currentExecution.startDate;
|
|
224
|
-
}).length;
|
|
225
|
-
return {
|
|
226
|
-
CanRunState: newer > 0 ? "SKIP" : executions.length == 1 ? "CONTINUE" : "WAIT",
|
|
227
|
-
};
|
|
228
|
-
};
|
|
229
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmVzL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUV4QyxpREFBZ0Q7QUFDaEQsZ0VBQStEO0FBQy9ELDJDQUEwQztBQUMxQyxpREFBZ0Q7QUFFaEQscURBQW9EO0FBQ3BELHFFQUF5RDtBQUN6RCw2REFBNEQ7QUFDNUQsbUNBQWtDO0FBRWxDLG9DQUFpRDtBQUNqRCwrQ0FBc0U7QUFDdEUsNkNBQXdDO0FBOEN4Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE1BQWEsUUFBUyxTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ2hELFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBb0I7O1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsTUFBTSxRQUFRLEdBQUcsSUFBQSw4QkFBZ0IsRUFBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDckQsTUFBTSxZQUFZLEdBQUcsSUFBQSxrQ0FBb0IsRUFBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFN0QsTUFBTSxlQUFlLEdBQ25CLE1BQUEsS0FBSyxDQUFDLGVBQWUsbUNBQUksSUFBQSw4QkFBc0IsRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUV2RCxNQUFNLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3hFLElBQUksRUFBRSxzQ0FBc0M7WUFDNUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FDekIscUJBQXFCLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQ3REO1lBQ0QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsR0FBRyxDQUFDLFFB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QUFDLE1BQU0sQ0FBQTtJQUVULE9BQU87UUFDTCxXQUFXLEVBQ1QsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNO0tBQ3BFLENBQUE7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIlxuaW1wb3J0ICogYXMgZXZlbnRzVGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgKiBhcyBzZm4gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zXCJcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiXG5pbXBvcnQgKiBhcyB0YXNrcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3NcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tIFwiYXdzLWxhbWJkYVwiXG5pbXBvcnQgeyBnZXRHcmlpZEFydGVmYWN0QnVja2V0IH0gZnJvbSBcIi4uL2dyaWlkXCJcbmltcG9ydCB7IHBpcGVsaW5lUzNQcmVmaXgsIHBpcGVsaW5lUzNUcmlnZ2VyS2V5IH0gZnJvbSBcIi4vY29udmVudGlvbnNcIlxuaW1wb3J0IHsgRGVwbG95RW52IH0gZnJvbSBcIi4vZGVwbG95LWVudlwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVQcm9wcyB7XG4gIC8qKlxuICAgKiBCdWNrZXQgaG9sZGluZyBwaXBlbGluZSBjb25maWd1cmF0aW9uIGFuZCB0cmlnZ2VyIGZpbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGV4aXN0aW5nIGJ1Y2tldCBiYXNlZCBvbiBHcmlpZCBjb252ZW50aW9uc1xuICAgKi9cbiAgYXJ0aWZhY3RzQnVja2V0PzogczMuSUJ1Y2tldFxuICAvKipcbiAgICogRW52aXJvbm1lbnRzIGZvciB0aGlzIHBpcGVsaW5lLiBFYWNoIGVudmlyb25tZW50IGlzIGRlcGxveWVkIHNlcXVlbnRpYWxseVxuICAgKiBpbiB0aGUgb3JkZXIgZ2l2ZW4uXG4gICAqL1xuICBlbnZpcm9ubWVudHM6IFBpcGVsaW5lRW52aXJvbm1lbnRbXVxuICAvKipcbiAgICogTmFtZSBvZiBwaXBlbGluZS4gVGhpcyBpcyB1c2VkIGZvciB0aGUgcGF0aCB3aGVyZSBjb25maWd1cmF0aW9uXG4gICAqIGlzIHN0b3JlZCBpbiBTMy5cbiAgICovXG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBUcmlnZ2VyIHRoZSBwaXBlbGluZSB3aGVuIHRoZSB0cmlnZ2VyIGZpbGUgaXMgd3JpdHRlbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cnVlXG4gICAqL1xuICB0cmlnZ2VyRW5hYmxlZD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFZQQyB1c2VkIGZvciBGYXJnYXRlIHJlc291cmNlcy5cbiAgICovXG4gIHZwYzogZWMyLklWcGNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIEFjY291bnQgbnVtYmVyIGhvc3RpbmcgdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgYWNjb3VudElkOiBzdHJpbmdcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgdGFza3MgdG8gcnVuIGFmdGVyIHRoZSBlbnZpcm9ubWVudCBoYXMgYmVlbiBkZXBsb3llZC5cbiAgICovXG4gIGFmdGVyU3VjY2Vzc2Z1bERlcGxveT86IHNmbi5DaGFpblxuICAvKipcbiAgICogTmFtZSBvZiBlbnZpcm9ubWVudC5cbiAgICovXG4gIG5hbWU6IHN0cmluZ1xufVxuXG4vKipcbiAqIFBpcGVsaW5lIGZvciBkb2luZyBhIG11bHRpLWFjY291bnQgQ0RLIGRlcGxveW1lbnQgYmFzZWRcbiAqIG9uIGEgYnVpbHQgQ0RLIENsb3VkIEFzc2VtYmx5IGFuZCBwYXJhbWV0ZXJzIHN0b3JlZCBpbiBTMy5cbiAqXG4gKiBUaGUgYWNjb3VudHMgYmVpbmcgZGVwbG95ZWQgdG8gbXVzdCBiZSBwcm92aXNpb25lZCB3aXRoXG4gKiB0aGUgTGlmbGlnQ2RrRGVwbG95ZXJEZXBzIGNvbnN0cnVjdCBzbyBleHBlY3RlZCBJQU1cbiAqIHJvbGVzIGlzIHByZXNlbnQuXG4gKlxuICogVGhlIHBpcGVsaW5lIHN0YXJ0cyBieSB3cml0aW5nIGFuIGVtcHR5IGZpbGUgdG9cbiAqIHMzOi8vPGFydGlmYWN0cy1idWNrZXQ+L3BpcGVsaW5lcy88cGlwZWxpbmUtbmFtZT4vdHJpZ2dlclxuICpcbiAqIFRoZSBDREsgZGVwbG95IHByb2Nlc3MgaXMgaGFuZGxlZCBieSBsaWZsaWctY2RrLWRlcGxveWVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXByYWxpZmVjeWNsZS9saWZsaWctY2RrLWRlcGxveWVyXG4gKlxuICogQ29uZmlndXJhdGlvbiBmaWxlcyBhcmUgcmVhZCBmcm9tIFMzIGF0IHRoZSBwYXRoXG4gKiBzMzovLzxhcnRpZmFjdHMtYnVja2V0Pi9waXBlbGluZXMvPHBpcGVsaW5lLW5hbWU+L1xuICpcbiAqICAtIGNsb3VkLWFzc2VtYmx5Lmpzb24gd2hpY2ggaGFzIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGFzXG4gKiAgICBDREtfQ0xPVURfQVNTRU1CTFkgaW4gbGlmbGlnLWNkay1kZXBsb3llclxuICpcbiAqICAtIHZhcmlhYmxlcyouanNvbiB3aGljaCBjYW4gYmUgemVybyBvciBtb3JlIGZpbGVzXG4gKiAgICB3aXRoIHN0cmluZy1zdHJpbmcgbWFwIHRoYXQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgdG9cbiAqICAgIGZvcm0gdGhlIGZvcm1hdCBkZXNjcmliZWQgYXMgQ0RLX1ZBUklBQkxFUyBpblxuICogICAgbGlmbGlnLWNkay1kZXBsb3llclxuICpcbiAqIFRoZSBzZXBhcmF0aW9uIG9mIENsb3VkIEFzc2VtYmx5IGRldGFpbHMgYW5kIHZhcmlhYmxlcyBlbmFibGVzXG4gKiBzZXBhcmF0aW9uIG9mIElhQyBjb2RlIGFuZCBhcHBsaWNhdGlvbiBjb2RlIGlmIHRoZXkgYXJlIG5vdFxuICogY29sb2NhdGVkIGluIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZSBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGNvbnN0IHMzUHJlZml4ID0gcGlwZWxpbmVTM1ByZWZpeChwcm9wcy5waXBlbGluZU5hbWUpXG4gICAgY29uc3QgczNUcmlnZ2VyS2V5ID0gcGlwZWxpbmVTM1RyaWdnZXJLZXkocHJvcHMucGlwZWxpbmVOYW1lKVxuXG4gICAgY29uc3QgYXJ0aWZhY3RzQnVja2V0ID1cbiAgICAgIHByb3BzLmFydGlmYWN0c0J1Y2tldCA/PyBnZXRHcmlpZEFydGVmYWN0QnVja2V0KHRoaXMpXG5cbiAgICBjb25zdCBjaGVja0NhblJ1bkZuID0gbmV3IGxhbWJkYS5TaW5nbGV0b25GdW5jdGlvbih0aGlzLCBcIkNoZWNrQ2FuUnVuRm5cIiwge1xuICAgICAgdXVpZDogXCIzMGFkM2FiYi1mNzc0LTQ4MDQtYTZlZi0yYzJmNGEyNDczNjJcIixcbiAgICAgIGNvZGU6IG5ldyBsYW1iZGEuSW5saW5lQ29kZShcbiAgICAgICAgYGV4cG9ydHMuaGFuZGxlciA9ICR7Y2hlY2tDYW5SdW5IYW5kbGVyLnRvU3RyaW5nKCl9O2AsXG4gICAgICApLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICB9KVxuXG4gICAgY29uc3QgY2hlY2tDYW5SdW5UYXNrID0gbmV3IHRhc2tzLkxhbWJkYUludm9rZShcbiAgICAgIHRoaXMsXG4gICAgICBcIkNoZWNrIGlmIHRoZSBwcm9jZXNzIGNhbiBydW5cIixcbiAgICAgIHtcbiAgICAgICAgbGFtYmRhRnVuY3Rpb246IGNoZWNrQ2FuUnVuRm4sXG4gICAgICAgIG91dHB1dFBhdGg6IFwiJC5QYXlsb2FkXCIsXG4gICAgICAgIHBheWxvYWQ6IHNmbi5UYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICAgXCJzdGF0ZU1hY2hpbmVJZC4kXCI6IFwiJCQuU3RhdGVNYWNoaW5lLklkXCIsXG4gICAgICAgICAgXCJleGVjdXRpb25JZC4kXCI6IFwiJCQuRXhlY3V0aW9uLklkXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBjb25zdCB3YWl0ID0gbmV3IHNmbi5XYWl0KHRoaXMsIFwiV2FpdCBiZWZvcmUgcmVjaGVja2luZyBzdGF0dXNcIiwge1xuICAgICAgdGltZTogc2ZuLldhaXRUaW1lLmR1cmF0aW9uKGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSksXG4gICAgfSlcblxuICAgIGNvbnN0IHNraXAgPSBuZXcgc2ZuLlN1Y2NlZWQodGhpcywgXCJTa2lwXCIpXG5cbiAgICBjb25zdCBjb2xsZWN0RmlsZXNGbiA9IG5ldyBsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJDb2xsZWN0RmlsZXNGblwiLFxuICAgICAge1xuICAgICAgICB1dWlkOiBcImM0OWNiZmUxLTUwZTAtNDcyMS04OTY0LWZiMjBmNGU1YTdhZFwiLFxuICAgICAgICBjb2RlOiBuZXcgbGFtYmRhLklubGluZUNvZGUoXG4gICAgICAgICAgYGV4cG9ydHMuaGFuZGxlciA9ICR7Y29sbGVjdEZpbGVzSGFuZGxlci50b1N0cmluZygpfTtgLFxuICAgICAgICApLFxuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgYXJ0aWZhY3RzQnVja2V0LmdyYW50UmVhZChjb2xsZWN0RmlsZXNGbilcblxuICAgIGNvbnN0IGNvbGxlY3RGaWxlc1Rhc2sgPSBuZXcgdGFza3MuTGFtYmRhSW52b2tlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiQ29sbGVjdCBmaWxlcyBmcm9tIFMzXCIsXG4gICAgICB7XG4gICAgICAgIGxhbWJkYUZ1bmN0aW9uOiBjb2xsZWN0RmlsZXNGbixcbiAgICAgICAgb3V0cHV0UGF0aDogXCIkLlBheWxvYWRcIixcbiAgICAgICAgcGF5bG9hZDogc2ZuLlRhc2tJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAgICAgICBidWNrZXROYW1lOiBhcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICBidWNrZXRQcmVmaXg6IHMzUHJlZml4LFxuICAgICAgICAgIGVudk5hbWVzOiBwcm9wcy5lbnZpcm9ubWVudHMubWFwKChpdCkgPT4gaXQubmFtZSksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBsZXQgcnVuOiBzZm4uQ2hhaW4gPSBzZm4uQ2hhaW4uc3RhcnQoY29sbGVjdEZpbGVzVGFzaylcblxuICAgIGNvbnN0IGlmSGF2aW5nU3RhY2tzID0gKG5hbWU6IHN0cmluZywgd29yazogc2ZuLkNoYWluKSA9PlxuICAgICAgbmV3IHNmbi5DaG9pY2UodGhpcywgYENoZWNrIGlmICR7bmFtZX0gaGFzIHN0YWNrc2ApXG4gICAgICAgIC53aGVuKFxuICAgICAgICAgIENvbmRpdGlvbi5vcihcbiAgICAgICAgICAgIENvbmRpdGlvbi5pc051bGwoYCQuU3RhY2tDb3VudFBlckVudi4ke25hbWV9YCksXG4gICAgICAgICAgICBDb25kaXRpb24ubnVtYmVyRXF1YWxzKGAkLlN0YWNrQ291bnRQZXJFbnYuJHtuYW1lfWAsIDApLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IHNmbi5QYXNzKHRoaXMsIGBTa2lwICR7bmFtZX1gKSxcbiAgICAgICAgKVxuICAgICAgICAub3RoZXJ3aXNlKHdvcmspXG4gICAgICAgIC5hZnRlcndhcmRzKClcblxuICAgIGZvciAoY29uc3QgZW52IG9mIHByb3BzLmVudmlyb25tZW50cykge1xuICAgICAgY29uc3QgaXQgPSBuZXcgRGVwbG95RW52KHRoaXMsIGVudi5uYW1lLCB7XG4gICAgICAgIGFjY291bnRJZDogZW52LmFjY291bnRJZCxcbiAgICAgICAgYWZ0ZXJTdWNjZXNzZnVsRGVwbG95OiBlbnYuYWZ0ZXJTdWNjZXNzZnVsRGVwbG95LFxuICAgICAgICBhcnRlZmFjdEJ1Y2tldDogYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICBlbnZOYW1lOiBlbnYubmFtZSxcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB9KVxuXG4gICAgICBydW4gPSBydW4ubmV4dChpZkhhdmluZ1N0YWNrcyhlbnYubmFtZSwgaXQuY2hhaW4pKVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmluaXRpb246IHNmbi5DaGFpbiA9IHNmbi5DaGFpbi5zdGFydChjaGVja0NhblJ1blRhc2spLm5leHQoXG4gICAgICBuZXcgc2ZuLkNob2ljZSh0aGlzLCBcIkNhbiBydW4/XCIpXG4gICAgICAgIC53aGVuKENvbmRpdGlvbi5zdHJpbmdFcXVhbHMoXCIkLkNhblJ1blN0YXRlXCIsIFwiQ09OVElOVUVcIiksIHJ1bilcbiAgICAgICAgLndoZW4oQ29uZGl0aW9uLnN0cmluZ0VxdWFscyhcIiQuQ2FuUnVuU3RhdGVcIiwgXCJTS0lQXCIpLCBza2lwKVxuICAgICAgICAub3RoZXJ3aXNlKHdhaXQubmV4dChjaGVja0NhblJ1blRhc2spKSxcbiAgICApXG5cbiAgICBjb25zdCBtYWNoaW5lID0gbmV3IHNmbi5TdGF0ZU1hY2hpbmUodGhpcywgXCJTdGF0ZU1hY2hpbmVcIiwge1xuICAgICAgZGVmaW5pdGlvbixcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zdGVwLWZ1bmN0aW9ucy9sYXRlc3QvZGcvc2ZuLXN0dWNrLWV4ZWN1dGlvbi5odG1sXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uaG91cnMoMyksXG4gICAgfSlcblxuICAgIG5ldyBpYW0uUG9saWN5KHRoaXMsIFwiQ2hlY2tDYW5SdW5Qb2xpY3lcIiwge1xuICAgICAgcm9sZXM6IFtjaGVja0NhblJ1bkZuLnJvbGUhXSxcbiAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcInN0YXRlczpMaXN0RXhlY3V0aW9uc1wiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFttYWNoaW5lLnN0YXRlTWFjaGluZUFybl0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLnRyaWdnZXJFbmFibGVkID8/IHRydWUpIHtcbiAgICAgIGFydGlmYWN0c0J1Y2tldC5vbkNsb3VkVHJhaWxXcml0ZU9iamVjdChcIlRyaWdnZXJcIiwge1xuICAgICAgICBwYXRoczogW3MzVHJpZ2dlcktleV0sXG4gICAgICAgIHRhcmdldDogbmV3IGV2ZW50c1RhcmdldHMuU2ZuU3RhdGVNYWNoaW5lKG1hY2hpbmUsIHtcbiAgICAgICAgICBpbnB1dDogZXZlbnRzLlJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHt9KSxcbiAgICAgICAgfSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2xvdWRBc3NlbWJseSB7XG4gIGNsb3VkQXNzZW1ibHlCdWNrZXROYW1lOiBzdHJpbmdcbiAgY2xvdWRBc3NlbWJseUJ1Y2tldEtleTogc3RyaW5nXG4gIGVudmlyb25tZW50czoge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHN0YWNrTmFtZXM6IHN0cmluZ1tdXG4gIH1bXVxuICBwYXJhbWV0ZXJzOiB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgdmFsdWU6IHVua25vd24gfCB7IHR5cGU6IFwidmFyaWFibGVcIjsgdmFyaWFibGU6IHN0cmluZyB9XG4gIH1bXVxufVxuXG4vLyBUaGlzIGlzIGEgc2VsZi1jb250YWluZWQgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgYSBsYW1iZGEuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgY29sbGVjdEZpbGVzSGFuZGxlcjogSGFuZGxlciA9IGFzeW5jIChldmVudDogUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcbiAgY29uc3QgeyBTM0NsaWVudCwgTGlzdE9iamVjdHNWMkNvbW1hbmQsIEdldE9iamVjdENvbW1hbmQgfSA9IGF3YWl0IGltcG9ydChcbiAgICBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiXG4gIClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcblxuICBjb25zdCBzM0NsaWVudCA9IG5ldyBTM0NsaWVudCgpXG5cbiAgY29uc29sZS5sb2coXCJFdmVudCByZWNlaXZlZDogXCIsIGV2ZW50KVxuXG4gIGNvbnN0IGJ1Y2tldE5hbWUgPSBldmVudC5idWNrZXROYW1lIGFzIHN0cmluZ1xuICBjb25zdCBidWNrZXRQcmVmaXggPSBldmVudC5idWNrZXRQcmVmaXggYXMgc3RyaW5nXG4gIGNvbnN0IGVudk5hbWVzID0gZXZlbnQuZW52TmFtZXMgYXMgc3RyaW5nW11cblxuICBpZiAoYnVja2V0UHJlZml4LnNsaWNlKC0xKSAhPT0gXCIvXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXhwZWN0ZWQgYnVja2V0IHByZWZpeCB0byBlbmQgd2l0aCAnLycgYnV0IGl0cyB2YWx1ZSBpcyAnJHtidWNrZXRQcmVmaXh9J2AsXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbGlzdE9iamVjdHMoKSB7XG4gICAgY29uc3QgeyBDb250ZW50cyB9ID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgIG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7XG4gICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgUHJlZml4OiBidWNrZXRQcmVmaXgsXG4gICAgICB9KSxcbiAgICApXG4gICAgcmV0dXJuIENvbnRlbnRzXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRPYmplY3Qoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgQm9keSB9ID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgIG5ldyBHZXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICBLZXk6IGtleSxcbiAgICAgIH0pLFxuICAgIClcbiAgICByZXR1cm4gQm9keSEudG9TdHJpbmcoKVxuICB9XG5cbiAgbGV0IGNsb3VkQXNzZW1ibHk6IENsb3VkQXNzZW1ibHkgfCBudWxsID0gbnVsbFxuICBsZXQgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RPYmplY3RzKClcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzID8/IFtdKSB7XG4gICAgY29uc3Qga2V5ID0gZmlsZS5LZXkhXG4gICAgY29uc3QgZmlsZW5hbWUgPSBrZXkuc2xpY2UoYnVja2V0UHJlZml4Lmxlbmd0aClcblxuICAgIGNvbnNvbGUubG9nKGBGaWxlOiAke2ZpbGVuYW1lfWApXG5cbiAgICBpZiAoZmlsZW5hbWUgPT09IFwiY2xvdWQtYXNzZW1ibHkuanNvblwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkZvdW5kIENsb3VkIEFzc2VtYmx5XCIpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICBjbG91ZEFzc2VtYmx5ID0gSlNPTi5wYXJzZShhd2FpdCBnZXRPYmplY3Qoa2V5KSlcbiAgICB9IGVsc2UgaWYgKC9edmFyaWFibGVzLipcXC5qc29uJC8udGVzdChmaWxlbmFtZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgdmFyaWFibGVzIGZpbGVcIilcbiAgICAgIHZhcmlhYmxlcyA9IHtcbiAgICAgICAgLi4udmFyaWFibGVzLFxuICAgICAgICAuLi4oSlNPTi5wYXJzZShhd2FpdCBnZXRPYmplY3Qoa2V5KSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiksXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiSWdub3JpbmcgdW5rbm93biBmaWxlXCIpXG4gICAgfVxuICB9XG5cbiAgaWYgKGNsb3VkQXNzZW1ibHkgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjbG91ZC1hc3NlbWJseS5qc29uIG5vdCBmb3VuZFwiKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBDbG91ZEFzc2VtYmx5OiBKU09OLnN0cmluZ2lmeShjbG91ZEFzc2VtYmx5KSxcbiAgICBWYXJpYWJsZXM6IEpTT04uc3RyaW5naWZ5KHZhcmlhYmxlcyksXG4gICAgU3RhY2tDb3VudFBlckVudjogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgZW52TmFtZXMubWFwKChuYW1lKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNsb3VkQXNzZW1ibHkuZW52aXJvbm1lbnRzLmZpbmQoKGl0KSA9PiBpdC5uYW1lID09PSBuYW1lKT8uc3RhY2tOYW1lc1xuICAgICAgICAgIC5sZW5ndGggPz8gMCxcbiAgICAgIF0pLFxuICAgICksXG4gIH1cbn1cblxuLy8gVGhpcyBpcyBhIHNlbGYtY29udGFpbmVkIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBzZXJpYWxpemVkIGFzIGEgbGFtYmRhLlxuY29uc3QgY2hlY2tDYW5SdW5IYW5kbGVyOiBIYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuXG4gIGNvbnN0IHsgU0ZOQ2xpZW50LCBMaXN0RXhlY3V0aW9uc0NvbW1hbmQsIEV4ZWN1dGlvblN0YXR1cyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgIFwiQGF3cy1zZGsvY2xpZW50LXNmblwiXG4gIClcbiAgY29uc3Qgc2ZuQ2xpZW50ID0gbmV3IFNGTkNsaWVudCgpXG5cbiAgY29uc29sZS5sb2coXCJFdmVudCByZWNlaXZlZDogXCIsIGV2ZW50KVxuXG4gIGNvbnN0IHN0YXRlTWFjaGluZUFybiA9IGV2ZW50W1wic3RhdGVNYWNoaW5lSWRcIl1cbiAgY29uc3QgY3VycmVudEV4ZWN1dGlvbkFybiA9IGV2ZW50W1wiZXhlY3V0aW9uSWRcIl1cblxuICBjb25zdCB7IGV4ZWN1dGlvbnMgfSA9IGF3YWl0IHNmbkNsaWVudC5zZW5kKFxuICAgIG5ldyBMaXN0RXhlY3V0aW9uc0NvbW1hbmQoe1xuICAgICAgc3RhdGVNYWNoaW5lQXJuLFxuICAgICAgc3RhdHVzRmlsdGVyOiBFeGVjdXRpb25TdGF0dXMuUlVOTklORyxcbiAgICB9KSxcbiAgKVxuXG4gIGlmICghZXhlY3V0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsaXN0IGV4ZWN1dGlvbnNcIilcbiAgfVxuXG4gIGNvbnNvbGUubG9nKFwiRXhlY3V0aW9uczogXCIsIGV4ZWN1dGlvbnMpXG5cbiAgY29uc3QgY3VycmVudEV4ZWN1dGlvbiA9IGV4ZWN1dGlvbnMuZmluZChcbiAgICAoaXQpID0+IGl0LmV4ZWN1dGlvbkFybiA9PSBjdXJyZW50RXhlY3V0aW9uQXJuLFxuICApXG5cbiAgaWYgKCFjdXJyZW50RXhlY3V0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY3VycmVudCBleGVjdXRpb25cIilcbiAgfVxuXG4gIGNvbnN0IG5ld2VyID0gZXhlY3V0aW9ucy5maWx0ZXIoKGl0KSA9PiB7XG4gICAgaWYgKCFpdC5zdGFydERhdGUgfHwgIWN1cnJlbnRFeGVjdXRpb24uc3RhcnREYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIGl0LnN0YXJ0RGF0ZSA+IGN1cnJlbnRFeGVjdXRpb24uc3RhcnREYXRlXG4gIH0pLmxlbmd0aFxuXG4gIHJldHVybiB7XG4gICAgQ2FuUnVuU3RhdGU6XG4gICAgICBuZXdlciA+IDAgPyBcIlNLSVBcIiA6IGV4ZWN1dGlvbnMubGVuZ3RoID09IDEgPyBcIkNPTlRJTlVFXCIgOiBcIldBSVRcIixcbiAgfVxufVxuIl19
|