@aws-cdk-testing/cli-integ 2.61.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.
Files changed (165) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +16 -0
  3. package/README.md +151 -0
  4. package/bin/apply-patches +19 -0
  5. package/bin/download-and-run-old-tests +52 -0
  6. package/bin/query-github +2 -0
  7. package/bin/query-github.d.ts +1 -0
  8. package/bin/query-github.js +55 -0
  9. package/bin/run-suite +2 -0
  10. package/bin/run-suite.d.ts +1 -0
  11. package/bin/run-suite.js +126 -0
  12. package/bin/stage-distribution +2 -0
  13. package/bin/stage-distribution.d.ts +1 -0
  14. package/bin/stage-distribution.js +209 -0
  15. package/bin/test-root +2 -0
  16. package/bin/test-root.d.ts +1 -0
  17. package/bin/test-root.js +6 -0
  18. package/entrypoints/test-cli-regression-against-current-code.sh +11 -0
  19. package/entrypoints/test-cli-regression-against-latest-release.sh +11 -0
  20. package/entrypoints/test-cli-regression.bash +83 -0
  21. package/entrypoints/test.sh +12 -0
  22. package/lib/aws.d.ts +55 -0
  23. package/lib/aws.js +243 -0
  24. package/lib/corking.d.ts +13 -0
  25. package/lib/corking.js +34 -0
  26. package/lib/files.d.ts +15 -0
  27. package/lib/files.js +80 -0
  28. package/lib/github.d.ts +4 -0
  29. package/lib/github.js +43 -0
  30. package/lib/index.d.ts +12 -0
  31. package/lib/index.js +25 -0
  32. package/lib/integ-test.d.ts +11 -0
  33. package/lib/integ-test.js +55 -0
  34. package/lib/lists.d.ts +1 -0
  35. package/lib/lists.js +12 -0
  36. package/lib/memoize.d.ts +6 -0
  37. package/lib/memoize.js +19 -0
  38. package/lib/npm.d.ts +4 -0
  39. package/lib/npm.js +15 -0
  40. package/lib/package-sources/release-source.d.ts +22 -0
  41. package/lib/package-sources/release-source.js +67 -0
  42. package/lib/package-sources/repo-source.d.ts +23 -0
  43. package/lib/package-sources/repo-source.js +92 -0
  44. package/lib/package-sources/repo-tools/npm +2 -0
  45. package/lib/package-sources/repo-tools/npm.d.ts +1 -0
  46. package/lib/package-sources/repo-tools/npm.js +42 -0
  47. package/lib/package-sources/source.d.ts +24 -0
  48. package/lib/package-sources/source.js +3 -0
  49. package/lib/package-sources/subprocess.d.ts +3 -0
  50. package/lib/package-sources/subprocess.js +18 -0
  51. package/lib/resource-pool.d.ts +54 -0
  52. package/lib/resource-pool.js +120 -0
  53. package/lib/resources.d.ts +1 -0
  54. package/lib/resources.js +6 -0
  55. package/lib/shell.d.ts +59 -0
  56. package/lib/shell.js +118 -0
  57. package/lib/staging/codeartifact.d.ts +44 -0
  58. package/lib/staging/codeartifact.js +258 -0
  59. package/lib/staging/maven.d.ts +5 -0
  60. package/lib/staging/maven.js +83 -0
  61. package/lib/staging/npm.d.ts +4 -0
  62. package/lib/staging/npm.js +56 -0
  63. package/lib/staging/nuget.d.ts +4 -0
  64. package/lib/staging/nuget.js +71 -0
  65. package/lib/staging/parallel-shell.d.ts +6 -0
  66. package/lib/staging/parallel-shell.js +46 -0
  67. package/lib/staging/pypi.d.ts +4 -0
  68. package/lib/staging/pypi.js +49 -0
  69. package/lib/staging/usage-dir.d.ts +31 -0
  70. package/lib/staging/usage-dir.js +87 -0
  71. package/lib/with-aws.d.ts +13 -0
  72. package/lib/with-aws.js +60 -0
  73. package/lib/with-cdk-app.d.ts +146 -0
  74. package/lib/with-cdk-app.js +398 -0
  75. package/lib/with-packages.d.ts +5 -0
  76. package/lib/with-packages.js +14 -0
  77. package/lib/with-sam.d.ts +33 -0
  78. package/lib/with-sam.js +240 -0
  79. package/lib/with-temporary-directory.d.ts +5 -0
  80. package/lib/with-temporary-directory.js +32 -0
  81. package/lib/xpmutex.d.ts +43 -0
  82. package/lib/xpmutex.js +207 -0
  83. package/package.json +73 -0
  84. package/resources/cdk-apps/app/app.js +463 -0
  85. package/resources/cdk-apps/app/cdk.json +7 -0
  86. package/resources/cdk-apps/app/docker/Dockerfile +2 -0
  87. package/resources/cdk-apps/app/docker/Dockerfile.Custom +2 -0
  88. package/resources/cdk-apps/app/lambda/index.js +4 -0
  89. package/resources/cdk-apps/app/lambda/response.json +3 -0
  90. package/resources/cdk-apps/app/nested-stack.js +49 -0
  91. package/resources/cdk-apps/cfn-include-app/.gitignore +1 -0
  92. package/resources/cdk-apps/cfn-include-app/cdk.json +4 -0
  93. package/resources/cdk-apps/cfn-include-app/cfn-include-app.js +21 -0
  94. package/resources/cdk-apps/cfn-include-app/example-template.json +13 -0
  95. package/resources/cdk-apps/sam_cdk_integ_app/bin/test-app.js +11 -0
  96. package/resources/cdk-apps/sam_cdk_integ_app/cdk.json +6 -0
  97. package/resources/cdk-apps/sam_cdk_integ_app/lib/nested-stack.js +19 -0
  98. package/resources/cdk-apps/sam_cdk_integ_app/lib/test-stack.js +134 -0
  99. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/.no-packagejson-validator +0 -0
  100. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/Dockerfile +9 -0
  101. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/app.js +22 -0
  102. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/package.json +18 -0
  103. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.mod +5 -0
  104. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.sum +17 -0
  105. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/main.go +17 -0
  106. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/.no-packagejson-validator +0 -0
  107. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/app.ts +16 -0
  108. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package-lock.json +12 -0
  109. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package.json +5 -0
  110. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/app.py +15 -0
  111. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/requirements.txt +1 -0
  112. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/layer_version_dependency.py +5 -0
  113. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/requirements.txt +1 -0
  114. package/resources/cdk-apps/sam_cdk_integ_app/src/rest-api-definition.yaml +12 -0
  115. package/resources/cli-regression-patches/v1.119.0/NOTES.md +5 -0
  116. package/resources/cli-regression-patches/v1.119.0/cli.integtest.js +659 -0
  117. package/resources/cli-regression-patches/v1.130.0/NOTES.md +12 -0
  118. package/resources/cli-regression-patches/v1.130.0/app/app.js +378 -0
  119. package/resources/cli-regression-patches/v1.130.0/bootstrapping.integtest.js +220 -0
  120. package/resources/cli-regression-patches/v1.44.0/NOTES.md +18 -0
  121. package/resources/cli-regression-patches/v1.44.0/bootstrapping.integtest.js +126 -0
  122. package/resources/cli-regression-patches/v1.44.0/test.sh +26 -0
  123. package/resources/cli-regression-patches/v1.61.1/NOTES.md +2 -0
  124. package/resources/cli-regression-patches/v1.61.1/skip-tests.txt +16 -0
  125. package/resources/cli-regression-patches/v1.62.0/NOTES.md +2 -0
  126. package/resources/cli-regression-patches/v1.62.0/aws-helpers.js +245 -0
  127. package/resources/cli-regression-patches/v1.63.0/NOTES.md +1 -0
  128. package/resources/cli-regression-patches/v1.63.0/skip-tests.txt +7 -0
  129. package/resources/cli-regression-patches/v1.64.0/NOTES.md +3 -0
  130. package/resources/cli-regression-patches/v1.64.0/cdk-helpers.js +325 -0
  131. package/resources/cli-regression-patches/v1.64.0/cli.integtest.js +599 -0
  132. package/resources/cli-regression-patches/v1.64.1/NOTES.md +3 -0
  133. package/resources/cli-regression-patches/v1.64.1/cdk-helpers.js +324 -0
  134. package/resources/cli-regression-patches/v1.64.1/cli.integtest.js +599 -0
  135. package/resources/cli-regression-patches/v1.67.0/NOTES.md +2 -0
  136. package/resources/cli-regression-patches/v1.67.0/cdk-helpers.js +331 -0
  137. package/resources/cloud-assemblies/0.36.0/InitStack.template.json +1 -0
  138. package/resources/cloud-assemblies/0.36.0/manifest.json +19 -0
  139. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/InitStack.template.json +2 -0
  140. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/manifest.json.js +37 -0
  141. package/resources/cloud-assemblies/1.10.0-request-azs/InitStack.template.json +2 -0
  142. package/resources/cloud-assemblies/1.10.0-request-azs/manifest.json.js +34 -0
  143. package/resources/integ.jest.config.js +25 -0
  144. package/skip-tests.txt +8 -0
  145. package/tests/cli-integ-tests/README.md +47 -0
  146. package/tests/cli-integ-tests/bootstrapping.integtest.d.ts +1 -0
  147. package/tests/cli-integ-tests/bootstrapping.integtest.js +271 -0
  148. package/tests/cli-integ-tests/cli.integtest.d.ts +1 -0
  149. package/tests/cli-integ-tests/cli.integtest.js +1029 -0
  150. package/tests/init-csharp/init-csharp.integtest.d.ts +1 -0
  151. package/tests/init-csharp/init-csharp.integtest.js +14 -0
  152. package/tests/init-fsharp/init-fsharp.integtest.d.ts +1 -0
  153. package/tests/init-fsharp/init-fsharp.integtest.js +14 -0
  154. package/tests/init-java/init-java.integtest.d.ts +1 -0
  155. package/tests/init-java/init-java.integtest.js +14 -0
  156. package/tests/init-javascript/init-javascript.integtest.d.ts +1 -0
  157. package/tests/init-javascript/init-javascript.integtest.js +15 -0
  158. package/tests/init-python/init-python.integtest.d.ts +1 -0
  159. package/tests/init-python/init-python.integtest.js +19 -0
  160. package/tests/init-typescript-app/init-typescript-app.integtest.d.ts +1 -0
  161. package/tests/init-typescript-app/init-typescript-app.integtest.js +49 -0
  162. package/tests/init-typescript-lib/init-typescript-lib.integtest.d.ts +1 -0
  163. package/tests/init-typescript-lib/init-typescript-lib.integtest.js +13 -0
  164. package/tests/uberpackage/uberpackage.integtest.d.ts +1 -0
  165. package/tests/uberpackage/uberpackage.integtest.js +11 -0
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@aws-cdk-testing/cli-integ",
3
+ "description": "Integration tests for the AWS CDK CLI",
4
+ "version": "2.61.0",
5
+ "bin": {
6
+ "run-suite": "bin/run-suite",
7
+ "download-and-run-old-tests": "bin/download-and-run-old-tests",
8
+ "query-github": "bin/query-github",
9
+ "apply-patches": "bin/apply-patches",
10
+ "test-root": "bin/test-root",
11
+ "stage-distribution": "bin/stage-distribution"
12
+ },
13
+ "scripts": {
14
+ "build": "cdk-build",
15
+ "watch": "cdk-watch",
16
+ "lint": "cdk-lint",
17
+ "pkglint": "pkglint -f",
18
+ "test": "cdk-test",
19
+ "package": "cdk-package",
20
+ "build+test": "yarn build && yarn test",
21
+ "build+extract": "yarn build",
22
+ "build+test+package": "yarn build+test && yarn package",
23
+ "build+test+extract": "yarn build+test"
24
+ },
25
+ "author": {
26
+ "name": "Amazon Web Services",
27
+ "url": "https://aws.amazon.com",
28
+ "organization": true
29
+ },
30
+ "license": "Apache-2.0",
31
+ "devDependencies": {
32
+ "@types/node": "^14.18.31",
33
+ "@aws-cdk/cdk-build-tools": "2.61.0",
34
+ "@types/semver": "^7.3.12",
35
+ "@types/yargs": "^17.0.13",
36
+ "@types/fs-extra": "^9.0.0",
37
+ "@types/glob": "^7.2.0",
38
+ "@types/npm": "^7.19.0",
39
+ "@aws-cdk/pkglint": "2.61.0"
40
+ },
41
+ "dependencies": {
42
+ "@octokit/rest": "^18.12.0",
43
+ "jest": "^27.5.1",
44
+ "aws-sdk": "^2.1211.0",
45
+ "axios": "^0.27.2",
46
+ "jest-junit": "^14.0.0",
47
+ "semver": "^7.3.8",
48
+ "ts-mock-imports": "^1.3.8",
49
+ "yargs": "^17.5.0",
50
+ "glob": "^7.2.3",
51
+ "p-queue": "^6.6.2",
52
+ "fs-extra": "^9.1.0",
53
+ "npm": "^8.11.0"
54
+ },
55
+ "repository": {
56
+ "url": "https://github.com/aws/aws-cdk.git",
57
+ "type": "git",
58
+ "directory": "packages/@aws-cdk-testing/cli-integ"
59
+ },
60
+ "keywords": [
61
+ "aws",
62
+ "cdk"
63
+ ],
64
+ "homepage": "https://github.com/aws/aws-cdk",
65
+ "engines": {
66
+ "node": ">= 14.15.0"
67
+ },
68
+ "stability": "experimental",
69
+ "maturity": "experimental",
70
+ "publishConfig": {
71
+ "tag": "latest"
72
+ }
73
+ }
@@ -0,0 +1,463 @@
1
+ const path = require('path');
2
+
3
+ var constructs = require('constructs');
4
+ if (process.env.PACKAGE_LAYOUT_VERSION === '1') {
5
+ var cdk = require('@aws-cdk/core');
6
+ var ec2 = require('@aws-cdk/aws-ec2');
7
+ var s3 = require('@aws-cdk/aws-s3');
8
+ var ssm = require('@aws-cdk/aws-ssm');
9
+ var iam = require('@aws-cdk/aws-iam');
10
+ var sns = require('@aws-cdk/aws-sns');
11
+ var sqs = require('@aws-cdk/aws-sqs');
12
+ var lambda = require('@aws-cdk/aws-lambda');
13
+ var docker = require('@aws-cdk/aws-ecr-assets');
14
+ } else {
15
+ var cdk = require('aws-cdk-lib');
16
+ var {
17
+ aws_ec2: ec2,
18
+ aws_s3: s3,
19
+ aws_ssm: ssm,
20
+ aws_iam: iam,
21
+ aws_sns: sns,
22
+ aws_sqs: sqs,
23
+ aws_lambda: lambda,
24
+ aws_ecr_assets: docker
25
+ } = require('aws-cdk-lib');
26
+ }
27
+
28
+ const { Annotations } = cdk;
29
+ const { StackWithNestedStack, StackWithNestedStackUsingParameters } = require('./nested-stack');
30
+
31
+ const stackPrefix = process.env.STACK_NAME_PREFIX;
32
+ if (!stackPrefix) {
33
+ throw new Error(`the STACK_NAME_PREFIX environment variable is required`);
34
+ }
35
+
36
+ class MyStack extends cdk.Stack {
37
+ constructor(parent, id, props) {
38
+ super(parent, id, props);
39
+ new sns.Topic(this, 'topic');
40
+
41
+ if (cdk.AvailabilityZoneProvider) { // <= 0.34.0
42
+ new cdk.AvailabilityZoneProvider(this).availabilityZones;
43
+ } else if (cdk.Context) { // <= 0.35.0
44
+ cdk.Context.getAvailabilityZones(this);
45
+ } else {
46
+ this.availabilityZones;
47
+ }
48
+
49
+ const parameterName = '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2';
50
+ getSsmParameterValue(this, parameterName);
51
+ }
52
+ }
53
+
54
+ function getSsmParameterValue(scope, parameterName) {
55
+ return ssm.StringParameter.valueFromLookup(scope, parameterName);
56
+ }
57
+
58
+ class YourStack extends cdk.Stack {
59
+ constructor(parent, id, props) {
60
+ super(parent, id, props);
61
+ new sns.Topic(this, 'topic1');
62
+ new sns.Topic(this, 'topic2');
63
+ }
64
+ }
65
+
66
+ class ImportableStack extends cdk.Stack {
67
+ constructor(parent, id, props) {
68
+ super(parent, id, props);
69
+
70
+ if (!process.env.OMIT_TOPIC) {
71
+ const queue = new sqs.Queue(this, 'Queue', {
72
+ removalPolicy: process.env.ORPHAN_TOPIC ? cdk.RemovalPolicy.RETAIN : cdk.RemovalPolicy.DESTROY,
73
+ });
74
+
75
+ new cdk.CfnOutput(this, 'QueueName', {
76
+ value: queue.queueName,
77
+ });
78
+ new cdk.CfnOutput(this, 'QueueLogicalId', {
79
+ value: queue.node.defaultChild.logicalId,
80
+ });
81
+ }
82
+
83
+ new cdk.CfnWaitConditionHandle(this, 'Handle');
84
+ }
85
+ }
86
+
87
+ class StackUsingContext extends cdk.Stack {
88
+ constructor(parent, id, props) {
89
+ super(parent, id, props);
90
+ new cdk.CfnResource(this, 'Handle', {
91
+ type: 'AWS::CloudFormation::WaitConditionHandle'
92
+ });
93
+
94
+ new cdk.CfnOutput(this, 'Output', {
95
+ value: this.availabilityZones[0],
96
+ });
97
+ }
98
+ }
99
+
100
+ class ParameterStack extends cdk.Stack {
101
+ constructor(parent, id, props) {
102
+ super(parent, id, props);
103
+
104
+ new sns.Topic(this, 'TopicParameter', {
105
+ topicName: new cdk.CfnParameter(this, 'TopicNameParam').valueAsString
106
+ });
107
+ }
108
+ }
109
+
110
+ class OtherParameterStack extends cdk.Stack {
111
+ constructor(parent, id, props) {
112
+ super(parent, id, props);
113
+
114
+ new sns.Topic(this, 'TopicParameter', {
115
+ topicName: new cdk.CfnParameter(this, 'OtherTopicNameParam').valueAsString
116
+ });
117
+ }
118
+ }
119
+
120
+ class MultiParameterStack extends cdk.Stack {
121
+ constructor(parent, id, props) {
122
+ super(parent, id, props);
123
+
124
+ new sns.Topic(this, 'TopicParameter', {
125
+ displayName: new cdk.CfnParameter(this, 'DisplayNameParam').valueAsString
126
+ });
127
+ new sns.Topic(this, 'OtherTopicParameter', {
128
+ displayName: new cdk.CfnParameter(this, 'OtherDisplayNameParam').valueAsString
129
+ });
130
+ }
131
+ }
132
+
133
+ class OutputsStack extends cdk.Stack {
134
+ constructor(parent, id, props) {
135
+ super(parent, id, props);
136
+
137
+ const topic = new sns.Topic(this, 'MyOutput', {
138
+ topicName: `${cdk.Stack.of(this).stackName}MyTopic`
139
+ });
140
+
141
+ new cdk.CfnOutput(this, 'TopicName', {
142
+ value: topic.topicName
143
+ })
144
+ }
145
+ }
146
+
147
+ class AnotherOutputsStack extends cdk.Stack {
148
+ constructor(parent, id, props) {
149
+ super(parent, id, props);
150
+
151
+ const topic = new sns.Topic(this, 'MyOtherOutput', {
152
+ topicName: `${cdk.Stack.of(this).stackName}MyOtherTopic`
153
+ });
154
+
155
+ new cdk.CfnOutput(this, 'TopicName', {
156
+ value: topic.topicName
157
+ });
158
+ }
159
+ }
160
+
161
+ class IamStack extends cdk.Stack {
162
+ constructor(parent, id, props) {
163
+ super(parent, id, props);
164
+
165
+ new iam.Role(this, 'SomeRole', {
166
+ assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com')
167
+ });
168
+ }
169
+ }
170
+
171
+ class ProvidingStack extends cdk.Stack {
172
+ constructor(parent, id, props) {
173
+ super(parent, id, props);
174
+
175
+ this.topic = new sns.Topic(this, 'BogusTopic'); // Some filler
176
+ }
177
+ }
178
+
179
+ class StackWithError extends cdk.Stack {
180
+ constructor(parent, id, props) {
181
+ super(parent, id, props);
182
+
183
+ this.topic = new sns.Topic(this, 'BogusTopic'); // Some filler
184
+ Annotations.of(this).addError('This is an error');
185
+ }
186
+ }
187
+
188
+ class StageWithError extends cdk.Stage {
189
+ constructor(parent, id, props) {
190
+ super(parent, id, props);
191
+
192
+ new StackWithError(this, 'Stack');
193
+ }
194
+ }
195
+
196
+ class ConsumingStack extends cdk.Stack {
197
+ constructor(parent, id, props) {
198
+ super(parent, id, props);
199
+
200
+ new sns.Topic(this, 'BogusTopic'); // Some filler
201
+ new cdk.CfnOutput(this, 'IConsumedSomething', { value: props.providingStack.topic.topicArn });
202
+ }
203
+ }
204
+
205
+ class MissingSSMParameterStack extends cdk.Stack {
206
+ constructor(parent, id, props) {
207
+ super(parent, id, props);
208
+
209
+ const parameterName = constructs.Node.of(this).tryGetContext('test:ssm-parameter-name');
210
+ if (parameterName) {
211
+ const param = getSsmParameterValue(this, parameterName);
212
+ new iam.Role(this, 'PhonyRole', { assumedBy: new iam.AccountPrincipal(param) });
213
+ }
214
+ }
215
+ }
216
+
217
+ class LambdaStack extends cdk.Stack {
218
+ constructor(parent, id, props) {
219
+ super(parent, id, props);
220
+
221
+ const fn = new lambda.Function(this, 'my-function', {
222
+ code: lambda.Code.asset(path.join(__dirname, 'lambda')),
223
+ runtime: lambda.Runtime.NODEJS_14_X,
224
+ handler: 'index.handler'
225
+ });
226
+
227
+ new cdk.CfnOutput(this, 'FunctionArn', { value: fn.functionArn });
228
+ }
229
+ }
230
+
231
+ class LambdaHotswapStack extends cdk.Stack {
232
+ constructor(parent, id, props) {
233
+ super(parent, id, props);
234
+
235
+ const fn = new lambda.Function(this, 'my-function', {
236
+ code: lambda.Code.asset(path.join(__dirname, 'lambda')),
237
+ runtime: lambda.Runtime.NODEJS_14_X,
238
+ handler: 'index.handler',
239
+ description: process.env.DYNAMIC_LAMBDA_PROPERTY_VALUE ?? "description",
240
+ environment: {
241
+ SomeVariable: process.env.DYNAMIC_LAMBDA_PROPERTY_VALUE ?? "environment",
242
+ }
243
+ });
244
+
245
+ new cdk.CfnOutput(this, 'FunctionName', { value: fn.functionName });
246
+ }
247
+ }
248
+
249
+ class DockerStack extends cdk.Stack {
250
+ constructor(parent, id, props) {
251
+ super(parent, id, props);
252
+
253
+ new docker.DockerImageAsset(this, 'image', {
254
+ directory: path.join(__dirname, 'docker')
255
+ });
256
+
257
+ // Add at least a single resource (WaitConditionHandle), otherwise this stack will never
258
+ // be deployed (and its assets never built)
259
+ new cdk.CfnResource(this, 'Handle', {
260
+ type: 'AWS::CloudFormation::WaitConditionHandle'
261
+ });
262
+ }
263
+ }
264
+
265
+ class DockerStackWithCustomFile extends cdk.Stack {
266
+ constructor(parent, id, props) {
267
+ super(parent, id, props);
268
+
269
+ new docker.DockerImageAsset(this, 'image', {
270
+ directory: path.join(__dirname, 'docker'),
271
+ file: 'Dockerfile.Custom'
272
+ });
273
+
274
+ // Add at least a single resource (WaitConditionHandle), otherwise this stack will never
275
+ // be deployed (and its assets never built)
276
+ new cdk.CfnResource(this, 'Handle', {
277
+ type: 'AWS::CloudFormation::WaitConditionHandle'
278
+ });
279
+ }
280
+ }
281
+
282
+ /**
283
+ * A stack that will never succeed deploying (done in a way that CDK cannot detect but CFN will complain about)
284
+ */
285
+ class FailedStack extends cdk.Stack {
286
+
287
+ constructor(parent, id, props) {
288
+ super(parent, id, props);
289
+
290
+ // fails on 'Property PolicyDocument cannot be empty'.
291
+ new cdk.CfnResource(this, 'EmptyPolicy', {
292
+ type: 'AWS::IAM::Policy'
293
+ })
294
+
295
+ }
296
+
297
+ }
298
+
299
+ const VPC_TAG_NAME = 'custom-tag';
300
+ const VPC_TAG_VALUE = `${stackPrefix}-bazinga!`;
301
+
302
+ class DefineVpcStack extends cdk.Stack {
303
+ constructor(parent, id, props) {
304
+ super(parent, id, props);
305
+
306
+ const vpc = new ec2.Vpc(this, 'VPC', {
307
+ maxAzs: 1,
308
+ })
309
+ cdk.Aspects.of(vpc).add(new cdk.Tag(VPC_TAG_NAME, VPC_TAG_VALUE));
310
+ }
311
+ }
312
+
313
+ class ImportVpcStack extends cdk.Stack {
314
+ constructor(parent, id, props) {
315
+ super(parent, id, props);
316
+
317
+ ec2.Vpc.fromLookup(this, 'DefaultVPC', { isDefault: true });
318
+ ec2.Vpc.fromLookup(this, 'ByTag', { tags: { [VPC_TAG_NAME]: VPC_TAG_VALUE } });
319
+ }
320
+ }
321
+
322
+ class ConditionalResourceStack extends cdk.Stack {
323
+ constructor(parent, id, props) {
324
+ super(parent, id, props);
325
+
326
+ if (!process.env.NO_RESOURCE) {
327
+ new iam.User(this, 'User');
328
+ }
329
+ }
330
+ }
331
+
332
+ class BundlingStage extends cdk.Stage {
333
+ constructor(parent, id, props) {
334
+ super(parent, id, props);
335
+ const stack = new cdk.Stack(this, 'BundlingStack');
336
+
337
+ new lambda.Function(stack, 'Handler', {
338
+ code: lambda.Code.fromAsset(path.join(__dirname, 'lambda')),
339
+ handler: 'index.handler',
340
+ runtime: lambda.Runtime.NODEJS_16_X,
341
+ });
342
+ }
343
+ }
344
+
345
+ class SomeStage extends cdk.Stage {
346
+ constructor(parent, id, props) {
347
+ super(parent, id, props);
348
+
349
+ new YourStack(this, 'StackInStage');
350
+ }
351
+ }
352
+
353
+ class StageUsingContext extends cdk.Stage {
354
+ constructor(parent, id, props) {
355
+ super(parent, id, props);
356
+
357
+ new StackUsingContext(this, 'StackInStage');
358
+ }
359
+ }
360
+
361
+ class BuiltinLambdaStack extends cdk.Stack {
362
+ constructor(parent, id, props) {
363
+ super(parent, id, props);
364
+
365
+ new s3.Bucket(this, 'Bucket', {
366
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
367
+ autoDeleteObjects: true, // will deploy a Nodejs lambda backed custom resource
368
+ });
369
+ }
370
+ }
371
+
372
+ const app = new cdk.App({
373
+ context: {
374
+ '@aws-cdk/core:assetHashSalt': process.env.CODEBUILD_BUILD_ID, // Force all assets to be unique, but consistent in one build
375
+ },
376
+ });
377
+
378
+ const defaultEnv = {
379
+ account: process.env.CDK_DEFAULT_ACCOUNT,
380
+ region: process.env.CDK_DEFAULT_REGION
381
+ };
382
+
383
+ // Sometimes we don't want to synthesize all stacks because it will impact the results
384
+ const stackSet = process.env.INTEG_STACK_SET || 'default';
385
+
386
+ switch (stackSet) {
387
+ case 'default':
388
+ // Deploy all does a wildcard ${stackPrefix}-test-*
389
+ new MyStack(app, `${stackPrefix}-test-1`, { env: defaultEnv });
390
+ new YourStack(app, `${stackPrefix}-test-2`);
391
+ // Deploy wildcard with parameters does ${stackPrefix}-param-test-*
392
+ new ParameterStack(app, `${stackPrefix}-param-test-1`);
393
+ new OtherParameterStack(app, `${stackPrefix}-param-test-2`);
394
+ // Deploy stack with multiple parameters
395
+ new MultiParameterStack(app, `${stackPrefix}-param-test-3`);
396
+ // Deploy stack with outputs does ${stackPrefix}-outputs-test-*
397
+ new OutputsStack(app, `${stackPrefix}-outputs-test-1`);
398
+ new AnotherOutputsStack(app, `${stackPrefix}-outputs-test-2`);
399
+ // Not included in wildcard
400
+ new IamStack(app, `${stackPrefix}-iam-test`, { env: defaultEnv });
401
+ const providing = new ProvidingStack(app, `${stackPrefix}-order-providing`);
402
+ new ConsumingStack(app, `${stackPrefix}-order-consuming`, { providingStack: providing });
403
+
404
+ new MissingSSMParameterStack(app, `${stackPrefix}-missing-ssm-parameter`, { env: defaultEnv });
405
+
406
+ new LambdaStack(app, `${stackPrefix}-lambda`);
407
+ new LambdaHotswapStack(app, `${stackPrefix}-lambda-hotswap`);
408
+ new DockerStack(app, `${stackPrefix}-docker`);
409
+ new DockerStackWithCustomFile(app, `${stackPrefix}-docker-with-custom-file`);
410
+ const failed = new FailedStack(app, `${stackPrefix}-failed`)
411
+
412
+ // A stack that depends on the failed stack -- used to test that '-e' does not deploy the failing stack
413
+ const dependsOnFailed = new OutputsStack(app, `${stackPrefix}-depends-on-failed`);
414
+ dependsOnFailed.addDependency(failed);
415
+
416
+ if (process.env.ENABLE_VPC_TESTING) { // Gating so we don't do context fetching unless that's what we are here for
417
+ const env = { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION };
418
+ if (process.env.ENABLE_VPC_TESTING === 'DEFINE')
419
+ new DefineVpcStack(app, `${stackPrefix}-define-vpc`, { env });
420
+ if (process.env.ENABLE_VPC_TESTING === 'IMPORT')
421
+ new ImportVpcStack(app, `${stackPrefix}-import-vpc`, { env });
422
+ }
423
+
424
+ new ConditionalResourceStack(app, `${stackPrefix}-conditional-resource`)
425
+
426
+ new StackWithNestedStack(app, `${stackPrefix}-with-nested-stack`);
427
+ new StackWithNestedStackUsingParameters(app, `${stackPrefix}-with-nested-stack-using-parameters`);
428
+
429
+ new YourStack(app, `${stackPrefix}-termination-protection`, {
430
+ terminationProtection: process.env.TERMINATION_PROTECTION !== 'FALSE' ? true : false,
431
+ });
432
+
433
+ new SomeStage(app, `${stackPrefix}-stage`);
434
+
435
+ new BuiltinLambdaStack(app, `${stackPrefix}-builtin-lambda-function`);
436
+
437
+ new ImportableStack(app, `${stackPrefix}-importable-stack`);
438
+
439
+ new BundlingStage(app, `${stackPrefix}-bundling-stage`);
440
+ break;
441
+
442
+ case 'stage-using-context':
443
+ // Cannot be combined with other test stacks, because we use this to test
444
+ // that stage context is propagated up and causes synth to fail when combined
445
+ // with '--no-lookups'.
446
+
447
+ // Needs a dummy stack at the top level because the CLI will fail otherwise
448
+ new YourStack(app, `${stackPrefix}-toplevel`, { env: defaultEnv });
449
+ new StageUsingContext(app, `${stackPrefix}-stage-using-context`, {
450
+ env: defaultEnv,
451
+ });
452
+ break;
453
+
454
+ case 'stage-with-errors':
455
+ const stage = new StageWithError(app, `${stackPrefix}-stage-with-errors`);
456
+ stage.synth({ validateOnSynthesis: true });
457
+ break;
458
+
459
+ default:
460
+ throw new Error(`Unrecognized INTEG_STACK_SET: '${stackSet}'`);
461
+ }
462
+
463
+ app.synth();
@@ -0,0 +1,7 @@
1
+ {
2
+ "app": "node app.js",
3
+ "versionReporting": false,
4
+ "context": {
5
+ "aws-cdk:enableDiffNoFail": "true"
6
+ }
7
+ }
@@ -0,0 +1,2 @@
1
+ FROM public.ecr.aws/docker/library/alpine:latest
2
+
@@ -0,0 +1,2 @@
1
+ FROM public.ecr.aws/docker/library/alpine:latest
2
+
@@ -0,0 +1,4 @@
1
+ exports.handler = async function(event) {
2
+ const response = require('./response.json');
3
+ return response;
4
+ };
@@ -0,0 +1,3 @@
1
+ {
2
+ "response": "hello, dear asset!"
3
+ }
@@ -0,0 +1,49 @@
1
+ if (process.env.PACKAGE_LAYOUT_VERSION === '1') {
2
+ var cfn = require('@aws-cdk/aws-cloudformation');
3
+ var sns = require('@aws-cdk/aws-sns');
4
+ var { Stack, CfnParameter } = require('@aws-cdk/core');
5
+ } else {
6
+ var {
7
+ aws_cloudformation: cfn,
8
+ aws_sns: sns,
9
+ } = require('aws-cdk-lib');
10
+ var { Stack, CfnParameter } = require('aws-cdk-lib');
11
+ }
12
+
13
+ class StackWithNestedStack extends Stack {
14
+ constructor(scope, id) {
15
+ super(scope, id);
16
+ new MyNestedStack(this, 'MyNested');
17
+ }
18
+ }
19
+
20
+ class MyNestedStack extends cfn.NestedStack {
21
+ constructor(scope, id) {
22
+ super(scope, id);
23
+
24
+ new sns.Topic(this, 'MyTopic');
25
+ }
26
+ }
27
+
28
+ class StackWithNestedStackUsingParameters extends Stack {
29
+ constructor(scope, id) {
30
+ super(scope, id);
31
+ const topicNameParam = new CfnParameter(this, 'MyTopicParam');
32
+ new MyNestedStackUsingParameters(this, 'MyNested', {
33
+ parameters: {'MyTopicParam': topicNameParam.valueAsString}
34
+ });
35
+ }
36
+ }
37
+
38
+ class MyNestedStackUsingParameters extends cfn.NestedStack {
39
+ constructor(scope, id, props) {
40
+ super(scope, id, props);
41
+
42
+ new sns.Topic(this, 'MyTopic', {
43
+ topicName: new CfnParameter(this, 'MyTopicParam')
44
+ });
45
+ }
46
+ }
47
+
48
+ exports.StackWithNestedStack = StackWithNestedStack;
49
+ exports.StackWithNestedStackUsingParameters = StackWithNestedStackUsingParameters;
@@ -0,0 +1 @@
1
+ !cfn-include-app.js
@@ -0,0 +1,4 @@
1
+ {
2
+ "app": "node cfn-include-app.js",
3
+ "versionReporting": false
4
+ }
@@ -0,0 +1,21 @@
1
+ const path = require('path');
2
+
3
+ const uberPackage = process.env.UBERPACKAGE;
4
+ if (!uberPackage) {
5
+ throw new Error('The UBERPACKAGE environment variable is required for running this app!');
6
+ }
7
+
8
+ const cfn_inc = require(`${uberPackage}/cloudformation-include`);
9
+ const core = require(`${uberPackage}`);
10
+
11
+ const app = new core.App();
12
+ const stack = new core.Stack(app, 'Stack');
13
+ const cfnInclude = new cfn_inc.CfnInclude(stack, 'Template', {
14
+ templateFile: path.join(__dirname, 'example-template.json'),
15
+ });
16
+ const cfnBucket = cfnInclude.getResource('Bucket');
17
+ if (cfnBucket.bucketName !== 'my-example-bucket') {
18
+ throw new Error(`Expected bucketName to be 'my-example-bucket', got: '${cfnBucket.bucketName}'`);
19
+ }
20
+
21
+ app.synth();
@@ -0,0 +1,13 @@
1
+ {
2
+ "Resources": {
3
+ "NoopHandle": {
4
+ "Type": "AWS::CloudFormation::WaitConditionHandle"
5
+ },
6
+ "Bucket": {
7
+ "Type": "AWS::S3::Bucket",
8
+ "Properties": {
9
+ "BucketName": "my-example-bucket"
10
+ }
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ if (process.env.PACKAGE_LAYOUT_VERSION === '1') {
3
+ var { App } = require('@aws-cdk/core');
4
+ } else {
5
+ var { App } = require('aws-cdk-lib');
6
+ }
7
+ var test_stack_1 = require('../lib/test-stack');
8
+ var app = new App();
9
+ const stackPrefix = process.env.STACK_NAME_PREFIX;
10
+ new test_stack_1.CDKSupportDemoRootStack(app, `${stackPrefix}-TestStack`);
11
+ app.synth();
@@ -0,0 +1,6 @@
1
+ {
2
+ "app": "node bin/test-app.js",
3
+ "context": {
4
+
5
+ }
6
+ }
@@ -0,0 +1,19 @@
1
+ if (process.env.PACKAGE_LAYOUT_VERSION === '1') {
2
+ var { NestedStack } = require('@aws-cdk/core');
3
+ var { Function, Runtime, Code } = require('@aws-cdk/aws-lambda');
4
+ } else {
5
+ var { NestedStack } = require('aws-cdk-lib');
6
+ var { Function, Runtime, Code } = require('aws-cdk-lib/aws-lambda');
7
+ }
8
+
9
+ class NestedStack1 extends NestedStack {
10
+ constructor(scope, id, props) {
11
+ super(scope, id, props);
12
+ new Function(this, 'FunctionPythonRuntime', {
13
+ runtime: Runtime.PYTHON_3_7,
14
+ code: Code.fromAsset('./src/python/Function'),
15
+ handler: 'app.lambda_handler',
16
+ });
17
+ }
18
+ }
19
+ exports.NestedStack1 = NestedStack1;