aws-cdk 2.1007.0 → 3.0.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/THIRD_PARTY_LICENSES +24 -6
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/api/aws-auth.d.ts +1 -0
- package/lib/api/{logs/index.js → aws-auth.js} +2 -3
- package/lib/api/bootstrap.d.ts +1 -0
- package/lib/api/bootstrap.js +18 -0
- package/lib/api/cloud-assembly.d.ts +1 -0
- package/lib/api/cloud-assembly.js +18 -0
- package/lib/api/cloudformation.d.ts +1 -0
- package/lib/api/cloudformation.js +18 -0
- package/lib/api/context.d.ts +1 -40
- package/lib/api/context.js +16 -80
- package/lib/api/deployments.d.ts +1 -0
- package/lib/api/deployments.js +18 -0
- package/lib/api/environment.d.ts +1 -0
- package/lib/api/environment.js +18 -0
- package/lib/api/garbage-collection.d.ts +1 -0
- package/lib/api/garbage-collection.js +18 -0
- package/lib/api/hotswap.d.ts +1 -0
- package/lib/api/hotswap.js +18 -0
- package/lib/api/index.d.ts +5 -1
- package/lib/api/index.js +6 -2
- package/lib/api/logs-monitor.d.ts +1 -0
- package/lib/api/logs-monitor.js +18 -0
- package/lib/api/notices.d.ts +1 -0
- package/lib/api/notices.js +18 -0
- package/lib/api/plugin.d.ts +1 -0
- package/lib/api/{garbage-collection/index.js → plugin.js} +2 -2
- package/lib/api/resource-import.d.ts +1 -0
- package/lib/api/resource-import.js +18 -0
- package/lib/api/rwlock.d.ts +1 -0
- package/lib/api/{resource-import/index.js → rwlock.js} +2 -3
- package/lib/api/settings.d.ts +1 -26
- package/lib/api/settings.js +16 -103
- package/lib/api/stack-events.d.ts +1 -0
- package/lib/api/stack-events.js +18 -0
- package/lib/api/tags.d.ts +1 -9
- package/lib/api/tags.js +16 -8
- package/lib/api/toolkit-info.d.ts +1 -52
- package/lib/api/toolkit-info.js +16 -152
- package/lib/api/tree.d.ts +1 -31
- package/lib/api/tree.js +16 -35
- package/lib/api/work-graph.d.ts +1 -0
- package/lib/api/work-graph.js +18 -0
- package/lib/api-private.d.ts +3 -0
- package/lib/api-private.js +22 -0
- package/lib/cli/cdk-toolkit.d.ts +6 -5
- package/lib/cli/cdk-toolkit.js +74 -44
- package/lib/cli/cli.d.ts +1 -1
- package/lib/cli/cli.js +21 -19
- package/lib/cli/io-host/cli-io-host.js +2 -2
- package/lib/cli/pretty-print-error.js +3 -1
- package/lib/cli/util/npm.d.ts +4 -1
- package/lib/cli/util/npm.js +25 -13
- package/lib/cli/version.d.ts +1 -1
- package/lib/cli/version.js +21 -25
- package/lib/commands/context.js +3 -2
- package/lib/commands/init/init.js +3 -2
- package/lib/commands/list-stacks.js +4 -4
- package/lib/context-providers/ami.d.ts +1 -13
- package/lib/context-providers/ami.js +16 -48
- package/lib/context-providers/availability-zones.d.ts +1 -13
- package/lib/context-providers/availability-zones.js +16 -25
- package/lib/context-providers/cc-api-provider.d.ts +1 -30
- package/lib/context-providers/cc-api-provider.js +16 -142
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +1 -13
- package/lib/context-providers/endpoint-service-availability-zones.js +16 -31
- package/lib/context-providers/hosted-zones.d.ts +1 -12
- package/lib/context-providers/hosted-zones.js +16 -65
- package/lib/context-providers/index.d.ts +1 -44
- package/lib/context-providers/index.js +15 -126
- package/lib/context-providers/keys.d.ts +1 -13
- package/lib/context-providers/keys.js +16 -50
- package/lib/context-providers/load-balancers.d.ts +1 -20
- package/lib/context-providers/load-balancers.js +16 -154
- package/lib/context-providers/security-groups.d.ts +1 -9
- package/lib/context-providers/security-groups.js +16 -66
- package/lib/context-providers/ssm-parameters.d.ts +1 -25
- package/lib/context-providers/ssm-parameters.js +16 -57
- package/lib/context-providers/vpcs.d.ts +1 -13
- package/lib/context-providers/vpcs.js +16 -285
- package/lib/cxapp/cloud-assembly.d.ts +79 -0
- package/lib/cxapp/cloud-assembly.js +108 -0
- package/lib/{api/cxapp → cxapp}/cloud-executable.d.ts +6 -4
- package/lib/cxapp/cloud-executable.js +92 -0
- package/lib/{api/cxapp → cxapp}/environments.d.ts +1 -2
- package/lib/{api/cxapp → cxapp}/environments.js +2 -2
- package/lib/cxapp/exec.d.ts +14 -0
- package/lib/cxapp/exec.js +157 -0
- package/lib/cxapp/index.d.ts +4 -0
- package/lib/{api/bootstrap → cxapp}/index.js +5 -3
- package/lib/index.js +133605 -124560
- package/lib/init-templates/.init-version.json +1 -1
- package/lib/init-templates/.recommended-feature-flags.json +2 -1
- package/lib/legacy-aws-auth.d.ts +74 -0
- package/lib/legacy-aws-auth.js +40 -0
- package/lib/legacy-exports-source.d.ts +13 -18
- package/lib/legacy-exports-source.js +42 -49
- package/lib/legacy-exports.d.ts +3 -6
- package/lib/legacy-exports.js +5 -5
- package/lib/legacy-types.d.ts +31 -0
- package/lib/legacy-types.js +3 -0
- package/package.json +8 -7
- package/lib/api/aws-auth/account-cache.d.ts +0 -36
- package/lib/api/aws-auth/account-cache.js +0 -99
- package/lib/api/aws-auth/awscli-compatible.d.ts +0 -42
- package/lib/api/aws-auth/awscli-compatible.js +0 -263
- package/lib/api/aws-auth/cached.d.ts +0 -11
- package/lib/api/aws-auth/cached.js +0 -26
- package/lib/api/aws-auth/credential-plugins.d.ts +0 -36
- package/lib/api/aws-auth/credential-plugins.js +0 -152
- package/lib/api/aws-auth/index.d.ts +0 -3
- package/lib/api/aws-auth/index.js +0 -20
- package/lib/api/aws-auth/provider-caching.d.ts +0 -13
- package/lib/api/aws-auth/provider-caching.js +0 -24
- package/lib/api/aws-auth/sdk-logger.d.ts +0 -69
- package/lib/api/aws-auth/sdk-logger.js +0 -124
- package/lib/api/aws-auth/sdk-provider.d.ts +0 -207
- package/lib/api/aws-auth/sdk-provider.js +0 -357
- package/lib/api/aws-auth/sdk.d.ts +0 -229
- package/lib/api/aws-auth/sdk.js +0 -373
- package/lib/api/aws-auth/tracing.d.ts +0 -11
- package/lib/api/aws-auth/tracing.js +0 -60
- package/lib/api/aws-auth/user-agent.d.ts +0 -7
- package/lib/api/aws-auth/user-agent.js +0 -20
- package/lib/api/aws-auth/util.d.ts +0 -6
- package/lib/api/aws-auth/util.js +0 -23
- package/lib/api/bootstrap/bootstrap-environment.d.ts +0 -35
- package/lib/api/bootstrap/bootstrap-environment.js +0 -321
- package/lib/api/bootstrap/bootstrap-props.d.ts +0 -130
- package/lib/api/bootstrap/bootstrap-props.js +0 -14
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +0 -39
- package/lib/api/bootstrap/deploy-bootstrap.js +0 -141
- package/lib/api/bootstrap/index.d.ts +0 -2
- package/lib/api/bootstrap/legacy-template.d.ts +0 -2
- package/lib/api/bootstrap/legacy-template.js +0 -82
- package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +0 -85
- package/lib/api/cloudformation/evaluate-cloudformation-template.js +0 -440
- package/lib/api/cloudformation/index.d.ts +0 -4
- package/lib/api/cloudformation/index.js +0 -21
- package/lib/api/cloudformation/nested-stack-helpers.d.ts +0 -19
- package/lib/api/cloudformation/nested-stack-helpers.js +0 -86
- package/lib/api/cloudformation/stack-helpers.d.ts +0 -88
- package/lib/api/cloudformation/stack-helpers.js +0 -158
- package/lib/api/cloudformation/template-body-parameter.d.ts +0 -22
- package/lib/api/cloudformation/template-body-parameter.js +0 -104
- package/lib/api/cxapp/cloud-assembly.d.ts +0 -137
- package/lib/api/cxapp/cloud-assembly.js +0 -305
- package/lib/api/cxapp/cloud-executable.js +0 -89
- package/lib/api/cxapp/exec.d.ts +0 -57
- package/lib/api/cxapp/exec.js +0 -279
- package/lib/api/deployments/asset-manifest-builder.d.ts +0 -8
- package/lib/api/deployments/asset-manifest-builder.js +0 -35
- package/lib/api/deployments/asset-publishing.d.ts +0 -60
- package/lib/api/deployments/asset-publishing.js +0 -141
- package/lib/api/deployments/assets.d.ts +0 -11
- package/lib/api/deployments/assets.js +0 -109
- package/lib/api/deployments/cfn-api.d.ts +0 -138
- package/lib/api/deployments/cfn-api.js +0 -438
- package/lib/api/deployments/checks.d.ts +0 -9
- package/lib/api/deployments/checks.js +0 -72
- package/lib/api/deployments/deploy-stack.d.ts +0 -155
- package/lib/api/deployments/deploy-stack.js +0 -478
- package/lib/api/deployments/deployment-method.d.ts +0 -24
- package/lib/api/deployments/deployment-method.js +0 -3
- package/lib/api/deployments/deployment-result.d.ts +0 -21
- package/lib/api/deployments/deployment-result.js +0 -10
- package/lib/api/deployments/deployments.d.ts +0 -296
- package/lib/api/deployments/deployments.js +0 -331
- package/lib/api/deployments/hotswap-deployments.d.ts +0 -17
- package/lib/api/deployments/hotswap-deployments.js +0 -441
- package/lib/api/deployments/index.d.ts +0 -5
- package/lib/api/deployments/index.js +0 -22
- package/lib/api/environment/environment-access.d.ts +0 -140
- package/lib/api/environment/environment-access.js +0 -202
- package/lib/api/environment/environment-resources.d.ts +0 -75
- package/lib/api/environment/environment-resources.js +0 -207
- package/lib/api/environment/index.d.ts +0 -3
- package/lib/api/environment/index.js +0 -20
- package/lib/api/environment/placeholders.d.ts +0 -10
- package/lib/api/environment/placeholders.js +0 -23
- package/lib/api/garbage-collection/garbage-collector.d.ts +0 -158
- package/lib/api/garbage-collection/garbage-collector.js +0 -599
- package/lib/api/garbage-collection/index.d.ts +0 -1
- package/lib/api/garbage-collection/progress-printer.d.ts +0 -23
- package/lib/api/garbage-collection/progress-printer.js +0 -70
- package/lib/api/garbage-collection/stack-refresh.d.ts +0 -49
- package/lib/api/garbage-collection/stack-refresh.js +0 -151
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +0 -4
- package/lib/api/hotswap/appsync-mapping-templates.js +0 -162
- package/lib/api/hotswap/code-build-projects.d.ts +0 -4
- package/lib/api/hotswap/code-build-projects.js +0 -62
- package/lib/api/hotswap/common.d.ts +0 -89
- package/lib/api/hotswap/common.js +0 -128
- package/lib/api/hotswap/ecs-services.d.ts +0 -4
- package/lib/api/hotswap/ecs-services.js +0 -159
- package/lib/api/hotswap/lambda-functions.d.ts +0 -4
- package/lib/api/hotswap/lambda-functions.js +0 -297
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +0 -5
- package/lib/api/hotswap/s3-bucket-deployments.js +0 -117
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +0 -4
- package/lib/api/hotswap/stepfunctions-state-machines.js +0 -48
- package/lib/api/logs/find-cloudwatch-logs.d.ts +0 -25
- package/lib/api/logs/find-cloudwatch-logs.js +0 -95
- package/lib/api/logs/index.d.ts +0 -2
- package/lib/api/logs/logs-monitor.d.ts +0 -76
- package/lib/api/logs/logs-monitor.js +0 -187
- package/lib/api/plugin/context-provider-plugin.d.ts +0 -6
- package/lib/api/plugin/context-provider-plugin.js +0 -7
- package/lib/api/plugin/index.d.ts +0 -3
- package/lib/api/plugin/index.js +0 -20
- package/lib/api/plugin/mode.d.ts +0 -4
- package/lib/api/plugin/mode.js +0 -9
- package/lib/api/plugin/plugin.d.ts +0 -63
- package/lib/api/plugin/plugin.js +0 -102
- package/lib/api/resource-import/importer.d.ts +0 -215
- package/lib/api/resource-import/importer.js +0 -322
- package/lib/api/resource-import/index.d.ts +0 -2
- package/lib/api/resource-import/migrator.d.ts +0 -26
- package/lib/api/resource-import/migrator.js +0 -71
- package/lib/api/stack-events/index.d.ts +0 -3
- package/lib/api/stack-events/index.js +0 -20
- package/lib/api/stack-events/stack-activity-monitor.d.ts +0 -100
- package/lib/api/stack-events/stack-activity-monitor.js +0 -142
- package/lib/api/stack-events/stack-event-poller.d.ts +0 -69
- package/lib/api/stack-events/stack-event-poller.js +0 -128
- package/lib/api/stack-events/stack-progress-monitor.d.ts +0 -48
- package/lib/api/stack-events/stack-progress-monitor.js +0 -94
- package/lib/api/stack-events/stack-status.d.ts +0 -42
- package/lib/api/stack-events/stack-status.js +0 -88
- package/lib/api/util/rwlock.d.ts +0 -65
- package/lib/api/util/rwlock.js +0 -179
- package/lib/api/work-graph/index.d.ts +0 -3
- package/lib/api/work-graph/index.js +0 -20
- package/lib/api/work-graph/work-graph-builder.d.ts +0 -34
- package/lib/api/work-graph/work-graph-builder.js +0 -168
- package/lib/api/work-graph/work-graph-types.d.ts +0 -50
- package/lib/api/work-graph/work-graph-types.js +0 -13
- package/lib/api/work-graph/work-graph.d.ts +0 -72
- package/lib/api/work-graph/work-graph.js +0 -346
- package/lib/cli/activity-printer/base.d.ts +0 -50
- package/lib/cli/activity-printer/base.js +0 -114
- package/lib/cli/activity-printer/current.d.ts +0 -26
- package/lib/cli/activity-printer/current.js +0 -118
- package/lib/cli/activity-printer/display.d.ts +0 -13
- package/lib/cli/activity-printer/display.js +0 -80
- package/lib/cli/activity-printer/history.d.ts +0 -32
- package/lib/cli/activity-printer/history.js +0 -108
- package/lib/cli/activity-printer/index.d.ts +0 -3
- package/lib/cli/activity-printer/index.js +0 -20
- package/lib/notices.d.ts +0 -203
- package/lib/notices.js +0 -411
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ResourceImporter = exports.removeNonImportResources = void 0;
|
|
4
|
-
const util_1 = require("util");
|
|
5
|
-
const cfnDiff = require("@aws-cdk/cloudformation-diff");
|
|
6
|
-
const chalk = require("chalk");
|
|
7
|
-
const fs = require("fs-extra");
|
|
8
|
-
const promptly = require("promptly");
|
|
9
|
-
const api_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api");
|
|
10
|
-
const private_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private");
|
|
11
|
-
const deployments_1 = require("../deployments");
|
|
12
|
-
var api_2 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api");
|
|
13
|
-
Object.defineProperty(exports, "removeNonImportResources", { enumerable: true, get: function () { return api_2.removeNonImportResources; } });
|
|
14
|
-
/**
|
|
15
|
-
* Resource importing utility class
|
|
16
|
-
*
|
|
17
|
-
* - Determines the resources added to a template (compared to the deployed version)
|
|
18
|
-
* - Look up the identification information
|
|
19
|
-
* - Load them from a file, or
|
|
20
|
-
* - Ask the user, based on information supplied to us by CloudFormation's GetTemplateSummary
|
|
21
|
-
* - Translate the input to a structure expected by CloudFormation, update the template to add the
|
|
22
|
-
* importable resources, then run an IMPORT changeset.
|
|
23
|
-
*/
|
|
24
|
-
class ResourceImporter {
|
|
25
|
-
constructor(stack, props) {
|
|
26
|
-
this.stack = stack;
|
|
27
|
-
this.cfn = props.deployments;
|
|
28
|
-
this.ioHelper = props.ioHelper;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Ask the user for resources to import
|
|
32
|
-
*/
|
|
33
|
-
async askForResourceIdentifiers(available) {
|
|
34
|
-
const ret = { importResources: [], resourceMap: {} };
|
|
35
|
-
const resourceIdentifiers = await this.resourceIdentifiers();
|
|
36
|
-
for (const resource of available) {
|
|
37
|
-
const identifier = await this.askForResourceIdentifier(resourceIdentifiers, resource);
|
|
38
|
-
if (!identifier) {
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
ret.importResources.push(resource);
|
|
42
|
-
ret.resourceMap[resource.logicalId] = identifier;
|
|
43
|
-
}
|
|
44
|
-
return ret;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Load the resources to import from a file
|
|
48
|
-
*/
|
|
49
|
-
async loadResourceIdentifiers(available, filename) {
|
|
50
|
-
const contents = await fs.readJson(filename);
|
|
51
|
-
const ret = { importResources: [], resourceMap: {} };
|
|
52
|
-
for (const resource of available) {
|
|
53
|
-
const descr = this.describeResource(resource.logicalId);
|
|
54
|
-
const idProps = contents[resource.logicalId];
|
|
55
|
-
if (idProps) {
|
|
56
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg((0, util_1.format)('%s: importing using %s', chalk.blue(descr), chalk.blue(fmtdict(idProps)))));
|
|
57
|
-
ret.importResources.push(resource);
|
|
58
|
-
ret.resourceMap[resource.logicalId] = idProps;
|
|
59
|
-
delete contents[resource.logicalId];
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg((0, util_1.format)('%s: skipping', chalk.blue(descr))));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
const unknown = Object.keys(contents);
|
|
66
|
-
if (unknown.length > 0) {
|
|
67
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`Unrecognized resource identifiers in mapping file: ${unknown.join(', ')}`));
|
|
68
|
-
}
|
|
69
|
-
return ret;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Based on the provided resource mapping, prepare CFN structures for import (template,
|
|
73
|
-
* ResourcesToImport structure) and perform the import operation (CloudFormation deployment)
|
|
74
|
-
*
|
|
75
|
-
* @param importMap Mapping from CDK construct tree path to physical resource import identifiers
|
|
76
|
-
* @param options Options to pass to CloudFormation deploy operation
|
|
77
|
-
*/
|
|
78
|
-
async importResourcesFromMap(importMap, options = {}) {
|
|
79
|
-
const resourcesToImport = await this.makeResourcesToImport(importMap);
|
|
80
|
-
const updatedTemplate = await this.currentTemplateWithAdditions(importMap.importResources);
|
|
81
|
-
await this.importResources(updatedTemplate, resourcesToImport, options);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Based on the app and resources file generated by cdk migrate. Removes all items from the template that
|
|
85
|
-
* cannot be included in an import change-set for new stacks and performs the import operation,
|
|
86
|
-
* creating the new stack.
|
|
87
|
-
*
|
|
88
|
-
* @param resourcesToImport The mapping created by cdk migrate
|
|
89
|
-
* @param options Options to pass to CloudFormation deploy operation
|
|
90
|
-
*/
|
|
91
|
-
async importResourcesFromMigrate(resourcesToImport, options = {}) {
|
|
92
|
-
const updatedTemplate = this.removeNonImportResources();
|
|
93
|
-
await this.importResources(updatedTemplate, resourcesToImport, options);
|
|
94
|
-
}
|
|
95
|
-
async importResources(overrideTemplate, resourcesToImport, options) {
|
|
96
|
-
try {
|
|
97
|
-
const result = await this.cfn.deployStack({
|
|
98
|
-
stack: this.stack,
|
|
99
|
-
deployName: this.stack.stackName,
|
|
100
|
-
...options,
|
|
101
|
-
overrideTemplate,
|
|
102
|
-
resourcesToImport,
|
|
103
|
-
});
|
|
104
|
-
(0, deployments_1.assertIsSuccessfulDeployStackResult)(result);
|
|
105
|
-
const message = result.noOp
|
|
106
|
-
? ' ✅ %s (no changes)'
|
|
107
|
-
: ' ✅ %s';
|
|
108
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg('\n' + chalk.green((0, util_1.format)(message, this.stack.displayName))));
|
|
109
|
-
}
|
|
110
|
-
catch (e) {
|
|
111
|
-
await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_E3900.msg((0, util_1.format)('\n ❌ %s failed: %s', chalk.bold(this.stack.displayName), e), { error: e }));
|
|
112
|
-
throw e;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Perform a diff between the currently running and the new template, ensure that it is valid
|
|
117
|
-
* for importing and return a list of resources that are being added in the new version
|
|
118
|
-
*
|
|
119
|
-
* @return mapping logicalResourceId -> resourceDifference
|
|
120
|
-
*/
|
|
121
|
-
async discoverImportableResources(allowNonAdditions = false) {
|
|
122
|
-
const currentTemplate = await this.currentTemplate();
|
|
123
|
-
const diff = cfnDiff.fullDiff(currentTemplate, this.stack.template);
|
|
124
|
-
// Ignore changes to CDKMetadata
|
|
125
|
-
const resourceChanges = Object.entries(diff.resources.changes)
|
|
126
|
-
.filter(([logicalId, _]) => logicalId !== 'CDKMetadata');
|
|
127
|
-
// Split the changes into additions and non-additions. Imports only make sense
|
|
128
|
-
// for newly-added resources.
|
|
129
|
-
const nonAdditions = resourceChanges.filter(([_, dif]) => !dif.isAddition);
|
|
130
|
-
const additions = resourceChanges.filter(([_, dif]) => dif.isAddition);
|
|
131
|
-
if (nonAdditions.length) {
|
|
132
|
-
const offendingResources = nonAdditions.map(([logId, _]) => this.describeResource(logId));
|
|
133
|
-
if (allowNonAdditions) {
|
|
134
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`Ignoring updated/deleted resources (--force): ${offendingResources.join(', ')}`));
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
throw new api_1.ToolkitError('No resource updates or deletes are allowed on import operation. Make sure to resolve pending changes ' +
|
|
138
|
-
`to existing resources, before attempting an import. Updated/deleted resources: ${offendingResources.join(', ')} (--force to override)`);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
// Resources in the new template, that are not present in the current template, are a potential import candidates
|
|
142
|
-
return {
|
|
143
|
-
additions: additions.map(([logicalId, resourceDiff]) => ({
|
|
144
|
-
logicalId,
|
|
145
|
-
resourceDiff,
|
|
146
|
-
resourceDefinition: addDefaultDeletionPolicy(this.stack.template?.Resources?.[logicalId] ?? {}),
|
|
147
|
-
})),
|
|
148
|
-
hasNonAdditions: nonAdditions.length > 0,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Resolves the environment of a stack.
|
|
153
|
-
*/
|
|
154
|
-
async resolveEnvironment() {
|
|
155
|
-
return this.cfn.resolveEnvironment(this.stack);
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Get currently deployed template of the given stack (SINGLETON)
|
|
159
|
-
*
|
|
160
|
-
* @returns Currently deployed CloudFormation template
|
|
161
|
-
*/
|
|
162
|
-
async currentTemplate() {
|
|
163
|
-
if (!this._currentTemplate) {
|
|
164
|
-
this._currentTemplate = await this.cfn.readCurrentTemplate(this.stack);
|
|
165
|
-
}
|
|
166
|
-
return this._currentTemplate;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Return the current template, with the given resources added to it
|
|
170
|
-
*/
|
|
171
|
-
async currentTemplateWithAdditions(additions) {
|
|
172
|
-
const template = await this.currentTemplate();
|
|
173
|
-
if (!template.Resources) {
|
|
174
|
-
template.Resources = {};
|
|
175
|
-
}
|
|
176
|
-
for (const add of additions) {
|
|
177
|
-
template.Resources[add.logicalId] = add.resourceDefinition;
|
|
178
|
-
}
|
|
179
|
-
return template;
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Get a list of import identifiers for all resource types used in the given
|
|
183
|
-
* template that do support the import operation (SINGLETON)
|
|
184
|
-
*
|
|
185
|
-
* @returns a mapping from a resource type to a list of property names that together identify the resource for import
|
|
186
|
-
*/
|
|
187
|
-
async resourceIdentifiers() {
|
|
188
|
-
const ret = {};
|
|
189
|
-
const resourceIdentifierSummaries = await this.cfn.resourceIdentifierSummaries(this.stack);
|
|
190
|
-
for (const summary of resourceIdentifierSummaries) {
|
|
191
|
-
if ('ResourceType' in summary && summary.ResourceType && 'ResourceIdentifiers' in summary && summary.ResourceIdentifiers) {
|
|
192
|
-
ret[summary.ResourceType] = (summary.ResourceIdentifiers ?? [])?.map(x => x.split(','));
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return ret;
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Ask for the importable identifier for the given resource
|
|
199
|
-
*
|
|
200
|
-
* There may be more than one identifier under which a resource can be imported. The `import`
|
|
201
|
-
* operation needs exactly one of them.
|
|
202
|
-
*
|
|
203
|
-
* - If we can get one from the template, we will use one.
|
|
204
|
-
* - Otherwise, we will ask the user for one of them.
|
|
205
|
-
*/
|
|
206
|
-
async askForResourceIdentifier(resourceIdentifiers, chg) {
|
|
207
|
-
const resourceName = this.describeResource(chg.logicalId);
|
|
208
|
-
// Skip resources that do not support importing
|
|
209
|
-
const resourceType = chg.resourceDiff.newResourceType;
|
|
210
|
-
if (resourceType === undefined || !(resourceType in resourceIdentifiers)) {
|
|
211
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`${resourceName}: unsupported resource type ${resourceType}, skipping import.`));
|
|
212
|
-
return undefined;
|
|
213
|
-
}
|
|
214
|
-
const idPropSets = resourceIdentifiers[resourceType];
|
|
215
|
-
// Retain only literal strings: strip potential CFN intrinsics
|
|
216
|
-
const resourceProps = Object.fromEntries(Object.entries(chg.resourceDefinition.Properties ?? {})
|
|
217
|
-
.filter(([_, v]) => typeof v === 'string'));
|
|
218
|
-
// Find property sets that are fully satisfied in the template, ask the user to confirm them
|
|
219
|
-
const satisfiedPropSets = idPropSets.filter(ps => ps.every(p => resourceProps[p]));
|
|
220
|
-
for (const satisfiedPropSet of satisfiedPropSets) {
|
|
221
|
-
const candidateProps = Object.fromEntries(satisfiedPropSet.map(p => [p, resourceProps[p]]));
|
|
222
|
-
const displayCandidateProps = fmtdict(candidateProps);
|
|
223
|
-
if (await promptly.confirm(`${chalk.blue(resourceName)} (${resourceType}): import with ${chalk.yellow(displayCandidateProps)} (yes/no) [default: yes]? `, { default: 'yes' })) {
|
|
224
|
-
return candidateProps;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
// If we got here and the user rejected any available identifiers, then apparently they don't want the resource at all
|
|
228
|
-
if (satisfiedPropSets.length > 0) {
|
|
229
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.grey(`Skipping import of ${resourceName}`)));
|
|
230
|
-
return undefined;
|
|
231
|
-
}
|
|
232
|
-
// We cannot auto-import this, ask the user for one of the props
|
|
233
|
-
// The only difference between these cases is what we print: for multiple properties, we print a preamble
|
|
234
|
-
const prefix = `${chalk.blue(resourceName)} (${resourceType})`;
|
|
235
|
-
let preamble;
|
|
236
|
-
let promptPattern;
|
|
237
|
-
if (idPropSets.length > 1) {
|
|
238
|
-
preamble = `${prefix}: enter one of ${idPropSets.map(x => chalk.blue(x.join('+'))).join(', ')} to import (all empty to skip)`;
|
|
239
|
-
promptPattern = `${prefix}: enter %`;
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
promptPattern = `${prefix}: enter %`;
|
|
243
|
-
}
|
|
244
|
-
// Do the input loop here
|
|
245
|
-
if (preamble) {
|
|
246
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(preamble));
|
|
247
|
-
}
|
|
248
|
-
for (const idProps of idPropSets) {
|
|
249
|
-
const input = {};
|
|
250
|
-
for (const idProp of idProps) {
|
|
251
|
-
// If we have a value from the template, use it as default. This will only be a partial
|
|
252
|
-
// identifier if present, otherwise we would have done the import already above.
|
|
253
|
-
const defaultValue = resourceProps[idProp] ?? '';
|
|
254
|
-
const prompt = [
|
|
255
|
-
promptPattern.replace(/%/g, chalk.blue(idProp)),
|
|
256
|
-
defaultValue
|
|
257
|
-
? `[${defaultValue}]`
|
|
258
|
-
: '(empty to skip)',
|
|
259
|
-
].join(' ') + ':';
|
|
260
|
-
const response = await promptly.prompt(prompt, { default: defaultValue, trim: true });
|
|
261
|
-
if (!response) {
|
|
262
|
-
break;
|
|
263
|
-
}
|
|
264
|
-
input[idProp] = response;
|
|
265
|
-
// Also stick this property into 'resourceProps', so that it may be reused by a subsequent question
|
|
266
|
-
// (for a different compound identifier that involves the same property). Just a small UX enhancement.
|
|
267
|
-
resourceProps[idProp] = response;
|
|
268
|
-
}
|
|
269
|
-
// If the user gave inputs for all values, we are complete
|
|
270
|
-
if (Object.keys(input).length === idProps.length) {
|
|
271
|
-
return input;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.grey(`Skipping import of ${resourceName}`)));
|
|
275
|
-
return undefined;
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Convert the internal "resource mapping" structure to CloudFormation accepted "ResourcesToImport" structure
|
|
279
|
-
*/
|
|
280
|
-
async makeResourcesToImport(resourceMap) {
|
|
281
|
-
return resourceMap.importResources.map(res => ({
|
|
282
|
-
LogicalResourceId: res.logicalId,
|
|
283
|
-
ResourceType: res.resourceDiff.newResourceType,
|
|
284
|
-
ResourceIdentifier: resourceMap.resourceMap[res.logicalId],
|
|
285
|
-
}));
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Convert CloudFormation logical resource ID to CDK construct tree path
|
|
289
|
-
*
|
|
290
|
-
* @param logicalId CloudFormation logical ID of the resource (the key in the template's Resources section)
|
|
291
|
-
* @returns Forward-slash separated path of the resource in CDK construct tree, e.g. MyStack/MyBucket/Resource
|
|
292
|
-
*/
|
|
293
|
-
describeResource(logicalId) {
|
|
294
|
-
return this.stack.template?.Resources?.[logicalId]?.Metadata?.['aws:cdk:path'] ?? logicalId;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Removes CDKMetadata and Outputs in the template so that only resources for importing are left.
|
|
298
|
-
* @returns template with import resources only
|
|
299
|
-
*/
|
|
300
|
-
removeNonImportResources() {
|
|
301
|
-
return (0, api_1.removeNonImportResources)(this.stack);
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
exports.ResourceImporter = ResourceImporter;
|
|
305
|
-
function fmtdict(xs) {
|
|
306
|
-
return Object.entries(xs).map(([k, v]) => `${k}=${v}`).join(', ');
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Add a default `DeletionPolicy` policy.
|
|
310
|
-
* The default value is set to 'Retain', to lower risk of unintentionally
|
|
311
|
-
* deleting stateful resources in the process of importing to CDK.
|
|
312
|
-
*/
|
|
313
|
-
function addDefaultDeletionPolicy(resource) {
|
|
314
|
-
if (resource.DeletionPolicy) {
|
|
315
|
-
return resource;
|
|
316
|
-
}
|
|
317
|
-
return {
|
|
318
|
-
...resource,
|
|
319
|
-
DeletionPolicy: 'Retain',
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBOEI7QUFDOUIsd0RBQXdEO0FBSXhELCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLDBFQUEwRztBQUMxRyx5RkFBZ0c7QUFFaEcsZ0RBQXFFO0FBS3JFLHdFQUE0RjtBQUFuRiwrR0FBQSx3QkFBd0IsT0FBQTtBQStFakM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFPM0IsWUFDRSxLQUF3QyxFQUN4QyxLQUE0QjtRQUU1QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxTQUErQjtRQUNwRSxNQUFNLEdBQUcsR0FBYyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUU3RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsU0FBUztZQUNYLENBQUM7WUFFRCxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUM7UUFD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LElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxRQUFRO1FBQ1gsY0FBYyxFQUFFLFFBQVE7S0FDekIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIGNmbkRpZmYgZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlRGlmZmVyZW5jZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJ5LCBSZXNvdXJjZVRvSW1wb3J0IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHByb21wdGx5IGZyb20gJ3Byb21wdGx5JztcbmltcG9ydCB7IFRvb2xraXRFcnJvciwgcmVtb3ZlTm9uSW1wb3J0UmVzb3VyY2VzIH0gZnJvbSAnLi4vLi4vLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpJztcbmltcG9ydCB7IElPLCB0eXBlIElvSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3ltZW50TWV0aG9kLCBEZXBsb3ltZW50cyB9IGZyb20gJy4uL2RlcGxveW1lbnRzJztcbmltcG9ydCB7IGFzc2VydElzU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi4vZGVwbG95bWVudHMnO1xuaW1wb3J0IHR5cGUgeyBUYWcgfSBmcm9tICcuLi90YWdzJztcblxuZXhwb3J0IHR5cGUgUmVzb3VyY2VzVG9JbXBvcnQgPSBSZXNvdXJjZVRvSW1wb3J0W107XG5leHBvcnQgdHlwZSBSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMgPSBSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJ5W107XG5leHBvcnQgeyByZW1vdmVOb25JbXBvcnRSZXNvdXJjZXMgfSBmcm9tICcuLi8uLi8uLi8uLi9AYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzL3NyYy9hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlSW1wb3J0ZXJQcm9wcyB7XG4gIGRlcGxveW1lbnRzOiBEZXBsb3ltZW50cztcbiAgaW9IZWxwZXI6IElvSGVscGVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydERlcGxveW1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJvbGUgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiBmb3IgZGVwbG95bWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgc3RhY2sgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogRGVwbG95bWVudCBtZXRob2RcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDaGFuZ2Ugc2V0IHdpdGggZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50TWV0aG9kPzogRGVwbG95bWVudE1ldGhvZDtcblxuICAvKipcbiAgICogU3RhY2sgdGFncyAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBUYWdbXTtcblxuICAvKipcbiAgICogVXNlIHByZXZpb3VzIHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBJZiBub3Qgc2V0LCBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUm9sbGJhY2sgZmFpbGVkIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZXQgb2YgcGFyYW1ldGVycyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZ5IGEgcGh5c2ljYWwgcmVzb3VyY2Ugb2YgYSBnaXZlbiB0eXBlXG4gKiBmb3IgdGhlIGltcG9ydCBvcGVyYXRpb24sIGV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiB7XG4gKiAgIFwiQVdTOjpTMzo6QnVja2V0XCI6IFtbXCJCdWNrZXROYW1lXCJdXSxcbiAqICAgXCJBV1M6OkR5bmFtb0RCOjpHbG9iYWxUYWJsZVwiOiBbW1wiVGFibGVOYW1lXCJdLCBbXCJUYWJsZUFyblwiXSwgW1wiVGFibGVTdHJlYW1Bcm5cIl1dLFxuICogICBcIkFXUzo6Um91dGU1Mzo6S2V5U2lnbmluZ0tleVwiOiBbW1wiSG9zdGVkWm9uZUlkXCIsIFwiTmFtZVwiXV0sXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VJZGVudGlmaWVycyA9IHsgW3Jlc291cmNlVHlwZTogc3RyaW5nXTogc3RyaW5nW11bXSB9O1xuXG50eXBlIFJlc291cmNlSWRlbnRpZmllclByb3BlcnRpZXMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4vKipcbiAqIE1hcHBpbmcgb2YgQ0RLIHJlc291cmNlcyAoTDEgY29uc3RydWN0cykgdG8gcGh5c2ljYWwgcmVzb3VyY2VzIHRvIGJlIGltcG9ydGVkXG4gKiBpbiB0aGVpciBwbGFjZSwgZXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqIHtcbiAqICAgXCJNeVN0YWNrL015UzNCdWNrZXQvUmVzb3VyY2VcIjoge1xuICogICAgIFwiQnVja2V0TmFtZVwiOiBcIm15LW1hbnVhbGx5LWNyZWF0ZWQtczMtYnVja2V0XCJcbiAqICAgfSxcbiAqICAgXCJNeVN0YWNrL015VnBjL1Jlc291cmNlXCI6IHtcbiAqICAgICBcIlZwY0lkXCI6IFwidnBjLTEyMzQ1Njc4OVwiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG50eXBlIFJlc291cmNlTWFwID0geyBbbG9naWNhbFJlc291cmNlOiBzdHJpbmddOiBSZXNvdXJjZUlkZW50aWZpZXJQcm9wZXJ0aWVzIH07XG5cbi8qKlxuICogUmVzb3VyY2UgaW1wb3J0aW5nIHV0aWxpdHkgY2xhc3NcbiAqXG4gKiAtIERldGVybWluZXMgdGhlIHJlc291cmNlcyBhZGRlZCB0byBhIHRlbXBsYXRlIChjb21wYXJlZCB0byB0aGUgZGVwbG95ZWQgdmVyc2lvbilcbiAqIC0gTG9vayB1cCB0aGUgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb25cbiAqICAgLSBMb2FkIHRoZW0gZnJvbSBhIGZpbGUsIG9yXG4gKiAgIC0gQXNrIHRoZSB1c2VyLCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBzdXBwbGllZCB0byB1cyBieSBDbG91ZEZvcm1hdGlvbidzIEdldFRlbXBsYXRlU3VtbWFyeVxuICogLSBUcmFuc2xhdGUgdGhlIGlucHV0IHRvIGEgc3RydWN0dXJlIGV4cGVjdGVkIGJ5IENsb3VkRm9ybWF0aW9uLCB1cGRhdGUgdGhlIHRlbXBsYXRlIHRvIGFkZCB0aGVcbiAqICAgaW1wb3J0YWJsZSByZXNvdXJjZXMsIHRoZW4gcnVuIGFuIElNUE9SVCBjaGFuZ2VzZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUltcG9ydGVyIHtcbiAgcHJpdmF0ZSBfY3VycmVudFRlbXBsYXRlOiBhbnk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IGNmbjogRGVwbG95bWVudHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gICAgcHJvcHM6IFJlc291cmNlSW1wb3J0ZXJQcm9wcyxcbiAgKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuY2ZuID0gcHJvcHMuZGVwbG95bWVudHM7XG4gICAgdGhpcy5pb0hlbHBlciA9IHByb3BzLmlvSGVscGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgdXNlciBmb3IgcmVzb3VyY2VzIHRvIGltcG9ydFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFza0ZvclJlc291cmNlSWRlbnRpZmllcnMoYXZhaWxhYmxlOiBJbXBvcnRhYmxlUmVzb3VyY2VbXSk6IFByb21pc2U8SW1wb3J0TWFwPiB7XG4gICAgY29uc3QgcmV0OiBJbXBvcnRNYXAgPSB7IGltcG9ydFJlc291cmNlczogW10sIHJlc291cmNlTWFwOiB7fSB9O1xuICAgIGNvbnN0IHJlc291cmNlSWRlbnRpZmllcnMgPSBhd2FpdCB0aGlzLnJlc291cmNlSWRlbnRpZmllcnMoKTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgYXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gYXdhaXQgdGhpcy5hc2tGb3JSZXNvdXJjZUlkZW50aWZpZXIocmVzb3VyY2VJZGVudGlmaWVycywgcmVzb3VyY2UpO1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXQuaW1wb3J0UmVzb3VyY2VzLnB1c2gocmVzb3VyY2UpO1xuICAgICAgcmV0LnJlc291cmNlTWFwW3Jlc291cmNlLmxvZ2ljYWxJZF0gPSBpZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgcmVzb3VyY2VzIHRvIGltcG9ydCBmcm9tIGEgZmlsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRSZXNvdXJjZUlkZW50aWZpZXJzKGF2YWlsYWJsZTogSW1wb3J0YWJsZVJlc291cmNlW10sIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEltcG9ydE1hcD4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEpzb24oZmlsZW5hbWUpO1xuXG4gICAgY29uc3QgcmV0OiBJbXBvcnRNYXAgPSB7IGltcG9ydFJlc291cmNlczogW10sIHJlc291cmNlTWFwOiB7fSB9O1xuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgYXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBkZXNjciA9IHRoaXMuZGVzY3JpYmVSZXNvdXJjZShyZXNvdXJjZS5sb2dpY2FsSWQpO1xuICAgICAgY29uc3QgaWRQcm9wcyA9IGNvbnRlbnRzW3Jlc291cmNlLmxvZ2ljYWxJZF07XG4gICAgICBpZiAoaWRQcm9wcykge1xuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coZm9ybWF0KCclczogaW1wb3J0aW5nIHVzaW5nICVzJywgY2hhbGsuYmx1ZShkZXNjciksIGNoYWxrLmJsdWUoZm10ZGljdChpZFByb3BzKSkpKSk7XG5cbiAgICAgICAgcmV0LmltcG9ydFJlc291cmNlcy5wdXNoKHJlc291cmNlKTtcbiAgICAgICAgcmV0LnJlc291cmNlTWFwW3Jlc291cmNlLmxvZ2ljYWxJZF0gPSBpZFByb3BzO1xuICAgICAgICBkZWxldGUgY29udGVudHNbcmVzb3VyY2UubG9naWNhbElkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhmb3JtYXQoJyVzOiBza2lwcGluZycsIGNoYWxrLmJsdWUoZGVzY3IpKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVua25vd24gPSBPYmplY3Qua2V5cyhjb250ZW50cyk7XG4gICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX1dBUk4ubXNnKGBVbnJlY29nbml6ZWQgcmVzb3VyY2UgaWRlbnRpZmllcnMgaW4gbWFwcGluZyBmaWxlOiAke3Vua25vd24uam9pbignLCAnKX1gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXNlZCBvbiB0aGUgcHJvdmlkZWQgcmVzb3VyY2UgbWFwcGluZywgcHJlcGFyZSBDRk4gc3RydWN0dXJlcyBmb3IgaW1wb3J0ICh0ZW1wbGF0ZSxcbiAgICogUmVzb3VyY2VzVG9JbXBvcnQgc3RydWN0dXJlKSBhbmQgcGVyZm9ybSB0aGUgaW1wb3J0IG9wZXJhdGlvbiAoQ2xvdWRGb3JtYXRpb24gZGVwbG95bWVudClcbiAgICpcbiAgICogQHBhcmFtIGltcG9ydE1hcCBNYXBwaW5nIGZyb20gQ0RLIGNvbnN0cnVjdCB0cmVlIHBhdGggdG8gcGh5c2ljYWwgcmVzb3VyY2UgaW1wb3J0IGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiBkZXBsb3kgb3BlcmF0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW1wb3J0UmVzb3VyY2VzRnJvbU1hcChpbXBvcnRNYXA6IEltcG9ydE1hcCwgb3B0aW9uczogSW1wb3J0RGVwbG95bWVudE9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHJlc291cmNlc1RvSW1wb3J0OiBSZXNvdXJjZXNUb0ltcG9ydCA9IGF3YWl0IHRoaXMubWFrZVJlc291cmNlc1RvSW1wb3J0KGltcG9ydE1hcCk7XG4gICAgY29uc3QgdXBkYXRlZFRlbXBsYXRlID0gYXdhaXQgdGhpcy5jdXJyZW50VGVtcGxhdGVXaXRoQWRkaXRpb25zKGltcG9ydE1hcC5pbXBvcnRSZXNvdXJjZXMpO1xuXG4gICAgYXdhaXQgdGhpcy5pbXBvcnRSZXNvdXJjZXModXBkYXRlZFRlbXBsYXRlLCByZXNvdXJjZXNUb0ltcG9ydCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQmFzZWQgb24gdGhlIGFwcCBhbmQgcmVzb3VyY2VzIGZpbGUgZ2VuZXJhdGVkIGJ5IGNkayBtaWdyYXRlLiBSZW1vdmVzIGFsbCBpdGVtcyBmcm9tIHRoZSB0ZW1wbGF0ZSB0aGF0XG4gICAqIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBhbiBpbXBvcnQgY2hhbmdlLXNldCBmb3IgbmV3IHN0YWNrcyBhbmQgcGVyZm9ybXMgdGhlIGltcG9ydCBvcGVyYXRpb24sXG4gICAqIGNyZWF0aW5nIHRoZSBuZXcgc3RhY2suXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZXNUb0ltcG9ydCBUaGUgbWFwcGluZyBjcmVhdGVkIGJ5IGNkayBtaWdyYXRlXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiBkZXBsb3kgb3BlcmF0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW1wb3J0UmVzb3VyY2VzRnJvbU1pZ3JhdGUocmVzb3VyY2VzVG9JbXBvcnQ6IFJlc291cmNlc1RvSW1wb3J0LCBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgdXBkYXRlZFRlbXBsYXRlID0gdGhpcy5yZW1vdmVOb25JbXBvcnRSZXNvdXJjZXMoKTtcblxuICAgIGF3YWl0IHRoaXMuaW1wb3J0UmVzb3VyY2VzKHVwZGF0ZWRUZW1wbGF0ZSwgcmVzb3VyY2VzVG9JbXBvcnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRSZXNvdXJjZXMob3ZlcnJpZGVUZW1wbGF0ZTogYW55LCByZXNvdXJjZXNUb0ltcG9ydDogUmVzb3VyY2VzVG9JbXBvcnQsIG9wdGlvbnM6IEltcG9ydERlcGxveW1lbnRPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2ZuLmRlcGxveVN0YWNrKHtcbiAgICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAgIGRlcGxveU5hbWU6IHRoaXMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBvdmVycmlkZVRlbXBsYXRlLFxuICAgICAgICByZXNvdXJjZXNUb0ltcG9ydCxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnRJc1N1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdChyZXN1bHQpO1xuXG4gICAgICBjb25zdCBtZXNzYWdlID0gcmVzdWx0Lm5vT3BcbiAgICAgICAgPyAnIOKchSAgJXMgKG5vIGNoYW5nZXMpJ1xuICAgICAgICA6ICcg4pyFICAlcyc7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZygnXFxuJyArIGNoYWxrLmdyZWVuKGZvcm1hdChtZXNzYWdlLCB0aGlzLnN0YWNrLmRpc3BsYXlOYW1lKSkpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FMzkwMC5tc2coZm9ybWF0KCdcXG4g4p2MICAlcyBmYWlsZWQ6ICVzJywgY2hhbGsuYm9sZCh0aGlzLnN0YWNrLmRpc3BsYXlOYW1lKSwgZSksIHsgZXJyb3I6IGUgYXMgYW55IH0pKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBkaWZmIGJldHdlZW4gdGhlIGN1cnJlbnRseSBydW5uaW5nIGFuZCB0aGUgbmV3IHRlbXBsYXRlLCBlbnN1cmUgdGhhdCBpdCBpcyB2YWxpZFxuICAgKiBmb3IgaW1wb3J0aW5nIGFuZCByZXR1cm4gYSBsaXN0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBiZWluZyBhZGRlZCBpbiB0aGUgbmV3IHZlcnNpb25cbiAgICpcbiAgICogQHJldHVybiBtYXBwaW5nIGxvZ2ljYWxSZXNvdXJjZUlkIC0+IHJlc291cmNlRGlmZmVyZW5jZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2NvdmVySW1wb3J0YWJsZVJlc291cmNlcyhhbGxvd05vbkFkZGl0aW9ucyA9IGZhbHNlKTogUHJvbWlzZTxEaXNjb3ZlckltcG9ydGFibGVSZXNvdXJjZXNSZXN1bHQ+IHtcbiAgICBjb25zdCBjdXJyZW50VGVtcGxhdGUgPSBhd2FpdCB0aGlzLmN1cnJlbnRUZW1wbGF0ZSgpO1xuXG4gICAgY29uc3QgZGlmZiA9IGNmbkRpZmYuZnVsbERpZmYoY3VycmVudFRlbXBsYXRlLCB0aGlzLnN0YWNrLnRlbXBsYXRlKTtcblxuICAgIC8vIElnbm9yZSBjaGFuZ2VzIHRvIENES01ldGFkYXRhXG4gICAgY29uc3QgcmVzb3VyY2VDaGFuZ2VzID0gT2JqZWN0LmVudHJpZXMoZGlmZi5yZXNvdXJjZXMuY2hhbmdlcylcbiAgICAgIC5maWx0ZXIoKFtsb2dpY2FsSWQsIF9dKSA9PiBsb2dpY2FsSWQgIT09ICdDREtNZXRhZGF0YScpO1xuXG4gICAgLy8gU3BsaXQgdGhlIGNoYW5nZXMgaW50byBhZGRpdGlvbnMgYW5kIG5vbi1hZGRpdGlvbnMuIEltcG9ydHMgb25seSBtYWtlIHNlbnNlXG4gICAgLy8gZm9yIG5ld2x5LWFkZGVkIHJlc291cmNlcy5cbiAgICBjb25zdCBub25BZGRpdGlvbnMgPSByZXNvdXJjZUNoYW5nZXMuZmlsdGVyKChbXywgZGlmXSkgPT4gIWRpZi5pc0FkZGl0aW9uKTtcbiAgICBjb25zdCBhZGRpdGlvbnMgPSByZXNvdXJjZUNoYW5nZXMuZmlsdGVyKChbXywgZGlmXSkgPT4gZGlmLmlzQWRkaXRpb24pO1xuXG4gICAgaWYgKG5vbkFkZGl0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG9mZmVuZGluZ1Jlc291cmNlcyA9IG5vbkFkZGl0aW9ucy5tYXAoKFtsb2dJZCwgX10pID0+IHRoaXMuZGVzY3JpYmVSZXNvdXJjZShsb2dJZCkpO1xuXG4gICAgICBpZiAoYWxsb3dOb25BZGRpdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX1dBUk4ubXNnKGBJZ25vcmluZyB1cGRhdGVkL2RlbGV0ZWQgcmVzb3VyY2VzICgtLWZvcmNlKTogJHtvZmZlbmRpbmdSZXNvdXJjZXMuam9pbignLCAnKX1gKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdObyByZXNvdXJjZSB1cGRhdGVzIG9yIGRlbGV0ZXMgYXJlIGFsbG93ZWQgb24gaW1wb3J0IG9wZXJhdGlvbi4gTWFrZSBzdXJlIHRvIHJlc29sdmUgcGVuZGluZyBjaGFuZ2VzICcgK1xuICAgICAgICAgIGB0byBleGlzdGluZyByZXNvdXJjZXMsIGJlZm9yZSBhdHRlbXB0aW5nIGFuIGltcG9ydC4gVXBkYXRlZC9kZWxldGVkIHJlc291cmNlczogJHtvZmZlbmRpbmdSZXNvdXJjZXMuam9pbignLCAnKX0gKC0tZm9yY2UgdG8gb3ZlcnJpZGUpYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VzIGluIHRoZSBuZXcgdGVtcGxhdGUsIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBjdXJyZW50IHRlbXBsYXRlLCBhcmUgYSBwb3RlbnRpYWwgaW1wb3J0IGNhbmRpZGF0ZXNcbiAgICByZXR1cm4ge1xuICAgICAgYWRkaXRpb25zOiBhZGRpdGlvbnMubWFwKChbbG9naWNhbElkLCByZXNvdXJjZURpZmZdKSA9PiAoe1xuICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgIHJlc291cmNlRGlmZixcbiAgICAgICAgcmVzb3VyY2VEZWZpbml0aW9uOiBhZGREZWZhdWx0RGVsZXRpb25Qb2xpY3kodGhpcy5zdGFjay50ZW1wbGF0ZT8uUmVzb3VyY2VzPy5bbG9naWNhbElkXSA/PyB7fSksXG4gICAgICB9KSksXG4gICAgICBoYXNOb25BZGRpdGlvbnM6IG5vbkFkZGl0aW9ucy5sZW5ndGggPiAwLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGVudmlyb25tZW50IG9mIGEgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZUVudmlyb25tZW50KCk6IFByb21pc2U8Y3hhcGkuRW52aXJvbm1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jZm4ucmVzb2x2ZUVudmlyb25tZW50KHRoaXMuc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgZGVwbG95ZWQgdGVtcGxhdGUgb2YgdGhlIGdpdmVuIHN0YWNrIChTSU5HTEVUT04pXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnRseSBkZXBsb3llZCBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjdXJyZW50VGVtcGxhdGUoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnRUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5fY3VycmVudFRlbXBsYXRlID0gYXdhaXQgdGhpcy5jZm4ucmVhZEN1cnJlbnRUZW1wbGF0ZSh0aGlzLnN0YWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUZW1wbGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGVtcGxhdGUsIHdpdGggdGhlIGdpdmVuIHJlc291cmNlcyBhZGRlZCB0byBpdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjdXJyZW50VGVtcGxhdGVXaXRoQWRkaXRpb25zKGFkZGl0aW9uczogSW1wb3J0YWJsZVJlc291cmNlW10pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy5jdXJyZW50VGVtcGxhdGUoKTtcbiAgICBpZiAoIXRlbXBsYXRlLlJlc291cmNlcykge1xuICAgICAgdGVtcGxhdGUuUmVzb3VyY2VzID0ge307XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhZGQgb2YgYWRkaXRpb25zKSB7XG4gICAgICB0ZW1wbGF0ZS5SZXNvdXJjZXNbYWRkLmxvZ2ljYWxJZF0gPSBhZGQucmVzb3VyY2VEZWZpbml0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIGltcG9ydCBpZGVudGlmaWVycyBmb3IgYWxsIHJlc291cmNlIHR5cGVzIHVzZWQgaW4gdGhlIGdpdmVuXG4gICAqIHRlbXBsYXRlIHRoYXQgZG8gc3VwcG9ydCB0aGUgaW1wb3J0IG9wZXJhdGlvbiAoU0lOR0xFVE9OKVxuICAgKlxuICAgKiBAcmV0dXJucyBhIG1hcHBpbmcgZnJvbSBhIHJlc291cmNlIHR5cGUgdG8gYSBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgdG9nZXRoZXIgaWRlbnRpZnkgdGhlIHJlc291cmNlIGZvciBpbXBvcnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb3VyY2VJZGVudGlmaWVycygpOiBQcm9taXNlPFJlc291cmNlSWRlbnRpZmllcnM+IHtcbiAgICBjb25zdCByZXQ6IFJlc291cmNlSWRlbnRpZmllcnMgPSB7fTtcbiAgICBjb25zdCByZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMgPSBhd2FpdCB0aGlzLmNmbi5yZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXModGhpcy5zdGFjayk7XG4gICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIHJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcykge1xuICAgICAgaWYgKCdSZXNvdXJjZVR5cGUnIGluIHN1bW1hcnkgJiYgc3VtbWFyeS5SZXNvdXJjZVR5cGUgJiYgJ1Jlc291cmNlSWRlbnRpZmllcnMnIGluIHN1bW1hcnkgJiYgc3VtbWFyeS5SZXNvdXJjZUlkZW50aWZpZXJzKSB7XG4gICAgICAgIHJldFtzdW1tYXJ5LlJlc291cmNlVHlwZV0gPSAoc3VtbWFyeS5SZXNvdXJjZUlkZW50aWZpZXJzID8/IFtdKT8ubWFwKHggPT4geC5zcGxpdCgnLCcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2sgZm9yIHRoZSBpbXBvcnRhYmxlIGlkZW50aWZpZXIgZm9yIHRoZSBnaXZlbiByZXNvdXJjZVxuICAgKlxuICAgKiBUaGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIGEgcmVzb3VyY2UgY2FuIGJlIGltcG9ydGVkLiBUaGUgYGltcG9ydGBcbiAgICogb3BlcmF0aW9uIG5lZWRzIGV4YWN0bHkgb25lIG9mIHRoZW0uXG4gICAqXG4gICAqIC0gSWYgd2UgY2FuIGdldCBvbmUgZnJvbSB0aGUgdGVtcGxhdGUsIHdlIHdpbGwgdXNlIG9uZS5cbiAgICogLSBPdGhlcndpc2UsIHdlIHdpbGwgYXNrIHRoZSB1c2VyIGZvciBvbmUgb2YgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNrRm9yUmVzb3VyY2VJZGVudGlmaWVyKFxuICAgIHJlc291cmNlSWRlbnRpZmllcnM6IFJlc291cmNlSWRlbnRpZmllcnMsXG4gICAgY2hnOiBJbXBvcnRhYmxlUmVzb3VyY2UsXG4gICk6IFByb21pc2U8UmVzb3VyY2VJZGVudGlmaWVyUHJvcGVydGllcyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IHRoaXMuZGVzY3JpYmVSZXNvdXJjZShjaGcubG9naWNhbElkKTtcblxuICAgIC8vIFNraXAgcmVzb3VyY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgaW1wb3J0aW5nXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gY2hnLnJlc291cmNlRGlmZi5uZXdSZXNvdXJjZVR5cGU7XG4gICAgaWYgKHJlc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkIHx8ICEocmVzb3VyY2VUeXBlIGluIHJlc291cmNlSWRlbnRpZmllcnMpKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfV0FSTi5tc2coYCR7cmVzb3VyY2VOYW1lfTogdW5zdXBwb3J0ZWQgcmVzb3VyY2UgdHlwZSAke3Jlc291cmNlVHlwZX0sIHNraXBwaW5nIGltcG9ydC5gKSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGlkUHJvcFNldHMgPSByZXNvdXJjZUlkZW50aWZpZXJzW3Jlc291cmNlVHlwZV07XG5cbiAgICAvLyBSZXRhaW4gb25seSBsaXRlcmFsIHN0cmluZ3M6IHN0cmlwIHBvdGVudGlhbCBDRk4gaW50cmluc2ljc1xuICAgIGNvbnN0IHJlc291cmNlUHJvcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2hnLnJlc291cmNlRGVmaW5pdGlvbi5Qcm9wZXJ0aWVzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW18sIHZdKSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycpKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgLy8gRmluZCBwcm9wZXJ0eSBzZXRzIHRoYXQgYXJlIGZ1bGx5IHNhdGlzZmllZCBpbiB0aGUgdGVtcGxhdGUsIGFzayB0aGUgdXNlciB0byBjb25maXJtIHRoZW1cbiAgICBjb25zdCBzYXRpc2ZpZWRQcm9wU2V0cyA9IGlkUHJvcFNldHMuZmlsdGVyKHBzID0+IHBzLmV2ZXJ5KHAgPT4gcmVzb3VyY2VQcm9wc1twXSkpO1xuICAgIGZvciAoY29uc3Qgc2F0aXNmaWVkUHJvcFNldCBvZiBzYXRpc2ZpZWRQcm9wU2V0cykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlUHJvcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoc2F0aXNmaWVkUHJvcFNldC5tYXAocCA9PiBbcCwgcmVzb3VyY2VQcm9wc1twXV0pKTtcbiAgICAgIGNvbnN0IGRpc3BsYXlDYW5kaWRhdGVQcm9wcyA9IGZtdGRpY3QoY2FuZGlkYXRlUHJvcHMpO1xuXG4gICAgICBpZiAoYXdhaXQgcHJvbXB0bHkuY29uZmlybShcbiAgICAgICAgYCR7Y2hhbGsuYmx1ZShyZXNvdXJjZU5hbWUpfSAoJHtyZXNvdXJjZVR5cGV9KTogaW1wb3J0IHdpdGggJHtjaGFsay55ZWxsb3coZGlzcGxheUNhbmRpZGF0ZVByb3BzKX0gKHllcy9ubykgW2RlZmF1bHQ6IHllc10/IGAsXG4gICAgICAgIHsgZGVmYXVsdDogJ3llcycgfSxcbiAgICAgICkpIHtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVByb3BzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGdvdCBoZXJlIGFuZCB0aGUgdXNlciByZWplY3RlZCBhbnkgYXZhaWxhYmxlIGlkZW50aWZpZXJzLCB0aGVuIGFwcGFyZW50bHkgdGhleSBkb24ndCB3YW50IHRoZSByZXNvdXJjZSBhdCBhbGxcbiAgICBpZiAoc2F0aXNmaWVkUHJvcFNldHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0lORk8ubXNnKGNoYWxrLmdyZXkoYFNraXBwaW5nIGltcG9ydCBvZiAke3Jlc291cmNlTmFtZX1gKSkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBXZSBjYW5ub3QgYXV0by1pbXBvcnQgdGhpcywgYXNrIHRoZSB1c2VyIGZvciBvbmUgb2YgdGhlIHByb3BzXG4gICAgLy8gVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIGNhc2VzIGlzIHdoYXQgd2UgcHJpbnQ6IGZvciBtdWx0aXBsZSBwcm9wZXJ0aWVzLCB3ZSBwcmludCBhIHByZWFtYmxlXG4gICAgY29uc3QgcHJlZml4ID0gYCR7Y2hhbGsuYmx1ZShyZXNvdXJjZU5hbWUpfSAoJHtyZXNvdXJjZVR5cGV9KWA7XG4gICAgbGV0IHByZWFtYmxlO1xuICAgIGxldCBwcm9tcHRQYXR0ZXJuO1xuICAgIGlmIChpZFByb3BTZXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHByZWFtYmxlID0gYCR7cHJlZml4fTogZW50ZXIgb25lIG9mICR7aWRQcm9wU2V0cy5tYXAoeCA9PiBjaGFsay5ibHVlKHguam9pbignKycpKSkuam9pbignLCAnKX0gdG8gaW1wb3J0IChhbGwgZW1wdHkgdG8gc2tpcClgO1xuICAgICAgcHJvbXB0UGF0dGVybiA9IGAke3ByZWZpeH06IGVudGVyICVgO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9tcHRQYXR0ZXJuID0gYCR7cHJlZml4fTogZW50ZXIgJWA7XG4gICAgfVxuXG4gICAgLy8gRG8gdGhlIGlucHV0IGxvb3AgaGVyZVxuICAgIGlmIChwcmVhbWJsZSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0lORk8ubXNnKHByZWFtYmxlKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaWRQcm9wcyBvZiBpZFByb3BTZXRzKSB7XG4gICAgICBjb25zdCBpbnB1dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBpZFByb3Agb2YgaWRQcm9wcykge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsdWUgZnJvbSB0aGUgdGVtcGxhdGUsIHVzZSBpdCBhcyBkZWZhdWx0LiBUaGlzIHdpbGwgb25seSBiZSBhIHBhcnRpYWxcbiAgICAgICAgLy8gaWRlbnRpZmllciBpZiBwcmVzZW50LCBvdGhlcndpc2Ugd2Ugd291bGQgaGF2ZSBkb25lIHRoZSBpbXBvcnQgYWxyZWFkeSBhYm92ZS5cbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gcmVzb3VyY2VQcm9wc1tpZFByb3BdID8/ICcnO1xuXG4gICAgICAgIGNvbnN0IHByb21wdCA9IFtcbiAgICAgICAgICBwcm9tcHRQYXR0ZXJuLnJlcGxhY2UoLyUvZywgY2hhbGsuYmx1ZShpZFByb3ApKSxcbiAgICAgICAgICBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgID8gYFske2RlZmF1bHRWYWx1ZX1dYFxuICAgICAgICAgICAgOiAnKGVtcHR5IHRvIHNraXApJyxcbiAgICAgICAgXS5qb2luKCcgJykgKyAnOic7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcHJvbXB0bHkucHJvbXB0KHByb21wdCxcbiAgICAgICAgICB7IGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSwgdHJpbTogdHJ1ZSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0W2lkUHJvcF0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gQWxzbyBzdGljayB0aGlzIHByb3BlcnR5IGludG8gJ3Jlc291cmNlUHJvcHMnLCBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgYnkgYSBzdWJzZXF1ZW50IHF1ZXN0aW9uXG4gICAgICAgIC8vIChmb3IgYSBkaWZmZXJlbnQgY29tcG91bmQgaWRlbnRpZmllciB0aGF0IGludm9sdmVzIHRoZSBzYW1lIHByb3BlcnR5KS4gSnVzdCBhIHNtYWxsIFVYIGVuaGFuY2VtZW50LlxuICAgICAgICByZXNvdXJjZVByb3BzW2lkUHJvcF0gPSByZXNwb25zZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHVzZXIgZ2F2ZSBpbnB1dHMgZm9yIGFsbCB2YWx1ZXMsIHdlIGFyZSBjb21wbGV0ZVxuICAgICAgaWYgKE9iamVjdC5rZXlzKGlucHV0KS5sZW5ndGggPT09IGlkUHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coY2hhbGsuZ3JleShgU2tpcHBpbmcgaW1wb3J0IG9mICR7cmVzb3VyY2VOYW1lfWApKSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBpbnRlcm5hbCBcInJlc291cmNlIG1hcHBpbmdcIiBzdHJ1Y3R1cmUgdG8gQ2xvdWRGb3JtYXRpb24gYWNjZXB0ZWQgXCJSZXNvdXJjZXNUb0ltcG9ydFwiIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUmVzb3VyY2VzVG9JbXBvcnQocmVzb3VyY2VNYXA6IEltcG9ydE1hcCk6IFByb21pc2U8UmVzb3VyY2VzVG9JbXBvcnQ+IHtcbiAgICByZXR1cm4gcmVzb3VyY2VNYXAuaW1wb3J0UmVzb3VyY2VzLm1hcChyZXMgPT4gKHtcbiAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiByZXMubG9naWNhbElkLFxuICAgICAgUmVzb3VyY2VUeXBlOiByZXMucmVzb3VyY2VEaWZmLm5ld1Jlc291cmNlVHlwZSEsXG4gICAgICBSZXNvdXJjZUlkZW50aWZpZXI6IHJlc291cmNlTWFwLnJlc291cmNlTWFwW3Jlcy5sb2dpY2FsSWRdLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IENsb3VkRm9ybWF0aW9uIGxvZ2ljYWwgcmVzb3VyY2UgSUQgdG8gQ0RLIGNvbnN0cnVjdCB0cmVlIHBhdGhcbiAgICpcbiAgICogQHBhcmFtIGxvZ2ljYWxJZCBDbG91ZEZvcm1hdGlvbiBsb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSAodGhlIGtleSBpbiB0aGUgdGVtcGxhdGUncyBSZXNvdXJjZXMgc2VjdGlvbilcbiAgICogQHJldHVybnMgRm9yd2FyZC1zbGFzaCBzZXBhcmF0ZWQgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaW4gQ0RLIGNvbnN0cnVjdCB0cmVlLCBlLmcuIE15U3RhY2svTXlCdWNrZXQvUmVzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgZGVzY3JpYmVSZXNvdXJjZShsb2dpY2FsSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2sudGVtcGxhdGU/LlJlc291cmNlcz8uW2xvZ2ljYWxJZF0/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddID8/IGxvZ2ljYWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIENES01ldGFkYXRhIGFuZCBPdXRwdXRzIGluIHRoZSB0ZW1wbGF0ZSBzbyB0aGF0IG9ubHkgcmVzb3VyY2VzIGZvciBpbXBvcnRpbmcgYXJlIGxlZnQuXG4gICAqIEByZXR1cm5zIHRlbXBsYXRlIHdpdGggaW1wb3J0IHJlc291cmNlcyBvbmx5XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZU5vbkltcG9ydFJlc291cmNlcygpIHtcbiAgICByZXR1cm4gcmVtb3ZlTm9uSW1wb3J0UmVzb3VyY2VzKHRoaXMuc3RhY2spO1xuICB9XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYSByZXNvdXJjZSBpbiB0aGUgdGVtcGxhdGUgdGhhdCBpcyBpbXBvcnRhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0YWJsZVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBsb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9naWNhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBkZWZpbml0aW9uIGluIHRoZSBuZXcgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlRGVmaW5pdGlvbjogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlmZiBhcyByZXBvcnRlZCBieSBgY2xvdWRmb3JtYXRpb24tZGlmZmAuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZURpZmY6IFJlc291cmNlRGlmZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgYW4gaW1wb3J0IG9wZXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydE1hcCB7XG4gIC8qKlxuICAgKiBNYXBwaW5nIGxvZ2ljYWwgSURzIHRvIHBoeXNpY2FsIG5hbWVzXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZU1hcDogUmVzb3VyY2VNYXA7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWxlY3Rpb24gb2YgcmVzb3VyY2VzIHdlIGFyZSBhY3R1YWxseSBpbXBvcnRpbmdcbiAgICpcbiAgICogRm9yIGVhY2ggb2YgdGhlIHJlc291cmNlcyBpbiB0aGlzIGxpc3QsIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBlbnRyeSBpblxuICAgKiB0aGUgYHJlc291cmNlTWFwYCBtYXAuXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRSZXNvdXJjZXM6IEltcG9ydGFibGVSZXNvdXJjZVtdO1xufVxuXG5mdW5jdGlvbiBmbXRkaWN0PEE+KHhzOiBSZWNvcmQ8c3RyaW5nLCBBPikge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoeHMpLm1hcCgoW2ssIHZdKSA9PiBgJHtrfT0ke3Z9YCkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBBZGQgYSBkZWZhdWx0IGBEZWxldGlvblBvbGljeWAgcG9saWN5LlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgc2V0IHRvICdSZXRhaW4nLCB0byBsb3dlciByaXNrIG9mIHVuaW50ZW50aW9uYWxseVxuICogZGVsZXRpbmcgc3RhdGVmdWwgcmVzb3VyY2VzIGluIHRoZSBwcm9jZXNzIG9mIGltcG9ydGluZyB0byBDREsuXG4gKi9cbmZ1bmN0aW9uIGFkZERlZmF1bHREZWxldGlvblBvbGljeShyZXNvdXJjZTogYW55KTogYW55IHtcbiAgaWYgKHJlc291cmNlLkRlbGV0aW9uUG9saWN5KSB7XG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBEZWxldGlvblBvbGljeTogJ1JldGFpbicsXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJJbXBvcnRhYmxlUmVzb3VyY2VzUmVzdWx0IHtcbiAgcmVhZG9ubHkgYWRkaXRpb25zOiBJbXBvcnRhYmxlUmVzb3VyY2VbXTtcbiAgcmVhZG9ubHkgaGFzTm9uQWRkaXRpb25zOiBib29sZWFuO1xufVxuIl19
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type * as cxapi from '@aws-cdk/cx-api';
|
|
2
|
-
import type { ImportDeploymentOptions, ResourcesToImport } from './importer';
|
|
3
|
-
import { type IoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
|
|
4
|
-
import type { StackCollection } from '../cxapp/cloud-assembly';
|
|
5
|
-
import type { Deployments } from '../deployments';
|
|
6
|
-
export interface ResourceMigratorProps {
|
|
7
|
-
deployments: Deployments;
|
|
8
|
-
ioHelper: IoHelper;
|
|
9
|
-
}
|
|
10
|
-
export declare class ResourceMigrator {
|
|
11
|
-
private readonly props;
|
|
12
|
-
private readonly ioHelper;
|
|
13
|
-
constructor(props: ResourceMigratorProps);
|
|
14
|
-
/**
|
|
15
|
-
* Checks to see if a migrate.json file exists. If it does and the source is either `filepath` or
|
|
16
|
-
* is in the same environment as the stack deployment, a new stack is created and the resources are
|
|
17
|
-
* migrated to the stack using an IMPORT changeset. The normal deployment will resume after this is complete
|
|
18
|
-
* to add back in any outputs and the CDKMetadata.
|
|
19
|
-
*/
|
|
20
|
-
tryMigrateResources(stacks: StackCollection, options: ImportDeploymentOptions): Promise<void>;
|
|
21
|
-
/**
|
|
22
|
-
* Creates a new stack with just the resources to be migrated
|
|
23
|
-
*/
|
|
24
|
-
private performResourceMigration;
|
|
25
|
-
tryGetResources(environment: cxapi.Environment): Promise<ResourcesToImport | undefined>;
|
|
26
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ResourceMigrator = void 0;
|
|
4
|
-
const chalk = require("chalk");
|
|
5
|
-
const fs = require("fs-extra");
|
|
6
|
-
const importer_1 = require("./importer");
|
|
7
|
-
const private_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private");
|
|
8
|
-
const util_1 = require("../../util");
|
|
9
|
-
class ResourceMigrator {
|
|
10
|
-
constructor(props) {
|
|
11
|
-
this.props = props;
|
|
12
|
-
this.ioHelper = props.ioHelper;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Checks to see if a migrate.json file exists. If it does and the source is either `filepath` or
|
|
16
|
-
* is in the same environment as the stack deployment, a new stack is created and the resources are
|
|
17
|
-
* migrated to the stack using an IMPORT changeset. The normal deployment will resume after this is complete
|
|
18
|
-
* to add back in any outputs and the CDKMetadata.
|
|
19
|
-
*/
|
|
20
|
-
async tryMigrateResources(stacks, options) {
|
|
21
|
-
const stack = stacks.stackArtifacts[0];
|
|
22
|
-
const migrateDeployment = new importer_1.ResourceImporter(stack, {
|
|
23
|
-
deployments: this.props.deployments,
|
|
24
|
-
ioHelper: this.ioHelper,
|
|
25
|
-
});
|
|
26
|
-
const resourcesToImport = await this.tryGetResources(await migrateDeployment.resolveEnvironment());
|
|
27
|
-
if (resourcesToImport) {
|
|
28
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(`${chalk.bold(stack.displayName)}: creating stack for resource migration...`));
|
|
29
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(`${chalk.bold(stack.displayName)}: importing resources into stack...`));
|
|
30
|
-
await this.performResourceMigration(migrateDeployment, resourcesToImport, options);
|
|
31
|
-
fs.rmSync('migrate.json');
|
|
32
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(`${chalk.bold(stack.displayName)}: applying CDKMetadata and Outputs to stack (if applicable)...`));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Creates a new stack with just the resources to be migrated
|
|
37
|
-
*/
|
|
38
|
-
async performResourceMigration(migrateDeployment, resourcesToImport, options) {
|
|
39
|
-
const startDeployTime = new Date().getTime();
|
|
40
|
-
let elapsedDeployTime = 0;
|
|
41
|
-
// Initial Deployment
|
|
42
|
-
await migrateDeployment.importResourcesFromMigrate(resourcesToImport, {
|
|
43
|
-
roleArn: options.roleArn,
|
|
44
|
-
deploymentMethod: options.deploymentMethod,
|
|
45
|
-
usePreviousParameters: true,
|
|
46
|
-
rollback: options.rollback,
|
|
47
|
-
});
|
|
48
|
-
elapsedDeployTime = new Date().getTime() - startDeployTime;
|
|
49
|
-
await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5002.msg(`'\n✨ Resource migration time: ${(0, util_1.formatTime)(elapsedDeployTime)}s\n'`, {
|
|
50
|
-
duration: elapsedDeployTime,
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
async tryGetResources(environment) {
|
|
54
|
-
try {
|
|
55
|
-
const migrateFile = fs.readJsonSync('migrate.json', {
|
|
56
|
-
encoding: 'utf-8',
|
|
57
|
-
});
|
|
58
|
-
const sourceEnv = migrateFile.Source.split(':');
|
|
59
|
-
if (sourceEnv[0] === 'localfile' ||
|
|
60
|
-
(sourceEnv[4] === environment.account && sourceEnv[3] === environment.region)) {
|
|
61
|
-
return migrateFile.Resources;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
// Nothing to do
|
|
66
|
-
}
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
exports.ResourceMigrator = ResourceMigrator;
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtaWdyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwrQkFBK0I7QUFDL0IsK0JBQStCO0FBRS9CLHlDQUE4QztBQUM5Qyx5RkFBZ0c7QUFDaEcscUNBQXdDO0FBU3hDLE1BQWEsZ0JBQWdCO0lBSTNCLFlBQW1CLEtBQTRCO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBdUIsRUFBRSxPQUFnQztRQUN4RixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSwyQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztZQUNuQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFFbkcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUM7WUFDdEksTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztZQUUvSCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUVuRixFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDLENBQUM7UUFDNUosQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyx3QkFBd0IsQ0FDcEMsaUJBQW1DLEVBQ25DLGlCQUFvQyxFQUNwQyxPQUFnQztRQUVoQyxNQUFNLGVBQWUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdDLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBRTFCLHFCQUFxQjtRQUNyQixNQUFNLGlCQUFpQixDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixFQUFFO1lBQ3BFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1NBQzNCLENBQUMsQ0FBQztRQUVILGlCQUFpQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsZUFBZSxDQUFDO1FBQzNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsSUFBQSxpQkFBVSxFQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtZQUN6SCxRQUFRLEVBQUUsaUJBQWlCO1NBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsV0FBOEI7UUFDekQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUU7Z0JBQ2xELFFBQVEsRUFBRSxPQUFPO2FBQ2xCLENBQUMsQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFJLFdBQVcsQ0FBQyxNQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1RCxJQUNFLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXO2dCQUM1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQzdFLENBQUM7Z0JBQ0QsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLGdCQUFnQjtRQUNsQixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBN0VELDRDQTZFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB0eXBlIHsgSW1wb3J0RGVwbG95bWVudE9wdGlvbnMsIFJlc291cmNlc1RvSW1wb3J0IH0gZnJvbSAnLi9pbXBvcnRlcic7XG5pbXBvcnQgeyBSZXNvdXJjZUltcG9ydGVyIH0gZnJvbSAnLi9pbXBvcnRlcic7XG5pbXBvcnQgeyBJTywgdHlwZSBJb0hlbHBlciB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9pby9wcml2YXRlJztcbmltcG9ydCB7IGZvcm1hdFRpbWUgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU3RhY2tDb2xsZWN0aW9uIH0gZnJvbSAnLi4vY3hhcHAvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3ltZW50cyB9IGZyb20gJy4uL2RlcGxveW1lbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZU1pZ3JhdG9yUHJvcHMge1xuICBkZXBsb3ltZW50czogRGVwbG95bWVudHM7XG4gIGlvSGVscGVyOiBJb0hlbHBlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlc291cmNlTWlncmF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBSZXNvdXJjZU1pZ3JhdG9yUHJvcHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogUmVzb3VyY2VNaWdyYXRvclByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuaW9IZWxwZXIgPSBwcm9wcy5pb0hlbHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdG8gc2VlIGlmIGEgbWlncmF0ZS5qc29uIGZpbGUgZXhpc3RzLiBJZiBpdCBkb2VzIGFuZCB0aGUgc291cmNlIGlzIGVpdGhlciBgZmlsZXBhdGhgIG9yXG4gICAqIGlzIGluIHRoZSBzYW1lIGVudmlyb25tZW50IGFzIHRoZSBzdGFjayBkZXBsb3ltZW50LCBhIG5ldyBzdGFjayBpcyBjcmVhdGVkIGFuZCB0aGUgcmVzb3VyY2VzIGFyZVxuICAgKiBtaWdyYXRlZCB0byB0aGUgc3RhY2sgdXNpbmcgYW4gSU1QT1JUIGNoYW5nZXNldC4gVGhlIG5vcm1hbCBkZXBsb3ltZW50IHdpbGwgcmVzdW1lIGFmdGVyIHRoaXMgaXMgY29tcGxldGVcbiAgICogdG8gYWRkIGJhY2sgaW4gYW55IG91dHB1dHMgYW5kIHRoZSBDREtNZXRhZGF0YS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cnlNaWdyYXRlUmVzb3VyY2VzKHN0YWNrczogU3RhY2tDb2xsZWN0aW9uLCBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLnN0YWNrQXJ0aWZhY3RzWzBdO1xuICAgIGNvbnN0IG1pZ3JhdGVEZXBsb3ltZW50ID0gbmV3IFJlc291cmNlSW1wb3J0ZXIoc3RhY2ssIHtcbiAgICAgIGRlcGxveW1lbnRzOiB0aGlzLnByb3BzLmRlcGxveW1lbnRzLFxuICAgICAgaW9IZWxwZXI6IHRoaXMuaW9IZWxwZXIsXG4gICAgfSk7XG4gICAgY29uc3QgcmVzb3VyY2VzVG9JbXBvcnQgPSBhd2FpdCB0aGlzLnRyeUdldFJlc291cmNlcyhhd2FpdCBtaWdyYXRlRGVwbG95bWVudC5yZXNvbHZlRW52aXJvbm1lbnQoKSk7XG5cbiAgICBpZiAocmVzb3VyY2VzVG9JbXBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IGNyZWF0aW5nIHN0YWNrIGZvciByZXNvdXJjZSBtaWdyYXRpb24uLi5gKSk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBpbXBvcnRpbmcgcmVzb3VyY2VzIGludG8gc3RhY2suLi5gKSk7XG5cbiAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVJlc291cmNlTWlncmF0aW9uKG1pZ3JhdGVEZXBsb3ltZW50LCByZXNvdXJjZXNUb0ltcG9ydCwgb3B0aW9ucyk7XG5cbiAgICAgIGZzLnJtU3luYygnbWlncmF0ZS5qc29uJyk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBhcHBseWluZyBDREtNZXRhZGF0YSBhbmQgT3V0cHV0cyB0byBzdGFjayAoaWYgYXBwbGljYWJsZSkuLi5gKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgc3RhY2sgd2l0aCBqdXN0IHRoZSByZXNvdXJjZXMgdG8gYmUgbWlncmF0ZWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVJlc291cmNlTWlncmF0aW9uKFxuICAgIG1pZ3JhdGVEZXBsb3ltZW50OiBSZXNvdXJjZUltcG9ydGVyLFxuICAgIHJlc291cmNlc1RvSW1wb3J0OiBSZXNvdXJjZXNUb0ltcG9ydCxcbiAgICBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgc3RhcnREZXBsb3lUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgbGV0IGVsYXBzZWREZXBsb3lUaW1lID0gMDtcblxuICAgIC8vIEluaXRpYWwgRGVwbG95bWVudFxuICAgIGF3YWl0IG1pZ3JhdGVEZXBsb3ltZW50LmltcG9ydFJlc291cmNlc0Zyb21NaWdyYXRlKHJlc291cmNlc1RvSW1wb3J0LCB7XG4gICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICBkZXBsb3ltZW50TWV0aG9kOiBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QsXG4gICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IHRydWUsXG4gICAgICByb2xsYmFjazogb3B0aW9ucy5yb2xsYmFjayxcbiAgICB9KTtcblxuICAgIGVsYXBzZWREZXBsb3lUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydERlcGxveVRpbWU7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUwMDIubXNnKGAnXFxu4pyoICBSZXNvdXJjZSBtaWdyYXRpb24gdGltZTogJHtmb3JtYXRUaW1lKGVsYXBzZWREZXBsb3lUaW1lKX1zXFxuJ2AsIHtcbiAgICAgIGR1cmF0aW9uOiBlbGFwc2VkRGVwbG95VGltZSxcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdHJ5R2V0UmVzb3VyY2VzKGVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudCk6IFByb21pc2U8UmVzb3VyY2VzVG9JbXBvcnQgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWlncmF0ZUZpbGUgPSBmcy5yZWFkSnNvblN5bmMoJ21pZ3JhdGUuanNvbicsIHtcbiAgICAgICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNvdXJjZUVudiA9IChtaWdyYXRlRmlsZS5Tb3VyY2UgYXMgc3RyaW5nKS5zcGxpdCgnOicpO1xuICAgICAgaWYgKFxuICAgICAgICBzb3VyY2VFbnZbMF0gPT09ICdsb2NhbGZpbGUnIHx8XG4gICAgICAgIChzb3VyY2VFbnZbNF0gPT09IGVudmlyb25tZW50LmFjY291bnQgJiYgc291cmNlRW52WzNdID09PSBlbnZpcm9ubWVudC5yZWdpb24pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG1pZ3JhdGVGaWxlLlJlc291cmNlcztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGRvXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4iXX0=
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./stack-activity-monitor"), exports);
|
|
18
|
-
__exportStar(require("./stack-event-poller"), exports);
|
|
19
|
-
__exportStar(require("./stack-status"), exports);
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkRBQXlDO0FBQ3pDLHVEQUFxQztBQUNyQyxpREFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N0YWNrLWFjdGl2aXR5LW1vbml0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFjay1ldmVudC1wb2xsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFjay1zdGF0dXMnO1xuIl19
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import type { CloudFormationStackArtifact } from '@aws-cdk/cx-api';
|
|
2
|
-
import type { ICloudFormationClient } from '../aws-auth';
|
|
3
|
-
import { type IoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
|
|
4
|
-
export interface StackActivityMonitorProps {
|
|
5
|
-
/**
|
|
6
|
-
* The CloudFormation client
|
|
7
|
-
*/
|
|
8
|
-
readonly cfn: ICloudFormationClient;
|
|
9
|
-
/**
|
|
10
|
-
* The IoHelper used for messaging
|
|
11
|
-
*/
|
|
12
|
-
readonly ioHelper: IoHelper;
|
|
13
|
-
/**
|
|
14
|
-
* The stack artifact that is getting deployed
|
|
15
|
-
*/
|
|
16
|
-
readonly stack: CloudFormationStackArtifact;
|
|
17
|
-
/**
|
|
18
|
-
* The name of the Stack that is getting deployed
|
|
19
|
-
*/
|
|
20
|
-
readonly stackName: string;
|
|
21
|
-
/**
|
|
22
|
-
* Total number of resources to update
|
|
23
|
-
*
|
|
24
|
-
* Used to calculate a progress bar.
|
|
25
|
-
*
|
|
26
|
-
* @default - No progress reporting.
|
|
27
|
-
*/
|
|
28
|
-
readonly resourcesTotal?: number;
|
|
29
|
-
/**
|
|
30
|
-
* Creation time of the change set
|
|
31
|
-
*
|
|
32
|
-
* This will be used to filter events, only showing those from after the change
|
|
33
|
-
* set creation time.
|
|
34
|
-
*
|
|
35
|
-
* It is recommended to use this, otherwise the filtering will be subject
|
|
36
|
-
* to clock drift between local and cloud machines.
|
|
37
|
-
*
|
|
38
|
-
* @default - local machine's current time
|
|
39
|
-
*/
|
|
40
|
-
readonly changeSetCreationTime?: Date;
|
|
41
|
-
/**
|
|
42
|
-
* Time to wait between fetching new activities.
|
|
43
|
-
*
|
|
44
|
-
* Must wait a reasonable amount of time between polls, since we need to consider CloudFormation API limits
|
|
45
|
-
*
|
|
46
|
-
* @default 2_000
|
|
47
|
-
*/
|
|
48
|
-
readonly pollingInterval?: number;
|
|
49
|
-
}
|
|
50
|
-
export declare class StackActivityMonitor {
|
|
51
|
-
/**
|
|
52
|
-
* The poller used to read stack events
|
|
53
|
-
*/
|
|
54
|
-
private readonly poller;
|
|
55
|
-
/**
|
|
56
|
-
* Fetch new activity every 1 second
|
|
57
|
-
* Printers can decide to update a view less frequently if desired
|
|
58
|
-
*/
|
|
59
|
-
private readonly pollingInterval;
|
|
60
|
-
readonly errors: string[];
|
|
61
|
-
private monitorId?;
|
|
62
|
-
private readonly progressMonitor;
|
|
63
|
-
/**
|
|
64
|
-
* Current tick timer
|
|
65
|
-
*/
|
|
66
|
-
private tickTimer?;
|
|
67
|
-
/**
|
|
68
|
-
* Set to the activity of reading the current events
|
|
69
|
-
*/
|
|
70
|
-
private readPromise?;
|
|
71
|
-
private readonly ioHelper;
|
|
72
|
-
private readonly stackName;
|
|
73
|
-
private readonly stack;
|
|
74
|
-
constructor({ cfn, ioHelper, stack, stackName, resourcesTotal, changeSetCreationTime, pollingInterval, }: StackActivityMonitorProps);
|
|
75
|
-
start(): Promise<this>;
|
|
76
|
-
stop(): Promise<void>;
|
|
77
|
-
private scheduleNextTick;
|
|
78
|
-
private tick;
|
|
79
|
-
private findMetadataFor;
|
|
80
|
-
/**
|
|
81
|
-
* Reads all new events from the stack history
|
|
82
|
-
*
|
|
83
|
-
* The events are returned in reverse chronological order; we continue to the next page if we
|
|
84
|
-
* see a next page and the last event in the page is new to us (and within the time window).
|
|
85
|
-
* haven't seen the final event
|
|
86
|
-
*/
|
|
87
|
-
private readNewEvents;
|
|
88
|
-
/**
|
|
89
|
-
* Perform a final poll to the end and flush out all events to the printer
|
|
90
|
-
*
|
|
91
|
-
* Finish any poll currently in progress, then do a final one until we've
|
|
92
|
-
* reached the last page.
|
|
93
|
-
*/
|
|
94
|
-
private finalPollToEnd;
|
|
95
|
-
/**
|
|
96
|
-
* Formats a stack activity into a basic string
|
|
97
|
-
*/
|
|
98
|
-
private formatActivity;
|
|
99
|
-
private checkForErrors;
|
|
100
|
-
}
|