@aws-cdk-testing/cli-integ 3.32.7 → 3.33.0
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/npm-shrinkwrap.json +169 -239
- package/package.json +6 -6
- package/resources/cdk-apps/app/app.js +26 -0
- package/resources/cdk-apps/validate-app/app.js +94 -0
- package/resources/cdk-apps/validate-app/cdk.json +8 -0
- package/resources/cdk-apps/validate-online-app/app.js +94 -0
- package/resources/cdk-apps/validate-online-app/cdk.json +7 -0
- package/resources/cdk-apps/validate-passing-app/app.js +36 -0
- package/resources/cdk-apps/validate-passing-app/cdk.json +8 -0
- package/tests/cli-integ-tests/deploy/cdk-deploy-docker-asset-multi-dest.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/deploy/cdk-deploy-docker-asset-multi-dest.integtest.js +7 -0
- package/tests/cli-integ-tests/deploy/cdk-deploy-docker-asset-multi-region.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/deploy/cdk-deploy-docker-asset-multi-region.integtest.js +18 -0
- package/tests/cli-integ-tests/doctor/cdk-doctor.integtest.js +2 -2
- package/tests/cli-integ-tests/validate/cdk-validate-passes-clean-app.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/validate/cdk-validate-passes-clean-app.integtest.js +8 -0
- package/tests/cli-integ-tests/validate/cdk-validate-reports-violations.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/validate/cdk-validate-reports-violations.integtest.js +17 -0
- package/tests/cli-integ-tests/validate-online/cdk-validate-no-online-skips-cfn.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/validate-online/cdk-validate-no-online-skips-cfn.integtest.js +19 -0
- package/tests/cli-integ-tests/validate-online/cdk-validate-online-catches-bucket-conflict.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/validate-online/cdk-validate-online-catches-bucket-conflict.integtest.js +19 -0
- package/tests/cli-integ-tests/validate-online/cdk-validate-online-combined-offline-and-online.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/validate-online/cdk-validate-online-combined-offline-and-online.integtest.js +24 -0
- package/tests/cli-integ-tests/validate-online/cdk-validate-online-passes-valid-template.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/validate-online/cdk-validate-online-passes-valid-template.integtest.js +8 -0
- package/tests/telemetry-integ-tests/cdk-deploy-sequential-errors.d.ts +1 -0
- package/tests/telemetry-integ-tests/cdk-deploy-sequential-errors.js +45 -0
- package/tests/telemetry-integ-tests/cdk-deploy-telemetry.integtest.js +29 -3
package/package.json
CHANGED
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
"organization": true
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@aws-cdk/toolkit-lib": "1.
|
|
42
|
+
"@aws-cdk/toolkit-lib": "1.29.0",
|
|
43
43
|
"@aws-cdk/yarn-cling": "0.0.0",
|
|
44
|
-
"@cdklabs/eslint-plugin": "^2.0.
|
|
44
|
+
"@cdklabs/eslint-plugin": "^2.0.9",
|
|
45
45
|
"@stylistic/eslint-plugin": "^3",
|
|
46
46
|
"@types/fs-extra": "^11",
|
|
47
47
|
"@types/jest": "^29.5.14",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"constructs": "^10.0.0",
|
|
55
55
|
"eslint": "^9",
|
|
56
56
|
"eslint-config-prettier": "^10.1.8",
|
|
57
|
-
"eslint-import-resolver-typescript": "^4.4.
|
|
57
|
+
"eslint-import-resolver-typescript": "^4.4.5",
|
|
58
58
|
"eslint-plugin-import": "^2.32.0",
|
|
59
59
|
"eslint-plugin-jest": "^29.15.2",
|
|
60
60
|
"eslint-plugin-jsdoc": "^62.9.0",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"license-checker": "^25.0.1",
|
|
65
65
|
"nx": "^22.7.5",
|
|
66
66
|
"prettier": "^2.8",
|
|
67
|
-
"projen": "^0.99.
|
|
67
|
+
"projen": "^0.99.73",
|
|
68
68
|
"ts-jest": "^29.4.11",
|
|
69
69
|
"typescript": "5.9"
|
|
70
70
|
},
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"@aws-sdk/client-sso": "^3",
|
|
84
84
|
"@aws-sdk/client-sts": "^3",
|
|
85
85
|
"@aws-sdk/credential-providers": "^3",
|
|
86
|
-
"@cdklabs/cdk-atmosphere-client": "^0.0.
|
|
86
|
+
"@cdklabs/cdk-atmosphere-client": "^0.0.105",
|
|
87
87
|
"@octokit/rest": "^20",
|
|
88
88
|
"@smithy/types": "^4",
|
|
89
89
|
"@smithy/util-retry": "^4",
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
"publishConfig": {
|
|
126
126
|
"access": "public"
|
|
127
127
|
},
|
|
128
|
-
"version": "3.
|
|
128
|
+
"version": "3.33.0",
|
|
129
129
|
"packageManager": "yarn@4.13.0",
|
|
130
130
|
"types": "lib/index.d.ts",
|
|
131
131
|
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"yarn projen\"."
|
|
@@ -864,6 +864,24 @@ class MultipleDockerAssetsStack extends cdk.Stack {
|
|
|
864
864
|
}
|
|
865
865
|
}
|
|
866
866
|
|
|
867
|
+
/**
|
|
868
|
+
* A stack that uses the same docker image as another stack, to test that the
|
|
869
|
+
* same image asset can be published to multiple destinations without rebuilding.
|
|
870
|
+
*/
|
|
871
|
+
class DockerMultiDestStack extends cdk.Stack {
|
|
872
|
+
constructor(parent, id, props) {
|
|
873
|
+
super(parent, id, props);
|
|
874
|
+
|
|
875
|
+
new docker.DockerImageAsset(this, 'image', {
|
|
876
|
+
directory: path.join(__dirname, 'docker')
|
|
877
|
+
});
|
|
878
|
+
|
|
879
|
+
new cdk.CfnResource(this, 'Handle', {
|
|
880
|
+
type: 'AWS::CloudFormation::WaitConditionHandle'
|
|
881
|
+
});
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
|
|
867
885
|
/**
|
|
868
886
|
* A stack that will never succeed deploying (done in a way that CDK cannot detect but CFN will complain about)
|
|
869
887
|
*/
|
|
@@ -1081,6 +1099,14 @@ switch (stackSet) {
|
|
|
1081
1099
|
new DockerInUseStack(app, `${stackPrefix}-docker-in-use`);
|
|
1082
1100
|
new DockerStackWithCustomFile(app, `${stackPrefix}-docker-with-custom-file`);
|
|
1083
1101
|
new MultipleDockerAssetsStack(app, `${stackPrefix}-multiple-docker-assets`);
|
|
1102
|
+
new DockerMultiDestStack(app, `${stackPrefix}-docker-multi-dest-1`, { env: defaultEnv });
|
|
1103
|
+
new DockerMultiDestStack(app, `${stackPrefix}-docker-multi-dest-2`, { env: defaultEnv });
|
|
1104
|
+
|
|
1105
|
+
if (process.env.CDK_SECONDARY_REGION) {
|
|
1106
|
+
const secondaryEnv = { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_SECONDARY_REGION };
|
|
1107
|
+
new DockerMultiDestStack(app, `${stackPrefix}-docker-multi-region-1`, { env: defaultEnv });
|
|
1108
|
+
new DockerMultiDestStack(app, `${stackPrefix}-docker-multi-region-2`, { env: secondaryEnv });
|
|
1109
|
+
}
|
|
1084
1110
|
|
|
1085
1111
|
new NotificationArnsStack(app, `${stackPrefix}-notification-arns`);
|
|
1086
1112
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const cdk = require('aws-cdk-lib/core');
|
|
3
|
+
const s3 = require('aws-cdk-lib/aws-s3');
|
|
4
|
+
|
|
5
|
+
const stackPrefix = process.env.STACK_NAME_PREFIX;
|
|
6
|
+
if (!stackPrefix) {
|
|
7
|
+
throw new Error('the STACK_NAME_PREFIX environment variable is required');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
class SecurityPlugin {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.name = 'SecurityPlugin';
|
|
13
|
+
this.version = '2.1.0';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
validate(context) {
|
|
17
|
+
const violations = [];
|
|
18
|
+
for (const templatePath of context.templatePaths) {
|
|
19
|
+
const template = JSON.parse(fs.readFileSync(templatePath, 'utf-8'));
|
|
20
|
+
for (const [logicalId, resource] of Object.entries(template.Resources || {})) {
|
|
21
|
+
if (resource.Type === 'AWS::S3::Bucket') {
|
|
22
|
+
violations.push(
|
|
23
|
+
{
|
|
24
|
+
ruleName: 'no-public-buckets',
|
|
25
|
+
description: 'S3 Buckets must not be publicly accessible',
|
|
26
|
+
fix: 'Set PublicAccessBlockConfiguration on the bucket',
|
|
27
|
+
severity: 'fatal',
|
|
28
|
+
violatingResources: [{
|
|
29
|
+
resourceLogicalId: logicalId,
|
|
30
|
+
templatePath,
|
|
31
|
+
locations: [`/Resources/${logicalId}/Properties/PublicAccessBlockConfiguration`],
|
|
32
|
+
}],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
ruleName: 'require-encryption',
|
|
36
|
+
description: 'S3 Buckets must have server-side encryption enabled',
|
|
37
|
+
fix: 'Add BucketEncryption property with SSE-S3 or SSE-KMS',
|
|
38
|
+
severity: 'error',
|
|
39
|
+
violatingResources: [{
|
|
40
|
+
resourceLogicalId: logicalId,
|
|
41
|
+
templatePath,
|
|
42
|
+
locations: [`/Resources/${logicalId}/Properties/BucketEncryption`],
|
|
43
|
+
}],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
ruleName: 'require-versioning',
|
|
47
|
+
description: 'S3 Buckets should have versioning enabled for data protection',
|
|
48
|
+
severity: 'warning',
|
|
49
|
+
violatingResources: [{
|
|
50
|
+
resourceLogicalId: logicalId,
|
|
51
|
+
templatePath,
|
|
52
|
+
locations: [`/Resources/${logicalId}/Properties/VersioningConfiguration`],
|
|
53
|
+
}],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
ruleName: 'consider-intelligent-tiering',
|
|
57
|
+
description: 'Consider using Intelligent-Tiering storage class for cost optimization',
|
|
58
|
+
severity: 'cost-optimization',
|
|
59
|
+
violatingResources: [{
|
|
60
|
+
resourceLogicalId: logicalId,
|
|
61
|
+
templatePath,
|
|
62
|
+
locations: [`/Resources/${logicalId}/Properties/IntelligentTieringConfigurations`],
|
|
63
|
+
}],
|
|
64
|
+
},
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
success: violations.length === 0,
|
|
72
|
+
violations,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const app = new cdk.App();
|
|
78
|
+
cdk.Validations.of(app).addPlugins(new SecurityPlugin());
|
|
79
|
+
|
|
80
|
+
class ValidateStack extends cdk.Stack {
|
|
81
|
+
constructor(scope, id, props) {
|
|
82
|
+
super(scope, id, props);
|
|
83
|
+
const bucket = new s3.Bucket(this, 'MyBucket', {
|
|
84
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Construct Annotations plugin picks this up
|
|
88
|
+
cdk.Annotations.of(bucket).addWarningV2('bucket-no-lifecycle', 'This bucket has no lifecycle rules configured');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
new ValidateStack(app, `${stackPrefix}-validate`);
|
|
93
|
+
|
|
94
|
+
app.synth();
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const cdk = require('aws-cdk-lib/core');
|
|
3
|
+
const s3 = require('aws-cdk-lib/aws-s3');
|
|
4
|
+
|
|
5
|
+
const stackPrefix = process.env.STACK_NAME_PREFIX;
|
|
6
|
+
if (!stackPrefix) {
|
|
7
|
+
throw new Error('the STACK_NAME_PREFIX environment variable is required');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const SHARED_BUCKET_NAME = `${stackPrefix}-validate-online-shared-bucket`;
|
|
11
|
+
|
|
12
|
+
class SecurityPlugin {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.name = 'SecurityPlugin';
|
|
15
|
+
this.version = '1.0.0';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
validate(context) {
|
|
19
|
+
const violations = [];
|
|
20
|
+
for (const templatePath of context.templatePaths) {
|
|
21
|
+
const template = JSON.parse(fs.readFileSync(templatePath, 'utf-8'));
|
|
22
|
+
for (const [logicalId, resource] of Object.entries(template.Resources || {})) {
|
|
23
|
+
if (resource.Type === 'AWS::S3::Bucket') {
|
|
24
|
+
violations.push({
|
|
25
|
+
ruleName: 'no-public-buckets',
|
|
26
|
+
description: 'S3 Buckets must not be publicly accessible',
|
|
27
|
+
fix: 'Set PublicAccessBlockConfiguration on the bucket',
|
|
28
|
+
severity: 'error',
|
|
29
|
+
violatingResources: [{
|
|
30
|
+
resourceLogicalId: logicalId,
|
|
31
|
+
templatePath,
|
|
32
|
+
locations: [`/Resources/${logicalId}/Properties/PublicAccessBlockConfiguration`],
|
|
33
|
+
}],
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { success: violations.length === 0, violations };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const app = new cdk.App();
|
|
43
|
+
cdk.Validations.of(app).addPlugins(new SecurityPlugin());
|
|
44
|
+
|
|
45
|
+
// Valid stack — no offline or online errors
|
|
46
|
+
class ValidStack extends cdk.Stack {
|
|
47
|
+
constructor(scope, id, props) {
|
|
48
|
+
super(scope, id, props);
|
|
49
|
+
new cdk.CfnResource(this, 'WaitHandle', {
|
|
50
|
+
type: 'AWS::CloudFormation::WaitConditionHandle',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Deployed stack — owns the bucket with the shared name
|
|
56
|
+
class DeployedStack extends cdk.Stack {
|
|
57
|
+
constructor(scope, id, props) {
|
|
58
|
+
super(scope, id, props);
|
|
59
|
+
new s3.Bucket(this, 'ExistingBucket', {
|
|
60
|
+
bucketName: SHARED_BUCKET_NAME,
|
|
61
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Conflicting stack — tries to create a bucket with the same name (early validation error)
|
|
67
|
+
class ConflictingStack extends cdk.Stack {
|
|
68
|
+
constructor(scope, id, props) {
|
|
69
|
+
super(scope, id, props);
|
|
70
|
+
new s3.Bucket(this, 'ConflictBucket', {
|
|
71
|
+
bucketName: SHARED_BUCKET_NAME,
|
|
72
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Combined stack — has BOTH offline (S3 bucket triggers SecurityPlugin)
|
|
78
|
+
// AND online errors (bucket name conflict caught by CFN early validation)
|
|
79
|
+
class CombinedStack extends cdk.Stack {
|
|
80
|
+
constructor(scope, id, props) {
|
|
81
|
+
super(scope, id, props);
|
|
82
|
+
new s3.Bucket(this, 'MyBucket', {
|
|
83
|
+
bucketName: SHARED_BUCKET_NAME,
|
|
84
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
new ValidStack(app, `${stackPrefix}-validate-online-valid`);
|
|
90
|
+
new DeployedStack(app, `${stackPrefix}-validate-online-deployed`);
|
|
91
|
+
new ConflictingStack(app, `${stackPrefix}-validate-online-conflicting`);
|
|
92
|
+
new CombinedStack(app, `${stackPrefix}-validate-online-combined`);
|
|
93
|
+
|
|
94
|
+
app.synth();
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const cdk = require('aws-cdk-lib/core');
|
|
2
|
+
|
|
3
|
+
const stackPrefix = process.env.STACK_NAME_PREFIX;
|
|
4
|
+
if (!stackPrefix) {
|
|
5
|
+
throw new Error('the STACK_NAME_PREFIX environment variable is required');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
class AlwaysPassesPlugin {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.name = 'AlwaysPassesPlugin';
|
|
11
|
+
this.version = '1.0.0';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
validate(_context) {
|
|
15
|
+
return {
|
|
16
|
+
success: true,
|
|
17
|
+
violations: [],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const app = new cdk.App();
|
|
23
|
+
cdk.Validations.of(app).addPlugins(new AlwaysPassesPlugin());
|
|
24
|
+
|
|
25
|
+
class PassingStack extends cdk.Stack {
|
|
26
|
+
constructor(scope, id, props) {
|
|
27
|
+
super(scope, id, props);
|
|
28
|
+
new cdk.CfnResource(this, 'WaitHandle', {
|
|
29
|
+
type: 'AWS::CloudFormation::WaitConditionHandle',
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
new PassingStack(app, `${stackPrefix}-validate-passing`);
|
|
35
|
+
|
|
36
|
+
app.synth();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('deploy same docker asset to multiple stacks', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
5
|
+
await fixture.cdkDeploy(['docker-multi-dest-1', 'docker-multi-dest-2']);
|
|
6
|
+
}));
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1kb2NrZXItYXNzZXQtbXVsdGktZGVzdC5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstZGVwbG95LWRvY2tlci1hc3NldC1tdWx0aS1kZXN0LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE2RDtBQUU3RCxJQUFBLGVBQVMsRUFDUCw2Q0FBNkMsRUFDN0MsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2RlcGxveSBzYW1lIGRvY2tlciBhc3NldCB0byBtdWx0aXBsZSBzdGFja3MnLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveShbJ2RvY2tlci1tdWx0aS1kZXN0LTEnLCAnZG9ja2VyLW11bHRpLWRlc3QtMiddKTtcbiAgfSksXG4pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('deploy same docker asset to multiple regions', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
5
|
+
const primaryRegion = fixture.aws.region;
|
|
6
|
+
const availableRegions = (process.env.AWS_REGIONS ?? 'us-east-1,us-west-2').split(',');
|
|
7
|
+
const secondaryRegion = availableRegions.find((r) => r !== primaryRegion) ?? 'us-west-2';
|
|
8
|
+
// Bootstrap the secondary region
|
|
9
|
+
const account = await fixture.aws.account();
|
|
10
|
+
await fixture.cdk(['bootstrap', '--bootstrap-kms-key-id', 'AWS_MANAGED_KEY', `aws://${account}/${secondaryRegion}`], {
|
|
11
|
+
modEnv: { CDK_NEW_BOOTSTRAP: '1' },
|
|
12
|
+
});
|
|
13
|
+
// Deploy both stacks — same docker source, different target regions
|
|
14
|
+
await fixture.cdkDeploy(['docker-multi-region-1', 'docker-multi-region-2'], {
|
|
15
|
+
modEnv: { CDK_SECONDARY_REGION: secondaryRegion },
|
|
16
|
+
});
|
|
17
|
+
}));
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1kb2NrZXItYXNzZXQtbXVsdGktcmVnaW9uLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1kZXBsb3ktZG9ja2VyLWFzc2V0LW11bHRpLXJlZ2lvbi5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBNkQ7QUFFN0QsSUFBQSxlQUFTLEVBQ1AsOENBQThDLEVBQzlDLElBQUEsd0JBQWtCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ25DLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUM7SUFFekYsaUNBQWlDO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxPQUFPLElBQUksZUFBZSxFQUFFLENBQUMsRUFBRTtRQUNuSCxNQUFNLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7S0FDbkMsQ0FBQyxDQUFDO0lBRUgsb0VBQW9FO0lBQ3BFLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLHVCQUF1QixDQUFDLEVBQUU7UUFDMUUsTUFBTSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFO0tBQ2xELENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2RlcGxveSBzYW1lIGRvY2tlciBhc3NldCB0byBtdWx0aXBsZSByZWdpb25zJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgcHJpbWFyeVJlZ2lvbiA9IGZpeHR1cmUuYXdzLnJlZ2lvbjtcbiAgICBjb25zdCBhdmFpbGFibGVSZWdpb25zID0gKHByb2Nlc3MuZW52LkFXU19SRUdJT05TID8/ICd1cy1lYXN0LTEsdXMtd2VzdC0yJykuc3BsaXQoJywnKTtcbiAgICBjb25zdCBzZWNvbmRhcnlSZWdpb24gPSBhdmFpbGFibGVSZWdpb25zLmZpbmQoKHIpID0+IHIgIT09IHByaW1hcnlSZWdpb24pID8/ICd1cy13ZXN0LTInO1xuXG4gICAgLy8gQm9vdHN0cmFwIHRoZSBzZWNvbmRhcnkgcmVnaW9uXG4gICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGZpeHR1cmUuYXdzLmFjY291bnQoKTtcbiAgICBhd2FpdCBmaXh0dXJlLmNkayhbJ2Jvb3RzdHJhcCcsICctLWJvb3RzdHJhcC1rbXMta2V5LWlkJywgJ0FXU19NQU5BR0VEX0tFWScsIGBhd3M6Ly8ke2FjY291bnR9LyR7c2Vjb25kYXJ5UmVnaW9ufWBdLCB7XG4gICAgICBtb2RFbnY6IHsgQ0RLX05FV19CT09UU1RSQVA6ICcxJyB9LFxuICAgIH0pO1xuXG4gICAgLy8gRGVwbG95IGJvdGggc3RhY2tzIOKAlCBzYW1lIGRvY2tlciBzb3VyY2UsIGRpZmZlcmVudCB0YXJnZXQgcmVnaW9uc1xuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KFsnZG9ja2VyLW11bHRpLXJlZ2lvbi0xJywgJ2RvY2tlci1tdWx0aS1yZWdpb24tMiddLCB7XG4gICAgICBtb2RFbnY6IHsgQ0RLX1NFQ09OREFSWV9SRUdJT046IHNlY29uZGFyeVJlZ2lvbiB9LFxuICAgIH0pO1xuICB9KSxcbik7XG4iXX0=
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const lib_1 = require("../../../lib");
|
|
4
4
|
(0, lib_1.integTest)('cdk doctor displays diagnostic information', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
5
5
|
const output = await fixture.cdk(['doctor']);
|
|
6
|
-
expect(output).toContain('CDK Version');
|
|
6
|
+
expect(output).toContain('CDK CLI Version');
|
|
7
7
|
expect(output).toContain('AWS environment variables');
|
|
8
8
|
expect(output).toContain('CDK environment variables');
|
|
9
9
|
}));
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRvY3Rvci5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstZG9jdG9yLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE2RDtBQUU3RCxJQUFBLGVBQVMsRUFDUCw0Q0FBNEMsRUFDNUMsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgZG9jdG9yIGRpc3BsYXlzIGRpYWdub3N0aWMgaW5mb3JtYXRpb24nLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RvY3RvciddKTtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ0NESyBDTEkgVmVyc2lvbicpO1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignQVdTIGVudmlyb25tZW50IHZhcmlhYmxlcycpO1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignQ0RLIGVudmlyb25tZW50IHZhcmlhYmxlcycpO1xuICB9KSxcbik7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('cdk validate passes for clean app', (0, lib_1.withSpecificFixture)('validate-passing-app', async (fixture) => {
|
|
5
|
+
const output = await fixture.cdk(['--unstable=validate', 'validate', fixture.fullStackName('validate-passing')]);
|
|
6
|
+
expect(output).toContain('Policy validation passed. No problems found.');
|
|
7
|
+
}));
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLXBhc3Nlcy1jbGVhbi1hcHAuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLXZhbGlkYXRlLXBhc3Nlcy1jbGVhbi1hcHAuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUEsZUFBUyxFQUNQLG1DQUFtQyxFQUNuQyxJQUFBLHlCQUFtQixFQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUMvRSxDQUFDO0lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0FBQzNFLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhTcGVjaWZpY0ZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgdmFsaWRhdGUgcGFzc2VzIGZvciBjbGVhbiBhcHAnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCd2YWxpZGF0ZS1wYXNzaW5nLWFwcCcsIGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZml4dHVyZS5jZGsoXG4gICAgICBbJy0tdW5zdGFibGU9dmFsaWRhdGUnLCAndmFsaWRhdGUnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3ZhbGlkYXRlLXBhc3NpbmcnKV0sXG4gICAgKTtcblxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignUG9saWN5IHZhbGlkYXRpb24gcGFzc2VkLiBObyBwcm9ibGVtcyBmb3VuZC4nKTtcbiAgfSksXG4pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('cdk validate reports violations', (0, lib_1.withSpecificFixture)('validate-app', async (fixture) => {
|
|
5
|
+
const output = await fixture.cdk(['--unstable=validate', 'validate', fixture.fullStackName('validate')], {
|
|
6
|
+
allowErrExit: true,
|
|
7
|
+
});
|
|
8
|
+
// SecurityPlugin violations
|
|
9
|
+
expect(output).toContain('S3 Buckets must not be publicly accessible');
|
|
10
|
+
expect(output).toContain('S3 Buckets must have server-side encryption enabled');
|
|
11
|
+
expect(output).toContain('S3 Buckets should have versioning enabled for data protection');
|
|
12
|
+
expect(output).toContain('SecurityPlugin');
|
|
13
|
+
// Construct Annotations plugin picks up the addWarningV2
|
|
14
|
+
expect(output).toContain('This bucket has no lifecycle rules configured');
|
|
15
|
+
expect(output).toContain('Construct Annotations');
|
|
16
|
+
}));
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLXJlcG9ydHMtdmlvbGF0aW9ucy5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstdmFsaWRhdGUtcmVwb3J0cy12aW9sYXRpb25zLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE4RDtBQUU5RCxJQUFBLGVBQVMsRUFDUCxpQ0FBaUMsRUFDakMsSUFBQSx5QkFBbUIsRUFBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3BELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDOUIsQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUN0RTtRQUNFLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQ0YsQ0FBQztJQUVGLDRCQUE0QjtJQUM1QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDdkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUMxRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFM0MseURBQXlEO0lBQ3pELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMxRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aFNwZWNpZmljRml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2NkayB2YWxpZGF0ZSByZXBvcnRzIHZpb2xhdGlvbnMnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCd2YWxpZGF0ZS1hcHAnLCBhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrKFxuICAgICAgWyctLXVuc3RhYmxlPXZhbGlkYXRlJywgJ3ZhbGlkYXRlJywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCd2YWxpZGF0ZScpXSxcbiAgICAgIHtcbiAgICAgICAgYWxsb3dFcnJFeGl0OiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gU2VjdXJpdHlQbHVnaW4gdmlvbGF0aW9uc1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignUzMgQnVja2V0cyBtdXN0IG5vdCBiZSBwdWJsaWNseSBhY2Nlc3NpYmxlJyk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdTMyBCdWNrZXRzIG11c3QgaGF2ZSBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIGVuYWJsZWQnKTtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ1MzIEJ1Y2tldHMgc2hvdWxkIGhhdmUgdmVyc2lvbmluZyBlbmFibGVkIGZvciBkYXRhIHByb3RlY3Rpb24nKTtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ1NlY3VyaXR5UGx1Z2luJyk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgQW5ub3RhdGlvbnMgcGx1Z2luIHBpY2tzIHVwIHRoZSBhZGRXYXJuaW5nVjJcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ1RoaXMgYnVja2V0IGhhcyBubyBsaWZlY3ljbGUgcnVsZXMgY29uZmlndXJlZCcpO1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignQ29uc3RydWN0IEFubm90YXRpb25zJyk7XG4gIH0pLFxuKTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('cdk validate --no-online skips CloudFormation validation', (0, lib_1.withSpecificFixture)('validate-online-app', async (fixture) => {
|
|
5
|
+
// Deploy a stack that owns the bucket
|
|
6
|
+
await fixture.cdk(['deploy', '--require-approval=never', fixture.fullStackName('validate-online-deployed')]);
|
|
7
|
+
try {
|
|
8
|
+
// Validate with --no-online: the bucket name conflict should NOT be caught
|
|
9
|
+
const output = await fixture.cdk(['--unstable=validate', 'validate', '--no-online', fixture.fullStackName('validate-online-conflicting')], {
|
|
10
|
+
allowErrExit: true,
|
|
11
|
+
});
|
|
12
|
+
expect(output).not.toContain('already exists');
|
|
13
|
+
expect(output).not.toContain('CloudFormation');
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
await fixture.cdk(['destroy', '--force', fixture.fullStackName('validate-online-deployed')]);
|
|
17
|
+
}
|
|
18
|
+
}));
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLW5vLW9ubGluZS1za2lwcy1jZm4uaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLXZhbGlkYXRlLW5vLW9ubGluZS1za2lwcy1jZm4uaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUEsZUFBUyxFQUNQLDBEQUEwRCxFQUMxRCxJQUFBLHlCQUFtQixFQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUMzRCxzQ0FBc0M7SUFDdEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLENBQUMsUUFBUSxFQUFFLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUMxRixDQUFDO0lBRUYsSUFBSSxDQUFDO1FBQ0gsMkVBQTJFO1FBQzNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDOUIsQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxFQUN4RztZQUNFLFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQ0YsQ0FBQztRQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNqRCxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aFNwZWNpZmljRml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2NkayB2YWxpZGF0ZSAtLW5vLW9ubGluZSBza2lwcyBDbG91ZEZvcm1hdGlvbiB2YWxpZGF0aW9uJyxcbiAgd2l0aFNwZWNpZmljRml4dHVyZSgndmFsaWRhdGUtb25saW5lLWFwcCcsIGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgLy8gRGVwbG95IGEgc3RhY2sgdGhhdCBvd25zIHRoZSBidWNrZXRcbiAgICBhd2FpdCBmaXh0dXJlLmNkayhcbiAgICAgIFsnZGVwbG95JywgJy0tcmVxdWlyZS1hcHByb3ZhbD1uZXZlcicsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndmFsaWRhdGUtb25saW5lLWRlcGxveWVkJyldLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgd2l0aCAtLW5vLW9ubGluZTogdGhlIGJ1Y2tldCBuYW1lIGNvbmZsaWN0IHNob3VsZCBOT1QgYmUgY2F1Z2h0XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNkayhcbiAgICAgICAgWyctLXVuc3RhYmxlPXZhbGlkYXRlJywgJ3ZhbGlkYXRlJywgJy0tbm8tb25saW5lJywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCd2YWxpZGF0ZS1vbmxpbmUtY29uZmxpY3RpbmcnKV0sXG4gICAgICAgIHtcbiAgICAgICAgICBhbGxvd0VyckV4aXQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdhbHJlYWR5IGV4aXN0cycpO1xuICAgICAgZXhwZWN0KG91dHB1dCkubm90LnRvQ29udGFpbignQ2xvdWRGb3JtYXRpb24nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZml4dHVyZS5jZGsoWydkZXN0cm95JywgJy0tZm9yY2UnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3ZhbGlkYXRlLW9ubGluZS1kZXBsb3llZCcpXSk7XG4gICAgfVxuICB9KSxcbik7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('cdk validate --online catches bucket name conflict', (0, lib_1.withSpecificFixture)('validate-online-app', async (fixture) => {
|
|
5
|
+
// Deploy a stack that owns the bucket
|
|
6
|
+
await fixture.cdk(['deploy', '--require-approval=never', fixture.fullStackName('validate-online-deployed')]);
|
|
7
|
+
try {
|
|
8
|
+
// Now validate a stack that tries to create the same bucket name
|
|
9
|
+
const output = await fixture.cdk(['--unstable=validate', 'validate', '--online', fixture.fullStackName('validate-online-conflicting')], {
|
|
10
|
+
allowErrExit: true,
|
|
11
|
+
});
|
|
12
|
+
expect(output).toContain('CloudFormation');
|
|
13
|
+
expect(output).toContain('already exists');
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
await fixture.cdk(['destroy', '--force', fixture.fullStackName('validate-online-deployed')]);
|
|
17
|
+
}
|
|
18
|
+
}));
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLW9ubGluZS1jYXRjaGVzLWJ1Y2tldC1jb25mbGljdC5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstdmFsaWRhdGUtb25saW5lLWNhdGNoZXMtYnVja2V0LWNvbmZsaWN0LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE4RDtBQUU5RCxJQUFBLGVBQVMsRUFDUCxvREFBb0QsRUFDcEQsSUFBQSx5QkFBbUIsRUFBQyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDM0Qsc0NBQXNDO0lBQ3RDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixDQUFDLFFBQVEsRUFBRSwwQkFBMEIsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FDMUYsQ0FBQztJQUVGLElBQUksQ0FBQztRQUNILGlFQUFpRTtRQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFDckc7WUFDRSxZQUFZLEVBQUUsSUFBSTtTQUNuQixDQUNGLENBQUM7UUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoU3BlY2lmaWNGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnY2RrIHZhbGlkYXRlIC0tb25saW5lIGNhdGNoZXMgYnVja2V0IG5hbWUgY29uZmxpY3QnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCd2YWxpZGF0ZS1vbmxpbmUtYXBwJywgYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICAvLyBEZXBsb3kgYSBzdGFjayB0aGF0IG93bnMgdGhlIGJ1Y2tldFxuICAgIGF3YWl0IGZpeHR1cmUuY2RrKFxuICAgICAgWydkZXBsb3knLCAnLS1yZXF1aXJlLWFwcHJvdmFsPW5ldmVyJywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCd2YWxpZGF0ZS1vbmxpbmUtZGVwbG95ZWQnKV0sXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBOb3cgdmFsaWRhdGUgYSBzdGFjayB0aGF0IHRyaWVzIHRvIGNyZWF0ZSB0aGUgc2FtZSBidWNrZXQgbmFtZVxuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZml4dHVyZS5jZGsoXG4gICAgICAgIFsnLS11bnN0YWJsZT12YWxpZGF0ZScsICd2YWxpZGF0ZScsICctLW9ubGluZScsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndmFsaWRhdGUtb25saW5lLWNvbmZsaWN0aW5nJyldLFxuICAgICAgICB7XG4gICAgICAgICAgYWxsb3dFcnJFeGl0OiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdDbG91ZEZvcm1hdGlvbicpO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdhbHJlYWR5IGV4aXN0cycpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmaXh0dXJlLmNkayhbJ2Rlc3Ryb3knLCAnLS1mb3JjZScsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndmFsaWRhdGUtb25saW5lLWRlcGxveWVkJyldKTtcbiAgICB9XG4gIH0pLFxuKTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('cdk validate --online reports both offline and online errors', (0, lib_1.withSpecificFixture)('validate-online-app', async (fixture) => {
|
|
5
|
+
// Deploy a stack that owns the bucket
|
|
6
|
+
await fixture.cdk(['deploy', '--require-approval=never', fixture.fullStackName('validate-online-deployed')]);
|
|
7
|
+
try {
|
|
8
|
+
// Validate combined stack — has both a bucket (SecurityPlugin) and
|
|
9
|
+
// uses the same bucket name (CFN early validation conflict)
|
|
10
|
+
const output = await fixture.cdk(['--unstable=validate', 'validate', '--online', fixture.fullStackName('validate-online-combined')], {
|
|
11
|
+
allowErrExit: true,
|
|
12
|
+
});
|
|
13
|
+
// Offline: SecurityPlugin catches the S3 bucket
|
|
14
|
+
expect(output).toContain('S3 Buckets must not be publicly accessible');
|
|
15
|
+
expect(output).toContain('SecurityPlugin');
|
|
16
|
+
// Online: CloudFormation catches the bucket name conflict
|
|
17
|
+
expect(output).toContain('already exists');
|
|
18
|
+
expect(output).toContain('CloudFormation');
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
await fixture.cdk(['destroy', '--force', fixture.fullStackName('validate-online-deployed')]);
|
|
22
|
+
}
|
|
23
|
+
}));
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLW9ubGluZS1jb21iaW5lZC1vZmZsaW5lLWFuZC1vbmxpbmUuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLXZhbGlkYXRlLW9ubGluZS1jb21iaW5lZC1vZmZsaW5lLWFuZC1vbmxpbmUuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUEsZUFBUyxFQUNQLDhEQUE4RCxFQUM5RCxJQUFBLHlCQUFtQixFQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUMzRCxzQ0FBc0M7SUFDdEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLENBQUMsUUFBUSxFQUFFLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUMxRixDQUFDO0lBRUYsSUFBSSxDQUFDO1FBQ0gsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFDbEc7WUFDRSxZQUFZLEVBQUUsSUFBSTtTQUNuQixDQUNGLENBQUM7UUFFRixnREFBZ0Q7UUFDaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUzQywwREFBMEQ7UUFDMUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aFNwZWNpZmljRml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2NkayB2YWxpZGF0ZSAtLW9ubGluZSByZXBvcnRzIGJvdGggb2ZmbGluZSBhbmQgb25saW5lIGVycm9ycycsXG4gIHdpdGhTcGVjaWZpY0ZpeHR1cmUoJ3ZhbGlkYXRlLW9ubGluZS1hcHAnLCBhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIC8vIERlcGxveSBhIHN0YWNrIHRoYXQgb3ducyB0aGUgYnVja2V0XG4gICAgYXdhaXQgZml4dHVyZS5jZGsoXG4gICAgICBbJ2RlcGxveScsICctLXJlcXVpcmUtYXBwcm92YWw9bmV2ZXInLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3ZhbGlkYXRlLW9ubGluZS1kZXBsb3llZCcpXSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIGNvbWJpbmVkIHN0YWNrIOKAlCBoYXMgYm90aCBhIGJ1Y2tldCAoU2VjdXJpdHlQbHVnaW4pIGFuZFxuICAgICAgLy8gdXNlcyB0aGUgc2FtZSBidWNrZXQgbmFtZSAoQ0ZOIGVhcmx5IHZhbGlkYXRpb24gY29uZmxpY3QpXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNkayhcbiAgICAgICAgWyctLXVuc3RhYmxlPXZhbGlkYXRlJywgJ3ZhbGlkYXRlJywgJy0tb25saW5lJywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCd2YWxpZGF0ZS1vbmxpbmUtY29tYmluZWQnKV0sXG4gICAgICAgIHtcbiAgICAgICAgICBhbGxvd0VyckV4aXQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBPZmZsaW5lOiBTZWN1cml0eVBsdWdpbiBjYXRjaGVzIHRoZSBTMyBidWNrZXRcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignUzMgQnVja2V0cyBtdXN0IG5vdCBiZSBwdWJsaWNseSBhY2Nlc3NpYmxlJyk7XG4gICAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ1NlY3VyaXR5UGx1Z2luJyk7XG5cbiAgICAgIC8vIE9ubGluZTogQ2xvdWRGb3JtYXRpb24gY2F0Y2hlcyB0aGUgYnVja2V0IG5hbWUgY29uZmxpY3RcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignQ2xvdWRGb3JtYXRpb24nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZml4dHVyZS5jZGsoWydkZXN0cm95JywgJy0tZm9yY2UnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3ZhbGlkYXRlLW9ubGluZS1kZXBsb3llZCcpXSk7XG4gICAgfVxuICB9KSxcbik7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/tests/cli-integ-tests/validate-online/cdk-validate-online-passes-valid-template.integtest.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lib_1 = require("../../../lib");
|
|
4
|
+
(0, lib_1.integTest)('cdk validate --online passes for valid template', (0, lib_1.withSpecificFixture)('validate-online-app', async (fixture) => {
|
|
5
|
+
const output = await fixture.cdk(['--unstable=validate', 'validate', '--online', fixture.fullStackName('validate-online-valid')]);
|
|
6
|
+
expect(output).toContain('No problems found');
|
|
7
|
+
}));
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLW9ubGluZS1wYXNzZXMtdmFsaWQtdGVtcGxhdGUuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLXZhbGlkYXRlLW9ubGluZS1wYXNzZXMtdmFsaWQtdGVtcGxhdGUuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUEsZUFBUyxFQUNQLGlEQUFpRCxFQUNqRCxJQUFBLHlCQUFtQixFQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FDaEcsQ0FBQztJQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoU3BlY2lmaWNGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnY2RrIHZhbGlkYXRlIC0tb25saW5lIHBhc3NlcyBmb3IgdmFsaWQgdGVtcGxhdGUnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCd2YWxpZGF0ZS1vbmxpbmUtYXBwJywgYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNkayhcbiAgICAgIFsnLS11bnN0YWJsZT12YWxpZGF0ZScsICd2YWxpZGF0ZScsICctLW9ubGluZScsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndmFsaWRhdGUtb25saW5lLXZhbGlkJyldLFxuICAgICk7XG5cbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ05vIHByb2JsZW1zIGZvdW5kJyk7XG4gIH0pLFxuKTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
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)('multiple deploys track their failures', (0, lib_1.withSpecificFixture)('diagnose-app', async (fixture) => {
|
|
7
|
+
const telemetryFile = path.join(fixture.integTestDir, 'telemetry.json');
|
|
8
|
+
// Deploy a stack that will fail (IAM Policy without PolicyDocument)
|
|
9
|
+
await fixture.cdkDeploy('diagnose-deploy-fail', {
|
|
10
|
+
allowErrExit: true,
|
|
11
|
+
telemetryFile,
|
|
12
|
+
});
|
|
13
|
+
await fixture.cdkDeploy('diagnose-deploy-fail', {
|
|
14
|
+
allowErrExit: true,
|
|
15
|
+
telemetryFile,
|
|
16
|
+
});
|
|
17
|
+
// Should see a DEPLOY event with sequentialDeploymentFailures: 2
|
|
18
|
+
const json = fs.readJSONSync(telemetryFile);
|
|
19
|
+
expect(json).toEqual([
|
|
20
|
+
expect.objectContaining({
|
|
21
|
+
event: expect.objectContaining({
|
|
22
|
+
eventType: 'SYNTH',
|
|
23
|
+
}),
|
|
24
|
+
}),
|
|
25
|
+
expect.objectContaining({
|
|
26
|
+
event: expect.objectContaining({
|
|
27
|
+
eventType: 'ASSET',
|
|
28
|
+
}),
|
|
29
|
+
}),
|
|
30
|
+
expect.objectContaining({
|
|
31
|
+
event: expect.objectContaining({
|
|
32
|
+
eventType: 'DEPLOY',
|
|
33
|
+
}),
|
|
34
|
+
counters: expect.objectContaining({
|
|
35
|
+
sequentialDeploymentFailures: 2,
|
|
36
|
+
}),
|
|
37
|
+
}),
|
|
38
|
+
expect.objectContaining({
|
|
39
|
+
event: expect.objectContaining({
|
|
40
|
+
eventType: 'INVOKE',
|
|
41
|
+
}),
|
|
42
|
+
}),
|
|
43
|
+
]);
|
|
44
|
+
}));
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1zZXF1ZW50aWFsLWVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1kZXBsb3ktc2VxdWVudGlhbC1lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLG1DQUEyRDtBQUUzRCxJQUFBLGVBQVMsRUFDUCx1Q0FBdUMsRUFDdkMsSUFBQSx5QkFBbUIsRUFBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3BELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXhFLG9FQUFvRTtJQUNwRSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUU7UUFDOUMsWUFBWSxFQUFFLElBQUk7UUFDbEIsYUFBYTtLQUNkLENBQUMsQ0FBQztJQUVILE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRTtRQUM5QyxZQUFZLEVBQUUsSUFBSTtRQUNsQixhQUFhO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsaUVBQWlFO0lBQ2pFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNuQixNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDdEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDN0IsU0FBUyxFQUFFLE9BQU87YUFDbkIsQ0FBQztTQUNILENBQUM7UUFDRixNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDdEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDN0IsU0FBUyxFQUFFLE9BQU87YUFDbkIsQ0FBQztTQUNILENBQUM7UUFDRixNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDdEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDN0IsU0FBUyxFQUFFLFFBQVE7YUFDcEIsQ0FBQztZQUNGLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2hDLDRCQUE0QixFQUFFLENBQUM7YUFDaEMsQ0FBQztTQUNILENBQUM7UUFDRixNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDdEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDN0IsU0FBUyxFQUFFLFFBQVE7YUFDcEIsQ0FBQztTQUNILENBQUM7S0FDSCxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aFNwZWNpZmljRml4dHVyZSB9IGZyb20gJy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ211bHRpcGxlIGRlcGxveXMgdHJhY2sgdGhlaXIgZmFpbHVyZXMnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCdkaWFnbm9zZS1hcHAnLCBhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUZpbGUgPSBwYXRoLmpvaW4oZml4dHVyZS5pbnRlZ1Rlc3REaXIsICd0ZWxlbWV0cnkuanNvbicpO1xuXG4gICAgLy8gRGVwbG95IGEgc3RhY2sgdGhhdCB3aWxsIGZhaWwgKElBTSBQb2xpY3kgd2l0aG91dCBQb2xpY3lEb2N1bWVudClcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZGlhZ25vc2UtZGVwbG95LWZhaWwnLCB7XG4gICAgICBhbGxvd0VyckV4aXQ6IHRydWUsXG4gICAgICB0ZWxlbWV0cnlGaWxlLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RpYWdub3NlLWRlcGxveS1mYWlsJywge1xuICAgICAgYWxsb3dFcnJFeGl0OiB0cnVlLFxuICAgICAgdGVsZW1ldHJ5RmlsZSxcbiAgICB9KTtcblxuICAgIC8vIFNob3VsZCBzZWUgYSBERVBMT1kgZXZlbnQgd2l0aCBzZXF1ZW50aWFsRGVwbG95bWVudEZhaWx1cmVzOiAyXG4gICAgY29uc3QganNvbiA9IGZzLnJlYWRKU09OU3luYyh0ZWxlbWV0cnlGaWxlKTtcbiAgICBleHBlY3QoanNvbikudG9FcXVhbChbXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGV2ZW50OiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnU1lOVEgnLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBldmVudDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ0FTU0VUJyxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgZXZlbnQ6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBldmVudFR5cGU6ICdERVBMT1knLFxuICAgICAgICB9KSxcbiAgICAgICAgY291bnRlcnM6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBzZXF1ZW50aWFsRGVwbG95bWVudEZhaWx1cmVzOiAyLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBldmVudDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ0lOVk9LRScsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgXSk7XG4gIH0pLFxuKTtcbiJdfQ==
|