@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/package.json CHANGED
@@ -39,7 +39,7 @@
39
39
  "organization": true
40
40
  },
41
41
  "devDependencies": {
42
- "@aws-cdk/toolkit-lib": "1.21.3",
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.1028.0",
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.29.2",
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,3 @@
1
+ {
2
+ "app": "node app"
3
+ }
@@ -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==
@@ -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,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,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=