@aws-cdk/toolkit-lib 0.3.2 → 0.3.3
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/lib/actions/bootstrap/index.d.ts +1 -1
- package/lib/actions/bootstrap/index.js +5 -5
- package/lib/actions/deploy/index.d.ts +1 -1
- package/lib/actions/deploy/index.js +1 -1
- package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
- package/lib/actions/deploy/private/deploy-options.js +1 -1
- package/lib/actions/deploy/private/helpers.d.ts +3 -2
- package/lib/actions/deploy/private/helpers.js +3 -3
- package/lib/actions/diff/private/helpers.d.ts +5 -9
- package/lib/actions/diff/private/helpers.js +6 -23
- package/lib/api/aws-auth/account-cache.d.ts +41 -0
- package/lib/api/aws-auth/account-cache.js +108 -0
- package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
- package/lib/api/aws-auth/awscli-compatible.js +250 -0
- package/lib/api/aws-auth/cached.d.ts +11 -0
- package/lib/api/aws-auth/cached.js +26 -0
- package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
- package/lib/api/aws-auth/credential-plugins.js +154 -0
- package/lib/api/aws-auth/private/index.d.ts +11 -0
- package/lib/api/aws-auth/private/index.js +37 -0
- package/lib/api/aws-auth/provider-caching.d.ts +13 -0
- package/lib/api/aws-auth/provider-caching.js +24 -0
- package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
- package/lib/api/aws-auth/proxy-agent.js +54 -0
- package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
- package/lib/api/aws-auth/sdk-logger.js +128 -0
- package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
- package/lib/api/aws-auth/sdk-provider.js +373 -0
- package/lib/api/aws-auth/sdk.d.ts +235 -0
- package/lib/api/aws-auth/sdk.js +391 -0
- package/lib/api/aws-auth/tracing.d.ts +11 -0
- package/lib/api/aws-auth/tracing.js +60 -0
- package/lib/api/aws-auth/user-agent.d.ts +7 -0
- package/lib/api/aws-auth/user-agent.js +20 -0
- package/lib/api/aws-auth/util.d.ts +6 -0
- package/lib/api/aws-auth/util.js +21 -0
- package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
- package/lib/api/bootstrap/bootstrap-environment.js +323 -0
- package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
- package/lib/api/bootstrap/bootstrap-props.js +14 -0
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
- package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
- package/lib/api/bootstrap/index.d.ts +3 -0
- package/lib/api/bootstrap/index.js +23 -0
- package/lib/api/bootstrap/legacy-template.d.ts +2 -0
- package/lib/api/bootstrap/legacy-template.js +82 -0
- package/lib/api/cloud-assembly/environment.d.ts +43 -0
- package/lib/api/cloud-assembly/environment.js +127 -0
- package/lib/api/cloud-assembly/index.d.ts +1 -1
- package/lib/api/cloud-assembly/index.js +3 -3
- package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
- package/lib/api/cloud-assembly/private/context-aware-source.js +5 -5
- package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
- package/lib/api/cloud-assembly/private/prepare-source.js +14 -12
- package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
- package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
- package/lib/api/cloud-assembly/private/source-builder.js +8 -6
- package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
- package/lib/api/cloud-assembly/private/stack-assembly.js +10 -9
- package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
- package/lib/api/cloud-assembly/stack-assembly.js +139 -0
- package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
- package/lib/api/cloud-assembly/stack-collection.js +112 -0
- package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
- package/lib/api/cloud-assembly/stack-selector.js +62 -5
- package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
- package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
- package/lib/api/cloudformation/index.d.ts +4 -0
- package/lib/api/cloudformation/index.js +21 -0
- package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
- package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
- package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
- package/lib/api/cloudformation/stack-helpers.js +163 -0
- package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
- package/lib/api/cloudformation/template-body-parameter.js +104 -0
- package/lib/api/context.d.ts +40 -0
- package/lib/api/context.js +84 -0
- package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
- package/lib/api/deployments/asset-manifest-builder.js +33 -0
- package/lib/api/deployments/asset-publishing.d.ts +60 -0
- package/lib/api/deployments/asset-publishing.js +144 -0
- package/lib/api/deployments/assets.d.ts +11 -0
- package/lib/api/deployments/assets.js +109 -0
- package/lib/api/deployments/cfn-api.d.ts +145 -0
- package/lib/api/deployments/cfn-api.js +444 -0
- package/lib/api/deployments/checks.d.ts +9 -0
- package/lib/api/deployments/checks.js +72 -0
- package/lib/api/deployments/deploy-stack.d.ts +164 -0
- package/lib/api/deployments/deploy-stack.js +490 -0
- package/lib/api/deployments/deployment-method.d.ts +24 -0
- package/lib/api/deployments/deployment-method.js +3 -0
- package/lib/api/deployments/deployment-result.d.ts +21 -0
- package/lib/api/deployments/deployment-result.js +10 -0
- package/lib/api/deployments/deployments.d.ts +289 -0
- package/lib/api/deployments/deployments.js +355 -0
- package/lib/api/deployments/index.d.ts +6 -0
- package/lib/api/deployments/index.js +27 -0
- package/lib/api/diff/diff-formatter.d.ts +147 -0
- package/lib/api/diff/diff-formatter.js +225 -0
- package/lib/api/diff/index.d.ts +1 -0
- package/lib/api/diff/index.js +18 -0
- package/lib/api/environment/environment-access.d.ts +139 -0
- package/lib/api/environment/environment-access.js +205 -0
- package/lib/api/environment/environment-resources.d.ts +75 -0
- package/lib/api/environment/environment-resources.js +213 -0
- package/lib/api/environment/index.d.ts +3 -0
- package/lib/api/environment/index.js +20 -0
- package/lib/api/environment/placeholders.d.ts +10 -0
- package/lib/api/environment/placeholders.js +23 -0
- package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
- package/lib/api/garbage-collection/garbage-collector.js +614 -0
- package/lib/api/garbage-collection/index.d.ts +3 -0
- package/lib/api/garbage-collection/index.js +21 -0
- package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
- package/lib/api/garbage-collection/progress-printer.js +80 -0
- package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
- package/lib/api/garbage-collection/stack-refresh.js +152 -0
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
- package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
- package/lib/api/hotswap/code-build-projects.d.ts +4 -0
- package/lib/api/hotswap/code-build-projects.js +62 -0
- package/lib/api/hotswap/common.d.ts +89 -0
- package/lib/api/hotswap/common.js +137 -0
- package/lib/api/hotswap/ecs-services.d.ts +4 -0
- package/lib/api/hotswap/ecs-services.js +159 -0
- package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
- package/lib/api/hotswap/hotswap-deployments.js +441 -0
- package/lib/api/hotswap/index.d.ts +2 -0
- package/lib/api/hotswap/index.js +19 -0
- package/lib/api/hotswap/lambda-functions.d.ts +4 -0
- package/lib/api/hotswap/lambda-functions.js +297 -0
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
- package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
- package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
- package/lib/api/index.d.ts +25 -0
- package/lib/api/index.js +42 -0
- package/lib/api/io/index.d.ts +3 -1
- package/lib/api/io/index.js +18 -1
- package/lib/api/io/io-host.d.ts +15 -0
- package/lib/api/io/io-host.js +3 -0
- package/lib/api/io/io-message.d.ts +76 -0
- package/lib/api/io/io-message.js +3 -0
- package/lib/api/io/private/index.d.ts +7 -1
- package/lib/api/io/private/index.js +8 -5
- package/lib/api/io/private/io-default-messages.d.ts +21 -0
- package/lib/api/io/private/io-default-messages.js +59 -0
- package/lib/api/io/private/io-helper.d.ts +32 -0
- package/lib/api/io/private/io-helper.js +51 -0
- package/lib/api/io/private/level-priority.d.ts +11 -0
- package/lib/api/io/private/level-priority.js +33 -0
- package/lib/api/io/private/message-maker.d.ts +89 -0
- package/lib/api/io/private/message-maker.js +60 -0
- package/lib/api/io/private/messages.d.ts +178 -0
- package/lib/api/io/private/messages.js +534 -0
- package/lib/api/io/private/span.d.ts +93 -0
- package/lib/api/io/private/span.js +87 -0
- package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
- package/lib/api/io/private/testing/fake-io-host.js +41 -0
- package/lib/api/io/private/testing/index.d.ts +2 -0
- package/lib/api/io/private/testing/index.js +19 -0
- package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
- package/lib/api/io/private/testing/test-io-host.js +61 -0
- package/lib/api/io/private/types.d.ts +4 -0
- package/lib/api/io/private/types.js +3 -0
- package/lib/api/io/toolkit-action.d.ts +4 -0
- package/lib/api/io/toolkit-action.js +3 -0
- package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
- package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
- package/lib/api/logs-monitor/index.d.ts +2 -0
- package/lib/api/logs-monitor/index.js +19 -0
- package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
- package/lib/api/logs-monitor/logs-monitor.js +194 -0
- package/lib/api/notices.d.ts +210 -0
- package/lib/api/notices.js +430 -0
- package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
- package/lib/api/plugin/context-provider-plugin.js +7 -0
- package/lib/api/plugin/index.d.ts +3 -0
- package/lib/api/plugin/index.js +20 -0
- package/lib/api/plugin/mode.d.ts +4 -0
- package/lib/api/plugin/mode.js +9 -0
- package/lib/api/plugin/plugin.d.ts +72 -0
- package/lib/api/plugin/plugin.js +132 -0
- package/lib/api/private.d.ts +1 -0
- package/lib/api/private.js +18 -0
- package/lib/api/refactoring/cloudformation.d.ts +15 -0
- package/lib/api/refactoring/cloudformation.js +3 -0
- package/lib/api/refactoring/digest.d.ts +26 -0
- package/lib/api/refactoring/digest.js +175 -0
- package/lib/api/refactoring/index.d.ts +51 -0
- package/lib/api/refactoring/index.js +223 -0
- package/lib/api/require-approval.d.ts +17 -0
- package/lib/api/require-approval.js +22 -0
- package/lib/api/resource-import/importer.d.ts +216 -0
- package/lib/api/resource-import/importer.js +331 -0
- package/lib/api/resource-import/index.d.ts +2 -0
- package/lib/api/resource-import/index.js +19 -0
- package/lib/api/resource-import/migrator.d.ts +26 -0
- package/lib/api/resource-import/migrator.js +73 -0
- package/lib/api/resource-metadata/index.d.ts +1 -0
- package/lib/api/resource-metadata/index.js +18 -0
- package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
- package/lib/api/resource-metadata/resource-metadata.js +42 -0
- package/lib/api/rwlock.d.ts +60 -0
- package/lib/api/rwlock.js +204 -0
- package/lib/api/settings.d.ts +26 -0
- package/lib/api/settings.js +107 -0
- package/lib/api/shared-private.d.ts +8 -6
- package/lib/api/shared-private.js +2838 -9213
- package/lib/api/shared-private.js.map +4 -4
- package/lib/api/shared-public.d.ts +18 -38
- package/lib/api/shared-public.js +2187 -25
- package/lib/api/shared-public.js.map +4 -4
- package/lib/api/stack-events/index.d.ts +4 -0
- package/lib/api/stack-events/index.js +23 -0
- package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
- package/lib/api/stack-events/stack-activity-monitor.js +164 -0
- package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
- package/lib/api/stack-events/stack-event-poller.js +130 -0
- package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
- package/lib/api/stack-events/stack-progress-monitor.js +98 -0
- package/lib/api/stack-events/stack-status.d.ts +42 -0
- package/lib/api/stack-events/stack-status.js +90 -0
- package/lib/api/streams.d.ts +7 -0
- package/lib/api/streams.js +24 -0
- package/lib/api/tags.d.ts +9 -0
- package/lib/api/tags.js +10 -0
- package/lib/api/toolkit-error.d.ts +86 -0
- package/lib/api/toolkit-error.js +132 -0
- package/lib/api/toolkit-info.d.ts +52 -0
- package/lib/api/toolkit-info.js +157 -0
- package/lib/api/tree.d.ts +31 -0
- package/lib/api/tree.js +37 -0
- package/lib/api/work-graph/index.d.ts +3 -0
- package/lib/api/work-graph/index.js +20 -0
- package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
- package/lib/api/work-graph/work-graph-builder.js +172 -0
- package/lib/api/work-graph/work-graph-types.d.ts +50 -0
- package/lib/api/work-graph/work-graph-types.js +13 -0
- package/lib/api/work-graph/work-graph.d.ts +72 -0
- package/lib/api/work-graph/work-graph.js +349 -0
- package/lib/context-providers/ami.d.ts +13 -0
- package/lib/context-providers/ami.js +52 -0
- package/lib/context-providers/availability-zones.d.ts +13 -0
- package/lib/context-providers/availability-zones.js +29 -0
- package/lib/context-providers/cc-api-provider.d.ts +30 -0
- package/lib/context-providers/cc-api-provider.js +145 -0
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
- package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
- package/lib/context-providers/hosted-zones.d.ts +12 -0
- package/lib/context-providers/hosted-zones.js +69 -0
- package/lib/context-providers/index.d.ts +44 -0
- package/lib/context-providers/index.js +128 -0
- package/lib/context-providers/keys.d.ts +13 -0
- package/lib/context-providers/keys.js +54 -0
- package/lib/context-providers/load-balancers.d.ts +20 -0
- package/lib/context-providers/load-balancers.js +161 -0
- package/lib/context-providers/security-groups.d.ts +9 -0
- package/lib/context-providers/security-groups.js +69 -0
- package/lib/context-providers/ssm-parameters.d.ts +25 -0
- package/lib/context-providers/ssm-parameters.js +61 -0
- package/lib/context-providers/vpcs.d.ts +13 -0
- package/lib/context-providers/vpcs.js +291 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
- package/lib/payloads/bootstrap-environment-progress.js +3 -0
- package/lib/payloads/context.d.ts +9 -0
- package/lib/payloads/context.js +3 -0
- package/lib/payloads/deploy.d.ts +43 -0
- package/lib/payloads/deploy.js +3 -0
- package/lib/payloads/destroy.d.ts +23 -0
- package/lib/payloads/destroy.js +3 -0
- package/lib/payloads/diff.d.ts +31 -0
- package/lib/payloads/diff.js +22 -0
- package/lib/payloads/hotswap.d.ts +211 -0
- package/lib/payloads/hotswap.js +43 -0
- package/lib/payloads/index.d.ts +17 -0
- package/lib/payloads/index.js +34 -0
- package/lib/payloads/list.d.ts +4 -0
- package/lib/payloads/list.js +3 -0
- package/lib/payloads/logs-monitor.d.ts +33 -0
- package/lib/payloads/logs-monitor.js +3 -0
- package/lib/payloads/progress.d.ts +14 -0
- package/lib/payloads/progress.js +3 -0
- package/lib/payloads/refactor.d.ts +14 -0
- package/lib/payloads/refactor.js +3 -0
- package/lib/payloads/rollback.d.ts +17 -0
- package/lib/payloads/rollback.js +3 -0
- package/lib/payloads/sdk-trace.d.ts +20 -0
- package/lib/payloads/sdk-trace.js +3 -0
- package/lib/payloads/stack-activity.d.ts +53 -0
- package/lib/payloads/stack-activity.js +3 -0
- package/lib/payloads/stack-details.d.ts +17 -0
- package/lib/payloads/stack-details.js +3 -0
- package/lib/payloads/synth.d.ts +7 -0
- package/lib/payloads/synth.js +3 -0
- package/lib/payloads/types.d.ts +95 -0
- package/lib/payloads/types.js +3 -0
- package/lib/payloads/watch.d.ts +27 -0
- package/lib/payloads/watch.js +3 -0
- package/lib/private/activity-printer/base.d.ts +50 -0
- package/lib/private/activity-printer/base.js +120 -0
- package/lib/private/activity-printer/current.d.ts +26 -0
- package/lib/private/activity-printer/current.js +122 -0
- package/lib/private/activity-printer/display.d.ts +13 -0
- package/lib/private/activity-printer/display.js +81 -0
- package/lib/private/activity-printer/history.d.ts +32 -0
- package/lib/private/activity-printer/history.js +109 -0
- package/lib/private/activity-printer/index.d.ts +3 -0
- package/lib/private/activity-printer/index.js +20 -0
- package/lib/private/index.d.ts +1 -0
- package/lib/private/index.js +18 -0
- package/lib/private/util.d.ts +1 -1
- package/lib/private/util.js +22 -22
- package/lib/private/util.js.map +2 -2
- package/lib/toolkit/private/index.d.ts +2 -1
- package/lib/toolkit/private/index.js +1 -1
- package/lib/toolkit/toolkit.js +142 -124
- package/lib/toolkit/types.d.ts +0 -55
- package/lib/toolkit/types.js +1 -1
- package/lib/util/archive.d.ts +1 -0
- package/lib/util/archive.js +86 -0
- package/lib/util/arrays.d.ts +14 -0
- package/lib/util/arrays.js +36 -0
- package/lib/util/bool.d.ts +7 -0
- package/lib/util/bool.js +13 -0
- package/lib/util/bytes.d.ts +8 -0
- package/lib/util/bytes.js +21 -0
- package/lib/util/cloudformation.d.ts +16 -0
- package/lib/util/cloudformation.js +36 -0
- package/lib/util/content-hash.d.ts +5 -0
- package/lib/util/content-hash.js +43 -0
- package/lib/util/directories.d.ts +22 -0
- package/lib/util/directories.js +59 -0
- package/lib/util/format-error.d.ts +9 -0
- package/lib/util/format-error.js +22 -0
- package/lib/util/index.d.ts +18 -0
- package/lib/util/index.js +35 -0
- package/lib/util/json.d.ts +48 -0
- package/lib/util/json.js +68 -0
- package/lib/util/objects.d.ts +65 -0
- package/lib/util/objects.js +230 -0
- package/lib/util/package-info.d.ts +3 -0
- package/lib/util/package-info.js +22 -0
- package/lib/util/parallel.d.ts +6 -0
- package/lib/util/parallel.js +48 -0
- package/lib/util/serialize.d.ts +27 -0
- package/lib/util/serialize.js +86 -0
- package/lib/util/string-manipulation.d.ts +18 -0
- package/lib/util/string-manipulation.js +46 -0
- package/lib/util/type-brands.d.ts +39 -0
- package/lib/util/type-brands.js +39 -0
- package/lib/util/types.d.ts +27 -0
- package/lib/util/types.js +25 -0
- package/lib/util/version-range.d.ts +2 -0
- package/lib/util/version-range.js +36 -0
- package/lib/util/yaml-cfn.d.ts +15 -0
- package/lib/util/yaml-cfn.js +58 -0
- package/package.json +3 -4
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResourceMapping = exports.ResourceLocation = exports.AmbiguityError = void 0;
|
|
4
|
+
exports.resourceMovements = resourceMovements;
|
|
5
|
+
exports.ambiguousMovements = ambiguousMovements;
|
|
6
|
+
exports.resourceMappings = resourceMappings;
|
|
7
|
+
exports.findResourceMovements = findResourceMovements;
|
|
8
|
+
exports.formatTypedMappings = formatTypedMappings;
|
|
9
|
+
exports.formatAmbiguousMappings = formatAmbiguousMappings;
|
|
10
|
+
const cloudformation_diff_1 = require("@aws-cdk/cloudformation-diff");
|
|
11
|
+
const util_1 = require("../../util");
|
|
12
|
+
const plugin_1 = require("../plugin");
|
|
13
|
+
const streams_1 = require("../streams");
|
|
14
|
+
const digest_1 = require("./digest");
|
|
15
|
+
class AmbiguityError extends Error {
|
|
16
|
+
movements;
|
|
17
|
+
constructor(movements) {
|
|
18
|
+
super('Ambiguous resource mappings');
|
|
19
|
+
this.movements = movements;
|
|
20
|
+
}
|
|
21
|
+
paths() {
|
|
22
|
+
return this.movements.map(([a, b]) => [convert(a), convert(b)]);
|
|
23
|
+
function convert(locations) {
|
|
24
|
+
return locations.map((l) => l.toPath());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.AmbiguityError = AmbiguityError;
|
|
29
|
+
/**
|
|
30
|
+
* This class mirrors the `ResourceLocation` interface from CloudFormation,
|
|
31
|
+
* but is richer, since it has a reference to the stack object, rather than
|
|
32
|
+
* merely the stack name.
|
|
33
|
+
*/
|
|
34
|
+
class ResourceLocation {
|
|
35
|
+
stack;
|
|
36
|
+
logicalResourceId;
|
|
37
|
+
constructor(stack, logicalResourceId) {
|
|
38
|
+
this.stack = stack;
|
|
39
|
+
this.logicalResourceId = logicalResourceId;
|
|
40
|
+
}
|
|
41
|
+
toPath() {
|
|
42
|
+
const stack = this.stack;
|
|
43
|
+
const resource = stack.template.Resources?.[this.logicalResourceId];
|
|
44
|
+
const result = resource?.Metadata?.['aws:cdk:path'];
|
|
45
|
+
if (result != null) {
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
// If the path is not available, we can use stack name and logical ID
|
|
49
|
+
return `${stack.stackName}.${this.logicalResourceId}`;
|
|
50
|
+
}
|
|
51
|
+
getType() {
|
|
52
|
+
const resource = this.stack.template.Resources?.[this.logicalResourceId ?? ''];
|
|
53
|
+
return resource?.Type ?? 'Unknown';
|
|
54
|
+
}
|
|
55
|
+
equalTo(other) {
|
|
56
|
+
return this.logicalResourceId === other.logicalResourceId && this.stack.stackName === other.stack.stackName;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.ResourceLocation = ResourceLocation;
|
|
60
|
+
/**
|
|
61
|
+
* A mapping between a source and a destination location.
|
|
62
|
+
*/
|
|
63
|
+
class ResourceMapping {
|
|
64
|
+
source;
|
|
65
|
+
destination;
|
|
66
|
+
constructor(source, destination) {
|
|
67
|
+
this.source = source;
|
|
68
|
+
this.destination = destination;
|
|
69
|
+
}
|
|
70
|
+
toTypedMapping() {
|
|
71
|
+
return {
|
|
72
|
+
// the type is the same in both source and destination,
|
|
73
|
+
// so we can use either one
|
|
74
|
+
type: this.source.getType(),
|
|
75
|
+
sourcePath: this.source.toPath(),
|
|
76
|
+
destinationPath: this.destination.toPath(),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.ResourceMapping = ResourceMapping;
|
|
81
|
+
function groupByKey(entries) {
|
|
82
|
+
const result = {};
|
|
83
|
+
for (const [hash, location] of entries) {
|
|
84
|
+
if (hash in result) {
|
|
85
|
+
result[hash].push(location);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
result[hash] = [location];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
function resourceMovements(before, after) {
|
|
94
|
+
return Object.values(removeUnmovedResources(zip(groupByKey(before.flatMap(resourceDigests)), groupByKey(after.flatMap(resourceDigests)))));
|
|
95
|
+
}
|
|
96
|
+
function ambiguousMovements(movements) {
|
|
97
|
+
// A movement is considered ambiguous if these two conditions are met:
|
|
98
|
+
// 1. Both sides have at least one element (otherwise, it's just addition or deletion)
|
|
99
|
+
// 2. At least one side has more than one element
|
|
100
|
+
return movements
|
|
101
|
+
.filter(([pre, post]) => pre.length > 0 && post.length > 0)
|
|
102
|
+
.filter(([pre, post]) => pre.length > 1 || post.length > 1);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Converts a list of unambiguous resource movements into a list of resource mappings.
|
|
106
|
+
*
|
|
107
|
+
*/
|
|
108
|
+
function resourceMappings(movements, stacks) {
|
|
109
|
+
const predicate = stacks == null
|
|
110
|
+
? () => true
|
|
111
|
+
: (m) => {
|
|
112
|
+
// Any movement that involves one of the selected stacks (either moving from or to)
|
|
113
|
+
// is considered a candidate for refactoring.
|
|
114
|
+
const stackNames = [m.source.stack.stackName, m.destination.stack.stackName];
|
|
115
|
+
return stacks.some((stack) => stackNames.includes(stack.stackName));
|
|
116
|
+
};
|
|
117
|
+
return movements
|
|
118
|
+
.filter(([pre, post]) => pre.length === 1 && post.length === 1 && !pre[0].equalTo(post[0]))
|
|
119
|
+
.map(([pre, post]) => new ResourceMapping(pre[0], post[0]))
|
|
120
|
+
.filter(predicate);
|
|
121
|
+
}
|
|
122
|
+
function removeUnmovedResources(m) {
|
|
123
|
+
const result = {};
|
|
124
|
+
for (const [hash, [before, after]] of Object.entries(m)) {
|
|
125
|
+
const common = before.filter((b) => after.some((a) => a.equalTo(b)));
|
|
126
|
+
result[hash] = [
|
|
127
|
+
before.filter((b) => !common.some((c) => b.equalTo(c))),
|
|
128
|
+
after.filter((a) => !common.some((c) => a.equalTo(c))),
|
|
129
|
+
];
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* For each hash, identifying a single resource, zip the two lists of locations,
|
|
135
|
+
* producing a resource movement
|
|
136
|
+
*/
|
|
137
|
+
function zip(m1, m2) {
|
|
138
|
+
const result = {};
|
|
139
|
+
for (const [hash, locations] of Object.entries(m1)) {
|
|
140
|
+
if (hash in m2) {
|
|
141
|
+
result[hash] = [locations, m2[hash]];
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
result[hash] = [locations, []];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (const [hash, locations] of Object.entries(m2)) {
|
|
148
|
+
if (!(hash in m1)) {
|
|
149
|
+
result[hash] = [[], locations];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Computes a list of pairs [digest, location] for each resource in the stack.
|
|
156
|
+
*/
|
|
157
|
+
function resourceDigests(stack) {
|
|
158
|
+
const digests = (0, digest_1.computeResourceDigests)(stack.template);
|
|
159
|
+
return Object.entries(digests).map(([logicalId, digest]) => {
|
|
160
|
+
const location = new ResourceLocation(stack, logicalId);
|
|
161
|
+
return [digest, location];
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Compares the deployed state to the cloud assembly state, and finds all resources
|
|
166
|
+
* that were moved from one location (stack + logical ID) to another. The comparison
|
|
167
|
+
* is done per environment.
|
|
168
|
+
*/
|
|
169
|
+
async function findResourceMovements(stacks, sdkProvider) {
|
|
170
|
+
const stackGroups = new Map();
|
|
171
|
+
// Group stacks by environment
|
|
172
|
+
for (const stack of stacks) {
|
|
173
|
+
const environment = stack.environment;
|
|
174
|
+
const key = (0, digest_1.hashObject)(environment);
|
|
175
|
+
if (stackGroups.has(key)) {
|
|
176
|
+
stackGroups.get(key)[1].push(stack);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// The first time we see an environment, we need to fetch all stacks deployed to it.
|
|
180
|
+
const before = await getDeployedStacks(sdkProvider, environment);
|
|
181
|
+
stackGroups.set(key, [before, [stack]]);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const result = [];
|
|
185
|
+
for (const [_, [before, after]] of stackGroups) {
|
|
186
|
+
result.push(...resourceMovements(before, after));
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
async function getDeployedStacks(sdkProvider, environment) {
|
|
191
|
+
const cfn = (await sdkProvider.forEnvironment(environment, plugin_1.Mode.ForReading)).sdk.cloudFormation();
|
|
192
|
+
const summaries = await cfn.paginatedListStacks({
|
|
193
|
+
StackStatusFilter: [
|
|
194
|
+
'CREATE_COMPLETE',
|
|
195
|
+
'UPDATE_COMPLETE',
|
|
196
|
+
'UPDATE_ROLLBACK_COMPLETE',
|
|
197
|
+
'IMPORT_COMPLETE',
|
|
198
|
+
'ROLLBACK_COMPLETE',
|
|
199
|
+
],
|
|
200
|
+
});
|
|
201
|
+
const normalize = async (summary) => {
|
|
202
|
+
const templateCommandOutput = await cfn.getTemplate({ StackName: summary.StackName });
|
|
203
|
+
const template = (0, util_1.deserializeStructure)(templateCommandOutput.TemplateBody ?? '{}');
|
|
204
|
+
return {
|
|
205
|
+
environment,
|
|
206
|
+
stackName: summary.StackName,
|
|
207
|
+
template,
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
|
|
211
|
+
return Promise.all(summaries.map(normalize));
|
|
212
|
+
}
|
|
213
|
+
function formatTypedMappings(mappings) {
|
|
214
|
+
const stream = new streams_1.StringWriteStream();
|
|
215
|
+
(0, cloudformation_diff_1.formatTypedMappings)(stream, mappings);
|
|
216
|
+
return stream.toString();
|
|
217
|
+
}
|
|
218
|
+
function formatAmbiguousMappings(paths) {
|
|
219
|
+
const stream = new streams_1.StringWriteStream();
|
|
220
|
+
(0, cloudformation_diff_1.formatAmbiguousMappings)(stream, paths);
|
|
221
|
+
return stream.toString();
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtR0EsOENBTUM7QUFFRCxnREFPQztBQU1ELDRDQWNDO0FBNkRELHNEQXdCQztBQWdDRCxrREFJQztBQUVELDBEQUlDO0FBcFFELHNFQUdzQztBQUd0QyxxQ0FBa0Q7QUFFbEQsc0NBQWlDO0FBQ2pDLHdDQUErQztBQUUvQyxxQ0FBOEQ7QUFTOUQsTUFBYSxjQUFlLFNBQVEsS0FBSztJQUNYO0lBQTVCLFlBQTRCLFNBQTZCO1FBQ3ZELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRFgsY0FBUyxHQUFULFNBQVMsQ0FBb0I7SUFFekQsQ0FBQztJQUVNLEtBQUs7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEUsU0FBUyxPQUFPLENBQUMsU0FBNkI7WUFDNUMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBWkQsd0NBWUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFDQztJQUE0QztJQUF4RSxZQUE0QixLQUEwQixFQUFrQixpQkFBeUI7UUFBckUsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFBa0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFRO0lBQ2pHLENBQUM7SUFFTSxNQUFNO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFB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QU0sU0FBUyxHQUFHLEtBQUssRUFBRSxPQUFxQixFQUFFLEVBQUU7UUFDaEQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVUsRUFBRSxDQUFDLENBQUM7UUFDdkYsTUFBTSxRQUFRLEdBQUcsSUFBQSwyQkFBb0IsRUFBQyxxQkFBcUIsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLENBQUM7UUFDbEYsT0FBTztZQUNMLFdBQVc7WUFDWCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVU7WUFDN0IsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDLENBQUM7SUFFRix3RUFBd0U7SUFDeEUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsUUFBd0I7SUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSwyQkFBaUIsRUFBRSxDQUFDO0lBQ3ZDLElBQUEseUNBQWdCLEVBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFnQix1QkFBdUIsQ0FBQyxLQUE2QjtJQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFJLDJCQUFpQixFQUFFLENBQUM7SUFDdkMsSUFBQSw2Q0FBb0IsRUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVHlwZWRNYXBwaW5nIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQge1xuICBmb3JtYXRBbWJpZ3VvdXNNYXBwaW5ncyBhcyBmbXRBbWJpZ3VvdXNNYXBwaW5ncyxcbiAgZm9ybWF0VHlwZWRNYXBwaW5ncyBhcyBmbXRUeXBlZE1hcHBpbmdzLFxufSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB0eXBlIHsgU3RhY2tTdW1tYXJ5IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IGRlc2VyaWFsaXplU3RydWN0dXJlIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IFNka1Byb3ZpZGVyIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgeyBNb2RlIH0gZnJvbSAnLi4vcGx1Z2luJztcbmltcG9ydCB7IFN0cmluZ1dyaXRlU3RyZWFtIH0gZnJvbSAnLi4vc3RyZWFtcyc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2sgfSBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IGNvbXB1dGVSZXNvdXJjZURpZ2VzdHMsIGhhc2hPYmplY3QgfSBmcm9tICcuL2RpZ2VzdCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNldCBvZiBwb3NzaWJsZSBtb3ZlbWVudHMgb2YgYSByZXNvdXJjZSBmcm9tIG9uZSBsb2NhdGlvblxuICogdG8gYW5vdGhlci4gSW4gdGhlIGlkZWFsIGNhc2UsIHRoZXJlIGlzIG9ubHkgb25lIHNvdXJjZSBhbmQgb25seSBvbmVcbiAqIGRlc3RpbmF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBSZXNvdXJjZU1vdmVtZW50ID0gW1Jlc291cmNlTG9jYXRpb25bXSwgUmVzb3VyY2VMb2NhdGlvbltdXTtcblxuZXhwb3J0IGNsYXNzIEFtYmlndWl0eUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbW92ZW1lbnRzOiBSZXNvdXJjZU1vdmVtZW50W10pIHtcbiAgICBzdXBlcignQW1iaWd1b3VzIHJlc291cmNlIG1hcHBpbmdzJyk7XG4gIH1cblxuICBwdWJsaWMgcGF0aHMoKTogW3N0cmluZ1tdLCBzdHJpbmdbXV1bXSB7XG4gICAgcmV0dXJuIHRoaXMubW92ZW1lbnRzLm1hcCgoW2EsIGJdKSA9PiBbY29udmVydChhKSwgY29udmVydChiKV0pO1xuXG4gICAgZnVuY3Rpb24gY29udmVydChsb2NhdGlvbnM6IFJlc291cmNlTG9jYXRpb25bXSk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiBsb2NhdGlvbnMubWFwKChsKSA9PiBsLnRvUGF0aCgpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1pcnJvcnMgdGhlIGBSZXNvdXJjZUxvY2F0aW9uYCBpbnRlcmZhY2UgZnJvbSBDbG91ZEZvcm1hdGlvbixcbiAqIGJ1dCBpcyByaWNoZXIsIHNpbmNlIGl0IGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgc3RhY2sgb2JqZWN0LCByYXRoZXIgdGhhblxuICogbWVyZWx5IHRoZSBzdGFjayBuYW1lLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBzdGFjazogQ2xvdWRGb3JtYXRpb25TdGFjaywgcHVibGljIHJlYWRvbmx5IGxvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgfVxuXG4gIHB1YmxpYyB0b1BhdGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFjayA9IHRoaXMuc3RhY2s7XG4gICAgY29uc3QgcmVzb3VyY2UgPSBzdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXM/Llt0aGlzLmxvZ2ljYWxSZXNvdXJjZUlkXTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNvdXJjZT8uTWV0YWRhdGE/LlsnYXdzOmNkazpwYXRoJ107XG5cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHBhdGggaXMgbm90IGF2YWlsYWJsZSwgd2UgY2FuIHVzZSBzdGFjayBuYW1lIGFuZCBsb2dpY2FsIElEXG4gICAgcmV0dXJuIGAke3N0YWNrLnN0YWNrTmFtZX0uJHt0aGlzLmxvZ2ljYWxSZXNvdXJjZUlkfWA7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXM/Llt0aGlzLmxvZ2ljYWxSZXNvdXJjZUlkID8/ICcnXTtcbiAgICByZXR1cm4gcmVzb3VyY2U/LlR5cGUgPz8gJ1Vua25vd24nO1xuICB9XG5cbiAgcHVibGljIGVxdWFsVG8ob3RoZXI6IFJlc291cmNlTG9jYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2dpY2FsUmVzb3VyY2VJZCA9PT0gb3RoZXIubG9naWNhbFJlc291cmNlSWQgJiYgdGhpcy5zdGFjay5zdGFja05hbWUgPT09IG90aGVyLnN0YWNrLnN0YWNrTmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIEEgbWFwcGluZyBiZXR3ZWVuIGEgc291cmNlIGFuZCBhIGRlc3RpbmF0aW9uIGxvY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VNYXBwaW5nIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHNvdXJjZTogUmVzb3VyY2VMb2NhdGlvbiwgcHVibGljIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBSZXNvdXJjZUxvY2F0aW9uKSB7XG4gIH1cblxuICBwdWJsaWMgdG9UeXBlZE1hcHBpbmcoKTogVHlwZWRNYXBwaW5nIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gdGhlIHR5cGUgaXMgdGhlIHNhbWUgaW4gYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLFxuICAgICAgLy8gc28gd2UgY2FuIHVzZSBlaXRoZXIgb25lXG4gICAgICB0eXBlOiB0aGlzLnNvdXJjZS5nZXRUeXBlKCksXG4gICAgICBzb3VyY2VQYXRoOiB0aGlzLnNvdXJjZS50b1BhdGgoKSxcbiAgICAgIGRlc3RpbmF0aW9uUGF0aDogdGhpcy5kZXN0aW5hdGlvbi50b1BhdGgoKSxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdyb3VwQnlLZXk8QT4oZW50cmllczogW3N0cmluZywgQV1bXSk6IFJlY29yZDxzdHJpbmcsIEFbXT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEFbXT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbl0gb2YgZW50cmllcykge1xuICAgIGlmIChoYXNoIGluIHJlc3VsdCkge1xuICAgICAgcmVzdWx0W2hhc2hdLnB1c2gobG9jYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbbG9jYXRpb25dO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvdXJjZU1vdmVtZW50cyhiZWZvcmU6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSwgYWZ0ZXI6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSk6IFJlc291cmNlTW92ZW1lbnRbXSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKFxuICAgIHJlbW92ZVVubW92ZWRSZXNvdXJjZXMoXG4gICAgICB6aXAoZ3JvdXBCeUtleShiZWZvcmUuZmxhdE1hcChyZXNvdXJjZURpZ2VzdHMpKSwgZ3JvdXBCeUtleShhZnRlci5mbGF0TWFwKHJlc291cmNlRGlnZXN0cykpKSxcbiAgICApLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYW1iaWd1b3VzTW92ZW1lbnRzKG1vdmVtZW50czogUmVzb3VyY2VNb3ZlbWVudFtdKSB7XG4gIC8vIEEgbW92ZW1lbnQgaXMgY29uc2lkZXJlZCBhbWJpZ3VvdXMgaWYgdGhlc2UgdHdvIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAgLy8gIDEuIEJvdGggc2lkZXMgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCAob3RoZXJ3aXNlLCBpdCdzIGp1c3QgYWRkaXRpb24gb3IgZGVsZXRpb24pXG4gIC8vICAyLiBBdCBsZWFzdCBvbmUgc2lkZSBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50XG4gIHJldHVybiBtb3ZlbWVudHNcbiAgICAuZmlsdGVyKChbcHJlLCBwb3N0XSkgPT4gcHJlLmxlbmd0aCA+IDAgJiYgcG9zdC5sZW5ndGggPiAwKVxuICAgIC5maWx0ZXIoKFtwcmUsIHBvc3RdKSA9PiBwcmUubGVuZ3RoID4gMSB8fCBwb3N0Lmxlbmd0aCA+IDEpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGlzdCBvZiB1bmFtYmlndW91cyByZXNvdXJjZSBtb3ZlbWVudHMgaW50byBhIGxpc3Qgb2YgcmVzb3VyY2UgbWFwcGluZ3MuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb3VyY2VNYXBwaW5ncyhtb3ZlbWVudHM6IFJlc291cmNlTW92ZW1lbnRbXSwgc3RhY2tzPzogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogUmVzb3VyY2VNYXBwaW5nW10ge1xuICBjb25zdCBwcmVkaWNhdGUgPSBzdGFja3MgPT0gbnVsbFxuICAgID8gKCkgPT4gdHJ1ZVxuICAgIDogKG06IFJlc291cmNlTWFwcGluZykgPT4ge1xuICAgICAgLy8gQW55IG1vdmVtZW50IHRoYXQgaW52b2x2ZXMgb25lIG9mIHRoZSBzZWxlY3RlZCBzdGFja3MgKGVpdGhlciBtb3ZpbmcgZnJvbSBvciB0bylcbiAgICAgIC8vIGlzIGNvbnNpZGVyZWQgYSBjYW5kaWRhdGUgZm9yIHJlZmFjdG9yaW5nLlxuICAgICAgY29uc3Qgc3RhY2tOYW1lcyA9IFttLnNvdXJjZS5zdGFjay5zdGFja05hbWUsIG0uZGVzdGluYXRpb24uc3RhY2suc3RhY2tOYW1lXTtcbiAgICAgIHJldHVybiBzdGFja3Muc29tZSgoc3RhY2spID0+IHN0YWNrTmFtZXMuaW5jbHVkZXMoc3RhY2suc3RhY2tOYW1lKSk7XG4gICAgfTtcblxuICByZXR1cm4gbW92ZW1lbnRzXG4gICAgLmZpbHRlcigoW3ByZSwgcG9zdF0pID0+IHByZS5sZW5ndGggPT09IDEgJiYgcG9zdC5sZW5ndGggPT09IDEgJiYgIXByZVswXS5lcXVhbFRvKHBvc3RbMF0pKVxuICAgIC5tYXAoKFtwcmUsIHBvc3RdKSA9PiBuZXcgUmVzb3VyY2VNYXBwaW5nKHByZVswXSwgcG9zdFswXSkpXG4gICAgLmZpbHRlcihwcmVkaWNhdGUpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbm1vdmVkUmVzb3VyY2VzKFxuICBtOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50Pixcbik6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW92ZW1lbnQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50PiA9IHt9O1xuICBmb3IgKGNvbnN0IFtoYXNoLCBbYmVmb3JlLCBhZnRlcl1dIG9mIE9iamVjdC5lbnRyaWVzKG0pKSB7XG4gICAgY29uc3QgY29tbW9uID0gYmVmb3JlLmZpbHRlcigoYikgPT4gYWZ0ZXIuc29tZSgoYSkgPT4gYS5lcXVhbFRvKGIpKSk7XG4gICAgcmVzdWx0W2hhc2hdID0gW1xuICAgICAgYmVmb3JlLmZpbHRlcigoYikgPT4gIWNvbW1vbi5zb21lKChjKSA9PiBiLmVxdWFsVG8oYykpKSxcbiAgICAgIGFmdGVyLmZpbHRlcigoYSkgPT4gIWNvbW1vbi5zb21lKChjKSA9PiBhLmVxdWFsVG8oYykpKSxcbiAgICBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGb3IgZWFjaCBoYXNoLCBpZGVudGlmeWluZyBhIHNpbmdsZSByZXNvdXJjZSwgemlwIHRoZSB0d28gbGlzdHMgb2YgbG9jYXRpb25zLFxuICogcHJvZHVjaW5nIGEgcmVzb3VyY2UgbW92ZW1lbnRcbiAqL1xuZnVuY3Rpb24gemlwKFxuICBtMTogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VMb2NhdGlvbltdPixcbiAgbTI6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTG9jYXRpb25bXT4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VNb3ZlbWVudD4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKG0xKSkge1xuICAgIGlmIChoYXNoIGluIG0yKSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbbG9jYXRpb25zLCBtMltoYXNoXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtoYXNoXSA9IFtsb2NhdGlvbnMsIFtdXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKG0yKSkge1xuICAgIGlmICghKGhhc2ggaW4gbTEpKSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbW10sIGxvY2F0aW9uc107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhIGxpc3Qgb2YgcGFpcnMgW2RpZ2VzdCwgbG9jYXRpb25dIGZvciBlYWNoIHJlc291cmNlIGluIHRoZSBzdGFjay5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VEaWdlc3RzKHN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrKTogW3N0cmluZywgUmVzb3VyY2VMb2NhdGlvbl1bXSB7XG4gIGNvbnN0IGRpZ2VzdHMgPSBjb21wdXRlUmVzb3VyY2VEaWdlc3RzKHN0YWNrLnRlbXBsYXRlKTtcblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZGlnZXN0cykubWFwKChbbG9naWNhbElkLCBkaWdlc3RdKSA9PiB7XG4gICAgY29uc3QgbG9jYXRpb246IFJlc291cmNlTG9jYXRpb24gPSBuZXcgUmVzb3VyY2VMb2NhdGlvbihzdGFjaywgbG9naWNhbElkKTtcbiAgICByZXR1cm4gW2RpZ2VzdCwgbG9jYXRpb25dO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0aGUgZGVwbG95ZWQgc3RhdGUgdG8gdGhlIGNsb3VkIGFzc2VtYmx5IHN0YXRlLCBhbmQgZmluZHMgYWxsIHJlc291cmNlc1xuICogdGhhdCB3ZXJlIG1vdmVkIGZyb20gb25lIGxvY2F0aW9uIChzdGFjayArIGxvZ2ljYWwgSUQpIHRvIGFub3RoZXIuIFRoZSBjb21wYXJpc29uXG4gKiBpcyBkb25lIHBlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRSZXNvdXJjZU1vdmVtZW50cyhcbiAgc3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10sXG4gIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcixcbik6IFByb21pc2U8UmVzb3VyY2VNb3ZlbWVudFtdPiB7XG4gIGNvbnN0IHN0YWNrR3JvdXBzOiBNYXA8c3RyaW5nLCBbQ2xvdWRGb3JtYXRpb25TdGFja1tdLCBDbG91ZEZvcm1hdGlvblN0YWNrW11dPiA9IG5ldyBNYXAoKTtcblxuICAvLyBHcm91cCBzdGFja3MgYnkgZW52aXJvbm1lbnRcbiAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHN0YWNrLmVudmlyb25tZW50O1xuICAgIGNvbnN0IGtleSA9IGhhc2hPYmplY3QoZW52aXJvbm1lbnQpO1xuICAgIGlmIChzdGFja0dyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgc3RhY2tHcm91cHMuZ2V0KGtleSkhWzFdLnB1c2goc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgZmlyc3QgdGltZSB3ZSBzZWUgYW4gZW52aXJvbm1lbnQsIHdlIG5lZWQgdG8gZmV0Y2ggYWxsIHN0YWNrcyBkZXBsb3llZCB0byBpdC5cbiAgICAgIGNvbnN0IGJlZm9yZSA9IGF3YWl0IGdldERlcGxveWVkU3RhY2tzKHNka1Byb3ZpZGVyLCBlbnZpcm9ubWVudCk7XG4gICAgICBzdGFja0dyb3Vwcy5zZXQoa2V5LCBbYmVmb3JlLCBbc3RhY2tdXSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBSZXNvdXJjZU1vdmVtZW50W10gPSBbXTtcbiAgZm9yIChjb25zdCBbXywgW2JlZm9yZSwgYWZ0ZXJdXSBvZiBzdGFja0dyb3Vwcykge1xuICAgIHJlc3VsdC5wdXNoKC4uLnJlc291cmNlTW92ZW1lbnRzKGJlZm9yZSwgYWZ0ZXIpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXREZXBsb3llZFN0YWNrcyhcbiAgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyLFxuICBlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQsXG4pOiBQcm9taXNlPENsb3VkRm9ybWF0aW9uU3RhY2tbXT4ge1xuICBjb25zdCBjZm4gPSAoYXdhaXQgc2RrUHJvdmlkZXIuZm9yRW52aXJvbm1lbnQoZW52aXJvbm1lbnQsIE1vZGUuRm9yUmVhZGluZykpLnNkay5jbG91ZEZvcm1hdGlvbigpO1xuXG4gIGNvbnN0IHN1bW1hcmllcyA9IGF3YWl0IGNmbi5wYWdpbmF0ZWRMaXN0U3RhY2tzKHtcbiAgICBTdGFja1N0YXR1c0ZpbHRlcjogW1xuICAgICAgJ0NSRUFURV9DT01QTEVURScsXG4gICAgICAnVVBEQVRFX0NPTVBMRVRFJyxcbiAgICAgICdVUERBVEVfUk9MTEJBQ0tfQ09NUExFVEUnLFxuICAgICAgJ0lNUE9SVF9DT01QTEVURScsXG4gICAgICAnUk9MTEJBQ0tfQ09NUExFVEUnLFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZSA9IGFzeW5jIChzdW1tYXJ5OiBTdGFja1N1bW1hcnkpID0+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZUNvbW1hbmRPdXRwdXQgPSBhd2FpdCBjZm4uZ2V0VGVtcGxhdGUoeyBTdGFja05hbWU6IHN1bW1hcnkuU3RhY2tOYW1lISB9KTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRlc2VyaWFsaXplU3RydWN0dXJlKHRlbXBsYXRlQ29tbWFuZE91dHB1dC5UZW1wbGF0ZUJvZHkgPz8gJ3t9Jyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudmlyb25tZW50LFxuICAgICAgc3RhY2tOYW1lOiBzdW1tYXJ5LlN0YWNrTmFtZSEsXG4gICAgICB0ZW1wbGF0ZSxcbiAgICB9O1xuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICByZXR1cm4gUHJvbWlzZS5hbGwoc3VtbWFyaWVzLm1hcChub3JtYWxpemUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFR5cGVkTWFwcGluZ3MobWFwcGluZ3M6IFR5cGVkTWFwcGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmluZ1dyaXRlU3RyZWFtKCk7XG4gIGZtdFR5cGVkTWFwcGluZ3Moc3RyZWFtLCBtYXBwaW5ncyk7XG4gIHJldHVybiBzdHJlYW0udG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEFtYmlndW91c01hcHBpbmdzKHBhdGhzOiBbc3RyaW5nW10sIHN0cmluZ1tdXVtdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmluZ1dyaXRlU3RyZWFtKCk7XG4gIGZtdEFtYmlndW91c01hcHBpbmdzKHN0cmVhbSwgcGF0aHMpO1xuICByZXR1cm4gc3RyZWFtLnRvU3RyaW5nKCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated
|
|
3
|
+
*/
|
|
4
|
+
export declare enum RequireApproval {
|
|
5
|
+
/**
|
|
6
|
+
* Never require any security approvals
|
|
7
|
+
*/
|
|
8
|
+
NEVER = "never",
|
|
9
|
+
/**
|
|
10
|
+
* Any security changes require an approval
|
|
11
|
+
*/
|
|
12
|
+
ANY_CHANGE = "any-change",
|
|
13
|
+
/**
|
|
14
|
+
* Require approval only for changes that are access broadening
|
|
15
|
+
*/
|
|
16
|
+
BROADENING = "broadening"
|
|
17
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequireApproval = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated
|
|
6
|
+
*/
|
|
7
|
+
var RequireApproval;
|
|
8
|
+
(function (RequireApproval) {
|
|
9
|
+
/**
|
|
10
|
+
* Never require any security approvals
|
|
11
|
+
*/
|
|
12
|
+
RequireApproval["NEVER"] = "never";
|
|
13
|
+
/**
|
|
14
|
+
* Any security changes require an approval
|
|
15
|
+
*/
|
|
16
|
+
RequireApproval["ANY_CHANGE"] = "any-change";
|
|
17
|
+
/**
|
|
18
|
+
* Require approval only for changes that are access broadening
|
|
19
|
+
*/
|
|
20
|
+
RequireApproval["BROADENING"] = "broadening";
|
|
21
|
+
})(RequireApproval || (exports.RequireApproval = RequireApproval = {}));
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZS1hcHByb3ZhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlcXVpcmUtYXBwcm92YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLGVBYVg7QUFiRCxXQUFZLGVBQWU7SUFDekI7O09BRUc7SUFDSCxrQ0FBZSxDQUFBO0lBQ2Y7O09BRUc7SUFDSCw0Q0FBeUIsQ0FBQTtJQUN6Qjs7T0FFRztJQUNILDRDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFiVyxlQUFlLCtCQUFmLGVBQWUsUUFhMUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBlbnVtIFJlcXVpcmVBcHByb3ZhbCB7XG4gIC8qKlxuICAgKiBOZXZlciByZXF1aXJlIGFueSBzZWN1cml0eSBhcHByb3ZhbHNcbiAgICovXG4gIE5FVkVSID0gJ25ldmVyJyxcbiAgLyoqXG4gICAqIEFueSBzZWN1cml0eSBjaGFuZ2VzIHJlcXVpcmUgYW4gYXBwcm92YWxcbiAgICovXG4gIEFOWV9DSEFOR0UgPSAnYW55LWNoYW5nZScsXG4gIC8qKlxuICAgKiBSZXF1aXJlIGFwcHJvdmFsIG9ubHkgZm9yIGNoYW5nZXMgdGhhdCBhcmUgYWNjZXNzIGJyb2FkZW5pbmdcbiAgICovXG4gIEJST0FERU5JTkcgPSAnYnJvYWRlbmluZycsXG59XG4iXX0=
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import type { ResourceDifference } from '@aws-cdk/cloudformation-diff';
|
|
2
|
+
import type * as cxapi from '@aws-cdk/cx-api';
|
|
3
|
+
import type { ResourceIdentifierSummary, ResourceToImport } from '@aws-sdk/client-cloudformation';
|
|
4
|
+
import type { DeploymentMethod, Deployments } from '../deployments';
|
|
5
|
+
import { type IoHelper } from '../io/private';
|
|
6
|
+
import type { Tag } from '../tags';
|
|
7
|
+
export type ResourcesToImport = ResourceToImport[];
|
|
8
|
+
export type ResourceIdentifierSummaries = ResourceIdentifierSummary[];
|
|
9
|
+
export interface ResourceImporterProps {
|
|
10
|
+
deployments: Deployments;
|
|
11
|
+
ioHelper: IoHelper;
|
|
12
|
+
}
|
|
13
|
+
export interface ImportDeploymentOptions {
|
|
14
|
+
/**
|
|
15
|
+
* Role to pass to CloudFormation for deployment
|
|
16
|
+
*
|
|
17
|
+
* @default - Default stack role
|
|
18
|
+
*/
|
|
19
|
+
readonly roleArn?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Deployment method
|
|
22
|
+
*
|
|
23
|
+
* @default - Change set with default options
|
|
24
|
+
*/
|
|
25
|
+
readonly deploymentMethod?: DeploymentMethod;
|
|
26
|
+
/**
|
|
27
|
+
* Stack tags (pass through to CloudFormation)
|
|
28
|
+
*
|
|
29
|
+
* @default - No tags
|
|
30
|
+
*/
|
|
31
|
+
readonly tags?: Tag[];
|
|
32
|
+
/**
|
|
33
|
+
* Use previous values for unspecified parameters
|
|
34
|
+
*
|
|
35
|
+
* If not set, all parameters must be specified for every deployment.
|
|
36
|
+
*
|
|
37
|
+
* @default true
|
|
38
|
+
*/
|
|
39
|
+
readonly usePreviousParameters?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Rollback failed deployments
|
|
42
|
+
*
|
|
43
|
+
* @default true
|
|
44
|
+
*/
|
|
45
|
+
readonly rollback?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Set of parameters that uniquely identify a physical resource of a given type
|
|
49
|
+
* for the import operation, example:
|
|
50
|
+
*
|
|
51
|
+
* ```
|
|
52
|
+
* {
|
|
53
|
+
* "AWS::S3::Bucket": [["BucketName"]],
|
|
54
|
+
* "AWS::DynamoDB::GlobalTable": [["TableName"], ["TableArn"], ["TableStreamArn"]],
|
|
55
|
+
* "AWS::Route53::KeySigningKey": [["HostedZoneId", "Name"]],
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export type ResourceIdentifiers = {
|
|
60
|
+
[resourceType: string]: string[][];
|
|
61
|
+
};
|
|
62
|
+
type ResourceIdentifierProperties = Record<string, string>;
|
|
63
|
+
/**
|
|
64
|
+
* Mapping of CDK resources (L1 constructs) to physical resources to be imported
|
|
65
|
+
* in their place, example:
|
|
66
|
+
*
|
|
67
|
+
* ```
|
|
68
|
+
* {
|
|
69
|
+
* "MyStack/MyS3Bucket/Resource": {
|
|
70
|
+
* "BucketName": "my-manually-created-s3-bucket"
|
|
71
|
+
* },
|
|
72
|
+
* "MyStack/MyVpc/Resource": {
|
|
73
|
+
* "VpcId": "vpc-123456789"
|
|
74
|
+
* }
|
|
75
|
+
* }
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
type ResourceMap = {
|
|
79
|
+
[logicalResource: string]: ResourceIdentifierProperties;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Resource importing utility class
|
|
83
|
+
*
|
|
84
|
+
* - Determines the resources added to a template (compared to the deployed version)
|
|
85
|
+
* - Look up the identification information
|
|
86
|
+
* - Load them from a file, or
|
|
87
|
+
* - Ask the user, based on information supplied to us by CloudFormation's GetTemplateSummary
|
|
88
|
+
* - Translate the input to a structure expected by CloudFormation, update the template to add the
|
|
89
|
+
* importable resources, then run an IMPORT changeset.
|
|
90
|
+
*/
|
|
91
|
+
export declare class ResourceImporter {
|
|
92
|
+
private _currentTemplate;
|
|
93
|
+
private readonly stack;
|
|
94
|
+
private readonly cfn;
|
|
95
|
+
private readonly ioHelper;
|
|
96
|
+
constructor(stack: cxapi.CloudFormationStackArtifact, props: ResourceImporterProps);
|
|
97
|
+
/**
|
|
98
|
+
* Ask the user for resources to import
|
|
99
|
+
*/
|
|
100
|
+
askForResourceIdentifiers(available: ImportableResource[]): Promise<ImportMap>;
|
|
101
|
+
/**
|
|
102
|
+
* Load the resources to import from a file
|
|
103
|
+
*/
|
|
104
|
+
loadResourceIdentifiers(available: ImportableResource[], filename: string): Promise<ImportMap>;
|
|
105
|
+
/**
|
|
106
|
+
* Based on the provided resource mapping, prepare CFN structures for import (template,
|
|
107
|
+
* ResourcesToImport structure) and perform the import operation (CloudFormation deployment)
|
|
108
|
+
*
|
|
109
|
+
* @param importMap Mapping from CDK construct tree path to physical resource import identifiers
|
|
110
|
+
* @param options Options to pass to CloudFormation deploy operation
|
|
111
|
+
*/
|
|
112
|
+
importResourcesFromMap(importMap: ImportMap, options?: ImportDeploymentOptions): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Based on the app and resources file generated by cdk migrate. Removes all items from the template that
|
|
115
|
+
* cannot be included in an import change-set for new stacks and performs the import operation,
|
|
116
|
+
* creating the new stack.
|
|
117
|
+
*
|
|
118
|
+
* @param resourcesToImport The mapping created by cdk migrate
|
|
119
|
+
* @param options Options to pass to CloudFormation deploy operation
|
|
120
|
+
*/
|
|
121
|
+
importResourcesFromMigrate(resourcesToImport: ResourcesToImport, options?: ImportDeploymentOptions): Promise<void>;
|
|
122
|
+
private importResources;
|
|
123
|
+
/**
|
|
124
|
+
* Perform a diff between the currently running and the new template, ensure that it is valid
|
|
125
|
+
* for importing and return a list of resources that are being added in the new version
|
|
126
|
+
*
|
|
127
|
+
* @return mapping logicalResourceId -> resourceDifference
|
|
128
|
+
*/
|
|
129
|
+
discoverImportableResources(allowNonAdditions?: boolean): Promise<DiscoverImportableResourcesResult>;
|
|
130
|
+
/**
|
|
131
|
+
* Resolves the environment of a stack.
|
|
132
|
+
*/
|
|
133
|
+
resolveEnvironment(): Promise<cxapi.Environment>;
|
|
134
|
+
/**
|
|
135
|
+
* Get currently deployed template of the given stack (SINGLETON)
|
|
136
|
+
*
|
|
137
|
+
* @returns Currently deployed CloudFormation template
|
|
138
|
+
*/
|
|
139
|
+
private currentTemplate;
|
|
140
|
+
/**
|
|
141
|
+
* Return the current template, with the given resources added to it
|
|
142
|
+
*/
|
|
143
|
+
private currentTemplateWithAdditions;
|
|
144
|
+
/**
|
|
145
|
+
* Get a list of import identifiers for all resource types used in the given
|
|
146
|
+
* template that do support the import operation (SINGLETON)
|
|
147
|
+
*
|
|
148
|
+
* @returns a mapping from a resource type to a list of property names that together identify the resource for import
|
|
149
|
+
*/
|
|
150
|
+
private resourceIdentifiers;
|
|
151
|
+
/**
|
|
152
|
+
* Ask for the importable identifier for the given resource
|
|
153
|
+
*
|
|
154
|
+
* There may be more than one identifier under which a resource can be imported. The `import`
|
|
155
|
+
* operation needs exactly one of them.
|
|
156
|
+
*
|
|
157
|
+
* - If we can get one from the template, we will use one.
|
|
158
|
+
* - Otherwise, we will ask the user for one of them.
|
|
159
|
+
*/
|
|
160
|
+
private askForResourceIdentifier;
|
|
161
|
+
/**
|
|
162
|
+
* Convert the internal "resource mapping" structure to CloudFormation accepted "ResourcesToImport" structure
|
|
163
|
+
*/
|
|
164
|
+
private makeResourcesToImport;
|
|
165
|
+
/**
|
|
166
|
+
* Convert CloudFormation logical resource ID to CDK construct tree path
|
|
167
|
+
*
|
|
168
|
+
* @param logicalId CloudFormation logical ID of the resource (the key in the template's Resources section)
|
|
169
|
+
* @returns Forward-slash separated path of the resource in CDK construct tree, e.g. MyStack/MyBucket/Resource
|
|
170
|
+
*/
|
|
171
|
+
private describeResource;
|
|
172
|
+
/**
|
|
173
|
+
* Removes CDKMetadata and Outputs in the template so that only resources for importing are left.
|
|
174
|
+
* @returns template with import resources only
|
|
175
|
+
*/
|
|
176
|
+
private removeNonImportResources;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Information about a resource in the template that is importable
|
|
180
|
+
*/
|
|
181
|
+
export interface ImportableResource {
|
|
182
|
+
/**
|
|
183
|
+
* The logical ID of the resource
|
|
184
|
+
*/
|
|
185
|
+
readonly logicalId: string;
|
|
186
|
+
/**
|
|
187
|
+
* The resource definition in the new template
|
|
188
|
+
*/
|
|
189
|
+
readonly resourceDefinition: any;
|
|
190
|
+
/**
|
|
191
|
+
* The diff as reported by `cloudformation-diff`.
|
|
192
|
+
*/
|
|
193
|
+
readonly resourceDiff: ResourceDifference;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* The information necessary to execute an import operation
|
|
197
|
+
*/
|
|
198
|
+
export interface ImportMap {
|
|
199
|
+
/**
|
|
200
|
+
* Mapping logical IDs to physical names
|
|
201
|
+
*/
|
|
202
|
+
readonly resourceMap: ResourceMap;
|
|
203
|
+
/**
|
|
204
|
+
* The selection of resources we are actually importing
|
|
205
|
+
*
|
|
206
|
+
* For each of the resources in this list, there is a corresponding entry in
|
|
207
|
+
* the `resourceMap` map.
|
|
208
|
+
*/
|
|
209
|
+
readonly importResources: ImportableResource[];
|
|
210
|
+
}
|
|
211
|
+
export interface DiscoverImportableResourcesResult {
|
|
212
|
+
readonly additions: ImportableResource[];
|
|
213
|
+
readonly hasNonAdditions: boolean;
|
|
214
|
+
}
|
|
215
|
+
export declare function removeNonImportResources(stack: cxapi.CloudFormationStackArtifact): any;
|
|
216
|
+
export {};
|