@aws-cdk/toolkit-lib 1.23.0 → 1.25.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/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 +9 -17
- package/lib/api/deployments/cfn-api.js +82 -71
- package/lib/api/deployments/deploy-stack.d.ts +6 -2
- package/lib/api/deployments/deploy-stack.js +43 -60
- package/lib/api/deployments/deployments.d.ts +3 -2
- package/lib/api/deployments/deployments.js +31 -7
- package/lib/api/diagnosing/diagnosis-formatting.d.ts +13 -0
- package/lib/api/diagnosing/diagnosis-formatting.js +139 -0
- package/lib/api/diagnosing/early-validation.d.ts +49 -0
- package/lib/api/diagnosing/early-validation.js +81 -0
- package/lib/api/diagnosing/stack-diagnoser.d.ts +99 -0
- package/lib/api/diagnosing/stack-diagnoser.js +338 -0
- package/lib/api/diagnosing/tree-builder.d.ts +12 -0
- package/lib/api/diagnosing/tree-builder.js +86 -0
- package/lib/api/diagnosing/tree.d.ts +13 -0
- package/lib/api/diagnosing/tree.js +61 -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 +8 -1
- package/lib/api/resource-import/importer.js +35 -14
- 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 +5 -94
- 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/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 +226 -84
- 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 +11 -11
- package/lib/api/deployments/early-validation.d.ts +0 -17
- package/lib/api/deployments/early-validation.js +0 -54
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StackArtifactSourceTracer = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const cxapi = require("@aws-cdk/cloud-assembly-api");
|
|
7
|
+
const cxschema = require("@aws-cdk/cloud-assembly-schema");
|
|
8
|
+
/**
|
|
9
|
+
* Use a stack artifact as the root for tracing problems with this deployment
|
|
10
|
+
*
|
|
11
|
+
* The stack can be either the stack itself, or a nested stack inside it.
|
|
12
|
+
*
|
|
13
|
+
* ## Strategy
|
|
14
|
+
*
|
|
15
|
+
* The first thing we need to do is translate the given resource to a
|
|
16
|
+
* construct path.
|
|
17
|
+
*
|
|
18
|
+
* - The construct path can be found in the target template, if that option was
|
|
19
|
+
* enabled during synthesis; or
|
|
20
|
+
* - We can (try to) dig it out of the `tree.json` once
|
|
21
|
+
* https://github.com/aws/aws-cdk/pull/37630 is merged (although we still
|
|
22
|
+
* need some information about the stack).
|
|
23
|
+
*
|
|
24
|
+
* Especially for nested stacks the above is hard, since this called from a
|
|
25
|
+
* place where we only have CloudFormation information (stack name). The stack
|
|
26
|
+
* name of a nested stack cannot be predicted in advance, and even if we have
|
|
27
|
+
* the list of logical IDs to get to the nested stack (which we do), finding
|
|
28
|
+
* the actual template is not easy.
|
|
29
|
+
*/
|
|
30
|
+
class StackArtifactSourceTracer {
|
|
31
|
+
stack;
|
|
32
|
+
constructor(stack) {
|
|
33
|
+
this.stack = stack;
|
|
34
|
+
}
|
|
35
|
+
async traceResource(_stackName, nestedStackLogicalIds, logicalId, propertyName) {
|
|
36
|
+
const containingTemplate = getStackTemplate(this.stack, nestedStackLogicalIds);
|
|
37
|
+
const constructPath = containingTemplate?.Resources?.[logicalId]?.Metadata?.[cxapi.PATH_METADATA_KEY];
|
|
38
|
+
if (!constructPath) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
constructPath,
|
|
43
|
+
creationStackTrace: findCreationStackTrace(this.stack, constructPath),
|
|
44
|
+
mutationStackTraces: propertyName ? findMutationStackTraces(this.stack, constructPath, propertyName) : undefined,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async traceStack(_stackName, nestedStackLogicalIds) {
|
|
48
|
+
// This can either be a stack or nested stack. If it's a nested stack, trace the resource
|
|
49
|
+
// in the parent stack.
|
|
50
|
+
if (nestedStackLogicalIds.length > 0) {
|
|
51
|
+
const lastLogicalId = nestedStackLogicalIds.pop();
|
|
52
|
+
return this.traceResource(_stackName, nestedStackLogicalIds, lastLogicalId);
|
|
53
|
+
}
|
|
54
|
+
// Must be the root stack
|
|
55
|
+
const constructPath = this.stack.hierarchicalId;
|
|
56
|
+
return {
|
|
57
|
+
constructPath,
|
|
58
|
+
creationStackTrace: findCreationStackTrace(this.stack, constructPath),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.StackArtifactSourceTracer = StackArtifactSourceTracer;
|
|
63
|
+
/**
|
|
64
|
+
* Try to find the creation stack trace for the given construct
|
|
65
|
+
*
|
|
66
|
+
* - This can be the 'trace' of adding the 'aws:cdk:logicalId' metadata.
|
|
67
|
+
* - This can also be dedicated metadata (we haven't added it yet).
|
|
68
|
+
*
|
|
69
|
+
* The construct path in metadata ALWAYS starts with a `/` while the construct path
|
|
70
|
+
* we have here probably doesn't, account for that as well.
|
|
71
|
+
*
|
|
72
|
+
* Stack's currently don't emit any stack traces.
|
|
73
|
+
*/
|
|
74
|
+
function findCreationStackTrace(stack, constructPath) {
|
|
75
|
+
const candidates = [
|
|
76
|
+
// logical ID traces
|
|
77
|
+
...resourceMetadata(stack, constructPath, cxschema.ArtifactMetadataEntryType.LOGICAL_ID).flatMap((m) => {
|
|
78
|
+
if (m.trace) {
|
|
79
|
+
return [m.trace];
|
|
80
|
+
}
|
|
81
|
+
return [];
|
|
82
|
+
}),
|
|
83
|
+
// Creation stack
|
|
84
|
+
...resourceMetadata(stack, constructPath, 'aws:cdk:creationStack').flatMap((m) => {
|
|
85
|
+
if (m.data) {
|
|
86
|
+
return [m.data];
|
|
87
|
+
}
|
|
88
|
+
return [];
|
|
89
|
+
}),
|
|
90
|
+
];
|
|
91
|
+
return candidates[0];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Find property mutation stack traces
|
|
95
|
+
*
|
|
96
|
+
* These are all places in the code where a property's value is overwritten after
|
|
97
|
+
* construct creation.
|
|
98
|
+
*/
|
|
99
|
+
function findMutationStackTraces(stack, constructPath, propertyName) {
|
|
100
|
+
const assignments = resourceMetadata(stack, constructPath, 'aws:cdk:propertyAssignment');
|
|
101
|
+
return assignments.flatMap((m) => {
|
|
102
|
+
const data = m.data;
|
|
103
|
+
if (data?.propertyName === propertyName) {
|
|
104
|
+
return [data.stackTrace];
|
|
105
|
+
}
|
|
106
|
+
return [];
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function resourceMetadata(stack, constructPath, metadataType) {
|
|
110
|
+
if (!constructPath.startsWith('/')) {
|
|
111
|
+
constructPath = '/' + constructPath;
|
|
112
|
+
}
|
|
113
|
+
return (stack.metadata[constructPath] ?? []).filter((m) => m.type === metadataType);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Find the stack template given a root stack and a logical ID path into nested stacks
|
|
117
|
+
*/
|
|
118
|
+
function getStackTemplate(stack, logicalIdPath) {
|
|
119
|
+
let template = stack.template;
|
|
120
|
+
const segments = [...logicalIdPath];
|
|
121
|
+
while (segments.length > 0) {
|
|
122
|
+
const next = segments.shift();
|
|
123
|
+
// The nested stack resource has metadata to tell us which (local) file
|
|
124
|
+
// we are looking for: "aws:asset:path".
|
|
125
|
+
const nextTemplateFile = template.Resources[next]?.Metadata?.[cxapi.ASSET_RESOURCE_METADATA_PATH_KEY];
|
|
126
|
+
if (!nextTemplateFile) {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
const nextTemplatePath = path.join(path.dirname(stack.templateFullPath), nextTemplateFile);
|
|
130
|
+
template = JSON.parse(fs.readFileSync(nextTemplatePath, 'utf-8'));
|
|
131
|
+
}
|
|
132
|
+
return template;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stc291cmNlLXRyYWNpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGFjay1zb3VyY2UtdHJhY2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHFEQUFxRDtBQUNyRCwyREFBMkQ7QUFJM0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQWEseUJBQXlCO0lBQ1A7SUFBN0IsWUFBNkIsS0FBd0M7UUFBeEMsVUFBSyxHQUFMLEtBQUssQ0FBbUM7SUFDckUsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQ3hCLFVBQWtCLEVBQ2xCLHFCQUErQixFQUMvQixTQUFpQixFQUNqQixZQUFxQjtRQUVyQixNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUUvRSxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU87WUFDTCxhQUFhO1lBQ2Isa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7WUFDckUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNqSCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBa0IsRUFBRSxxQkFBK0I7UUFDekUseUZBQXlGO1FBQ3pGLHVCQUF1QjtRQUN2QixJQUFJLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUcsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDaEQsT0FBTztZQUNMLGFBQWE7WUFDYixrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQztTQUN0RSxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdkNELDhEQXVDQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEtBQXdDLEVBQUUsYUFBcUI7SUFDN0YsTUFBTSxVQUFVLEdBQUc7UUFDakIsb0JBQW9CO1FBQ3BCLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDckcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUM7UUFDRixpQkFBaUI7UUFDakIsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDL0UsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUEyQixDQUFDLENBQUM7WUFDekMsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDO0tBQ0gsQ0FBQztJQUVGLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQUMsS0FBd0MsRUFBRSxhQUFxQixFQUFFLFlBQW9CO0lBQ3BILE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUV6RixPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUMvQixNQUFNLElBQUksR0FBdUMsQ0FBQyxDQUFDLElBQVcsQ0FBQztRQUMvRCxJQUFJLElBQUksRUFBRSxZQUFZLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQXdDLEVBQUUsYUFBcUIsRUFBRSxZQUFvQjtJQUM3RyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25DLGFBQWEsR0FBRyxHQUFHLEdBQUcsYUFBYSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUF3QyxFQUFFLGFBQWdDO0lBQ2xHLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDOUIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFHLENBQUM7UUFFL0IsdUVBQXVFO1FBQ3ZFLHdDQUF3QztRQUN4QyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDM0YsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgKiBhcyBjeHNjaGVtYSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VUcmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgSVNvdXJjZVRyYWNlciB9IGZyb20gJy4vc291cmNlLXRyYWNpbmcnO1xuXG4vKipcbiAqIFVzZSBhIHN0YWNrIGFydGlmYWN0IGFzIHRoZSByb290IGZvciB0cmFjaW5nIHByb2JsZW1zIHdpdGggdGhpcyBkZXBsb3ltZW50XG4gKlxuICogVGhlIHN0YWNrIGNhbiBiZSBlaXRoZXIgdGhlIHN0YWNrIGl0c2VsZiwgb3IgYSBuZXN0ZWQgc3RhY2sgaW5zaWRlIGl0LlxuICpcbiAqICMjIFN0cmF0ZWd5XG4gKlxuICogVGhlIGZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgdHJhbnNsYXRlIHRoZSBnaXZlbiByZXNvdXJjZSB0byBhXG4gKiBjb25zdHJ1Y3QgcGF0aC5cbiAqXG4gKiAtIFRoZSBjb25zdHJ1Y3QgcGF0aCBjYW4gYmUgZm91bmQgaW4gdGhlIHRhcmdldCB0ZW1wbGF0ZSwgaWYgdGhhdCBvcHRpb24gd2FzXG4gKiAgIGVuYWJsZWQgZHVyaW5nIHN5bnRoZXNpczsgb3JcbiAqIC0gV2UgY2FuICh0cnkgdG8pIGRpZyBpdCBvdXQgb2YgdGhlIGB0cmVlLmpzb25gIG9uY2VcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3B1bGwvMzc2MzAgaXMgbWVyZ2VkIChhbHRob3VnaCB3ZSBzdGlsbFxuICogICBuZWVkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YWNrKS5cbiAqXG4gKiBFc3BlY2lhbGx5IGZvciBuZXN0ZWQgc3RhY2tzIHRoZSBhYm92ZSBpcyBoYXJkLCBzaW5jZSB0aGlzIGNhbGxlZCBmcm9tIGFcbiAqIHBsYWNlIHdoZXJlIHdlIG9ubHkgaGF2ZSBDbG91ZEZvcm1hdGlvbiBpbmZvcm1hdGlvbiAoc3RhY2sgbmFtZSkuIFRoZSBzdGFja1xuICogbmFtZSBvZiBhIG5lc3RlZCBzdGFjayBjYW5ub3QgYmUgcHJlZGljdGVkIGluIGFkdmFuY2UsIGFuZCBldmVuIGlmIHdlIGhhdmVcbiAqIHRoZSBsaXN0IG9mIGxvZ2ljYWwgSURzIHRvIGdldCB0byB0aGUgbmVzdGVkIHN0YWNrICh3aGljaCB3ZSBkbyksIGZpbmRpbmdcbiAqIHRoZSBhY3R1YWwgdGVtcGxhdGUgaXMgbm90IGVhc3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFja0FydGlmYWN0U291cmNlVHJhY2VyIGltcGxlbWVudHMgSVNvdXJjZVRyYWNlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCkge1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRyYWNlUmVzb3VyY2UoXG4gICAgX3N0YWNrTmFtZTogc3RyaW5nLFxuICAgIG5lc3RlZFN0YWNrTG9naWNhbElkczogc3RyaW5nW10sXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFNvdXJjZVRyYWNlIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgY29udGFpbmluZ1RlbXBsYXRlID0gZ2V0U3RhY2tUZW1wbGF0ZSh0aGlzLnN0YWNrLCBuZXN0ZWRTdGFja0xvZ2ljYWxJZHMpO1xuXG4gICAgY29uc3QgY29uc3RydWN0UGF0aCA9IGNvbnRhaW5pbmdUZW1wbGF0ZT8uUmVzb3VyY2VzPy5bbG9naWNhbElkXT8uTWV0YWRhdGE/LltjeGFwaS5QQVRIX01FVEFEQVRBX0tFWV07XG4gICAgaWYgKCFjb25zdHJ1Y3RQYXRoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb25zdHJ1Y3RQYXRoLFxuICAgICAgY3JlYXRpb25TdGFja1RyYWNlOiBmaW5kQ3JlYXRpb25TdGFja1RyYWNlKHRoaXMuc3RhY2ssIGNvbnN0cnVjdFBhdGgpLFxuICAgICAgbXV0YXRpb25TdGFja1RyYWNlczogcHJvcGVydHlOYW1lID8gZmluZE11dGF0aW9uU3RhY2tUcmFjZXModGhpcy5zdGFjaywgY29uc3RydWN0UGF0aCwgcHJvcGVydHlOYW1lKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRyYWNlU3RhY2soX3N0YWNrTmFtZTogc3RyaW5nLCBuZXN0ZWRTdGFja0xvZ2ljYWxJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxTb3VyY2VUcmFjZSB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFRoaXMgY2FuIGVpdGhlciBiZSBhIHN0YWNrIG9yIG5lc3RlZCBzdGFjay4gSWYgaXQncyBhIG5lc3RlZCBzdGFjaywgdHJhY2UgdGhlIHJlc291cmNlXG4gICAgLy8gaW4gdGhlIHBhcmVudCBzdGFjay5cbiAgICBpZiAobmVzdGVkU3RhY2tMb2dpY2FsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxhc3RMb2dpY2FsSWQgPSBuZXN0ZWRTdGFja0xvZ2ljYWxJZHMucG9wKCkhO1xuICAgICAgcmV0dXJuIHRoaXMudHJhY2VSZXNvdXJjZShfc3RhY2tOYW1lLCBuZXN0ZWRTdGFja0xvZ2ljYWxJZHMsIGxhc3RMb2dpY2FsSWQpO1xuICAgIH1cblxuICAgIC8vIE11c3QgYmUgdGhlIHJvb3Qgc3RhY2tcbiAgICBjb25zdCBjb25zdHJ1Y3RQYXRoID0gdGhpcy5zdGFjay5oaWVyYXJjaGljYWxJZDtcbiAgICByZXR1cm4ge1xuICAgICAgY29uc3RydWN0UGF0aCxcbiAgICAgIGNyZWF0aW9uU3RhY2tUcmFjZTogZmluZENyZWF0aW9uU3RhY2tUcmFjZSh0aGlzLnN0YWNrLCBjb25zdHJ1Y3RQYXRoKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVHJ5IHRvIGZpbmQgdGhlIGNyZWF0aW9uIHN0YWNrIHRyYWNlIGZvciB0aGUgZ2l2ZW4gY29uc3RydWN0XG4gKlxuICogLSBUaGlzIGNhbiBiZSB0aGUgJ3RyYWNlJyBvZiBhZGRpbmcgdGhlICdhd3M6Y2RrOmxvZ2ljYWxJZCcgbWV0YWRhdGEuXG4gKiAtIFRoaXMgY2FuIGFsc28gYmUgZGVkaWNhdGVkIG1ldGFkYXRhICh3ZSBoYXZlbid0IGFkZGVkIGl0IHlldCkuXG4gKlxuICogVGhlIGNvbnN0cnVjdCBwYXRoIGluIG1ldGFkYXRhIEFMV0FZUyBzdGFydHMgd2l0aCBhIGAvYCB3aGlsZSB0aGUgY29uc3RydWN0IHBhdGhcbiAqIHdlIGhhdmUgaGVyZSBwcm9iYWJseSBkb2Vzbid0LCBhY2NvdW50IGZvciB0aGF0IGFzIHdlbGwuXG4gKlxuICogU3RhY2sncyBjdXJyZW50bHkgZG9uJ3QgZW1pdCBhbnkgc3RhY2sgdHJhY2VzLlxuICovXG5mdW5jdGlvbiBmaW5kQ3JlYXRpb25TdGFja1RyYWNlKHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIGNvbnN0cnVjdFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICAvLyBsb2dpY2FsIElEIHRyYWNlc1xuICAgIC4uLnJlc291cmNlTWV0YWRhdGEoc3RhY2ssIGNvbnN0cnVjdFBhdGgsIGN4c2NoZW1hLkFydGlmYWN0TWV0YWRhdGFFbnRyeVR5cGUuTE9HSUNBTF9JRCkuZmxhdE1hcCgobSkgPT4ge1xuICAgICAgaWYgKG0udHJhY2UpIHtcbiAgICAgICAgcmV0dXJuIFttLnRyYWNlXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KSxcbiAgICAvLyBDcmVhdGlvbiBzdGFja1xuICAgIC4uLnJlc291cmNlTWV0YWRhdGEoc3RhY2ssIGNvbnN0cnVjdFBhdGgsICdhd3M6Y2RrOmNyZWF0aW9uU3RhY2snKS5mbGF0TWFwKChtKSA9PiB7XG4gICAgICBpZiAobS5kYXRhKSB7XG4gICAgICAgIHJldHVybiBbbS5kYXRhIGFzIHVua25vd24gYXMgc3RyaW5nW11dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pLFxuICBdO1xuXG4gIHJldHVybiBjYW5kaWRhdGVzWzBdO1xufVxuXG4vKipcbiAqIEZpbmQgcHJvcGVydHkgbXV0YXRpb24gc3RhY2sgdHJhY2VzXG4gKlxuICogVGhlc2UgYXJlIGFsbCBwbGFjZXMgaW4gdGhlIGNvZGUgd2hlcmUgYSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG92ZXJ3cml0dGVuIGFmdGVyXG4gKiBjb25zdHJ1Y3QgY3JlYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGZpbmRNdXRhdGlvblN0YWNrVHJhY2VzKHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIGNvbnN0cnVjdFBhdGg6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYXNzaWdubWVudHMgPSByZXNvdXJjZU1ldGFkYXRhKHN0YWNrLCBjb25zdHJ1Y3RQYXRoLCAnYXdzOmNkazpwcm9wZXJ0eUFzc2lnbm1lbnQnKTtcblxuICByZXR1cm4gYXNzaWdubWVudHMuZmxhdE1hcCgobSkgPT4ge1xuICAgIGNvbnN0IGRhdGE6IFByb3BlcnR5QXNzaWdubWVudERhdGEgfCB1bmRlZmluZWQgPSBtLmRhdGEgYXMgYW55O1xuICAgIGlmIChkYXRhPy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZSkge1xuICAgICAgcmV0dXJuIFtkYXRhLnN0YWNrVHJhY2VdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvdXJjZU1ldGFkYXRhKHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIGNvbnN0cnVjdFBhdGg6IHN0cmluZywgbWV0YWRhdGFUeXBlOiBzdHJpbmcpOiBjeHNjaGVtYS5NZXRhZGF0YUVudHJ5W10ge1xuICBpZiAoIWNvbnN0cnVjdFBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgY29uc3RydWN0UGF0aCA9ICcvJyArIGNvbnN0cnVjdFBhdGg7XG4gIH1cblxuICByZXR1cm4gKHN0YWNrLm1ldGFkYXRhW2NvbnN0cnVjdFBhdGhdID8/IFtdKS5maWx0ZXIoKG0pID0+IG0udHlwZSA9PT0gbWV0YWRhdGFUeXBlKTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBzdGFjayB0ZW1wbGF0ZSBnaXZlbiBhIHJvb3Qgc3RhY2sgYW5kIGEgbG9naWNhbCBJRCBwYXRoIGludG8gbmVzdGVkIHN0YWNrc1xuICovXG5mdW5jdGlvbiBnZXRTdGFja1RlbXBsYXRlKHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIGxvZ2ljYWxJZFBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgbGV0IHRlbXBsYXRlID0gc3RhY2sudGVtcGxhdGU7XG4gIGNvbnN0IHNlZ21lbnRzID0gWy4uLmxvZ2ljYWxJZFBhdGhdO1xuICB3aGlsZSAoc2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5leHQgPSBzZWdtZW50cy5zaGlmdCgpITtcblxuICAgIC8vIFRoZSBuZXN0ZWQgc3RhY2sgcmVzb3VyY2UgaGFzIG1ldGFkYXRhIHRvIHRlbGwgdXMgd2hpY2ggKGxvY2FsKSBmaWxlXG4gICAgLy8gd2UgYXJlIGxvb2tpbmcgZm9yOiBcImF3czphc3NldDpwYXRoXCIuXG4gICAgY29uc3QgbmV4dFRlbXBsYXRlRmlsZSA9IHRlbXBsYXRlLlJlc291cmNlc1tuZXh0XT8uTWV0YWRhdGE/LltjeGFwaS5BU1NFVF9SRVNPVVJDRV9NRVRBREFUQV9QQVRIX0tFWV07XG4gICAgaWYgKCFuZXh0VGVtcGxhdGVGaWxlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRUZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHN0YWNrLnRlbXBsYXRlRnVsbFBhdGgpLCBuZXh0VGVtcGxhdGVGaWxlKTtcbiAgICB0ZW1wbGF0ZSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG5leHRUZW1wbGF0ZVBhdGgsICd1dGYtOCcpKTtcbiAgfVxuXG4gIHJldHVybiB0ZW1wbGF0ZTtcbn1cblxuaW50ZXJmYWNlIFByb3BlcnR5QXNzaWdubWVudERhdGEge1xuICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgc3RhY2tUcmFjZTogc3RyaW5nW107XG59XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enough information to locate a certain CloudFormation resource in a CDK app
|
|
3
|
+
*/
|
|
4
|
+
export interface SourceTrace {
|
|
5
|
+
readonly constructPath: string;
|
|
6
|
+
readonly creationStackTrace?: string[];
|
|
7
|
+
readonly mutationStackTraces?: string[][];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEVub3VnaCBpbmZvcm1hdGlvbiB0byBsb2NhdGUgYSBjZXJ0YWluIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIGluIGEgQ0RLIGFwcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVRyYWNlIHtcbiAgcmVhZG9ubHkgY29uc3RydWN0UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBjcmVhdGlvblN0YWNrVHJhY2U/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbXV0YXRpb25TdGFja1RyYWNlcz86IHN0cmluZ1tdW107XG59XG4iXX0=
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { StackEvent } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import type { ResourceEvent } from './stack-event-poller';
|
|
3
|
+
export interface ResourceError {
|
|
4
|
+
/**
|
|
5
|
+
* The stack this resource error occurred in
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This will be a stack ID (which is a full ARN including the unique identifier),
|
|
8
|
+
* not just a name.
|
|
9
|
+
*/
|
|
10
|
+
readonly stackArn: string;
|
|
11
|
+
/**
|
|
12
|
+
* IDs of parent stacks of the resource, in case of resources in nested stacks
|
|
13
|
+
*/
|
|
14
|
+
readonly parentStackLogicalIds: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Logical ID of the resource
|
|
17
|
+
*
|
|
18
|
+
* (May be absent in case this message is about the stack itself)
|
|
19
|
+
*/
|
|
20
|
+
readonly logicalId?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Resource type
|
|
23
|
+
*/
|
|
24
|
+
readonly resourceType?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Physical ID of the resource
|
|
27
|
+
*/
|
|
28
|
+
readonly physicalId?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Error message of the resource
|
|
31
|
+
*/
|
|
32
|
+
readonly message: string;
|
|
33
|
+
/**
|
|
34
|
+
* Error code of the resource
|
|
35
|
+
*/
|
|
36
|
+
readonly errorCode?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Class used to send stack event errors into, to come up with root causes.
|
|
40
|
+
*/
|
|
41
|
+
export declare class ResourceErrors {
|
|
42
|
+
/**
|
|
43
|
+
* A list of all non-cancellation errors we have seen.
|
|
44
|
+
*
|
|
45
|
+
* By the nature of the order we see events in, will be ordered from oldest to newest.
|
|
46
|
+
*/
|
|
47
|
+
private readonly _errors;
|
|
48
|
+
isEmpty(): boolean;
|
|
49
|
+
get all(): ReadonlyArray<ResourceError>;
|
|
50
|
+
/**
|
|
51
|
+
* Update the error collection with the given stack activity
|
|
52
|
+
*
|
|
53
|
+
* May be from a nested stack as well.
|
|
54
|
+
*
|
|
55
|
+
* This class expects to see all events in chronological order.
|
|
56
|
+
*/
|
|
57
|
+
update(...events: ResourceEvent[]): void;
|
|
58
|
+
/**
|
|
59
|
+
* Take our best guess at the error code of the root cause
|
|
60
|
+
*
|
|
61
|
+
* The first error that occurs is the root cause.
|
|
62
|
+
*/
|
|
63
|
+
get rootCauseErrorCode(): string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Return error messages of all encountered errors (that aren't cancellations)
|
|
66
|
+
*/
|
|
67
|
+
get allErrorMessages(): string[];
|
|
68
|
+
/**
|
|
69
|
+
* Return error codeds of all encountered errors (that aren't cancellations nor stack errors)
|
|
70
|
+
*
|
|
71
|
+
* We don't need to include nested stack errors because our poller will poll the nested stack,
|
|
72
|
+
* and have returned the actual error as well.
|
|
73
|
+
*/
|
|
74
|
+
get allErrorCodes(): string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Extract an error code from the given stack event.
|
|
78
|
+
*
|
|
79
|
+
* Always contains the services, and includes the handler error code if available.
|
|
80
|
+
*/
|
|
81
|
+
export declare function extractErrorCode(event: StackEvent): string;
|
|
82
|
+
//# sourceMappingURL=resource-errors.d.ts.map
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResourceErrors = void 0;
|
|
4
|
+
exports.extractErrorCode = extractErrorCode;
|
|
5
|
+
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
6
|
+
const cloudformation_1 = require("../../util/cloudformation");
|
|
7
|
+
/**
|
|
8
|
+
* Class used to send stack event errors into, to come up with root causes.
|
|
9
|
+
*/
|
|
10
|
+
class ResourceErrors {
|
|
11
|
+
/**
|
|
12
|
+
* A list of all non-cancellation errors we have seen.
|
|
13
|
+
*
|
|
14
|
+
* By the nature of the order we see events in, will be ordered from oldest to newest.
|
|
15
|
+
*/
|
|
16
|
+
_errors = [];
|
|
17
|
+
isEmpty() {
|
|
18
|
+
return this._errors.length === 0;
|
|
19
|
+
}
|
|
20
|
+
get all() {
|
|
21
|
+
return this._errors;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Update the error collection with the given stack activity
|
|
25
|
+
*
|
|
26
|
+
* May be from a nested stack as well.
|
|
27
|
+
*
|
|
28
|
+
* This class expects to see all events in chronological order.
|
|
29
|
+
*/
|
|
30
|
+
update(...events) {
|
|
31
|
+
for (const event of events) {
|
|
32
|
+
if ((0, cloudformation_1.isErrorEvent)(event.event)) {
|
|
33
|
+
// Cancelled is not an interesting failure reason, nor is the stack message (stack
|
|
34
|
+
// message will just say something like "stack failed to update")
|
|
35
|
+
if (!(0, cloudformation_1.isCancellationEvent)(event.event) && (0, cloudformation_1.isRegularResourceEvent)(event.event)) {
|
|
36
|
+
this._errors.push(errorFromEvent(event));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Take our best guess at the error code of the root cause
|
|
43
|
+
*
|
|
44
|
+
* The first error that occurs is the root cause.
|
|
45
|
+
*/
|
|
46
|
+
get rootCauseErrorCode() {
|
|
47
|
+
return this.allErrorCodes[0];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Return error messages of all encountered errors (that aren't cancellations)
|
|
51
|
+
*/
|
|
52
|
+
get allErrorMessages() {
|
|
53
|
+
return this._errors.map(e => e.message);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Return error codeds of all encountered errors (that aren't cancellations nor stack errors)
|
|
57
|
+
*
|
|
58
|
+
* We don't need to include nested stack errors because our poller will poll the nested stack,
|
|
59
|
+
* and have returned the actual error as well.
|
|
60
|
+
*/
|
|
61
|
+
get allErrorCodes() {
|
|
62
|
+
return this._errors.map(e => e.errorCode).filter(x => typeof x === 'string');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.ResourceErrors = ResourceErrors;
|
|
66
|
+
function errorFromEvent(ev) {
|
|
67
|
+
// FIXME: Check hooks
|
|
68
|
+
return {
|
|
69
|
+
logicalId: ev.event.LogicalResourceId ?? '',
|
|
70
|
+
message: ev.event.ResourceStatusReason ?? '',
|
|
71
|
+
parentStackLogicalIds: ev.parentStackLogicalIds,
|
|
72
|
+
resourceType: ev.event.ResourceType ?? '',
|
|
73
|
+
stackArn: ev.event.StackId ?? '',
|
|
74
|
+
errorCode: extractErrorCode(ev.event),
|
|
75
|
+
physicalId: ev.event.PhysicalResourceId,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Extract an error code from the given stack event.
|
|
80
|
+
*
|
|
81
|
+
* Always contains the services, and includes the handler error code if available.
|
|
82
|
+
*/
|
|
83
|
+
function extractErrorCode(event) {
|
|
84
|
+
const isOurCustomResource = OUR_CUSTOM_RESOURCE_TYPES.includes(event.ResourceType ?? '');
|
|
85
|
+
// Get the resource type; if it is non-AWS then we are done.
|
|
86
|
+
const resourceTypeParts = (event.ResourceType ?? '').split('::');
|
|
87
|
+
if (resourceTypeParts[0] !== 'AWS' && !isOurCustomResource) {
|
|
88
|
+
return toolkit_error_1.DeploymentErrorCodes.PRIVATE_RESOURCE_ERROR;
|
|
89
|
+
}
|
|
90
|
+
const resourceType = isOurCustomResource ? resourceTypeParts.join('') : resourceTypeParts.slice(1).join('');
|
|
91
|
+
const reason = event.ResourceStatusReason ?? '';
|
|
92
|
+
const errorRe = /(?:HandlerErrorCode:|Error Code:) ([a-zA-Z0-9:-]+)/;
|
|
93
|
+
const handlerCode = reason.match(errorRe);
|
|
94
|
+
return `${resourceType}:${handlerCode ? handlerCode[1] : toolkit_error_1.DeploymentErrorCodes.UNKNOWN_ERROR}`;
|
|
95
|
+
}
|
|
96
|
+
// Some custom resource types that the CDK standard library creates that we
|
|
97
|
+
// would like to see it if they fail.
|
|
98
|
+
const OUR_CUSTOM_RESOURCE_TYPES = [
|
|
99
|
+
'Custom::AWS',
|
|
100
|
+
'Custom::AWSCDK-EKS-Cluster',
|
|
101
|
+
'Custom::AWSCDK-EKS-FargateProfile',
|
|
102
|
+
'Custom::AWSCDK-EKS-HelmChart',
|
|
103
|
+
'Custom::AWSCDK-EKS-KubernetesObjectValue',
|
|
104
|
+
'Custom::AWSCDK-EKS-KubernetesPatch',
|
|
105
|
+
'Custom::AWSCDK-EKS-KubernetesResource',
|
|
106
|
+
'Custom::AWSCDKCfnJson',
|
|
107
|
+
'Custom::AWSCDKCfnJsonStringify',
|
|
108
|
+
'Custom::AWSCDKOpenIdConnectProvider',
|
|
109
|
+
'Custom::CDKBucketDeployment',
|
|
110
|
+
'Custom::CloudwatchLogResourcePolicy',
|
|
111
|
+
'Custom::CrossAccountZoneDelegation',
|
|
112
|
+
'Custom::CrossRegionExportReader',
|
|
113
|
+
'Custom::CrossRegionExportWriter',
|
|
114
|
+
'Custom::CrossRegionStringParameterReader',
|
|
115
|
+
'Custom::DeleteExistingRecordSet',
|
|
116
|
+
'Custom::DescribeCognitoUserPoolClient',
|
|
117
|
+
'Custom::DynamoDBReplica',
|
|
118
|
+
'Custom::ECRAutoDeleteImages',
|
|
119
|
+
'Custom::ElasticsearchAccessPolicy',
|
|
120
|
+
'Custom::LogRetention',
|
|
121
|
+
'Custom::OpenSearchAccessPolicy',
|
|
122
|
+
'Custom::S3AutoDeleteObjects',
|
|
123
|
+
'Custom::S3BucketNotifications',
|
|
124
|
+
'Custom::SyntheticsAutoDeleteUnderlyingResources',
|
|
125
|
+
'Custom::Trigger',
|
|
126
|
+
'Custom::UserPoolCloudFrontDomainName',
|
|
127
|
+
'Custom::VpcRestrictDefaultSG',
|
|
128
|
+
];
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW1JQSw0Q0FpQkM7QUFsSkQsK0RBQW1FO0FBQ25FLDhEQUFzRztBQTRDdEc7O0dBRUc7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNjLE9BQU8sR0FBb0IsRUFBRSxDQUFDO0lBRXhDLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsR0FBRyxNQUF1QjtRQUN0QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksSUFBQSw2QkFBWSxFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixrRkFBa0Y7Z0JBQ2xGLGlFQUFpRTtnQkFDakUsSUFBSSxDQUFDLElBQUEsb0NBQW1CLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUEsdUNBQXNCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzdFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxF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SUFDakIsc0NBQXNDO0lBQ3RDLDhCQUE4QjtDQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdGFja0V2ZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VFdmVudCB9IGZyb20gJy4vc3RhY2stZXZlbnQtcG9sbGVyJztcbmltcG9ydCB7IERlcGxveW1lbnRFcnJvckNvZGVzIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcbmltcG9ydCB7IGlzQ2FuY2VsbGF0aW9uRXZlbnQsIGlzRXJyb3JFdmVudCwgaXNSZWd1bGFyUmVzb3VyY2VFdmVudCB9IGZyb20gJy4uLy4uL3V0aWwvY2xvdWRmb3JtYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHN0YWNrIHRoaXMgcmVzb3VyY2UgZXJyb3Igb2NjdXJyZWQgaW5cbiAgICpcbiAgICogTk9URTogVGhpcyB3aWxsIGJlIGEgc3RhY2sgSUQgKHdoaWNoIGlzIGEgZnVsbCBBUk4gaW5jbHVkaW5nIHRoZSB1bmlxdWUgaWRlbnRpZmllciksXG4gICAqIG5vdCBqdXN0IGEgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElEcyBvZiBwYXJlbnQgc3RhY2tzIG9mIHRoZSByZXNvdXJjZSwgaW4gY2FzZSBvZiByZXNvdXJjZXMgaW4gbmVzdGVkIHN0YWNrc1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTG9naWNhbCBJRCBvZiB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogKE1heSBiZSBhYnNlbnQgaW4gY2FzZSB0aGlzIG1lc3NhZ2UgaXMgYWJvdXQgdGhlIHN0YWNrIGl0c2VsZilcbiAgICovXG4gIHJlYWRvbmx5IGxvZ2ljYWxJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaHlzaWNhbCBJRCBvZiB0aGUgcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IHBoeXNpY2FsSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVycm9yIG1lc3NhZ2Ugb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVycm9yIGNvZGUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBlcnJvckNvZGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2xhc3MgdXNlZCB0byBzZW5kIHN0YWNrIGV2ZW50IGVycm9ycyBpbnRvLCB0byBjb21lIHVwIHdpdGggcm9vdCBjYXVzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUVycm9ycyB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgYWxsIG5vbi1jYW5jZWxsYXRpb24gZXJyb3JzIHdlIGhhdmUgc2Vlbi5cbiAgICpcbiAgICogQnkgdGhlIG5hdHVyZSBvZiB0aGUgb3JkZXIgd2Ugc2VlIGV2ZW50cyBpbiwgd2lsbCBiZSBvcmRlcmVkIGZyb20gb2xkZXN0IHRvIG5ld2VzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Vycm9yczogUmVzb3VyY2VFcnJvcltdID0gW107XG5cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9ycy5sZW5ndGggPT09IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbCgpOiBSZWFkb25seUFycmF5PFJlc291cmNlRXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZXJyb3IgY29sbGVjdGlvbiB3aXRoIHRoZSBnaXZlbiBzdGFjayBhY3Rpdml0eVxuICAgKlxuICAgKiBNYXkgYmUgZnJvbSBhIG5lc3RlZCBzdGFjayBhcyB3ZWxsLlxuICAgKlxuICAgKiBUaGlzIGNsYXNzIGV4cGVjdHMgdG8gc2VlIGFsbCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoLi4uZXZlbnRzOiBSZXNvdXJjZUV2ZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKGlzRXJyb3JFdmVudChldmVudC5ldmVudCkpIHtcbiAgICAgICAgLy8gQ2FuY2VsbGVkIGlzIG5vdCBhbiBpbnRlcmVzdGluZyBmYWlsdXJlIHJlYXNvbiwgbm9yIGlzIHRoZSBzdGFjayBtZXNzYWdlIChzdGFja1xuICAgICAgICAvLyBtZXNzYWdlIHdpbGwganVzdCBzYXkgc29tZXRoaW5nIGxpa2UgXCJzdGFjayBmYWlsZWQgdG8gdXBkYXRlXCIpXG4gICAgICAgIGlmICghaXNDYW5jZWxsYXRpb25FdmVudChldmVudC5ldmVudCkgJiYgaXNSZWd1bGFyUmVzb3VyY2VFdmVudChldmVudC5ldmVudCkpIHtcbiAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChlcnJvckZyb21FdmVudChldmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2Ugb3VyIGJlc3QgZ3Vlc3MgYXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJvb3QgY2F1c2VcbiAgICpcbiAgICogVGhlIGZpcnN0IGVycm9yIHRoYXQgb2NjdXJzIGlzIHRoZSByb290IGNhdXNlLlxuICAgKi9cbiAgcHVibGljIGdldCByb290Q2F1c2VFcnJvckNvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hbGxFcnJvckNvZGVzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBlcnJvciBtZXNzYWdlcyBvZiBhbGwgZW5jb3VudGVyZWQgZXJyb3JzICh0aGF0IGFyZW4ndCBjYW5jZWxsYXRpb25zKVxuICAgKi9cbiAgcHVibGljIGdldCBhbGxFcnJvck1lc3NhZ2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzLm1hcChlID0+IGUubWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGVycm9yIGNvZGVkcyBvZiBhbGwgZW5jb3VudGVyZWQgZXJyb3JzICh0aGF0IGFyZW4ndCBjYW5jZWxsYXRpb25zIG5vciBzdGFjayBlcnJvcnMpXG4gICAqXG4gICAqIFdlIGRvbid0IG5lZWQgdG8gaW5jbHVkZSBuZXN0ZWQgc3RhY2sgZXJyb3JzIGJlY2F1c2Ugb3VyIHBvbGxlciB3aWxsIHBvbGwgdGhlIG5lc3RlZCBzdGFjayxcbiAgICogYW5kIGhhdmUgcmV0dXJuZWQgdGhlIGFjdHVhbCBlcnJvciBhcyB3ZWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxFcnJvckNvZGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzLm1hcChlID0+IGUuZXJyb3JDb2RlKS5maWx0ZXIoeCA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVycm9yRnJvbUV2ZW50KGV2OiBSZXNvdXJjZUV2ZW50KTogUmVzb3VyY2VFcnJvciB7XG4gIC8vIEZJWE1FOiBDaGVjayBob29rc1xuXG4gIHJldHVybiB7XG4gICAgbG9naWNhbElkOiBldi5ldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCA/PyAnJyxcbiAgICBtZXNzYWdlOiBldi5ldmVudC5SZXNvdXJjZVN0YXR1c1JlYXNvbiA/PyAnJyxcbiAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IGV2LnBhcmVudFN0YWNrTG9naWNhbElkcyxcbiAgICByZXNvdXJjZVR5cGU6IGV2LmV2ZW50LlJlc291cmNlVHlwZSA/PyAnJyxcbiAgICBzdGFja0FybjogZXYuZXZlbnQuU3RhY2tJZCA/PyAnJyxcbiAgICBlcnJvckNvZGU6IGV4dHJhY3RFcnJvckNvZGUoZXYuZXZlbnQpLFxuICAgIHBoeXNpY2FsSWQ6IGV2LmV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGFuIGVycm9yIGNvZGUgZnJvbSB0aGUgZ2l2ZW4gc3RhY2sgZXZlbnQuXG4gKlxuICogQWx3YXlzIGNvbnRhaW5zIHRoZSBzZXJ2aWNlcywgYW5kIGluY2x1ZGVzIHRoZSBoYW5kbGVyIGVycm9yIGNvZGUgaWYgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yQ29kZShldmVudDogU3RhY2tFdmVudCk6IHN0cmluZyB7XG4gIGNvbnN0IGlzT3VyQ3VzdG9tUmVzb3VyY2UgPSBPVVJfQ1VTVE9NX1JFU09VUkNFX1RZUEVTLmluY2x1ZGVzKGV2ZW50LlJlc291cmNlVHlwZSA/PyAnJyk7XG5cbiAgLy8gR2V0IHRoZSByZXNvdXJjZSB0eXBlOyBpZiBpdCBpcyBub24tQVdTIHRoZW4gd2UgYXJlIGRvbmUuXG4gIGNvbnN0IHJlc291cmNlVHlwZVBhcnRzID0gKGV2ZW50LlJlc291cmNlVHlwZSA/PyAnJykuc3BsaXQoJzo6Jyk7XG4gIGlmIChyZXNvdXJjZVR5cGVQYXJ0c1swXSAhPT0gJ0FXUycgJiYgIWlzT3VyQ3VzdG9tUmVzb3VyY2UpIHtcbiAgICByZXR1cm4gRGVwbG95bWVudEVycm9yQ29kZXMuUFJJVkFURV9SRVNPVVJDRV9FUlJPUjtcbiAgfVxuXG4gIGNvbnN0IHJlc291cmNlVHlwZSA9IGlzT3VyQ3VzdG9tUmVzb3VyY2UgPyByZXNvdXJjZVR5cGVQYXJ0cy5qb2luKCcnKSA6IHJlc291cmNlVHlwZVBhcnRzLnNsaWNlKDEpLmpvaW4oJycpO1xuXG4gIGNvbnN0IHJlYXNvbiA9IGV2ZW50LlJlc291cmNlU3RhdHVzUmVhc29uID8/ICcnO1xuXG4gIGNvbnN0IGVycm9yUmUgPSAvKD86SGFuZGxlckVycm9yQ29kZTp8RXJyb3IgQ29kZTopIChbYS16QS1aMC05Oi1dKykvO1xuICBjb25zdCBoYW5kbGVyQ29kZSA9IHJlYXNvbi5tYXRjaChlcnJvclJlKTtcblxuICByZXR1cm4gYCR7cmVzb3VyY2VUeXBlfToke2hhbmRsZXJDb2RlID8gaGFuZGxlckNvZGVbMV0gOiBEZXBsb3ltZW50RXJyb3JDb2Rlcy5VTktOT1dOX0VSUk9SfWA7XG59XG5cbi8vIFNvbWUgY3VzdG9tIHJlc291cmNlIHR5cGVzIHRoYXQgdGhlIENESyBzdGFuZGFyZCBsaWJyYXJ5IGNyZWF0ZXMgdGhhdCB3ZVxuLy8gd291bGQgbGlrZSB0byBzZWUgaXQgaWYgdGhleSBmYWlsLlxuY29uc3QgT1VSX0NVU1RPTV9SRVNPVVJDRV9UWVBFUyA9IFtcbiAgJ0N1c3RvbTo6QVdTJyxcbiAgJ0N1c3RvbTo6QVdTQ0RLLUVLUy1DbHVzdGVyJyxcbiAgJ0N1c3RvbTo6QVdTQ0RLLUVLUy1GYXJnYXRlUHJvZmlsZScsXG4gICdDdXN0b206OkFXU0NESy1FS1MtSGVsbUNoYXJ0JyxcbiAgJ0N1c3RvbTo6QVdTQ0RLLUVLUy1LdWJlcm5ldGVzT2JqZWN0VmFsdWUnLFxuICAnQ3VzdG9tOjpBV1NDREstRUtTLUt1YmVybmV0ZXNQYXRjaCcsXG4gICdDdXN0b206OkFXU0NESy1FS1MtS3ViZXJuZXRlc1Jlc291cmNlJyxcbiAgJ0N1c3RvbTo6QVdTQ0RLQ2ZuSnNvbicsXG4gICdDdXN0b206OkFXU0NES0Nmbkpzb25TdHJpbmdpZnknLFxuICAnQ3VzdG9tOjpBV1NDREtPcGVuSWRDb25uZWN0UHJvdmlkZXInLFxuICAnQ3VzdG9tOjpDREtCdWNrZXREZXBsb3ltZW50JyxcbiAgJ0N1c3RvbTo6Q2xvdWR3YXRjaExvZ1Jlc291cmNlUG9saWN5JyxcbiAgJ0N1c3RvbTo6Q3Jvc3NBY2NvdW50Wm9uZURlbGVnYXRpb24nLFxuICAnQ3VzdG9tOjpDcm9zc1JlZ2lvbkV4cG9ydFJlYWRlcicsXG4gICdDdXN0b206OkNyb3NzUmVnaW9uRXhwb3J0V3JpdGVyJyxcbiAgJ0N1c3RvbTo6Q3Jvc3NSZWdpb25TdHJpbmdQYXJhbWV0ZXJSZWFkZXInLFxuICAnQ3VzdG9tOjpEZWxldGVFeGlzdGluZ1JlY29yZFNldCcsXG4gICdDdXN0b206OkRlc2NyaWJlQ29nbml0b1VzZXJQb29sQ2xpZW50JyxcbiAgJ0N1c3RvbTo6RHluYW1vREJSZXBsaWNhJyxcbiAgJ0N1c3RvbTo6RUNSQXV0b0RlbGV0ZUltYWdlcycsXG4gICdDdXN0b206OkVsYXN0aWNzZWFyY2hBY2Nlc3NQb2xpY3knLFxuICAnQ3VzdG9tOjpMb2dSZXRlbnRpb24nLFxuICAnQ3VzdG9tOjpPcGVuU2VhcmNoQWNjZXNzUG9saWN5JyxcbiAgJ0N1c3RvbTo6UzNBdXRvRGVsZXRlT2JqZWN0cycsXG4gICdDdXN0b206OlMzQnVja2V0Tm90aWZpY2F0aW9ucycsXG4gICdDdXN0b206OlN5bnRoZXRpY3NBdXRvRGVsZXRlVW5kZXJseWluZ1Jlc291cmNlcycsXG4gICdDdXN0b206OlRyaWdnZXInLFxuICAnQ3VzdG9tOjpVc2VyUG9vbENsb3VkRnJvbnREb21haW5OYW1lJyxcbiAgJ0N1c3RvbTo6VnBjUmVzdHJpY3REZWZhdWx0U0cnLFxuXTtcbiJdfQ==
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { CloudFormationStackArtifact } from '@aws-cdk/cloud-assembly-api';
|
|
2
|
-
import type { StackEvent } from '@aws-sdk/client-cloudformation';
|
|
3
2
|
import type { ICloudFormationClient } from '../aws-auth/private';
|
|
4
3
|
import type { EnvironmentResources } from '../environment';
|
|
5
4
|
import { type IoHelper } from '../io/private';
|
|
@@ -76,12 +75,6 @@ export declare class StackActivityMonitor {
|
|
|
76
75
|
* Printers can decide to update a view less frequently if desired
|
|
77
76
|
*/
|
|
78
77
|
private readonly pollingInterval;
|
|
79
|
-
/**
|
|
80
|
-
* A list of all non-cancellation errors we have seen.
|
|
81
|
-
*
|
|
82
|
-
* By the nature of the order we see events in, will be ordered from oldest to newest.
|
|
83
|
-
*/
|
|
84
|
-
private readonly _errors;
|
|
85
78
|
private monitorId?;
|
|
86
79
|
private readonly progressMonitor;
|
|
87
80
|
/**
|
|
@@ -99,22 +92,9 @@ export declare class StackActivityMonitor {
|
|
|
99
92
|
private readonly envResources?;
|
|
100
93
|
constructor({ cfn, ioHelper, stack, stackName, resourcesTotal, changeSetCreationTime, pollingInterval, envResources, }: StackActivityMonitorProps);
|
|
101
94
|
/**
|
|
102
|
-
*
|
|
103
|
-
*/
|
|
104
|
-
get allErrorMessages(): string[];
|
|
105
|
-
/**
|
|
106
|
-
* Return error codeds of all encountered errors (that aren't cancellations nor stack errors)
|
|
107
|
-
*
|
|
108
|
-
* We don't need to include nested stack errors because our poller will poll the nested stack,
|
|
109
|
-
* and have returned the actual error as well.
|
|
110
|
-
*/
|
|
111
|
-
get allErrorCodes(): string[];
|
|
112
|
-
/**
|
|
113
|
-
* Take our best guess at the error code of the root cause
|
|
114
|
-
*
|
|
115
|
-
* The first error that occurs is the root cause.
|
|
95
|
+
* The resource errors that were discovered during monitoring of this stack
|
|
116
96
|
*/
|
|
117
|
-
get
|
|
97
|
+
get errors(): import("./resource-errors").ResourceErrors;
|
|
118
98
|
start(): Promise<this>;
|
|
119
99
|
stop(): Promise<void>;
|
|
120
100
|
private scheduleNextTick;
|
|
@@ -149,12 +129,5 @@ export declare class StackActivityMonitor {
|
|
|
149
129
|
* Formats a stack activity into a basic string
|
|
150
130
|
*/
|
|
151
131
|
private formatActivity;
|
|
152
|
-
private checkForErrors;
|
|
153
132
|
}
|
|
154
|
-
/**
|
|
155
|
-
* Extract an error code from the given stack event.
|
|
156
|
-
*
|
|
157
|
-
* Always contains the services, and includes the handler error code if available.
|
|
158
|
-
*/
|
|
159
|
-
export declare function extractErrorCode(event: StackEvent): string;
|
|
160
133
|
//# sourceMappingURL=stack-activity-monitor.d.ts.map
|