@aws-cdk-testing/cli-integ 3.29.2 → 3.30.1
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/README.md +1 -1
- package/npm-shrinkwrap.json +992 -1147
- package/package.json +3 -3
- package/resources/cdk-apps/app/app.js +57 -0
- package/resources/cdk-apps/app-w-synthesis-error/app.js +22 -0
- package/resources/cdk-apps/app-w-synthesis-error/cdk.json +3 -0
- package/tests/cli-integ-tests/deploy/cdk-deploy-outputs-file-written-on-no-change-deploy.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/deploy/cdk-deploy-outputs-file-written-on-no-change-deploy.integtest.js +24 -0
- package/tests/cli-integ-tests/deploy/cdk-deploy-outputs-shown-on-no-change-deploy.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/deploy/cdk-deploy-outputs-shown-on-no-change-deploy.integtest.js +15 -0
- package/tests/cli-integ-tests/hotswap/cdk-hotswap-deployment-supports-cloudcontrol-based-resources.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/hotswap/cdk-hotswap-deployment-supports-cloudcontrol-based-resources.integtest.js +41 -0
- package/tests/telemetry-integ-tests/cdk-synth-telemetry-with-synth-exception.integtest.d.ts +1 -0
- package/tests/telemetry-integ-tests/cdk-synth-telemetry-with-synth-exception.integtest.js +35 -0
package/package.json
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"organization": true
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@aws-cdk/toolkit-lib": "1.
|
|
42
|
+
"@aws-cdk/toolkit-lib": "1.22.1",
|
|
43
43
|
"@aws-cdk/yarn-cling": "0.0.0",
|
|
44
44
|
"@cdklabs/eslint-plugin": "^2.0.0",
|
|
45
45
|
"@stylistic/eslint-plugin": "^3",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"@aws-sdk/client-secrets-manager": "^3.1028.0",
|
|
81
81
|
"@aws-sdk/client-sns": "^3.1028.0",
|
|
82
82
|
"@aws-sdk/client-sso": "^3.1028.0",
|
|
83
|
-
"@aws-sdk/client-sts": "^3.
|
|
83
|
+
"@aws-sdk/client-sts": "^3.1029.0",
|
|
84
84
|
"@aws-sdk/credential-providers": "^3.1029.0",
|
|
85
85
|
"@cdklabs/cdk-atmosphere-client": "^0.0.96",
|
|
86
86
|
"@octokit/rest": "^20",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
"publishConfig": {
|
|
125
125
|
"access": "public"
|
|
126
126
|
},
|
|
127
|
-
"version": "3.
|
|
127
|
+
"version": "3.30.1",
|
|
128
128
|
"packageManager": "yarn@4.13.0",
|
|
129
129
|
"types": "lib/index.d.ts",
|
|
130
130
|
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"yarn projen\"."
|
|
@@ -33,6 +33,9 @@ if (process.env.PACKAGE_LAYOUT_VERSION === '1') {
|
|
|
33
33
|
aws_ecr_assets: docker,
|
|
34
34
|
aws_appsync: appsync,
|
|
35
35
|
aws_bedrockagentcore: bedrockagentcore,
|
|
36
|
+
aws_events: events,
|
|
37
|
+
aws_dynamodb: dynamodb,
|
|
38
|
+
aws_bedrock: bedrock,
|
|
36
39
|
Stack
|
|
37
40
|
} = require('aws-cdk-lib');
|
|
38
41
|
}
|
|
@@ -711,6 +714,59 @@ class AgentCoreHotswapStack extends cdk.Stack {
|
|
|
711
714
|
}
|
|
712
715
|
}
|
|
713
716
|
|
|
717
|
+
class CloudControlHotswapStack extends cdk.Stack {
|
|
718
|
+
constructor(parent, id, props) {
|
|
719
|
+
super(parent, id, props);
|
|
720
|
+
|
|
721
|
+
// DynamoDB table — a dependency that other resources reference
|
|
722
|
+
const table = new dynamodb.Table(this, 'Table', {
|
|
723
|
+
partitionKey: { name: 'pk', type: dynamodb.AttributeType.STRING },
|
|
724
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
// ElastiCache serverless cache — another dependency resource
|
|
728
|
+
const cache = new cdk.CfnResource(this, 'Cache', {
|
|
729
|
+
type: 'AWS::ElastiCache::ServerlessCache',
|
|
730
|
+
properties: {
|
|
731
|
+
Engine: 'valkey',
|
|
732
|
+
ServerlessCacheName: `${cdk.Stack.of(this).stackName}-cache`.substring(0, 40).toLowerCase(),
|
|
733
|
+
},
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
// SQS Queue — hotswapped via CCAPI, references the DynamoDB table ARN in its tag
|
|
737
|
+
const queue = new sqs.Queue(this, 'Queue', {
|
|
738
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
739
|
+
});
|
|
740
|
+
cdk.Tags.of(queue).add('DynamoTableArn', table.tableArn);
|
|
741
|
+
cdk.Tags.of(queue).add('DynamicTag', process.env.DYNAMIC_CC_PROPERTY_VALUE ?? 'original');
|
|
742
|
+
|
|
743
|
+
// Bedrock Agent — hotswapped via CCAPI, references the DynamoDB table name
|
|
744
|
+
const agentRole = new iam.Role(this, 'AgentRole', {
|
|
745
|
+
assumedBy: new iam.ServicePrincipal('bedrock.amazonaws.com'),
|
|
746
|
+
});
|
|
747
|
+
const agent = new bedrock.CfnAgent(this, 'Agent', {
|
|
748
|
+
agentName: `${cdk.Stack.of(this).stackName}-agent`.substring(0, 40),
|
|
749
|
+
agentResourceRoleArn: agentRole.roleArn,
|
|
750
|
+
instruction: process.env.DYNAMIC_CC_PROPERTY_VALUE
|
|
751
|
+
? `You help query the table ${table.tableName}. ${process.env.DYNAMIC_CC_PROPERTY_VALUE}`
|
|
752
|
+
: `You help query the table ${table.tableName}. original`,
|
|
753
|
+
foundationModel: 'anthropic.claude-instant-v1',
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
// Events Rule — hotswapped via CCAPI, references the ElastiCache cache ARN
|
|
757
|
+
const rule = new events.Rule(this, 'Rule', {
|
|
758
|
+
schedule: events.Schedule.rate(cdk.Duration.hours(1)),
|
|
759
|
+
description: process.env.DYNAMIC_CC_PROPERTY_VALUE
|
|
760
|
+
? `Rule for cache ${cache.getAtt('ARN')}. ${process.env.DYNAMIC_CC_PROPERTY_VALUE}`
|
|
761
|
+
: `Rule for cache ${cache.getAtt('ARN')}. original`,
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
new cdk.CfnOutput(this, 'QueueUrl', { value: queue.queueUrl });
|
|
765
|
+
new cdk.CfnOutput(this, 'AgentName', { value: agent.ref });
|
|
766
|
+
new cdk.CfnOutput(this, 'RuleName', { value: rule.ruleName });
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
|
|
714
770
|
class DockerStack extends cdk.Stack {
|
|
715
771
|
constructor(parent, id, props) {
|
|
716
772
|
super(parent, id, props);
|
|
@@ -990,6 +1046,7 @@ switch (stackSet) {
|
|
|
990
1046
|
new LambdaHotswapStack(app, `${stackPrefix}-lambda-hotswap`);
|
|
991
1047
|
new EcsHotswapStack(app, `${stackPrefix}-ecs-hotswap`);
|
|
992
1048
|
new AgentCoreHotswapStack(app, `${stackPrefix}-agentcore-hotswap`);
|
|
1049
|
+
new CloudControlHotswapStack(app, `${stackPrefix}-cc-hotswap`);
|
|
993
1050
|
new AppSyncHotswapStack(app, `${stackPrefix}-appsync-hotswap`);
|
|
994
1051
|
new DockerStack(app, `${stackPrefix}-docker`);
|
|
995
1052
|
new DockerInUseStack(app, `${stackPrefix}-docker-in-use`);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const cdk = require('aws-cdk-lib/core');
|
|
2
|
+
const s3 = require('aws-cdk-lib/aws-s3');
|
|
3
|
+
|
|
4
|
+
const stackPrefix = process.env.STACK_NAME_PREFIX;
|
|
5
|
+
if (!stackPrefix) {
|
|
6
|
+
throw new Error('the STACK_NAME_PREFIX environment variable is required');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
class IncorrectBucketNameStack extends cdk.Stack {
|
|
10
|
+
constructor(scope, id, props) {
|
|
11
|
+
super(scope, id, props);
|
|
12
|
+
|
|
13
|
+
new s3.Bucket(this, 'Bucket', {
|
|
14
|
+
bucketName: '&@%$*&@$%',
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const app = new cdk.App();
|
|
20
|
+
new IncorrectBucketNameStack(app, `${stackPrefix}-incorrect-bucket-name`);
|
|
21
|
+
|
|
22
|
+
app.synth();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs_1 = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const lib_1 = require("../../../lib");
|
|
6
|
+
(0, lib_1.integTest)('outputs-file is written on initial and no-change deploys', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
7
|
+
const outputsFile = path.join(fixture.integTestDir, 'outputs', 'outputs.json');
|
|
8
|
+
await fs_1.promises.mkdir(path.dirname(outputsFile), { recursive: true });
|
|
9
|
+
// First deploy — creates the stack and writes the outputs file
|
|
10
|
+
await fixture.cdkDeploy('outputs-test-1', { options: ['--outputs-file', outputsFile] });
|
|
11
|
+
const firstOutputs = JSON.parse(await fs_1.promises.readFile(outputsFile, 'utf-8'));
|
|
12
|
+
expect(firstOutputs).toEqual({
|
|
13
|
+
[`${fixture.stackNamePrefix}-outputs-test-1`]: {
|
|
14
|
+
TopicName: `${fixture.stackNamePrefix}-outputs-test-1MyTopic`,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
// Delete the file so we can assert it gets recreated on the no-change deploy
|
|
18
|
+
await fs_1.promises.rm(outputsFile);
|
|
19
|
+
// Second deploy — no changes, outputs file must still be written
|
|
20
|
+
await fixture.cdkDeploy('outputs-test-1', { options: ['--outputs-file', outputsFile] });
|
|
21
|
+
const secondOutputs = JSON.parse(await fs_1.promises.readFile(outputsFile, 'utf-8'));
|
|
22
|
+
expect(secondOutputs).toEqual(firstOutputs);
|
|
23
|
+
}));
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1vdXRwdXRzLWZpbGUtd3JpdHRlbi1vbi1uby1jaGFuZ2UtZGVwbG95LmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1kZXBsb3ktb3V0cHV0cy1maWxlLXdyaXR0ZW4tb24tbm8tY2hhbmdlLWRlcGxveS5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQkFBb0M7QUFDcEMsNkJBQTZCO0FBQzdCLHNDQUE2RDtBQUU3RCxJQUFBLGVBQVMsRUFDUCwwREFBMEQsRUFDMUQsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMvRSxNQUFNLGFBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRS9ELCtEQUErRDtJQUMvRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLGFBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUMzQixDQUFDLEdBQUcsT0FBTyxDQUFDLGVBQWUsaUJBQWlCLENBQUMsRUFBRTtZQUM3QyxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUMsZUFBZSx3QkFBd0I7U0FDOUQ7S0FDRixDQUFDLENBQUM7SUFFSCw2RUFBNkU7SUFDN0UsTUFBTSxhQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXpCLGlFQUFpRTtJQUNqRSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLGFBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM5QyxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5pbnRlZ1Rlc3QoXG4gICdvdXRwdXRzLWZpbGUgaXMgd3JpdHRlbiBvbiBpbml0aWFsIGFuZCBuby1jaGFuZ2UgZGVwbG95cycsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IG91dHB1dHNGaWxlID0gcGF0aC5qb2luKGZpeHR1cmUuaW50ZWdUZXN0RGlyLCAnb3V0cHV0cycsICdvdXRwdXRzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUob3V0cHV0c0ZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIEZpcnN0IGRlcGxveSDigJQgY3JlYXRlcyB0aGUgc3RhY2sgYW5kIHdyaXRlcyB0aGUgb3V0cHV0cyBmaWxlXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ291dHB1dHMtdGVzdC0xJywgeyBvcHRpb25zOiBbJy0tb3V0cHV0cy1maWxlJywgb3V0cHV0c0ZpbGVdIH0pO1xuICAgIGNvbnN0IGZpcnN0T3V0cHV0cyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUob3V0cHV0c0ZpbGUsICd1dGYtOCcpKTtcbiAgICBleHBlY3QoZmlyc3RPdXRwdXRzKS50b0VxdWFsKHtcbiAgICAgIFtgJHtmaXh0dXJlLnN0YWNrTmFtZVByZWZpeH0tb3V0cHV0cy10ZXN0LTFgXToge1xuICAgICAgICBUb3BpY05hbWU6IGAke2ZpeHR1cmUuc3RhY2tOYW1lUHJlZml4fS1vdXRwdXRzLXRlc3QtMU15VG9waWNgLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIERlbGV0ZSB0aGUgZmlsZSBzbyB3ZSBjYW4gYXNzZXJ0IGl0IGdldHMgcmVjcmVhdGVkIG9uIHRoZSBuby1jaGFuZ2UgZGVwbG95XG4gICAgYXdhaXQgZnMucm0ob3V0cHV0c0ZpbGUpO1xuXG4gICAgLy8gU2Vjb25kIGRlcGxveSDigJQgbm8gY2hhbmdlcywgb3V0cHV0cyBmaWxlIG11c3Qgc3RpbGwgYmUgd3JpdHRlblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdvdXRwdXRzLXRlc3QtMScsIHsgb3B0aW9uczogWyctLW91dHB1dHMtZmlsZScsIG91dHB1dHNGaWxlXSB9KTtcbiAgICBjb25zdCBzZWNvbmRPdXRwdXRzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShvdXRwdXRzRmlsZSwgJ3V0Zi04JykpO1xuICAgIGV4cGVjdChzZWNvbmRPdXRwdXRzKS50b0VxdWFsKGZpcnN0T3V0cHV0cyk7XG4gIH0pLFxuKTtcbiJdfQ==
|
package/tests/cli-integ-tests/deploy/cdk-deploy-outputs-shown-on-no-change-deploy.integtest.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/tests/cli-integ-tests/deploy/cdk-deploy-outputs-shown-on-no-change-deploy.integtest.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('deploy outputs shown on initial and no-change deploys', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
5
|
+
// First deploy — creates the stack
|
|
6
|
+
const firstDeploy = await fixture.cdkDeploy('outputs-test-1');
|
|
7
|
+
expect(firstDeploy).toContain('Outputs:');
|
|
8
|
+
expect(firstDeploy).toContain('TopicName');
|
|
9
|
+
// Second deploy — no changes, outputs must still be shown
|
|
10
|
+
const secondDeploy = await fixture.cdkDeploy('outputs-test-1');
|
|
11
|
+
expect(secondDeploy).toContain('Outputs:');
|
|
12
|
+
expect(secondDeploy).toContain('TopicName');
|
|
13
|
+
expect(secondDeploy).toContain('(no changes)');
|
|
14
|
+
}));
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1vdXRwdXRzLXNob3duLW9uLW5vLWNoYW5nZS1kZXBsb3kuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWRlcGxveS1vdXRwdXRzLXNob3duLW9uLW5vLWNoYW5nZS1kZXBsb3kuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQTZEO0FBRTdELElBQUEsZUFBUyxFQUNQLHVEQUF1RCxFQUN2RCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxtQ0FBbUM7SUFDbkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTNDLDBEQUEwRDtJQUMxRCxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMvRCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5pbnRlZ1Rlc3QoXG4gICdkZXBsb3kgb3V0cHV0cyBzaG93biBvbiBpbml0aWFsIGFuZCBuby1jaGFuZ2UgZGVwbG95cycsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIC8vIEZpcnN0IGRlcGxveSDigJQgY3JlYXRlcyB0aGUgc3RhY2tcbiAgICBjb25zdCBmaXJzdERlcGxveSA9IGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdvdXRwdXRzLXRlc3QtMScpO1xuICAgIGV4cGVjdChmaXJzdERlcGxveSkudG9Db250YWluKCdPdXRwdXRzOicpO1xuICAgIGV4cGVjdChmaXJzdERlcGxveSkudG9Db250YWluKCdUb3BpY05hbWUnKTtcblxuICAgIC8vIFNlY29uZCBkZXBsb3kg4oCUIG5vIGNoYW5nZXMsIG91dHB1dHMgbXVzdCBzdGlsbCBiZSBzaG93blxuICAgIGNvbnN0IHNlY29uZERlcGxveSA9IGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdvdXRwdXRzLXRlc3QtMScpO1xuICAgIGV4cGVjdChzZWNvbmREZXBsb3kpLnRvQ29udGFpbignT3V0cHV0czonKTtcbiAgICBleHBlY3Qoc2Vjb25kRGVwbG95KS50b0NvbnRhaW4oJ1RvcGljTmFtZScpO1xuICAgIGV4cGVjdChzZWNvbmREZXBsb3kpLnRvQ29udGFpbignKG5vIGNoYW5nZXMpJyk7XG4gIH0pLFxuKTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
|
|
4
|
+
const lib_1 = require("../../../lib");
|
|
5
|
+
jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
|
|
6
|
+
(0, lib_1.integTest)('hotswap deployment supports CloudControl-based resources with attribute resolution', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
7
|
+
// GIVEN
|
|
8
|
+
const stackName = 'cc-hotswap';
|
|
9
|
+
await fixture.cdkDeploy(stackName, {
|
|
10
|
+
captureStderr: false,
|
|
11
|
+
modEnv: {
|
|
12
|
+
DYNAMIC_CC_PROPERTY_VALUE: 'original value',
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
// WHEN
|
|
16
|
+
const deployOutput = await fixture.cdkDeploy(stackName, {
|
|
17
|
+
options: ['--hotswap'],
|
|
18
|
+
captureStderr: true,
|
|
19
|
+
onlyStderr: true,
|
|
20
|
+
modEnv: {
|
|
21
|
+
DYNAMIC_CC_PROPERTY_VALUE: 'new value',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const response = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({
|
|
25
|
+
StackName: fixture.fullStackName(stackName),
|
|
26
|
+
}));
|
|
27
|
+
const queueUrl = response.Stacks?.[0].Outputs?.find((output) => output.OutputKey === 'QueueUrl')?.OutputValue;
|
|
28
|
+
const agentName = response.Stacks?.[0].Outputs?.find((output) => output.OutputKey === 'AgentName')?.OutputValue;
|
|
29
|
+
const ruleName = response.Stacks?.[0].Outputs?.find((output) => output.OutputKey === 'RuleName')?.OutputValue;
|
|
30
|
+
// THEN
|
|
31
|
+
// The deployment should not trigger a full deployment, thus the stack's status must remain
|
|
32
|
+
// "CREATE_COMPLETE"
|
|
33
|
+
expect(response.Stacks?.[0].StackStatus).toEqual('CREATE_COMPLETE');
|
|
34
|
+
// Verify hotswap was used
|
|
35
|
+
expect(deployOutput).toMatch(/hotswapped!/);
|
|
36
|
+
// Verify all three CCAPI-based resources were hotswapped
|
|
37
|
+
expect(queueUrl).toBeDefined();
|
|
38
|
+
expect(agentName).toBeDefined();
|
|
39
|
+
expect(ruleName).toBeDefined();
|
|
40
|
+
}));
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWhvdHN3YXAtZGVwbG95bWVudC1zdXBwb3J0cy1jbG91ZGNvbnRyb2wtYmFzZWQtcmVzb3VyY2VzLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1ob3Rzd2FwLWRlcGxveW1lbnQtc3VwcG9ydHMtY2xvdWRjb250cm9sLWJhc2VkLXJlc291cmNlcy5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwRUFBdUU7QUFDdkUsc0NBQTZEO0FBRTdELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCxvRkFBb0YsRUFDcEYsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsUUFBUTtJQUNSLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQztJQUMvQixNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1FBQ2pDLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLE1BQU0sRUFBRTtZQUNOLHlCQUF5QixFQUFFLGdCQUFnQjtTQUM1QztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU87SUFDUCxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1FBQ3RELE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUN0QixhQUFhLEVBQUUsSUFBSTtRQUNuQixVQUFVLEVBQUUsSUFBSTtRQUNoQixNQUFNLEVBQUU7WUFDTix5QkFBeUIsRUFBRSxXQUFXO1NBQ3ZDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3BELElBQUksNkNBQXFCLENBQUM7UUFDeEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO0tBQzVDLENBQUMsQ0FDSCxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQzlHLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztJQUNoSCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUM7SUFFOUcsT0FBTztJQUVQLDJGQUEyRjtJQUMzRixvQkFBb0I7SUFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwRSwwQkFBMEI7SUFDMUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM1Qyx5REFBeUQ7SUFDekQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tzQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmplc3Quc2V0VGltZW91dCgyICogNjAgKiA2MF8wMDApOyAvLyBJbmNsdWRlcyB0aGUgdGltZSB0byBhY3F1aXJlIGxvY2tzLCB3b3JzdC1jYXNlIHNpbmdsZS10aHJlYWRlZCBydW50aW1lXG5cbmludGVnVGVzdChcbiAgJ2hvdHN3YXAgZGVwbG95bWVudCBzdXBwb3J0cyBDbG91ZENvbnRyb2wtYmFzZWQgcmVzb3VyY2VzIHdpdGggYXR0cmlidXRlIHJlc29sdXRpb24nLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrTmFtZSA9ICdjYy1ob3Rzd2FwJztcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveShzdGFja05hbWUsIHtcbiAgICAgIGNhcHR1cmVTdGRlcnI6IGZhbHNlLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIERZTkFNSUNfQ0NfUFJPUEVSVFlfVkFMVUU6ICdvcmlnaW5hbCB2YWx1ZScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGRlcGxveU91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KHN0YWNrTmFtZSwge1xuICAgICAgb3B0aW9uczogWyctLWhvdHN3YXAnXSxcbiAgICAgIGNhcHR1cmVTdGRlcnI6IHRydWUsXG4gICAgICBvbmx5U3RkZXJyOiB0cnVlLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIERZTkFNSUNfQ0NfUFJPUEVSVFlfVkFMVUU6ICduZXcgdmFsdWUnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChcbiAgICAgIG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoe1xuICAgICAgICBTdGFja05hbWU6IGZpeHR1cmUuZnVsbFN0YWNrTmFtZShzdGFja05hbWUpLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IHF1ZXVlVXJsID0gcmVzcG9uc2UuU3RhY2tzPy5bMF0uT3V0cHV0cz8uZmluZCgob3V0cHV0KSA9PiBvdXRwdXQuT3V0cHV0S2V5ID09PSAnUXVldWVVcmwnKT8uT3V0cHV0VmFsdWU7XG4gICAgY29uc3QgYWdlbnROYW1lID0gcmVzcG9uc2UuU3RhY2tzPy5bMF0uT3V0cHV0cz8uZmluZCgob3V0cHV0KSA9PiBvdXRwdXQuT3V0cHV0S2V5ID09PSAnQWdlbnROYW1lJyk/Lk91dHB1dFZhbHVlO1xuICAgIGNvbnN0IHJ1bGVOYW1lID0gcmVzcG9uc2UuU3RhY2tzPy5bMF0uT3V0cHV0cz8uZmluZCgob3V0cHV0KSA9PiBvdXRwdXQuT3V0cHV0S2V5ID09PSAnUnVsZU5hbWUnKT8uT3V0cHV0VmFsdWU7XG5cbiAgICAvLyBUSEVOXG5cbiAgICAvLyBUaGUgZGVwbG95bWVudCBzaG91bGQgbm90IHRyaWdnZXIgYSBmdWxsIGRlcGxveW1lbnQsIHRodXMgdGhlIHN0YWNrJ3Mgc3RhdHVzIG11c3QgcmVtYWluXG4gICAgLy8gXCJDUkVBVEVfQ09NUExFVEVcIlxuICAgIGV4cGVjdChyZXNwb25zZS5TdGFja3M/LlswXS5TdGFja1N0YXR1cykudG9FcXVhbCgnQ1JFQVRFX0NPTVBMRVRFJyk7XG4gICAgLy8gVmVyaWZ5IGhvdHN3YXAgd2FzIHVzZWRcbiAgICBleHBlY3QoZGVwbG95T3V0cHV0KS50b01hdGNoKC9ob3Rzd2FwcGVkIS8pO1xuICAgIC8vIFZlcmlmeSBhbGwgdGhyZWUgQ0NBUEktYmFzZWQgcmVzb3VyY2VzIHdlcmUgaG90c3dhcHBlZFxuICAgIGV4cGVjdChxdWV1ZVVybCkudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoYWdlbnROYW1lKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChydWxlTmFtZSkudG9CZURlZmluZWQoKTtcbiAgfSksXG4pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const path = require("path");
|
|
4
|
+
const fs = require("fs-extra");
|
|
5
|
+
const lib_1 = require("../../lib");
|
|
6
|
+
(0, lib_1.integTest)('cdk synth with telemetry and validation error leads to invoke failure', (0, lib_1.withSpecificFixture)('app-w-synthesis-error', async (fixture) => {
|
|
7
|
+
const telemetryFile = path.join(fixture.integTestDir, `telemetry-${Date.now()}.json`);
|
|
8
|
+
await fixture.cdk(['synth', `--telemetry-file=${telemetryFile}`], {
|
|
9
|
+
allowErrExit: true,
|
|
10
|
+
verboseLevel: 3, // trace mode
|
|
11
|
+
});
|
|
12
|
+
const json = fs.readJSONSync(telemetryFile);
|
|
13
|
+
expect(json).toEqual([
|
|
14
|
+
expect.objectContaining({
|
|
15
|
+
event: expect.objectContaining({
|
|
16
|
+
eventType: 'SYNTH',
|
|
17
|
+
state: 'FAILED',
|
|
18
|
+
}),
|
|
19
|
+
error: {
|
|
20
|
+
name: 'synth:InvalidBucketNameValue',
|
|
21
|
+
},
|
|
22
|
+
}),
|
|
23
|
+
expect.objectContaining({
|
|
24
|
+
event: expect.objectContaining({
|
|
25
|
+
eventType: 'INVOKE',
|
|
26
|
+
state: 'FAILED',
|
|
27
|
+
}),
|
|
28
|
+
error: {
|
|
29
|
+
name: 'synth:InvalidBucketNameValue',
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
]);
|
|
33
|
+
fs.unlinkSync(telemetryFile);
|
|
34
|
+
}, { aws: { disableBootstrap: true } }));
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXN5bnRoLXRlbGVtZXRyeS13aXRoLXN5bnRoLWV4Y2VwdGlvbi5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstc3ludGgtdGVsZW1ldHJ5LXdpdGgtc3ludGgtZXhjZXB0aW9uLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsbUNBQTJEO0FBRTNELElBQUEsZUFBUyxFQUNQLHVFQUF1RSxFQUN2RSxJQUFBLHlCQUFtQixFQUFDLHVCQUF1QixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUM3RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsYUFBYSxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxvQkFBb0IsYUFBYSxFQUFFLENBQUMsRUFBRTtRQUNoRSxZQUFZLEVBQUUsSUFBSTtRQUNsQixZQUFZLEVBQUUsQ0FBQyxFQUFFLGFBQWE7S0FDL0IsQ0FBQyxDQUFDO0lBRUgsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUN0QixLQUFLLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2dCQUM3QixTQUFTLEVBQUUsT0FBTztnQkFDbEIsS0FBSyxFQUFFLFFBQVE7YUFDaEIsQ0FBQztZQUNGLEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsOEJBQThCO2FBQ3JDO1NBQ0YsQ0FBQztRQUNGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUN0QixLQUFLLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2dCQUM3QixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsS0FBSyxFQUFFLFFBQVE7YUFDaEIsQ0FBQztZQUNGLEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsOEJBQThCO2FBQ3JDO1NBQ0YsQ0FBQztLQUNILENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDL0IsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aFNwZWNpZmljRml4dHVyZSB9IGZyb20gJy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2NkayBzeW50aCB3aXRoIHRlbGVtZXRyeSBhbmQgdmFsaWRhdGlvbiBlcnJvciBsZWFkcyB0byBpbnZva2UgZmFpbHVyZScsXG4gIHdpdGhTcGVjaWZpY0ZpeHR1cmUoJ2FwcC13LXN5bnRoZXNpcy1lcnJvcicsIGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdGVsZW1ldHJ5RmlsZSA9IHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgYHRlbGVtZXRyeS0ke0RhdGUubm93KCl9Lmpzb25gKTtcbiAgICBhd2FpdCBmaXh0dXJlLmNkayhbJ3N5bnRoJywgYC0tdGVsZW1ldHJ5LWZpbGU9JHt0ZWxlbWV0cnlGaWxlfWBdLCB7XG4gICAgICBhbGxvd0VyckV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlTGV2ZWw6IDMsIC8vIHRyYWNlIG1vZGVcbiAgICB9KTtcblxuICAgIGNvbnN0IGpzb24gPSBmcy5yZWFkSlNPTlN5bmModGVsZW1ldHJ5RmlsZSk7XG4gICAgZXhwZWN0KGpzb24pLnRvRXF1YWwoW1xuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBldmVudDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ1NZTlRIJyxcbiAgICAgICAgICBzdGF0ZTogJ0ZBSUxFRCcsXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG5hbWU6ICdzeW50aDpJbnZhbGlkQnVja2V0TmFtZVZhbHVlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBldmVudDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ0lOVk9LRScsXG4gICAgICAgICAgc3RhdGU6ICdGQUlMRUQnLFxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBuYW1lOiAnc3ludGg6SW52YWxpZEJ1Y2tldE5hbWVWYWx1ZScsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICBmcy51bmxpbmtTeW5jKHRlbGVtZXRyeUZpbGUpO1xuICB9LCB7IGF3czogeyBkaXNhYmxlQm9vdHN0cmFwOiB0cnVlIH0gfSksXG4pO1xuXG4iXX0=
|