@aws-cdk-testing/cli-integ 3.2.4 → 3.3.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/lib/process.d.ts +45 -0
- package/lib/process.js +97 -0
- package/lib/process.ts +154 -0
- package/lib/shell.d.ts +51 -0
- package/lib/shell.js +81 -20
- package/lib/shell.ts +144 -17
- package/lib/with-cdk-app.d.ts +4 -1
- package/lib/with-cdk-app.js +6 -4
- package/lib/with-cdk-app.ts +9 -2
- package/package.json +2 -1
- package/resources/cdk-apps/app/app.js +36 -25
- package/tests/cli-integ-tests/cdk-destroy-interactive.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/cdk-destroy-interactive.integtest.js +32 -0
- package/tests/cli-integ-tests/cdk-destroy-interactive.integtest.ts +36 -0
- package/tests/cli-integ-tests/cdk-import-interactive.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/cdk-import-interactive.integtest.js +46 -0
- package/tests/cli-integ-tests/cdk-import-interactive.integtest.ts +53 -0
- package/tests/cli-integ-tests/cli.integtest.js +2 -1
- package/tests/cli-integ-tests/cli.integtest.ts +3 -1
- package/tests/cli-integ-tests/proxy.integtest.js +1 -2
- package/tests/cli-integ-tests/proxy.integtest.ts +0 -1
|
@@ -88,8 +88,8 @@ class SsoPermissionSetNoPolicy extends Stack {
|
|
|
88
88
|
new sso.CfnPermissionSet(this, "permission-set-without-managed-policy", {
|
|
89
89
|
instanceArn: 'arn:aws:sso:::instance/testvalue',
|
|
90
90
|
name: 'testName',
|
|
91
|
-
permissionsBoundary: { customerManagedPolicyReference: { name: 'why', path: '/how/' }},
|
|
92
|
-
|
|
91
|
+
permissionsBoundary: { customerManagedPolicyReference: { name: 'why', path: '/how/' } },
|
|
92
|
+
})
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -102,38 +102,38 @@ class SsoPermissionSetManagedPolicy extends Stack {
|
|
|
102
102
|
permissionsBoundary: { managedPolicyArn: 'arn:aws:iam::aws:policy/AdministratorAccess' },
|
|
103
103
|
instanceArn: 'arn:aws:sso:::instance/testvalue',
|
|
104
104
|
name: 'niceWork',
|
|
105
|
-
|
|
105
|
+
})
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
class SsoAssignment extends Stack {
|
|
110
110
|
constructor(scope, id) {
|
|
111
111
|
super(scope, id);
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
112
|
+
new sso.CfnAssignment(this, "assignment", {
|
|
113
|
+
instanceArn: 'arn:aws:sso:::instance/testvalue',
|
|
114
|
+
permissionSetArn: 'arn:aws:sso:::testvalue',
|
|
115
|
+
principalId: '11111111-2222-3333-4444-test',
|
|
116
|
+
principalType: 'USER',
|
|
117
|
+
targetId: '111111111111',
|
|
118
|
+
targetType: 'AWS_ACCOUNT'
|
|
119
|
+
});
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
class SsoInstanceAccessControlConfig extends Stack {
|
|
124
124
|
constructor(scope, id) {
|
|
125
125
|
super(scope, id);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
126
|
+
new sso.CfnInstanceAccessControlAttributeConfiguration(this, 'instanceAccessControlConfig', {
|
|
127
|
+
instanceArn: 'arn:aws:sso:::instance/testvalue',
|
|
128
|
+
accessControlAttributes: [
|
|
129
|
+
{ key: 'first', value: { source: ['a'] } },
|
|
130
|
+
{ key: 'second', value: { source: ['b'] } },
|
|
131
|
+
{ key: 'third', value: { source: ['c'] } },
|
|
132
|
+
{ key: 'fourth', value: { source: ['d'] } },
|
|
133
|
+
{ key: 'fifth', value: { source: ['e'] } },
|
|
134
|
+
{ key: 'sixth', value: { source: ['f'] } },
|
|
135
|
+
]
|
|
136
|
+
})
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
|
|
@@ -270,7 +270,7 @@ class ImportableStack extends cdk.Stack {
|
|
|
270
270
|
const bucket = new s3.Bucket(this, 'test-bucket', {
|
|
271
271
|
removalPolicy: (process.env.RETAIN_SINGLE_BUCKET === '1') ? cdk.RemovalPolicy.RETAIN : cdk.RemovalPolicy.DESTROY,
|
|
272
272
|
});
|
|
273
|
-
|
|
273
|
+
|
|
274
274
|
new cdk.CfnOutput(this, 'BucketLogicalId', {
|
|
275
275
|
value: bucket.node.defaultChild.logicalId,
|
|
276
276
|
});
|
|
@@ -369,6 +369,16 @@ class OutputsStack extends cdk.Stack {
|
|
|
369
369
|
}
|
|
370
370
|
}
|
|
371
371
|
|
|
372
|
+
class TwoSnsTopics extends cdk.Stack {
|
|
373
|
+
constructor(parent, id, props) {
|
|
374
|
+
super(parent, id, props);
|
|
375
|
+
|
|
376
|
+
new sns.Topic(this, 'Topic1');
|
|
377
|
+
new sns.Topic(this, 'Topic2');
|
|
378
|
+
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
372
382
|
class AnotherOutputsStack extends cdk.Stack {
|
|
373
383
|
constructor(parent, id, props) {
|
|
374
384
|
super(parent, id, props);
|
|
@@ -471,7 +481,7 @@ class IamRolesStack extends cdk.Stack {
|
|
|
471
481
|
|
|
472
482
|
// Environment variabile is used to create a bunch of roles to test
|
|
473
483
|
// that large diff templates are uploaded to S3 to create the changeset.
|
|
474
|
-
for(let i = 1; i <= Number(process.env.NUMBER_OF_ROLES)
|
|
484
|
+
for (let i = 1; i <= Number(process.env.NUMBER_OF_ROLES); i++) {
|
|
475
485
|
const role = new iam.Role(this, `Role${i}`, {
|
|
476
486
|
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
|
|
477
487
|
});
|
|
@@ -479,7 +489,7 @@ class IamRolesStack extends cdk.Stack {
|
|
|
479
489
|
|
|
480
490
|
// For any extra IAM roles created, add a ton of metadata so that the template size is > 50 KiB.
|
|
481
491
|
if (i > 1) {
|
|
482
|
-
for(let i = 1; i <= 30
|
|
492
|
+
for (let i = 1; i <= 30; i++) {
|
|
483
493
|
cfnRole.addMetadata('a'.repeat(1000), 'v');
|
|
484
494
|
}
|
|
485
495
|
}
|
|
@@ -847,6 +857,7 @@ const stackSet = process.env.INTEG_STACK_SET || 'default';
|
|
|
847
857
|
switch (stackSet) {
|
|
848
858
|
case 'default':
|
|
849
859
|
// Deploy all does a wildcard ${stackPrefix}-test-*
|
|
860
|
+
new TwoSnsTopics(app, `${stackPrefix}-two-sns-topics`);
|
|
850
861
|
new MyStack(app, `${stackPrefix}-test-1`, { env: defaultEnv });
|
|
851
862
|
new YourStack(app, `${stackPrefix}-test-2`);
|
|
852
863
|
new NoticesStack(app, `${stackPrefix}-notices`);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
(0, lib_1.integTest)('cdk destroy prompts the user for confirmation', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
const stackName = 'test-2';
|
|
8
|
+
const fullStackName = fixture.fullStackName(stackName);
|
|
9
|
+
fixture.log(`Deploying stack ${fullStackName}`);
|
|
10
|
+
await fixture.cdkDeploy(stackName);
|
|
11
|
+
fixture.log(`Destroying stack ${fullStackName} and declining prompt`);
|
|
12
|
+
await fixture.cdkDestroy(stackName, {
|
|
13
|
+
force: false,
|
|
14
|
+
interact: [
|
|
15
|
+
{ prompt: /Are you sure you want to delete/, input: 'no' }
|
|
16
|
+
]
|
|
17
|
+
});
|
|
18
|
+
// assert we didn't destroy the stack
|
|
19
|
+
const stack = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: fullStackName }));
|
|
20
|
+
expect((_b = (_a = stack.Stacks) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0).toEqual(1);
|
|
21
|
+
fixture.log(`Destroying stack ${fullStackName} and accepting prompt`);
|
|
22
|
+
await fixture.cdkDestroy(stackName, {
|
|
23
|
+
force: false,
|
|
24
|
+
interact: [
|
|
25
|
+
{ prompt: /Are you sure you want to delete/, input: 'yes' }
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
// assert we did destroy the stack
|
|
29
|
+
await expect(fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: fullStackName })))
|
|
30
|
+
.rejects.toThrow(/does not exist/);
|
|
31
|
+
}));
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlc3Ryb3ktaW50ZXJhY3RpdmUuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWRlc3Ryb3ktaW50ZXJhY3RpdmUuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMEVBQXVFO0FBQ3ZFLG1DQUEwRDtBQUUxRCxJQUFBLGVBQVMsRUFBQywrQ0FBK0MsRUFBRSxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTs7SUFFOUYsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzNCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNoRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsYUFBYSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7UUFDbEMsS0FBSyxFQUFFLEtBQUs7UUFDWixRQUFRLEVBQUU7WUFDUixFQUFFLE1BQU0sRUFBRSxpQ0FBaUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1NBQzNEO0tBQ0YsQ0FBQyxDQUFDO0lBRUgscUNBQXFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksNkNBQXFCLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzVHLE1BQU0sQ0FBQyxNQUFBLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsYUFBYSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7UUFDbEMsS0FBSyxFQUFFLEtBQUs7UUFDWixRQUFRLEVBQUU7WUFDUixFQUFFLE1BQU0sRUFBRSxpQ0FBaUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1NBQzVEO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsa0NBQWtDO0lBQ2xDLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLDZDQUFxQixDQUFDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNuRyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFdkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tzQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uL2xpYic7XG5cbmludGVnVGVzdCgnY2RrIGRlc3Ryb3kgcHJvbXB0cyB0aGUgdXNlciBmb3IgY29uZmlybWF0aW9uJywgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG5cbiAgY29uc3Qgc3RhY2tOYW1lID0gJ3Rlc3QtMic7XG4gIGNvbnN0IGZ1bGxTdGFja05hbWUgPSBmaXh0dXJlLmZ1bGxTdGFja05hbWUoc3RhY2tOYW1lKTtcblxuICBmaXh0dXJlLmxvZyhgRGVwbG95aW5nIHN0YWNrICR7ZnVsbFN0YWNrTmFtZX1gKTtcbiAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koc3RhY2tOYW1lKTtcblxuICBmaXh0dXJlLmxvZyhgRGVzdHJveWluZyBzdGFjayAke2Z1bGxTdGFja05hbWV9IGFuZCBkZWNsaW5pbmcgcHJvbXB0YCk7XG4gIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveShzdGFja05hbWUsIHtcbiAgICBmb3JjZTogZmFsc2UsXG4gICAgaW50ZXJhY3Q6IFtcbiAgICAgIHsgcHJvbXB0OiAvQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZS8sIGlucHV0OiAnbm8nIH1cbiAgICBdXG4gIH0pO1xuXG4gIC8vIGFzc2VydCB3ZSBkaWRuJ3QgZGVzdHJveSB0aGUgc3RhY2tcbiAgY29uc3Qgc3RhY2sgPSBhd2FpdCBmaXh0dXJlLmF3cy5jbG91ZEZvcm1hdGlvbi5zZW5kKG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoeyBTdGFja05hbWU6IGZ1bGxTdGFja05hbWUgfSkpXG4gIGV4cGVjdChzdGFjay5TdGFja3M/Lmxlbmd0aCA/PyAwKS50b0VxdWFsKDEpXG5cbiAgZml4dHVyZS5sb2coYERlc3Ryb3lpbmcgc3RhY2sgJHtmdWxsU3RhY2tOYW1lfSBhbmQgYWNjZXB0aW5nIHByb21wdGApO1xuICBhd2FpdCBmaXh0dXJlLmNka0Rlc3Ryb3koc3RhY2tOYW1lLCB7XG4gICAgZm9yY2U6IGZhbHNlLFxuICAgIGludGVyYWN0OiBbXG4gICAgICB7IHByb21wdDogL0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUvLCBpbnB1dDogJ3llcycgfVxuICAgIF1cbiAgfSk7XG5cbiAgLy8gYXNzZXJ0IHdlIGRpZCBkZXN0cm95IHRoZSBzdGFja1xuICBhd2FpdCBleHBlY3QoZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChuZXcgRGVzY3JpYmVTdGFja3NDb21tYW5kKHsgU3RhY2tOYW1lOiBmdWxsU3RhY2tOYW1lIH0pKSlcbiAgICAucmVqZWN0cy50b1Rocm93KC9kb2VzIG5vdCBleGlzdC8pO1xuXG59KSk7XG4iXX0=
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { DescribeStacksCommand } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import { integTest, withDefaultFixture } from '../../lib';
|
|
3
|
+
|
|
4
|
+
integTest('cdk destroy prompts the user for confirmation', withDefaultFixture(async (fixture) => {
|
|
5
|
+
|
|
6
|
+
const stackName = 'test-2';
|
|
7
|
+
const fullStackName = fixture.fullStackName(stackName);
|
|
8
|
+
|
|
9
|
+
fixture.log(`Deploying stack ${fullStackName}`);
|
|
10
|
+
await fixture.cdkDeploy(stackName);
|
|
11
|
+
|
|
12
|
+
fixture.log(`Destroying stack ${fullStackName} and declining prompt`);
|
|
13
|
+
await fixture.cdkDestroy(stackName, {
|
|
14
|
+
force: false,
|
|
15
|
+
interact: [
|
|
16
|
+
{ prompt: /Are you sure you want to delete/, input: 'no' }
|
|
17
|
+
]
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// assert we didn't destroy the stack
|
|
21
|
+
const stack = await fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: fullStackName }))
|
|
22
|
+
expect(stack.Stacks?.length ?? 0).toEqual(1)
|
|
23
|
+
|
|
24
|
+
fixture.log(`Destroying stack ${fullStackName} and accepting prompt`);
|
|
25
|
+
await fixture.cdkDestroy(stackName, {
|
|
26
|
+
force: false,
|
|
27
|
+
interact: [
|
|
28
|
+
{ prompt: /Are you sure you want to delete/, input: 'yes' }
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// assert we did destroy the stack
|
|
33
|
+
await expect(fixture.aws.cloudFormation.send(new DescribeStacksCommand({ StackName: fullStackName })))
|
|
34
|
+
.rejects.toThrow(/does not exist/);
|
|
35
|
+
|
|
36
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
|
|
4
|
+
const client_sns_1 = require("@aws-sdk/client-sns");
|
|
5
|
+
const lib_1 = require("../../lib");
|
|
6
|
+
(0, lib_1.integTest)('cdk import prompts the user for sns topic arns', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
7
|
+
var _a, _b;
|
|
8
|
+
const topicName = (logicalId) => `${logicalId}-${fixture.randomString}`;
|
|
9
|
+
const topicArn = async (name) => `arn:aws:sns:${fixture.aws.region}:${await fixture.aws.account()}:${name}`;
|
|
10
|
+
const topic1Name = topicName('Topic1');
|
|
11
|
+
const topic2Name = topicName('Topic2');
|
|
12
|
+
const topic1Arn = await topicArn(topic1Name);
|
|
13
|
+
const topic2Arn = await topicArn(topic2Name);
|
|
14
|
+
fixture.log(`Creating topic ${topic1Name}`);
|
|
15
|
+
await fixture.aws.sns.send(new client_sns_1.CreateTopicCommand({ Name: topic1Name }));
|
|
16
|
+
fixture.log(`Creating topic ${topic2Name}`);
|
|
17
|
+
await fixture.aws.sns.send(new client_sns_1.CreateTopicCommand({ Name: topic2Name }));
|
|
18
|
+
try {
|
|
19
|
+
const stackName = 'two-sns-topics';
|
|
20
|
+
const fullStackName = fixture.fullStackName(stackName);
|
|
21
|
+
fixture.log(`Importing topics to stack ${fullStackName}`);
|
|
22
|
+
await fixture.cdk(['import', fullStackName], {
|
|
23
|
+
interact: [
|
|
24
|
+
{
|
|
25
|
+
prompt: /\(empty to skip\)/,
|
|
26
|
+
input: topic1Arn,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
prompt: /\(empty to skip\)/,
|
|
30
|
+
input: topic2Arn,
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
});
|
|
34
|
+
// assert the stack now has the two topics
|
|
35
|
+
const stackResources = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStackResourcesCommand({ StackName: fullStackName }));
|
|
36
|
+
const stackTopicArns = new Set((_b = (_a = stackResources.StackResources) === null || _a === void 0 ? void 0 : _a.filter(r => r.ResourceType === 'AWS::SNS::Topic').map(r => r.PhysicalResourceId)) !== null && _b !== void 0 ? _b : []);
|
|
37
|
+
expect(stackTopicArns).toEqual(new Set([topic1Arn, topic2Arn]));
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
fixture.log(`Deleting topic ${topic1Name}`);
|
|
41
|
+
await fixture.aws.sns.send(new client_sns_1.DeleteTopicCommand({ TopicArn: topic1Arn }));
|
|
42
|
+
fixture.log(`Deleting topic ${topic2Name}`);
|
|
43
|
+
await fixture.aws.sns.send(new client_sns_1.DeleteTopicCommand({ TopicArn: topic2Arn }));
|
|
44
|
+
}
|
|
45
|
+
}));
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWltcG9ydC1pbnRlcmFjdGl2ZS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstaW1wb3J0LWludGVyYWN0aXZlLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUErRTtBQUMvRSxvREFBNkU7QUFDN0UsbUNBQTBEO0FBRTFELElBQUEsZUFBUyxFQUFDLGdEQUFnRCxFQUFFLElBQUEsd0JBQWtCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFOztJQUUvRixNQUFNLFNBQVMsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNoRixNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUUsQ0FBQyxlQUFlLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFLLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVwSCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXZDLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDNUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSwrQkFBa0IsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDeEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLCtCQUFrQixDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUV4RSxJQUFJLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXZELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFO1lBQzNDLFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxNQUFNLEVBQUUsbUJBQW1CO29CQUMzQixLQUFLLEVBQUUsU0FBUztpQkFDakI7Z0JBQ0Q7b0JBQ0UsTUFBTSxFQUFFLG1CQUFtQjtvQkFDM0IsS0FBSyxFQUFFLFNBQVM7aUJBQ2pCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCwwQ0FBMEM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxxREFBNkIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDN0gsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBQSxNQUFBLGNBQWMsQ0FBQyxjQUFjLDBDQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXRKLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRWpFLENBQUM7WUFBUyxDQUFDO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLCtCQUFrQixDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUMzRSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksK0JBQWtCLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzdFLENBQUM7QUFFSCxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVTdGFja1Jlc291cmNlc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgQ3JlYXRlVG9waWNDb21tYW5kLCBEZWxldGVUb3BpY0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc25zJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KCdjZGsgaW1wb3J0IHByb21wdHMgdGhlIHVzZXIgZm9yIHNucyB0b3BpYyBhcm5zJywgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG5cbiAgY29uc3QgdG9waWNOYW1lID0gKGxvZ2ljYWxJZDogc3RyaW5nKSA9PiBgJHtsb2dpY2FsSWR9LSR7Zml4dHVyZS5yYW5kb21TdHJpbmd9YDtcbiAgY29uc3QgdG9waWNBcm4gPSBhc3luYyAobmFtZTogc3RyaW5nKSA9PiBgYXJuOmF3czpzbnM6JHtmaXh0dXJlLmF3cy5yZWdpb259OiR7IGF3YWl0IGZpeHR1cmUuYXdzLmFjY291bnQoKX06JHtuYW1lfWBcblxuICBjb25zdCB0b3BpYzFOYW1lID0gdG9waWNOYW1lKCdUb3BpYzEnKTtcbiAgY29uc3QgdG9waWMyTmFtZSA9IHRvcGljTmFtZSgnVG9waWMyJyk7XG5cbiAgY29uc3QgdG9waWMxQXJuID0gYXdhaXQgdG9waWNBcm4odG9waWMxTmFtZSk7XG4gIGNvbnN0IHRvcGljMkFybiA9IGF3YWl0IHRvcGljQXJuKHRvcGljMk5hbWUpO1xuXG4gIGZpeHR1cmUubG9nKGBDcmVhdGluZyB0b3BpYyAke3RvcGljMU5hbWV9YCk7XG4gIGF3YWl0IGZpeHR1cmUuYXdzLnNucy5zZW5kKG5ldyBDcmVhdGVUb3BpY0NvbW1hbmQoeyBOYW1lOiB0b3BpYzFOYW1lIH0pKVxuICBmaXh0dXJlLmxvZyhgQ3JlYXRpbmcgdG9waWMgJHt0b3BpYzJOYW1lfWApO1xuICBhd2FpdCBmaXh0dXJlLmF3cy5zbnMuc2VuZChuZXcgQ3JlYXRlVG9waWNDb21tYW5kKHsgTmFtZTogdG9waWMyTmFtZSB9KSlcblxuICB0cnkge1xuXG4gICAgY29uc3Qgc3RhY2tOYW1lID0gJ3R3by1zbnMtdG9waWNzJztcbiAgICBjb25zdCBmdWxsU3RhY2tOYW1lID0gZml4dHVyZS5mdWxsU3RhY2tOYW1lKHN0YWNrTmFtZSk7XG5cbiAgICBmaXh0dXJlLmxvZyhgSW1wb3J0aW5nIHRvcGljcyB0byBzdGFjayAke2Z1bGxTdGFja05hbWV9YCk7XG4gICAgYXdhaXQgZml4dHVyZS5jZGsoWydpbXBvcnQnLCBmdWxsU3RhY2tOYW1lXSwge1xuICAgICAgaW50ZXJhY3Q6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb21wdDogL1xcKGVtcHR5IHRvIHNraXBcXCkvLFxuICAgICAgICAgIGlucHV0OiB0b3BpYzFBcm4sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9tcHQ6IC9cXChlbXB0eSB0byBza2lwXFwpLyxcbiAgICAgICAgICBpbnB1dDogdG9waWMyQXJuLFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICAvLyBhc3NlcnQgdGhlIHN0YWNrIG5vdyBoYXMgdGhlIHR3byB0b3BpY3NcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQobmV3IERlc2NyaWJlU3RhY2tSZXNvdXJjZXNDb21tYW5kKHsgU3RhY2tOYW1lOiBmdWxsU3RhY2tOYW1lIH0pKVxuICAgIGNvbnN0IHN0YWNrVG9waWNBcm5zID0gbmV3IFNldChzdGFja1Jlc291cmNlcy5TdGFja1Jlc291cmNlcz8uZmlsdGVyKHIgPT4gci5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OlNOUzo6VG9waWMnKS5tYXAociA9PiByLlBoeXNpY2FsUmVzb3VyY2VJZCkgPz8gW10pO1xuXG4gICAgZXhwZWN0KHN0YWNrVG9waWNBcm5zKS50b0VxdWFsKG5ldyBTZXQoW3RvcGljMUFybiwgdG9waWMyQXJuXSkpXG5cbiAgfSBmaW5hbGx5IHtcbiAgICBmaXh0dXJlLmxvZyhgRGVsZXRpbmcgdG9waWMgJHt0b3BpYzFOYW1lfWApO1xuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnNucy5zZW5kKG5ldyBEZWxldGVUb3BpY0NvbW1hbmQoeyBUb3BpY0FybjogdG9waWMxQXJuIH0pKVxuICAgIGZpeHR1cmUubG9nKGBEZWxldGluZyB0b3BpYyAke3RvcGljMk5hbWV9YCk7XG4gICAgYXdhaXQgZml4dHVyZS5hd3Muc25zLnNlbmQobmV3IERlbGV0ZVRvcGljQ29tbWFuZCh7IFRvcGljQXJuOiB0b3BpYzJBcm4gfSkpXG4gIH1cblxufSkpO1xuIl19
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DescribeStackResourcesCommand } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import { CreateTopicCommand, DeleteTopicCommand } from '@aws-sdk/client-sns';
|
|
3
|
+
import { integTest, withDefaultFixture } from '../../lib';
|
|
4
|
+
|
|
5
|
+
integTest('cdk import prompts the user for sns topic arns', withDefaultFixture(async (fixture) => {
|
|
6
|
+
|
|
7
|
+
const topicName = (logicalId: string) => `${logicalId}-${fixture.randomString}`;
|
|
8
|
+
const topicArn = async (name: string) => `arn:aws:sns:${fixture.aws.region}:${ await fixture.aws.account()}:${name}`
|
|
9
|
+
|
|
10
|
+
const topic1Name = topicName('Topic1');
|
|
11
|
+
const topic2Name = topicName('Topic2');
|
|
12
|
+
|
|
13
|
+
const topic1Arn = await topicArn(topic1Name);
|
|
14
|
+
const topic2Arn = await topicArn(topic2Name);
|
|
15
|
+
|
|
16
|
+
fixture.log(`Creating topic ${topic1Name}`);
|
|
17
|
+
await fixture.aws.sns.send(new CreateTopicCommand({ Name: topic1Name }))
|
|
18
|
+
fixture.log(`Creating topic ${topic2Name}`);
|
|
19
|
+
await fixture.aws.sns.send(new CreateTopicCommand({ Name: topic2Name }))
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
|
|
23
|
+
const stackName = 'two-sns-topics';
|
|
24
|
+
const fullStackName = fixture.fullStackName(stackName);
|
|
25
|
+
|
|
26
|
+
fixture.log(`Importing topics to stack ${fullStackName}`);
|
|
27
|
+
await fixture.cdk(['import', fullStackName], {
|
|
28
|
+
interact: [
|
|
29
|
+
{
|
|
30
|
+
prompt: /\(empty to skip\)/,
|
|
31
|
+
input: topic1Arn,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
prompt: /\(empty to skip\)/,
|
|
35
|
+
input: topic2Arn,
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// assert the stack now has the two topics
|
|
41
|
+
const stackResources = await fixture.aws.cloudFormation.send(new DescribeStackResourcesCommand({ StackName: fullStackName }))
|
|
42
|
+
const stackTopicArns = new Set(stackResources.StackResources?.filter(r => r.ResourceType === 'AWS::SNS::Topic').map(r => r.PhysicalResourceId) ?? []);
|
|
43
|
+
|
|
44
|
+
expect(stackTopicArns).toEqual(new Set([topic1Arn, topic2Arn]))
|
|
45
|
+
|
|
46
|
+
} finally {
|
|
47
|
+
fixture.log(`Deleting topic ${topic1Name}`);
|
|
48
|
+
await fixture.aws.sns.send(new DeleteTopicCommand({ TopicArn: topic1Arn }))
|
|
49
|
+
fixture.log(`Deleting topic ${topic2Name}`);
|
|
50
|
+
await fixture.aws.sns.send(new DeleteTopicCommand({ TopicArn: topic2Arn }))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
}));
|