@aws-cdk/toolkit-lib 1.24.0 → 1.25.1
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/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/actions/deploy/index.d.ts +15 -1
- package/lib/actions/deploy/index.js +1 -1
- package/lib/actions/deploy/private/deployment-method.d.ts +5 -9
- package/lib/actions/deploy/private/deployment-method.js +8 -1
- package/lib/actions/diagnose/index.d.ts +89 -0
- package/lib/actions/diagnose/index.js +3 -0
- package/lib/actions/diff/private/helpers.js +12 -15
- package/lib/actions/index.d.ts +2 -0
- package/lib/actions/index.js +3 -1
- package/lib/actions/orphan/index.d.ts +18 -0
- package/lib/actions/orphan/index.js +3 -0
- package/lib/api/aws-auth/sdk.d.ts +2 -1
- package/lib/api/aws-auth/sdk.js +2 -1
- package/lib/api/bootstrap/bootstrap-environment.js +4 -4
- package/lib/api/bootstrap/bootstrap-template.yaml +5 -16
- package/lib/api/bootstrap/deploy-bootstrap.js +9 -1
- package/lib/api/cloud-assembly/stack-selector.d.ts +1 -1
- package/lib/api/cloud-assembly/stack-selector.js +1 -1
- package/lib/api/cloudformation/index.d.ts +1 -0
- package/lib/api/cloudformation/index.js +2 -1
- package/lib/api/cloudformation/logical-id-map.d.ts +24 -0
- package/lib/api/cloudformation/logical-id-map.js +45 -0
- package/lib/api/cloudformation/stack-helpers.d.ts +6 -0
- package/lib/api/cloudformation/stack-helpers.js +12 -1
- package/lib/api/deployments/cfn-api.d.ts +8 -17
- package/lib/api/deployments/cfn-api.js +60 -71
- package/lib/api/deployments/deploy-stack.d.ts +6 -2
- package/lib/api/deployments/deploy-stack.js +43 -61
- package/lib/api/deployments/deployments.d.ts +3 -2
- package/lib/api/deployments/deployments.js +31 -7
- package/lib/api/diagnosing/changeset-error-fetcher.d.ts +51 -0
- package/lib/api/diagnosing/changeset-error-fetcher.js +83 -0
- package/lib/api/diagnosing/diagnosis-formatting.d.ts +13 -0
- package/lib/api/diagnosing/diagnosis-formatting.js +140 -0
- package/lib/api/diagnosing/stack-diagnoser.d.ts +106 -0
- package/lib/api/diagnosing/stack-diagnoser.js +354 -0
- package/lib/api/diagnosing/tree-builder.d.ts +13 -0
- package/lib/api/diagnosing/tree-builder.js +86 -0
- package/lib/api/diagnosing/tree.d.ts +19 -0
- package/lib/api/diagnosing/tree.js +72 -0
- package/lib/api/diff/diff-formatter.js +8 -12
- package/lib/api/drift/drift-formatter.d.ts +0 -1
- package/lib/api/drift/drift-formatter.js +3 -10
- package/lib/api/hotswap/hotswap-deployments.js +14 -2
- package/lib/api/hotswap/hotswap-template-cache.d.ts +19 -0
- package/lib/api/hotswap/hotswap-template-cache.js +96 -0
- package/lib/api/index.d.ts +1 -0
- package/lib/api/index.js +2 -1
- package/lib/api/io/private/messages.d.ts +5 -0
- package/lib/api/io/private/messages.js +23 -1
- package/lib/api/io/toolkit-action.d.ts +1 -1
- package/lib/api/io/toolkit-action.js +1 -1
- package/lib/api/orphan/orphaner.d.ts +75 -0
- package/lib/api/orphan/orphaner.js +246 -0
- package/lib/api/orphan/private/helpers.d.ts +56 -0
- package/lib/api/orphan/private/helpers.js +219 -0
- package/lib/api/orphan/private/index.d.ts +2 -0
- package/lib/api/orphan/private/index.js +18 -0
- package/lib/api/resource-import/importer.d.ts +5 -1
- package/lib/api/resource-import/importer.js +26 -6
- package/lib/api/settings.d.ts +3 -1
- package/lib/api/settings.js +16 -3
- package/lib/api/source-tracing/index.d.ts +2 -0
- package/lib/api/source-tracing/index.js +18 -0
- package/lib/api/source-tracing/private/source-tracing.d.ts +16 -0
- package/lib/api/source-tracing/private/source-tracing.js +8 -0
- package/lib/api/source-tracing/private/stack-source-tracing.d.ts +32 -0
- package/lib/api/source-tracing/private/stack-source-tracing.js +134 -0
- package/lib/api/source-tracing/types.d.ts +9 -0
- package/lib/api/source-tracing/types.js +3 -0
- package/lib/api/stack-events/resource-errors.d.ts +82 -0
- package/lib/api/stack-events/resource-errors.js +129 -0
- package/lib/api/stack-events/stack-activity-monitor.d.ts +2 -29
- package/lib/api/stack-events/stack-activity-monitor.js +6 -95
- package/lib/api/stack-events/stack-event-poller.d.ts +71 -8
- package/lib/api/stack-events/stack-event-poller.js +107 -13
- package/lib/api/stack-events/stack-progress-monitor.d.ts +2 -2
- package/lib/api/stack-events/stack-progress-monitor.js +8 -2
- package/lib/api/work-graph/work-graph.d.ts +4 -0
- package/lib/api/work-graph/work-graph.js +6 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/index_bg.wasm +0 -0
- package/lib/toolkit/toolkit.d.ts +17 -1
- package/lib/toolkit/toolkit.js +194 -57
- package/lib/util/arrays.d.ts +1 -0
- package/lib/util/arrays.js +23 -1
- package/lib/util/type-brands.d.ts +1 -1
- package/lib/util/type-brands.js +1 -1
- package/package.json +13 -13
- package/lib/api/deployments/early-validation.d.ts +0 -19
- package/lib/api/deployments/early-validation.js +0 -57
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hostMessageFromDiagnosis = hostMessageFromDiagnosis;
|
|
4
|
+
exports.throwDeploymentErrorFromDiagnosis = throwDeploymentErrorFromDiagnosis;
|
|
5
|
+
const tree_builder_1 = require("./tree-builder");
|
|
6
|
+
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
7
|
+
const util_1 = require("../../util");
|
|
8
|
+
const private_1 = require("../io/private");
|
|
9
|
+
/**
|
|
10
|
+
* Turn the given stack diagnosis result into an IO message, with default message formatting
|
|
11
|
+
*
|
|
12
|
+
* The default message formatting is what the CLI will print.
|
|
13
|
+
*/
|
|
14
|
+
function hostMessageFromDiagnosis(stack) {
|
|
15
|
+
const diagnosis = stack.result;
|
|
16
|
+
switch (diagnosis.type) {
|
|
17
|
+
case 'no-problem':
|
|
18
|
+
return private_1.IO.CDK_TOOLKIT_I9500.msg(formatNoProblemStack(stack, diagnosis), stack);
|
|
19
|
+
case 'problem':
|
|
20
|
+
return private_1.IO.CDK_TOOLKIT_E9500.msg(formatProblemStack(stack, diagnosis), stack);
|
|
21
|
+
case 'error-diagnosing':
|
|
22
|
+
return private_1.IO.CDK_TOOLKIT_W9501.msg(formatDiagnosisErrorStack(stack, diagnosis), stack);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Turn the given diagnosis into a DeploymentError
|
|
27
|
+
*/
|
|
28
|
+
function throwDeploymentErrorFromDiagnosis(diag) {
|
|
29
|
+
switch (diag.type) {
|
|
30
|
+
case 'no-problem':
|
|
31
|
+
throw new toolkit_error_1.ToolkitError('DeploymentErrorNotError', 'Diagnosis should represent an error, but does not');
|
|
32
|
+
case 'error-diagnosing':
|
|
33
|
+
throw new toolkit_error_1.DeploymentError(diag.message, 'ErrorDiagnosisFailed');
|
|
34
|
+
}
|
|
35
|
+
// Guaranteed 'type=problem' here
|
|
36
|
+
const errorCode = diag.problems[0]?.errorCode;
|
|
37
|
+
let defaultErrorCode;
|
|
38
|
+
switch (diag.detectedBy.type) {
|
|
39
|
+
case 'change-set':
|
|
40
|
+
defaultErrorCode = 'ChangeSetCreationFailed';
|
|
41
|
+
break;
|
|
42
|
+
case 'early-validation':
|
|
43
|
+
defaultErrorCode = 'EarlyValidationFailure';
|
|
44
|
+
break;
|
|
45
|
+
case 'deployment':
|
|
46
|
+
defaultErrorCode = 'StackDeployFailed';
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
throw new toolkit_error_1.DeploymentError(formatProblemDiagnosis(diag), errorCode ?? defaultErrorCode);
|
|
50
|
+
}
|
|
51
|
+
function formatProblemDiagnosis(diag) {
|
|
52
|
+
switch (diag.detectedBy.type) {
|
|
53
|
+
case 'change-set':
|
|
54
|
+
return formatChangeSetProblems(diag.problems, diag.detectedBy);
|
|
55
|
+
case 'early-validation':
|
|
56
|
+
return formatEarlyValidationProblems(diag.problems, diag.detectedBy);
|
|
57
|
+
case 'deployment':
|
|
58
|
+
return formatDeploymentProblems(diag.problems, diag.detectedBy);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function formatChangeSetProblems(problems, detectedBy) {
|
|
62
|
+
const caption = `Failed to create change set ${detectedBy.changeSetName}`;
|
|
63
|
+
if (problems.length > 0) {
|
|
64
|
+
return `${caption}:\n${formatResourceErrors(problems)}`;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
return `${caption}: ${detectedBy.statusReason}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function formatEarlyValidationProblems(problems, detectedBy) {
|
|
71
|
+
const caption = `Early validation failed for change set ${detectedBy.changeSetName}`;
|
|
72
|
+
if (problems.length > 0) {
|
|
73
|
+
return `${caption}:\n${formatResourceErrors(problems)}`;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return caption;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function formatDeploymentProblems(problems, detectedBy) {
|
|
80
|
+
const caption = 'Resource updates failed';
|
|
81
|
+
if (problems.length > 0) {
|
|
82
|
+
return `${caption}:\n${formatResourceErrors(problems)}`;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return `${caption} (${detectedBy.stackStatus}): ${detectedBy.statusReason}`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function formatNoProblemStack(stack, _m) {
|
|
89
|
+
// TODO: print stack by construct path, not name
|
|
90
|
+
return `✅ Stack ${stack.stackName}: no issues found.`;
|
|
91
|
+
}
|
|
92
|
+
function formatProblemStack(stack, m) {
|
|
93
|
+
// TODO: print stack by construct path, not name
|
|
94
|
+
return `❌ Stack ${stack.stackName}:\n${formatProblemDiagnosis(m)}`;
|
|
95
|
+
}
|
|
96
|
+
function formatDiagnosisErrorStack(stack, m) {
|
|
97
|
+
// TODO: print stack by construct path, not name
|
|
98
|
+
return `⚠️ Could not diagnose stack ${stack.stackName}: ${m.message}`;
|
|
99
|
+
}
|
|
100
|
+
function formatResourceErrors(es) {
|
|
101
|
+
(0, util_1.sortByKey)(es, (e) => [locateResourceError(e)]);
|
|
102
|
+
const b = new tree_builder_1.TreeBuilder('');
|
|
103
|
+
for (const e of es) {
|
|
104
|
+
const p = locateResourceError(e);
|
|
105
|
+
const lastPart = p.split('/').slice(-1)[0];
|
|
106
|
+
const nodeText = b.nodeText(p);
|
|
107
|
+
nodeText.header = [`${lastPart} ${addendum(' ', e.resourceType, e.logicalId)}`.trim()];
|
|
108
|
+
nodeText.body.push(...(0, tree_builder_1.sideBySide)(['🛑'], ' ', (0, tree_builder_1.wrapText)(120, e.message)));
|
|
109
|
+
nodeText.footer = e.sourceTrace?.creationStackTrace
|
|
110
|
+
? (0, tree_builder_1.sideBySide)(['Source Location:'], ' ', e.sourceTrace?.creationStackTrace)
|
|
111
|
+
: [];
|
|
112
|
+
}
|
|
113
|
+
return b.render();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Return a /-separated construct path for the given error, or try to build as close a represention as possible if we don't have a construct path
|
|
117
|
+
*
|
|
118
|
+
* The root will be the "app"
|
|
119
|
+
*/
|
|
120
|
+
function locateResourceError(e) {
|
|
121
|
+
if (e.sourceTrace?.constructPath) {
|
|
122
|
+
return e.sourceTrace?.constructPath;
|
|
123
|
+
}
|
|
124
|
+
const nestedStackParts = e.parentStackLogicalIds.map((l) => `Nested stack ${l}`);
|
|
125
|
+
if (e.logicalId) {
|
|
126
|
+
return [e.topLevelStackHierarchicalId, ...nestedStackParts, e.logicalId].join('/');
|
|
127
|
+
}
|
|
128
|
+
// No logical ID means we are targeting the stack itself
|
|
129
|
+
return [e.topLevelStackHierarchicalId, nestedStackParts].join('/');
|
|
130
|
+
}
|
|
131
|
+
function addendum(sep, ...xs) {
|
|
132
|
+
xs = xs.filter(x => x && typeof x === 'string');
|
|
133
|
+
if (xs.length > 0) {
|
|
134
|
+
return `(${xs.join(sep)})`;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
return '';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc2lzLWZvcm1hdHRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWFnbm9zaXMtZm9ybWF0dGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLDREQWFDO0FBS0QsOEVBMkJDO0FBekRELGlEQUFtRTtBQUVuRSwrREFBNEU7QUFDNUUscUNBQXVDO0FBRXZDLDJDQUFtQztBQUVuQzs7OztHQUlHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsS0FBcUI7SUFDNUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUUvQixRQUFRLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLFlBQVk7WUFDZixPQUFPLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWpGLEtBQUssU0FBUztZQUNaLE9BQU8sWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0UsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsSUFBb0I7SUFDcEUsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsTUFBTSxJQUFJLDRCQUFZLENBQUMseUJBQXlCLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUV6RyxLQUFLLGtCQUFrQjtZQUNyQixNQUFNLElBQUksK0JBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLENB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Q2xCLE9BQU8sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDN0IsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2lkZUJ5U2lkZSwgVHJlZUJ1aWxkZXIsIHdyYXBUZXh0IH0gZnJvbSAnLi90cmVlLWJ1aWxkZXInO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zZWRTdGFjaywgU3RhY2tEaWFnbm9zaXMsIFN0YWNrUHJvYmxlbVNvdXJjZSwgVHJhY2VkUmVzb3VyY2VFcnJvciB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZGlhZ25vc2UnO1xuaW1wb3J0IHsgRGVwbG95bWVudEVycm9yLCBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHsgc29ydEJ5S2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbkxlc3NNZXNzYWdlIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5pbXBvcnQgeyBJTyB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuXG4vKipcbiAqIFR1cm4gdGhlIGdpdmVuIHN0YWNrIGRpYWdub3NpcyByZXN1bHQgaW50byBhbiBJTyBtZXNzYWdlLCB3aXRoIGRlZmF1bHQgbWVzc2FnZSBmb3JtYXR0aW5nXG4gKlxuICogVGhlIGRlZmF1bHQgbWVzc2FnZSBmb3JtYXR0aW5nIGlzIHdoYXQgdGhlIENMSSB3aWxsIHByaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9zdE1lc3NhZ2VGcm9tRGlhZ25vc2lzKHN0YWNrOiBEaWFnbm9zZWRTdGFjayk6IEFjdGlvbkxlc3NNZXNzYWdlPGFueT4ge1xuICBjb25zdCBkaWFnbm9zaXMgPSBzdGFjay5yZXN1bHQ7XG5cbiAgc3dpdGNoIChkaWFnbm9zaXMudHlwZSkge1xuICAgIGNhc2UgJ25vLXByb2JsZW0nOlxuICAgICAgcmV0dXJuIElPLkNES19UT09MS0lUX0k5NTAwLm1zZyhmb3JtYXROb1Byb2JsZW1TdGFjayhzdGFjaywgZGlhZ25vc2lzKSwgc3RhY2spO1xuXG4gICAgY2FzZSAncHJvYmxlbSc6XG4gICAgICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfRTk1MDAubXNnKGZvcm1hdFByb2JsZW1TdGFjayhzdGFjaywgZGlhZ25vc2lzKSwgc3RhY2spO1xuXG4gICAgY2FzZSAnZXJyb3ItZGlhZ25vc2luZyc6XG4gICAgICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfVzk1MDEubXNnKGZvcm1hdERpYWdub3Npc0Vycm9yU3RhY2soc3RhY2ssIGRpYWdub3NpcyksIHN0YWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIFR1cm4gdGhlIGdpdmVuIGRpYWdub3NpcyBpbnRvIGEgRGVwbG95bWVudEVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0RlcGxveW1lbnRFcnJvckZyb21EaWFnbm9zaXMoZGlhZzogU3RhY2tEaWFnbm9zaXMpOiBuZXZlciB7XG4gIHN3aXRjaCAoZGlhZy50eXBlKSB7XG4gICAgY2FzZSAnbm8tcHJvYmxlbSc6XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdEZXBsb3ltZW50RXJyb3JOb3RFcnJvcicsICdEaWFnbm9zaXMgc2hvdWxkIHJlcHJlc2VudCBhbiBlcnJvciwgYnV0IGRvZXMgbm90Jyk7XG5cbiAgICBjYXNlICdlcnJvci1kaWFnbm9zaW5nJzpcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoZGlhZy5tZXNzYWdlLCAnRXJyb3JEaWFnbm9zaXNGYWlsZWQnKTtcbiAgfVxuICAvLyBHdWFyYW50ZWVkICd0eXBlPXByb2JsZW0nIGhlcmVcblxuICBjb25zdCBlcnJvckNvZGUgPSBkaWFnLnByb2JsZW1zWzBdPy5lcnJvckNvZGU7XG4gIGxldCBkZWZhdWx0RXJyb3JDb2RlO1xuICBzd2l0Y2ggKGRpYWcuZGV0ZWN0ZWRCeS50eXBlKSB7XG4gICAgY2FzZSAnY2hhbmdlLXNldCc6XG4gICAgICBkZWZhdWx0RXJyb3JDb2RlID0gJ0NoYW5nZVNldENyZWF0aW9uRmFpbGVkJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZWFybHktdmFsaWRhdGlvbic6XG4gICAgICBkZWZhdWx0RXJyb3JDb2RlID0gJ0Vhcmx5VmFsaWRhdGlvbkZhaWx1cmUnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXBsb3ltZW50JzpcbiAgICAgIGRlZmF1bHRFcnJvckNvZGUgPSAnU3RhY2tEZXBsb3lGYWlsZWQnO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKGZvcm1hdFByb2JsZW1EaWFnbm9zaXMoZGlhZyksIGVycm9yQ29kZSA/PyBkZWZhdWx0RXJyb3JDb2RlKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UHJvYmxlbURpYWdub3NpcyhkaWFnOiBFeHRyYWN0PFN0YWNrRGlhZ25vc2lzLCB7IHR5cGU6ICdwcm9ibGVtJyB9Pik6IHN0cmluZyB7XG4gIHN3aXRjaCAoZGlhZy5kZXRlY3RlZEJ5LnR5cGUpIHtcbiAgICBjYXNlICdjaGFuZ2Utc2V0JzpcbiAgICAgIHJldHVybiBmb3JtYXRDaGFuZ2VTZXRQcm9ibGVtcyhkaWFnLnByb2JsZW1zLCBkaWFnLmRldGVjdGVkQnkpO1xuXG4gICAgY2FzZSAnZWFybHktdmFsaWRhdGlvbic6XG4gICAgICByZXR1cm4gZm9ybWF0RWFybHlWYWxpZGF0aW9uUHJvYmxlbXMoZGlhZy5wcm9ibGVtcywgZGlhZy5kZXRlY3RlZEJ5KTtcblxuICAgIGNhc2UgJ2RlcGxveW1lbnQnOlxuICAgICAgcmV0dXJuIGZvcm1hdERlcGxveW1lbnRQcm9ibGVtcyhkaWFnLnByb2JsZW1zLCBkaWFnLmRldGVjdGVkQnkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdENoYW5nZVNldFByb2JsZW1zKHByb2JsZW1zOiBUcmFjZWRSZXNvdXJjZUVycm9yW10sIGRldGVjdGVkQnk6IEV4dHJhY3Q8U3RhY2tQcm9ibGVtU291cmNlLCB7IHR5cGU6ICdjaGFuZ2Utc2V0JyB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGNhcHRpb24gPSBgRmFpbGVkIHRvIGNyZWF0ZSBjaGFuZ2Ugc2V0ICR7ZGV0ZWN0ZWRCeS5jaGFuZ2VTZXROYW1lfWA7XG5cbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06XFxuJHtmb3JtYXRSZXNvdXJjZUVycm9ycyhwcm9ibGVtcyl9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06ICR7ZGV0ZWN0ZWRCeS5zdGF0dXNSZWFzb259YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRFYXJseVZhbGlkYXRpb25Qcm9ibGVtcyhwcm9ibGVtczogVHJhY2VkUmVzb3VyY2VFcnJvcltdLCBkZXRlY3RlZEJ5OiBFeHRyYWN0PFN0YWNrUHJvYmxlbVNvdXJjZSwgeyB0eXBlOiAnZWFybHktdmFsaWRhdGlvbicgfT4pOiBzdHJpbmcge1xuICBjb25zdCBjYXB0aW9uID0gYEVhcmx5IHZhbGlkYXRpb24gZmFpbGVkIGZvciBjaGFuZ2Ugc2V0ICR7ZGV0ZWN0ZWRCeS5jaGFuZ2VTZXROYW1lfWA7XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259OlxcbiR7Zm9ybWF0UmVzb3VyY2VFcnJvcnMocHJvYmxlbXMpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhcHRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0RGVwbG95bWVudFByb2JsZW1zKHByb2JsZW1zOiBUcmFjZWRSZXNvdXJjZUVycm9yW10sIGRldGVjdGVkQnk6IEV4dHJhY3Q8U3RhY2tQcm9ibGVtU291cmNlLCB7IHR5cGU6ICdkZXBsb3ltZW50JyB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGNhcHRpb24gPSAnUmVzb3VyY2UgdXBkYXRlcyBmYWlsZWQnO1xuXG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259OlxcbiR7Zm9ybWF0UmVzb3VyY2VFcnJvcnMocHJvYmxlbXMpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259ICgke2RldGVjdGVkQnkuc3RhY2tTdGF0dXN9KTogJHtkZXRlY3RlZEJ5LnN0YXR1c1JlYXNvbn1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE5vUHJvYmxlbVN0YWNrKHN0YWNrOiBEaWFnbm9zZWRTdGFjaywgX206IEV4dHJhY3Q8U3RhY2tEaWFnbm9zaXMsIHsgdHlwZTogJ25vLXByb2JsZW0nIH0+KSB7XG4gIC8vIFRPRE86IHByaW50IHN0YWNrIGJ5IGNvbnN0cnVjdCBwYXRoLCBub3QgbmFtZVxuICByZXR1cm4gYOKchSBTdGFjayAke3N0YWNrLnN0YWNrTmFtZX06IG5vIGlzc3VlcyBmb3VuZC5gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9ibGVtU3RhY2soc3RhY2s6IERpYWdub3NlZFN0YWNrLCBtOiBFeHRyYWN0PFN0YWNrRGlhZ25vc2lzLCB7IHR5cGU6ICdwcm9ibGVtJyB9Pikge1xuICAvLyBUT0RPOiBwcmludCBzdGFjayBieSBjb25zdHJ1Y3QgcGF0aCwgbm90IG5hbWVcbiAgcmV0dXJuIGDinYwgU3RhY2sgJHtzdGFjay5zdGFja05hbWV9OlxcbiR7Zm9ybWF0UHJvYmxlbURpYWdub3NpcyhtKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREaWFnbm9zaXNFcnJvclN0YWNrKHN0YWNrOiBEaWFnbm9zZWRTdGFjaywgbTogRXh0cmFjdDxTdGFja0RpYWdub3NpcywgeyB0eXBlOiAnZXJyb3ItZGlhZ25vc2luZycgfT4pIHtcbiAgLy8gVE9ETzogcHJpbnQgc3RhY2sgYnkgY29uc3RydWN0IHBhdGgsIG5vdCBuYW1lXG4gIHJldHVybiBg4pqg77iPIENvdWxkIG5vdCBkaWFnbm9zZSBzdGFjayAke3N0YWNrLnN0YWNrTmFtZX06ICR7bS5tZXNzYWdlfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlc291cmNlRXJyb3JzKGVzOiBUcmFjZWRSZXNvdXJjZUVycm9yW10pIHtcbiAgc29ydEJ5S2V5KGVzLCAoZSkgPT4gW2xvY2F0ZVJlc291cmNlRXJyb3IoZSldKTtcblxuICBjb25zdCBiID0gbmV3IFRyZWVCdWlsZGVyKCcnKTtcbiAgZm9yIChjb25zdCBlIG9mIGVzKSB7XG4gICAgY29uc3QgcCA9IGxvY2F0ZVJlc291cmNlRXJyb3IoZSk7XG4gICAgY29uc3QgbGFzdFBhcnQgPSBwLnNwbGl0KCcvJykuc2xpY2UoLTEpWzBdO1xuXG4gICAgY29uc3Qgbm9kZVRleHQgPSBiLm5vZGVUZXh0KHApO1xuICAgIG5vZGVUZXh0LmhlYWRlciA9IFtgJHtsYXN0UGFydH0gICR7YWRkZW5kdW0oJyAnLCBlLnJlc291cmNlVHlwZSwgZS5sb2dpY2FsSWQpfWAudHJpbSgpXTtcbiAgICBub2RlVGV4dC5ib2R5LnB1c2goLi4uc2lkZUJ5U2lkZShbJ/Cfm5EnXSwgJyAnLCB3cmFwVGV4dCgxMjAsIGUubWVzc2FnZSkpKTtcbiAgICBub2RlVGV4dC5mb290ZXIgPSBlLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2VcbiAgICAgID8gc2lkZUJ5U2lkZShbJ1NvdXJjZSBMb2NhdGlvbjonXSwgJyAnLCBlLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2UpXG4gICAgICA6IFtdO1xuICB9XG4gIHJldHVybiBiLnJlbmRlcigpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIC8tc2VwYXJhdGVkIGNvbnN0cnVjdCBwYXRoIGZvciB0aGUgZ2l2ZW4gZXJyb3IsIG9yIHRyeSB0byBidWlsZCBhcyBjbG9zZSBhIHJlcHJlc2VudGlvbiBhcyBwb3NzaWJsZSBpZiB3ZSBkb24ndCBoYXZlIGEgY29uc3RydWN0IHBhdGhcbiAqXG4gKiBUaGUgcm9vdCB3aWxsIGJlIHRoZSBcImFwcFwiXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZVJlc291cmNlRXJyb3IoZTogVHJhY2VkUmVzb3VyY2VFcnJvcik6IHN0cmluZyB7XG4gIGlmIChlLnNvdXJjZVRyYWNlPy5jb25zdHJ1Y3RQYXRoKSB7XG4gICAgcmV0dXJuIGUuc291cmNlVHJhY2U/LmNvbnN0cnVjdFBhdGg7XG4gIH1cblxuICBjb25zdCBuZXN0ZWRTdGFja1BhcnRzID0gZS5wYXJlbnRTdGFja0xvZ2ljYWxJZHMubWFwKChsKSA9PiBgTmVzdGVkIHN0YWNrICR7bH1gKTtcbiAgaWYgKGUubG9naWNhbElkKSB7XG4gICAgcmV0dXJuIFtlLnRvcExldmVsU3RhY2tIaWVyYXJjaGljYWxJZCwgLi4ubmVzdGVkU3RhY2tQYXJ0cywgZS5sb2dpY2FsSWRdLmpvaW4oJy8nKTtcbiAgfVxuICAvLyBObyBsb2dpY2FsIElEIG1lYW5zIHdlIGFyZSB0YXJnZXRpbmcgdGhlIHN0YWNrIGl0c2VsZlxuICByZXR1cm4gW2UudG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkLCBuZXN0ZWRTdGFja1BhcnRzXS5qb2luKCcvJyk7XG59XG5cbmZ1bmN0aW9uIGFkZGVuZHVtKHNlcDogc3RyaW5nLCAuLi54czogQXJyYXk8c3RyaW5nIHwgdW5kZWZpbmVkPik6IHN0cmluZyB7XG4gIHhzID0geHMuZmlsdGVyKHggPT4geCAmJiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpO1xuICBpZiAoeHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgKCR7eHMuam9pbihzZXApfSlgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { ChangeSetSummary, Stack } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import type { StackDiagnosis } from '../../actions/diagnose';
|
|
3
|
+
import type { SDK } from '../aws-auth/sdk';
|
|
4
|
+
import type { EnvironmentResources } from '../environment';
|
|
5
|
+
import type { IoHelper } from '../io/private/io-helper';
|
|
6
|
+
import type { ISourceTracer } from '../source-tracing/private/source-tracing';
|
|
7
|
+
import type { ResourceErrors } from '../stack-events/resource-errors';
|
|
8
|
+
export interface CloudFormationStackDiagnoserProps {
|
|
9
|
+
readonly sdk: SDK;
|
|
10
|
+
readonly envResources?: EnvironmentResources;
|
|
11
|
+
readonly sourceTracer: ISourceTracer;
|
|
12
|
+
readonly ioHelper: IoHelper;
|
|
13
|
+
readonly topLevelStackHierarchicalId: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Diagnose a stack's failed state
|
|
17
|
+
*
|
|
18
|
+
* - First, determine the stack's state.
|
|
19
|
+
* - If it is in a failed state, we started a deployment that failed. Describe the stack
|
|
20
|
+
* events, and try to determine the root cause from that.
|
|
21
|
+
* - If it is in a normal state, see if there are any failed change sets. Either
|
|
22
|
+
* get the failure message from the change set, or get the failure events from
|
|
23
|
+
* the change set (early validation).
|
|
24
|
+
*
|
|
25
|
+
* This class works at the CloudFormation level, and does not deal with tracing
|
|
26
|
+
* CloudFormation errors to construct code sources yet.
|
|
27
|
+
*/
|
|
28
|
+
export declare class CloudFormationStackDiagnoser {
|
|
29
|
+
private readonly props;
|
|
30
|
+
private readonly cfn;
|
|
31
|
+
private parentStackLogicalIds;
|
|
32
|
+
constructor(props: CloudFormationStackDiagnoserProps);
|
|
33
|
+
/**
|
|
34
|
+
* Diagnose a stack's root cause given no pre-existing state
|
|
35
|
+
*/
|
|
36
|
+
diagnoseFromFresh(stackName: string): Promise<StackDiagnosis>;
|
|
37
|
+
/**
|
|
38
|
+
* Diagnose potential problems with the change set
|
|
39
|
+
*/
|
|
40
|
+
diagnoseChangeSet(changeSet: ChangeSetSummary): Promise<StackDiagnosis>;
|
|
41
|
+
/**
|
|
42
|
+
* Diagnose potential problems with the change set
|
|
43
|
+
*/
|
|
44
|
+
diagnoseFromErrorCollection(errors: ResourceErrors, stack: Stack): Promise<StackDiagnosis>;
|
|
45
|
+
/**
|
|
46
|
+
* Diagnose a deployment failure via stack events
|
|
47
|
+
*
|
|
48
|
+
* This is the same logic that the deployment monitor uses.
|
|
49
|
+
*/
|
|
50
|
+
private _diagnoseViaStackEvents;
|
|
51
|
+
private _diagnoseChangeSetFailureFromStackName;
|
|
52
|
+
/**
|
|
53
|
+
* Try to diagnose the reason that caused a changeset to fail to create
|
|
54
|
+
*
|
|
55
|
+
* There are a couple of different reasons this can happen, and we go through each of them in order.
|
|
56
|
+
*
|
|
57
|
+
* Usually this starts from trying to detect an error message pattern in the change set status reason,
|
|
58
|
+
* and then potentially going to fetch additional information using additional API calls.
|
|
59
|
+
*/
|
|
60
|
+
private _diagnoseChangeSetFailure;
|
|
61
|
+
/**
|
|
62
|
+
* Try to read the resource-specific reasons for a changeset failure from `DescribeEvents`.
|
|
63
|
+
*
|
|
64
|
+
* If we couldn't read the events or there are 0 errors returned by that API, return a generic
|
|
65
|
+
* error.
|
|
66
|
+
*/
|
|
67
|
+
private _reportChangeSetFailureFromEvents;
|
|
68
|
+
private addErrorTraces;
|
|
69
|
+
private addErrorTrace;
|
|
70
|
+
/**
|
|
71
|
+
* Build a generic stack error from the given change set information
|
|
72
|
+
*
|
|
73
|
+
* We can't point to a specific resource.
|
|
74
|
+
*/
|
|
75
|
+
private _nonSpecificChangeSetError;
|
|
76
|
+
/**
|
|
77
|
+
* Look for nested change sets that have failed, and diagnose those.
|
|
78
|
+
*/
|
|
79
|
+
private _diagnoseNestedChangeSetFailure;
|
|
80
|
+
private _findFailedNestedStack;
|
|
81
|
+
/**
|
|
82
|
+
* Try to parse failed auto-imports out from a change set status
|
|
83
|
+
*
|
|
84
|
+
* The pattern looks like this:
|
|
85
|
+
*
|
|
86
|
+
* ```
|
|
87
|
+
* CloudFormation is attempting to import some resources because they already exist in your account. The resources must have the DeletionPolicy attribute set to 'Retain' or 'RetainExceptOnCreate' in the template for successful import. The affected resources are SomeBucketD5B70704 ({BucketName=zomaareenbucket})
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* Followed by
|
|
91
|
+
*
|
|
92
|
+
* ```
|
|
93
|
+
* LogicalID ({Prop=Value,Prop=Value}), LogicalID ({Prop=Value}), ...
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
private _tryDetectFailedAutoImport;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Return true if the given change set has no changes
|
|
100
|
+
*
|
|
101
|
+
* This must be determined from the status, not the 'Changes' array on the
|
|
102
|
+
* object; the latter can be empty because no resources were changed, but if
|
|
103
|
+
* there are changes to Outputs, the change set can still be executed.
|
|
104
|
+
*/
|
|
105
|
+
export declare function changeSetHasNoChanges(description: ChangeSetSummary): boolean;
|
|
106
|
+
//# sourceMappingURL=stack-diagnoser.d.ts.map
|