aws-delivlib 13.4.4 → 13.4.8
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/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/create-release.js +0 -0
- package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/package-lock.json +100 -95
- package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/package.json +0 -0
- package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/publish.sh +0 -0
- package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/sign-files.sh +0 -0
- package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/with-signing-key.sh +0 -0
- package/cdk.out/{asset.dc2e98009b027861f34e56eebb81faa5a3951ed9da80ce4a903a45de04268238 → asset.3044256b9586ecb8a7709713aaca30ceb34f699e3f93c8858f633aaf2f0c7140}/index.js +17 -11
- package/cdk.out/delivlib-test.assets.json +8 -8
- package/cdk.out/delivlib-test.template.json +2 -2
- package/cdk.out/manifest.json +154 -154
- package/cdk.out/tree.json +412 -412
- package/lib/custom-resource-handlers/src/certificate-signing-request.tsbuildinfo +1 -1
- package/lib/custom-resource-handlers/src/pgp-secret.tsbuildinfo +1 -1
- package/lib/custom-resource-handlers/src/private-key.tsbuildinfo +1 -1
- package/lib/publishing/github/package-lock.json +100 -95
- package/package.json +17 -18
- package/lib/__tests__/auto-build.test.d.ts +0 -1
- package/lib/__tests__/auto-build.test.js +0 -119
- package/lib/__tests__/build-spec.test.d.ts +0 -1
- package/lib/__tests__/build-spec.test.js +0 -82
- package/lib/__tests__/bump.test.d.ts +0 -1
- package/lib/__tests__/bump.test.js +0 -284
- package/lib/__tests__/canary.test.d.ts +0 -1
- package/lib/__tests__/canary.test.js +0 -144
- package/lib/__tests__/change-control-lambda/disable-transition.test.d.ts +0 -1
- package/lib/__tests__/change-control-lambda/disable-transition.test.js +0 -64
- package/lib/__tests__/change-control-lambda/handler.test.d.ts +0 -1
- package/lib/__tests__/change-control-lambda/handler.test.js +0 -143
- package/lib/__tests__/change-control-lambda/time-window.test.d.ts +0 -1
- package/lib/__tests__/change-control-lambda/time-window.test.js +0 -131
- package/lib/__tests__/chime-notifier.test.d.ts +0 -6
- package/lib/__tests__/chime-notifier.test.js +0 -138
- package/lib/__tests__/code-signing-cert.test.d.ts +0 -1
- package/lib/__tests__/code-signing-cert.test.js +0 -72
- package/lib/__tests__/custom-resource-handlers/_cloud-formation.test.d.ts +0 -1
- package/lib/__tests__/custom-resource-handlers/_cloud-formation.test.js +0 -100
- package/lib/__tests__/custom-resource-handlers/_exec.test.d.ts +0 -1
- package/lib/__tests__/custom-resource-handlers/_exec.test.js +0 -9
- package/lib/__tests__/custom-resource-handlers/_rmrf.test.d.ts +0 -1
- package/lib/__tests__/custom-resource-handlers/_rmrf.test.js +0 -13
- package/lib/__tests__/custom-resource-handlers/certificate-signing-request.test.d.ts +0 -1
- package/lib/__tests__/custom-resource-handlers/certificate-signing-request.test.js +0 -171
- package/lib/__tests__/custom-resource-handlers/pgp-secret.test.d.ts +0 -1
- package/lib/__tests__/custom-resource-handlers/pgp-secret.test.js +0 -169
- package/lib/__tests__/custom-resource-handlers/private-key.test.d.ts +0 -1
- package/lib/__tests__/custom-resource-handlers/private-key.test.js +0 -164
- package/lib/__tests__/integ.delivlib.d.ts +0 -1
- package/lib/__tests__/integ.delivlib.js +0 -33
- package/lib/__tests__/open-pgp-key-pair.test.d.ts +0 -1
- package/lib/__tests__/open-pgp-key-pair.test.js +0 -130
- package/lib/__tests__/pipeline-notifications/chime.test.d.ts +0 -1
- package/lib/__tests__/pipeline-notifications/chime.test.js +0 -69
- package/lib/__tests__/pipeline-notifications/slack.test.d.ts +0 -1
- package/lib/__tests__/pipeline-notifications/slack.test.js +0 -82
- package/lib/__tests__/pipeline.test.d.ts +0 -1
- package/lib/__tests__/pipeline.test.js +0 -362
- package/lib/__tests__/pr.test.d.ts +0 -3
- package/lib/__tests__/pr.test.js +0 -88
- package/lib/__tests__/publishing.test.d.ts +0 -1
- package/lib/__tests__/publishing.test.js +0 -89
- package/lib/__tests__/registry-sync/ecr-mirror.test.d.ts +0 -1
- package/lib/__tests__/registry-sync/ecr-mirror.test.js +0 -313
- package/lib/__tests__/registry-sync/mirror-source.test.d.ts +0 -1
- package/lib/__tests__/registry-sync/mirror-source.test.js +0 -225
- package/lib/__tests__/shellable.test.d.ts +0 -1
- package/lib/__tests__/shellable.test.js +0 -479
- package/lib/__tests__/test-stack.d.ts +0 -4
- package/lib/__tests__/test-stack.js +0 -185
- package/lib/__tests__/watcher-handler.test.d.ts +0 -1
- package/lib/__tests__/watcher-handler.test.js +0 -190
- package/lib/__tests__/watcher.test.d.ts +0 -1
- package/lib/__tests__/watcher.test.js +0 -78
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const assert_1 = require("@monocdk-experiment/assert");
|
|
4
|
-
require("@monocdk-experiment/assert/jest");
|
|
5
|
-
const monocdk_1 = require("monocdk");
|
|
6
|
-
const lib_1 = require("../../../lib");
|
|
7
|
-
describe('chime notifications', () => {
|
|
8
|
-
test('failure notification via chime', () => {
|
|
9
|
-
// GIVEN
|
|
10
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
11
|
-
const pipe = new lib_1.Pipeline(stack, 'Pipeline', {
|
|
12
|
-
repo: new lib_1.CodeCommitRepo(new monocdk_1.aws_codecommit.Repository(stack, 'Repo1', { repositoryName: 'test' })),
|
|
13
|
-
});
|
|
14
|
-
// WHEN
|
|
15
|
-
pipe.notifyOnFailure(new lib_1.ChimeNotification({
|
|
16
|
-
webhookUrls: ['url-1'],
|
|
17
|
-
}));
|
|
18
|
-
// THEN
|
|
19
|
-
expect(stack).toHaveResourceLike('AWS::Events::Rule', {
|
|
20
|
-
EventPattern: {
|
|
21
|
-
source: ['aws.codepipeline'],
|
|
22
|
-
resources: [
|
|
23
|
-
stack.resolve(pipe.pipeline.pipelineArn),
|
|
24
|
-
],
|
|
25
|
-
},
|
|
26
|
-
Targets: [
|
|
27
|
-
{
|
|
28
|
-
InputTransformer: {
|
|
29
|
-
InputTemplate: (0, assert_1.stringLike)('*url-1*'),
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
],
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
test('multiple chime notifications', () => {
|
|
36
|
-
// GIVEN
|
|
37
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
38
|
-
const pipe = new lib_1.Pipeline(stack, 'Pipeline', {
|
|
39
|
-
repo: new lib_1.CodeCommitRepo(new monocdk_1.aws_codecommit.Repository(stack, 'Repo1', { repositoryName: 'test' })),
|
|
40
|
-
});
|
|
41
|
-
// WHEN
|
|
42
|
-
pipe.notifyOnFailure(new lib_1.ChimeNotification({
|
|
43
|
-
webhookUrls: ['url-1'],
|
|
44
|
-
}));
|
|
45
|
-
pipe.notifyOnFailure(new lib_1.ChimeNotification({
|
|
46
|
-
webhookUrls: ['url-2'],
|
|
47
|
-
}));
|
|
48
|
-
// THEN
|
|
49
|
-
expect(stack).toHaveResourceLike('AWS::Events::Rule', {
|
|
50
|
-
Targets: [
|
|
51
|
-
{
|
|
52
|
-
InputTransformer: {
|
|
53
|
-
InputTemplate: (0, assert_1.stringLike)('*url-1*'),
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
],
|
|
57
|
-
});
|
|
58
|
-
expect(stack).toHaveResourceLike('AWS::Events::Rule', {
|
|
59
|
-
Targets: [
|
|
60
|
-
{
|
|
61
|
-
InputTransformer: {
|
|
62
|
-
InputTemplate: (0, assert_1.stringLike)('*url-2*'),
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
],
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpbWUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoaW1lLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1REFBd0Q7QUFDeEQsMkNBQXlDO0FBQ3pDLHFDQUdpQjtBQUNqQixzQ0FBMkU7QUFFM0UsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtJQUNuQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzFDLFFBQVE7UUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLGVBQUssQ0FBQyxJQUFJLGFBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksY0FBUSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDM0MsSUFBSSxFQUFFLElBQUksb0JBQWMsQ0FBQyxJQUFJLHdCQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNoRyxDQUFDLENBQUM7UUFFSCxPQUFPO1FBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLHVCQUFpQixDQUFDO1lBQ3pDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQztTQUN2QixDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU87UUFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLEVBQUU7WUFDcEQsWUFBWSxFQUFFO2dCQUNaLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixDQUFDO2dCQUM1QixTQUFTLEVBQUU7b0JBQ1QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztpQkFDekM7YUFDRjtZQUNELE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxnQkFBZ0IsRUFBRTt3QkFDaEIsYUFBYSxFQUFFLElBQUEsbUJBQVUsRUFBQyxTQUFTLENBQUM7cUJBQ3JDO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7UUFDeEMsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksZUFBSyxDQUFDLElBQUksYUFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFRLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUMzQyxJQUFJLEVBQUUsSUFBSSxvQkFBYyxDQUFDLElBQUksd0JBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ2hHLENBQUMsQ0FBQztRQUVILE9BQU87UUFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksdUJBQWlCLENBQUM7WUFDekMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDO1NBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBRUosSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLHVCQUFpQixDQUFDO1lBQ3pDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQztTQUN2QixDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU87UUFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLEVBQUU7WUFDcEQsT0FBTyxFQUFFO2dCQUNQO29CQUNFLGdCQUFnQixFQUFFO3dCQUNoQixhQUFhLEVBQUUsSUFBQSxtQkFBVSxFQUFDLFNBQVMsQ0FBQztxQkFDckM7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRTtZQUNwRCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsZ0JBQWdCLEVBQUU7d0JBQ2hCLGFBQWEsRUFBRSxJQUFBLG1CQUFVLEVBQUMsU0FBUyxDQUFDO3FCQUNyQztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0cmluZ0xpa2UgfSBmcm9tICdAbW9ub2Nkay1leHBlcmltZW50L2Fzc2VydCc7XG5pbXBvcnQgJ0Btb25vY2RrLWV4cGVyaW1lbnQvYXNzZXJ0L2plc3QnO1xuaW1wb3J0IHtcbiAgQXBwLCBTdGFjayxcbiAgYXdzX2NvZGVjb21taXQgYXMgY29kZWNvbW1pdCxcbn0gZnJvbSAnbW9ub2Nkayc7XG5pbXBvcnQgeyBQaXBlbGluZSwgQ29kZUNvbW1pdFJlcG8sIENoaW1lTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuZGVzY3JpYmUoJ2NoaW1lIG5vdGlmaWNhdGlvbnMnLCAoKSA9PiB7XG4gIHRlc3QoJ2ZhaWx1cmUgbm90aWZpY2F0aW9uIHZpYSBjaGltZScsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ1Rlc3RTdGFjaycpO1xuICAgIGNvbnN0IHBpcGUgPSBuZXcgUGlwZWxpbmUoc3RhY2ssICdQaXBlbGluZScsIHtcbiAgICAgIHJlcG86IG5ldyBDb2RlQ29tbWl0UmVwbyhuZXcgY29kZWNvbW1pdC5SZXBvc2l0b3J5KHN0YWNrLCAnUmVwbzEnLCB7IHJlcG9zaXRvcnlOYW1lOiAndGVzdCcgfSkpLFxuICAgIH0pO1xuXG4gICAgLy8gV0hFTlxuICAgIHBpcGUubm90aWZ5T25GYWlsdXJlKG5ldyBDaGltZU5vdGlmaWNhdGlvbih7XG4gICAgICB3ZWJob29rVXJsczogWyd1cmwtMSddLFxuICAgIH0pKTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpFdmVudHM6OlJ1bGUnLCB7XG4gICAgICBFdmVudFBhdHRlcm46IHtcbiAgICAgICAgc291cmNlOiBbJ2F3cy5jb2RlcGlwZWxpbmUnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgc3RhY2sucmVzb2x2ZShwaXBlLnBpcGVsaW5lLnBpcGVsaW5lQXJuKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBUYXJnZXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBJbnB1dFRyYW5zZm9ybWVyOiB7XG4gICAgICAgICAgICBJbnB1dFRlbXBsYXRlOiBzdHJpbmdMaWtlKCcqdXJsLTEqJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ211bHRpcGxlIGNoaW1lIG5vdGlmaWNhdGlvbnMnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdUZXN0U3RhY2snKTtcbiAgICBjb25zdCBwaXBlID0gbmV3IFBpcGVsaW5lKHN0YWNrLCAnUGlwZWxpbmUnLCB7XG4gICAgICByZXBvOiBuZXcgQ29kZUNvbW1pdFJlcG8obmV3IGNvZGVjb21taXQuUmVwb3NpdG9yeShzdGFjaywgJ1JlcG8xJywgeyByZXBvc2l0b3J5TmFtZTogJ3Rlc3QnIH0pKSxcbiAgICB9KTtcblxuICAgIC8vIFdIRU5cbiAgICBwaXBlLm5vdGlmeU9uRmFpbHVyZShuZXcgQ2hpbWVOb3RpZmljYXRpb24oe1xuICAgICAgd2ViaG9va1VybHM6IFsndXJsLTEnXSxcbiAgICB9KSk7XG5cbiAgICBwaXBlLm5vdGlmeU9uRmFpbHVyZShuZXcgQ2hpbWVOb3RpZmljYXRpb24oe1xuICAgICAgd2ViaG9va1VybHM6IFsndXJsLTInXSxcbiAgICB9KSk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6RXZlbnRzOjpSdWxlJywge1xuICAgICAgVGFyZ2V0czogW1xuICAgICAgICB7XG4gICAgICAgICAgSW5wdXRUcmFuc2Zvcm1lcjoge1xuICAgICAgICAgICAgSW5wdXRUZW1wbGF0ZTogc3RyaW5nTGlrZSgnKnVybC0xKicpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkV2ZW50czo6UnVsZScsIHtcbiAgICAgIFRhcmdldHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIElucHV0VHJhbnNmb3JtZXI6IHtcbiAgICAgICAgICAgIElucHV0VGVtcGxhdGU6IHN0cmluZ0xpa2UoJyp1cmwtMionKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfSk7XG59KTsiXX0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import '@monocdk-experiment/assert/jest';
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
require("@monocdk-experiment/assert/jest");
|
|
4
|
-
const monocdk_1 = require("monocdk");
|
|
5
|
-
const lib_1 = require("../../../lib");
|
|
6
|
-
describe('slack notifications', () => {
|
|
7
|
-
test('failure notification via slack', () => {
|
|
8
|
-
// GIVEN
|
|
9
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
10
|
-
const slackChannel = new monocdk_1.aws_chatbot.SlackChannelConfiguration(stack, 'notify', {
|
|
11
|
-
slackChannelConfigurationName: 'test-slack-config',
|
|
12
|
-
slackChannelId: 'test-channel-id',
|
|
13
|
-
slackWorkspaceId: 'test-workspace-id',
|
|
14
|
-
});
|
|
15
|
-
const pipe = new lib_1.Pipeline(stack, 'Pipeline', {
|
|
16
|
-
repo: new lib_1.CodeCommitRepo(new monocdk_1.aws_codecommit.Repository(stack, 'Repo1', { repositoryName: 'test' })),
|
|
17
|
-
});
|
|
18
|
-
// WHEN
|
|
19
|
-
pipe.notifyOnFailure(new lib_1.SlackNotification({ channels: [slackChannel] }));
|
|
20
|
-
// THEN
|
|
21
|
-
expect(stack).toHaveResource('AWS::CodeStarNotifications::NotificationRule', {
|
|
22
|
-
DetailType: 'BASIC',
|
|
23
|
-
EventTypeIds: ['codepipeline-pipeline-action-execution-failed'],
|
|
24
|
-
Name: {
|
|
25
|
-
'Fn::Join': [
|
|
26
|
-
'',
|
|
27
|
-
[
|
|
28
|
-
{
|
|
29
|
-
Ref: 'PipelineBuildPipeline04C6628A',
|
|
30
|
-
},
|
|
31
|
-
'-06cc6a8b3242c01f0cffbd9626c6a84d',
|
|
32
|
-
],
|
|
33
|
-
],
|
|
34
|
-
},
|
|
35
|
-
Resource: stack.resolve(pipe.pipeline.pipelineArn),
|
|
36
|
-
Targets: [
|
|
37
|
-
{
|
|
38
|
-
TargetAddress: stack.resolve(slackChannel.slackChannelConfigurationArn),
|
|
39
|
-
TargetType: 'AWSChatbotSlack',
|
|
40
|
-
},
|
|
41
|
-
],
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
test('multiple notifications', () => {
|
|
45
|
-
// GIVEN
|
|
46
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
47
|
-
const slackChannel1 = new monocdk_1.aws_chatbot.SlackChannelConfiguration(stack, 'slack1', {
|
|
48
|
-
slackChannelConfigurationName: 'test-slack-config-1',
|
|
49
|
-
slackChannelId: 'test-channel-id-1',
|
|
50
|
-
slackWorkspaceId: 'test-workspace-id-1',
|
|
51
|
-
});
|
|
52
|
-
const slackChannel2 = new monocdk_1.aws_chatbot.SlackChannelConfiguration(stack, 'slack2', {
|
|
53
|
-
slackChannelConfigurationName: 'test-slack-config-2',
|
|
54
|
-
slackChannelId: 'test-channel-id-2',
|
|
55
|
-
slackWorkspaceId: 'test-workspace-id-2',
|
|
56
|
-
});
|
|
57
|
-
const pipe = new lib_1.Pipeline(stack, 'Pipeline', {
|
|
58
|
-
repo: new lib_1.CodeCommitRepo(new monocdk_1.aws_codecommit.Repository(stack, 'Repo1', { repositoryName: 'test' })),
|
|
59
|
-
});
|
|
60
|
-
// WHEN
|
|
61
|
-
pipe.notifyOnFailure(new lib_1.SlackNotification({ channels: [slackChannel1] }));
|
|
62
|
-
pipe.notifyOnFailure(new lib_1.SlackNotification({ channels: [slackChannel2] }));
|
|
63
|
-
// THEN
|
|
64
|
-
expect(stack).toHaveResource('AWS::CodeStarNotifications::NotificationRule', {
|
|
65
|
-
Targets: [
|
|
66
|
-
{
|
|
67
|
-
TargetAddress: stack.resolve(slackChannel1.slackChannelConfigurationArn),
|
|
68
|
-
TargetType: 'AWSChatbotSlack',
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
});
|
|
72
|
-
expect(stack).toHaveResource('AWS::CodeStarNotifications::NotificationRule', {
|
|
73
|
-
Targets: [
|
|
74
|
-
{
|
|
75
|
-
TargetAddress: stack.resolve(slackChannel2.slackChannelConfigurationArn),
|
|
76
|
-
TargetType: 'AWSChatbotSlack',
|
|
77
|
-
},
|
|
78
|
-
],
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2sudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNsYWNrLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBeUM7QUFDekMscUNBSWlCO0FBQ2pCLHNDQUEyRTtBQUUzRSxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO0lBQ25DLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7UUFDMUMsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksZUFBSyxDQUFDLElBQUksYUFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxxQkFBTyxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDMUUsNkJBQTZCLEVBQUUsbUJBQW1CO1lBQ2xELGNBQWMsRUFBRSxpQkFBaUI7WUFDakMsZ0JBQWdCLEVBQUUsbUJBQW1CO1NBQ3RDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUksY0FBUSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDM0MsSUFBSSxFQUFFLElBQUksb0JBQWMsQ0FBQyxJQUFJLHdCQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNoRyxDQUFDLENBQUM7UUFFSCxPQUFPO1FBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLHVCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUUsT0FBTztRQUNQLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsOENBQThDLEVBQUU7WUFDM0UsVUFBVSxFQUFFLE9BQU87WUFDbkIsWUFBWSxFQUFFLENBQUMsK0NBQStDLENBQUM7WUFDL0QsSUFBSSxFQUFFO2dCQUNKLFVBQVUsRUFBRTtvQkFDVixFQUFFO29CQUNGO3dCQUNFOzRCQUNFLEdBQUcsRUFBRSwrQkFBK0I7eUJBQ3JDO3dCQUNELG1DQUFtQztxQkFDcEM7aUJBQ0Y7YUFDRjtZQUNELFFBQVEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQ2xELE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxhQUFhLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsNEJBQTRCLENBQUM7b0JBQ3ZFLFVBQVUsRUFBRSxpQkFBaUI7aUJBQzlCO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7UUFDbEMsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksZUFBSyxDQUFDLElBQUksYUFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxxQkFBTyxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDM0UsNkJBQTZCLEVBQUUscUJBQXFCO1lBQ3BELGNBQWMsRUFBRSxtQkFBbUI7WUFDbkMsZ0JBQWdCLEVBQUUscUJBQXFCO1NBQ3hDLENBQUMsQ0FBQztRQUNILE1BQU0sYUFBYSxHQUFHLElBQUkscUJBQU8sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQzNFLDZCQUE2QixFQUFFLHFCQUFxQjtZQUNwRCxjQUFjLEVBQUUsbUJBQW1CO1lBQ25DLGdCQUFnQixFQUFFLHFCQUFxQjtTQUN4QyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxJQUFJLGNBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQzNDLElBQUksRUFBRSxJQUFJLG9CQUFjLENBQUMsSUFBSSx3QkFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDaEcsQ0FBQyxDQUFDO1FBRUgsT0FBTztRQUNQLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSx1QkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSx1QkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNFLE9BQU87UUFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLDhDQUE4QyxFQUFFO1lBQzNFLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxhQUFhLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUM7b0JBQ3hFLFVBQVUsRUFBRSxpQkFBaUI7aUJBQzlCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLDhDQUE4QyxFQUFFO1lBQzNFLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxhQUFhLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUM7b0JBQ3hFLFVBQVUsRUFBRSxpQkFBaUI7aUJBQzlCO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdAbW9ub2Nkay1leHBlcmltZW50L2Fzc2VydC9qZXN0JztcbmltcG9ydCB7XG4gIEFwcCwgU3RhY2ssXG4gIGF3c19jb2RlY29tbWl0IGFzIGNvZGVjb21taXQsXG4gIGF3c19jaGF0Ym90IGFzIGNoYXRib3QsXG59IGZyb20gJ21vbm9jZGsnO1xuaW1wb3J0IHsgUGlwZWxpbmUsIENvZGVDb21taXRSZXBvLCBTbGFja05vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmRlc2NyaWJlKCdzbGFjayBub3RpZmljYXRpb25zJywgKCkgPT4ge1xuICB0ZXN0KCdmYWlsdXJlIG5vdGlmaWNhdGlvbiB2aWEgc2xhY2snLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdUZXN0U3RhY2snKTtcbiAgICBjb25zdCBzbGFja0NoYW5uZWwgPSBuZXcgY2hhdGJvdC5TbGFja0NoYW5uZWxDb25maWd1cmF0aW9uKHN0YWNrLCAnbm90aWZ5Jywge1xuICAgICAgc2xhY2tDaGFubmVsQ29uZmlndXJhdGlvbk5hbWU6ICd0ZXN0LXNsYWNrLWNvbmZpZycsXG4gICAgICBzbGFja0NoYW5uZWxJZDogJ3Rlc3QtY2hhbm5lbC1pZCcsXG4gICAgICBzbGFja1dvcmtzcGFjZUlkOiAndGVzdC13b3Jrc3BhY2UtaWQnLFxuICAgIH0pO1xuICAgIGNvbnN0IHBpcGUgPSBuZXcgUGlwZWxpbmUoc3RhY2ssICdQaXBlbGluZScsIHtcbiAgICAgIHJlcG86IG5ldyBDb2RlQ29tbWl0UmVwbyhuZXcgY29kZWNvbW1pdC5SZXBvc2l0b3J5KHN0YWNrLCAnUmVwbzEnLCB7IHJlcG9zaXRvcnlOYW1lOiAndGVzdCcgfSkpLFxuICAgIH0pO1xuXG4gICAgLy8gV0hFTlxuICAgIHBpcGUubm90aWZ5T25GYWlsdXJlKG5ldyBTbGFja05vdGlmaWNhdGlvbih7IGNoYW5uZWxzOiBbc2xhY2tDaGFubmVsXSB9KSk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZSgnQVdTOjpDb2RlU3Rhck5vdGlmaWNhdGlvbnM6Ok5vdGlmaWNhdGlvblJ1bGUnLCB7XG4gICAgICBEZXRhaWxUeXBlOiAnQkFTSUMnLFxuICAgICAgRXZlbnRUeXBlSWRzOiBbJ2NvZGVwaXBlbGluZS1waXBlbGluZS1hY3Rpb24tZXhlY3V0aW9uLWZhaWxlZCddLFxuICAgICAgTmFtZToge1xuICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgJycsXG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBSZWY6ICdQaXBlbGluZUJ1aWxkUGlwZWxpbmUwNEM2NjI4QScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy0wNmNjNmE4YjMyNDJjMDFmMGNmZmJkOTYyNmM2YTg0ZCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBSZXNvdXJjZTogc3RhY2sucmVzb2x2ZShwaXBlLnBpcGVsaW5lLnBpcGVsaW5lQXJuKSxcbiAgICAgIFRhcmdldHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFRhcmdldEFkZHJlc3M6IHN0YWNrLnJlc29sdmUoc2xhY2tDaGFubmVsLnNsYWNrQ2hhbm5lbENvbmZpZ3VyYXRpb25Bcm4pLFxuICAgICAgICAgIFRhcmdldFR5cGU6ICdBV1NDaGF0Ym90U2xhY2snLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnbXVsdGlwbGUgbm90aWZpY2F0aW9ucycsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ1Rlc3RTdGFjaycpO1xuICAgIGNvbnN0IHNsYWNrQ2hhbm5lbDEgPSBuZXcgY2hhdGJvdC5TbGFja0NoYW5uZWxDb25maWd1cmF0aW9uKHN0YWNrLCAnc2xhY2sxJywge1xuICAgICAgc2xhY2tDaGFubmVsQ29uZmlndXJhdGlvbk5hbWU6ICd0ZXN0LXNsYWNrLWNvbmZpZy0xJyxcbiAgICAgIHNsYWNrQ2hhbm5lbElkOiAndGVzdC1jaGFubmVsLWlkLTEnLFxuICAgICAgc2xhY2tXb3Jrc3BhY2VJZDogJ3Rlc3Qtd29ya3NwYWNlLWlkLTEnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNsYWNrQ2hhbm5lbDIgPSBuZXcgY2hhdGJvdC5TbGFja0NoYW5uZWxDb25maWd1cmF0aW9uKHN0YWNrLCAnc2xhY2syJywge1xuICAgICAgc2xhY2tDaGFubmVsQ29uZmlndXJhdGlvbk5hbWU6ICd0ZXN0LXNsYWNrLWNvbmZpZy0yJyxcbiAgICAgIHNsYWNrQ2hhbm5lbElkOiAndGVzdC1jaGFubmVsLWlkLTInLFxuICAgICAgc2xhY2tXb3Jrc3BhY2VJZDogJ3Rlc3Qtd29ya3NwYWNlLWlkLTInLFxuICAgIH0pO1xuICAgIGNvbnN0IHBpcGUgPSBuZXcgUGlwZWxpbmUoc3RhY2ssICdQaXBlbGluZScsIHtcbiAgICAgIHJlcG86IG5ldyBDb2RlQ29tbWl0UmVwbyhuZXcgY29kZWNvbW1pdC5SZXBvc2l0b3J5KHN0YWNrLCAnUmVwbzEnLCB7IHJlcG9zaXRvcnlOYW1lOiAndGVzdCcgfSkpLFxuICAgIH0pO1xuXG4gICAgLy8gV0hFTlxuICAgIHBpcGUubm90aWZ5T25GYWlsdXJlKG5ldyBTbGFja05vdGlmaWNhdGlvbih7IGNoYW5uZWxzOiBbc2xhY2tDaGFubmVsMV0gfSkpO1xuICAgIHBpcGUubm90aWZ5T25GYWlsdXJlKG5ldyBTbGFja05vdGlmaWNhdGlvbih7IGNoYW5uZWxzOiBbc2xhY2tDaGFubmVsMl0gfSkpO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2UoJ0FXUzo6Q29kZVN0YXJOb3RpZmljYXRpb25zOjpOb3RpZmljYXRpb25SdWxlJywge1xuICAgICAgVGFyZ2V0czogW1xuICAgICAgICB7XG4gICAgICAgICAgVGFyZ2V0QWRkcmVzczogc3RhY2sucmVzb2x2ZShzbGFja0NoYW5uZWwxLnNsYWNrQ2hhbm5lbENvbmZpZ3VyYXRpb25Bcm4pLFxuICAgICAgICAgIFRhcmdldFR5cGU6ICdBV1NDaGF0Ym90U2xhY2snLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlKCdBV1M6OkNvZGVTdGFyTm90aWZpY2F0aW9uczo6Tm90aWZpY2F0aW9uUnVsZScsIHtcbiAgICAgIFRhcmdldHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFRhcmdldEFkZHJlc3M6IHN0YWNrLnJlc29sdmUoc2xhY2tDaGFubmVsMi5zbGFja0NoYW5uZWxDb25maWd1cmF0aW9uQXJuKSxcbiAgICAgICAgICBUYXJnZXRUeXBlOiAnQVdTQ2hhdGJvdFNsYWNrJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
const path = __importStar(require("path"));
|
|
23
|
-
const assert_1 = require("@monocdk-experiment/assert");
|
|
24
|
-
const monocdk_1 = require("monocdk");
|
|
25
|
-
const delivlib = __importStar(require("../../lib"));
|
|
26
|
-
const util_1 = require("../../lib/util");
|
|
27
|
-
test('pipelineName can be used to set a physical name for the pipeline', async () => {
|
|
28
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
29
|
-
new delivlib.Pipeline(stack, 'Pipeline', {
|
|
30
|
-
repo: createTestRepo(stack),
|
|
31
|
-
pipelineName: 'HelloPipeline',
|
|
32
|
-
});
|
|
33
|
-
(0, assert_1.expect)(stack).to((0, assert_1.haveResource)('AWS::CodePipeline::Pipeline', {
|
|
34
|
-
Name: 'HelloPipeline',
|
|
35
|
-
}));
|
|
36
|
-
});
|
|
37
|
-
test('concurrency: unlimited by default', async () => {
|
|
38
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
39
|
-
const stages = createTestPipelineForConcurrencyTests(stack);
|
|
40
|
-
// default is RunOrder = 1 for all actions which means they all run in parallel
|
|
41
|
-
for (const stage of stages) {
|
|
42
|
-
const actions = stage.Actions;
|
|
43
|
-
for (const action of actions) {
|
|
44
|
-
expect(action.RunOrder).toBe(1);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
test('concurrency = 1: means that actions will run sequentially', async () => {
|
|
49
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
50
|
-
const stages = createTestPipelineForConcurrencyTests(stack, { concurrency: 1 });
|
|
51
|
-
for (const stage of stages) {
|
|
52
|
-
const actions = stage.Actions;
|
|
53
|
-
let expected = 1;
|
|
54
|
-
for (const action of actions) {
|
|
55
|
-
expect(action.RunOrder).toBe(expected);
|
|
56
|
-
expected++;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
test('determineRunOrder: creates groups of up to "concurrency" actions', async () => {
|
|
61
|
-
testCase({ actionCount: 1, concurrency: 1 });
|
|
62
|
-
testCase({ actionCount: 10, concurrency: 1 });
|
|
63
|
-
testCase({ actionCount: 56, concurrency: 4 });
|
|
64
|
-
testCase({ actionCount: 3, concurrency: 2 });
|
|
65
|
-
function testCase({ actionCount, concurrency }) {
|
|
66
|
-
const actionsPerRunOrder = {};
|
|
67
|
-
for (let i = 0; i < actionCount; ++i) {
|
|
68
|
-
const runOrder = (0, util_1.determineRunOrder)(i, concurrency);
|
|
69
|
-
if (!actionsPerRunOrder[runOrder]) {
|
|
70
|
-
actionsPerRunOrder[runOrder] = 0;
|
|
71
|
-
}
|
|
72
|
-
actionsPerRunOrder[runOrder]++;
|
|
73
|
-
}
|
|
74
|
-
// assert that there are no more than *concurrency* actions in each runOrder
|
|
75
|
-
let total = 0;
|
|
76
|
-
for (const [, count] of Object.entries(actionsPerRunOrder)) {
|
|
77
|
-
expect(count).toBeLessThanOrEqual(concurrency);
|
|
78
|
-
total += count;
|
|
79
|
-
}
|
|
80
|
-
expect(total).toBe(actionCount); // sanity
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
test('can add arbitrary shellables with different artifacts', () => {
|
|
84
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
85
|
-
const pipeline = new delivlib.Pipeline(stack, 'Pipeline', {
|
|
86
|
-
repo: createTestRepo(stack),
|
|
87
|
-
pipelineName: 'HelloPipeline',
|
|
88
|
-
});
|
|
89
|
-
const action = pipeline.addShellable('Test', 'SecondStep', {
|
|
90
|
-
scriptDirectory: __dirname,
|
|
91
|
-
entrypoint: 'run-test.sh',
|
|
92
|
-
}).action;
|
|
93
|
-
pipeline.addPublish(new Pub(stack, 'Pub'), { inputArtifact: action.actionProperties.outputs[0] });
|
|
94
|
-
(0, assert_1.expect)(stack).to((0, assert_1.haveResourceLike)('AWS::CodePipeline::Pipeline', {
|
|
95
|
-
Stages: [
|
|
96
|
-
{
|
|
97
|
-
Name: 'Source',
|
|
98
|
-
Actions: [
|
|
99
|
-
{
|
|
100
|
-
ActionTypeId: { Category: 'Source', Owner: 'AWS', Provider: 'CodeCommit' },
|
|
101
|
-
Name: 'Pull',
|
|
102
|
-
OutputArtifacts: [
|
|
103
|
-
{
|
|
104
|
-
Name: 'Source',
|
|
105
|
-
},
|
|
106
|
-
],
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
Name: 'Build',
|
|
112
|
-
Actions: [
|
|
113
|
-
{
|
|
114
|
-
Name: 'Build',
|
|
115
|
-
ActionTypeId: { Category: 'Build', Owner: 'AWS', Provider: 'CodeBuild' },
|
|
116
|
-
InputArtifacts: [{ Name: 'Source' }],
|
|
117
|
-
OutputArtifacts: [{ Name: 'Artifact_Build_Build' }],
|
|
118
|
-
RunOrder: 1,
|
|
119
|
-
},
|
|
120
|
-
],
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
Name: 'Test',
|
|
124
|
-
Actions: [
|
|
125
|
-
{
|
|
126
|
-
ActionTypeId: { Category: 'Build', Owner: 'AWS', Provider: 'CodeBuild' },
|
|
127
|
-
InputArtifacts: [{ Name: 'Artifact_Build_Build' }],
|
|
128
|
-
Name: 'ActionSecondStep',
|
|
129
|
-
OutputArtifacts: [{ Name: 'Artifact_TestStackPipelineSecondStep91726C11' }],
|
|
130
|
-
RunOrder: 1,
|
|
131
|
-
},
|
|
132
|
-
],
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
Name: 'Publish',
|
|
136
|
-
Actions: [
|
|
137
|
-
{
|
|
138
|
-
ActionTypeId: { Category: 'Build', Owner: 'AWS', Provider: 'CodeBuild' },
|
|
139
|
-
InputArtifacts: [{ Name: 'Artifact_TestStackPipelineSecondStep91726C11' }],
|
|
140
|
-
Name: 'PubPublish',
|
|
141
|
-
RunOrder: 1,
|
|
142
|
-
},
|
|
143
|
-
],
|
|
144
|
-
},
|
|
145
|
-
],
|
|
146
|
-
}));
|
|
147
|
-
});
|
|
148
|
-
test('autoBuild() can be used to add automatic builds to the pipeline', () => {
|
|
149
|
-
// GIVEN
|
|
150
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
151
|
-
// WHEN
|
|
152
|
-
new delivlib.Pipeline(stack, 'Pipeline', {
|
|
153
|
-
repo: createTestRepo(stack),
|
|
154
|
-
pipelineName: 'HelloPipeline',
|
|
155
|
-
autoBuild: true,
|
|
156
|
-
});
|
|
157
|
-
(0, assert_1.expect)(stack).notTo((0, assert_1.haveResource)('AWS::Serverless::Application', {
|
|
158
|
-
Location: {
|
|
159
|
-
ApplicationId: 'arn:aws:serverlessrepo:us-east-1:277187709615:applications/github-codebuild-logs',
|
|
160
|
-
SemanticVersion: '1.4.0',
|
|
161
|
-
},
|
|
162
|
-
}));
|
|
163
|
-
});
|
|
164
|
-
test('autoBuild() can be configured to publish logs publically', () => {
|
|
165
|
-
// GIVEN
|
|
166
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
167
|
-
// WHEN
|
|
168
|
-
new delivlib.Pipeline(stack, 'Pipeline', {
|
|
169
|
-
repo: createTestRepo(stack),
|
|
170
|
-
pipelineName: 'HelloPipeline',
|
|
171
|
-
autoBuild: true,
|
|
172
|
-
autoBuildOptions: {
|
|
173
|
-
publicLogs: true,
|
|
174
|
-
},
|
|
175
|
-
});
|
|
176
|
-
(0, assert_1.expect)(stack).to((0, assert_1.haveResource)('AWS::Serverless::Application', {
|
|
177
|
-
Location: {
|
|
178
|
-
ApplicationId: 'arn:aws:serverlessrepo:us-east-1:277187709615:applications/github-codebuild-logs',
|
|
179
|
-
SemanticVersion: '1.4.0',
|
|
180
|
-
},
|
|
181
|
-
Parameters: {
|
|
182
|
-
CodeBuildProjectName: {
|
|
183
|
-
Ref: 'PipelineAutoBuildProjectB97B4446',
|
|
184
|
-
},
|
|
185
|
-
DeletePreviousComments: 'true',
|
|
186
|
-
CommentOnSuccess: 'true',
|
|
187
|
-
},
|
|
188
|
-
}));
|
|
189
|
-
});
|
|
190
|
-
test('autoBuild() can be configured with a different buildspec', () => {
|
|
191
|
-
// GIVEN
|
|
192
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
193
|
-
// WHEN
|
|
194
|
-
new delivlib.Pipeline(stack, 'Pipeline', {
|
|
195
|
-
repo: createTestRepo(stack),
|
|
196
|
-
pipelineName: 'HelloPipeline',
|
|
197
|
-
autoBuild: true,
|
|
198
|
-
autoBuildOptions: {
|
|
199
|
-
buildSpec: monocdk_1.aws_codebuild.BuildSpec.fromSourceFilename('different-buildspec.yaml'),
|
|
200
|
-
},
|
|
201
|
-
});
|
|
202
|
-
// THEN
|
|
203
|
-
(0, assert_1.expect)(stack).to((0, assert_1.haveResource)('AWS::CodeBuild::Project', {
|
|
204
|
-
Source: {
|
|
205
|
-
BuildSpec: 'different-buildspec.yaml',
|
|
206
|
-
Location: {
|
|
207
|
-
'Fn::GetAtt': [
|
|
208
|
-
'Repo02AC86CF',
|
|
209
|
-
'CloneUrlHttp',
|
|
210
|
-
],
|
|
211
|
-
},
|
|
212
|
-
Type: 'CODECOMMIT',
|
|
213
|
-
},
|
|
214
|
-
}));
|
|
215
|
-
});
|
|
216
|
-
test('CodeBuild Project name matches buildProjectName property', () => {
|
|
217
|
-
// GIVEN
|
|
218
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
219
|
-
// WHEN
|
|
220
|
-
new delivlib.Pipeline(stack, 'Pipeline', {
|
|
221
|
-
repo: createTestRepo(stack),
|
|
222
|
-
pipelineName: 'HelloPipeline',
|
|
223
|
-
buildProjectName: 'HelloBuild',
|
|
224
|
-
});
|
|
225
|
-
// THEN
|
|
226
|
-
(0, assert_1.expect)(stack).to((0, assert_1.haveResourceLike)('AWS::CodeBuild::Project', {
|
|
227
|
-
Name: 'HelloBuild',
|
|
228
|
-
}));
|
|
229
|
-
});
|
|
230
|
-
test('CodeBuild Project name is extended from pipelineName property', () => {
|
|
231
|
-
// GIVEN
|
|
232
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
233
|
-
// WHEN
|
|
234
|
-
new delivlib.Pipeline(stack, 'Pipeline', {
|
|
235
|
-
repo: createTestRepo(stack),
|
|
236
|
-
pipelineName: 'HelloPipeline',
|
|
237
|
-
});
|
|
238
|
-
// THEN
|
|
239
|
-
(0, assert_1.expect)(stack).to((0, assert_1.haveResourceLike)('AWS::CodeBuild::Project', {
|
|
240
|
-
Name: 'HelloPipeline-Build',
|
|
241
|
-
}));
|
|
242
|
-
});
|
|
243
|
-
test('CodeBuild Project name is left undefined when neither buildProjectName nor pipelineName are specified', () => {
|
|
244
|
-
// GIVEN
|
|
245
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
246
|
-
// WHEN
|
|
247
|
-
new delivlib.Pipeline(stack, 'Pipeline', {
|
|
248
|
-
repo: createTestRepo(stack),
|
|
249
|
-
});
|
|
250
|
-
// THEN
|
|
251
|
-
(0, assert_1.expect)(stack).to((0, assert_1.haveResourceLike)('AWS::CodeBuild::Project', {
|
|
252
|
-
Name: assert_1.ABSENT,
|
|
253
|
-
}));
|
|
254
|
-
});
|
|
255
|
-
test('metricFailures', () => {
|
|
256
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
257
|
-
const pipeline = new delivlib.Pipeline(stack, 'Pipeline', {
|
|
258
|
-
repo: createTestRepo(stack),
|
|
259
|
-
pipelineName: 'HelloPipeline',
|
|
260
|
-
});
|
|
261
|
-
expect(stack.resolve(pipeline.metricFailures({}))).toEqual({
|
|
262
|
-
dimensions: { Pipeline: { Ref: 'PipelineBuildPipeline04C6628A' } },
|
|
263
|
-
namespace: 'CDK/Delivlib',
|
|
264
|
-
metricName: 'Failures',
|
|
265
|
-
period: monocdk_1.Duration.minutes(5),
|
|
266
|
-
statistic: 'Sum',
|
|
267
|
-
});
|
|
268
|
-
});
|
|
269
|
-
test('metricActionFailures', () => {
|
|
270
|
-
const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
|
|
271
|
-
const pipeline = new delivlib.Pipeline(stack, 'Pipeline', {
|
|
272
|
-
repo: createTestRepo(stack),
|
|
273
|
-
pipelineName: 'HelloPipeline',
|
|
274
|
-
});
|
|
275
|
-
const project = new monocdk_1.aws_codebuild.Project(stack, 'publish', {
|
|
276
|
-
buildSpec: monocdk_1.aws_codebuild.BuildSpec.fromObject({ version: '0.2' }),
|
|
277
|
-
});
|
|
278
|
-
const scriptDirectory = __dirname;
|
|
279
|
-
const entrypoint = 'run-test.sh';
|
|
280
|
-
pipeline.addShellable('PreBuild', 'FirstStep', { scriptDirectory, entrypoint });
|
|
281
|
-
pipeline.addShellable('PreBuild', 'SecondStep', { scriptDirectory, entrypoint });
|
|
282
|
-
pipeline.addPublish(new TestPublishable(stack, 'Publish1', { project }));
|
|
283
|
-
pipeline.addPublish(new TestPublishable(stack, 'Publish2', { project }));
|
|
284
|
-
pipeline.addTest('Test1', { scriptDirectory, entrypoint, platform: delivlib.ShellPlatform.LinuxUbuntu });
|
|
285
|
-
pipeline.addTest('Test2', { scriptDirectory, entrypoint, platform: delivlib.ShellPlatform.LinuxUbuntu });
|
|
286
|
-
const expectedMetricNames = [
|
|
287
|
-
'Pull',
|
|
288
|
-
'Build',
|
|
289
|
-
'ActionFirstStep',
|
|
290
|
-
'ActionSecondStep',
|
|
291
|
-
'Publish1Publish',
|
|
292
|
-
'Publish2Publish',
|
|
293
|
-
'TestTest1',
|
|
294
|
-
'TestTest2',
|
|
295
|
-
];
|
|
296
|
-
const expectedMetrics = expectedMetricNames.map(name => {
|
|
297
|
-
return {
|
|
298
|
-
dimensions: { Pipeline: { Ref: 'PipelineBuildPipeline04C6628A' }, Action: name },
|
|
299
|
-
namespace: 'CDK/Delivlib',
|
|
300
|
-
metricName: 'Failures',
|
|
301
|
-
period: monocdk_1.Duration.minutes(5),
|
|
302
|
-
statistic: 'Sum',
|
|
303
|
-
};
|
|
304
|
-
});
|
|
305
|
-
expect(stack.resolve(pipeline.metricActionFailures({}))).toEqual(expectedMetrics);
|
|
306
|
-
});
|
|
307
|
-
function createTestPipelineForConcurrencyTests(stack, props) {
|
|
308
|
-
const pipeline = new delivlib.Pipeline(stack, 'Pipeline', {
|
|
309
|
-
repo: createTestRepo(stack),
|
|
310
|
-
...props,
|
|
311
|
-
});
|
|
312
|
-
const project = new monocdk_1.aws_codebuild.Project(stack, 'publish', {
|
|
313
|
-
buildSpec: monocdk_1.aws_codebuild.BuildSpec.fromObject({ version: '0.2' }),
|
|
314
|
-
});
|
|
315
|
-
const scriptDirectory = path.join(__dirname, 'delivlib-tests', 'linux');
|
|
316
|
-
const entrypoint = 'test.sh';
|
|
317
|
-
pipeline.addTest('test1', { scriptDirectory, entrypoint, platform: delivlib.ShellPlatform.LinuxUbuntu });
|
|
318
|
-
pipeline.addTest('test2', { scriptDirectory, entrypoint, platform: delivlib.ShellPlatform.LinuxUbuntu });
|
|
319
|
-
pipeline.addTest('test3', { scriptDirectory, entrypoint, platform: delivlib.ShellPlatform.LinuxUbuntu });
|
|
320
|
-
pipeline.addTest('test4', { scriptDirectory, entrypoint, platform: delivlib.ShellPlatform.LinuxUbuntu });
|
|
321
|
-
pipeline.addTest('test5', { scriptDirectory, entrypoint, platform: delivlib.ShellPlatform.LinuxUbuntu });
|
|
322
|
-
pipeline.addPublish(new TestPublishable(stack, 'pub1', { project }));
|
|
323
|
-
pipeline.addPublish(new TestPublishable(stack, 'pub2', { project }));
|
|
324
|
-
pipeline.addPublish(new TestPublishable(stack, 'pub3', { project }));
|
|
325
|
-
pipeline.addPublish(new TestPublishable(stack, 'pub4', { project }));
|
|
326
|
-
pipeline.addPublish(new TestPublishable(stack, 'pub5', { project }));
|
|
327
|
-
pipeline.addPublish(new TestPublishable(stack, 'pub6', { project }));
|
|
328
|
-
const template = assert_1.SynthUtils.synthesize(stack).template;
|
|
329
|
-
return template.Resources.PipelineBuildPipeline04C6628A.Properties.Stages;
|
|
330
|
-
}
|
|
331
|
-
function createTestRepo(stack) {
|
|
332
|
-
return new delivlib.CodeCommitRepo(new monocdk_1.aws_codecommit.Repository(stack, 'Repo', { repositoryName: 'test' }));
|
|
333
|
-
}
|
|
334
|
-
class TestPublishable extends monocdk_1.Construct {
|
|
335
|
-
constructor(scope, id, props) {
|
|
336
|
-
super(scope, id);
|
|
337
|
-
this.project = props.project;
|
|
338
|
-
}
|
|
339
|
-
addToPipeline(stage, id, options) {
|
|
340
|
-
stage.addAction(new monocdk_1.aws_codepipeline_actions.CodeBuildAction({
|
|
341
|
-
actionName: id,
|
|
342
|
-
input: options.inputArtifact || new monocdk_1.aws_codepipeline.Artifact(),
|
|
343
|
-
project: this.project,
|
|
344
|
-
runOrder: options.runOrder,
|
|
345
|
-
}));
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
class Pub extends monocdk_1.Construct {
|
|
349
|
-
constructor(scope, id) {
|
|
350
|
-
super(scope, id);
|
|
351
|
-
this.project = new monocdk_1.aws_codebuild.PipelineProject(this, 'Project');
|
|
352
|
-
}
|
|
353
|
-
addToPipeline(stage, id, options) {
|
|
354
|
-
stage.addAction(new monocdk_1.aws_codepipeline_actions.CodeBuildAction({
|
|
355
|
-
actionName: id,
|
|
356
|
-
input: options.inputArtifact || new monocdk_1.aws_codepipeline.Artifact(),
|
|
357
|
-
project: this.project,
|
|
358
|
-
runOrder: options.runOrder,
|
|
359
|
-
}));
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBpcGVsaW5lLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBQzdCLHVEQUFzSDtBQUN0SCxxQ0FNaUI7QUFDakIsb0RBQXNDO0FBQ3RDLHlDQUFtRDtBQUVuRCxJQUFJLENBQUMsa0VBQWtFLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDbEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFLLENBQUMsSUFBSSxhQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVoRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRTtRQUN2QyxJQUFJLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUMzQixZQUFZLEVBQUUsZUFBZTtLQUM5QixDQUFDLENBQUM7SUFFSCxJQUFBLGVBQVUsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSxxQkFBWSxFQUFDLDZCQUE2QixFQUFFO1FBQy9ELElBQUksRUFBRSxlQUFlO0tBQ3RCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFLLENBQUMsSUFBSSxhQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVoRCxNQUFNLE1BQU0sR0FBRyxxQ0FBcUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1RCwrRUFBK0U7SUFDL0UsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM5QixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUM1QixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUks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QVMsQ0FBQyxRQUFRLEVBQUU7WUFDeEQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtTQUMzQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBleHBlY3QgYXMgY2RrX2V4cGVjdCwgaGF2ZVJlc291cmNlLCBoYXZlUmVzb3VyY2VMaWtlLCBTeW50aFV0aWxzLCBBQlNFTlQgfSBmcm9tICdAbW9ub2Nkay1leHBlcmltZW50L2Fzc2VydCc7XG5pbXBvcnQge1xuICBBcHAsIENvbnN0cnVjdCwgRHVyYXRpb24sIFN0YWNrLFxuICBhd3NfY29kZWJ1aWxkIGFzIGNvZGVidWlsZCxcbiAgYXdzX2NvZGVjb21taXQgYXMgY29kZWNvbW1pdCxcbiAgYXdzX2NvZGVwaXBlbGluZSBhcyBjcGlwZWxpbmUsXG4gIGF3c19jb2RlcGlwZWxpbmVfYWN0aW9ucyBhcyBjcGlwZWxpbmVfYWN0aW9ucyxcbn0gZnJvbSAnbW9ub2Nkayc7XG5pbXBvcnQgKiBhcyBkZWxpdmxpYiBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IHsgZGV0ZXJtaW5lUnVuT3JkZXIgfSBmcm9tICcuLi8uLi9saWIvdXRpbCc7XG5cbnRlc3QoJ3BpcGVsaW5lTmFtZSBjYW4gYmUgdXNlZCB0byBzZXQgYSBwaHlzaWNhbCBuYW1lIGZvciB0aGUgcGlwZWxpbmUnLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ1Rlc3RTdGFjaycpO1xuXG4gIG5ldyBkZWxpdmxpYi5QaXBlbGluZShzdGFjaywgJ1BpcGVsaW5lJywge1xuICAgIHJlcG86IGNyZWF0ZVRlc3RSZXBvKHN0YWNrKSxcbiAgICBwaXBlbGluZU5hbWU6ICdIZWxsb1BpcGVsaW5lJyxcbiAgfSk7XG5cbiAgY2RrX2V4cGVjdChzdGFjaykudG8oaGF2ZVJlc291cmNlKCdBV1M6OkNvZGVQaXBlbGluZTo6UGlwZWxpbmUnLCB7XG4gICAgTmFtZTogJ0hlbGxvUGlwZWxpbmUnLFxuICB9KSk7XG59KTtcblxudGVzdCgnY29uY3VycmVuY3k6IHVubGltaXRlZCBieSBkZWZhdWx0JywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdUZXN0U3RhY2snKTtcblxuICBjb25zdCBzdGFnZXMgPSBjcmVhdGVUZXN0UGlwZWxpbmVGb3JDb25jdXJyZW5jeVRlc3RzKHN0YWNrKTtcblxuICAvLyBkZWZhdWx0IGlzIFJ1bk9yZGVyID0gMSBmb3IgYWxsIGFjdGlvbnMgd2hpY2ggbWVhbnMgdGhleSBhbGwgcnVuIGluIHBhcmFsbGVsXG4gIGZvciAoY29uc3Qgc3RhZ2Ugb2Ygc3RhZ2VzKSB7XG4gICAgY29uc3QgYWN0aW9ucyA9IHN0YWdlLkFjdGlvbnM7XG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgZXhwZWN0KGFjdGlvbi5SdW5PcmRlcikudG9CZSgxKTtcbiAgICB9XG4gIH1cbn0pO1xuXG50ZXN0KCdjb25jdXJyZW5jeSA9IDE6IG1lYW5zIHRoYXQgYWN0aW9ucyB3aWxsIHJ1biBzZXF1ZW50aWFsbHknLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ1Rlc3RTdGFjaycpO1xuICBjb25zdCBzdGFnZXMgPSBjcmVhdGVUZXN0UGlwZWxpbmVGb3JDb25jdXJyZW5jeVRlc3RzKHN0YWNrLCB7IGNvbmN1cnJlbmN5OiAxIH0gYXMgYW55KTtcblxuICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcykge1xuICAgIGNvbnN0IGFjdGlvbnMgPSBzdGFnZS5BY3Rpb25zO1xuICAgIGxldCBleHBlY3RlZCA9IDE7XG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgZXhwZWN0KGFjdGlvbi5SdW5PcmRlcikudG9CZShleHBlY3RlZCk7XG4gICAgICBleHBlY3RlZCsrO1xuICAgIH1cbiAgfVxufSk7XG5cbnRlc3QoJ2RldGVybWluZVJ1bk9yZGVyOiBjcmVhdGVzIGdyb3VwcyBvZiB1cCB0byBcImNvbmN1cnJlbmN5XCIgYWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgdGVzdENhc2UoeyBhY3Rpb25Db3VudDogMSwgY29uY3VycmVuY3k6IDEgfSk7XG4gIHRlc3RDYXNlKHsgYWN0aW9uQ291bnQ6IDEwLCBjb25jdXJyZW5jeTogMSB9KTtcbiAgdGVzdENhc2UoeyBhY3Rpb25Db3VudDogNTYsIGNvbmN1cnJlbmN5OiA0IH0pO1xuICB0ZXN0Q2FzZSh7IGFjdGlvbkNvdW50OiAzLCBjb25jdXJyZW5jeTogMiB9KTtcblxuICBmdW5jdGlvbiB0ZXN0Q2FzZSh7IGFjdGlvbkNvdW50LCBjb25jdXJyZW5jeSB9OiB7IGFjdGlvbkNvdW50OiBudW1iZXI7IGNvbmN1cnJlbmN5OiBudW1iZXIgfSkge1xuICAgIGNvbnN0IGFjdGlvbnNQZXJSdW5PcmRlcjogeyBbcnVuT3JkZXI6IG51bWJlcl06IG51bWJlciB9ID0geyB9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aW9uQ291bnQ7ICsraSkge1xuICAgICAgY29uc3QgcnVuT3JkZXIgPSBkZXRlcm1pbmVSdW5PcmRlcihpLCBjb25jdXJyZW5jeSkhO1xuICAgICAgaWYgKCFhY3Rpb25zUGVyUnVuT3JkZXJbcnVuT3JkZXJdKSB7XG4gICAgICAgIGFjdGlvbnNQZXJSdW5PcmRlcltydW5PcmRlcl0gPSAwO1xuICAgICAgfVxuICAgICAgYWN0aW9uc1BlclJ1bk9yZGVyW3J1bk9yZGVyXSsrO1xuICAgIH1cblxuICAgIC8vIGFzc2VydCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gKmNvbmN1cnJlbmN5KiBhY3Rpb25zIGluIGVhY2ggcnVuT3JkZXJcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGZvciAoY29uc3QgWywgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKGFjdGlvbnNQZXJSdW5PcmRlcikpIHtcbiAgICAgIGV4cGVjdChjb3VudCkudG9CZUxlc3NUaGFuT3JFcXVhbChjb25jdXJyZW5jeSk7XG4gICAgICB0b3RhbCArPSBjb3VudDtcbiAgICB9XG5cbiAgICBleHBlY3QodG90YWwpLnRvQmUoYWN0aW9uQ291bnQpOyAvLyBzYW5pdHlcbiAgfVxufSk7XG5cbnRlc3QoJ2NhbiBhZGQgYXJiaXRyYXJ5IHNoZWxsYWJsZXMgd2l0aCBkaWZmZXJlbnQgYXJ0aWZhY3RzJywgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdUZXN0U3RhY2snKTtcblxuICBjb25zdCBwaXBlbGluZSA9IG5ldyBkZWxpdmxpYi5QaXBlbGluZShzdGFjaywgJ1BpcGVsaW5lJywge1xuICAgIHJlcG86IGNyZWF0ZVRlc3RSZXBvKHN0YWNrKSxcbiAgICBwaXBlbGluZU5hbWU6ICdIZWxsb1BpcGVsaW5lJyxcbiAgfSk7XG5cbiAgY29uc3QgYWN0aW9uID0gcGlwZWxpbmUuYWRkU2hlbGxhYmxlKCdUZXN0JywgJ1NlY29uZFN0ZXAnLCB7XG4gICAgc2NyaXB0RGlyZWN0b3J5OiBfX2Rpcm5hbWUsXG4gICAgZW50cnlwb2ludDogJ3J1bi10ZXN0LnNoJyxcbiAgfSkuYWN0aW9uO1xuXG4gIHBpcGVsaW5lLmFkZFB1Ymxpc2gobmV3IFB1YihzdGFjaywgJ1B1YicpLCB7IGlucHV0QXJ0aWZhY3Q6IGFjdGlvbi5hY3Rpb25Qcm9wZXJ0aWVzLm91dHB1dHMhWzBdIH0pO1xuXG4gIGNka19leHBlY3Qoc3RhY2spLnRvKGhhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6Q29kZVBpcGVsaW5lOjpQaXBlbGluZScsIHtcbiAgICBTdGFnZXM6IFtcbiAgICAgIHtcbiAgICAgICAgTmFtZTogJ1NvdXJjZScsXG4gICAgICAgIEFjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb25UeXBlSWQ6IHsgQ2F0ZWdvcnk6ICdTb3VyY2UnLCBPd25lcjogJ0FXUycsIFByb3ZpZGVyOiAnQ29kZUNvbW1pdCcgfSxcbiAgICAgICAgICAgIE5hbWU6ICdQdWxsJyxcbiAgICAgICAgICAgIE91dHB1dEFydGlmYWN0czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTmFtZTogJ1NvdXJjZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBOYW1lOiAnQnVpbGQnLFxuICAgICAgICBBY3Rpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ0J1aWxkJyxcbiAgICAgICAgICAgIEFjdGlvblR5cGVJZDogeyBDYXRlZ29yeTogJ0J1aWxkJywgT3duZXI6ICdBV1MnLCBQcm92aWRlcjogJ0NvZGVCdWlsZCcgfSxcbiAgICAgICAgICAgIElucHV0QXJ0aWZhY3RzOiBbeyBOYW1lOiAnU291cmNlJyB9XSxcbiAgICAgICAgICAgIE91dHB1dEFydGlmYWN0czogW3sgTmFtZTogJ0FydGlmYWN0X0J1aWxkX0J1aWxkJyB9XSxcbiAgICAgICAgICAgIFJ1bk9yZGVyOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBOYW1lOiAnVGVzdCcsXG4gICAgICAgIEFjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb25UeXBlSWQ6IHsgQ2F0ZWdvcnk6ICdCdWlsZCcsIE93bmVyOiAnQVdTJywgUHJvdmlkZXI6ICdDb2RlQnVpbGQnIH0sXG4gICAgICAgICAgICBJbnB1dEFydGlmYWN0czogW3sgTmFtZTogJ0FydGlmYWN0X0J1aWxkX0J1aWxkJyB9XSxcbiAgICAgICAgICAgIE5hbWU6ICdBY3Rpb25TZWNvbmRTdGVwJyxcbiAgICAgICAgICAgIE91dHB1dEFydGlmYWN0czogW3sgTmFtZTogJ0FydGlmYWN0X1Rlc3RTdGFja1BpcGVsaW5lU2Vjb25kU3RlcDkxNzI2QzExJyB9XSxcbiAgICAgICAgICAgIFJ1bk9yZGVyOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBOYW1lOiAnUHVibGlzaCcsXG4gICAgICAgIEFjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb25UeXBlSWQ6IHsgQ2F0ZWdvcnk6ICdCdWlsZCcsIE93bmVyOiAnQVdTJywgUHJvdmlkZXI6ICdDb2RlQnVpbGQnIH0sXG4gICAgICAgICAgICBJbnB1dEFydGlmYWN0czogW3sgTmFtZTogJ0FydGlmYWN0X1Rlc3RTdGFja1BpcGVsaW5lU2Vjb25kU3RlcDkxNzI2QzExJyB9XSxcbiAgICAgICAgICAgIE5hbWU6ICdQdWJQdWJsaXNoJyxcbiAgICAgICAgICAgIFJ1bk9yZGVyOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pKTtcbn0pO1xuXG50ZXN0KCdhdXRvQnVpbGQoKSBjYW4gYmUgdXNlZCB0byBhZGQgYXV0b21hdGljIGJ1aWxkcyB0byB0aGUgcGlwZWxpbmUnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ1Rlc3RTdGFjaycpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IGRlbGl2bGliLlBpcGVsaW5lKHN0YWNrLCAnUGlwZWxpbmUnLCB7XG4gICAgcmVwbzogY3JlYXRlVGVzdFJlcG8oc3RhY2spLFxuICAgIHBpcGVsaW5lTmFtZTogJ0hlbGxvUGlwZWxpbmUnLFxuICAgIGF1dG9CdWlsZDogdHJ1ZSxcbiAgfSk7XG5cbiAgY2RrX2V4cGVjdChzdGFjaykubm90VG8oaGF2ZVJlc291cmNlKCdBV1M6OlNlcnZlcmxlc3M6OkFwcGxpY2F0aW9uJywge1xuICAgIExvY2F0aW9uOiB7XG4gICAgICBBcHBsaWNhdGlvbklkOiAnYXJuOmF3czpzZXJ2ZXJsZXNzcmVwbzp1cy1lYXN0LTE6Mjc3MTg3NzA5NjE1OmFwcGxpY2F0aW9ucy9naXRodWItY29kZWJ1aWxkLWxvZ3MnLFxuICAgICAgU2VtYW50aWNWZXJzaW9uOiAnMS40LjAnLFxuICAgIH0sXG4gIH0pKTtcbn0pO1xuXG50ZXN0KCdhdXRvQnVpbGQoKSBjYW4gYmUgY29uZmlndXJlZCB0byBwdWJsaXNoIGxvZ3MgcHVibGljYWxseScsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnVGVzdFN0YWNrJyk7XG5cbiAgLy8gV0hFTlxuICBuZXcgZGVsaXZsaWIuUGlwZWxpbmUoc3RhY2ssICdQaXBlbGluZScsIHtcbiAgICByZXBvOiBjcmVhdGVUZXN0UmVwbyhzdGFjayksXG4gICAgcGlwZWxpbmVOYW1lOiAnSGVsbG9QaXBlbGluZScsXG4gICAgYXV0b0J1aWxkOiB0cnVlLFxuICAgIGF1dG9CdWlsZE9wdGlvbnM6IHtcbiAgICAgIHB1YmxpY0xvZ3M6IHRydWUsXG4gICAgfSxcbiAgfSk7XG5cbiAgY2RrX2V4cGVjdChzdGFjaykudG8oaGF2ZVJlc291cmNlKCdBV1M6OlNlcnZlcmxlc3M6OkFwcGxpY2F0aW9uJywge1xuICAgIExvY2F0aW9uOiB7XG4gICAgICBBcHBsaWNhdGlvbklkOiAnYXJuOmF3czpzZXJ2ZXJsZXNzcmVwbzp1cy1lYXN0LTE6Mjc3MTg3NzA5NjE1OmFwcGxpY2F0aW9ucy9naXRodWItY29kZWJ1aWxkLWxvZ3MnLFxuICAgICAgU2VtYW50aWNWZXJzaW9uOiAnMS40LjAnLFxuICAgIH0sXG4gICAgUGFyYW1ldGVyczoge1xuICAgICAgQ29kZUJ1aWxkUHJvamVjdE5hbWU6IHtcbiAgICAgICAgUmVmOiAnUGlwZWxpbmVBdXRvQnVpbGRQcm9qZWN0Qjk3QjQ0NDYnLFxuICAgICAgfSxcbiAgICAgIERlbGV0ZVByZXZpb3VzQ29tbWVudHM6ICd0cnVlJyxcbiAgICAgIENvbW1lbnRPblN1Y2Nlc3M6ICd0cnVlJyxcbiAgICB9LFxuICB9KSk7XG59KTtcblxudGVzdCgnYXV0b0J1aWxkKCkgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIGRpZmZlcmVudCBidWlsZHNwZWMnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ1Rlc3RTdGFjaycpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IGRlbGl2bGliLlBpcGVsaW5lKHN0YWNrLCAnUGlwZWxpbmUnLCB7XG4gICAgcmVwbzogY3JlYXRlVGVzdFJlcG8oc3RhY2spLFxuICAgIHBpcGVsaW5lTmFtZTogJ0hlbGxvUGlwZWxpbmUnLFxuICAgIGF1dG9CdWlsZDogdHJ1ZSxcbiAgICBhdXRvQnVpbGRPcHRpb25zOiB7XG4gICAgICBidWlsZFNwZWM6IGNvZGVidWlsZC5CdWlsZFNwZWMuZnJvbVNvdXJjZUZpbGVuYW1lKCdkaWZmZXJlbnQtYnVpbGRzcGVjLnlhbWwnKSxcbiAgICB9LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIGNka19leHBlY3Qoc3RhY2spLnRvKGhhdmVSZXNvdXJjZSgnQVdTOjpDb2RlQnVpbGQ6OlByb2plY3QnLCB7XG4gICAgU291cmNlOiB7XG4gICAgICBCdWlsZFNwZWM6ICdkaWZmZXJlbnQtYnVpbGRzcGVjLnlhbWwnLFxuICAgICAgTG9jYXRpb246IHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbXG4gICAgICAgICAgJ1JlcG8wMkFDODZDRicsXG4gICAgICAgICAgJ0Nsb25lVXJsSHR0cCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgVHlwZTogJ0NPREVDT01NSVQnLFxuICAgIH0sXG4gIH0pKTtcbn0pO1xuXG50ZXN0KCdDb2RlQnVpbGQgUHJvamVjdCBuYW1lIG1hdGNoZXMgYnVpbGRQcm9qZWN0TmFtZSBwcm9wZXJ0eScsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnVGVzdFN0YWNrJyk7XG5cbiAgLy8gV0hFTlxuICBuZXcgZGVsaXZsaWIuUGlwZWxpbmUoc3RhY2ssICdQaXBlbGluZScsIHtcbiAgICByZXBvOiBjcmVhdGVUZXN0UmVwbyhzdGFjayksXG4gICAgcGlwZWxpbmVOYW1lOiAnSGVsbG9QaXBlbGluZScsXG4gICAgYnVpbGRQcm9qZWN0TmFtZTogJ0hlbGxvQnVpbGQnLFxuICB9KTtcblxuICAvLyBUSEVOXG4gIGNka19leHBlY3Qoc3RhY2spLnRvKGhhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6Q29kZUJ1aWxkOjpQcm9qZWN0Jywge1xuICAgIE5hbWU6ICdIZWxsb0J1aWxkJyxcbiAgfSkpO1xufSk7XG5cbnRlc3QoJ0NvZGVCdWlsZCBQcm9qZWN0IG5hbWUgaXMgZXh0ZW5kZWQgZnJvbSBwaXBlbGluZU5hbWUgcHJvcGVydHknLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ1Rlc3RTdGFjaycpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IGRlbGl2bGliLlBpcGVsaW5lKHN0YWNrLCAnUGlwZWxpbmUnLCB7XG4gICAgcmVwbzogY3JlYXRlVGVzdFJlcG8oc3RhY2spLFxuICAgIHBpcGVsaW5lTmFtZTogJ0hlbGxvUGlwZWxpbmUnLFxuICB9KTtcblxuICAvLyBUSEVOXG4gIGNka19leHBlY3Qoc3RhY2spLnRvKGhhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6Q29kZUJ1aWxkOjpQcm9qZWN0Jywge1xuICAgIE5hbWU6ICdIZWxsb1BpcGVsaW5lLUJ1aWxkJyxcbiAgfSkpO1xufSk7XG5cbnRlc3QoJ0NvZGVCdWlsZCBQcm9qZWN0IG5hbWUgaXMgbGVmdCB1bmRlZmluZWQgd2hlbiBuZWl0aGVyIGJ1aWxkUHJvamVjdE5hbWUgbm9yIHBpcGVsaW5lTmFtZSBhcmUgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdUZXN0U3RhY2snKTtcblxuICAvLyBXSEVOXG4gIG5ldyBkZWxpdmxpYi5QaXBlbGluZShzdGFjaywgJ1BpcGVsaW5lJywge1xuICAgIHJlcG86IGNyZWF0ZVRlc3RSZXBvKHN0YWNrKSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBjZGtfZXhwZWN0KHN0YWNrKS50byhoYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkNvZGVCdWlsZDo6UHJvamVjdCcsIHtcbiAgICBOYW1lOiBBQlNFTlQsXG4gIH0pKTtcbn0pO1xuXG50ZXN0KCdtZXRyaWNGYWlsdXJlcycsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnVGVzdFN0YWNrJyk7XG4gIGNvbnN0IHBpcGVsaW5lID0gbmV3IGRlbGl2bGliLlBpcGVsaW5lKHN0YWNrLCAnUGlwZWxpbmUnLCB7XG4gICAgcmVwbzogY3JlYXRlVGVzdFJlcG8oc3RhY2spLFxuICAgIHBpcGVsaW5lTmFtZTogJ0hlbGxvUGlwZWxpbmUnLFxuICB9KTtcblxuICBleHBlY3Qoc3RhY2sucmVzb2x2ZShwaXBlbGluZS5tZXRyaWNGYWlsdXJlcyh7fSkpKS50b0VxdWFsKHtcbiAgICBkaW1lbnNpb25zOiB7IFBpcGVsaW5lOiB7IFJlZjogJ1BpcGVsaW5lQnVpbGRQaXBlbGluZTA0QzY2MjhBJyB9IH0sXG4gICAgbmFtZXNwYWNlOiAnQ0RLL0RlbGl2bGliJyxcbiAgICBtZXRyaWNOYW1lOiAnRmFpbHVyZXMnLFxuICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdtZXRyaWNBY3Rpb25GYWlsdXJlcycsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnVGVzdFN0YWNrJyk7XG4gIGNvbnN0IHBpcGVsaW5lID0gbmV3IGRlbGl2bGliLlBpcGVsaW5lKHN0YWNrLCAnUGlwZWxpbmUnLCB7XG4gICAgcmVwbzogY3JlYXRlVGVzdFJlcG8oc3RhY2spLFxuICAgIHBpcGVsaW5lTmFtZTogJ0hlbGxvUGlwZWxpbmUnLFxuICB9KTtcbiAgY29uc3QgcHJvamVjdCA9IG5ldyBjb2RlYnVpbGQuUHJvamVjdChzdGFjaywgJ3B1Ymxpc2gnLCB7XG4gICAgYnVpbGRTcGVjOiBjb2RlYnVpbGQuQnVpbGRTcGVjLmZyb21PYmplY3QoeyB2ZXJzaW9uOiAnMC4yJyB9KSxcbiAgfSk7XG4gIGNvbnN0IHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZTtcbiAgY29uc3QgZW50cnlwb2ludCA9ICdydW4tdGVzdC5zaCc7XG5cbiAgcGlwZWxpbmUuYWRkU2hlbGxhYmxlKCdQcmVCdWlsZCcsICdGaXJzdFN0ZXAnLCB7IHNjcmlwdERpcmVjdG9yeSwgZW50cnlwb2ludCB9KTtcbiAgcGlwZWxpbmUuYWRkU2hlbGxhYmxlKCdQcmVCdWlsZCcsICdTZWNvbmRTdGVwJywgeyBzY3JpcHREaXJlY3RvcnksIGVudHJ5cG9pbnQgfSk7XG4gIHBpcGVsaW5lLmFkZFB1Ymxpc2gobmV3IFRlc3RQdWJsaXNoYWJsZShzdGFjaywgJ1B1Ymxpc2gxJywgeyBwcm9qZWN0IH0pKTtcbiAgcGlwZWxpbmUuYWRkUHVibGlzaChuZXcgVGVzdFB1Ymxpc2hhYmxlKHN0YWNrLCAnUHVibGlzaDInLCB7IHByb2plY3QgfSkpO1xuICBwaXBlbGluZS5hZGRUZXN0KCdUZXN0MScsIHsgc2NyaXB0RGlyZWN0b3J5LCBlbnRyeXBvaW50LCBwbGF0Zm9ybTogZGVsaXZsaWIuU2hlbGxQbGF0Zm9ybS5MaW51eFVidW50dSB9KTtcbiAgcGlwZWxpbmUuYWRkVGVzdCgnVGVzdDInLCB7IHNjcmlwdERpcmVjdG9yeSwgZW50cnlwb2ludCwgcGxhdGZvcm06IGRlbGl2bGliLlNoZWxsUGxhdGZvcm0uTGludXhVYnVudHUgfSk7XG5cbiAgY29uc3QgZXhwZWN0ZWRNZXRyaWNOYW1lcyA9IFtcbiAgICAnUHVsbCcsXG4gICAgJ0J1aWxkJyxcbiAgICAnQWN0aW9uRmlyc3RTdGVwJyxcbiAgICAnQWN0aW9uU2Vjb25kU3RlcCcsXG4gICAgJ1B1Ymxpc2gxUHVibGlzaCcsXG4gICAgJ1B1Ymxpc2gyUHVibGlzaCcsXG4gICAgJ1Rlc3RUZXN0MScsXG4gICAgJ1Rlc3RUZXN0MicsXG4gIF07XG4gIGNvbnN0IGV4cGVjdGVkTWV0cmljcyA9IGV4cGVjdGVkTWV0cmljTmFtZXMubWFwKG5hbWUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBkaW1lbnNpb25zOiB7IFBpcGVsaW5lOiB7IFJlZjogJ1BpcGVsaW5lQnVpbGRQaXBlbGluZTA0QzY2MjhBJyB9LCBBY3Rpb246IG5hbWUgfSxcbiAgICAgIG5hbWVzcGFjZTogJ0NESy9EZWxpdmxpYicsXG4gICAgICBtZXRyaWNOYW1lOiAnRmFpbHVyZXMnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICB9O1xuICB9KTtcblxuICBleHBlY3Qoc3RhY2sucmVzb2x2ZShwaXBlbGluZS5tZXRyaWNBY3Rpb25GYWlsdXJlcyh7fSkpKS50b0VxdWFsKGV4cGVjdGVkTWV0cmljcyk7XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlVGVzdFBpcGVsaW5lRm9yQ29uY3VycmVuY3lUZXN0cyhzdGFjazogU3RhY2ssIHByb3BzPzogZGVsaXZsaWIuUGlwZWxpbmVQcm9wcykge1xuICBjb25zdCBwaXBlbGluZSA9IG5ldyBkZWxpdmxpYi5QaXBlbGluZShzdGFjaywgJ1BpcGVsaW5lJywge1xuICAgIHJlcG86IGNyZWF0ZVRlc3RSZXBvKHN0YWNrKSxcbiAgICAuLi5wcm9wcyxcbiAgfSk7XG5cbiAgY29uc3QgcHJvamVjdCA9IG5ldyBjb2RlYnVpbGQuUHJvamVjdChzdGFjaywgJ3B1Ymxpc2gnLCB7XG4gICAgYnVpbGRTcGVjOiBjb2RlYnVpbGQuQnVpbGRTcGVjLmZyb21PYmplY3QoeyB2ZXJzaW9uOiAnMC4yJyB9KSxcbiAgfSk7XG5cbiAgY29uc3Qgc2NyaXB0RGlyZWN0b3J5ID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2RlbGl2bGliLXRlc3RzJywgJ2xpbnV4Jyk7XG4gIGNvbnN0IGVudHJ5cG9pbnQgPSAndGVzdC5zaCc7XG4gIHBpcGVsaW5lLmFkZFRlc3QoJ3Rlc3QxJywgeyBzY3JpcHREaXJlY3RvcnksIGVudHJ5cG9pbnQsIHBsYXRmb3JtOiBkZWxpdmxpYi5TaGVsbFBsYXRmb3JtLkxpbnV4VWJ1bnR1IH0pO1xuICBwaXBlbGluZS5hZGRUZXN0KCd0ZXN0MicsIHsgc2NyaXB0RGlyZWN0b3J5LCBlbnRyeXBvaW50LCBwbGF0Zm9ybTogZGVsaXZsaWIuU2hlbGxQbGF0Zm9ybS5MaW51eFVidW50dSB9KTtcbiAgcGlwZWxpbmUuYWRkVGVzdCgndGVzdDMnLCB7IHNjcmlwdERpcmVjdG9yeSwgZW50cnlwb2ludCwgcGxhdGZvcm06IGRlbGl2bGliLlNoZWxsUGxhdGZvcm0uTGludXhVYnVudHUgfSk7XG4gIHBpcGVsaW5lLmFkZFRlc3QoJ3Rlc3Q0JywgeyBzY3JpcHREaXJlY3RvcnksIGVudHJ5cG9pbnQsIHBsYXRmb3JtOiBkZWxpdmxpYi5TaGVsbFBsYXRmb3JtLkxpbnV4VWJ1bnR1IH0pO1xuICBwaXBlbGluZS5hZGRUZXN0KCd0ZXN0NScsIHsgc2NyaXB0RGlyZWN0b3J5LCBlbnRyeXBvaW50LCBwbGF0Zm9ybTogZGVsaXZsaWIuU2hlbGxQbGF0Zm9ybS5MaW51eFVidW50dSB9KTtcbiAgcGlwZWxpbmUuYWRkUHVibGlzaChuZXcgVGVzdFB1Ymxpc2hhYmxlKHN0YWNrLCAncHViMScsIHsgcHJvamVjdCB9KSk7XG4gIHBpcGVsaW5lLmFkZFB1Ymxpc2gobmV3IFRlc3RQdWJsaXNoYWJsZShzdGFjaywgJ3B1YjInLCB7IHByb2plY3QgfSkpO1xuICBwaXBlbGluZS5hZGRQdWJsaXNoKG5ldyBUZXN0UHVibGlzaGFibGUoc3RhY2ssICdwdWIzJywgeyBwcm9qZWN0IH0pKTtcbiAgcGlwZWxpbmUuYWRkUHVibGlzaChuZXcgVGVzdFB1Ymxpc2hhYmxlKHN0YWNrLCAncHViNCcsIHsgcHJvamVjdCB9KSk7XG4gIHBpcGVsaW5lLmFkZFB1Ymxpc2gobmV3IFRlc3RQdWJsaXNoYWJsZShzdGFjaywgJ3B1YjUnLCB7IHByb2plY3QgfSkpO1xuICBwaXBlbGluZS5hZGRQdWJsaXNoKG5ldyBUZXN0UHVibGlzaGFibGUoc3RhY2ssICdwdWI2JywgeyBwcm9qZWN0IH0pKTtcblxuICBjb25zdCB0ZW1wbGF0ZSA9IFN5bnRoVXRpbHMuc3ludGhlc2l6ZShzdGFjaykudGVtcGxhdGU7XG4gIHJldHVybiB0ZW1wbGF0ZS5SZXNvdXJjZXMuUGlwZWxpbmVCdWlsZFBpcGVsaW5lMDRDNjYyOEEuUHJvcGVydGllcy5TdGFnZXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRlc3RSZXBvKHN0YWNrOiBTdGFjaykge1xuICByZXR1cm4gbmV3IGRlbGl2bGliLkNvZGVDb21taXRSZXBvKG5ldyBjb2RlY29tbWl0LlJlcG9zaXRvcnkoc3RhY2ssICdSZXBvJywgeyByZXBvc2l0b3J5TmFtZTogJ3Rlc3QnIH0pKTtcbn1cblxuY2xhc3MgVGVzdFB1Ymxpc2hhYmxlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgZGVsaXZsaWIuSVB1Ymxpc2hlciB7XG4gIHB1YmxpYyByZWFkb25seSBwcm9qZWN0OiBjb2RlYnVpbGQuSVByb2plY3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IHsgcHJvamVjdDogY29kZWJ1aWxkLklQcm9qZWN0IH0pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wcm9qZWN0ID0gcHJvcHMucHJvamVjdDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1BpcGVsaW5lKHN0YWdlOiBjcGlwZWxpbmUuSVN0YWdlLCBpZDogc3RyaW5nLCBvcHRpb25zOiBkZWxpdmxpYi5BZGRUb1BpcGVsaW5lT3B0aW9ucyk6IHZvaWQge1xuICAgIHN0YWdlLmFkZEFjdGlvbihuZXcgY3BpcGVsaW5lX2FjdGlvbnMuQ29kZUJ1aWxkQWN0aW9uKHtcbiAgICAgIGFjdGlvbk5hbWU6IGlkLFxuICAgICAgaW5wdXQ6IG9wdGlvbnMuaW5wdXRBcnRpZmFjdCB8fCBuZXcgY3BpcGVsaW5lLkFydGlmYWN0KCksXG4gICAgICBwcm9qZWN0OiB0aGlzLnByb2plY3QsXG4gICAgICBydW5PcmRlcjogb3B0aW9ucy5ydW5PcmRlcixcbiAgICB9KSk7XG4gIH1cbn1cblxuY2xhc3MgUHViIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgZGVsaXZsaWIuSVB1Ymxpc2hlciB7XG4gIHB1YmxpYyByZWFkb25seSBwcm9qZWN0OiBjb2RlYnVpbGQuSVByb2plY3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnByb2plY3QgPSBuZXcgY29kZWJ1aWxkLlBpcGVsaW5lUHJvamVjdCh0aGlzLCAnUHJvamVjdCcpO1xuICB9XG5cbiAgcHVibGljIGFkZFRvUGlwZWxpbmUoc3RhZ2U6IGNwaXBlbGluZS5JU3RhZ2UsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IGRlbGl2bGliLkFkZFRvUGlwZWxpbmVPcHRpb25zKTogdm9pZCB7XG4gICAgc3RhZ2UuYWRkQWN0aW9uKG5ldyBjcGlwZWxpbmVfYWN0aW9ucy5Db2RlQnVpbGRBY3Rpb24oe1xuICAgICAgYWN0aW9uTmFtZTogaWQsXG4gICAgICBpbnB1dDogb3B0aW9ucy5pbnB1dEFydGlmYWN0IHx8IG5ldyBjcGlwZWxpbmUuQXJ0aWZhY3QoKSxcbiAgICAgIHByb2plY3Q6IHRoaXMucHJvamVjdCxcbiAgICAgIHJ1bk9yZGVyOiBvcHRpb25zLnJ1bk9yZGVyLFxuICAgIH0pKTtcbiAgfVxufVxuXG4iXX0=
|