@aws-cdk-testing/cli-integ 3.30.1 → 3.31.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 (25) hide show
  1. package/lib/aws.d.ts +2 -0
  2. package/lib/aws.js +4 -1
  3. package/lib/regions.d.ts +5 -1
  4. package/lib/regions.js +18 -3
  5. package/npm-shrinkwrap.json +1409 -1384
  6. package/package.json +22 -21
  7. package/resources/cdk-apps/app/app.js +33 -2
  8. package/resources/cdk-apps/diagnose-app/app.js +74 -0
  9. package/resources/cdk-apps/diagnose-app/cdk.json +7 -0
  10. package/tests/cli-integ-tests/deploy/cdk-deploy-skips-approval-prompt-on-no-change-deploy.integtest.d.ts +1 -0
  11. package/tests/cli-integ-tests/deploy/cdk-deploy-skips-approval-prompt-on-no-change-deploy.integtest.js +23 -0
  12. package/tests/cli-integ-tests/deploy/cdk-import-existing-resources-error-message-includes-construct-paths.integtest.js +2 -2
  13. package/tests/cli-integ-tests/deploy/cdk-two-step-deploy-prepare-then-execute-change-set.integtest.d.ts +1 -0
  14. package/tests/cli-integ-tests/deploy/cdk-two-step-deploy-prepare-then-execute-change-set.integtest.js +36 -0
  15. package/tests/cli-integ-tests/diagnose/cdk-diagnose-changeset-failure.integtest.d.ts +1 -0
  16. package/tests/cli-integ-tests/diagnose/cdk-diagnose-changeset-failure.integtest.js +43 -0
  17. package/tests/cli-integ-tests/diagnose/cdk-diagnose-deployment-failure.integtest.d.ts +1 -0
  18. package/tests/cli-integ-tests/diagnose/cdk-diagnose-deployment-failure.integtest.js +20 -0
  19. package/tests/cli-integ-tests/diagnose/cdk-diagnose-early-validation-failure.integtest.d.ts +1 -0
  20. package/tests/cli-integ-tests/diagnose/cdk-diagnose-early-validation-failure.integtest.js +26 -0
  21. package/tests/cli-integ-tests/hotswap/cdk-hotswap-deployment-caches-template.integtest.d.ts +1 -0
  22. package/tests/cli-integ-tests/hotswap/cdk-hotswap-deployment-caches-template.integtest.js +73 -0
  23. package/tests/cli-integ-tests/hotswap/cdk-hotswap-deployment-supports-cloudcontrol-based-resources.integtest.js +3 -2
  24. package/tests/cli-integ-tests/orphan/cdk-orphan-detaches-resource.integtest.d.ts +1 -0
  25. package/tests/cli-integ-tests/orphan/cdk-orphan-detaches-resource.integtest.js +72 -0
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
+ const yaml = require("yaml");
5
+ const lib_1 = require("../../../lib");
6
+ (0, lib_1.integTest)('cdk orphan detaches a resource from the stack without deleting it', (0, lib_1.withDefaultFixture)(async (fixture) => {
7
+ const stackName = fixture.fullStackName('orphanable');
8
+ // Deploy the stack with a DynamoDB table + Lambda consumer
9
+ await fixture.cdkDeploy('orphanable');
10
+ // Get outputs
11
+ const describeResponse = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: stackName }));
12
+ const outputs = describeResponse.Stacks?.[0]?.Outputs ?? [];
13
+ const tableName = outputs.find((o) => o.OutputKey === 'TableName')?.OutputValue;
14
+ expect(tableName).toBeDefined();
15
+ try {
16
+ // Verify the table resource exists in the template before orphaning
17
+ const templateBefore = await fixture.aws.cloudFormation.send(new client_cloudformation_1.GetTemplateCommand({ StackName: stackName }));
18
+ const templateBodyBefore = yaml.parse(templateBefore.TemplateBody);
19
+ expect(templateBodyBefore.Resources).toHaveProperty('MyTable794EDED1');
20
+ // Put an item in the table before orphan
21
+ await fixture.aws.dynamoDb.putItem({
22
+ TableName: tableName,
23
+ Item: { PK: { S: 'before-orphan' } },
24
+ });
25
+ // Orphan the table
26
+ const orphanOutput = await fixture.cdk([
27
+ 'orphan',
28
+ `${stackName}/MyTable`,
29
+ '--unstable=orphan',
30
+ '--yes',
31
+ ]);
32
+ // Verify the output contains a resource mapping for import
33
+ expect(orphanOutput).toContain('resource-mapping-inline');
34
+ expect(orphanOutput).toContain('TableName');
35
+ // Verify the template after orphan: table gone, Lambda env vars replaced with literals
36
+ const templateAfter = await fixture.aws.cloudFormation.send(new client_cloudformation_1.GetTemplateCommand({ StackName: stackName }));
37
+ const templateBody = yaml.parse(templateAfter.TemplateBody);
38
+ expect(templateBody.Resources).not.toHaveProperty('MyTable794EDED1');
39
+ expect(templateBody).toMatchObject({
40
+ Resources: expect.objectContaining({
41
+ Consumer8D6BE417: expect.objectContaining({
42
+ Type: 'AWS::Lambda::Function',
43
+ Properties: expect.objectContaining({
44
+ Environment: {
45
+ Variables: {
46
+ TABLE_NAME: expect.stringContaining('MyTable'),
47
+ TABLE_ARN: expect.stringContaining('arn:aws:dynamodb'),
48
+ },
49
+ },
50
+ }),
51
+ }),
52
+ }),
53
+ });
54
+ // Verify the table still exists and data is intact (strongly consistent read)
55
+ const getItemResult = await fixture.aws.dynamoDb.getItem({
56
+ TableName: tableName,
57
+ Key: { PK: { S: 'before-orphan' } },
58
+ ConsistentRead: true,
59
+ });
60
+ expect(getItemResult.Item?.PK?.S).toBe('before-orphan');
61
+ }
62
+ finally {
63
+ // Clean up the retained table to avoid leaking resources
64
+ try {
65
+ await fixture.aws.dynamoDb.deleteTable({ TableName: tableName });
66
+ }
67
+ catch (e) {
68
+ // Ignore
69
+ }
70
+ }
71
+ }));
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLW9ycGhhbi1kZXRhY2hlcy1yZXNvdXJjZS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstb3JwaGFuLWRldGFjaGVzLXJlc291cmNlLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUEyRjtBQUMzRiw2QkFBNkI7QUFDN0Isc0NBQTZEO0FBRTdELElBQUEsZUFBUyxFQUNQLG1FQUFtRSxFQUNuRSxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXRELDJEQUEyRDtJQUMzRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFdEMsY0FBYztJQUNkLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQzVELElBQUksNkNBQXFCLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDcEQsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUM7SUFDaEYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRWhDLElBQUksQ0FBQztRQUNILG9FQUFvRTtRQUNwRSxNQUFNLGNBQWMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDMUQsSUFBSSwwQ0FBa0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVB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bW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnY2RrIG9ycGhhbiBkZXRhY2hlcyBhIHJlc291cmNlIGZyb20gdGhlIHN0YWNrIHdpdGhvdXQgZGVsZXRpbmcgaXQnLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ29ycGhhbmFibGUnKTtcblxuICAgIC8vIERlcGxveSB0aGUgc3RhY2sgd2l0aCBhIER5bmFtb0RCIHRhYmxlICsgTGFtYmRhIGNvbnN1bWVyXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ29ycGhhbmFibGUnKTtcblxuICAgIC8vIEdldCBvdXRwdXRzXG4gICAgY29uc3QgZGVzY3JpYmVSZXNwb25zZSA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQoXG4gICAgICBuZXcgRGVzY3JpYmVTdGFja3NDb21tYW5kKHsgU3RhY2tOYW1lOiBzdGFja05hbWUgfSksXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXRzID0gZGVzY3JpYmVSZXNwb25zZS5TdGFja3M/LlswXT8uT3V0cHV0cyA/PyBbXTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBvdXRwdXRzLmZpbmQoKG8pID0+IG8uT3V0cHV0S2V5ID09PSAnVGFibGVOYW1lJyk/Lk91dHB1dFZhbHVlO1xuICAgIGV4cGVjdCh0YWJsZU5hbWUpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHRoZSB0YWJsZSByZXNvdXJjZSBleGlzdHMgaW4gdGhlIHRlbXBsYXRlIGJlZm9yZSBvcnBoYW5pbmdcbiAgICAgIGNvbnN0IHRlbXBsYXRlQmVmb3JlID0gYXdhaXQgZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChcbiAgICAgICAgbmV3IEdldFRlbXBsYXRlQ29tbWFuZCh7IFN0YWNrTmFtZTogc3RhY2tOYW1lIH0pLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlQm9keUJlZm9yZSA9IHlhbWwucGFyc2UodGVtcGxhdGVCZWZvcmUuVGVtcGxhdGVCb2R5ISk7XG4gICAgICBleHBlY3QodGVtcGxhdGVCb2R5QmVmb3JlLlJlc291cmNlcykudG9IYXZlUHJvcGVydHkoJ015VGFibGU3OTRFREVEMScpO1xuXG4gICAgICAvLyBQdXQgYW4gaXRlbSBpbiB0aGUgdGFibGUgYmVmb3JlIG9ycGhhblxuICAgICAgYXdhaXQgZml4dHVyZS5hd3MuZHluYW1vRGIucHV0SXRlbSh7XG4gICAgICAgIFRhYmxlTmFtZTogdGFibGVOYW1lISxcbiAgICAgICAgSXRlbTogeyBQSzogeyBTOiAnYmVmb3JlLW9ycGhhbicgfSB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE9ycGhhbiB0aGUgdGFibGVcbiAgICAgIGNvbnN0IG9ycGhhbk91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrKFtcbiAgICAgICAgJ29ycGhhbicsXG4gICAgICAgIGAke3N0YWNrTmFtZX0vTXlUYWJsZWAsXG4gICAgICAgICctLXVuc3RhYmxlPW9ycGhhbicsXG4gICAgICAgICctLXllcycsXG4gICAgICBdKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBvdXRwdXQgY29udGFpbnMgYSByZXNvdXJjZSBtYXBwaW5nIGZvciBpbXBvcnRcbiAgICAgIGV4cGVjdChvcnBoYW5PdXRwdXQpLnRvQ29udGFpbigncmVzb3VyY2UtbWFwcGluZy1pbmxpbmUnKTtcbiAgICAgIGV4cGVjdChvcnBoYW5PdXRwdXQpLnRvQ29udGFpbignVGFibGVOYW1lJyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdGVtcGxhdGUgYWZ0ZXIgb3JwaGFuOiB0YWJsZSBnb25lLCBMYW1iZGEgZW52IHZhcnMgcmVwbGFjZWQgd2l0aCBsaXRlcmFsc1xuICAgICAgY29uc3QgdGVtcGxhdGVBZnRlciA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQoXG4gICAgICAgIG5ldyBHZXRUZW1wbGF0ZUNvbW1hbmQoeyBTdGFja05hbWU6IHN0YWNrTmFtZSB9KSxcbiAgICAgICk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUJvZHkgPSB5YW1sLnBhcnNlKHRlbXBsYXRlQWZ0ZXIuVGVtcGxhdGVCb2R5ISk7XG5cbiAgICAgIGV4cGVjdCh0ZW1wbGF0ZUJvZHkuUmVzb3VyY2VzKS5ub3QudG9IYXZlUHJvcGVydHkoJ015VGFibGU3OTRFREVEMScpO1xuICAgICAgZXhwZWN0KHRlbXBsYXRlQm9keSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIFJlc291cmNlczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIENvbnN1bWVyOEQ2QkU0MTc6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICAgICAgUHJvcGVydGllczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIFZhcmlhYmxlczoge1xuICAgICAgICAgICAgICAgICAgVEFCTEVfTkFNRTogZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ015VGFibGUnKSxcbiAgICAgICAgICAgICAgICAgIFRBQkxFX0FSTjogZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ2Fybjphd3M6ZHluYW1vZGInKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdGFibGUgc3RpbGwgZXhpc3RzIGFuZCBkYXRhIGlzIGludGFjdCAoc3Ryb25nbHkgY29uc2lzdGVudCByZWFkKVxuICAgICAgY29uc3QgZ2V0SXRlbVJlc3VsdCA9IGF3YWl0IGZpeHR1cmUuYXdzLmR5bmFtb0RiLmdldEl0ZW0oe1xuICAgICAgICBUYWJsZU5hbWU6IHRhYmxlTmFtZSEsXG4gICAgICAgIEtleTogeyBQSzogeyBTOiAnYmVmb3JlLW9ycGhhbicgfSB9LFxuICAgICAgICBDb25zaXN0ZW50UmVhZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGdldEl0ZW1SZXN1bHQuSXRlbT8uUEs/LlMpLnRvQmUoJ2JlZm9yZS1vcnBoYW4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gQ2xlYW4gdXAgdGhlIHJldGFpbmVkIHRhYmxlIHRvIGF2b2lkIGxlYWtpbmcgcmVzb3VyY2VzXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXh0dXJlLmF3cy5keW5hbW9EYi5kZWxldGVUYWJsZSh7IFRhYmxlTmFtZTogdGFibGVOYW1lISB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICB9XG4gICAgfVxuICB9KSxcbik7XG4iXX0=