awscfn 1.6.1 → 1.7.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/README.md +2 -0
- package/bin/awscfn +1 -1
- package/dist/lib/cfn/deleteStack.d.ts +5 -1
- package/dist/lib/cfn/deleteStack.d.ts.map +1 -1
- package/dist/lib/cfn/deleteStack.js +7 -2
- package/dist/lib/cfn/deleteStack.js.map +1 -1
- package/dist/lib/cfn/executeChangeSet.d.ts +4 -1
- package/dist/lib/cfn/executeChangeSet.d.ts.map +1 -1
- package/dist/lib/cfn/executeChangeSet.js +2 -1
- package/dist/lib/cfn/executeChangeSet.js.map +1 -1
- package/dist/lib/cfn/getStackByName.js +2 -2
- package/dist/lib/cfn/getStackByName.js.map +1 -1
- package/dist/lib/cfn/previewChangeSet.d.ts +7 -2
- package/dist/lib/cfn/previewChangeSet.d.ts.map +1 -1
- package/dist/lib/cfn/previewChangeSet.js +30 -24
- package/dist/lib/cfn/previewChangeSet.js.map +1 -1
- package/dist/previewStack.d.ts.map +1 -1
- package/dist/previewStack.js +136 -11
- package/dist/previewStack.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -176,6 +176,8 @@ awscfn preview-stack -n <STACK_NAME> -t <TEMPLATE_FILE> -p <PARAMS_FILE>
|
|
|
176
176
|
|
|
177
177
|
Use this to review Add / Modify / Remove actions (and replacement hints) before running **`create-stack`** or **`update-stack`**.
|
|
178
178
|
|
|
179
|
+
In interactive terminals, `preview-stack` will prompt to deploy immediately after the preview. In CI/non-interactive mode, no prompt is shown.
|
|
180
|
+
|
|
179
181
|
If the stack is **`ROLLBACK_COMPLETE`**, **`update-stack`** would delete and recreate it — **`preview-stack` cannot model that path** and exits with an error (delete the stack or run **`update-stack`** first).
|
|
180
182
|
|
|
181
183
|
Non-resource change-set entries (for example hooks) are counted and noted when they are not shown as table rows.
|
package/bin/awscfn
CHANGED
|
@@ -427,7 +427,7 @@ const cli = yargs
|
|
|
427
427
|
)
|
|
428
428
|
.command(
|
|
429
429
|
'preview-stack',
|
|
430
|
-
'Preview changes
|
|
430
|
+
'Preview changes (interactive deploy prompt in TTY)',
|
|
431
431
|
(cmd) => cmd.options({ ...nameOpt, ...templateOpt, ...paramsOpt, ...setOpt }),
|
|
432
432
|
({ name, template, params, set }) => {
|
|
433
433
|
runCommand(() => previewStack(name, template, params, require('../dist/cli/parseParamOverrides').parseParamOverrides(set).overrides));
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { Stack } from '@aws-sdk/client-cloudformation';
|
|
2
|
-
export
|
|
2
|
+
export interface DeleteStackOptions {
|
|
3
|
+
waitForCompletion?: boolean;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function deleteStack(stack: Stack, options?: DeleteStackOptions): Promise<void>;
|
|
3
7
|
//# sourceMappingURL=deleteStack.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteStack.d.ts","sourceRoot":"","sources":["../../../src/lib/cfn/deleteStack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAC,MAAM,gCAAgC,CAAC;AAKzE,
|
|
1
|
+
{"version":3,"file":"deleteStack.d.ts","sourceRoot":"","sources":["../../../src/lib/cfn/deleteStack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAC,MAAM,gCAAgC,CAAC;AAKzE,MAAM,WAAW,kBAAkB;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAsB,WAAW,CAC7B,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
|
|
@@ -5,12 +5,17 @@ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
|
|
|
5
5
|
const waitUntilStackTerminal_1 = require("./waitUntilStackTerminal");
|
|
6
6
|
const toResult_1 = require("../toResult");
|
|
7
7
|
const _1 = require(".");
|
|
8
|
-
async function deleteStack(stack) {
|
|
8
|
+
async function deleteStack(stack, options = {}) {
|
|
9
|
+
const { waitForCompletion = true, timeoutMs } = options;
|
|
9
10
|
console.log(`deleting stack ${stack.StackName}...`);
|
|
10
11
|
const cf = (0, _1.getCfClient)();
|
|
11
12
|
const deleteStackCommand = new client_cloudformation_1.DeleteStackCommand({ StackName: stack.StackName });
|
|
12
13
|
await cf.send(deleteStackCommand);
|
|
13
|
-
|
|
14
|
+
if (!waitForCompletion) {
|
|
15
|
+
console.log(`🗑 delete requested for stack ${stack.StackName} (${stack.StackId})`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const [err] = await (0, toResult_1.toResultAsync)((0, waitUntilStackTerminal_1.waitUntilStackTerminalWithEvents)(stack.StackName, timeoutMs ? { timeoutMs } : {}));
|
|
14
19
|
if (err && err.message !== 'stack not found')
|
|
15
20
|
throw err;
|
|
16
21
|
console.log(`🗑 successfully deleted stack ${stack.StackName} (${stack.StackId})`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteStack.js","sourceRoot":"","sources":["../../../src/lib/cfn/deleteStack.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"deleteStack.js","sourceRoot":"","sources":["../../../src/lib/cfn/deleteStack.ts"],"names":[],"mappings":";;AAUA,kCA8BC;AAxCD,0EAAyE;AACzE,qEAA0E;AAC1E,0CAA0C;AAC1C,wBAA8B;AAOvB,KAAK,UAAU,WAAW,CAC7B,KAAY,EACZ,UAA8B,EAAE;IAGhC,MAAM,EAAC,iBAAiB,GAAG,IAAI,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC;IAEpD,MAAM,EAAE,GAAG,IAAA,cAAW,GAAE,CAAC;IACzB,MAAM,kBAAkB,GAAG,IAAI,0CAAkB,CAAC,EAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAC,CAAC,CAAC;IAEhF,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAElC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAErB,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QACnF,OAAO;IAEX,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAA,wBAAa,EAAC,IAAA,yDAAgC,EAC9D,KAAK,CAAC,SAAmB,EACzB,SAAS,CAAC,CAAC,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,CAAC,EAAE,CAC/B,CAAC,CAAC;IAEH,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,iBAAiB;QAAE,MAAM,GAAG,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAEvF,CAAC"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { Template, TemplateParams } from './index';
|
|
2
2
|
export type ChangeSetOperation = 'UPDATE' | 'CREATE';
|
|
3
|
+
export interface SubmitChangeSetOptions {
|
|
4
|
+
clientToken?: string;
|
|
5
|
+
}
|
|
3
6
|
/**
|
|
4
7
|
* Create a change set and return its ARN/id (does not wait).
|
|
5
8
|
*/
|
|
6
|
-
export declare function submitChangeSetRequest<P extends TemplateParams>(stackName: string, template: Template<P>, operation: ChangeSetOperation): Promise<string>;
|
|
9
|
+
export declare function submitChangeSetRequest<P extends TemplateParams>(stackName: string, template: Template<P>, operation: ChangeSetOperation, options?: SubmitChangeSetOptions): Promise<string>;
|
|
7
10
|
/**
|
|
8
11
|
* Wait until the change set finishes building ({@link waitUntilChangeSetCreateComplete}) with spinner.
|
|
9
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeChangeSet.d.ts","sourceRoot":"","sources":["../../../src/lib/cfn/executeChangeSet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;AAG9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"executeChangeSet.d.ts","sourceRoot":"","sources":["../../../src/lib/cfn/executeChangeSet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;AAG9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACrD,MAAM,WAAW,sBAAsB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB;AAoBD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,SAAS,cAAc,EACjE,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,GAAE,sBAA2B,GACrC,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9E;AAiBD,wBAAsB,sBAAsB,CAAC,CAAC,SAAS,cAAc,EACjE,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,SAAS,EAAE,kBAAkB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAejB"}
|
|
@@ -21,7 +21,7 @@ function toCfnParameters(params) {
|
|
|
21
21
|
/**
|
|
22
22
|
* Create a change set and return its ARN/id (does not wait).
|
|
23
23
|
*/
|
|
24
|
-
async function submitChangeSetRequest(stackName, template, operation) {
|
|
24
|
+
async function submitChangeSetRequest(stackName, template, operation, options = {}) {
|
|
25
25
|
const cf = (0, index_1.getCfClient)();
|
|
26
26
|
const changeSetName = `${stackName}-rev-${Date.now()}`;
|
|
27
27
|
const templateBody = typeof template === 'string' ? template : template.body;
|
|
@@ -35,6 +35,7 @@ async function submitChangeSetRequest(stackName, template, operation) {
|
|
|
35
35
|
ChangeSetType: operation,
|
|
36
36
|
Parameters: parameters,
|
|
37
37
|
Capabilities: ['CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND'],
|
|
38
|
+
ClientToken: options.clientToken,
|
|
38
39
|
}));
|
|
39
40
|
return changeset.Id;
|
|
40
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeChangeSet.js","sourceRoot":"","sources":["../../../src/lib/cfn/executeChangeSet.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"executeChangeSet.js","sourceRoot":"","sources":["../../../src/lib/cfn/executeChangeSet.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
|
|
|
5
5
|
const toResult_1 = require("../toResult");
|
|
6
6
|
const _1 = require(".");
|
|
7
7
|
async function getStackByName(name, suppressLog = false) {
|
|
8
|
-
!suppressLog && console.log(`looking up stack ${name}`);
|
|
8
|
+
!suppressLog && console.log(`looking up stack "${name}"`);
|
|
9
9
|
const cf = (0, _1.getCfClient)();
|
|
10
10
|
const [error, result] = await (0, toResult_1.toResultAsync)(cf.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: name })));
|
|
11
11
|
if (error) {
|
|
@@ -17,7 +17,7 @@ async function getStackByName(name, suppressLog = false) {
|
|
|
17
17
|
}
|
|
18
18
|
const stack = result.Stacks ? result.Stacks[0] : undefined;
|
|
19
19
|
if (stack) {
|
|
20
|
-
!suppressLog && console.log(`found stack ${name} as ${stack.StackId}`);
|
|
20
|
+
!suppressLog && console.log(`found stack "${name}" as ${stack.StackId}`);
|
|
21
21
|
return stack;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStackByName.js","sourceRoot":"","sources":["../../../src/lib/cfn/getStackByName.ts"],"names":[],"mappings":";;AAIA,wCA4BC;AAhCD,0EAA4E;AAC5E,0CAA0C;AAC1C,wBAA8B;AAEvB,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,cAAuB,KAAK;IAE3E,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"getStackByName.js","sourceRoot":"","sources":["../../../src/lib/cfn/getStackByName.ts"],"names":[],"mappings":";;AAIA,wCA4BC;AAhCD,0EAA4E;AAC5E,0CAA0C;AAC1C,wBAA8B;AAEvB,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,cAAuB,KAAK;IAE3E,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;IAE1D,MAAM,EAAE,GAAG,IAAA,cAAW,GAAE,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,IAAA,wBAAa,EAAC,EAAE,CAAC,IAAI,CAAC,IAAI,6CAAqB,CAAC,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,CAAC;IAEnG,IAAI,KAAK,EAAE,CAAC;QAER,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAE/E,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpD,OAAO;QAEX,CAAC;QACD,MAAM,KAAK,CAAC,CAAC,4BAA4B;IAE7C,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3D,IAAI,KAAK,EAAE,CAAC;QAER,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,OAAO,KAAK,CAAC;IAEjB,CAAC;AAEL,CAAC"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import { type ChangeSetOperation } from './executeChangeSet';
|
|
1
|
+
import { type ChangeSetOperation, type SubmitChangeSetOptions } from './executeChangeSet';
|
|
2
2
|
import { Template, TemplateParams } from './index';
|
|
3
|
+
export interface PreviewChangeSetOptions extends SubmitChangeSetOptions {
|
|
4
|
+
}
|
|
5
|
+
export interface PreviewChangeSetResult {
|
|
6
|
+
previewStackId?: string;
|
|
7
|
+
}
|
|
3
8
|
/**
|
|
4
9
|
* Build a change set, print planned resource changes (without executing), then delete the change set.
|
|
5
10
|
*/
|
|
6
|
-
export declare function previewChangeSet<P extends TemplateParams>(stackName: string, template: Template<P>, operation: ChangeSetOperation): Promise<
|
|
11
|
+
export declare function previewChangeSet<P extends TemplateParams>(stackName: string, template: Template<P>, operation: ChangeSetOperation, options?: PreviewChangeSetOptions): Promise<PreviewChangeSetResult>;
|
|
7
12
|
//# sourceMappingURL=previewChangeSet.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"previewChangeSet.d.ts","sourceRoot":"","sources":["../../../src/lib/cfn/previewChangeSet.ts"],"names":[],"mappings":"AAOA,OAAO,EAGH,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"previewChangeSet.d.ts","sourceRoot":"","sources":["../../../src/lib/cfn/previewChangeSet.ts"],"names":[],"mappings":"AAOA,OAAO,EAGH,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;AAG9D,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;CAAG;AAC1E,MAAM,WAAW,sBAAsB;IACnC,cAAc,CAAC,EAAE,MAAM,CAAA;CAC1B;AAqJD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,cAAc,EAC3D,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,GAAE,uBAA4B,GACtC,OAAO,CAAC,sBAAsB,CAAC,CAkBjC"}
|
|
@@ -53,42 +53,48 @@ function printPlannedTable(stackName, desc) {
|
|
|
53
53
|
(0, output_1.dim)(statusNote);
|
|
54
54
|
(0, output_1.success)(`${output_1.symbols.check} Preview complete — change set was not executed`);
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
function toPreviewError(original, detail, previewStackId) {
|
|
57
|
+
const error = original instanceof Error
|
|
58
|
+
? original
|
|
59
|
+
: new Error(detail, { cause: original });
|
|
60
|
+
error.message = `${detail}${original instanceof Error ? ` — ${original.message}` : ''}`;
|
|
61
|
+
error.previewStackId = previewStackId;
|
|
62
|
+
return error;
|
|
63
|
+
}
|
|
64
|
+
async function waitForPreviewDescription(changeSetId) {
|
|
65
|
+
try {
|
|
66
|
+
await (0, executeChangeSet_1.waitForChangeSetBuild)(changeSetId);
|
|
67
|
+
}
|
|
68
|
+
catch (waitErr) {
|
|
69
|
+
const descEarly = await describeChangeSetPaginated(changeSetId);
|
|
70
|
+
if (isNoChangesOutcome(descEarly))
|
|
71
|
+
return descEarly;
|
|
72
|
+
const detail = descEarly.StatusReason ?? 'Change set did not complete successfully';
|
|
73
|
+
throw toPreviewError(waitErr, detail, descEarly.StackId);
|
|
74
|
+
}
|
|
75
|
+
return describeChangeSetPaginated(changeSetId);
|
|
76
|
+
}
|
|
77
|
+
function finalizePreviewResult(stackName, desc) {
|
|
59
78
|
if (isNoChangesOutcome(desc)) {
|
|
60
79
|
(0, output_1.success)(`${output_1.symbols.check} Stack ${(0, output_1.cyan)(stackName)} — no changes to apply`);
|
|
61
|
-
return;
|
|
80
|
+
return { previewStackId: desc.StackId };
|
|
62
81
|
}
|
|
63
82
|
if (desc.Status !== 'CREATE_COMPLETE') {
|
|
64
|
-
|
|
83
|
+
const detail = desc.StatusReason ?? `Change set status: ${desc.Status ?? 'unknown'}`;
|
|
84
|
+
throw toPreviewError(new Error(detail), detail, desc.StackId);
|
|
65
85
|
}
|
|
66
86
|
printPlannedTable(stackName, desc);
|
|
87
|
+
return { previewStackId: desc.StackId };
|
|
67
88
|
}
|
|
68
89
|
/**
|
|
69
90
|
* Build a change set, print planned resource changes (without executing), then delete the change set.
|
|
70
91
|
*/
|
|
71
|
-
async function previewChangeSet(stackName, template, operation) {
|
|
92
|
+
async function previewChangeSet(stackName, template, operation, options = {}) {
|
|
72
93
|
(0, output_1.dim)(` ${output_1.symbols.bullet} Building change set ${(0, output_1.gray)(`(${operation.toLowerCase()} preview)`)}`);
|
|
73
|
-
const changeSetId = await (0, executeChangeSet_1.submitChangeSetRequest)(stackName, template, operation);
|
|
94
|
+
const changeSetId = await (0, executeChangeSet_1.submitChangeSetRequest)(stackName, template, operation, options);
|
|
74
95
|
try {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
catch (waitErr) {
|
|
79
|
-
const descEarly = await describeChangeSetPaginated(changeSetId);
|
|
80
|
-
if (isNoChangesOutcome(descEarly)) {
|
|
81
|
-
(0, output_1.success)(`${output_1.symbols.check} Stack ${(0, output_1.cyan)(stackName)} — no changes to apply`);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
const detail = descEarly.StatusReason ?? 'Change set did not complete successfully';
|
|
85
|
-
if (waitErr instanceof Error) {
|
|
86
|
-
waitErr.message = `${detail} — ${waitErr.message}`;
|
|
87
|
-
throw waitErr;
|
|
88
|
-
}
|
|
89
|
-
throw new Error(detail, { cause: waitErr });
|
|
90
|
-
}
|
|
91
|
-
await runPreviewFromBuiltChangeSet(stackName, changeSetId);
|
|
96
|
+
const desc = await waitForPreviewDescription(changeSetId);
|
|
97
|
+
return finalizePreviewResult(stackName, desc);
|
|
92
98
|
}
|
|
93
99
|
finally {
|
|
94
100
|
await deleteChangeSetQuiet(changeSetId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"previewChangeSet.js","sourceRoot":"","sources":["../../../src/lib/cfn/previewChangeSet.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"previewChangeSet.js","sourceRoot":"","sources":["../../../src/lib/cfn/previewChangeSet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"previewStack.d.ts","sourceRoot":"","sources":["../src/previewStack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"previewStack.d.ts","sourceRoot":"","sources":["../src/previewStack.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,wBAAsB,YAAY,CAC9B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAWf"}
|
package/dist/previewStack.js
CHANGED
|
@@ -34,11 +34,17 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.previewStack = previewStack;
|
|
37
|
+
const node_crypto_1 = require("node:crypto");
|
|
38
|
+
const node_process_1 = require("node:process");
|
|
39
|
+
const promises_1 = require("node:readline/promises");
|
|
37
40
|
const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
|
|
38
41
|
const cfn = __importStar(require("./lib/cfn"));
|
|
42
|
+
const log_1 = require("./cli/log");
|
|
39
43
|
const loadTemplateAndParams_1 = require("./cli/loadTemplateAndParams");
|
|
40
44
|
const validateTemplate_1 = require("./cli/validateTemplate");
|
|
41
45
|
const output_1 = require("./lib/output");
|
|
46
|
+
const PREVIEW_DELETE_WAIT_TIMEOUT_MS = 2 * 60 * 1000;
|
|
47
|
+
const PREVIEW_DELETE_POLL_MS = 3000;
|
|
42
48
|
/**
|
|
43
49
|
* CLI: preview stack changes without executing (build change set, print table, delete change set).
|
|
44
50
|
* CREATE vs UPDATE matches whether the stack already exists.
|
|
@@ -47,6 +53,34 @@ async function previewStack(stackName, templatePath, paramsPath, overrides) {
|
|
|
47
53
|
cfn.initCloudFormationClient();
|
|
48
54
|
const { template, params } = await (0, loadTemplateAndParams_1.loadTemplateAndParams)(templatePath, paramsPath, overrides);
|
|
49
55
|
const existing = await cfn.getStackByName(stackName);
|
|
56
|
+
const previewRunId = createPreviewRunId();
|
|
57
|
+
await ensurePreviewable(stackName, template, existing);
|
|
58
|
+
await previewThenMaybeDeploy(stackName, template, params, existing, previewRunId);
|
|
59
|
+
}
|
|
60
|
+
async function previewThenMaybeDeploy(stackName, template, params, existing, previewRunId) {
|
|
61
|
+
const previewStackId = await runPreviewChangeSet(stackName, template, params, existing, previewRunId);
|
|
62
|
+
const shouldDeploy = await promptDeployAfterPreview(stackName);
|
|
63
|
+
await cleanupCreatePreviewStackBestEffort(existing, stackName, shouldDeploy, previewStackId, previewRunId);
|
|
64
|
+
if (!shouldDeploy)
|
|
65
|
+
return;
|
|
66
|
+
(0, output_1.info)(`${output_1.symbols.arrow} Deploying stack ${(0, output_1.cyan)(stackName)} from preview...`);
|
|
67
|
+
await deployPreview(stackName, template, params);
|
|
68
|
+
}
|
|
69
|
+
async function runPreviewChangeSet(stackName, template, params, existing, previewRunId) {
|
|
70
|
+
const operation = existing ? 'UPDATE' : 'CREATE';
|
|
71
|
+
(0, output_1.info)(`${output_1.symbols.arrow} Preview ${(0, output_1.cyan)(operation)} for stack ${(0, output_1.cyan)(stackName)}`);
|
|
72
|
+
try {
|
|
73
|
+
const previewResult = await cfn.previewChangeSet(stackName, { body: template, params }, operation, { clientToken: previewRunId });
|
|
74
|
+
return previewResult.previewStackId;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
const previewStackId = getPreviewStackIdFromError(error)
|
|
78
|
+
?? await resolvePreviewStackId(existing, stackName);
|
|
79
|
+
await cleanupCreatePreviewStackBestEffort(existing, stackName, false, previewStackId, previewRunId);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function ensurePreviewable(stackName, template, existing) {
|
|
50
84
|
if (existing?.StackStatus === client_cloudformation_1.StackStatus.ROLLBACK_COMPLETE) {
|
|
51
85
|
(0, output_1.warn)(`Stack ${stackName} is in ROLLBACK_COMPLETE; update-stack would delete and recreate it. `
|
|
52
86
|
+ 'Preview cannot model that flow.');
|
|
@@ -54,24 +88,115 @@ async function previewStack(stackName, templatePath, paramsPath, overrides) {
|
|
|
54
88
|
}
|
|
55
89
|
console.log('validating template...');
|
|
56
90
|
await (0, validateTemplate_1.validateTemplateOrExit)(template);
|
|
57
|
-
|
|
58
|
-
|
|
91
|
+
}
|
|
92
|
+
async function cleanupCreatePreviewStackBestEffort(existing, stackName, waitForCompletion, expectedStackId, previewRunId) {
|
|
59
93
|
try {
|
|
60
|
-
await
|
|
94
|
+
await cleanupCreatePreviewStack(existing, stackName, waitForCompletion, expectedStackId, previewRunId);
|
|
61
95
|
}
|
|
62
|
-
|
|
63
|
-
|
|
96
|
+
catch (error) {
|
|
97
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
98
|
+
(0, output_1.warn)(`Could not fully clean preview stack "${stackName}": ${message}`);
|
|
64
99
|
}
|
|
65
100
|
}
|
|
66
|
-
async function cleanupCreatePreviewStack(existing, stackName) {
|
|
67
|
-
if (existing)
|
|
101
|
+
async function cleanupCreatePreviewStack(existing, stackName, waitForCompletion, expectedStackId, previewRunId) {
|
|
102
|
+
if (shouldSkipPreviewCleanup(existing, stackName, expectedStackId, previewRunId))
|
|
103
|
+
return;
|
|
104
|
+
const verifiedStackId = expectedStackId;
|
|
105
|
+
const createdForPreview = await getOwnedPreviewStackForCleanup(stackName, verifiedStackId);
|
|
106
|
+
if (!createdForPreview)
|
|
68
107
|
return;
|
|
108
|
+
const status = createdForPreview.StackStatus;
|
|
109
|
+
const needsDelete = status === client_cloudformation_1.StackStatus.REVIEW_IN_PROGRESS;
|
|
110
|
+
const alreadyDeleting = status === client_cloudformation_1.StackStatus.DELETE_IN_PROGRESS;
|
|
111
|
+
if (!needsDelete && !alreadyDeleting) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (needsDelete) {
|
|
115
|
+
(0, output_1.warn)(`Preview created stack ${stackName} in REVIEW_IN_PROGRESS. `
|
|
116
|
+
+ 'Cleaning it up automatically...');
|
|
117
|
+
await cfn.deleteStack(createdForPreview, { waitForCompletion: false });
|
|
118
|
+
}
|
|
119
|
+
if (waitForCompletion) {
|
|
120
|
+
await waitForPreviewDeletion(stackName, verifiedStackId);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function shouldSkipPreviewCleanup(existing, stackName, expectedStackId, previewRunId) {
|
|
124
|
+
if (existing)
|
|
125
|
+
return true;
|
|
126
|
+
if (expectedStackId)
|
|
127
|
+
return false;
|
|
128
|
+
(0, output_1.warn)(`Skipping automatic preview cleanup for stack "${stackName}" `
|
|
129
|
+
+ `${previewRunId ? `(run ${previewRunId.slice(0, 8)}) ` : ''}`
|
|
130
|
+
+ 'because ownership could not be verified.');
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
async function getOwnedPreviewStackForCleanup(stackName, expectedStackId) {
|
|
134
|
+
const createdForPreview = await cfn.getStackByName(stackName, true);
|
|
135
|
+
if (!createdForPreview)
|
|
136
|
+
return undefined;
|
|
137
|
+
if (isOwnedPreviewStack(createdForPreview, expectedStackId))
|
|
138
|
+
return createdForPreview;
|
|
139
|
+
(0, output_1.warn)(`Skipping automatic preview cleanup for stack "${stackName}" `
|
|
140
|
+
+ 'because stack identity changed.');
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
async function waitForPreviewDeletion(stackName, expectedStackId) {
|
|
144
|
+
const startedAt = Date.now();
|
|
145
|
+
while (Date.now() - startedAt < PREVIEW_DELETE_WAIT_TIMEOUT_MS) {
|
|
146
|
+
const current = await cfn.getStackByName(stackName, true);
|
|
147
|
+
if (!current)
|
|
148
|
+
return;
|
|
149
|
+
if (!isOwnedPreviewStack(current, expectedStackId)) {
|
|
150
|
+
(0, output_1.warn)(`Stopping preview cleanup wait for stack "${stackName}" `
|
|
151
|
+
+ 'because stack identity changed.');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
await new Promise((resolve) => setTimeout(resolve, PREVIEW_DELETE_POLL_MS));
|
|
155
|
+
}
|
|
156
|
+
throw new Error(`Timed out waiting for preview cleanup to delete stack "${stackName}". `
|
|
157
|
+
+ 'Try again in a minute.');
|
|
158
|
+
}
|
|
159
|
+
function createPreviewRunId() {
|
|
160
|
+
return (0, node_crypto_1.randomUUID)();
|
|
161
|
+
}
|
|
162
|
+
function getPreviewStackIdFromError(error) {
|
|
163
|
+
return error?.previewStackId;
|
|
164
|
+
}
|
|
165
|
+
async function resolvePreviewStackId(existing, stackName) {
|
|
166
|
+
if (existing)
|
|
167
|
+
return undefined;
|
|
69
168
|
const createdForPreview = await cfn.getStackByName(stackName, true);
|
|
70
|
-
|
|
169
|
+
return createdForPreview?.StackId;
|
|
170
|
+
}
|
|
171
|
+
function isOwnedPreviewStack(stack, expectedStackId) {
|
|
172
|
+
return stack.StackId === expectedStackId;
|
|
173
|
+
}
|
|
174
|
+
function canPromptInteractively() {
|
|
175
|
+
return node_process_1.stdin.isTTY === true
|
|
176
|
+
&& node_process_1.stdout.isTTY === true
|
|
177
|
+
&& process.env.CI !== 'true'
|
|
178
|
+
&& process.env.GITHUB_ACTIONS !== 'true';
|
|
179
|
+
}
|
|
180
|
+
async function promptDeployAfterPreview(stackName) {
|
|
181
|
+
if (!canPromptInteractively())
|
|
182
|
+
return false;
|
|
183
|
+
const rl = (0, promises_1.createInterface)({ input: node_process_1.stdin, output: node_process_1.stdout });
|
|
184
|
+
try {
|
|
185
|
+
const answer = (await rl.question(`Deploy stack "${stackName}" now using update/create flow? [y/N] `)).trim().toLowerCase();
|
|
186
|
+
return answer === 'y' || answer === 'yes';
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
rl.close();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function deployPreview(stackName, template, params) {
|
|
193
|
+
const latest = await cfn.getStackByName(stackName, true);
|
|
194
|
+
if (!latest) {
|
|
195
|
+
(0, log_1.logStackAction)(stackName, 'creating', params);
|
|
196
|
+
await cfn.createStack(stackName, { body: template, params });
|
|
71
197
|
return;
|
|
72
198
|
}
|
|
73
|
-
(0,
|
|
74
|
-
|
|
75
|
-
await cfn.deleteStack(createdForPreview);
|
|
199
|
+
(0, log_1.logStackAction)(stackName, 'updating', params);
|
|
200
|
+
await cfn.updateStack(latest, { body: template, params });
|
|
76
201
|
}
|
|
77
202
|
//# sourceMappingURL=previewStack.js.map
|
package/dist/previewStack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"previewStack.js","sourceRoot":"","sources":["../src/previewStack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"previewStack.js","sourceRoot":"","sources":["../src/previewStack.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED