@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,72 @@
|
|
|
1
|
+
import type { WorkNode, StackNode, AssetBuildNode, AssetPublishNode } from './work-graph-types';
|
|
2
|
+
import { type IoHelper } from '../io/private';
|
|
3
|
+
export type Concurrency = number | Record<WorkNode['type'], number>;
|
|
4
|
+
export declare class WorkGraph {
|
|
5
|
+
readonly nodes: Record<string, WorkNode>;
|
|
6
|
+
private readonly readyPool;
|
|
7
|
+
private readonly lazyDependencies;
|
|
8
|
+
private readonly ioHelper;
|
|
9
|
+
error?: Error;
|
|
10
|
+
constructor(nodes: Record<string, WorkNode>, ioHelper: IoHelper);
|
|
11
|
+
addNodes(...nodes: WorkNode[]): void;
|
|
12
|
+
removeNode(nodeId: string | WorkNode): void;
|
|
13
|
+
/**
|
|
14
|
+
* Return all nodes of a given type
|
|
15
|
+
*/
|
|
16
|
+
nodesOfType<T extends WorkNode['type']>(type: T): Extract<WorkNode, {
|
|
17
|
+
type: T;
|
|
18
|
+
}>[];
|
|
19
|
+
/**
|
|
20
|
+
* Return all nodes that depend on a given node
|
|
21
|
+
*/
|
|
22
|
+
dependees(nodeId: string | WorkNode): WorkNode[];
|
|
23
|
+
/**
|
|
24
|
+
* Add a dependency, that may come before or after the nodes involved
|
|
25
|
+
*/
|
|
26
|
+
addDependency(fromId: string, toId: string): void;
|
|
27
|
+
tryGetNode(id: string): WorkNode | undefined;
|
|
28
|
+
node(id: string): WorkNode;
|
|
29
|
+
absorb(graph: WorkGraph): void;
|
|
30
|
+
private hasFailed;
|
|
31
|
+
doParallel(concurrency: Concurrency, actions: WorkGraphActions): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Return the set of unblocked nodes
|
|
34
|
+
*/
|
|
35
|
+
ready(): Promise<ReadonlyArray<WorkNode>>;
|
|
36
|
+
private forAllArtifacts;
|
|
37
|
+
private done;
|
|
38
|
+
private deployed;
|
|
39
|
+
private failed;
|
|
40
|
+
toString(): string;
|
|
41
|
+
/**
|
|
42
|
+
* Ensure all dependencies actually exist. This protects against scenarios such as the following:
|
|
43
|
+
* StackA depends on StackB, but StackB is not selected to deploy. The dependency is redundant
|
|
44
|
+
* and will be dropped.
|
|
45
|
+
* This assumes the manifest comes uncorrupted so we will not fail if a dependency is not found.
|
|
46
|
+
*/
|
|
47
|
+
removeUnavailableDependencies(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Remove all asset publishing steps for assets that are already published, and then build
|
|
50
|
+
* that aren't used anymore.
|
|
51
|
+
*
|
|
52
|
+
* Do this in parallel, because there may be a lot of assets in an application (seen in practice: >100 assets)
|
|
53
|
+
*/
|
|
54
|
+
removeUnnecessaryAssets(isUnnecessary: (x: AssetPublishNode) => Promise<boolean>): Promise<void>;
|
|
55
|
+
private updateReadyPool;
|
|
56
|
+
private skipRest;
|
|
57
|
+
/**
|
|
58
|
+
* Find cycles in a graph
|
|
59
|
+
*
|
|
60
|
+
* Not the fastest, but effective and should be rare
|
|
61
|
+
*/
|
|
62
|
+
findCycle(): string[] | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Whether the `end` node is reachable from the `start` node, following the dependency arrows
|
|
65
|
+
*/
|
|
66
|
+
reachable(start: string, end: string): boolean;
|
|
67
|
+
}
|
|
68
|
+
export interface WorkGraphActions {
|
|
69
|
+
deployStack: (stackNode: StackNode) => Promise<void>;
|
|
70
|
+
buildAsset: (assetNode: AssetBuildNode) => Promise<void>;
|
|
71
|
+
publishAsset: (assetNode: AssetPublishNode) => Promise<void>;
|
|
72
|
+
}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkGraph = void 0;
|
|
4
|
+
const work_graph_types_1 = require("./work-graph-types");
|
|
5
|
+
const util_1 = require("../../util");
|
|
6
|
+
const private_1 = require("../io/private");
|
|
7
|
+
const toolkit_error_1 = require("../toolkit-error");
|
|
8
|
+
class WorkGraph {
|
|
9
|
+
nodes;
|
|
10
|
+
readyPool = [];
|
|
11
|
+
lazyDependencies = new Map();
|
|
12
|
+
ioHelper;
|
|
13
|
+
error;
|
|
14
|
+
constructor(nodes, ioHelper) {
|
|
15
|
+
this.nodes = { ...nodes };
|
|
16
|
+
this.ioHelper = ioHelper;
|
|
17
|
+
}
|
|
18
|
+
addNodes(...nodes) {
|
|
19
|
+
for (const node of nodes) {
|
|
20
|
+
if (this.nodes[node.id]) {
|
|
21
|
+
throw new toolkit_error_1.ToolkitError(`Duplicate use of node id: ${node.id}`);
|
|
22
|
+
}
|
|
23
|
+
const ld = this.lazyDependencies.get(node.id);
|
|
24
|
+
if (ld) {
|
|
25
|
+
for (const x of ld) {
|
|
26
|
+
node.dependencies.add(x);
|
|
27
|
+
}
|
|
28
|
+
this.lazyDependencies.delete(node.id);
|
|
29
|
+
}
|
|
30
|
+
this.nodes[node.id] = node;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
removeNode(nodeId) {
|
|
34
|
+
const id = typeof nodeId === 'string' ? nodeId : nodeId.id;
|
|
35
|
+
const removedNode = this.nodes[id];
|
|
36
|
+
this.lazyDependencies.delete(id);
|
|
37
|
+
delete this.nodes[id];
|
|
38
|
+
if (removedNode) {
|
|
39
|
+
for (const node of Object.values(this.nodes)) {
|
|
40
|
+
node.dependencies.delete(removedNode.id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Return all nodes of a given type
|
|
46
|
+
*/
|
|
47
|
+
nodesOfType(type) {
|
|
48
|
+
return Object.values(this.nodes).filter(n => n.type === type);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Return all nodes that depend on a given node
|
|
52
|
+
*/
|
|
53
|
+
dependees(nodeId) {
|
|
54
|
+
const id = typeof nodeId === 'string' ? nodeId : nodeId.id;
|
|
55
|
+
return Object.values(this.nodes).filter(n => n.dependencies.has(id));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Add a dependency, that may come before or after the nodes involved
|
|
59
|
+
*/
|
|
60
|
+
addDependency(fromId, toId) {
|
|
61
|
+
const node = this.nodes[fromId];
|
|
62
|
+
if (node) {
|
|
63
|
+
node.dependencies.add(toId);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
let lazyDeps = this.lazyDependencies.get(fromId);
|
|
67
|
+
if (!lazyDeps) {
|
|
68
|
+
lazyDeps = [];
|
|
69
|
+
this.lazyDependencies.set(fromId, lazyDeps);
|
|
70
|
+
}
|
|
71
|
+
lazyDeps.push(toId);
|
|
72
|
+
}
|
|
73
|
+
tryGetNode(id) {
|
|
74
|
+
return this.nodes[id];
|
|
75
|
+
}
|
|
76
|
+
node(id) {
|
|
77
|
+
const ret = this.nodes[id];
|
|
78
|
+
if (!ret) {
|
|
79
|
+
throw new toolkit_error_1.ToolkitError(`No node with id ${id} among ${Object.keys(this.nodes)}`);
|
|
80
|
+
}
|
|
81
|
+
return ret;
|
|
82
|
+
}
|
|
83
|
+
absorb(graph) {
|
|
84
|
+
this.addNodes(...Object.values(graph.nodes));
|
|
85
|
+
}
|
|
86
|
+
hasFailed() {
|
|
87
|
+
return Object.values(this.nodes).some((n) => n.deploymentState === work_graph_types_1.DeploymentState.FAILED);
|
|
88
|
+
}
|
|
89
|
+
doParallel(concurrency, actions) {
|
|
90
|
+
return this.forAllArtifacts(concurrency, async (x) => {
|
|
91
|
+
switch (x.type) {
|
|
92
|
+
case 'stack':
|
|
93
|
+
await actions.deployStack(x);
|
|
94
|
+
break;
|
|
95
|
+
case 'asset-build':
|
|
96
|
+
await actions.buildAsset(x);
|
|
97
|
+
break;
|
|
98
|
+
case 'asset-publish':
|
|
99
|
+
await actions.publishAsset(x);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Return the set of unblocked nodes
|
|
106
|
+
*/
|
|
107
|
+
async ready() {
|
|
108
|
+
await this.updateReadyPool();
|
|
109
|
+
return this.readyPool;
|
|
110
|
+
}
|
|
111
|
+
forAllArtifacts(n, fn) {
|
|
112
|
+
const graph = this;
|
|
113
|
+
// If 'n' is a number, we limit all concurrency equally (effectively we will be using totalMax)
|
|
114
|
+
// If 'n' is a record, we limit each job independently (effectively we will be using max)
|
|
115
|
+
const max = typeof n === 'number' ?
|
|
116
|
+
{
|
|
117
|
+
'asset-build': n,
|
|
118
|
+
'asset-publish': n,
|
|
119
|
+
'stack': n,
|
|
120
|
+
} : n;
|
|
121
|
+
const totalMax = typeof n === 'number' ? n : sum(Object.values(n));
|
|
122
|
+
return new Promise((ok, fail) => {
|
|
123
|
+
let active = {
|
|
124
|
+
'asset-build': 0,
|
|
125
|
+
'asset-publish': 0,
|
|
126
|
+
'stack': 0,
|
|
127
|
+
};
|
|
128
|
+
function totalActive() {
|
|
129
|
+
return sum(Object.values(active));
|
|
130
|
+
}
|
|
131
|
+
start();
|
|
132
|
+
function start() {
|
|
133
|
+
graph.updateReadyPool().then(() => {
|
|
134
|
+
for (let i = 0; i < graph.readyPool.length;) {
|
|
135
|
+
const node = graph.readyPool[i];
|
|
136
|
+
if (active[node.type] < max[node.type] && totalActive() < totalMax) {
|
|
137
|
+
graph.readyPool.splice(i, 1);
|
|
138
|
+
startOne(node);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
i += 1;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (totalActive() === 0) {
|
|
145
|
+
if (graph.done()) {
|
|
146
|
+
ok();
|
|
147
|
+
}
|
|
148
|
+
// wait for other active deploys to finish before failing
|
|
149
|
+
if (graph.hasFailed()) {
|
|
150
|
+
fail(graph.error);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}).catch((e) => {
|
|
154
|
+
fail(e);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function startOne(x) {
|
|
158
|
+
x.deploymentState = work_graph_types_1.DeploymentState.DEPLOYING;
|
|
159
|
+
active[x.type]++;
|
|
160
|
+
void fn(x)
|
|
161
|
+
.finally(() => {
|
|
162
|
+
active[x.type]--;
|
|
163
|
+
})
|
|
164
|
+
.then(() => {
|
|
165
|
+
graph.deployed(x);
|
|
166
|
+
start();
|
|
167
|
+
}).catch((err) => {
|
|
168
|
+
// By recording the failure immediately as the queued task exits, we prevent the next
|
|
169
|
+
// queued task from starting.
|
|
170
|
+
graph.failed(x, err);
|
|
171
|
+
start();
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
done() {
|
|
177
|
+
return Object.values(this.nodes).every((n) => work_graph_types_1.DeploymentState.COMPLETED === n.deploymentState);
|
|
178
|
+
}
|
|
179
|
+
deployed(node) {
|
|
180
|
+
node.deploymentState = work_graph_types_1.DeploymentState.COMPLETED;
|
|
181
|
+
}
|
|
182
|
+
failed(node, error) {
|
|
183
|
+
this.error = error;
|
|
184
|
+
node.deploymentState = work_graph_types_1.DeploymentState.FAILED;
|
|
185
|
+
this.skipRest();
|
|
186
|
+
this.readyPool.splice(0);
|
|
187
|
+
}
|
|
188
|
+
toString() {
|
|
189
|
+
return [
|
|
190
|
+
'digraph D {',
|
|
191
|
+
...Object.entries(this.nodes).flatMap(([id, node]) => renderNode(id, node)),
|
|
192
|
+
'}',
|
|
193
|
+
].join('\n');
|
|
194
|
+
function renderNode(id, node) {
|
|
195
|
+
const ret = [];
|
|
196
|
+
if (node.deploymentState === work_graph_types_1.DeploymentState.COMPLETED) {
|
|
197
|
+
ret.push(` ${gv(id, { style: 'filled', fillcolor: 'yellow', comment: node.note })};`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
ret.push(` ${gv(id, { comment: node.note })};`);
|
|
201
|
+
}
|
|
202
|
+
for (const dep of node.dependencies) {
|
|
203
|
+
ret.push(` ${gv(id)} -> ${gv(dep)};`);
|
|
204
|
+
}
|
|
205
|
+
return ret;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Ensure all dependencies actually exist. This protects against scenarios such as the following:
|
|
210
|
+
* StackA depends on StackB, but StackB is not selected to deploy. The dependency is redundant
|
|
211
|
+
* and will be dropped.
|
|
212
|
+
* This assumes the manifest comes uncorrupted so we will not fail if a dependency is not found.
|
|
213
|
+
*/
|
|
214
|
+
removeUnavailableDependencies() {
|
|
215
|
+
for (const node of Object.values(this.nodes)) {
|
|
216
|
+
const removeDeps = Array.from(node.dependencies).filter((dep) => this.nodes[dep] === undefined);
|
|
217
|
+
removeDeps.forEach((d) => {
|
|
218
|
+
node.dependencies.delete(d);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Remove all asset publishing steps for assets that are already published, and then build
|
|
224
|
+
* that aren't used anymore.
|
|
225
|
+
*
|
|
226
|
+
* Do this in parallel, because there may be a lot of assets in an application (seen in practice: >100 assets)
|
|
227
|
+
*/
|
|
228
|
+
async removeUnnecessaryAssets(isUnnecessary) {
|
|
229
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg('Checking for previously published assets'));
|
|
230
|
+
const publishes = this.nodesOfType('asset-publish');
|
|
231
|
+
const classifiedNodes = await (0, util_1.parallelPromises)(8, publishes.map((assetNode) => async () => [assetNode, await isUnnecessary(assetNode)]));
|
|
232
|
+
const alreadyPublished = classifiedNodes.filter(([_, unnecessary]) => unnecessary).map(([assetNode, _]) => assetNode);
|
|
233
|
+
for (const assetNode of alreadyPublished) {
|
|
234
|
+
this.removeNode(assetNode);
|
|
235
|
+
}
|
|
236
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg(`${publishes.length} total assets, ${publishes.length - alreadyPublished.length} still need to be published`));
|
|
237
|
+
// Now also remove any asset build steps that don't have any dependencies on them anymore
|
|
238
|
+
const unusedBuilds = this.nodesOfType('asset-build').filter(build => this.dependees(build).length === 0);
|
|
239
|
+
for (const unusedBuild of unusedBuilds) {
|
|
240
|
+
this.removeNode(unusedBuild);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async updateReadyPool() {
|
|
244
|
+
const activeCount = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.DEPLOYING).length;
|
|
245
|
+
const pendingCount = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.PENDING).length;
|
|
246
|
+
const newlyReady = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.PENDING &&
|
|
247
|
+
Array.from(x.dependencies).every((id) => this.node(id).deploymentState === work_graph_types_1.DeploymentState.COMPLETED));
|
|
248
|
+
// Add newly available nodes to the ready pool
|
|
249
|
+
for (const node of newlyReady) {
|
|
250
|
+
node.deploymentState = work_graph_types_1.DeploymentState.QUEUED;
|
|
251
|
+
this.readyPool.push(node);
|
|
252
|
+
}
|
|
253
|
+
// Remove nodes from the ready pool that have already started deploying
|
|
254
|
+
retainOnly(this.readyPool, (node) => node.deploymentState === work_graph_types_1.DeploymentState.QUEUED);
|
|
255
|
+
// Sort by reverse priority
|
|
256
|
+
this.readyPool.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
257
|
+
if (this.readyPool.length === 0 && activeCount === 0 && pendingCount > 0) {
|
|
258
|
+
const cycle = this.findCycle() ?? ['No cycle found!'];
|
|
259
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_TRACE.msg(`Cycle ${cycle.join(' -> ')} in graph ${this}`));
|
|
260
|
+
throw new toolkit_error_1.ToolkitError(`Unable to make progress anymore, dependency cycle between remaining artifacts: ${cycle.join(' -> ')} (run with -vv for full graph)`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
skipRest() {
|
|
264
|
+
for (const node of Object.values(this.nodes)) {
|
|
265
|
+
if ([work_graph_types_1.DeploymentState.QUEUED, work_graph_types_1.DeploymentState.PENDING].includes(node.deploymentState)) {
|
|
266
|
+
node.deploymentState = work_graph_types_1.DeploymentState.SKIPPED;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Find cycles in a graph
|
|
272
|
+
*
|
|
273
|
+
* Not the fastest, but effective and should be rare
|
|
274
|
+
*/
|
|
275
|
+
findCycle() {
|
|
276
|
+
const seen = new Set();
|
|
277
|
+
const self = this;
|
|
278
|
+
for (const nodeId of Object.keys(this.nodes)) {
|
|
279
|
+
const cycle = recurse(nodeId, [nodeId]);
|
|
280
|
+
if (cycle) {
|
|
281
|
+
return cycle;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return undefined;
|
|
285
|
+
function recurse(nodeId, path) {
|
|
286
|
+
if (seen.has(nodeId)) {
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
for (const dep of self.nodes[nodeId].dependencies ?? []) {
|
|
291
|
+
const index = path.indexOf(dep);
|
|
292
|
+
if (index > -1) {
|
|
293
|
+
return [...path.slice(index), dep];
|
|
294
|
+
}
|
|
295
|
+
const cycle = recurse(dep, [...path, dep]);
|
|
296
|
+
if (cycle) {
|
|
297
|
+
return cycle;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
seen.add(nodeId);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Whether the `end` node is reachable from the `start` node, following the dependency arrows
|
|
309
|
+
*/
|
|
310
|
+
reachable(start, end) {
|
|
311
|
+
const seen = new Set();
|
|
312
|
+
const self = this;
|
|
313
|
+
return recurse(start);
|
|
314
|
+
function recurse(current) {
|
|
315
|
+
if (seen.has(current)) {
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
seen.add(current);
|
|
319
|
+
if (current === end) {
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
for (const dep of self.nodes[current].dependencies) {
|
|
323
|
+
if (recurse(dep)) {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
exports.WorkGraph = WorkGraph;
|
|
332
|
+
function sum(xs) {
|
|
333
|
+
let ret = 0;
|
|
334
|
+
for (const x of xs) {
|
|
335
|
+
ret += x;
|
|
336
|
+
}
|
|
337
|
+
return ret;
|
|
338
|
+
}
|
|
339
|
+
function retainOnly(xs, pred) {
|
|
340
|
+
xs.splice(0, xs.length, ...xs.filter(pred));
|
|
341
|
+
}
|
|
342
|
+
function gv(id, attrs) {
|
|
343
|
+
const attrString = Object.entries(attrs ?? {}).flatMap(([k, v]) => v !== undefined ? [`${k}="${v}"`] : []).join(',');
|
|
344
|
+
return attrString ? `"${simplifyId(id)}" [${attrString}]` : `"${simplifyId(id)}"`;
|
|
345
|
+
}
|
|
346
|
+
function simplifyId(id) {
|
|
347
|
+
return id.replace(/([0-9a-f]{6})[0-9a-f]{6,}/g, '$1');
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1ncmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndvcmstZ3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseURBQXFEO0FBQ3JELHFDQUE4QztBQUM5QywyQ0FBa0Q7QUFDbEQsb0RBQWdEO0FBR2hELE1BQWEsU0FBUztJQUNKLEtBQUssQ0FBMkI7SUFDL0IsU0FBUyxHQUFvQixFQUFFLENBQUM7SUFDaEMsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDL0MsUUFBUSxDQUFXO0lBRTdCLEtBQUssQ0FBUztJQUVyQixZQUFtQixLQUErQixFQUFFLFFBQWtCO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFTSxRQUFRLENBQUMsR0FBRyxLQUFpQjtRQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLDRCQUFZLENBQUMsNkJBQTZCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7WUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNQLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7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LENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELFNBQVMsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUEwQztJQUNoRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckgsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO0FBQ3BGLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxFQUFVO0lBQzVCLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXb3JrTm9kZSwgU3RhY2tOb2RlLCBBc3NldEJ1aWxkTm9kZSwgQXNzZXRQdWJsaXNoTm9kZSB9IGZyb20gJy4vd29yay1ncmFwaC10eXBlcyc7XG5pbXBvcnQgeyBEZXBsb3ltZW50U3RhdGUgfSBmcm9tICcuL3dvcmstZ3JhcGgtdHlwZXMnO1xuaW1wb3J0IHsgcGFyYWxsZWxQcm9taXNlcyB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgSU8sIHR5cGUgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uL3Rvb2xraXQtZXJyb3InO1xuZXhwb3J0IHR5cGUgQ29uY3VycmVuY3kgPSBudW1iZXIgfCBSZWNvcmQ8V29ya05vZGVbJ3R5cGUnXSwgbnVtYmVyPjtcblxuZXhwb3J0IGNsYXNzIFdvcmtHcmFwaCB7XG4gIHB1YmxpYyByZWFkb25seSBub2RlczogUmVjb3JkPHN0cmluZywgV29ya05vZGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5UG9vbDogQXJyYXk8V29ya05vZGU+ID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbGF6eURlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgcHVibGljIGVycm9yPzogRXJyb3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBXb3JrTm9kZT4sIGlvSGVscGVyOiBJb0hlbHBlcikge1xuICAgIHRoaXMubm9kZXMgPSB7IC4uLm5vZGVzIH07XG4gICAgdGhpcy5pb0hlbHBlciA9IGlvSGVscGVyO1xuICB9XG5cbiAgcHVibGljIGFkZE5vZGVzKC4uLm5vZGVzOiBXb3JrTm9kZVtdKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBpZiAodGhpcy5ub2Rlc1tub2RlLmlkXSkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBEdXBsaWNhdGUgdXNlIG9mIG5vZGUgaWQ6ICR7bm9kZS5pZH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGQgPSB0aGlzLmxhenlEZXBlbmRlbmNpZXMuZ2V0KG5vZGUuaWQpO1xuICAgICAgaWYgKGxkKSB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBsZCkge1xuICAgICAgICAgIG5vZGUuZGVwZW5kZW5jaWVzLmFkZCh4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhenlEZXBlbmRlbmNpZXMuZGVsZXRlKG5vZGUuaWQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5vZGVzW25vZGUuaWRdID0gbm9kZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTm9kZShub2RlSWQ6IHN0cmluZyB8IFdvcmtOb2RlKSB7XG4gICAgY29uc3QgaWQgPSB0eXBlb2Ygbm9kZUlkID09PSAnc3RyaW5nJyA/IG5vZGVJZCA6IG5vZGVJZC5pZDtcbiAgICBjb25zdCByZW1vdmVkTm9kZSA9IHRoaXMubm9kZXNbaWRdO1xuXG4gICAgdGhpcy5sYXp5RGVwZW5kZW5jaWVzLmRlbGV0ZShpZCk7XG4gICAgZGVsZXRlIHRoaXMubm9kZXNbaWRdO1xuXG4gICAgaWYgKHJlbW92ZWROb2RlKSB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLm5vZGVzKSkge1xuICAgICAgICBub2RlLmRlcGVuZGVuY2llcy5kZWxldGUocmVtb3ZlZE5vZGUuaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIG5vZGVzIG9mIGEgZ2l2ZW4gdHlwZVxuICAgKi9cbiAgcHVibGljIG5vZGVzT2ZUeXBlPFQgZXh0ZW5kcyBXb3JrTm9kZVsndHlwZSddPih0eXBlOiBUKTogRXh0cmFjdDxXb3JrTm9kZSwgeyB0eXBlOiBUIH0+W10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLmZpbHRlcihuID0+IG4udHlwZSA9PT0gdHlwZSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbGwgbm9kZXMgdGhhdCBkZXBlbmQgb24gYSBnaXZlbiBub2RlXG4gICAqL1xuICBwdWJsaWMgZGVwZW5kZWVzKG5vZGVJZDogc3RyaW5nIHwgV29ya05vZGUpIHtcbiAgICBjb25zdCBpZCA9IHR5cGVvZiBub2RlSWQgPT09ICdzdHJpbmcnID8gbm9kZUlkIDogbm9kZUlkLmlkO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLmZpbHRlcihuID0+IG4uZGVwZW5kZW5jaWVzLmhhcyhpZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGRlcGVuZGVuY3ksIHRoYXQgbWF5IGNvbWUgYmVmb3JlIG9yIGFmdGVyIHRoZSBub2RlcyBpbnZvbHZlZFxuICAgKi9cbiAgcHVibGljIGFkZERlcGVuZGVuY3koZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW2Zyb21JZF07XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIG5vZGUuZGVwZW5kZW5jaWVzLmFkZCh0b0lkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGxhenlEZXBzID0gdGhpcy5sYXp5RGVwZW5kZW5jaWVzLmdldChmcm9tSWQpO1xuICAgIGlmICghbGF6eURlcHMpIHtcbiAgICAgIGxhenlEZXBzID0gW107XG4gICAgICB0aGlzLmxhenlEZXBlbmRlbmNpZXMuc2V0KGZyb21JZCwgbGF6eURlcHMpO1xuICAgIH1cbiAgICBsYXp5RGVwcy5wdXNoKHRvSWQpO1xuICB9XG5cbiAgcHVibGljIHRyeUdldE5vZGUoaWQ6IHN0cmluZyk6IFdvcmtOb2RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlc1tpZF07XG4gIH1cblxuICBwdWJsaWMgbm9kZShpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5ub2Rlc1tpZF07XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYE5vIG5vZGUgd2l0aCBpZCAke2lkfSBhbW9uZyAke09iamVjdC5rZXlzKHRoaXMubm9kZXMpfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGFic29yYihncmFwaDogV29ya0dyYXBoKSB7XG4gICAgdGhpcy5hZGROb2RlcyguLi5PYmplY3QudmFsdWVzKGdyYXBoLm5vZGVzKSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0ZhaWxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLm5vZGVzKS5zb21lKChuKSA9PiBuLmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLkZBSUxFRCk7XG4gIH1cblxuICBwdWJsaWMgZG9QYXJhbGxlbChjb25jdXJyZW5jeTogQ29uY3VycmVuY3ksIGFjdGlvbnM6IFdvcmtHcmFwaEFjdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JBbGxBcnRpZmFjdHMoY29uY3VycmVuY3ksIGFzeW5jICh4OiBXb3JrTm9kZSkgPT4ge1xuICAgICAgc3dpdGNoICh4LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RhY2snOlxuICAgICAgICAgIGF3YWl0IGFjdGlvbnMuZGVwbG95U3RhY2soeCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Fzc2V0LWJ1aWxkJzpcbiAgICAgICAgICBhd2FpdCBhY3Rpb25zLmJ1aWxkQXNzZXQoeCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Fzc2V0LXB1Ymxpc2gnOlxuICAgICAgICAgIGF3YWl0IGFjdGlvbnMucHVibGlzaEFzc2V0KHgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2V0IG9mIHVuYmxvY2tlZCBub2Rlc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWR5KCk6IFByb21pc2U8UmVhZG9ubHlBcnJheTxXb3JrTm9kZT4+IHtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVJlYWR5UG9vbCgpO1xuICAgIHJldHVybiB0aGlzLnJlYWR5UG9vbDtcbiAgfVxuXG4gIHByaXZhdGUgZm9yQWxsQXJ0aWZhY3RzKG46IENvbmN1cnJlbmN5LCBmbjogKHg6IFdvcmtOb2RlKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ3JhcGggPSB0aGlzO1xuXG4gICAgLy8gSWYgJ24nIGlzIGEgbnVtYmVyLCB3ZSBsaW1pdCBhbGwgY29uY3VycmVuY3kgZXF1YWxseSAoZWZmZWN0aXZlbHkgd2Ugd2lsbCBiZSB1c2luZyB0b3RhbE1heClcbiAgICAvLyBJZiAnbicgaXMgYSByZWNvcmQsIHdlIGxpbWl0IGVhY2ggam9iIGluZGVwZW5kZW50bHkgKGVmZmVjdGl2ZWx5IHdlIHdpbGwgYmUgdXNpbmcgbWF4KVxuICAgIGNvbnN0IG1heDogUmVjb3JkPFdvcmtOb2RlWyd0eXBlJ10sIG51bWJlcj4gPSB0eXBlb2YgbiA9PT0gJ251bWJlcicgP1xuICAgICAge1xuICAgICAgICAnYXNzZXQtYnVpbGQnOiBuLFxuICAgICAgICAnYXNzZXQtcHVibGlzaCc6IG4sXG4gICAgICAgICdzdGFjayc6IG4sXG4gICAgICB9IDogbjtcbiAgICBjb25zdCB0b3RhbE1heCA9IHR5cGVvZiBuID09PSAnbnVtYmVyJyA/IG4gOiBzdW0oT2JqZWN0LnZhbHVlcyhuKSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBmYWlsKSA9PiB7XG4gICAgICBsZXQgYWN0aXZlOiBSZWNvcmQ8V29ya05vZGVbJ3R5cGUnXSwgbnVtYmVyPiA9IHtcbiAgICAgICAgJ2Fzc2V0LWJ1aWxkJzogMCxcbiAgICAgICAgJ2Fzc2V0LXB1Ymxpc2gnOiAwLFxuICAgICAgICAnc3RhY2snOiAwLFxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIHRvdGFsQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gc3VtKE9iamVjdC52YWx1ZXMoYWN0aXZlKSk7XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0KCk7XG5cbiAgICAgIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgICBncmFwaC51cGRhdGVSZWFkeVBvb2woKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyYXBoLnJlYWR5UG9vbC5sZW5ndGg7ICkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGdyYXBoLnJlYWR5UG9vbFtpXTtcblxuICAgICAgICAgICAgaWYgKGFjdGl2ZVtub2RlLnR5cGVdIDwgbWF4W25vZGUudHlwZV0gJiYgdG90YWxBY3RpdmUoKSA8IHRvdGFsTWF4KSB7XG4gICAgICAgICAgICAgIGdyYXBoLnJlYWR5UG9vbC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgIHN0YXJ0T25lKG5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0b3RhbEFjdGl2ZSgpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoZ3JhcGguZG9uZSgpKSB7XG4gICAgICAgICAgICAgIG9rKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3YWl0IGZvciBvdGhlciBhY3RpdmUgZGVwbG95cyB0byBmaW5pc2ggYmVmb3JlIGZhaWxpbmdcbiAgICAgICAgICAgIGlmIChncmFwaC5oYXNGYWlsZWQoKSkge1xuICAgICAgICAgICAgICBmYWlsKGdyYXBoLmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHN0YXJ0T25lKHg6IFdvcmtOb2RlKSB7XG4gICAgICAgIHguZGVwbG95bWVudFN0YXRlID0gRGVwbG95bWVudFN0YXRlLkRFUExPWUlORztcbiAgICAgICAgYWN0aXZlW3gudHlwZV0rKztcbiAgICAgICAgdm9pZCBmbih4KVxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIGFjdGl2ZVt4LnR5cGVdLS07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBncmFwaC5kZXBsb3llZCh4KTtcbiAgICAgICAgICAgIHN0YXJ0KCk7XG4gICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgLy8gQnkgcmVjb3JkaW5nIHRoZSBmYWlsdXJlIGltbWVkaWF0ZWx5IGFzIHRoZSBxdWV1ZWQgdGFzayBleGl0cywgd2UgcHJldmVudCB0aGUgbmV4dFxuICAgICAgICAgICAgLy8gcXVldWVkIHRhc2sgZnJvbSBzdGFydGluZy5cbiAgICAgICAgICAgIGdyYXBoLmZhaWxlZCh4LCBlcnIpO1xuICAgICAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZG9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLm5vZGVzKS5ldmVyeSgobikgPT4gRGVwbG95bWVudFN0YXRlLkNPTVBMRVRFRCA9PT0gbi5kZXBsb3ltZW50U3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXBsb3llZChub2RlOiBXb3JrTm9kZSkge1xuICAgIG5vZGUuZGVwbG95bWVudFN0YXRlID0gRGVwbG95bWVudFN0YXRlLkNPTVBMRVRFRDtcbiAgfVxuXG4gIHByaXZhdGUgZmFpbGVkKG5vZGU6IFdvcmtOb2RlLCBlcnJvcj86IEVycm9yKSB7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgIG5vZGUuZGVwbG95bWVudFN0YXRlID0gRGVwbG95bWVudFN0YXRlLkZBSUxFRDtcbiAgICB0aGlzLnNraXBSZXN0KCk7XG4gICAgdGhpcy5yZWFkeVBvb2wuc3BsaWNlKDApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnZGlncmFwaCBEIHsnLFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXModGhpcy5ub2RlcykuZmxhdE1hcCgoW2lkLCBub2RlXSkgPT4gcmVuZGVyTm9kZShpZCwgbm9kZSkpLFxuICAgICAgJ30nLFxuICAgIF0uam9pbignXFxuJyk7XG5cbiAgICBmdW5jdGlvbiByZW5kZXJOb2RlKGlkOiBzdHJpbmcsIG5vZGU6IFdvcmtOb2RlKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgcmV0ID0gW107XG4gICAgICBpZiAobm9kZS5kZXBsb3ltZW50U3RhdGUgPT09IERlcGxveW1lbnRTdGF0ZS5DT01QTEVURUQpIHtcbiAgICAgICAgcmV0LnB1c2goYCAgJHtndihpZCwgeyBzdHlsZTogJ2ZpbGxlZCcsIGZpbGxjb2xvcjogJ3llbGxvdycsIGNvbW1lbnQ6IG5vZGUubm90ZSB9KX07YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQucHVzaChgICAke2d2KGlkLCB7IGNvbW1lbnQ6IG5vZGUubm90ZSB9KX07YCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiBub2RlLmRlcGVuZGVuY2llcykge1xuICAgICAgICByZXQucHVzaChgICAke2d2KGlkKX0gLT4gJHtndihkZXApfTtgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhbGwgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IGV4aXN0LiBUaGlzIHByb3RlY3RzIGFnYWluc3Qgc2NlbmFyaW9zIHN1Y2ggYXMgdGhlIGZvbGxvd2luZzpcbiAgICogU3RhY2tBIGRlcGVuZHMgb24gU3RhY2tCLCBidXQgU3RhY2tCIGlzIG5vdCBzZWxlY3RlZCB0byBkZXBsb3kuIFRoZSBkZXBlbmRlbmN5IGlzIHJlZHVuZGFudFxuICAgKiBhbmQgd2lsbCBiZSBkcm9wcGVkLlxuICAgKiBUaGlzIGFzc3VtZXMgdGhlIG1hbmlmZXN0IGNvbWVzIHVuY29ycnVwdGVkIHNvIHdlIHdpbGwgbm90IGZhaWwgaWYgYSBkZXBlbmRlbmN5IGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVVbmF2YWlsYWJsZURlcGVuZGVuY2llcygpIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLm5vZGVzKSkge1xuICAgICAgY29uc3QgcmVtb3ZlRGVwcyA9IEFycmF5LmZyb20obm9kZS5kZXBlbmRlbmNpZXMpLmZpbHRlcigoZGVwKSA9PiB0aGlzLm5vZGVzW2RlcF0gPT09IHVuZGVmaW5lZCk7XG5cbiAgICAgIHJlbW92ZURlcHMuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBub2RlLmRlcGVuZGVuY2llcy5kZWxldGUoZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBhc3NldCBwdWJsaXNoaW5nIHN0ZXBzIGZvciBhc3NldHMgdGhhdCBhcmUgYWxyZWFkeSBwdWJsaXNoZWQsIGFuZCB0aGVuIGJ1aWxkXG4gICAqIHRoYXQgYXJlbid0IHVzZWQgYW55bW9yZS5cbiAgICpcbiAgICogRG8gdGhpcyBpbiBwYXJhbGxlbCwgYmVjYXVzZSB0aGVyZSBtYXkgYmUgYSBsb3Qgb2YgYXNzZXRzIGluIGFuIGFwcGxpY2F0aW9uIChzZWVuIGluIHByYWN0aWNlOiA+MTAwIGFzc2V0cylcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZW1vdmVVbm5lY2Vzc2FyeUFzc2V0cyhpc1VubmVjZXNzYXJ5OiAoeDogQXNzZXRQdWJsaXNoTm9kZSkgPT4gUHJvbWlzZTxib29sZWFuPikge1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9ERUJVRy5tc2coJ0NoZWNraW5nIGZvciBwcmV2aW91c2x5IHB1Ymxpc2hlZCBhc3NldHMnKSk7XG5cbiAgICBjb25zdCBwdWJsaXNoZXMgPSB0aGlzLm5vZGVzT2ZUeXBlKCdhc3NldC1wdWJsaXNoJyk7XG5cbiAgICBjb25zdCBjbGFzc2lmaWVkTm9kZXMgPSBhd2FpdCBwYXJhbGxlbFByb21pc2VzKFxuICAgICAgOCxcbiAgICAgIHB1Ymxpc2hlcy5tYXAoKGFzc2V0Tm9kZSkgPT4gYXN5bmMoKSA9PiBbYXNzZXROb2RlLCBhd2FpdCBpc1VubmVjZXNzYXJ5KGFzc2V0Tm9kZSldIGFzIGNvbnN0KSk7XG5cbiAgICBjb25zdCBhbHJlYWR5UHVibGlzaGVkID0gY2xhc3NpZmllZE5vZGVzLmZpbHRlcigoW18sIHVubmVjZXNzYXJ5XSkgPT4gdW5uZWNlc3NhcnkpLm1hcCgoW2Fzc2V0Tm9kZSwgX10pID0+IGFzc2V0Tm9kZSk7XG4gICAgZm9yIChjb25zdCBhc3NldE5vZGUgb2YgYWxyZWFkeVB1Ymxpc2hlZCkge1xuICAgICAgdGhpcy5yZW1vdmVOb2RlKGFzc2V0Tm9kZSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZyhgJHtwdWJsaXNoZXMubGVuZ3RofSB0b3RhbCBhc3NldHMsICR7cHVibGlzaGVzLmxlbmd0aCAtIGFscmVhZHlQdWJsaXNoZWQubGVuZ3RofSBzdGlsbCBuZWVkIHRvIGJlIHB1Ymxpc2hlZGApKTtcblxuICAgIC8vIE5vdyBhbHNvIHJlbW92ZSBhbnkgYXNzZXQgYnVpbGQgc3RlcHMgdGhhdCBkb24ndCBoYXZlIGFueSBkZXBlbmRlbmNpZXMgb24gdGhlbSBhbnltb3JlXG4gICAgY29uc3QgdW51c2VkQnVpbGRzID0gdGhpcy5ub2Rlc09mVHlwZSgnYXNzZXQtYnVpbGQnKS5maWx0ZXIoYnVpbGQgPT4gdGhpcy5kZXBlbmRlZXMoYnVpbGQpLmxlbmd0aCA9PT0gMCk7XG4gICAgZm9yIChjb25zdCB1bnVzZWRCdWlsZCBvZiB1bnVzZWRCdWlsZHMpIHtcbiAgICAgIHRoaXMucmVtb3ZlTm9kZSh1bnVzZWRCdWlsZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWFkeVBvb2woKSB7XG4gICAgY29uc3QgYWN0aXZlQ291bnQgPSBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLmZpbHRlcigoeCkgPT4geC5kZXBsb3ltZW50U3RhdGUgPT09IERlcGxveW1lbnRTdGF0ZS5ERVBMT1lJTkcpLmxlbmd0aDtcbiAgICBjb25zdCBwZW5kaW5nQ291bnQgPSBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLmZpbHRlcigoeCkgPT4geC5kZXBsb3ltZW50U3RhdGUgPT09IERlcGxveW1lbnRTdGF0ZS5QRU5ESU5HKS5sZW5ndGg7XG5cbiAgICBjb25zdCBuZXdseVJlYWR5ID0gT2JqZWN0LnZhbHVlcyh0aGlzLm5vZGVzKS5maWx0ZXIoKHgpID0+XG4gICAgICB4LmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLlBFTkRJTkcgJiZcbiAgICAgIEFycmF5LmZyb20oeC5kZXBlbmRlbmNpZXMpLmV2ZXJ5KChpZCkgPT4gdGhpcy5ub2RlKGlkKS5kZXBsb3ltZW50U3RhdGUgPT09IERlcGxveW1lbnRTdGF0ZS5DT01QTEVURUQpKTtcblxuICAgIC8vIEFkZCBuZXdseSBhdmFpbGFibGUgbm9kZXMgdG8gdGhlIHJlYWR5IHBvb2xcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgbmV3bHlSZWFkeSkge1xuICAgICAgbm9kZS5kZXBsb3ltZW50U3RhdGUgPSBEZXBsb3ltZW50U3RhdGUuUVVFVUVEO1xuICAgICAgdGhpcy5yZWFkeVBvb2wucHVzaChub2RlKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbm9kZXMgZnJvbSB0aGUgcmVhZHkgcG9vbCB0aGF0IGhhdmUgYWxyZWFkeSBzdGFydGVkIGRlcGxveWluZ1xuICAgIHJldGFpbk9ubHkodGhpcy5yZWFkeVBvb2wsIChub2RlKSA9PiBub2RlLmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLlFVRVVFRCk7XG5cbiAgICAvLyBTb3J0IGJ5IHJldmVyc2UgcHJpb3JpdHlcbiAgICB0aGlzLnJlYWR5UG9vbC5zb3J0KChhLCBiKSA9PiAoYi5wcmlvcml0eSA/PyAwKSAtIChhLnByaW9yaXR5ID8/IDApKTtcblxuICAgIGlmICh0aGlzLnJlYWR5UG9vbC5sZW5ndGggPT09IDAgJiYgYWN0aXZlQ291bnQgPT09IDAgJiYgcGVuZGluZ0NvdW50ID4gMCkge1xuICAgICAgY29uc3QgY3ljbGUgPSB0aGlzLmZpbmRDeWNsZSgpID8/IFsnTm8gY3ljbGUgZm91bmQhJ107XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfVFJBQ0UubXNnKGBDeWNsZSAke2N5Y2xlLmpvaW4oJyAtPiAnKX0gaW4gZ3JhcGggJHt0aGlzfWApKTtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYFVuYWJsZSB0byBtYWtlIHByb2dyZXNzIGFueW1vcmUsIGRlcGVuZGVuY3kgY3ljbGUgYmV0d2VlbiByZW1haW5pbmcgYXJ0aWZhY3RzOiAke2N5Y2xlLmpvaW4oJyAtPiAnKX0gKHJ1biB3aXRoIC12diBmb3IgZnVsbCBncmFwaClgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNraXBSZXN0KCkge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpKSB7XG4gICAgICBpZiAoW0RlcGxveW1lbnRTdGF0ZS5RVUVVRUQsIERlcGxveW1lbnRTdGF0ZS5QRU5ESU5HXS5pbmNsdWRlcyhub2RlLmRlcGxveW1lbnRTdGF0ZSkpIHtcbiAgICAgICAgbm9kZS5kZXBsb3ltZW50U3RhdGUgPSBEZXBsb3ltZW50U3RhdGUuU0tJUFBFRDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBjeWNsZXMgaW4gYSBncmFwaFxuICAgKlxuICAgKiBOb3QgdGhlIGZhc3Rlc3QsIGJ1dCBlZmZlY3RpdmUgYW5kIHNob3VsZCBiZSByYXJlXG4gICAqL1xuICBwdWJsaWMgZmluZEN5Y2xlKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgZm9yIChjb25zdCBub2RlSWQgb2YgT2JqZWN0LmtleXModGhpcy5ub2RlcykpIHtcbiAgICAgIGNvbnN0IGN5Y2xlID0gcmVjdXJzZShub2RlSWQsIFtub2RlSWRdKTtcbiAgICAgIGlmIChjeWNsZSkge1xuICAgICAgICByZXR1cm4gY3ljbGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBmdW5jdGlvbiByZWN1cnNlKG5vZGVJZDogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmIChzZWVuLmhhcyhub2RlSWQpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBzZWxmLm5vZGVzW25vZGVJZF0uZGVwZW5kZW5jaWVzID8/IFtdKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwYXRoLmluZGV4T2YoZGVwKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5wYXRoLnNsaWNlKGluZGV4KSwgZGVwXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjeWNsZSA9IHJlY3Vyc2UoZGVwLCBbLi4ucGF0aCwgZGVwXSk7XG4gICAgICAgICAgaWYgKGN5Y2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gY3ljbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlZW4uYWRkKG5vZGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGBlbmRgIG5vZGUgaXMgcmVhY2hhYmxlIGZyb20gdGhlIGBzdGFydGAgbm9kZSwgZm9sbG93aW5nIHRoZSBkZXBlbmRlbmN5IGFycm93c1xuICAgKi9cbiAgcHVibGljIHJlYWNoYWJsZShzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gcmVjdXJzZShzdGFydCk7XG5cbiAgICBmdW5jdGlvbiByZWN1cnNlKGN1cnJlbnQ6IHN0cmluZykge1xuICAgICAgaWYgKHNlZW4uaGFzKGN1cnJlbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGN1cnJlbnQpO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gZW5kKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBkZXAgb2Ygc2VsZi5ub2Rlc1tjdXJyZW50XS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHJlY3Vyc2UoZGVwKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya0dyYXBoQWN0aW9ucyB7XG4gIGRlcGxveVN0YWNrOiAoc3RhY2tOb2RlOiBTdGFja05vZGUpID0+IFByb21pc2U8dm9pZD47XG4gIGJ1aWxkQXNzZXQ6IChhc3NldE5vZGU6IEFzc2V0QnVpbGROb2RlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwdWJsaXNoQXNzZXQ6IChhc3NldE5vZGU6IEFzc2V0UHVibGlzaE5vZGUpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmZ1bmN0aW9uIHN1bSh4czogbnVtYmVyW10pIHtcbiAgbGV0IHJldCA9IDA7XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIHJldCArPSB4O1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHJldGFpbk9ubHk8QT4oeHM6IEFbXSwgcHJlZDogKHg6IEEpID0+IGJvb2xlYW4pIHtcbiAgeHMuc3BsaWNlKDAsIHhzLmxlbmd0aCwgLi4ueHMuZmlsdGVyKHByZWQpKTtcbn1cblxuZnVuY3Rpb24gZ3YoaWQ6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KSB7XG4gIGNvbnN0IGF0dHJTdHJpbmcgPSBPYmplY3QuZW50cmllcyhhdHRycyA/PyB7fSkuZmxhdE1hcCgoW2ssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQgPyBbYCR7a309XCIke3Z9XCJgXSA6IFtdKS5qb2luKCcsJyk7XG5cbiAgcmV0dXJuIGF0dHJTdHJpbmcgPyBgXCIke3NpbXBsaWZ5SWQoaWQpfVwiIFske2F0dHJTdHJpbmd9XWAgOiBgXCIke3NpbXBsaWZ5SWQoaWQpfVwiYDtcbn1cblxuZnVuY3Rpb24gc2ltcGxpZnlJZChpZDogc3RyaW5nKSB7XG4gIHJldHVybiBpZC5yZXBsYWNlKC8oWzAtOWEtZl17Nn0pWzAtOWEtZl17Nix9L2csICckMScpO1xufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AmiContextQuery } from '@aws-cdk/cloud-assembly-schema';
|
|
2
|
+
import type { IContextProviderMessages } from '.';
|
|
3
|
+
import { type SdkProvider } from '../api/aws-auth/private';
|
|
4
|
+
import type { ContextProviderPlugin } from '../api/plugin';
|
|
5
|
+
/**
|
|
6
|
+
* Plugin to search AMIs for the current account
|
|
7
|
+
*/
|
|
8
|
+
export declare class AmiContextProviderPlugin implements ContextProviderPlugin {
|
|
9
|
+
private readonly aws;
|
|
10
|
+
private readonly io;
|
|
11
|
+
constructor(aws: SdkProvider, io: IContextProviderMessages);
|
|
12
|
+
getValue(args: AmiContextQuery): Promise<string>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AmiContextProviderPlugin = void 0;
|
|
4
|
+
const private_1 = require("../api/aws-auth/private");
|
|
5
|
+
const toolkit_error_1 = require("../api/toolkit-error");
|
|
6
|
+
/**
|
|
7
|
+
* Plugin to search AMIs for the current account
|
|
8
|
+
*/
|
|
9
|
+
class AmiContextProviderPlugin {
|
|
10
|
+
aws;
|
|
11
|
+
io;
|
|
12
|
+
constructor(aws, io) {
|
|
13
|
+
this.aws = aws;
|
|
14
|
+
this.io = io;
|
|
15
|
+
}
|
|
16
|
+
async getValue(args) {
|
|
17
|
+
const region = args.region;
|
|
18
|
+
const account = args.account;
|
|
19
|
+
// Normally we'd do this only as 'debug', but searching AMIs typically takes dozens
|
|
20
|
+
// of seconds, so be little more verbose about it so users know what is going on.
|
|
21
|
+
await this.io.info(`Searching for AMI in ${account}:${region}`);
|
|
22
|
+
await this.io.debug(`AMI search parameters: ${JSON.stringify(args)}`);
|
|
23
|
+
const ec2 = (await (0, private_1.initContextProviderSdk)(this.aws, args)).ec2();
|
|
24
|
+
const response = await ec2.describeImages({
|
|
25
|
+
Owners: args.owners,
|
|
26
|
+
Filters: Object.entries(args.filters).map(([key, values]) => ({
|
|
27
|
+
Name: key,
|
|
28
|
+
Values: values,
|
|
29
|
+
})),
|
|
30
|
+
});
|
|
31
|
+
const images = [...(response.Images || [])].filter((i) => i.ImageId !== undefined);
|
|
32
|
+
if (images.length === 0) {
|
|
33
|
+
throw new toolkit_error_1.ContextProviderError('No AMI found that matched the search criteria');
|
|
34
|
+
}
|
|
35
|
+
// Return the most recent one
|
|
36
|
+
// Note: Date.parse() is not going to respect the timezone of the string,
|
|
37
|
+
// but since we only care about the relative values that is okay.
|
|
38
|
+
images.sort(descending((i) => Date.parse(i.CreationDate || '1970')));
|
|
39
|
+
await this.io.debug(`Selected image '${images[0].ImageId}' created at '${images[0].CreationDate}'`);
|
|
40
|
+
return images[0].ImageId;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.AmiContextProviderPlugin = AmiContextProviderPlugin;
|
|
44
|
+
/**
|
|
45
|
+
* Make a comparator that sorts in descending order given a sort key extractor
|
|
46
|
+
*/
|
|
47
|
+
function descending(valueOf) {
|
|
48
|
+
return (a, b) => {
|
|
49
|
+
return valueOf(b) - valueOf(a);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYW1pLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFEQUFtRjtBQUVuRix3REFBNEQ7QUFFNUQ7O0dBRUc7QUFDSCxNQUFhLHdCQUF3QjtJQUNOO0lBQW1DO0lBQWhFLFlBQTZCLEdBQWdCLEVBQW1CLEVBQTRCO1FBQS9ELFFBQUcsR0FBSCxHQUFHLENBQWE7UUFBbUIsT0FBRSxHQUFGLEVBQUUsQ0FBMEI7SUFDNUYsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBcUI7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTdCLG1GQUFtRjtRQUNuRixpRkFBaUY7UUFDakYsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUEsZ0NBQXNCLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLGNBQWMsQ0FBQztZQUN4QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLEVBQUUsR0FBRztnQkFDVCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztTQUNKLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUM7UUFFbkYsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxvQ0FBb0IsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFFRCw2QkFBNkI7UUFDN0IseUVBQXlFO1FBQ3pFLGlFQUFpRTtRQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLG1CQUFtQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxpQkFBaUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDcEcsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBUSxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQXBDRCw0REFvQ0M7QUFFRDs7R0FFRztBQUNILFNBQVMsVUFBVSxDQUFJLE9BQXlCO0lBQzlDLE9BQU8sQ0FBQyxDQUFJLEVBQUUsQ0FBSSxFQUFFLEVBQUU7UUFDcEIsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFtaUNvbnRleHRRdWVyeSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IElDb250ZXh0UHJvdmlkZXJNZXNzYWdlcyB9IGZyb20gJy4nO1xuaW1wb3J0IHsgdHlwZSBTZGtQcm92aWRlciwgaW5pdENvbnRleHRQcm92aWRlclNkayB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dFByb3ZpZGVyUGx1Z2luIH0gZnJvbSAnLi4vYXBpL3BsdWdpbic7XG5pbXBvcnQgeyBDb250ZXh0UHJvdmlkZXJFcnJvciB9IGZyb20gJy4uL2FwaS90b29sa2l0LWVycm9yJztcblxuLyoqXG4gKiBQbHVnaW4gdG8gc2VhcmNoIEFNSXMgZm9yIHRoZSBjdXJyZW50IGFjY291bnRcbiAqL1xuZXhwb3J0IGNsYXNzIEFtaUNvbnRleHRQcm92aWRlclBsdWdpbiBpbXBsZW1lbnRzIENvbnRleHRQcm92aWRlclBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXdzOiBTZGtQcm92aWRlciwgcHJpdmF0ZSByZWFkb25seSBpbzogSUNvbnRleHRQcm92aWRlck1lc3NhZ2VzKSB7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VmFsdWUoYXJnczogQW1pQ29udGV4dFF1ZXJ5KSB7XG4gICAgY29uc3QgcmVnaW9uID0gYXJncy5yZWdpb247XG4gICAgY29uc3QgYWNjb3VudCA9IGFyZ3MuYWNjb3VudDtcblxuICAgIC8vIE5vcm1hbGx5IHdlJ2QgZG8gdGhpcyBvbmx5IGFzICdkZWJ1ZycsIGJ1dCBzZWFyY2hpbmcgQU1JcyB0eXBpY2FsbHkgdGFrZXMgZG96ZW5zXG4gICAgLy8gb2Ygc2Vjb25kcywgc28gYmUgbGl0dGxlIG1vcmUgdmVyYm9zZSBhYm91dCBpdCBzbyB1c2VycyBrbm93IHdoYXQgaXMgZ29pbmcgb24uXG4gICAgYXdhaXQgdGhpcy5pby5pbmZvKGBTZWFyY2hpbmcgZm9yIEFNSSBpbiAke2FjY291bnR9OiR7cmVnaW9ufWApO1xuICAgIGF3YWl0IHRoaXMuaW8uZGVidWcoYEFNSSBzZWFyY2ggcGFyYW1ldGVyczogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcblxuICAgIGNvbnN0IGVjMiA9IChhd2FpdCBpbml0Q29udGV4dFByb3ZpZGVyU2RrKHRoaXMuYXdzLCBhcmdzKSkuZWMyKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBlYzIuZGVzY3JpYmVJbWFnZXMoe1xuICAgICAgT3duZXJzOiBhcmdzLm93bmVycyxcbiAgICAgIEZpbHRlcnM6IE9iamVjdC5lbnRyaWVzKGFyZ3MuZmlsdGVycykubWFwKChba2V5LCB2YWx1ZXNdKSA9PiAoe1xuICAgICAgICBOYW1lOiBrZXksXG4gICAgICAgIFZhbHVlczogdmFsdWVzLFxuICAgICAgfSkpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW1hZ2VzID0gWy4uLihyZXNwb25zZS5JbWFnZXMgfHwgW10pXS5maWx0ZXIoKGkpID0+IGkuSW1hZ2VJZCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGlmIChpbWFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGV4dFByb3ZpZGVyRXJyb3IoJ05vIEFNSSBmb3VuZCB0aGF0IG1hdGNoZWQgdGhlIHNlYXJjaCBjcml0ZXJpYScpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgbW9zdCByZWNlbnQgb25lXG4gICAgLy8gTm90ZTogRGF0ZS5wYXJzZSgpIGlzIG5vdCBnb2luZyB0byByZXNwZWN0IHRoZSB0aW1lem9uZSBvZiB0aGUgc3RyaW5nLFxuICAgIC8vIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlbGF0aXZlIHZhbHVlcyB0aGF0IGlzIG9rYXkuXG4gICAgaW1hZ2VzLnNvcnQoZGVzY2VuZGluZygoaSkgPT4gRGF0ZS5wYXJzZShpLkNyZWF0aW9uRGF0ZSB8fCAnMTk3MCcpKSk7XG5cbiAgICBhd2FpdCB0aGlzLmlvLmRlYnVnKGBTZWxlY3RlZCBpbWFnZSAnJHtpbWFnZXNbMF0uSW1hZ2VJZH0nIGNyZWF0ZWQgYXQgJyR7aW1hZ2VzWzBdLkNyZWF0aW9uRGF0ZX0nYCk7XG4gICAgcmV0dXJuIGltYWdlc1swXS5JbWFnZUlkITtcbiAgfVxufVxuXG4vKipcbiAqIE1ha2UgYSBjb21wYXJhdG9yIHRoYXQgc29ydHMgaW4gZGVzY2VuZGluZyBvcmRlciBnaXZlbiBhIHNvcnQga2V5IGV4dHJhY3RvclxuICovXG5mdW5jdGlvbiBkZXNjZW5kaW5nPEE+KHZhbHVlT2Y6ICh4OiBBKSA9PiBudW1iZXIpIHtcbiAgcmV0dXJuIChhOiBBLCBiOiBBKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlT2YoYikgLSB2YWx1ZU9mKGEpO1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AvailabilityZonesContextQuery } from '@aws-cdk/cloud-assembly-schema';
|
|
2
|
+
import type { IContextProviderMessages } from '.';
|
|
3
|
+
import { type SdkProvider } from '../api/aws-auth/private';
|
|
4
|
+
import type { ContextProviderPlugin } from '../api/plugin';
|
|
5
|
+
/**
|
|
6
|
+
* Plugin to retrieve the Availability Zones for the current account
|
|
7
|
+
*/
|
|
8
|
+
export declare class AZContextProviderPlugin implements ContextProviderPlugin {
|
|
9
|
+
private readonly aws;
|
|
10
|
+
private readonly io;
|
|
11
|
+
constructor(aws: SdkProvider, io: IContextProviderMessages);
|
|
12
|
+
getValue(args: AvailabilityZonesContextQuery): Promise<(string | undefined)[]>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AZContextProviderPlugin = void 0;
|
|
4
|
+
const private_1 = require("../api/aws-auth/private");
|
|
5
|
+
/**
|
|
6
|
+
* Plugin to retrieve the Availability Zones for the current account
|
|
7
|
+
*/
|
|
8
|
+
class AZContextProviderPlugin {
|
|
9
|
+
aws;
|
|
10
|
+
io;
|
|
11
|
+
constructor(aws, io) {
|
|
12
|
+
this.aws = aws;
|
|
13
|
+
this.io = io;
|
|
14
|
+
}
|
|
15
|
+
async getValue(args) {
|
|
16
|
+
const region = args.region;
|
|
17
|
+
const account = args.account;
|
|
18
|
+
await this.io.debug(`Reading AZs for ${account}:${region}`);
|
|
19
|
+
const ec2 = (await (0, private_1.initContextProviderSdk)(this.aws, args)).ec2();
|
|
20
|
+
const response = await ec2.describeAvailabilityZones({});
|
|
21
|
+
if (!response.AvailabilityZones) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
const azs = response.AvailabilityZones.filter((zone) => zone.State === 'available').map((zone) => zone.ZoneName);
|
|
25
|
+
return azs;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.AZContextProviderPlugin = AZContextProviderPlugin;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhaWxhYmlsaXR5LXpvbmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXZhaWxhYmlsaXR5LXpvbmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHFEQUFtRjtBQUduRjs7R0FFRztBQUNILE1BQWEsdUJBQXVCO0lBQ0w7SUFBbUM7SUFBaEUsWUFBNkIsR0FBZ0IsRUFBbUIsRUFBNEI7UUFBL0QsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQUFtQixPQUFFLEdBQUYsRUFBRSxDQUEwQjtJQUM1RixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFtQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUEsZ0NBQXNCLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQ3ZHLENBQUMsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FDMUMsQ0FBQztRQUNGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBbEJELDBEQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXZhaWxhYmlsaXR5Wm9uZXNDb250ZXh0UXVlcnkgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHR5cGUgeyBBdmFpbGFiaWxpdHlab25lIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjMic7XG5pbXBvcnQgdHlwZSB7IElDb250ZXh0UHJvdmlkZXJNZXNzYWdlcyB9IGZyb20gJy4nO1xuaW1wb3J0IHsgdHlwZSBTZGtQcm92aWRlciwgaW5pdENvbnRleHRQcm92aWRlclNkayB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dFByb3ZpZGVyUGx1Z2luIH0gZnJvbSAnLi4vYXBpL3BsdWdpbic7XG5cbi8qKlxuICogUGx1Z2luIHRvIHJldHJpZXZlIHRoZSBBdmFpbGFiaWxpdHkgWm9uZXMgZm9yIHRoZSBjdXJyZW50IGFjY291bnRcbiAqL1xuZXhwb3J0IGNsYXNzIEFaQ29udGV4dFByb3ZpZGVyUGx1Z2luIGltcGxlbWVudHMgQ29udGV4dFByb3ZpZGVyUGx1Z2luIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhd3M6IFNka1Byb3ZpZGVyLCBwcml2YXRlIHJlYWRvbmx5IGlvOiBJQ29udGV4dFByb3ZpZGVyTWVzc2FnZXMpIHtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRWYWx1ZShhcmdzOiBBdmFpbGFiaWxpdHlab25lc0NvbnRleHRRdWVyeSkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IGFyZ3MucmVnaW9uO1xuICAgIGNvbnN0IGFjY291bnQgPSBhcmdzLmFjY291bnQ7XG4gICAgYXdhaXQgdGhpcy5pby5kZWJ1ZyhgUmVhZGluZyBBWnMgZm9yICR7YWNjb3VudH06JHtyZWdpb259YCk7XG4gICAgY29uc3QgZWMyID0gKGF3YWl0IGluaXRDb250ZXh0UHJvdmlkZXJTZGsodGhpcy5hd3MsIGFyZ3MpKS5lYzIoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGVjMi5kZXNjcmliZUF2YWlsYWJpbGl0eVpvbmVzKHt9KTtcbiAgICBpZiAoIXJlc3BvbnNlLkF2YWlsYWJpbGl0eVpvbmVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGF6cyA9IHJlc3BvbnNlLkF2YWlsYWJpbGl0eVpvbmVzLmZpbHRlcigoem9uZTogQXZhaWxhYmlsaXR5Wm9uZSkgPT4gem9uZS5TdGF0ZSA9PT0gJ2F2YWlsYWJsZScpLm1hcChcbiAgICAgICh6b25lOiBBdmFpbGFiaWxpdHlab25lKSA9PiB6b25lLlpvbmVOYW1lLFxuICAgICk7XG4gICAgcmV0dXJuIGF6cztcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CcApiContextQuery } from '@aws-cdk/cloud-assembly-schema';
|
|
2
|
+
import type { SdkProvider } from '../api/aws-auth/private';
|
|
3
|
+
import type { ContextProviderPlugin } from '../api/plugin';
|
|
4
|
+
export declare class CcApiContextProviderPlugin implements ContextProviderPlugin {
|
|
5
|
+
private readonly aws;
|
|
6
|
+
constructor(aws: SdkProvider);
|
|
7
|
+
/**
|
|
8
|
+
* This returns a data object with the value from CloudControl API result.
|
|
9
|
+
*
|
|
10
|
+
* See the documentation in the Cloud Assembly Schema for the semantics of
|
|
11
|
+
* each query parameter.
|
|
12
|
+
*/
|
|
13
|
+
getValue(args: CcApiContextQuery): Promise<any>;
|
|
14
|
+
/**
|
|
15
|
+
* Calls getResource from CC API to get the resource.
|
|
16
|
+
* See https://docs.aws.amazon.com/cli/latest/reference/cloudcontrol/get-resource.html
|
|
17
|
+
*
|
|
18
|
+
* Will always return exactly one resource, or fail.
|
|
19
|
+
*/
|
|
20
|
+
private getResource;
|
|
21
|
+
/**
|
|
22
|
+
* Calls listResources from CC API to get the resources and apply args.propertyMatch to find the resources.
|
|
23
|
+
* See https://docs.aws.amazon.com/cli/latest/reference/cloudcontrol/list-resources.html
|
|
24
|
+
*
|
|
25
|
+
* Will return 0 or more resources.
|
|
26
|
+
*
|
|
27
|
+
* Does not currently paginate through more than one result page.
|
|
28
|
+
*/
|
|
29
|
+
private listResources;
|
|
30
|
+
}
|