@go-to-k/cdkd 0.310.0 → 0.312.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/README.md +2 -2
- package/dist/{asg-provider-I1bFHVsO.js → asg-provider-CVLTQtQr.js} +5 -3
- package/dist/asg-provider-CVLTQtQr.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/{iam-policy-targets-D94wh05t.js → created-resource-sink-BT2Dfnpt.js} +51 -2
- package/dist/created-resource-sink-BT2Dfnpt.js.map +1 -0
- package/dist/{db-instance-modify-retry-BUG7NMWS.js → db-instance-modify-retry-D7wXWxVo.js} +2 -2
- package/dist/{db-instance-modify-retry-BUG7NMWS.js.map → db-instance-modify-retry-D7wXWxVo.js.map} +1 -1
- package/dist/{deploy-engine-DZO2SOQJ.js → deploy-engine-CVNzK__j.js} +914 -185
- package/dist/deploy-engine-CVNzK__j.js.map +1 -0
- package/dist/{iam-role-provider-BWw7I-SZ.js → iam-role-provider-DM7bN9m1.js} +5 -3
- package/dist/iam-role-provider-DM7bN9m1.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/{neptune-provider-8kjFmR1l.js → neptune-provider-qdoLunCh.js} +55 -6
- package/dist/neptune-provider-qdoLunCh.js.map +1 -0
- package/dist/{program-CS420Kx9.js → program-Nk_95KKk.js} +37 -19
- package/dist/program-Nk_95KKk.js.map +1 -0
- package/dist/{provider-classes-KsrvwO_r.js → provider-classes-Dz0pYmlJ.js} +2099 -217
- package/dist/provider-classes-Dz0pYmlJ.js.map +1 -0
- package/dist/{rds-provider-BqwTQeS-.js → rds-provider-CXSZq1c8.js} +28 -14
- package/dist/rds-provider-CXSZq1c8.js.map +1 -0
- package/dist/{version-QOtLxcEo.js → version-BqCEt5Wu.js} +2 -2
- package/dist/{version-QOtLxcEo.js.map → version-BqCEt5Wu.js.map} +1 -1
- package/package.json +2 -2
- package/dist/asg-provider-I1bFHVsO.js.map +0 -1
- package/dist/deploy-engine-DZO2SOQJ.js.map +0 -1
- package/dist/iam-policy-targets-D94wh05t.js.map +0 -1
- package/dist/iam-role-provider-BWw7I-SZ.js.map +0 -1
- package/dist/neptune-provider-8kjFmR1l.js.map +0 -1
- package/dist/program-CS420Kx9.js.map +0 -1
- package/dist/provider-classes-KsrvwO_r.js.map +0 -1
- package/dist/rds-provider-BqwTQeS-.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { c as __exportAll, r as getAwsClients } from "./aws-clients-Bu9EMILF.js";
|
|
2
2
|
import { A as isNameGeneration, B as SECRET_REF_MAX_CODE_POINTS, D as getCurrentStackInstanceId, E as getCurrentSkipPrefix, F as withSkipPrefix, G as displayAwsMessage, H as UNRENDERABLE, I as withStackScope, J as displayStackName, K as displayIdent, L as withStackScopeBeforeStateRead, N as stackInstanceNameSuffix, O as getCurrentStackName, P as withNameGeneration, Q as safeMsg, R as withoutGeneratedFallbackName, S as fallbackNamePropertyFor, T as generatedNameFor, U as asIsMessage, V as STACK_REF_MAX_CODE_POINTS, Y as isPasteableIdent, Z as plainIdentOr, a as safeStringify$1, c as isStdoutReservedForPayload, et as terminalSafe, f as currentLogLineMasker, j as looksLikeCdkdGeneratedName, m as getLiveRenderer, n as describeAwsFailure, p as installLogLineMaskerSource, q as displaySafe, s as getLogger, t as VERBOSE_POINTER, tt as truncateCodePoints, v as applyDefaultNameForFallback, w as generateResourceNameWithFallback, x as explicitNamePropertyFor, y as currentNameGeneration, z as SAFE_MSG_ALTERED_CHAR } from "./aws-failure-text-NSBdKPYK.js";
|
|
3
|
-
import { $n as
|
|
3
|
+
import { $n as plainOrDescribed, $t as formatLockOperation, A as withoutServerErrorRetries, Ar as markNonRetryable, At as createMaskedLogSinks, B as quotedRemedyLogicalId, Bt as createdResourceIdentityBeforeFailure, Cn as DynamicReferenceRegionAmbiguousError, Cr as isIamPropagationError, Ct as compositeIdSeparatorRefusal, Dn as LockError, Dt as resourceTypeShown, Er as retryClassificationText, Ft as withDerivedNameMasks, G as ProtectionFlipRegistry, Gn as SHELL_ACTIVE, Gt as markCreatedBeforeFailure, Hn as normalizeAwsError, Ht as isAuxiliaryFailure, It as RETRY_AUXILIARY_OWNER, J as deleteWithProtectionCompensation, Jn as commandHole, Jt as UNREPRODUCIBLE_LOCK_CLAUSE, K as compensateProtectionFlip, Kn as SHELL_ACTIVE_WHY, Ln as StateError, Lt as carryCreatedBeforeFailure, M as isMarkedNotGone, Mn as ProvisioningError, Mr as wrapMaskedAwsError, Mt as isSecretDerivedValue, N as markNotGone, Nn as ResourceTimeoutError, Nt as maskDeep, On as MacroExpansionError, Or as isMarkedNonRetryable, Ot as segmentAfterAnchor, P as assertRegionMatch, Pn as ResourceUpdateNotSupportedError, Pt as maskerOrIdentity, Q as isTerminalDeleteFailure, Qn as physicalIdShownBesideCommand, Qt as formatLockExpiry, R as isQuotableImportValue, Rn as SynthesisError, Sn as DeploymentNotApprovedError, Tr as isTransientServerError, Tt as logicalIdShown, U as resolveExplicitPhysicalId, Ut as isAuxiliaryMarkOf, V as refusalTypeShown, Vn as isSoftAbort, Vt as hasCreatedBeforeFailure, Wt as markAuxiliaryFailure, Xn as isInertUnquoted, Yt as buildForceUnlockCommand, Zn as pasteableCommand, _ as removalWarning, _n as CdkdError, a as retractCreatedResource, an as injectiveKey, b as withoutInjectedRemovals, bn as DependencyError, br as isAmbiguousCcHandlerErrorCode, bt as startInterruptWatch, cn as producerRecordKey, cr as isNameCollisionErrorFrom, dn as ambientClientDefaults, dr as isReplayedNameCollisionFrom, dt as protectedReplacementAdvice, en as formatLockOwner, er as quotedOrDescribed, et as observeThenDisableProtection, fn as ambientCredentialConfig, g as prepareRemovalForUpdate, gn as AssetError, gr as stripControlChars, hn as AccountIdUnavailableError, hr as escapeRegExp$3, ht as monotonicNowMs, i as reportCreatedResource, in as DEFAULT_STATE_PREFIX, j as RESOURCE_NOT_FOUND, jr as markRedactedCause, jt as createMaskedRetryLogger, kn as MalformedProducerRecordRefusalError, kr as isThrottlingError, kt as stateOrphanRecordRemedy, l as holdsSecretDerivedEntry, lr as isNameCooldownError, m as withUnchangedSecretPrincipalLists, mn as credentialFingerprint, mr as relayedNameCollision, mt as ElapsedBudgetRegistry, n as clearCreatedReport, nn as sanitizeRecoveryValue, nr as shellQuote, or as isUpdateUnsupportedError, ot as DELETION_PROTECTION_DOC_POINTER, pn as clientDefaultsFor, pr as markReplayMayCollide, qn as UNSHOWABLE_VALUE, qt as replayMadeAnotherResource, r as collectCreatedResources, rn as CUSTOM_RESOURCE_RESPONSE_PREFIX, rr as withheldTargetClause, rt as runDeleteAttempt, sr as hasReplayMayCollide, t as CreatedResourceSink, tn as recoveryCommandFlags, tr as shellBoundedDisplay, tt as protectionFlipKey, un as withPasteableAwsProfile, ur as isRecreateRetryableError, ut as pasteableAwsCommand, wn as IntrinsicResolutionRefusalError, wr as isRetryableTransientError, xr as isAmbiguousOutcomeError, xt as canonicalizeRoute53QueryName, yn as CrossAccountSecretRefusalError, yr as formatRetryClassificationSignals, yt as isInterruptedWaitError, z as normalizeAwsTagsToCfn, zt as createdBeforeFailure } from "./created-resource-sink-BT2Dfnpt.js";
|
|
4
4
|
import { a as setAssumedRoleCredentials, c as ambientRegion, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as quietS3Logger, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-BX9Y_fKp.js";
|
|
5
|
-
import { t as getCdkdVersion } from "./version-
|
|
5
|
+
import { t as getCdkdVersion } from "./version-BqCEt5Wu.js";
|
|
6
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
7
7
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
8
8
|
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -4987,7 +4987,8 @@ const STATE_SCHEMA_VERSIONS_READABLE = [
|
|
|
4987
4987
|
11,
|
|
4988
4988
|
12,
|
|
4989
4989
|
13,
|
|
4990
|
-
14
|
|
4990
|
+
14,
|
|
4991
|
+
15
|
|
4991
4992
|
];
|
|
4992
4993
|
function hasUnverifiableParameterRefusal(record) {
|
|
4993
4994
|
return record?.observedBaselineRefused === true && record.observedBaselineRefusalReason === "unverifiable-parameter";
|
|
@@ -6047,7 +6048,7 @@ var S3StateBackend = class S3StateBackend {
|
|
|
6047
6048
|
const body = {
|
|
6048
6049
|
...state,
|
|
6049
6050
|
...stackInstanceIdCarriedFrom(state),
|
|
6050
|
-
version:
|
|
6051
|
+
version: 15,
|
|
6051
6052
|
stackName,
|
|
6052
6053
|
region
|
|
6053
6054
|
};
|
|
@@ -10278,6 +10279,11 @@ function scrubResourceRecord(record, secrets, sourceProperties, observedProvenan
|
|
|
10278
10279
|
secrets
|
|
10279
10280
|
});
|
|
10280
10281
|
}
|
|
10282
|
+
const attemptedItems = record.unsettledItems;
|
|
10283
|
+
if (typeof attemptedItems === "object" && attemptedItems !== null && !Array.isArray(attemptedItems)) next.unsettledItems = redactForState(attemptedItems, {
|
|
10284
|
+
provenance: "value-scan",
|
|
10285
|
+
secrets
|
|
10286
|
+
});
|
|
10281
10287
|
if (record.observedProperties) next.observedProperties = redactAtProvenance(record.observedProperties, secrets, sourceProperties ?? next.properties, observedProvenance ?? (sourceProperties !== void 0 ? "template-sourced" : secrets.size === 0 && observedClaimed ? "state-baseline" : "state-readback"), observedClaimed);
|
|
10282
10288
|
return next;
|
|
10283
10289
|
}
|
|
@@ -12691,6 +12697,20 @@ function elastiCachePreferredAvailabilityZonesMovedToDisjoint(oldValue, newValue
|
|
|
12691
12697
|
if (![...oldValue, ...newValue].every((z) => typeof z === "string")) return false;
|
|
12692
12698
|
return !newValue.some((z) => oldValue.includes(z));
|
|
12693
12699
|
}
|
|
12700
|
+
function elastiCacheLeftSingleAzWithoutZones(siblings) {
|
|
12701
|
+
if (siblings === void 0) return false;
|
|
12702
|
+
const { oldProperties: prev, newProperties: next } = siblings;
|
|
12703
|
+
return prev["Engine"] === "memcached" && next["Engine"] === "memcached" && prev["PreferredAvailabilityZone"] == null && next["PreferredAvailabilityZone"] == null && next["PreferredAvailabilityZones"] == null && (next["AZMode"] == null || next["AZMode"] === "single-az");
|
|
12704
|
+
}
|
|
12705
|
+
function elastiCacheAzModeRemovedFromSingleAz(oldValue, newValue, siblings) {
|
|
12706
|
+
return oldValue === "single-az" && newValue == null && elastiCacheLeftSingleAzWithoutZones(siblings);
|
|
12707
|
+
}
|
|
12708
|
+
function elastiCachePreferredAvailabilityZonesRemovedFromSingleAz(oldValue, newValue, siblings) {
|
|
12709
|
+
return Array.isArray(oldValue) && oldValue.length > 0 && newValue == null && siblings?.oldProperties["AZMode"] === "single-az" && elastiCacheLeftSingleAzWithoutZones(siblings);
|
|
12710
|
+
}
|
|
12711
|
+
function elastiCachePreferredAvailabilityZonesReplaced(oldValue, newValue, siblings) {
|
|
12712
|
+
return elastiCachePreferredAvailabilityZonesMovedToDisjoint(oldValue, newValue) || elastiCachePreferredAvailabilityZonesRemovedFromSingleAz(oldValue, newValue, siblings);
|
|
12713
|
+
}
|
|
12694
12714
|
function emrClusterInstancesReplaced(oldValue, newValue) {
|
|
12695
12715
|
if (oldValue === void 0 && newValue === void 0) return true;
|
|
12696
12716
|
return !isDeepStrictEqual(emrInstancesReplacingPart(oldValue), emrInstancesReplacingPart(newValue));
|
|
@@ -13025,13 +13045,23 @@ var ReplacementRulesRegistry = class {
|
|
|
13025
13045
|
this.rules.set("AWS::RDS::DBProxy", { replacementProperties: /* @__PURE__ */ new Set([
|
|
13026
13046
|
"DBProxyName",
|
|
13027
13047
|
"EngineFamily",
|
|
13028
|
-
"VpcSubnetIds"
|
|
13048
|
+
"VpcSubnetIds",
|
|
13049
|
+
"EndpointNetworkType",
|
|
13050
|
+
"TargetConnectionNetworkType"
|
|
13029
13051
|
]) });
|
|
13030
13052
|
this.rules.set("AWS::RDS::DBProxyEndpoint", { replacementProperties: /* @__PURE__ */ new Set([
|
|
13031
13053
|
"DBProxyName",
|
|
13032
13054
|
"DBProxyEndpointName",
|
|
13033
13055
|
"VpcSubnetIds",
|
|
13034
|
-
"TargetRole"
|
|
13056
|
+
"TargetRole",
|
|
13057
|
+
"EndpointNetworkType"
|
|
13058
|
+
]) });
|
|
13059
|
+
this.rules.set("AWS::S3Tables::Table", { replacementProperties: /* @__PURE__ */ new Set([
|
|
13060
|
+
"TableBucketARN",
|
|
13061
|
+
"OpenTableFormat",
|
|
13062
|
+
"IcebergMetadata",
|
|
13063
|
+
"StorageClassConfiguration",
|
|
13064
|
+
"WithoutMetadata"
|
|
13035
13065
|
]) });
|
|
13036
13066
|
this.rules.set("AWS::RDS::DBProxyTargetGroup", { replacementProperties: /* @__PURE__ */ new Set(["DBProxyName", "TargetGroupName"]) });
|
|
13037
13067
|
this.rules.set("AWS::EC2::VPC", {
|
|
@@ -13109,7 +13139,7 @@ var ReplacementRulesRegistry = class {
|
|
|
13109
13139
|
});
|
|
13110
13140
|
this.rules.set("AWS::ElastiCache::CacheCluster", {
|
|
13111
13141
|
replacementProperties: /* @__PURE__ */ new Set(),
|
|
13112
|
-
conditionalReplacements: /* @__PURE__ */ new Map([["PreferredAvailabilityZones",
|
|
13142
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["AZMode", elastiCacheAzModeRemovedFromSingleAz], ["PreferredAvailabilityZones", elastiCachePreferredAvailabilityZonesReplaced]])
|
|
13113
13143
|
});
|
|
13114
13144
|
this.rules.set("AWS::EMR::Cluster", {
|
|
13115
13145
|
replacementProperties: /* @__PURE__ */ new Set(),
|
|
@@ -13929,7 +13959,8 @@ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
|
|
|
13929
13959
|
["SourceDbClusterResourceId"],
|
|
13930
13960
|
["SourceRegion"],
|
|
13931
13961
|
["StorageEncrypted"],
|
|
13932
|
-
["UseLatestRestorableTime"]
|
|
13962
|
+
["UseLatestRestorableTime"],
|
|
13963
|
+
["WithExpressConfiguration"]
|
|
13933
13964
|
]],
|
|
13934
13965
|
["AWS::RDS::DBInstance", [
|
|
13935
13966
|
["BackupTarget"],
|
|
@@ -15233,6 +15264,7 @@ const STATEFUL_TYPES = /* @__PURE__ */ new Set([
|
|
|
15233
15264
|
"AWS::MemoryDB::Snapshot",
|
|
15234
15265
|
"AWS::Redshift::Snapshot",
|
|
15235
15266
|
"AWS::Timestream::InfluxDBBackup",
|
|
15267
|
+
"AWS::EC2::Snapshot",
|
|
15236
15268
|
"AWS::StorageGateway::Volume",
|
|
15237
15269
|
"AWS::FSx::FileCache",
|
|
15238
15270
|
"AWS::DirectoryService::MicrosoftAD",
|
|
@@ -16283,21 +16315,20 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16283
16315
|
"AgentRuntimeArtifact",
|
|
16284
16316
|
"AgentRuntimeName",
|
|
16285
16317
|
"AuthorizerConfiguration",
|
|
16318
|
+
"CapacityProviderConfiguration",
|
|
16286
16319
|
"ClientToken",
|
|
16287
16320
|
"Description",
|
|
16288
16321
|
"EnvironmentVariables",
|
|
16322
|
+
"FilesystemConfigurations",
|
|
16289
16323
|
"LifecycleConfiguration",
|
|
16290
16324
|
"NetworkConfiguration",
|
|
16325
|
+
"PlatformVersion",
|
|
16291
16326
|
"ProtocolConfiguration",
|
|
16292
|
-
"
|
|
16293
|
-
|
|
16294
|
-
|
|
16295
|
-
["CapacityProviderConfiguration", "not yet implemented by cdkd"],
|
|
16296
|
-
["FilesystemConfigurations", "not yet implemented by cdkd"],
|
|
16297
|
-
["PlatformVersion", "not yet implemented by cdkd"],
|
|
16298
|
-
["RequestHeaderConfiguration", "not yet implemented by cdkd"],
|
|
16299
|
-
["Tags", "not yet implemented by cdkd"]
|
|
16327
|
+
"RequestHeaderConfiguration",
|
|
16328
|
+
"RoleArn",
|
|
16329
|
+
"Tags"
|
|
16300
16330
|
]),
|
|
16331
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
16301
16332
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
16302
16333
|
readOnly: /* @__PURE__ */ new Set([
|
|
16303
16334
|
"AgentRuntimeArn",
|
|
@@ -16424,6 +16455,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16424
16455
|
}],
|
|
16425
16456
|
["AWS::CloudWatch::Alarm", {
|
|
16426
16457
|
handled: /* @__PURE__ */ new Set([
|
|
16458
|
+
"ActionConfiguration",
|
|
16427
16459
|
"ActionsEnabled",
|
|
16428
16460
|
"AlarmActions",
|
|
16429
16461
|
"AlarmDescription",
|
|
@@ -16432,7 +16464,10 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16432
16464
|
"DatapointsToAlarm",
|
|
16433
16465
|
"Dimensions",
|
|
16434
16466
|
"EvaluateLowSampleCountPercentile",
|
|
16467
|
+
"EvaluationCriteria",
|
|
16468
|
+
"EvaluationInterval",
|
|
16435
16469
|
"EvaluationPeriods",
|
|
16470
|
+
"EvaluationWindow",
|
|
16436
16471
|
"ExtendedStatistic",
|
|
16437
16472
|
"InsufficientDataActions",
|
|
16438
16473
|
"MetricName",
|
|
@@ -16445,15 +16480,10 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16445
16480
|
"Threshold",
|
|
16446
16481
|
"ThresholdMetricId",
|
|
16447
16482
|
"TreatMissingData",
|
|
16448
|
-
"Unit"
|
|
16449
|
-
|
|
16450
|
-
silentDrop: /* @__PURE__ */ new Map([
|
|
16451
|
-
["ActionConfiguration", "not yet implemented by cdkd"],
|
|
16452
|
-
["EvaluationCriteria", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."],
|
|
16453
|
-
["EvaluationInterval", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."],
|
|
16454
|
-
["EvaluationWindow", "not yet implemented by cdkd"],
|
|
16455
|
-
["WarmUpConfiguration", "not yet implemented by cdkd"]
|
|
16483
|
+
"Unit",
|
|
16484
|
+
"WarmUpConfiguration"
|
|
16456
16485
|
]),
|
|
16486
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
16457
16487
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
16458
16488
|
readOnly: /* @__PURE__ */ new Set(["Arn"]),
|
|
16459
16489
|
ccRouteUnavailable: false
|
|
@@ -16503,7 +16533,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16503
16533
|
]),
|
|
16504
16534
|
silentDrop: /* @__PURE__ */ new Map([["Triggers", "not yet implemented by cdkd"]]),
|
|
16505
16535
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
16506
|
-
readOnly: /* @__PURE__ */ new Set(["Arn"
|
|
16536
|
+
readOnly: /* @__PURE__ */ new Set(["Arn"]),
|
|
16507
16537
|
ccRouteUnavailable: true
|
|
16508
16538
|
}],
|
|
16509
16539
|
["AWS::CodeCommit::Repository", {
|
|
@@ -16695,6 +16725,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16695
16725
|
["MultiRegionConsistency", "not yet implemented by cdkd"],
|
|
16696
16726
|
["ReadOnDemandThroughputSettings", "not yet implemented by cdkd"],
|
|
16697
16727
|
["ReadProvisionedThroughputSettings", "not yet implemented by cdkd"],
|
|
16728
|
+
["TableType", "not yet implemented by cdkd"],
|
|
16698
16729
|
["VectorIndexes", "not yet implemented by cdkd"],
|
|
16699
16730
|
["WarmThroughput", "not yet implemented by cdkd"]
|
|
16700
16731
|
]),
|
|
@@ -16726,9 +16757,10 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16726
16757
|
"TableName",
|
|
16727
16758
|
"Tags",
|
|
16728
16759
|
"TimeToLiveSpecification",
|
|
16760
|
+
"VectorIndexes",
|
|
16729
16761
|
"WarmThroughput"
|
|
16730
16762
|
]),
|
|
16731
|
-
silentDrop: /* @__PURE__ */ new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"]
|
|
16763
|
+
silentDrop: /* @__PURE__ */ new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"]]),
|
|
16732
16764
|
createOnlyDrops: /* @__PURE__ */ new Set(["ImportSourceSpecification"]),
|
|
16733
16765
|
readOnly: /* @__PURE__ */ new Set(["Arn", "StreamArn"]),
|
|
16734
16766
|
ccRouteUnavailable: false
|
|
@@ -17096,7 +17128,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
17096
17128
|
"VolumeConfigurations",
|
|
17097
17129
|
"VpcLatticeConfigurations"
|
|
17098
17130
|
]),
|
|
17099
|
-
silentDrop: /* @__PURE__ */ new Map(),
|
|
17131
|
+
silentDrop: /* @__PURE__ */ new Map([["GatewayConnectors", "not yet implemented by cdkd"]]),
|
|
17100
17132
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
17101
17133
|
readOnly: /* @__PURE__ */ new Set(["Name", "ServiceArn"]),
|
|
17102
17134
|
ccRouteUnavailable: false
|
|
@@ -17995,7 +18027,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
17995
18027
|
"RetentionInDays",
|
|
17996
18028
|
"Tags"
|
|
17997
18029
|
]),
|
|
17998
|
-
silentDrop: /* @__PURE__ */ new Map([["ResourcePolicyDocument", "
|
|
18030
|
+
silentDrop: /* @__PURE__ */ new Map([["ResourcePolicyDocument", "not driven by this provider by decision (issue #1412): no CreateLogGroup / PutRetentionPolicy member carries it, and both policy lifecycles — the account-scoped AWS::Logs::ResourcePolicy type and the log-group-scoped logs:PutResourcePolicy (resourceArn + policyScope RESOURCE) — are ones this provider does not take on — routed via Cloud Control, whose handler applies it"]]),
|
|
17999
18031
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
18000
18032
|
readOnly: /* @__PURE__ */ new Set(["Arn"]),
|
|
18001
18033
|
ccRouteUnavailable: false
|
|
@@ -18175,7 +18207,8 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18175
18207
|
["SourceDbClusterResourceId", "not yet implemented by cdkd"],
|
|
18176
18208
|
["SourceRegion", "not yet implemented by cdkd"],
|
|
18177
18209
|
["StorageType", "not yet implemented by cdkd"],
|
|
18178
|
-
["UseLatestRestorableTime", "not yet implemented by cdkd"]
|
|
18210
|
+
["UseLatestRestorableTime", "not yet implemented by cdkd"],
|
|
18211
|
+
["WithExpressConfiguration", "not yet implemented by cdkd"]
|
|
18179
18212
|
]),
|
|
18180
18213
|
createOnlyDrops: /* @__PURE__ */ new Set([
|
|
18181
18214
|
"ClusterScalabilityType",
|
|
@@ -18187,7 +18220,8 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18187
18220
|
"SourceDBClusterIdentifier",
|
|
18188
18221
|
"SourceDbClusterResourceId",
|
|
18189
18222
|
"SourceRegion",
|
|
18190
|
-
"UseLatestRestorableTime"
|
|
18223
|
+
"UseLatestRestorableTime",
|
|
18224
|
+
"WithExpressConfiguration"
|
|
18191
18225
|
]),
|
|
18192
18226
|
readOnly: /* @__PURE__ */ new Set([
|
|
18193
18227
|
"DBClusterArn",
|
|
@@ -18324,20 +18358,19 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18324
18358
|
"Auth",
|
|
18325
18359
|
"DBProxyName",
|
|
18326
18360
|
"DebugLogging",
|
|
18361
|
+
"DefaultAuthScheme",
|
|
18362
|
+
"EndpointNetworkType",
|
|
18327
18363
|
"EngineFamily",
|
|
18328
18364
|
"IdleClientTimeout",
|
|
18329
18365
|
"RequireTLS",
|
|
18330
18366
|
"RoleArn",
|
|
18331
18367
|
"Tags",
|
|
18368
|
+
"TargetConnectionNetworkType",
|
|
18332
18369
|
"VpcSecurityGroupIds",
|
|
18333
18370
|
"VpcSubnetIds"
|
|
18334
18371
|
]),
|
|
18335
|
-
silentDrop: /* @__PURE__ */ new Map(
|
|
18336
|
-
|
|
18337
|
-
["EndpointNetworkType", "not yet implemented by cdkd"],
|
|
18338
|
-
["TargetConnectionNetworkType", "not yet implemented by cdkd"]
|
|
18339
|
-
]),
|
|
18340
|
-
createOnlyDrops: /* @__PURE__ */ new Set(["EndpointNetworkType", "TargetConnectionNetworkType"]),
|
|
18372
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
18373
|
+
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
18341
18374
|
readOnly: /* @__PURE__ */ new Set([
|
|
18342
18375
|
"DBProxyArn",
|
|
18343
18376
|
"Endpoint",
|
|
@@ -18349,13 +18382,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18349
18382
|
handled: /* @__PURE__ */ new Set([
|
|
18350
18383
|
"DBProxyEndpointName",
|
|
18351
18384
|
"DBProxyName",
|
|
18385
|
+
"EndpointNetworkType",
|
|
18352
18386
|
"Tags",
|
|
18353
18387
|
"TargetRole",
|
|
18354
18388
|
"VpcSecurityGroupIds",
|
|
18355
18389
|
"VpcSubnetIds"
|
|
18356
18390
|
]),
|
|
18357
|
-
silentDrop: /* @__PURE__ */ new Map(
|
|
18358
|
-
createOnlyDrops: /* @__PURE__ */ new Set(
|
|
18391
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
18392
|
+
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
18359
18393
|
readOnly: /* @__PURE__ */ new Set([
|
|
18360
18394
|
"DBProxyEndpointArn",
|
|
18361
18395
|
"Endpoint",
|
|
@@ -18479,17 +18513,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18479
18513
|
}],
|
|
18480
18514
|
["AWS::S3Express::DirectoryBucket", {
|
|
18481
18515
|
handled: /* @__PURE__ */ new Set([
|
|
18516
|
+
"BucketEncryption",
|
|
18482
18517
|
"BucketName",
|
|
18483
18518
|
"DataRedundancy",
|
|
18519
|
+
"InventoryConfigurations",
|
|
18520
|
+
"LifecycleConfiguration",
|
|
18484
18521
|
"LocationName",
|
|
18522
|
+
"MetricsConfigurations",
|
|
18485
18523
|
"Tags"
|
|
18486
18524
|
]),
|
|
18487
|
-
silentDrop: /* @__PURE__ */ new Map(
|
|
18488
|
-
["BucketEncryption", "not yet implemented by cdkd"],
|
|
18489
|
-
["InventoryConfigurations", "not yet implemented by cdkd"],
|
|
18490
|
-
["LifecycleConfiguration", "not yet implemented by cdkd"],
|
|
18491
|
-
["MetricsConfigurations", "not yet implemented by cdkd"]
|
|
18492
|
-
]),
|
|
18525
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
18493
18526
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
18494
18527
|
readOnly: /* @__PURE__ */ new Set(["Arn", "AvailabilityZoneName"]),
|
|
18495
18528
|
ccRouteUnavailable: false
|
|
@@ -18503,26 +18536,21 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18503
18536
|
}],
|
|
18504
18537
|
["AWS::S3Tables::Table", {
|
|
18505
18538
|
handled: /* @__PURE__ */ new Set([
|
|
18539
|
+
"Compaction",
|
|
18506
18540
|
"Format",
|
|
18541
|
+
"IcebergMetadata",
|
|
18507
18542
|
"Name",
|
|
18508
18543
|
"Namespace",
|
|
18509
18544
|
"OpenTableFormat",
|
|
18545
|
+
"SnapshotManagement",
|
|
18546
|
+
"StorageClassConfiguration",
|
|
18510
18547
|
"TableBucketARN",
|
|
18511
18548
|
"TableName",
|
|
18512
|
-
"Tags"
|
|
18513
|
-
]),
|
|
18514
|
-
silentDrop: /* @__PURE__ */ new Map([
|
|
18515
|
-
["Compaction", "not yet implemented by cdkd"],
|
|
18516
|
-
["IcebergMetadata", "not yet implemented by cdkd"],
|
|
18517
|
-
["SnapshotManagement", "not yet implemented by cdkd"],
|
|
18518
|
-
["StorageClassConfiguration", "not yet implemented by cdkd"],
|
|
18519
|
-
["WithoutMetadata", "not yet implemented by cdkd"]
|
|
18520
|
-
]),
|
|
18521
|
-
createOnlyDrops: /* @__PURE__ */ new Set([
|
|
18522
|
-
"IcebergMetadata",
|
|
18523
|
-
"StorageClassConfiguration",
|
|
18549
|
+
"Tags",
|
|
18524
18550
|
"WithoutMetadata"
|
|
18525
18551
|
]),
|
|
18552
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
18553
|
+
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
18526
18554
|
readOnly: /* @__PURE__ */ new Set([
|
|
18527
18555
|
"TableARN",
|
|
18528
18556
|
"VersionToken",
|
|
@@ -18531,14 +18559,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18531
18559
|
ccRouteUnavailable: false
|
|
18532
18560
|
}],
|
|
18533
18561
|
["AWS::S3Tables::TableBucket", {
|
|
18534
|
-
handled: /* @__PURE__ */ new Set([
|
|
18535
|
-
|
|
18536
|
-
|
|
18537
|
-
|
|
18538
|
-
|
|
18539
|
-
|
|
18540
|
-
|
|
18562
|
+
handled: /* @__PURE__ */ new Set([
|
|
18563
|
+
"EncryptionConfiguration",
|
|
18564
|
+
"MetricsConfiguration",
|
|
18565
|
+
"ReplicationConfiguration",
|
|
18566
|
+
"StorageClassConfiguration",
|
|
18567
|
+
"TableBucketName",
|
|
18568
|
+
"Tags",
|
|
18569
|
+
"UnreferencedFileRemoval"
|
|
18541
18570
|
]),
|
|
18571
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
18542
18572
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
18543
18573
|
readOnly: /* @__PURE__ */ new Set(["TableBucketARN"]),
|
|
18544
18574
|
ccRouteUnavailable: false
|
|
@@ -18770,25 +18800,24 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18770
18800
|
}],
|
|
18771
18801
|
["AWS::WAFv2::WebACL", {
|
|
18772
18802
|
handled: /* @__PURE__ */ new Set([
|
|
18803
|
+
"ApplicationConfig",
|
|
18773
18804
|
"AssociationConfig",
|
|
18774
18805
|
"CaptchaConfig",
|
|
18775
18806
|
"ChallengeConfig",
|
|
18776
18807
|
"CustomResponseBodies",
|
|
18808
|
+
"DataProtectionConfig",
|
|
18777
18809
|
"DefaultAction",
|
|
18778
18810
|
"Description",
|
|
18811
|
+
"MonetizationConfig",
|
|
18779
18812
|
"Name",
|
|
18813
|
+
"OnSourceDDoSProtectionConfig",
|
|
18780
18814
|
"Rules",
|
|
18781
18815
|
"Scope",
|
|
18782
18816
|
"Tags",
|
|
18783
18817
|
"TokenDomains",
|
|
18784
18818
|
"VisibilityConfig"
|
|
18785
18819
|
]),
|
|
18786
|
-
silentDrop: /* @__PURE__ */ new Map(
|
|
18787
|
-
["ApplicationConfig", "not yet implemented by cdkd"],
|
|
18788
|
-
["DataProtectionConfig", "not yet implemented by cdkd"],
|
|
18789
|
-
["MonetizationConfig", "not yet implemented by cdkd"],
|
|
18790
|
-
["OnSourceDDoSProtectionConfig", "not yet implemented by cdkd"]
|
|
18791
|
-
]),
|
|
18820
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
18792
18821
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
18793
18822
|
readOnly: /* @__PURE__ */ new Set([
|
|
18794
18823
|
"Arn",
|
|
@@ -19130,7 +19159,8 @@ const NON_PROVISIONABLE_TYPES = /* @__PURE__ */ new Set([
|
|
|
19130
19159
|
"AWS::WAFRegional::XssMatchSet",
|
|
19131
19160
|
"AWS::Wisdom::Session",
|
|
19132
19161
|
"AWS::WorkSpaces::WorkSpaceApplication",
|
|
19133
|
-
"AWS::WorkSpaces::WorkspaceBundle"
|
|
19162
|
+
"AWS::WorkSpaces::WorkspaceBundle",
|
|
19163
|
+
"AWS::WorkSpaces::WorkspaceImage"
|
|
19134
19164
|
]);
|
|
19135
19165
|
|
|
19136
19166
|
//#endregion
|
|
@@ -19253,21 +19283,39 @@ function excludeCreateOnly(resourceType, names) {
|
|
|
19253
19283
|
return names.filter((property) => !createOnly.has(property));
|
|
19254
19284
|
}
|
|
19255
19285
|
function withoutUnwrittenSilentDropProperties(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence) {
|
|
19256
|
-
const drops = findSilentDropProperties(resourceType, recordedProperties);
|
|
19257
|
-
if (drops.length === 0) return recordedProperties;
|
|
19258
19286
|
const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops;
|
|
19259
|
-
const
|
|
19260
|
-
const removable = drops.map(({ property }) => property).filter((property) => createOnly?.has(property) !== true || evidence.has(property) && !accepted.has(property));
|
|
19287
|
+
const removable = findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly?.has(property) !== true).concat(evidenceNamedUnwritten(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence).filter((property) => desiredProperties === void 0 || !Object.hasOwn(desiredProperties, property) || askedUnchanged(recordedProperties, desiredProperties, property)));
|
|
19261
19288
|
if (removable.length === 0) return recordedProperties;
|
|
19262
19289
|
const narrowed = { ...recordedProperties };
|
|
19263
19290
|
for (const property of removable) delete narrowed[property];
|
|
19264
19291
|
return narrowed;
|
|
19265
19292
|
}
|
|
19266
19293
|
function findUnwrittenCreateOnlyDrops(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence) {
|
|
19267
|
-
|
|
19268
|
-
|
|
19294
|
+
return evidenceNamedUnwritten(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence).filter((property) => Object.hasOwn(desiredProperties, property) && askedUnchanged(recordedProperties, desiredProperties, property));
|
|
19295
|
+
}
|
|
19296
|
+
function evidenceNamedUnwritten(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence) {
|
|
19297
|
+
if (evidence.size === 0) return [];
|
|
19298
|
+
const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops ?? /* @__PURE__ */ new Set();
|
|
19269
19299
|
const accepted = new Set(findAcceptedSilentDrops(resourceType, desiredProperties, allowedKeys, recordedProperties));
|
|
19270
|
-
return findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly.has(property) && evidence.has(property) && !accepted.has(property)
|
|
19300
|
+
return [...findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly.has(property) && evidence.has(property) && !accepted.has(property)), ...findHandledUnwrittenCreateOnly(resourceType, recordedProperties, evidence)].sort((a, b) => a.localeCompare(b));
|
|
19301
|
+
}
|
|
19302
|
+
function askedUnchanged(recordedProperties, desiredProperties, property) {
|
|
19303
|
+
return sameJsonValue(recordedProperties[property], desiredProperties[property], "unchanged");
|
|
19304
|
+
}
|
|
19305
|
+
function findHandledUnwrittenCreateOnly(resourceType, recordedProperties, evidence) {
|
|
19306
|
+
if (evidence.size === 0) return [];
|
|
19307
|
+
const handled = getPropertyCoverage(resourceType)?.handled;
|
|
19308
|
+
if (handled === void 0) return [];
|
|
19309
|
+
const createOnlyRoots = new Set((CREATE_ONLY_PATHS_SNAPSHOT.get(resourceType) ?? []).filter((path) => path.length === 1).map((path) => path[0]));
|
|
19310
|
+
return [...evidence].filter((property) => handled.has(property) && createOnlyRoots.has(property) && Object.hasOwn(recordedProperties, property)).sort((a, b) => a.localeCompare(b));
|
|
19311
|
+
}
|
|
19312
|
+
function acceptedCreateOnlyDropsEvidence(recordedProperties, resourceType, provisionedBy, carried) {
|
|
19313
|
+
if (provisionedBy !== "sdk") return void 0;
|
|
19314
|
+
const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops ?? /* @__PURE__ */ new Set();
|
|
19315
|
+
const names = findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly.has(property) && (carried === void 0 || carried.has(property)));
|
|
19316
|
+
const handled = carried === void 0 ? [] : findHandledUnwrittenCreateOnly(resourceType, recordedProperties, carried);
|
|
19317
|
+
const all = [...names, ...handled].sort((a, b) => a.localeCompare(b));
|
|
19318
|
+
return all.length > 0 ? all : void 0;
|
|
19271
19319
|
}
|
|
19272
19320
|
function unwrittenCreateOnlyReplacement(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence, replacingPaths) {
|
|
19273
19321
|
if (replacingPaths.length === 0) return [];
|
|
@@ -21107,6 +21155,9 @@ const REF_RETURNS_ARN_FROM_STATE = /* @__PURE__ */ new Map([
|
|
|
21107
21155
|
["AWS::AppSync::DataSource", ["DataSourceArn"]],
|
|
21108
21156
|
["AWS::AppSync::Resolver", ["ResolverArn"]]
|
|
21109
21157
|
]);
|
|
21158
|
+
function graphQLSchemaCfnId(physicalId) {
|
|
21159
|
+
return /^[a-z0-9]+$/.test(physicalId) ? `${physicalId}GraphQLSchema` : physicalId;
|
|
21160
|
+
}
|
|
21110
21161
|
function isStalePlaceholderArnAttribute(resourceType, attributeName, value) {
|
|
21111
21162
|
if (!REF_RETURNS_ARN_FROM_STATE.get(resourceType)?.includes(attributeName)) return false;
|
|
21112
21163
|
return typeof value === "string" && isPlaceholderArn(value);
|
|
@@ -21187,6 +21238,7 @@ function lacksRecordedTableArn(resource) {
|
|
|
21187
21238
|
}
|
|
21188
21239
|
function cfnRefValueFromPhysicalId(resourceType, physicalId, stateLookup) {
|
|
21189
21240
|
if (resourceType === "AWS::S3Tables::Table") return s3TablesTableRefFromPhysicalId(physicalId, stateLookup);
|
|
21241
|
+
if (resourceType === "AWS::AppSync::GraphQLSchema") return graphQLSchemaCfnId(physicalId);
|
|
21190
21242
|
if (resourceType === "AWS::Glue::Table") {
|
|
21191
21243
|
const tableName = glueTableRefFromPhysicalId(physicalId, stateLookup);
|
|
21192
21244
|
if (tableName !== void 0) return tableName;
|
|
@@ -23956,6 +24008,7 @@ async function constructAttributeForAppTypes(resolver, resource, attributeName,
|
|
|
23956
24008
|
case "ApiId": return physicalId;
|
|
23957
24009
|
default: return guardedPhysicalIdFallback(resolver, logicalId, attributeName, resourceType, physicalId, context);
|
|
23958
24010
|
}
|
|
24011
|
+
if (resourceType === "AWS::AppSync::GraphQLSchema" && attributeName === "Id") return graphQLSchemaCfnId(physicalId);
|
|
23959
24012
|
if (resourceType === "AWS::ApiGatewayV2::Api") switch (attributeName) {
|
|
23960
24013
|
case "ExecuteApiArn": return `arn:${partition}:execute-api:${region}:${accountId}:${physicalId}`;
|
|
23961
24014
|
case "ApiId": return physicalId;
|
|
@@ -26006,14 +26059,80 @@ function withUnsettledProperties(record, names) {
|
|
|
26006
26059
|
};
|
|
26007
26060
|
}
|
|
26008
26061
|
function withoutUnsettledProperties(record) {
|
|
26009
|
-
if (!Object.hasOwn(record, "unsettledProperties")) return record;
|
|
26010
|
-
const { unsettledProperties: _cleared, ...rest } = record;
|
|
26062
|
+
if (!Object.hasOwn(record, "unsettledProperties") && !Object.hasOwn(record, "unsettledItems")) return record;
|
|
26063
|
+
const { unsettledProperties: _cleared, unsettledItems: _items, ...rest } = record;
|
|
26011
26064
|
return rest;
|
|
26012
26065
|
}
|
|
26066
|
+
const UNSETTLED_ITEMS_PER_PATH_CAP = 100;
|
|
26067
|
+
const UNSETTLED_ITEM_LENGTH_CAP = 255;
|
|
26068
|
+
function unsettledItemsTopKey(path) {
|
|
26069
|
+
const cut = path.search(/[.[]/);
|
|
26070
|
+
return cut === -1 ? path : path.slice(0, cut);
|
|
26071
|
+
}
|
|
26072
|
+
function unsettledItemsOf(record) {
|
|
26073
|
+
const out = /* @__PURE__ */ new Map();
|
|
26074
|
+
if (record === null || typeof record !== "object") return out;
|
|
26075
|
+
const value = record.unsettledItems;
|
|
26076
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return out;
|
|
26077
|
+
const unsettled = unsettledPropertiesOf(record);
|
|
26078
|
+
for (const [path, entries] of Object.entries(value)) {
|
|
26079
|
+
if (!unsettled.has(unsettledItemsTopKey(path))) continue;
|
|
26080
|
+
if (!Array.isArray(entries) || entries.length > 100) continue;
|
|
26081
|
+
const names = entries.filter((entry) => typeof entry === "string" && entry !== "" && entry.length <= 255);
|
|
26082
|
+
if (names.length > 0) out.set(path, new Set(names));
|
|
26083
|
+
}
|
|
26084
|
+
return out;
|
|
26085
|
+
}
|
|
26086
|
+
function isUsableAttemptedName(name) {
|
|
26087
|
+
return !name.includes("{{resolve:") && !name.includes("***");
|
|
26088
|
+
}
|
|
26089
|
+
function withUnsettledItems(record, items) {
|
|
26090
|
+
const merged = /* @__PURE__ */ new Map();
|
|
26091
|
+
for (const [path, names] of unsettledItemsOf(record)) merged.set(path, new Set(names));
|
|
26092
|
+
const unsettled = unsettledPropertiesOf(record);
|
|
26093
|
+
let added = false;
|
|
26094
|
+
for (const [path, names] of items) {
|
|
26095
|
+
if (!unsettled.has(unsettledItemsTopKey(path))) continue;
|
|
26096
|
+
const set = merged.get(path) ?? /* @__PURE__ */ new Set();
|
|
26097
|
+
for (const name of names) {
|
|
26098
|
+
if (typeof name !== "string" || name === "" || name.length > 255) continue;
|
|
26099
|
+
if (!set.has(name)) {
|
|
26100
|
+
set.add(name);
|
|
26101
|
+
added = true;
|
|
26102
|
+
}
|
|
26103
|
+
}
|
|
26104
|
+
if (set.size > 0) merged.set(path, set);
|
|
26105
|
+
}
|
|
26106
|
+
if (!added) return record;
|
|
26107
|
+
const field = {};
|
|
26108
|
+
for (const [path, set] of [...merged].sort(([a], [b]) => a.localeCompare(b))) if (set.size <= 100) field[path] = [...set].sort();
|
|
26109
|
+
return {
|
|
26110
|
+
...record,
|
|
26111
|
+
unsettledItems: field
|
|
26112
|
+
};
|
|
26113
|
+
}
|
|
26114
|
+
function unsettledItemsField(source, keys) {
|
|
26115
|
+
const allowed = new Set(keys);
|
|
26116
|
+
const field = {};
|
|
26117
|
+
for (const [path, names] of unsettledItemsOf(source)) if (allowed.has(unsettledItemsTopKey(path))) field[path] = [...names].sort();
|
|
26118
|
+
return Object.keys(field).length > 0 ? { unsettledItems: field } : {};
|
|
26119
|
+
}
|
|
26013
26120
|
function unsettledContextOf(...records) {
|
|
26014
26121
|
const names = /* @__PURE__ */ new Set();
|
|
26015
|
-
|
|
26016
|
-
|
|
26122
|
+
const items = /* @__PURE__ */ new Map();
|
|
26123
|
+
for (const record of records) {
|
|
26124
|
+
for (const name of unsettledPropertiesOf(record)) names.add(name);
|
|
26125
|
+
for (const [path, set] of unsettledItemsOf(record)) {
|
|
26126
|
+
const merged = items.get(path) ?? /* @__PURE__ */ new Set();
|
|
26127
|
+
for (const name of set) merged.add(name);
|
|
26128
|
+
items.set(path, merged);
|
|
26129
|
+
}
|
|
26130
|
+
}
|
|
26131
|
+
if (names.size === 0) return {};
|
|
26132
|
+
return {
|
|
26133
|
+
unsettledProperties: names,
|
|
26134
|
+
...items.size > 0 && { unsettledItems: items }
|
|
26135
|
+
};
|
|
26017
26136
|
}
|
|
26018
26137
|
|
|
26019
26138
|
//#endregion
|
|
@@ -28671,7 +28790,7 @@ var CloudControlProvider = class {
|
|
|
28671
28790
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
28672
28791
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
28673
28792
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
28674
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
28793
|
+
const { ASGProvider } = await import("./asg-provider-CVLTQtQr.js");
|
|
28675
28794
|
const delegateRegion = ambientRegion();
|
|
28676
28795
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
28677
28796
|
if (asgProvider === void 0) {
|
|
@@ -28780,7 +28899,7 @@ var CloudControlProvider = class {
|
|
|
28780
28899
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
28781
28900
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
28782
28901
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
28783
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
28902
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-CXSZq1c8.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-qdoLunCh.js"))).NeptuneProvider({ region: ccRegion });
|
|
28784
28903
|
this.sdkDeleteDelegates.set(family, {
|
|
28785
28904
|
region: ccRegion,
|
|
28786
28905
|
provider
|
|
@@ -31592,6 +31711,7 @@ const NESTED_REQUIRED = /* @__PURE__ */ new Map([
|
|
|
31592
31711
|
["Source.Auth", ["Type"]],
|
|
31593
31712
|
["Source.GitSubmodulesConfig", ["FetchSubmodules"]],
|
|
31594
31713
|
["Tags", ["Key", "Value"]],
|
|
31714
|
+
["Triggers.FilterGroups", ["Pattern", "Type"]],
|
|
31595
31715
|
["Triggers.PullRequestBuildPolicy", ["RequiresCommentApproval"]],
|
|
31596
31716
|
["Triggers.ScopeConfiguration", ["Name"]]
|
|
31597
31717
|
])],
|
|
@@ -31770,6 +31890,7 @@ const NESTED_REQUIRED = /* @__PURE__ */ new Map([
|
|
|
31770
31890
|
["DeploymentConfiguration.DeploymentCircuitBreaker.ThresholdConfiguration", ["Type", "Value"]],
|
|
31771
31891
|
["DeploymentConfiguration.LifecycleHooks", ["LifecycleStages"]],
|
|
31772
31892
|
["ForceNewDeployment", ["EnableForceNewDeployment"]],
|
|
31893
|
+
["GatewayConnectors", ["PortName"]],
|
|
31773
31894
|
["LoadBalancers.AdvancedConfiguration", ["AlternateTargetGroupArn"]],
|
|
31774
31895
|
["Monitoring", ["MetricConfigurations"]],
|
|
31775
31896
|
["Monitoring.MetricConfigurations", ["MetricNames", "ResolutionSeconds"]],
|
|
@@ -31799,6 +31920,8 @@ const NESTED_REQUIRED = /* @__PURE__ */ new Map([
|
|
|
31799
31920
|
["ContainerDefinitions.LogConfiguration", ["LogDriver"]],
|
|
31800
31921
|
["ContainerDefinitions.LogConfiguration.SecretOptions", ["Name", "ValueFrom"]],
|
|
31801
31922
|
["ContainerDefinitions.ResourceRequirements", ["Type"]],
|
|
31923
|
+
["ContainerDefinitions.ResourceRequirements.SharingStrategy", ["NvidiaMps"]],
|
|
31924
|
+
["ContainerDefinitions.ResourceRequirements.SharingStrategy.NvidiaMps", ["Memory"]],
|
|
31802
31925
|
["ContainerDefinitions.Secrets", ["Name", "ValueFrom"]],
|
|
31803
31926
|
["ContainerDefinitions.Ulimits", [
|
|
31804
31927
|
"HardLimit",
|
|
@@ -32876,6 +32999,7 @@ const PROPERTY_SHAPES = /* @__PURE__ */ new Map([
|
|
|
32876
32999
|
["AWS::CloudFront::OriginAccessControl", "{\"OriginAccessControlConfig\":\"object\"}"],
|
|
32877
33000
|
["AWS::CloudTrail::Trail", "{\"AdvancedEventSelectors\":\"array\",\"AdvancedEventSelectors[]\":\"object\",\"AdvancedEventSelectors[].FieldSelectors\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[]\":\"object\",\"AdvancedEventSelectors[].FieldSelectors[].EndsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].Equals\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotEndsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotEquals\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotStartsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].StartsWith\":\"array\",\"AggregationConfigurations\":\"array\",\"AggregationConfigurations[]\":\"object\",\"AggregationConfigurations[].Templates\":\"array\",\"EventSelectors\":\"array\",\"EventSelectors[]\":\"object\",\"EventSelectors[].DataResources\":\"array\",\"EventSelectors[].DataResources[]\":\"object\",\"EventSelectors[].DataResources[].Values\":\"array\",\"EventSelectors[].ExcludeManagementEventSources\":\"array\",\"InsightSelectors\":\"array\",\"InsightSelectors[]\":\"object\",\"InsightSelectors[].EventCategories\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
32878
33001
|
["AWS::CloudWatch::Alarm", "{\"ActionConfiguration\":\"object\",\"ActionConfiguration.AlarmTagsPropagation\":\"object\",\"ActionConfiguration.AlarmTagsPropagation.ExcludedTagKeys\":\"array\",\"ActionConfiguration.AlarmTagsPropagation.IncludedTagKeys\":\"array\",\"AlarmActions\":\"array\",\"Dimensions\":\"array\",\"Dimensions[]\":\"object\",\"EvaluationCriteria\":\"object\",\"EvaluationCriteria.PromQLCriteria\":\"object\",\"EvaluationWindow\":\"object\",\"EvaluationWindow.SlidingWindow\":\"object\",\"EvaluationWindow.WallClockWindow\":\"object\",\"InsufficientDataActions\":\"array\",\"Metrics\":\"array\",\"Metrics[]\":\"object\",\"Metrics[].MetricStat\":\"object\",\"Metrics[].MetricStat.Metric\":\"object\",\"Metrics[].MetricStat.Metric.Dimensions\":\"array\",\"Metrics[].MetricStat.Metric.Dimensions[]\":\"object\",\"OKActions\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"WarmUpConfiguration\":\"object\"}"],
|
|
33002
|
+
["AWS::CodeBuild::Project", "{\"Artifacts\":\"object\",\"BuildBatchConfig\":\"object\",\"BuildBatchConfig.Restrictions\":\"object\",\"BuildBatchConfig.Restrictions.ComputeTypesAllowed\":\"array\",\"BuildBatchConfig.Restrictions.FleetsAllowed\":\"array\",\"Cache\":\"object\",\"Cache.Modes\":\"array\",\"Environment\":\"object\",\"Environment.DockerServer\":\"object\",\"Environment.DockerServer.SecurityGroupIds\":\"array\",\"Environment.EnvironmentVariables\":\"array\",\"Environment.EnvironmentVariables[]\":\"object\",\"Environment.Fleet\":\"object\",\"Environment.RegistryCredential\":\"object\",\"FileSystemLocations\":\"array\",\"FileSystemLocations[]\":\"object\",\"LogsConfig\":\"object\",\"LogsConfig.CloudWatchLogs\":\"object\",\"LogsConfig.S3Logs\":\"object\",\"SecondaryArtifacts\":\"array\",\"SecondaryArtifacts[]\":\"object\",\"SecondarySourceVersions\":\"array\",\"SecondarySourceVersions[]\":\"object\",\"SecondarySources\":\"array\",\"SecondarySources[]\":\"object\",\"SecondarySources[].Auth\":\"object\",\"SecondarySources[].BuildStatusConfig\":\"object\",\"SecondarySources[].GitSubmodulesConfig\":\"object\",\"Source\":\"object\",\"Source.Auth\":\"object\",\"Source.BuildStatusConfig\":\"object\",\"Source.GitSubmodulesConfig\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Triggers\":\"object\",\"Triggers.FilterGroups\":\"array\",\"Triggers.FilterGroups[]\":\"array\",\"Triggers.FilterGroups[][]\":\"object\",\"Triggers.PullRequestBuildPolicy\":\"object\",\"Triggers.PullRequestBuildPolicy.ApproverRoles\":\"array\",\"Triggers.ScopeConfiguration\":\"object\",\"VpcConfig\":\"object\",\"VpcConfig.SecurityGroupIds\":\"array\",\"VpcConfig.Subnets\":\"array\"}"],
|
|
32879
33003
|
["AWS::CodeCommit::Repository", "{\"Code\":\"object\",\"Code.S3\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Triggers\":\"array\",\"Triggers[]\":\"object\",\"Triggers[].Branches\":\"array\",\"Triggers[].Events\":\"array\"}"],
|
|
32880
33004
|
["AWS::Cognito::UserPool", "{\"AccountRecoverySetting\":\"object\",\"AccountRecoverySetting.RecoveryMechanisms\":\"array\",\"AccountRecoverySetting.RecoveryMechanisms[]\":\"object\",\"AdminCreateUserConfig\":\"object\",\"AdminCreateUserConfig.InviteMessageTemplate\":\"object\",\"AliasAttributes\":\"array\",\"AutoVerifiedAttributes\":\"array\",\"DeviceConfiguration\":\"object\",\"EmailConfiguration\":\"object\",\"EnabledMfas\":\"array\",\"IssuerConfiguration\":\"object\",\"KeyConfiguration\":\"object\",\"LambdaConfig\":\"object\",\"LambdaConfig.CustomEmailSender\":\"object\",\"LambdaConfig.CustomSMSSender\":\"object\",\"LambdaConfig.InboundFederation\":\"object\",\"LambdaConfig.PreTokenGenerationConfig\":\"object\",\"Policies\":\"object\",\"Policies.PasswordPolicy\":\"object\",\"Policies.SignInPolicy\":\"object\",\"Policies.SignInPolicy.AllowedFirstAuthFactors\":\"array\",\"Schema\":\"array\",\"Schema[]\":\"object\",\"Schema[].NumberAttributeConstraints\":\"object\",\"Schema[].StringAttributeConstraints\":\"object\",\"SmsConfiguration\":\"object\",\"SmsConfiguration.EumsSms\":\"object\",\"UserAttributeUpdateSettings\":\"object\",\"UserAttributeUpdateSettings.AttributesRequireVerificationBeforeUpdate\":\"array\",\"UserPoolAddOns\":\"object\",\"UserPoolAddOns.AdvancedSecurityAdditionalFlows\":\"object\",\"UserPoolTags\":\"object\",\"UsernameAttributes\":\"array\",\"UsernameConfiguration\":\"object\",\"VerificationMessageTemplate\":\"object\"}"],
|
|
32881
33005
|
["AWS::DLM::LifecyclePolicy", "{\"CrossRegionCopyTargets\":\"array\",\"CrossRegionCopyTargets[]\":\"object\",\"Exclusions\":\"object\",\"Exclusions.ExcludeTags\":\"array\",\"Exclusions.ExcludeTags[]\":\"object\",\"Exclusions.ExcludeVolumeTypes\":\"array\",\"PolicyDetails\":\"object\",\"PolicyDetails.Actions\":\"array\",\"PolicyDetails.Actions[]\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy\":\"array\",\"PolicyDetails.Actions[].CrossRegionCopy[]\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy[].EncryptionConfiguration\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy[].RetainRule\":\"object\",\"PolicyDetails.CrossRegionCopyTargets\":\"array\",\"PolicyDetails.CrossRegionCopyTargets[]\":\"object\",\"PolicyDetails.EventSource\":\"object\",\"PolicyDetails.EventSource.Parameters\":\"object\",\"PolicyDetails.EventSource.Parameters.SnapshotOwner\":\"array\",\"PolicyDetails.Exclusions\":\"object\",\"PolicyDetails.Exclusions.ExcludeTags\":\"array\",\"PolicyDetails.Exclusions.ExcludeTags[]\":\"object\",\"PolicyDetails.Exclusions.ExcludeVolumeTypes\":\"array\",\"PolicyDetails.Parameters\":\"object\",\"PolicyDetails.Parameters.ExcludeDataVolumeTags\":\"array\",\"PolicyDetails.Parameters.ExcludeDataVolumeTags[]\":\"object\",\"PolicyDetails.ResourceLocations\":\"array\",\"PolicyDetails.ResourceTypes\":\"array\",\"PolicyDetails.Schedules\":\"array\",\"PolicyDetails.Schedules[]\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule.RetainRule\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule.RetainRule.RetentionArchiveTier\":\"object\",\"PolicyDetails.Schedules[].CreateRule\":\"object\",\"PolicyDetails.Schedules[].CreateRule.Scripts\":\"array\",\"PolicyDetails.Schedules[].CreateRule.Scripts[]\":\"object\",\"PolicyDetails.Schedules[].CreateRule.Scripts[].Stages\":\"array\",\"PolicyDetails.Schedules[].CreateRule.Times\":\"array\",\"PolicyDetails.Schedules[].CrossRegionCopyRules\":\"array\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[]\":\"object\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[].DeprecateRule\":\"object\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[].RetainRule\":\"object\",\"PolicyDetails.Schedules[].DeprecateRule\":\"object\",\"PolicyDetails.Schedules[].FastRestoreRule\":\"object\",\"PolicyDetails.Schedules[].FastRestoreRule.AvailabilityZoneIds\":\"array\",\"PolicyDetails.Schedules[].FastRestoreRule.AvailabilityZones\":\"array\",\"PolicyDetails.Schedules[].RetainRule\":\"object\",\"PolicyDetails.Schedules[].ShareRules\":\"array\",\"PolicyDetails.Schedules[].ShareRules[]\":\"object\",\"PolicyDetails.Schedules[].ShareRules[].TargetAccounts\":\"array\",\"PolicyDetails.Schedules[].TagsToAdd\":\"array\",\"PolicyDetails.Schedules[].TagsToAdd[]\":\"object\",\"PolicyDetails.Schedules[].VariableTags\":\"array\",\"PolicyDetails.Schedules[].VariableTags[]\":\"object\",\"PolicyDetails.TargetTags\":\"array\",\"PolicyDetails.TargetTags[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
@@ -32894,8 +33018,8 @@ const PROPERTY_SHAPES = /* @__PURE__ */ new Map([
|
|
|
32894
33018
|
["AWS::EC2::VPC", "{\"CidrBlockAssociations\":\"array\",\"Ipv6CidrBlocks\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"VpcEncryptionControl\":\"object\",\"VpcEncryptionControl.ResourceExclusions\":\"object\",\"VpcEncryptionControl.ResourceExclusions.EgressOnlyInternetGateway\":\"object\",\"VpcEncryptionControl.ResourceExclusions.ElasticFileSystem\":\"object\",\"VpcEncryptionControl.ResourceExclusions.InternetGateway\":\"object\",\"VpcEncryptionControl.ResourceExclusions.Lambda\":\"object\",\"VpcEncryptionControl.ResourceExclusions.NatGateway\":\"object\",\"VpcEncryptionControl.ResourceExclusions.VirtualPrivateGateway\":\"object\",\"VpcEncryptionControl.ResourceExclusions.VpcLattice\":\"object\",\"VpcEncryptionControl.ResourceExclusions.VpcPeering\":\"object\"}"],
|
|
32895
33019
|
["AWS::ECR::Repository", "{\"EncryptionConfiguration\":\"object\",\"ImageScanningConfiguration\":\"object\",\"ImageTagMutabilityExclusionFilters\":\"array\",\"ImageTagMutabilityExclusionFilters[]\":\"object\",\"LifecyclePolicy\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
32896
33020
|
["AWS::ECS::Cluster", "{\"CapacityProviders\":\"array\",\"ClusterSettings\":\"array\",\"ClusterSettings[]\":\"object\",\"Configuration\":\"object\",\"Configuration.ExecuteCommandConfiguration\":\"object\",\"Configuration.ExecuteCommandConfiguration.LogConfiguration\":\"object\",\"Configuration.ManagedStorageConfiguration\":\"object\",\"DefaultCapacityProviderStrategy\":\"array\",\"DefaultCapacityProviderStrategy[]\":\"object\",\"ServiceConnectDefaults\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
32897
|
-
["AWS::ECS::Service", "{\"CapacityProviderStrategy\":\"array\",\"CapacityProviderStrategy[]\":\"object\",\"DeploymentConfiguration\":\"object\",\"DeploymentConfiguration.Alarms\":\"object\",\"DeploymentConfiguration.Alarms.AlarmNames\":\"array\",\"DeploymentConfiguration.CanaryConfiguration\":\"object\",\"DeploymentConfiguration.DeploymentCircuitBreaker\":\"object\",\"DeploymentConfiguration.DeploymentCircuitBreaker.ThresholdConfiguration\":\"object\",\"DeploymentConfiguration.EarlySuccessCriteria\":\"object\",\"DeploymentConfiguration.LifecycleHooks\":\"array\",\"DeploymentConfiguration.LifecycleHooks[]\":\"object\",\"DeploymentConfiguration.LifecycleHooks[].LifecycleStages\":\"array\",\"DeploymentConfiguration.LifecycleHooks[].TimeoutConfiguration\":\"object\",\"DeploymentConfiguration.LinearConfiguration\":\"object\",\"DeploymentController\":\"object\",\"ForceNewDeployment\":\"object\",\"LoadBalancers\":\"array\",\"LoadBalancers[]\":\"object\",\"LoadBalancers[].AdvancedConfiguration\":\"object\",\"Monitoring\":\"object\",\"Monitoring.MetricConfigurations\":\"array\",\"Monitoring.MetricConfigurations[]\":\"object\",\"Monitoring.MetricConfigurations[].MetricNames\":\"array\",\"NetworkConfiguration\":\"object\",\"NetworkConfiguration.AwsvpcConfiguration\":\"object\",\"NetworkConfiguration.AwsvpcConfiguration.SecurityGroups\":\"array\",\"NetworkConfiguration.AwsvpcConfiguration.Subnets\":\"array\",\"PlacementConstraints\":\"array\",\"PlacementConstraints[]\":\"object\",\"PlacementStrategies\":\"array\",\"PlacementStrategies[]\":\"object\",\"ServiceConnectConfiguration\":\"object\",\"ServiceConnectConfiguration.AccessLogConfiguration\":\"object\",\"ServiceConnectConfiguration.LogConfiguration\":\"object\",\"ServiceConnectConfiguration.LogConfiguration.Options\":\"object\",\"ServiceConnectConfiguration.LogConfiguration.SecretOptions\":\"array\",\"ServiceConnectConfiguration.LogConfiguration.SecretOptions[]\":\"object\",\"ServiceConnectConfiguration.Services\":\"array\",\"ServiceConnectConfiguration.Services[]\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases\":\"array\",\"ServiceConnectConfiguration.Services[].ClientAliases[]\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules.Header\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules.Header.Value\":\"object\",\"ServiceConnectConfiguration.Services[].Timeout\":\"object\",\"ServiceConnectConfiguration.Services[].Tls\":\"object\",\"ServiceConnectConfiguration.Services[].Tls.IssuerCertificateAuthority\":\"object\",\"ServiceRegistries\":\"array\",\"ServiceRegistries[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"VolumeConfigurations\":\"array\",\"VolumeConfigurations[]\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications\":\"array\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[]\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[].Tags\":\"array\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[].Tags[]\":\"object\",\"VpcLatticeConfigurations\":\"array\",\"VpcLatticeConfigurations[]\":\"object\",\"VpcLatticeConfigurations[].AdvancedConfiguration\":\"object\"}"],
|
|
32898
|
-
["AWS::ECS::TaskDefinition", "{\"ContainerDefinitions\":\"array\",\"ContainerDefinitions[]\":\"object\",\"ContainerDefinitions[].Command\":\"array\",\"ContainerDefinitions[].CredentialSpecs\":\"array\",\"ContainerDefinitions[].DependsOn\":\"array\",\"ContainerDefinitions[].DependsOn[]\":\"object\",\"ContainerDefinitions[].DnsSearchDomains\":\"array\",\"ContainerDefinitions[].DnsServers\":\"array\",\"ContainerDefinitions[].DockerLabels\":\"object\",\"ContainerDefinitions[].DockerSecurityOptions\":\"array\",\"ContainerDefinitions[].EntryPoint\":\"array\",\"ContainerDefinitions[].Environment\":\"array\",\"ContainerDefinitions[].EnvironmentFiles\":\"array\",\"ContainerDefinitions[].EnvironmentFiles[]\":\"object\",\"ContainerDefinitions[].Environment[]\":\"object\",\"ContainerDefinitions[].ExtraHosts\":\"array\",\"ContainerDefinitions[].ExtraHosts[]\":\"object\",\"ContainerDefinitions[].FirelensConfiguration\":\"object\",\"ContainerDefinitions[].FirelensConfiguration.Options\":\"object\",\"ContainerDefinitions[].HealthCheck\":\"object\",\"ContainerDefinitions[].HealthCheck.Command\":\"array\",\"ContainerDefinitions[].Links\":\"array\",\"ContainerDefinitions[].LinuxParameters\":\"object\",\"ContainerDefinitions[].LinuxParameters.Capabilities\":\"object\",\"ContainerDefinitions[].LinuxParameters.Capabilities.Add\":\"array\",\"ContainerDefinitions[].LinuxParameters.Capabilities.Drop\":\"array\",\"ContainerDefinitions[].LinuxParameters.Devices\":\"array\",\"ContainerDefinitions[].LinuxParameters.Devices[]\":\"object\",\"ContainerDefinitions[].LinuxParameters.Devices[].Permissions\":\"array\",\"ContainerDefinitions[].LinuxParameters.Tmpfs\":\"array\",\"ContainerDefinitions[].LinuxParameters.Tmpfs[]\":\"object\",\"ContainerDefinitions[].LinuxParameters.Tmpfs[].MountOptions\":\"array\",\"ContainerDefinitions[].LogConfiguration\":\"object\",\"ContainerDefinitions[].LogConfiguration.Options\":\"object\",\"ContainerDefinitions[].LogConfiguration.SecretOptions\":\"array\",\"ContainerDefinitions[].LogConfiguration.SecretOptions[]\":\"object\",\"ContainerDefinitions[].MountPoints\":\"array\",\"ContainerDefinitions[].MountPoints[]\":\"object\",\"ContainerDefinitions[].PortMappings\":\"array\",\"ContainerDefinitions[].PortMappings[]\":\"object\",\"ContainerDefinitions[].RepositoryCredentials\":\"object\",\"ContainerDefinitions[].ResourceRequirements\":\"array\",\"ContainerDefinitions[].ResourceRequirements[]\":\"object\",\"ContainerDefinitions[].RestartPolicy\":\"object\",\"ContainerDefinitions[].RestartPolicy.IgnoredExitCodes\":\"array\",\"ContainerDefinitions[].Secrets\":\"array\",\"ContainerDefinitions[].Secrets[]\":\"object\",\"ContainerDefinitions[].SystemControls\":\"array\",\"ContainerDefinitions[].SystemControls[]\":\"object\",\"ContainerDefinitions[].Ulimits\":\"array\",\"ContainerDefinitions[].Ulimits[]\":\"object\",\"ContainerDefinitions[].VolumesFrom\":\"array\",\"ContainerDefinitions[].VolumesFrom[]\":\"object\",\"EphemeralStorage\":\"object\",\"InferenceAccelerators\":\"array\",\"InferenceAccelerators[]\":\"object\",\"PlacementConstraints\":\"array\",\"PlacementConstraints[]\":\"object\",\"ProxyConfiguration\":\"object\",\"ProxyConfiguration.ProxyConfigurationProperties\":\"array\",\"ProxyConfiguration.ProxyConfigurationProperties[]\":\"object\",\"RequiresCompatibilities\":\"array\",\"RuntimePlatform\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Volumes\":\"array\",\"Volumes[]\":\"object\",\"Volumes[].DockerVolumeConfiguration\":\"object\",\"Volumes[].DockerVolumeConfiguration.DriverOpts\":\"object\",\"Volumes[].DockerVolumeConfiguration.Labels\":\"object\",\"Volumes[].EFSVolumeConfiguration\":\"object\",\"Volumes[].EFSVolumeConfiguration.AuthorizationConfig\":\"object\",\"Volumes[].FSxWindowsFileServerVolumeConfiguration\":\"object\",\"Volumes[].FSxWindowsFileServerVolumeConfiguration.AuthorizationConfig\":\"object\",\"Volumes[].Host\":\"object\",\"Volumes[].S3FilesVolumeConfiguration\":\"object\"}"],
|
|
33021
|
+
["AWS::ECS::Service", "{\"CapacityProviderStrategy\":\"array\",\"CapacityProviderStrategy[]\":\"object\",\"DeploymentConfiguration\":\"object\",\"DeploymentConfiguration.Alarms\":\"object\",\"DeploymentConfiguration.Alarms.AlarmNames\":\"array\",\"DeploymentConfiguration.CanaryConfiguration\":\"object\",\"DeploymentConfiguration.DeploymentCircuitBreaker\":\"object\",\"DeploymentConfiguration.DeploymentCircuitBreaker.ThresholdConfiguration\":\"object\",\"DeploymentConfiguration.EarlySuccessCriteria\":\"object\",\"DeploymentConfiguration.LifecycleHooks\":\"array\",\"DeploymentConfiguration.LifecycleHooks[]\":\"object\",\"DeploymentConfiguration.LifecycleHooks[].LifecycleStages\":\"array\",\"DeploymentConfiguration.LifecycleHooks[].TimeoutConfiguration\":\"object\",\"DeploymentConfiguration.LinearConfiguration\":\"object\",\"DeploymentController\":\"object\",\"ForceNewDeployment\":\"object\",\"GatewayConnectors\":\"array\",\"GatewayConnectors[]\":\"object\",\"GatewayConnectors[].Filters\":\"object\",\"GatewayConnectors[].Filters.AccessTypes\":\"array\",\"GatewayConnectors[].HealthCheck\":\"object\",\"GatewayConnectors[].HealthCheck.Matcher\":\"object\",\"LoadBalancers\":\"array\",\"LoadBalancers[]\":\"object\",\"LoadBalancers[].AdvancedConfiguration\":\"object\",\"Monitoring\":\"object\",\"Monitoring.MetricConfigurations\":\"array\",\"Monitoring.MetricConfigurations[]\":\"object\",\"Monitoring.MetricConfigurations[].MetricNames\":\"array\",\"NetworkConfiguration\":\"object\",\"NetworkConfiguration.AwsvpcConfiguration\":\"object\",\"NetworkConfiguration.AwsvpcConfiguration.SecurityGroups\":\"array\",\"NetworkConfiguration.AwsvpcConfiguration.Subnets\":\"array\",\"PlacementConstraints\":\"array\",\"PlacementConstraints[]\":\"object\",\"PlacementStrategies\":\"array\",\"PlacementStrategies[]\":\"object\",\"ServiceConnectConfiguration\":\"object\",\"ServiceConnectConfiguration.AccessLogConfiguration\":\"object\",\"ServiceConnectConfiguration.ContainerConfigurations\":\"array\",\"ServiceConnectConfiguration.ContainerConfigurations[]\":\"object\",\"ServiceConnectConfiguration.LogConfiguration\":\"object\",\"ServiceConnectConfiguration.LogConfiguration.Options\":\"object\",\"ServiceConnectConfiguration.LogConfiguration.SecretOptions\":\"array\",\"ServiceConnectConfiguration.LogConfiguration.SecretOptions[]\":\"object\",\"ServiceConnectConfiguration.Services\":\"array\",\"ServiceConnectConfiguration.Services[]\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases\":\"array\",\"ServiceConnectConfiguration.Services[].ClientAliases[]\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules.Header\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules.Header.Value\":\"object\",\"ServiceConnectConfiguration.Services[].Timeout\":\"object\",\"ServiceConnectConfiguration.Services[].Tls\":\"object\",\"ServiceConnectConfiguration.Services[].Tls.IssuerCertificateAuthority\":\"object\",\"ServiceRegistries\":\"array\",\"ServiceRegistries[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"VolumeConfigurations\":\"array\",\"VolumeConfigurations[]\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications\":\"array\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[]\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[].Tags\":\"array\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[].Tags[]\":\"object\",\"VpcLatticeConfigurations\":\"array\",\"VpcLatticeConfigurations[]\":\"object\",\"VpcLatticeConfigurations[].AdvancedConfiguration\":\"object\"}"],
|
|
33022
|
+
["AWS::ECS::TaskDefinition", "{\"ContainerDefinitions\":\"array\",\"ContainerDefinitions[]\":\"object\",\"ContainerDefinitions[].Command\":\"array\",\"ContainerDefinitions[].CredentialSpecs\":\"array\",\"ContainerDefinitions[].DependsOn\":\"array\",\"ContainerDefinitions[].DependsOn[]\":\"object\",\"ContainerDefinitions[].DnsSearchDomains\":\"array\",\"ContainerDefinitions[].DnsServers\":\"array\",\"ContainerDefinitions[].DockerLabels\":\"object\",\"ContainerDefinitions[].DockerSecurityOptions\":\"array\",\"ContainerDefinitions[].EntryPoint\":\"array\",\"ContainerDefinitions[].Environment\":\"array\",\"ContainerDefinitions[].EnvironmentFiles\":\"array\",\"ContainerDefinitions[].EnvironmentFiles[]\":\"object\",\"ContainerDefinitions[].Environment[]\":\"object\",\"ContainerDefinitions[].ExtraHosts\":\"array\",\"ContainerDefinitions[].ExtraHosts[]\":\"object\",\"ContainerDefinitions[].FirelensConfiguration\":\"object\",\"ContainerDefinitions[].FirelensConfiguration.Options\":\"object\",\"ContainerDefinitions[].HealthCheck\":\"object\",\"ContainerDefinitions[].HealthCheck.Command\":\"array\",\"ContainerDefinitions[].Links\":\"array\",\"ContainerDefinitions[].LinuxParameters\":\"object\",\"ContainerDefinitions[].LinuxParameters.Capabilities\":\"object\",\"ContainerDefinitions[].LinuxParameters.Capabilities.Add\":\"array\",\"ContainerDefinitions[].LinuxParameters.Capabilities.Drop\":\"array\",\"ContainerDefinitions[].LinuxParameters.Devices\":\"array\",\"ContainerDefinitions[].LinuxParameters.Devices[]\":\"object\",\"ContainerDefinitions[].LinuxParameters.Devices[].Permissions\":\"array\",\"ContainerDefinitions[].LinuxParameters.Tmpfs\":\"array\",\"ContainerDefinitions[].LinuxParameters.Tmpfs[]\":\"object\",\"ContainerDefinitions[].LinuxParameters.Tmpfs[].MountOptions\":\"array\",\"ContainerDefinitions[].LogConfiguration\":\"object\",\"ContainerDefinitions[].LogConfiguration.Options\":\"object\",\"ContainerDefinitions[].LogConfiguration.SecretOptions\":\"array\",\"ContainerDefinitions[].LogConfiguration.SecretOptions[]\":\"object\",\"ContainerDefinitions[].MountPoints\":\"array\",\"ContainerDefinitions[].MountPoints[]\":\"object\",\"ContainerDefinitions[].PortMappings\":\"array\",\"ContainerDefinitions[].PortMappings[]\":\"object\",\"ContainerDefinitions[].RepositoryCredentials\":\"object\",\"ContainerDefinitions[].ResourceRequirements\":\"array\",\"ContainerDefinitions[].ResourceRequirements[]\":\"object\",\"ContainerDefinitions[].ResourceRequirements[].SharingStrategy\":\"object\",\"ContainerDefinitions[].ResourceRequirements[].SharingStrategy.NvidiaMps\":\"object\",\"ContainerDefinitions[].RestartPolicy\":\"object\",\"ContainerDefinitions[].RestartPolicy.IgnoredExitCodes\":\"array\",\"ContainerDefinitions[].Secrets\":\"array\",\"ContainerDefinitions[].Secrets[]\":\"object\",\"ContainerDefinitions[].SystemControls\":\"array\",\"ContainerDefinitions[].SystemControls[]\":\"object\",\"ContainerDefinitions[].Ulimits\":\"array\",\"ContainerDefinitions[].Ulimits[]\":\"object\",\"ContainerDefinitions[].VolumesFrom\":\"array\",\"ContainerDefinitions[].VolumesFrom[]\":\"object\",\"EphemeralStorage\":\"object\",\"InferenceAccelerators\":\"array\",\"InferenceAccelerators[]\":\"object\",\"PlacementConstraints\":\"array\",\"PlacementConstraints[]\":\"object\",\"ProxyConfiguration\":\"object\",\"ProxyConfiguration.ProxyConfigurationProperties\":\"array\",\"ProxyConfiguration.ProxyConfigurationProperties[]\":\"object\",\"RequiresCompatibilities\":\"array\",\"RuntimePlatform\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Volumes\":\"array\",\"Volumes[]\":\"object\",\"Volumes[].DockerVolumeConfiguration\":\"object\",\"Volumes[].DockerVolumeConfiguration.DriverOpts\":\"object\",\"Volumes[].DockerVolumeConfiguration.Labels\":\"object\",\"Volumes[].EFSVolumeConfiguration\":\"object\",\"Volumes[].EFSVolumeConfiguration.AuthorizationConfig\":\"object\",\"Volumes[].FSxWindowsFileServerVolumeConfiguration\":\"object\",\"Volumes[].FSxWindowsFileServerVolumeConfiguration.AuthorizationConfig\":\"object\",\"Volumes[].Host\":\"object\",\"Volumes[].S3FilesVolumeConfiguration\":\"object\"}"],
|
|
32899
33023
|
["AWS::EFS::AccessPoint", "{\"AccessPointTags\":\"array\",\"AccessPointTags[]\":\"object\",\"PosixUser\":\"object\",\"PosixUser.SecondaryGids\":\"array\",\"RootDirectory\":\"object\",\"RootDirectory.CreationInfo\":\"object\"}"],
|
|
32900
33024
|
["AWS::EFS::FileSystem", "{\"BackupPolicy\":\"object\",\"FileSystemPolicy\":\"object\",\"FileSystemProtection\":\"object\",\"FileSystemTags\":\"array\",\"FileSystemTags[]\":\"object\",\"LifecyclePolicies\":\"array\",\"LifecyclePolicies[]\":\"object\",\"ReplicationConfiguration\":\"object\",\"ReplicationConfiguration.Destinations\":\"array\",\"ReplicationConfiguration.Destinations[]\":\"object\"}"],
|
|
32901
33025
|
["AWS::EFS::MountTarget", "{\"SecurityGroups\":\"array\"}"],
|
|
@@ -35758,7 +35882,50 @@ function noEchoAttributeNamesFor(run, logicalId, record, carried, leaves) {
|
|
|
35758
35882
|
if (declared === void 0 && prior === void 0 && !echoed) return void 0;
|
|
35759
35883
|
return [...names].sort();
|
|
35760
35884
|
}
|
|
35885
|
+
function withNoEchoItemsMasked(run, deps, logicalId, record) {
|
|
35886
|
+
const items = record.unsettledItems;
|
|
35887
|
+
if (typeof items !== "object" || items === null || Array.isArray(items)) return record;
|
|
35888
|
+
const secrets = deps.perResourceSecrets().get(logicalId);
|
|
35889
|
+
const plaintexts = secrets === void 0 ? [] : noEchoParameterPlaintextsOf(secrets).filter((plaintext) => plaintext !== "");
|
|
35890
|
+
const positioned = /* @__PURE__ */ new Set();
|
|
35891
|
+
for (const json of run.noEchoPositionedValues.get(logicalId) ?? []) {
|
|
35892
|
+
let value;
|
|
35893
|
+
try {
|
|
35894
|
+
value = JSON.parse(json);
|
|
35895
|
+
} catch {
|
|
35896
|
+
continue;
|
|
35897
|
+
}
|
|
35898
|
+
if (typeof value === "string" && value !== "") positioned.add(value);
|
|
35899
|
+
}
|
|
35900
|
+
if (plaintexts.length === 0 && positioned.size === 0) return record;
|
|
35901
|
+
return withAttemptedItemsMasked(record, [...positioned, ...plaintexts]);
|
|
35902
|
+
}
|
|
35903
|
+
function withAttemptedItemsMasked(record, needles) {
|
|
35904
|
+
const items = record.unsettledItems;
|
|
35905
|
+
if (typeof items !== "object" || items === null || Array.isArray(items)) return record;
|
|
35906
|
+
const usable = needles.filter((needle) => needle !== "" && needle !== "***");
|
|
35907
|
+
if (usable.length === 0) return record;
|
|
35908
|
+
let changed = false;
|
|
35909
|
+
const masked = {};
|
|
35910
|
+
for (const [path, entries] of Object.entries(items)) {
|
|
35911
|
+
if (!Array.isArray(entries)) {
|
|
35912
|
+
masked[path] = entries;
|
|
35913
|
+
continue;
|
|
35914
|
+
}
|
|
35915
|
+
masked[path] = [...new Set(entries.map((entry) => {
|
|
35916
|
+
if (typeof entry !== "string") return entry;
|
|
35917
|
+
const served = usable.some((needle) => entry.includes(needle));
|
|
35918
|
+
if (served) changed = true;
|
|
35919
|
+
return served ? "***" : entry;
|
|
35920
|
+
}))];
|
|
35921
|
+
}
|
|
35922
|
+
return changed ? {
|
|
35923
|
+
...record,
|
|
35924
|
+
unsettledItems: masked
|
|
35925
|
+
} : record;
|
|
35926
|
+
}
|
|
35761
35927
|
function applyNoEchoPersist(run, deps, logicalId, record, scrubbed, templateProps, resources, secrets, carried = false) {
|
|
35928
|
+
scrubbed = withNoEchoItemsMasked(run, deps, logicalId, scrubbed);
|
|
35762
35929
|
const sources = noEchoPositionSources(run, resources);
|
|
35763
35930
|
if (sources === void 0) return scrubbed;
|
|
35764
35931
|
const leaves = noEchoLeavesFor(run, deps, logicalId, record, templateProps, sources);
|
|
@@ -37258,6 +37425,10 @@ function maskingRetryLogger(logger, secrets) {
|
|
|
37258
37425
|
//#region src/deployment/deploy-engine/options.ts
|
|
37259
37426
|
const DEFAULT_RESOURCE_WARN_AFTER_MS = 3e5;
|
|
37260
37427
|
const DEFAULT_RESOURCE_TIMEOUT_MS = 18e5;
|
|
37428
|
+
const DEFAULT_UNSETTLED_REVERT_WAIT = {
|
|
37429
|
+
timeoutMs: DEFAULT_RESOURCE_TIMEOUT_MS,
|
|
37430
|
+
pollMs: 1e4
|
|
37431
|
+
};
|
|
37261
37432
|
|
|
37262
37433
|
//#endregion
|
|
37263
37434
|
//#region src/analyzer/skipped-outputs.ts
|
|
@@ -39533,7 +39704,7 @@ const MERGE_SEMANTICS_KEYS = /* @__PURE__ */ new Set(["Tags"]);
|
|
|
39533
39704
|
async function readLive(args, names) {
|
|
39534
39705
|
const { provider, physicalId, logicalId, resourceType, recordedProperties } = args;
|
|
39535
39706
|
let live;
|
|
39536
|
-
if (provider.readUnsettled !== void 0) live = await provider.readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, args.desired);
|
|
39707
|
+
if (provider.readUnsettled !== void 0) live = await provider.readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, args.desired, args.attemptedItems);
|
|
39537
39708
|
else if (provider.readCurrentState !== void 0) live = await provider.readCurrentState(physicalId, logicalId, resourceType, recordedProperties);
|
|
39538
39709
|
else return;
|
|
39539
39710
|
if (typeof live !== "object" || live === null || Array.isArray(live)) return "unreadable";
|
|
@@ -39551,23 +39722,55 @@ async function settleUnsettledPrevious(args) {
|
|
|
39551
39722
|
if (moving.size > 0) throw refusal(args, moving, "AWS is still changing it or cdkd could not confirm it settled");
|
|
39552
39723
|
}
|
|
39553
39724
|
const substituted = new Set([...names].filter((name) => !MERGE_SEMANTICS_KEYS.has(name)));
|
|
39554
|
-
|
|
39725
|
+
const attemptedTags = [...args.attemptedItems?.get("Tags") ?? []].filter(isUsableAttemptedName);
|
|
39726
|
+
const mergeNeedsLive = names.has("Tags") && attemptedTags.length > 0;
|
|
39727
|
+
if (substituted.size === 0 && !mergeNeedsLive) return previous;
|
|
39555
39728
|
let live;
|
|
39556
39729
|
try {
|
|
39557
|
-
live = await readLive(args, substituted);
|
|
39730
|
+
live = await readLive(args, substituted.size > 0 ? substituted : /* @__PURE__ */ new Set(["Tags"]));
|
|
39558
39731
|
} catch (error) {
|
|
39732
|
+
if (substituted.size === 0) return previous;
|
|
39559
39733
|
if (error instanceof ProvisioningError) throw error;
|
|
39560
39734
|
const wrapped = refusal(args, substituted, "the resource could not be read to converge it");
|
|
39561
39735
|
if (error instanceof Error) wrapped.cause = error;
|
|
39562
39736
|
throw wrapped;
|
|
39563
39737
|
}
|
|
39564
39738
|
if (live === void 0) return previous;
|
|
39565
|
-
if (live === "unreadable")
|
|
39739
|
+
if (live === "unreadable") {
|
|
39740
|
+
if (substituted.size === 0) return previous;
|
|
39741
|
+
throw refusal(args, substituted, "the resource could not be read to converge it");
|
|
39742
|
+
}
|
|
39566
39743
|
const out = { ...previous };
|
|
39567
39744
|
for (const name of substituted) if (Object.hasOwn(live, name) && live[name] !== void 0) out[name] = live[name];
|
|
39568
39745
|
else delete out[name];
|
|
39746
|
+
if (mergeNeedsLive) {
|
|
39747
|
+
const withAttempted = withAttemptedTags(out["Tags"], live["Tags"], args.desired?.["Tags"], attemptedTags);
|
|
39748
|
+
if (withAttempted !== void 0) out["Tags"] = withAttempted;
|
|
39749
|
+
}
|
|
39569
39750
|
return out;
|
|
39570
39751
|
}
|
|
39752
|
+
function withAttemptedTags(recorded, live, desired, attempted) {
|
|
39753
|
+
const keysOf = (value) => {
|
|
39754
|
+
if (value === void 0 || value === null) return /* @__PURE__ */ new Set();
|
|
39755
|
+
if (!Array.isArray(value)) return void 0;
|
|
39756
|
+
const keys = /* @__PURE__ */ new Set();
|
|
39757
|
+
for (const entry of value) {
|
|
39758
|
+
const key = entry?.Key;
|
|
39759
|
+
if (typeof key !== "string") return void 0;
|
|
39760
|
+
keys.add(key);
|
|
39761
|
+
}
|
|
39762
|
+
return keys;
|
|
39763
|
+
};
|
|
39764
|
+
const recordedKeys = keysOf(recorded);
|
|
39765
|
+
const desiredKeys = keysOf(desired);
|
|
39766
|
+
if (recordedKeys === void 0 || desiredKeys === void 0 || !Array.isArray(live)) return void 0;
|
|
39767
|
+
const removable = live.filter((entry) => {
|
|
39768
|
+
const key = entry?.Key;
|
|
39769
|
+
return typeof key === "string" && attempted.includes(key) && !recordedKeys.has(key) && !desiredKeys.has(key);
|
|
39770
|
+
});
|
|
39771
|
+
if (removable.length === 0) return void 0;
|
|
39772
|
+
return [...recorded ?? [], ...removable];
|
|
39773
|
+
}
|
|
39571
39774
|
function tagsHeld(desired, live) {
|
|
39572
39775
|
const asMap = (value) => {
|
|
39573
39776
|
if (value === void 0 || value === null) return /* @__PURE__ */ new Map();
|
|
@@ -39624,7 +39827,42 @@ async function withUnprovenUnsettled(record, args, warn) {
|
|
|
39624
39827
|
const kept = await unsettledAfterUpdate(args);
|
|
39625
39828
|
if (kept.length === 0) return record;
|
|
39626
39829
|
warn(safeMsg`${args.logicalId} (${args.resourceType}): the update succeeded, but AWS does not yet show the requested ${kept.join(", ")}; cdkd keeps ${kept.length === 1 ? "it" : "them"} unsettled and converges again on the next deploy.`);
|
|
39627
|
-
|
|
39830
|
+
const withNames = withUnsettledProperties(record, kept);
|
|
39831
|
+
return withUnsettledItems(withNames, args.attemptedItems ?? /* @__PURE__ */ new Map());
|
|
39832
|
+
}
|
|
39833
|
+
async function waitForUnsettledSettled(args) {
|
|
39834
|
+
const { provider, names } = args;
|
|
39835
|
+
const deadline = Date.now() + args.timeoutMs;
|
|
39836
|
+
if (args.running !== void 0) {
|
|
39837
|
+
let returned = false;
|
|
39838
|
+
const done = args.running.then(() => {
|
|
39839
|
+
returned = true;
|
|
39840
|
+
}, () => {
|
|
39841
|
+
returned = true;
|
|
39842
|
+
});
|
|
39843
|
+
while (!returned) {
|
|
39844
|
+
if (args.isInterrupted()) return "interrupted";
|
|
39845
|
+
const left = deadline - Date.now();
|
|
39846
|
+
if (left <= 0) return "moving";
|
|
39847
|
+
await Promise.race([done, new Promise((resolve) => setTimeout(resolve, Math.min(250, left)))]);
|
|
39848
|
+
}
|
|
39849
|
+
}
|
|
39850
|
+
if (provider.unsettledInTransition === void 0 || names.size === 0) return "settled";
|
|
39851
|
+
for (;;) {
|
|
39852
|
+
if (args.isInterrupted()) return "interrupted";
|
|
39853
|
+
let moving = true;
|
|
39854
|
+
try {
|
|
39855
|
+
moving = (await provider.unsettledInTransition(args.physicalId, args.logicalId, args.resourceType, names, args.recordedProperties)).size > 0;
|
|
39856
|
+
} catch {}
|
|
39857
|
+
if (!moving) return "settled";
|
|
39858
|
+
const left = deadline - Date.now();
|
|
39859
|
+
if (left <= 0) return "moving";
|
|
39860
|
+
const until = Date.now() + Math.min(args.pollMs, left);
|
|
39861
|
+
while (Date.now() < until) {
|
|
39862
|
+
if (args.isInterrupted()) return "interrupted";
|
|
39863
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(250, until - Date.now())));
|
|
39864
|
+
}
|
|
39865
|
+
}
|
|
39628
39866
|
}
|
|
39629
39867
|
function splitUnhandledRemovals(unhandled, recordedPrevious, unsettled) {
|
|
39630
39868
|
const addedByFailedUpdate = unhandled.filter((name) => unsettled.has(name) && !Object.hasOwn(recordedPrevious, name));
|
|
@@ -39655,7 +39893,8 @@ async function updateWithRollbackRetry(provider, args, logicalId, logger, isInte
|
|
|
39655
39893
|
recordedProperties: recordedPrevious,
|
|
39656
39894
|
names: context?.unsettledProperties ?? /* @__PURE__ */ new Set(),
|
|
39657
39895
|
previous: recordedPrevious,
|
|
39658
|
-
desired
|
|
39896
|
+
desired,
|
|
39897
|
+
...context?.unsettledItems !== void 0 && { attemptedItems: context.unsettledItems }
|
|
39659
39898
|
});
|
|
39660
39899
|
const removal = prepareRemovalForUpdate(provider, resourceType, desired, previous);
|
|
39661
39900
|
const revertArgs = [
|
|
@@ -40012,7 +40251,8 @@ async function replayRevert(s) {
|
|
|
40012
40251
|
resourceType: op.resourceType,
|
|
40013
40252
|
recordedProperties: current.properties ?? {},
|
|
40014
40253
|
names: unsettledContextOf(current, previousState).unsettledProperties ?? /* @__PURE__ */ new Set(),
|
|
40015
|
-
desired: desiredProps ?? {}
|
|
40254
|
+
desired: desiredProps ?? {},
|
|
40255
|
+
...unsettledContextOf(current, previousState).unsettledItems !== void 0 && { attemptedItems: unsettledContextOf(current, previousState).unsettledItems }
|
|
40016
40256
|
}, (message) => logger.warn(mask(message)));
|
|
40017
40257
|
if (updatePartialReason(revertResult) === void 0) inlinePolicyWriters.record(op.logicalId, "update", stateResources[op.logicalId], !deepEqual$2(previousState.properties?.["Policies"], current.properties?.["Policies"]), revertVia);
|
|
40018
40258
|
const rollbackPartial = updatePartialReason(revertResult);
|
|
@@ -40253,11 +40493,13 @@ async function replayReverseReplacement(s) {
|
|
|
40253
40493
|
}
|
|
40254
40494
|
const { observedProperties: _staleObserved, ...prevRecord } = prev;
|
|
40255
40495
|
recordNoEchoAttributeValues(createResult, secrets, resolvedPrevProps);
|
|
40496
|
+
const restoredProperties = recordedPropertiesAfterReplayCreate(prevRecord, createResult);
|
|
40256
40497
|
stateResources[op.logicalId] = redactRollbackRecord({
|
|
40257
40498
|
...withNameGenerationReached(prevRecord, op.logicalId, op.nameGeneration),
|
|
40258
40499
|
physicalId: createResult.physicalId,
|
|
40259
40500
|
attributes: createResult.attributes ?? {},
|
|
40260
|
-
properties:
|
|
40501
|
+
properties: restoredProperties,
|
|
40502
|
+
acceptedCreateOnlyDrops: acceptedCreateOnlyDropsEvidence(restoredProperties, oldType, createProvisionedBy)
|
|
40261
40503
|
}, secrets, prevRecord.properties, prevRecord.attributes);
|
|
40262
40504
|
if (!adoptedLiveNewResource) inlinePolicyWriters.record(op.logicalId, "create", stateResources[op.logicalId], false, createProvisionedBy);
|
|
40263
40505
|
const deferral = s.deferral !== void 0 && !deletedNewFirst && !adoptedLiveNewResource && !rollbackRetainsNewResource(current) ? s.deferral : void 0;
|
|
@@ -40674,6 +40916,12 @@ async function replaySingle(op, stateResources, stackName, ctx, resolver, orphan
|
|
|
40674
40916
|
function ownRecord(stateResources, logicalId) {
|
|
40675
40917
|
return Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
|
|
40676
40918
|
}
|
|
40919
|
+
function withKeysFrom(bag, source, keys) {
|
|
40920
|
+
const out = { ...bag };
|
|
40921
|
+
for (const key of keys) if (source !== void 0 && Object.hasOwn(source, key)) out[key] = source[key];
|
|
40922
|
+
else delete out[key];
|
|
40923
|
+
return out;
|
|
40924
|
+
}
|
|
40677
40925
|
async function replayFailedOperationsUnbound(failedOps, stateResources, stackName, ctx, options = {}) {
|
|
40678
40926
|
const inlinePolicyWriters = options.inlinePolicyWriters ?? new RollbackInlinePolicyWriters();
|
|
40679
40927
|
const result = {
|
|
@@ -40906,7 +41154,14 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
40906
41154
|
skipUnaddressableReplay(skipScope, logger, op, "force-revert failed UPDATE of");
|
|
40907
41155
|
break;
|
|
40908
41156
|
}
|
|
40909
|
-
|
|
41157
|
+
const own = options.previousFromRecord?.get(op.logicalId);
|
|
41158
|
+
const fromRecord = own !== void 0;
|
|
41159
|
+
const attemptedBag = fromRecord ? void 0 : op.attemptedProperties;
|
|
41160
|
+
const revertUnsettled = fromRecord ? own.names.size === 0 ? {} : {
|
|
41161
|
+
unsettledProperties: own.names,
|
|
41162
|
+
...own.items.size > 0 && { unsettledItems: own.items }
|
|
41163
|
+
} : unsettledContextOf(current, prev);
|
|
41164
|
+
logger.info(!fromRecord ? ` Rollback: force-reverting failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}) to its pre-deploy properties (--revert-failed; remote state is unknown)` : own.lateSuccess ? ` Rollback: reverting the failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}), whose call completed after the deploy gave up on it, to its pre-deploy properties` : ` Rollback: reverting what the failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}) left unsettled (${[...own.names].map(safe).join(", ")}) to its pre-deploy properties`);
|
|
40910
41165
|
const { provider, provisionedBy: revertVia } = ctx.providerRegistry.getProviderFor({
|
|
40911
41166
|
resourceType: op.resourceType,
|
|
40912
41167
|
provisionedBy: op.provisionedBy ?? current.provisionedBy
|
|
@@ -40923,7 +41178,13 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
40923
41178
|
});
|
|
40924
41179
|
const desiredProps = noEcho.desired;
|
|
40925
41180
|
refuseMaskedReplayBaseline(desiredProps, op.logicalId, noEcho.inert);
|
|
40926
|
-
const
|
|
41181
|
+
const resolvedPrevious = noEcho.onPreviousSide(await resolveReplayProps(attemptedBag ?? current.properties, resolver, secrets, ctx, op.logicalId, attemptedBag === void 0 ? current : void 0));
|
|
41182
|
+
const excludedKeys = own?.lateSuccess === true ? [...unsettledPropertiesOf(prev)] : [];
|
|
41183
|
+
const attemptedProps = excludedKeys.length === 0 || resolvedPrevious === void 0 ? resolvedPrevious : withKeysFrom(resolvedPrevious, desiredProps, excludedKeys);
|
|
41184
|
+
if (excludedKeys.length > 0) {
|
|
41185
|
+
const one = excludedKeys.length === 1;
|
|
41186
|
+
logger.warn(safeMsg` Rollback: ${safe(op.logicalId)} (${safe(op.resourceType)}): ${excludedKeys.map(safe).join(", ")} ${one ? "was" : "were"} left unsettled by an earlier failed deploy, so this revert leaves ${one ? "it" : "them"} as AWS holds ${one ? "it" : "them"}; the next deploy converges ${one ? "it" : "them"}.`);
|
|
41187
|
+
}
|
|
40927
41188
|
recordNestedStackParameterExpressions(secrets, op.resourceType, desiredProps, prev.properties, "state-derived");
|
|
40928
41189
|
opMasker.addNamed({
|
|
40929
41190
|
resourceType: op.resourceType,
|
|
@@ -40957,7 +41218,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
40957
41218
|
replayingState: true,
|
|
40958
41219
|
recordedAttributes: current.attributes,
|
|
40959
41220
|
...revertFailedClaimed && { inlinePolicyClaimed: revertFailedClaimed },
|
|
40960
|
-
...
|
|
41221
|
+
...revertUnsettled
|
|
40961
41222
|
}
|
|
40962
41223
|
], op.logicalId, logger, options.isInterrupted, secrets, mask));
|
|
40963
41224
|
if (revertFailedResult) recordNoEchoAttributeValues(revertFailedResult, secrets, desiredProps);
|
|
@@ -40968,10 +41229,12 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
40968
41229
|
physicalId: current.physicalId,
|
|
40969
41230
|
resourceType: op.resourceType,
|
|
40970
41231
|
recordedProperties: current.properties ?? {},
|
|
40971
|
-
names:
|
|
40972
|
-
desired: desiredProps ?? {}
|
|
41232
|
+
names: revertUnsettled.unsettledProperties ?? /* @__PURE__ */ new Set(),
|
|
41233
|
+
desired: desiredProps ?? {},
|
|
41234
|
+
...revertUnsettled.unsettledItems !== void 0 && { attemptedItems: revertUnsettled.unsettledItems }
|
|
40973
41235
|
}, (message) => logger.warn(mask(message)));
|
|
40974
|
-
if (
|
|
41236
|
+
if (fromRecord) stateResources[op.logicalId] = withUnsettledItems(withUnsettledProperties(stateResources[op.logicalId], unsettledPropertiesOf(prev)), unsettledItemsOf(prev));
|
|
41237
|
+
if (updatePartialReason(revertFailedResult) === void 0) inlinePolicyWriters.record(op.logicalId, "update", stateResources[op.logicalId], !deepEqual$2(prev.properties?.["Policies"], (attemptedBag ?? current.properties)?.["Policies"]), revertVia);
|
|
40975
41238
|
const revertFailedPartial = updatePartialReason(revertFailedResult);
|
|
40976
41239
|
if (revertFailedPartial !== void 0) logger.warn(mask(` Rollback: ${safe(op.logicalId)} reverted, ${updatePartialMessage(revertFailedPartial)}`));
|
|
40977
41240
|
else logger.info(` Rollback: ${safe(op.logicalId)} reverted successfully`);
|
|
@@ -42885,7 +43148,7 @@ async function revertNestedChildFromJournal(args) {
|
|
|
42885
43148
|
...carried,
|
|
42886
43149
|
...stackInstanceIdCarriedFrom(base),
|
|
42887
43150
|
...supersededAfterRollback(base, supersededHost),
|
|
42888
|
-
version:
|
|
43151
|
+
version: 15,
|
|
42889
43152
|
region,
|
|
42890
43153
|
resources: { ...stateResources },
|
|
42891
43154
|
...orphansAfterRollback(base, mintedOrphans),
|
|
@@ -43652,7 +43915,7 @@ function replayPrintingBag(deps, entries, stateResources) {
|
|
|
43652
43915
|
read
|
|
43653
43916
|
]);
|
|
43654
43917
|
}
|
|
43655
|
-
async function performRollback(deps, completedOperations, stateResources, stackName, previousState, failedOperations = [], priorOrphans = []) {
|
|
43918
|
+
async function performRollback(deps, completedOperations, stateResources, stackName, previousState, failedOperations = [], priorOrphans = [], unsettledRevert) {
|
|
43656
43919
|
const orphanIndexes = [];
|
|
43657
43920
|
const orphanOps = [];
|
|
43658
43921
|
failedOperations.forEach((op, i) => {
|
|
@@ -43677,7 +43940,7 @@ async function performRollback(deps, completedOperations, stateResources, stackN
|
|
|
43677
43940
|
const inlinePolicyWriters = new RollbackInlinePolicyWriters();
|
|
43678
43941
|
const supersededHost = {};
|
|
43679
43942
|
const runId = deps.options.eventRecorder?.runId;
|
|
43680
|
-
const { result, failed, run } = await withNestedRevertRun(runId, async (scope) => {
|
|
43943
|
+
const { result, failed, unsettled, run } = await withNestedRevertRun(runId, async (scope) => {
|
|
43681
43944
|
return {
|
|
43682
43945
|
failed: orphanOps.length > 0 ? await withPrintingSecrets(replayPrintingBag(deps, orphanOps.map((op) => ({
|
|
43683
43946
|
...op,
|
|
@@ -43686,6 +43949,11 @@ async function performRollback(deps, completedOperations, stateResources, stackN
|
|
|
43686
43949
|
emitEnvelope: completedOperations.length === 0,
|
|
43687
43950
|
inlinePolicyWriters
|
|
43688
43951
|
})) : void 0,
|
|
43952
|
+
unsettled: await revertUnsettledFailedUpdates(deps, ctx, stackName, stateResources, failedOperations, new Set(orphanIndexes), {
|
|
43953
|
+
emitEnvelope: completedOperations.length === 0 && orphanOps.length === 0,
|
|
43954
|
+
inlinePolicyWriters,
|
|
43955
|
+
hooks: unsettledRevert
|
|
43956
|
+
}),
|
|
43689
43957
|
result: await withPrintingSecrets(replayPrintingBag(deps, completedReplayEntries(completedOperations), stateResources), () => replayRollback(completedOperations, stateResources, stackName, ctx, {
|
|
43690
43958
|
inlinePolicyWriters,
|
|
43691
43959
|
failedOperations,
|
|
@@ -43698,11 +43966,12 @@ async function performRollback(deps, completedOperations, stateResources, stackN
|
|
|
43698
43966
|
});
|
|
43699
43967
|
const pendingOrphans = new Set(failed?.remainingFailedOps ?? []);
|
|
43700
43968
|
const handled = new Set(orphanIndexes.filter((_, k) => !pendingOrphans.has(orphanOps[k])));
|
|
43969
|
+
for (const index of unsettled.handled) handled.add(index);
|
|
43701
43970
|
return {
|
|
43702
43971
|
failures: result.failures + (failed?.failures ?? 0),
|
|
43703
|
-
warnings: result.warnings + run.warnings + (failed?.warnings ?? 0),
|
|
43972
|
+
warnings: result.warnings + run.warnings + (failed?.warnings ?? 0) + unsettled.warnings,
|
|
43704
43973
|
skipped: result.skipped + (failed?.skipped ?? 0),
|
|
43705
|
-
interrupted: result.interrupted,
|
|
43974
|
+
interrupted: result.interrupted || unsettled.interrupted,
|
|
43706
43975
|
orphaned: [...failed?.orphaned ?? [], ...result.orphaned],
|
|
43707
43976
|
rolledBackCreates: [...failed?.rolledBackCreates ?? [], ...result.rolledBackCreates],
|
|
43708
43977
|
superseded: supersededHost.supersededResources ?? [],
|
|
@@ -43710,6 +43979,152 @@ async function performRollback(deps, completedOperations, stateResources, stackN
|
|
|
43710
43979
|
remainingFailedOps: failedOperations.filter((_, i) => !handled.has(i))
|
|
43711
43980
|
};
|
|
43712
43981
|
}
|
|
43982
|
+
function waitText(ms) {
|
|
43983
|
+
return ms >= 6e4 ? `${Math.round(ms / 6e4)} min` : `${Math.max(1, Math.round(ms / 1e3))}s`;
|
|
43984
|
+
}
|
|
43985
|
+
async function revertUnsettledFailedUpdates(deps, ctx, stackName, stateResources, failedOperations, alreadyReplayed, options) {
|
|
43986
|
+
const out = {
|
|
43987
|
+
handled: [],
|
|
43988
|
+
warnings: 0,
|
|
43989
|
+
interrupted: false
|
|
43990
|
+
};
|
|
43991
|
+
const hooks = options.hooks;
|
|
43992
|
+
if (hooks === void 0) return out;
|
|
43993
|
+
const ownMarks = (logicalId) => {
|
|
43994
|
+
const onRecord = unsettledPropertiesOf(stateResources[logicalId]);
|
|
43995
|
+
const marks = hooks.runMarks(logicalId);
|
|
43996
|
+
const names = new Set([...marks.names].filter((name) => onRecord.has(name)));
|
|
43997
|
+
return {
|
|
43998
|
+
names,
|
|
43999
|
+
items: new Map([...marks.items].filter(([path]) => names.has(unsettledItemsTopKey(path)))),
|
|
44000
|
+
lateSuccess: false
|
|
44001
|
+
};
|
|
44002
|
+
};
|
|
44003
|
+
const candidates = [];
|
|
44004
|
+
failedOperations.forEach((op, index) => {
|
|
44005
|
+
if (alreadyReplayed.has(index) || op.changeType !== "UPDATE") return;
|
|
44006
|
+
if (failedOpOwnRecord(op, stateResources) === void 0) return;
|
|
44007
|
+
const own = ownMarks(op.logicalId);
|
|
44008
|
+
const running = hooks.stillRunning(op.logicalId);
|
|
44009
|
+
if (own.names.size === 0 && running === void 0) return;
|
|
44010
|
+
if (classifyFailedOp(op, stateResources, [...failedOperations]) !== "revert-failed-update") return;
|
|
44011
|
+
candidates.push({
|
|
44012
|
+
index,
|
|
44013
|
+
op,
|
|
44014
|
+
own,
|
|
44015
|
+
running
|
|
44016
|
+
});
|
|
44017
|
+
});
|
|
44018
|
+
if (candidates.length === 0) return out;
|
|
44019
|
+
const { logger } = deps;
|
|
44020
|
+
const isInterrupted = () => deps.userInterrupted();
|
|
44021
|
+
const fallback = (names) => {
|
|
44022
|
+
const one = names.size === 1;
|
|
44023
|
+
const retry = deps.options.parentStackInfo === void 0 ? `, or revert ${one ? "it" : "them"} now with: ${pasteableCommand("cdkd rollback", [{
|
|
44024
|
+
value: stackName,
|
|
44025
|
+
hole: "stack"
|
|
44026
|
+
}, { literal: "--revert-failed" }]).command}` : "";
|
|
44027
|
+
return `cdkd keeps ${one ? "it" : "them"} unsettled: the next deploy converges ${one ? "it" : "them"}${retry}`;
|
|
44028
|
+
};
|
|
44029
|
+
const wait = deps.options.unsettledRevertWait ?? DEFAULT_UNSETTLED_REVERT_WAIT;
|
|
44030
|
+
const verdicts = await Promise.all(candidates.map(async (candidate) => {
|
|
44031
|
+
const { op } = candidate;
|
|
44032
|
+
let provider;
|
|
44033
|
+
try {
|
|
44034
|
+
provider = ctx.providerRegistry.getProviderFor({
|
|
44035
|
+
resourceType: op.resourceType,
|
|
44036
|
+
provisionedBy: op.provisionedBy ?? stateResources[op.logicalId].provisionedBy
|
|
44037
|
+
}).provider;
|
|
44038
|
+
} catch {
|
|
44039
|
+
return "error";
|
|
44040
|
+
}
|
|
44041
|
+
logger.info(safeMsg` Rollback: waiting for ${op.logicalId} (${op.resourceType}) to settle before reverting the failed update`);
|
|
44042
|
+
const started = Date.now();
|
|
44043
|
+
const identity = () => {
|
|
44044
|
+
const record = stateResources[op.logicalId];
|
|
44045
|
+
return {
|
|
44046
|
+
provider,
|
|
44047
|
+
logicalId: op.logicalId,
|
|
44048
|
+
physicalId: record.physicalId,
|
|
44049
|
+
resourceType: op.resourceType,
|
|
44050
|
+
recordedProperties: record.properties ?? {},
|
|
44051
|
+
names: candidate.own.names,
|
|
44052
|
+
timeoutMs: Math.max(0, wait.timeoutMs - (Date.now() - started)),
|
|
44053
|
+
pollMs: wait.pollMs,
|
|
44054
|
+
isInterrupted
|
|
44055
|
+
};
|
|
44056
|
+
};
|
|
44057
|
+
if (candidate.running !== void 0) {
|
|
44058
|
+
let succeeded = false;
|
|
44059
|
+
const returned = await waitForUnsettledSettled({
|
|
44060
|
+
...identity(),
|
|
44061
|
+
names: /* @__PURE__ */ new Set(),
|
|
44062
|
+
running: candidate.running.then((ok) => {
|
|
44063
|
+
succeeded = ok;
|
|
44064
|
+
})
|
|
44065
|
+
});
|
|
44066
|
+
if (returned === "moving") return "call-running";
|
|
44067
|
+
if (returned === "interrupted") return returned;
|
|
44068
|
+
hooks.recordMarks(op.logicalId);
|
|
44069
|
+
candidate.own = {
|
|
44070
|
+
...ownMarks(op.logicalId),
|
|
44071
|
+
lateSuccess: succeeded
|
|
44072
|
+
};
|
|
44073
|
+
if (!succeeded && candidate.own.names.size === 0) return "none";
|
|
44074
|
+
}
|
|
44075
|
+
try {
|
|
44076
|
+
return await waitForUnsettledSettled(identity());
|
|
44077
|
+
} catch {
|
|
44078
|
+
return "error";
|
|
44079
|
+
}
|
|
44080
|
+
}));
|
|
44081
|
+
const ready = [];
|
|
44082
|
+
candidates.forEach((candidate, k) => {
|
|
44083
|
+
const verdict = verdicts[k];
|
|
44084
|
+
if (verdict === "settled") {
|
|
44085
|
+
ready.push(candidate);
|
|
44086
|
+
return;
|
|
44087
|
+
}
|
|
44088
|
+
if (verdict === "none") return;
|
|
44089
|
+
if (verdict === "interrupted") {
|
|
44090
|
+
out.interrupted = true;
|
|
44091
|
+
return;
|
|
44092
|
+
}
|
|
44093
|
+
const { op } = candidate;
|
|
44094
|
+
const names = candidate.own.names;
|
|
44095
|
+
const them = names.size === 1 ? "it" : "them";
|
|
44096
|
+
const subject = names.size > 0 ? `the failed update left ${[...names].join(", ")} unsettled` : "the failed update may have applied part of the template";
|
|
44097
|
+
const why = verdict === "call-running" ? `cdkd's own update call, abandoned at the per-resource deadline, had not returned after ${waitText(wait.timeoutMs)}` : verdict === "error" ? "cdkd could not reach its provider to wait for it" : `AWS had not settled ${them} after ${waitText(wait.timeoutMs)}`;
|
|
44098
|
+
logger.warn(safeMsg`${op.logicalId} (${op.resourceType}): ${subject}, and ${why}, so the automatic rollback did not revert ${names.size > 0 ? them : "it"}. ${fallback(names)}`);
|
|
44099
|
+
out.warnings++;
|
|
44100
|
+
});
|
|
44101
|
+
if (ready.length === 0 || out.interrupted) return out;
|
|
44102
|
+
const ops = ready.map(({ op }) => ({ ...op }));
|
|
44103
|
+
const own = new Map(ready.map(({ op, own: marks }) => [op.logicalId, marks]));
|
|
44104
|
+
const replay = await withPrintingSecrets(replayPrintingBag(deps, ops.map((op) => ({
|
|
44105
|
+
...op,
|
|
44106
|
+
properties: op.attemptedProperties
|
|
44107
|
+
})), stateResources), () => replayFailedOperations(ops, stateResources, stackName, ctx, {
|
|
44108
|
+
emitEnvelope: options.emitEnvelope,
|
|
44109
|
+
inlinePolicyWriters: options.inlinePolicyWriters,
|
|
44110
|
+
isInterrupted,
|
|
44111
|
+
previousFromRecord: own
|
|
44112
|
+
}));
|
|
44113
|
+
out.warnings += replay.warnings + replay.failures;
|
|
44114
|
+
if (replay.interrupted) out.interrupted = true;
|
|
44115
|
+
const pending = new Set(replay.remainingFailedOps);
|
|
44116
|
+
const skipped = new Set(replay.skippedOps ?? []);
|
|
44117
|
+
ops.forEach((op, k) => {
|
|
44118
|
+
const { index, own: marks } = ready[k];
|
|
44119
|
+
if (pending.has(op) || skipped.has(op)) {
|
|
44120
|
+
if (!replay.interrupted) logger.warn(safeMsg`${op.logicalId} (${op.resourceType}): the automatic rollback could not revert ${marks.names.size > 0 ? `what the failed update left unsettled (${[...marks.names].join(", ")})` : "the failed update"} (see above). ${fallback(marks.names)}`);
|
|
44121
|
+
return;
|
|
44122
|
+
}
|
|
44123
|
+
out.handled.push(index);
|
|
44124
|
+
hooks.onReverted(op.logicalId, marks.names);
|
|
44125
|
+
});
|
|
44126
|
+
return out;
|
|
44127
|
+
}
|
|
43713
44128
|
function foreignHolderResolver(deps) {
|
|
43714
44129
|
const sameBucketHolderFor = makeForeignHolderScan(deps.stateBackend);
|
|
43715
44130
|
const crossPrefixHolder = deps.options.crossPrefixHolder;
|
|
@@ -46277,12 +46692,8 @@ function extractTemplateAttributes(template, logicalId) {
|
|
|
46277
46692
|
};
|
|
46278
46693
|
}
|
|
46279
46694
|
function acceptedCreateOnlyDropsField(recordedProperties, resourceType, provisionedBy, mode, previous) {
|
|
46280
|
-
if (provisionedBy !== "sdk") return { acceptedCreateOnlyDrops: void 0 };
|
|
46281
|
-
const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops;
|
|
46282
|
-
if (createOnly === void 0 || createOnly.size === 0) return { acceptedCreateOnlyDrops: void 0 };
|
|
46283
46695
|
const carried = mode === "in-place" ? acceptedCreateOnlyDropsOf(previous) : void 0;
|
|
46284
|
-
|
|
46285
|
-
return { acceptedCreateOnlyDrops: names.length > 0 ? names : void 0 };
|
|
46696
|
+
return { acceptedCreateOnlyDrops: acceptedCreateOnlyDropsEvidence(recordedProperties, resourceType, provisionedBy, carried) };
|
|
46286
46697
|
}
|
|
46287
46698
|
function secretNamedAttributesField(result, previous) {
|
|
46288
46699
|
const reported = result.secretNamedAttributeNames;
|
|
@@ -46604,6 +47015,7 @@ async function provisionCreate(engine, logicalId, change, stateResources, stackN
|
|
|
46604
47015
|
...templateAttrs,
|
|
46605
47016
|
provisionedBy: createDecision.provisionedBy
|
|
46606
47017
|
};
|
|
47018
|
+
clearCreatedReport();
|
|
46607
47019
|
engine.recordInlinePolicyWrite(logicalId, "create");
|
|
46608
47020
|
await establishNoEchoEchoFidelity(engine.noEchoRun, engine.noEchoDeps(), logicalId, stateResources[logicalId], resolvedProps, stateResources, createSecrets);
|
|
46609
47021
|
const createCaptureSiblings = await buildObservedCaptureSiblings({
|
|
@@ -46888,12 +47300,17 @@ const INDEX_TRANSITIONAL_STATUSES = /* @__PURE__ */ new Set([
|
|
|
46888
47300
|
function hasTransitionalIndex(indexes) {
|
|
46889
47301
|
return (indexes ?? []).some((gsi) => INDEX_TRANSITIONAL_STATUSES.has(gsi.IndexStatus ?? ""));
|
|
46890
47302
|
}
|
|
47303
|
+
function hasTransitionalTableIndex(table) {
|
|
47304
|
+
return hasTransitionalIndex(table?.GlobalSecondaryIndexes) || hasTransitionalIndex(table?.VectorIndexes);
|
|
47305
|
+
}
|
|
47306
|
+
const GSI_INDEX_NOUN = "a global secondary index";
|
|
47307
|
+
const TABLE_INDEX_NOUN = "a global secondary index or vector index";
|
|
46891
47308
|
const INDEX_BUSY_DELETE_MESSAGE = /cannot delete table while indexes are being/i;
|
|
46892
47309
|
function isIndexBusyDeleteError(message) {
|
|
46893
47310
|
return INDEX_BUSY_DELETE_MESSAGE.test(message);
|
|
46894
47311
|
}
|
|
46895
|
-
function relayedIndexBusyDelete(withheldText) {
|
|
46896
|
-
return isIndexBusyDeleteError(withheldText) ?
|
|
47312
|
+
function relayedIndexBusyDelete(withheldText, indexNoun = GSI_INDEX_NOUN) {
|
|
47313
|
+
return isIndexBusyDeleteError(withheldText) ? ` AWS reports that ${indexNoun} is still being created, updated or deleted; re-running the destroy succeeds once the index is ACTIVE.` : "";
|
|
46897
47314
|
}
|
|
46898
47315
|
const DELETE_INDEX_BUSY_REARM_MAX_ATTEMPTS = 60;
|
|
46899
47316
|
const INDEX_SETTLE_POLL_INTERVAL_MS = 1e3;
|
|
@@ -46901,21 +47318,43 @@ const DELETE_INDEX_WAIT_PROCEED_NOTE = `the DeleteTable goes ahead anyway and AW
|
|
|
46901
47318
|
async function waitForIndexesSettled(opts) {
|
|
46902
47319
|
const { tableName, logicalId, logger, describeTable, maxAttempts, proceedNote } = opts;
|
|
46903
47320
|
const budgetWait = opts.budgetWait;
|
|
47321
|
+
const shortCap = opts.shortCapUnlessVectorBusy;
|
|
47322
|
+
let vectorOnlyBusy = false;
|
|
47323
|
+
let stoppedAtShortCap = false;
|
|
47324
|
+
let announced = false;
|
|
47325
|
+
const effectiveCap = () => shortCap !== void 0 && !vectorOnlyBusy ? Math.min(shortCap, maxAttempts) : maxAttempts;
|
|
46904
47326
|
const watch = startInterruptWatch(`index settle wait on ${tableName}`);
|
|
46905
47327
|
let attempt = 0;
|
|
46906
47328
|
try {
|
|
46907
|
-
|
|
47329
|
+
for (;;) {
|
|
47330
|
+
if (shortCap !== void 0 && attempt >= shortCap && !vectorOnlyBusy) {
|
|
47331
|
+
stoppedAtShortCap = true;
|
|
47332
|
+
break;
|
|
47333
|
+
}
|
|
47334
|
+
if (!(budgetWait ? budgetWait.nextPoll() : attempt < maxAttempts)) break;
|
|
46908
47335
|
attempt += 1;
|
|
46909
47336
|
if (watch.isInterrupted()) {
|
|
46910
47337
|
logger.debug(`Interrupted while waiting for indexes on ${tableName} (${logicalId}) after ${attempt - 1} DescribeTable polls; ${proceedNote}`);
|
|
46911
47338
|
return;
|
|
46912
47339
|
}
|
|
46913
47340
|
try {
|
|
46914
|
-
|
|
47341
|
+
const response = await describeTable();
|
|
47342
|
+
if (!hasTransitionalTableIndex(response.Table)) {
|
|
47343
|
+
if (attempt > 1) logger.debug(safeMsg`Indexes on ${tableName} (${logicalId}) settled after ${attempt} DescribeTable polls`);
|
|
47344
|
+
return;
|
|
47345
|
+
}
|
|
47346
|
+
const gsiBusy = hasTransitionalIndex(response.Table?.GlobalSecondaryIndexes);
|
|
47347
|
+
const vectorBusy = hasTransitionalIndex(response.Table?.VectorIndexes);
|
|
47348
|
+
vectorOnlyBusy = vectorBusy && !gsiBusy;
|
|
47349
|
+
if (!announced) {
|
|
47350
|
+
announced = true;
|
|
47351
|
+
const busyKinds = gsiBusy ? vectorBusy ? "a global secondary index and a vector index" : "a global secondary index" : "a vector index";
|
|
47352
|
+
logger.debug(safeMsg`Index settle wait on ${tableName} (${logicalId}): ${busyKinds} still transitioning (poll ${attempt})`);
|
|
47353
|
+
}
|
|
46915
47354
|
} catch (err) {
|
|
46916
47355
|
const message = describeAwsFailure(err).detail;
|
|
46917
47356
|
if (isThrottlingError(err)) {
|
|
46918
|
-
logger.debug(`DescribeTable throttled while waiting for indexes on ${tableName} (attempt ${attempt}/${
|
|
47357
|
+
logger.debug(`DescribeTable throttled while waiting for indexes on ${tableName} (attempt ${attempt}/${effectiveCap()}); still waiting: ${message}`);
|
|
46919
47358
|
await new Promise((resolve) => setTimeout(resolve, INDEX_SETTLE_POLL_INTERVAL_MS));
|
|
46920
47359
|
continue;
|
|
46921
47360
|
}
|
|
@@ -46934,14 +47373,14 @@ async function waitForIndexesSettled(opts) {
|
|
|
46934
47373
|
watch.dispose();
|
|
46935
47374
|
}
|
|
46936
47375
|
const pollSeconds = INDEX_SETTLE_POLL_INTERVAL_MS / 1e3;
|
|
46937
|
-
const pollsRun = budgetWait ? budgetWait.pollsRun :
|
|
46938
|
-
logger.warn(`Indexes on ${tableName} (${logicalId}) did not all reach ACTIVE within ${pollsRun} DescribeTable polls (~${pollSeconds}s apart, so a little over ${pollsRun * pollSeconds}s of wall clock).${budgetWait?.note() ?? ""} ${proceedNote}`);
|
|
47376
|
+
const pollsRun = budgetWait ? budgetWait.pollsRun : attempt;
|
|
47377
|
+
logger.warn(`Indexes on ${tableName} (${logicalId}) did not all reach ACTIVE within ${pollsRun} DescribeTable polls (~${pollSeconds}s apart, so a little over ${pollsRun * pollSeconds}s of wall clock).${stoppedAtShortCap ? "" : budgetWait?.note(shortCap !== void 0 && !vectorOnlyBusy ? shortCap : void 0) ?? ""} ${proceedNote}`);
|
|
46939
47378
|
}
|
|
46940
47379
|
function indexBusyRetryWarning(opts) {
|
|
46941
47380
|
const remainingAttempts = Math.max(0, 1 + opts.maxRetries - opts.attemptNumber);
|
|
46942
47381
|
const settleFloorMinutes = Math.max(1, Math.round((remainingAttempts + 1) * 60 * INDEX_SETTLE_POLL_INTERVAL_MS / 6e4));
|
|
46943
47382
|
const pollSeconds = INDEX_SETTLE_POLL_INTERVAL_MS / 1e3;
|
|
46944
|
-
return `DynamoDB ${opts.typeLabel} ${opts.logicalId}: AWS refused DeleteTable on ${opts.physicalId} because a global secondary index is still being created, updated or deleted — application auto-scaling can start an index capacity change at any moment, including during this destroy. Waiting for the index to settle and retrying (this attempt plus up to ${remainingAttempts} more attempts; each one first waits up to ${60} DescribeTable polls ~${pollSeconds}s apart before its DeleteTable, so cdkd will not give up for at least ~${settleFloorMinutes} more minutes while those settle waits run). Nothing is wrong with the table; a large index backfill can outlast this budget, in which case the destroy fails on AWS's refusal (re-run with --verbose for AWS's own message) and re-running it succeeds once the index is ACTIVE.`;
|
|
47383
|
+
return `DynamoDB ${opts.typeLabel} ${opts.logicalId}: AWS refused DeleteTable on ${opts.physicalId} because ${opts.indexNoun ?? "a global secondary index"} is still being created, updated or deleted — application auto-scaling can start an index capacity change at any moment, including during this destroy. Waiting for the index to settle and retrying (this attempt plus up to ${remainingAttempts} more attempts; each one first waits up to ${60} DescribeTable polls ~${pollSeconds}s apart before its DeleteTable, so cdkd will not give up for at least ~${settleFloorMinutes} more minutes while those settle waits run). Nothing is wrong with the table; a large index backfill can outlast this budget, in which case the destroy fails on AWS's refusal (re-run with --verbose for AWS's own message) and re-running it succeeds once the index is ACTIVE.`;
|
|
46945
47384
|
}
|
|
46946
47385
|
async function deleteTableWithIndexBusyRetry(opts) {
|
|
46947
47386
|
let deleteAttempts = 0;
|
|
@@ -46949,12 +47388,13 @@ async function deleteTableWithIndexBusyRetry(opts) {
|
|
|
46949
47388
|
try {
|
|
46950
47389
|
await withRetry(async () => {
|
|
46951
47390
|
if (deleteAttempts++ > 0) {
|
|
46952
|
-
if (deleteAttempts === 2) opts.logger.warn(indexBusyRetryWarning({
|
|
47391
|
+
if (deleteAttempts === 2) opts.logger.warn(opts.retryWarning?.() ?? indexBusyRetryWarning({
|
|
46953
47392
|
typeLabel: opts.typeLabel,
|
|
46954
47393
|
logicalId: opts.logicalId,
|
|
46955
47394
|
physicalId: opts.physicalId,
|
|
46956
47395
|
attemptNumber: deleteAttempts,
|
|
46957
|
-
maxRetries: opts.maxRetries
|
|
47396
|
+
maxRetries: opts.maxRetries,
|
|
47397
|
+
...opts.indexNoun !== void 0 && { indexNoun: opts.indexNoun }
|
|
46958
47398
|
}));
|
|
46959
47399
|
await opts.reArm();
|
|
46960
47400
|
}
|
|
@@ -46977,6 +47417,7 @@ async function deleteTableWithIndexBusyRetry(opts) {
|
|
|
46977
47417
|
const DYNAMODB_DELETE_POLL_RTT_MS = 200;
|
|
46978
47418
|
const DYNAMODB_DELETE_POLL_COST_MS = INDEX_SETTLE_POLL_INTERVAL_MS + 200;
|
|
46979
47419
|
const DYNAMODB_DELETE_BUDGET_MS = 156e4;
|
|
47420
|
+
const DYNAMODB_DELETE_DEADLINE_MARGIN_MS = 24e4;
|
|
46980
47421
|
const DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS = 18e5;
|
|
46981
47422
|
const dynamoDbDeleteBudgetOverride = {};
|
|
46982
47423
|
function resolveDynamoDbDeleteBudgetMs() {
|
|
@@ -47035,11 +47476,12 @@ var DeleteWaitImpl = class {
|
|
|
47035
47476
|
get cutShort() {
|
|
47036
47477
|
return this.endedByBudget && this.ran < 60;
|
|
47037
47478
|
}
|
|
47038
|
-
note() {
|
|
47479
|
+
note(shownCap) {
|
|
47039
47480
|
if (!this.endedByBudget) return "";
|
|
47481
|
+
const cap = shownCap ?? this.cap;
|
|
47040
47482
|
const minutes = Math.max(1, Math.round((this.budget?.totalMs ?? 0) / 6e4));
|
|
47041
|
-
if (this.cutShort) return ` — cdkd's shared ~${minutes}-minute delete allowance was already spent, so this wait made only ${this.ran} of its ${
|
|
47042
|
-
return ` (cdkd's shared ~${minutes}-minute delete allowance capped this wait at ${this.ran} of its ${
|
|
47483
|
+
if (this.cutShort) return ` — cdkd's shared ~${minutes}-minute delete allowance was already spent, so this wait made only ${this.ran} of its ${cap} polls and AWS was not given a real wait. Nothing is necessarily wrong with the table; re-run the destroy.`;
|
|
47484
|
+
return ` (cdkd's shared ~${minutes}-minute delete allowance capped this wait at ${this.ran} of its ${cap} polls.)`;
|
|
47043
47485
|
}
|
|
47044
47486
|
};
|
|
47045
47487
|
function beginDeleteWait(cap, budget) {
|
|
@@ -47945,7 +48387,8 @@ function identityKeyOf(...lists) {
|
|
|
47945
48387
|
return entries.some((entry) => isPlainObject(entry) && IDENTITY_KEYS.some((candidate) => typeof entry[candidate] === "string")) ? "ambiguous" : void 0;
|
|
47946
48388
|
}
|
|
47947
48389
|
const POSITIONAL_LIST_KEYS = /* @__PURE__ */ new Set(["KeySchema"]);
|
|
47948
|
-
function projectNamed(live, own, wanted, path, unnamed) {
|
|
48390
|
+
function projectNamed(live, own, wanted, path, unnamed, attempted = /* @__PURE__ */ new Map()) {
|
|
48391
|
+
const attemptedAt = (at) => new Set([...attempted.get(at) ?? []].filter(isUsableAttemptedName));
|
|
47949
48392
|
if (isPlainObject(live) && (isPlainObject(own) || isPlainObject(wanted))) {
|
|
47950
48393
|
const ownBag = isPlainObject(own) ? own : void 0;
|
|
47951
48394
|
const wantedBag = isPlainObject(wanted) ? wanted : void 0;
|
|
@@ -47956,10 +48399,12 @@ function projectNamed(live, own, wanted, path, unnamed) {
|
|
|
47956
48399
|
if (IDENTITY_KEYS.includes(key)) continue;
|
|
47957
48400
|
if (key === "Tags") {
|
|
47958
48401
|
if (ownBag !== void 0 && Object.hasOwn(ownBag, "Tags")) out["Tags"] = ownBag["Tags"];
|
|
48402
|
+
const withAttempted = withAttemptedReplicaTags(ownBag?.["Tags"], wantedBag?.["Tags"], live["Tags"], attemptedAt(`${path}.Tags`));
|
|
48403
|
+
if (withAttempted !== void 0) out["Tags"] = withAttempted;
|
|
47959
48404
|
continue;
|
|
47960
48405
|
}
|
|
47961
48406
|
if (!Object.hasOwn(live, key) || live[key] === void 0) continue;
|
|
47962
|
-
out[key] = POSITIONAL_LIST_KEYS.has(key) ? live[key] : projectNamed(live[key], ownBag?.[key], wantedBag?.[key], `${path}.${key}`, unnamed);
|
|
48407
|
+
out[key] = POSITIONAL_LIST_KEYS.has(key) ? live[key] : projectNamed(live[key], ownBag?.[key], wantedBag?.[key], `${path}.${key}`, unnamed, attempted);
|
|
47963
48408
|
}
|
|
47964
48409
|
return out;
|
|
47965
48410
|
}
|
|
@@ -47986,6 +48431,7 @@ function projectNamed(live, own, wanted, path, unnamed) {
|
|
|
47986
48431
|
const ownEntry = ownById.get(value);
|
|
47987
48432
|
const wantedEntry = wantedById.get(value);
|
|
47988
48433
|
if (ownEntry === void 0 && wantedEntry === void 0) {
|
|
48434
|
+
if (attemptedAt(path).has(value)) return [entry];
|
|
47989
48435
|
unnamed.push({
|
|
47990
48436
|
identity: id,
|
|
47991
48437
|
value,
|
|
@@ -47993,11 +48439,34 @@ function projectNamed(live, own, wanted, path, unnamed) {
|
|
|
47993
48439
|
});
|
|
47994
48440
|
return [];
|
|
47995
48441
|
}
|
|
47996
|
-
return [projectNamed(entry, ownEntry, wantedEntry, `${path}[${value}]`, unnamed)];
|
|
48442
|
+
return [projectNamed(entry, ownEntry, wantedEntry, `${path}[${value}]`, unnamed, attempted)];
|
|
47997
48443
|
});
|
|
47998
48444
|
}
|
|
47999
48445
|
return live;
|
|
48000
48446
|
}
|
|
48447
|
+
function withAttemptedReplicaTags(recorded, desired, live, attempted) {
|
|
48448
|
+
if (attempted.size === 0 || !Array.isArray(live)) return void 0;
|
|
48449
|
+
const keysOf = (value) => {
|
|
48450
|
+
if (value === void 0 || value === null) return /* @__PURE__ */ new Set();
|
|
48451
|
+
if (!Array.isArray(value)) return void 0;
|
|
48452
|
+
const keys = /* @__PURE__ */ new Set();
|
|
48453
|
+
for (const entry of value) {
|
|
48454
|
+
const key = entry?.Key;
|
|
48455
|
+
if (typeof key !== "string") return void 0;
|
|
48456
|
+
keys.add(key);
|
|
48457
|
+
}
|
|
48458
|
+
return keys;
|
|
48459
|
+
};
|
|
48460
|
+
const recordedKeys = keysOf(recorded);
|
|
48461
|
+
const desiredKeys = keysOf(desired);
|
|
48462
|
+
if (recordedKeys === void 0 || desiredKeys === void 0) return void 0;
|
|
48463
|
+
const removable = live.filter((entry) => {
|
|
48464
|
+
const key = entry?.Key;
|
|
48465
|
+
return typeof key === "string" && attempted.has(key) && !recordedKeys.has(key) && !desiredKeys.has(key);
|
|
48466
|
+
});
|
|
48467
|
+
if (removable.length === 0) return void 0;
|
|
48468
|
+
return [...recorded ?? [], ...removable];
|
|
48469
|
+
}
|
|
48001
48470
|
const strictReadScope = new AsyncLocalStorage();
|
|
48002
48471
|
function strictFor(key) {
|
|
48003
48472
|
return strictReadScope.getStore()?.has(key) === true;
|
|
@@ -48008,6 +48477,12 @@ function replicaStrictness(status) {
|
|
|
48008
48477
|
return new Set([...current].filter((key) => key !== "Replicas"));
|
|
48009
48478
|
}
|
|
48010
48479
|
const unsettledScope = new AsyncLocalStorage();
|
|
48480
|
+
const REGION_SEGMENT = /^[a-z]{2}(-[a-z]+)+-\d+$/;
|
|
48481
|
+
function markAttemptedItems(path, items) {
|
|
48482
|
+
const scope = unsettledScope.getStore();
|
|
48483
|
+
if (scope?.attempted === void 0 || items.length === 0) return;
|
|
48484
|
+
scope.attempted(path, items);
|
|
48485
|
+
}
|
|
48011
48486
|
function markUnsettled(...keys) {
|
|
48012
48487
|
const scope = unsettledScope.getStore();
|
|
48013
48488
|
if (scope === void 0) return;
|
|
@@ -48126,6 +48601,11 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48126
48601
|
const warn = log.warn;
|
|
48127
48602
|
log.debug(`Creating DynamoDB GlobalTable ${logicalId}`);
|
|
48128
48603
|
const desiredReplicaTags = refuseMalformedReplicaTags(properties, resourceType, logicalId);
|
|
48604
|
+
const disassociationRefusal = disassociationProtectionRefusal(properties, void 0, logicalId);
|
|
48605
|
+
if (disassociationRefusal !== void 0) {
|
|
48606
|
+
if (context?.replayingState !== true) throw new ProvisioningError(log.mask(disassociationRefusal), resourceType, logicalId);
|
|
48607
|
+
warn(`${disassociationRefusal} Proceeding: this create replays a cdkd state record.`);
|
|
48608
|
+
}
|
|
48129
48609
|
const tableName = properties["TableName"] || generatedNameFor("AWS::DynamoDB::GlobalTable", logicalId);
|
|
48130
48610
|
const keySchema = properties["KeySchema"];
|
|
48131
48611
|
const attributeDefinitions = properties["AttributeDefinitions"];
|
|
@@ -48276,6 +48756,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48276
48756
|
let createdTableId;
|
|
48277
48757
|
try {
|
|
48278
48758
|
createdTableId = (await (await this.getCreateClient()).send(new CreateTableCommand(createParams)))?.TableDescription?.TableId;
|
|
48759
|
+
reportCreatedResource(logicalId, resourceType, tableName, createdTableId);
|
|
48279
48760
|
log.debug(`CreateTable initiated for ${log.value(tableName)}, waiting for ACTIVE`);
|
|
48280
48761
|
} catch (error) {
|
|
48281
48762
|
const cause = error instanceof Error ? error : void 0;
|
|
@@ -48296,6 +48777,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48296
48777
|
await this.applyCrossRegionReplicaTagsDiff(tableInfo.tableArn, region, void 0, replicaTags, resourceType, logicalId, tableName, maskSecrets);
|
|
48297
48778
|
}
|
|
48298
48779
|
await this.applyReplicaSettings(tableName, logicalId, currentRegion, wiringProperties, void 0, /* @__PURE__ */ new Set(), false, replayWarn(log, context).onUnusable !== void 0, /* @__PURE__ */ new Set(), void 0, warn, maskSecrets);
|
|
48780
|
+
await this.convergeReplicaDisassociationProtection(tableName, logicalId, currentRegion, wiringProperties, void 0, context?.replayingState === true ? "replay" : "template", warn, maskSecrets);
|
|
48299
48781
|
const createTtl = planTimeToLive(properties["TimeToLiveSpecification"], void 0, "create");
|
|
48300
48782
|
if (createTtl.kind === "enable") await this.dynamoDBClient.send(new UpdateTimeToLiveCommand({
|
|
48301
48783
|
TableName: tableName,
|
|
@@ -48347,6 +48829,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48347
48829
|
}
|
|
48348
48830
|
}
|
|
48349
48831
|
await this.dynamoDBClient.send(new DeleteTableCommand({ TableName: tableName }));
|
|
48832
|
+
retractCreatedResource(logicalId, resourceType, tableName);
|
|
48350
48833
|
} catch (cleanupErr) {
|
|
48351
48834
|
tableLeftBehind = true;
|
|
48352
48835
|
warn(`Partial-create cleanup failed for ${tableName}: ${this.cleanupFailureText(log, `Partial-create cleanup failed for ${tableName}: `, cleanupErr)} To remove the orphaned AWS-side table, run: ` + pasteableAwsCommand(maskSecrets)`aws dynamodb delete-table --table-name ${tableName}`.render());
|
|
@@ -48394,6 +48877,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48394
48877
|
TableName: tableName,
|
|
48395
48878
|
ReplicaUpdates: replicaUpdates
|
|
48396
48879
|
}));
|
|
48880
|
+
markAttemptedItems("Replicas", [region]);
|
|
48397
48881
|
break;
|
|
48398
48882
|
} catch (error) {
|
|
48399
48883
|
if (attempt >= 3 || !isReplicaCopyExistsRefusal(error)) throw error;
|
|
@@ -48421,14 +48905,14 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48421
48905
|
DeletionProtectionEnabled: enabled
|
|
48422
48906
|
}));
|
|
48423
48907
|
}
|
|
48424
|
-
async waitForReplicaProtectionSettled(tableName, region, enabled, logicalId, maskSecrets, budget) {
|
|
48908
|
+
async waitForReplicaProtectionSettled(tableName, region, enabled, logicalId, maskSecrets, budget, member = "DeletionProtectionEnabled", replicaClient = this.getRegionalClient(region)) {
|
|
48425
48909
|
const wait = beginDeleteWait(60, budget);
|
|
48426
|
-
const watch = startInterruptWatch(maskSecrets(`DynamoDB replica ${region} deletion-protection change on ${tableName}`));
|
|
48910
|
+
const watch = startInterruptWatch(maskSecrets(`DynamoDB replica ${region} ${member === "DeletionProtectionEnabled" ? "deletion-protection" : "disassociation-protection"} change on ${tableName}`));
|
|
48427
48911
|
try {
|
|
48428
48912
|
while (wait.nextPoll()) {
|
|
48429
48913
|
if (watch.isInterrupted()) throw watch.onInterrupted();
|
|
48430
|
-
const replica = await
|
|
48431
|
-
if (replica.Table?.TableStatus === "ACTIVE" && replica.Table
|
|
48914
|
+
const replica = await replicaClient.send(new DescribeTableCommand({ TableName: tableName }));
|
|
48915
|
+
if (replica.Table?.TableStatus === "ACTIVE" && replica.Table[member] === enabled) {
|
|
48432
48916
|
if ((await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: tableName }))).Table?.TableStatus === "ACTIVE") return;
|
|
48433
48917
|
}
|
|
48434
48918
|
await new Promise((resolve) => setTimeout(resolve, REPLICA_PROTECTION_SETTLE_POLL_MS));
|
|
@@ -48436,7 +48920,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48436
48920
|
} finally {
|
|
48437
48921
|
watch.dispose();
|
|
48438
48922
|
}
|
|
48439
|
-
throw new ProvisioningError(maskSecrets(
|
|
48923
|
+
throw new ProvisioningError(maskSecrets(`${member}=${enabled} on the ${region} replica of ${tableName} did not settle within ${wait.pollsRun} polls${wait.note()}`), "AWS::DynamoDB::GlobalTable", logicalId, tableName);
|
|
48440
48924
|
}
|
|
48441
48925
|
async convergeReplicaDeletionProtection(tableName, logicalId, currentRegion, previousProperties, properties, addedRegions, desiredFromReadback, warn, maskSecrets) {
|
|
48442
48926
|
const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
@@ -48465,6 +48949,63 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48465
48949
|
if (typeof live === "boolean" && live !== newDpe) await this.setReplicaDeletionProtection(tableName, region, newDpe, logicalId, maskSecrets);
|
|
48466
48950
|
}
|
|
48467
48951
|
}
|
|
48952
|
+
async convergeReplicaDisassociationProtection(tableName, logicalId, currentRegion, properties, previousProperties, origin, warn, maskSecrets) {
|
|
48953
|
+
const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
48954
|
+
let wrote = false;
|
|
48955
|
+
const multiRegion = isMultiRegionReplicaSet(properties);
|
|
48956
|
+
for (const entry of desired) {
|
|
48957
|
+
const replica = asRecord(entry);
|
|
48958
|
+
const region = replica?.["Region"];
|
|
48959
|
+
if (typeof region !== "string" || region === "") continue;
|
|
48960
|
+
const declared = readReplicaDisassociationProtection(replica);
|
|
48961
|
+
const previous = previousProperties === void 0 ? void 0 : readReplicaDisassociationProtection(localReplicaEntry(previousProperties, region));
|
|
48962
|
+
const clientFor = () => region === currentRegion ? this.dynamoDBClient : this.getRegionalClient(region);
|
|
48963
|
+
const readLive = async () => {
|
|
48964
|
+
const client = clientFor();
|
|
48965
|
+
try {
|
|
48966
|
+
return (await client.send(new DescribeTableCommand({ TableName: tableName }))).Table?.DisassociationProtectionEnabled;
|
|
48967
|
+
} catch (readError) {
|
|
48968
|
+
this.logger.debug(maskSecrets(`Could not read ${DISASSOCIATION_PROTECTION_KEY} on the ${region} replica of ${tableName}: ${describeAwsFailure(readError).detail}`));
|
|
48969
|
+
return;
|
|
48970
|
+
}
|
|
48971
|
+
};
|
|
48972
|
+
if (!multiRegion) {
|
|
48973
|
+
if (declared !== void 0) {
|
|
48974
|
+
const message = `${DISASSOCIATION_PROTECTION_KEY}=${declared} on the ${region} replica of ${tableName} is not sent: DynamoDB applies it only to a replica of a multi-Region global table, and this table's Replicas name a single Region.`;
|
|
48975
|
+
const justShrunk = previousProperties !== void 0 && isMultiRegionReplicaSet(previousProperties);
|
|
48976
|
+
if (origin === "template" && (justShrunk || declared !== previous)) warn(message);
|
|
48977
|
+
else this.logger.debug(maskSecrets(message));
|
|
48978
|
+
} else if (origin !== "readback" && replica?.[DISASSOCIATION_PROTECTION_KEY] === void 0 && previous !== void 0) warn(`${DISASSOCIATION_PROTECTION_KEY} was removed from the ${region} replica of ${tableName}, whose Replicas now name a single Region, so nothing is sent and the replica keeps its current setting (${previous} when last deployed).`);
|
|
48979
|
+
continue;
|
|
48980
|
+
}
|
|
48981
|
+
if (declared === void 0) {
|
|
48982
|
+
if (replica?.[DISASSOCIATION_PROTECTION_KEY] !== void 0 || previous === void 0) continue;
|
|
48983
|
+
if (origin === "template") warn(`${DISASSOCIATION_PROTECTION_KEY} was removed from the ${region} replica of ${tableName}; DynamoDB keeps the replica's current setting (${previous} when last deployed), so nothing is sent. Declare it to change it.`);
|
|
48984
|
+
else if (origin === "replay" && previous === false && await readLive() === false) {
|
|
48985
|
+
await this.setReplicaDisassociationProtection(tableName, region, clientFor(), true, logicalId, maskSecrets);
|
|
48986
|
+
wrote = true;
|
|
48987
|
+
}
|
|
48988
|
+
continue;
|
|
48989
|
+
}
|
|
48990
|
+
const changed = declared !== previous || isUnsettled("Replicas");
|
|
48991
|
+
const live = await readLive();
|
|
48992
|
+
if (live === declared) continue;
|
|
48993
|
+
if (live === void 0 && !changed) continue;
|
|
48994
|
+
await this.setReplicaDisassociationProtection(tableName, region, clientFor(), declared, logicalId, maskSecrets);
|
|
48995
|
+
wrote = true;
|
|
48996
|
+
}
|
|
48997
|
+
if (wrote) await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets);
|
|
48998
|
+
}
|
|
48999
|
+
async setReplicaDisassociationProtection(tableName, region, client, enabled, logicalId, maskSecrets) {
|
|
49000
|
+
await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets, client === this.dynamoDBClient ? {} : { region });
|
|
49001
|
+
markUnsettled("Replicas");
|
|
49002
|
+
this.logger.debug(maskSecrets(`Sending UpdateTable ${DISASSOCIATION_PROTECTION_KEY}=${enabled} to the ${region} replica of ${tableName}`));
|
|
49003
|
+
await client.send(new UpdateTableCommand({
|
|
49004
|
+
TableName: tableName,
|
|
49005
|
+
DisassociationProtectionEnabled: enabled
|
|
49006
|
+
}));
|
|
49007
|
+
await this.waitForReplicaProtectionSettled(tableName, region, enabled, logicalId, maskSecrets, void 0, DISASSOCIATION_PROTECTION_KEY, client);
|
|
49008
|
+
}
|
|
48468
49009
|
async convergeReplicaSettings(tableName, logicalId, currentRegion, properties, addedRegions, maskSecrets) {
|
|
48469
49010
|
const kept = (Array.isArray(properties["Replicas"]) ? properties["Replicas"] : []).map(asRecord).filter((r) => typeof r?.["Region"] === "string" && r["Region"] !== currentRegion && !addedRegions.has(r["Region"]));
|
|
48470
49011
|
if (kept.every((r) => readReplicaTableClass(r) === void 0)) return;
|
|
@@ -49047,7 +49588,8 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49047
49588
|
async update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
49048
49589
|
return unsettledScope.run({
|
|
49049
49590
|
mark: (key) => context?.markUnsettled?.(key),
|
|
49050
|
-
unsettled: context?.unsettledProperties ?? /* @__PURE__ */ new Set()
|
|
49591
|
+
unsettled: context?.unsettledProperties ?? /* @__PURE__ */ new Set(),
|
|
49592
|
+
attempted: (path, items) => context?.markAttempted?.(path, items)
|
|
49051
49593
|
}, () => this.updateInScope(logicalId, physicalId, resourceType, properties, previousProperties, context));
|
|
49052
49594
|
}
|
|
49053
49595
|
async updateInScope(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
@@ -49058,6 +49600,11 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49058
49600
|
const debug = log.debug;
|
|
49059
49601
|
debug(`Updating DynamoDB GlobalTable ${logicalId}: ${log.value(physicalId)}`);
|
|
49060
49602
|
refuseMalformedReplicaTags(properties, resourceType, logicalId, physicalId);
|
|
49603
|
+
const disassociationRefusal = disassociationProtectionRefusal(properties, previousProperties, logicalId);
|
|
49604
|
+
if (disassociationRefusal !== void 0) {
|
|
49605
|
+
if (context?.replayingState !== true && context?.desiredFromAwsReadback !== true) throw new ProvisioningError(log.mask(disassociationRefusal), resourceType, logicalId, physicalId);
|
|
49606
|
+
warn(`${disassociationRefusal} Proceeding: this update restores a recorded or read-back configuration.`);
|
|
49607
|
+
}
|
|
49061
49608
|
const replaceFlags = "cdkd deploy --replace --force-stateful-recreation";
|
|
49062
49609
|
const replaceRemedy = async () => {
|
|
49063
49610
|
let guardRegion = "";
|
|
@@ -49132,7 +49679,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49132
49679
|
const extractLocalTags = (props) => {
|
|
49133
49680
|
return localReplicaEntry(props, currentRegion)?.["Tags"];
|
|
49134
49681
|
};
|
|
49135
|
-
if (tableArn) await this.applyTagDiff(tableArn, resourceType, logicalId, extractLocalTags(previousProperties), extractLocalTags(properties), maskSecrets);
|
|
49682
|
+
if (tableArn) await this.applyTagDiff(tableArn, resourceType, logicalId, extractLocalTags(previousProperties), extractLocalTags(properties), maskSecrets, currentRegion);
|
|
49136
49683
|
const liveWarmByIndexName = /* @__PURE__ */ new Map();
|
|
49137
49684
|
for (const liveGsi of describeResp.Table?.GlobalSecondaryIndexes ?? []) {
|
|
49138
49685
|
const name = liveGsi.IndexName;
|
|
@@ -49336,7 +49883,10 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49336
49883
|
if (indexUpdates.length > 0) billingUpdate.GlobalSecondaryIndexUpdates = indexUpdates;
|
|
49337
49884
|
}
|
|
49338
49885
|
markUnsettled("BillingMode", "WriteProvisionedThroughputSettings");
|
|
49339
|
-
if (billingUpdate.GlobalSecondaryIndexUpdates !== void 0)
|
|
49886
|
+
if (billingUpdate.GlobalSecondaryIndexUpdates !== void 0) {
|
|
49887
|
+
markUnsettled("GlobalSecondaryIndexes");
|
|
49888
|
+
for (const indexUpdate of billingUpdate.GlobalSecondaryIndexUpdates) debug(`Sending UpdateTable GlobalSecondaryIndexUpdates Update for index ${maskSecrets(indexUpdate.Update?.IndexName ?? "")} on ${physicalId} (with the billing mode change)`);
|
|
49889
|
+
}
|
|
49340
49890
|
await this.dynamoDBClient.send(new UpdateTableCommand(billingUpdate));
|
|
49341
49891
|
await this.waitForTableActiveAfterUpdate(physicalId, logicalId, void 0, void 0, maskSecrets);
|
|
49342
49892
|
}
|
|
@@ -49460,6 +50010,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49460
50010
|
"streamTags"
|
|
49461
50011
|
] : context?.replayingState === true ? ["pitr"] : []);
|
|
49462
50012
|
await this.applyReplicaSettings(physicalId, logicalId, currentRegion, properties, previousProperties, addedReplicaRegions, !deepEqual(asRecord(properties["StreamSpecification"])?.["StreamViewType"], asRecord(previousProperties["StreamSpecification"])?.["StreamViewType"]), context?.replayingState === true || context?.desiredFromAwsReadback === true, replicaKeepOnRemoval, describeResp.Table?.LatestStreamArn, warn, maskSecrets);
|
|
50013
|
+
await this.convergeReplicaDisassociationProtection(physicalId, logicalId, currentRegion, properties, previousProperties, context?.desiredFromAwsReadback === true ? "readback" : context?.replayingState === true ? "replay" : "template", warn, maskSecrets);
|
|
49463
50014
|
const previousTranslatedIndexes = toSdkGlobalSecondaryIndexes(previousProperties, currentRegion, oldBilling, "min", void 0, onUnusablePreviousGsiBlock, maskSecrets);
|
|
49464
50015
|
const previousSdkIndexes = previousGsiUnusable ? buildLiveRecoveryGsiBaseline(desiredSdkIndexes, describeResp.Table?.GlobalSecondaryIndexes, {
|
|
49465
50016
|
carryLiveValues: oldBilling === newBilling && liveBillingMode === newBilling,
|
|
@@ -49483,6 +50034,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49483
50034
|
if (!gsi.IndexName) continue;
|
|
49484
50035
|
const gsiUpdate = { Delete: { IndexName: gsi.IndexName } };
|
|
49485
50036
|
markUnsettled("GlobalSecondaryIndexes");
|
|
50037
|
+
debug(`Sending UpdateTable GlobalSecondaryIndexUpdates Delete for index ${maskSecrets(gsi.IndexName)} on ${physicalId}`);
|
|
49486
50038
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
49487
50039
|
TableName: physicalId,
|
|
49488
50040
|
GlobalSecondaryIndexUpdates: [gsiUpdate]
|
|
@@ -49501,11 +50053,13 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49501
50053
|
...addedWarmToSend && { WarmThroughput: addedWarmToSend }
|
|
49502
50054
|
} };
|
|
49503
50055
|
markUnsettled("GlobalSecondaryIndexes");
|
|
50056
|
+
debug(`Sending UpdateTable GlobalSecondaryIndexUpdates Create for index ${maskSecrets(gsi.IndexName ?? "")} on ${physicalId}`);
|
|
49504
50057
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
49505
50058
|
TableName: physicalId,
|
|
49506
50059
|
AttributeDefinitions: newAttrs,
|
|
49507
50060
|
GlobalSecondaryIndexUpdates: [gsiUpdate]
|
|
49508
50061
|
}));
|
|
50062
|
+
markAttemptedItems("GlobalSecondaryIndexes", [gsi.IndexName]);
|
|
49509
50063
|
await this.waitForTableActiveAfterUpdate(physicalId, logicalId, void 0, void 0, maskSecrets);
|
|
49510
50064
|
}
|
|
49511
50065
|
for (const gsi of gsiDiff.modified) {
|
|
@@ -49542,6 +50096,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49542
50096
|
}
|
|
49543
50097
|
const gsiUpdate = { Update: update };
|
|
49544
50098
|
markUnsettled("GlobalSecondaryIndexes");
|
|
50099
|
+
debug(`Sending UpdateTable GlobalSecondaryIndexUpdates Update for index ${maskSecrets(gsi.IndexName ?? "")} on ${physicalId}`);
|
|
49545
50100
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
49546
50101
|
TableName: physicalId,
|
|
49547
50102
|
GlobalSecondaryIndexUpdates: [gsiUpdate]
|
|
@@ -49625,8 +50180,8 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49625
50180
|
throw this.wrapMaskedError(log, error, (text) => new ProvisioningError(`Failed to update DynamoDB GlobalTable ${logicalId}: ${text}`, resourceType, logicalId, physicalId, cause));
|
|
49626
50181
|
}
|
|
49627
50182
|
}
|
|
49628
|
-
async applyTagDiff(tableArn, resourceType, logicalId, oldTagsRaw, newTagsRaw, maskSecrets) {
|
|
49629
|
-
await this.applyTagDiffOnClient(this.dynamoDBClient, tableArn, resourceType, logicalId, oldTagsRaw, newTagsRaw, maskSecrets);
|
|
50183
|
+
async applyTagDiff(tableArn, resourceType, logicalId, oldTagsRaw, newTagsRaw, maskSecrets, region) {
|
|
50184
|
+
await this.applyTagDiffOnClient(this.dynamoDBClient, tableArn, resourceType, logicalId, oldTagsRaw, newTagsRaw, maskSecrets, region);
|
|
49630
50185
|
}
|
|
49631
50186
|
async applyCrossRegionReplicaTagsDiff(tableArn, region, oldTags, newTags, resourceType, logicalId, physicalIdForLogs, maskSecrets = (text) => text) {
|
|
49632
50187
|
const warn = (message) => this.logger.warn(maskSecrets(message));
|
|
@@ -49642,12 +50197,12 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49642
50197
|
}
|
|
49643
50198
|
try {
|
|
49644
50199
|
const regionalClient = this.getRegionalClient(region);
|
|
49645
|
-
await this.applyTagDiffOnClient(regionalClient, replicaArn, resourceType, `${logicalId} (replica ${region})`, oldTags, newTags, maskSecrets);
|
|
50200
|
+
await this.applyTagDiffOnClient(regionalClient, replicaArn, resourceType, `${logicalId} (replica ${region})`, oldTags, newTags, maskSecrets, region);
|
|
49646
50201
|
} catch (tagErr) {
|
|
49647
50202
|
warn(`Could not apply Tags diff to cross-region replica ${region} of ${physicalIdForLogs}: ${describeAwsFailure(tagErr).detail}. The replica's Tags state will surface as drift until the next successful deploy.`);
|
|
49648
50203
|
}
|
|
49649
50204
|
}
|
|
49650
|
-
async applyTagDiffOnClient(client, tableArn, resourceType, id, oldTagsRaw, newTagsRaw, maskSecrets = (text) => text) {
|
|
50205
|
+
async applyTagDiffOnClient(client, tableArn, resourceType, id, oldTagsRaw, newTagsRaw, maskSecrets = (text) => text, region) {
|
|
49651
50206
|
const plan = planTagDiff(oldTagsRaw, newTagsRaw);
|
|
49652
50207
|
const tagWarning = tagPlanWarning(plan, resourceType, id);
|
|
49653
50208
|
if (tagWarning !== void 0) this.logger.warn(maskSecrets(tagWarning));
|
|
@@ -49669,6 +50224,15 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49669
50224
|
ResourceArn: tableArn,
|
|
49670
50225
|
Tags: tagsToAdd
|
|
49671
50226
|
}));
|
|
50227
|
+
if (region !== void 0 && REGION_SEGMENT.test(region)) {
|
|
50228
|
+
let recordedKeys;
|
|
50229
|
+
try {
|
|
50230
|
+
recordedKeys = /* @__PURE__ */ new Set([...planTagDiff(void 0, oldTagsRaw).set.keys()]);
|
|
50231
|
+
} catch {
|
|
50232
|
+
recordedKeys = void 0;
|
|
50233
|
+
}
|
|
50234
|
+
if (recordedKeys !== void 0) markAttemptedItems(`Replicas[${region}].Tags`, tagsToAdd.map((t) => t.Key).filter((key) => !recordedKeys.has(key)));
|
|
50235
|
+
}
|
|
49672
50236
|
this.logger.debug(maskSecrets(`Added/updated ${tagsToAdd.length} tag(s) on DynamoDB GlobalTable ${tableArn}`));
|
|
49673
50237
|
}
|
|
49674
50238
|
}
|
|
@@ -50088,7 +50652,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
50088
50652
|
throw err;
|
|
50089
50653
|
}
|
|
50090
50654
|
}
|
|
50091
|
-
async readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, desiredProperties) {
|
|
50655
|
+
async readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, desiredProperties, attemptedItems) {
|
|
50092
50656
|
const live = await strictReadScope.run(names, () => this.readCurrentState(physicalId, logicalId, resourceType, recordedProperties));
|
|
50093
50657
|
if (typeof live !== "object" || live === null) return live;
|
|
50094
50658
|
const out = { ...live };
|
|
@@ -50096,7 +50660,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
50096
50660
|
const unnamed = [];
|
|
50097
50661
|
for (const name of names) {
|
|
50098
50662
|
if (!Object.hasOwn(out, name)) continue;
|
|
50099
|
-
out[name] = projectNamed(out[name], recordedProperties?.[name], desiredProperties?.[name], name, unnamed);
|
|
50663
|
+
out[name] = projectNamed(out[name], recordedProperties?.[name], desiredProperties?.[name], name, unnamed, attemptedItems);
|
|
50100
50664
|
}
|
|
50101
50665
|
for (const entry of unnamed.filter((e) => e.ambiguous === true)) this.logger.warn(safeMsg`${logicalId} (${resourceType}): ${entry.path} on AWS has entries cdkd cannot key by an identity, so convergence keeps the recorded ${entry.path} rather than risk removing an entry neither the record nor the template declares. Check it with 'cdkd drift'.`);
|
|
50102
50666
|
for (const entry of unnamed.filter((e) => e.ambiguous !== true)) this.logger.warn(safeMsg`${logicalId} (${resourceType}): ${entry.path} on AWS holds ${entry.identity} ${entry.value}, which neither the record nor the template declares, so cdkd leaves it in place. If the failed update added it and it should not be there, remove it by hand (for a replica: aws dynamodb update-table --replica-updates Delete; for an index: --global-secondary-index-updates Delete).`);
|
|
@@ -50164,13 +50728,16 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
50164
50728
|
const subs = await this.readReplicaSubSpecs(client, tableNameForSubs, regionLabel, declaredReplica);
|
|
50165
50729
|
Object.assign(entry, subs);
|
|
50166
50730
|
let protection;
|
|
50731
|
+
let disassociationProtection;
|
|
50167
50732
|
let streamArn;
|
|
50168
50733
|
if (isLocal) {
|
|
50169
50734
|
protection = table.DeletionProtectionEnabled;
|
|
50735
|
+
disassociationProtection = table.DisassociationProtectionEnabled;
|
|
50170
50736
|
streamArn = table.LatestStreamArn;
|
|
50171
50737
|
} else try {
|
|
50172
50738
|
const regional = await client.send(new DescribeTableCommand({ TableName: tableNameForSubs }));
|
|
50173
50739
|
protection = regional.Table?.DeletionProtectionEnabled;
|
|
50740
|
+
disassociationProtection = regional.Table?.DisassociationProtectionEnabled;
|
|
50174
50741
|
streamArn = regional.Table?.LatestStreamArn;
|
|
50175
50742
|
} catch (err) {
|
|
50176
50743
|
if (strictFor("Replicas") && !(err instanceof ResourceNotFoundException$1)) throw err;
|
|
@@ -50178,6 +50745,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
50178
50745
|
else this.logger.debug(safeMsg`Could not read the ${regionLabel} replica of ${tableNameForSubs}: ${describeAwsFailure(err).detail}`);
|
|
50179
50746
|
}
|
|
50180
50747
|
if (typeof protection === "boolean") entry["DeletionProtectionEnabled"] = protection;
|
|
50748
|
+
if (typeof disassociationProtection === "boolean" && declaredReplica?.[DISASSOCIATION_PROTECTION_KEY] !== void 0) entry[DISASSOCIATION_PROTECTION_KEY] = disassociationProtection;
|
|
50181
50749
|
await this.readReplicaPolicies(client, tableNameForSubs, regionLabel, replicaArn, streamArn, declaredReplica, afterOwnWrite, entry);
|
|
50182
50750
|
if (replicaArn) try {
|
|
50183
50751
|
const tagsResp = await client.send(new ListTagsOfResourceCommand({ ResourceArn: replicaArn }));
|
|
@@ -50573,6 +51141,46 @@ function refuseMalformedReplicaTags(properties, resourceType, logicalId, physica
|
|
|
50573
51141
|
});
|
|
50574
51142
|
return tagsByReplica;
|
|
50575
51143
|
}
|
|
51144
|
+
const DISASSOCIATION_PROTECTION_KEY = "DisassociationProtectionEnabled";
|
|
51145
|
+
function disassociationProtectionRefusal(properties, previousProperties, logicalId) {
|
|
51146
|
+
const replicas = properties["Replicas"];
|
|
51147
|
+
if (!Array.isArray(replicas)) return void 0;
|
|
51148
|
+
const malformed = [];
|
|
51149
|
+
const singleRegion = [];
|
|
51150
|
+
const multiRegion = isMultiRegionReplicaSet(properties);
|
|
51151
|
+
replicas.forEach((entry, index) => {
|
|
51152
|
+
const replica = asRecord(entry);
|
|
51153
|
+
if (replica === void 0) return;
|
|
51154
|
+
const refusal = configBooleanRefusal(replica, DISASSOCIATION_PROTECTION_KEY, `Replicas[${index}]`);
|
|
51155
|
+
if (refusal !== void 0) {
|
|
51156
|
+
malformed.push(refusal);
|
|
51157
|
+
return;
|
|
51158
|
+
}
|
|
51159
|
+
const declared = readReplicaDisassociationProtection(replica);
|
|
51160
|
+
if (declared === void 0 || multiRegion) return;
|
|
51161
|
+
const region = replica["Region"];
|
|
51162
|
+
const previous = previousProperties === void 0 || typeof region !== "string" ? void 0 : readReplicaDisassociationProtection(localReplicaEntry(previousProperties, region));
|
|
51163
|
+
if (declared === false && declared !== previous) singleRegion.push(`Replicas[${index}].${DISASSOCIATION_PROTECTION_KEY}`);
|
|
51164
|
+
});
|
|
51165
|
+
const parts = [];
|
|
51166
|
+
if (malformed.length > 0) parts.push(`${malformed.join("; ")}. That replica's disassociation protection is left as it is.`);
|
|
51167
|
+
if (singleRegion.length > 0) parts.push(`${singleRegion.join(", ")} is applied by DynamoDB only to a replica of a multi-Region (MREC) global table, and this table's Replicas name a single Region, so cdkd does not send it. Remove ${DISASSOCIATION_PROTECTION_KEY}, or add a replica in another Region.`);
|
|
51168
|
+
if (parts.length === 0) return void 0;
|
|
51169
|
+
return `AWS::DynamoDB::GlobalTable ${logicalId}: ${parts.join(" ")}`;
|
|
51170
|
+
}
|
|
51171
|
+
function isMultiRegionReplicaSet(properties) {
|
|
51172
|
+
const replicas = properties["Replicas"];
|
|
51173
|
+
if (!Array.isArray(replicas)) return false;
|
|
51174
|
+
const regions = /* @__PURE__ */ new Set();
|
|
51175
|
+
for (const entry of replicas) {
|
|
51176
|
+
const region = asRecord(entry)?.["Region"];
|
|
51177
|
+
if (typeof region === "string" && region !== "") regions.add(region);
|
|
51178
|
+
}
|
|
51179
|
+
return regions.size > 1;
|
|
51180
|
+
}
|
|
51181
|
+
function readReplicaDisassociationProtection(replica) {
|
|
51182
|
+
return coerceCfnBoolean(replica?.[DISASSOCIATION_PROTECTION_KEY]);
|
|
51183
|
+
}
|
|
50576
51184
|
function completeLegacyLocalReplica(baseline, aws, localRegion) {
|
|
50577
51185
|
const key = "Replicas";
|
|
50578
51186
|
const baselineReplicas = baseline[key];
|
|
@@ -51801,6 +52409,7 @@ async function updateByReplacement(engine, { change, counts, currentProps, curre
|
|
|
51801
52409
|
...extractTemplateAttributes(template, logicalId),
|
|
51802
52410
|
provisionedBy: replaceDecision.provisionedBy
|
|
51803
52411
|
};
|
|
52412
|
+
clearCreatedReport();
|
|
51804
52413
|
engine.recordInlinePolicyWrite(logicalId, "create");
|
|
51805
52414
|
await establishNoEchoEchoFidelity(engine.noEchoRun, engine.noEchoDeps(), logicalId, stateResources[logicalId], resolvedProps, stateResources, updateSecrets);
|
|
51806
52415
|
engine.observedCapture.kickOffObservedCapture(replaceProvider, logicalId, createResult.physicalId, resourceType, resolvedProps, { afterOwnWrite: true }, updateSecrets);
|
|
@@ -51878,6 +52487,7 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
51878
52487
|
const changedForProvider = new Set(changedProperties);
|
|
51879
52488
|
for (const key of /* @__PURE__ */ new Set([...Object.keys(previousWithNoEchoHeld), ...Object.keys(previousForUpdate)])) if (keyOrderFreeJson(previousForUpdate[key]) !== keyOrderFreeJson(previousWithNoEchoHeld[key])) changedForProvider.add(key);
|
|
51880
52489
|
const unsettled = unsettledPropertiesOf(currentResource);
|
|
52490
|
+
const unsettledItems = unsettledItemsOf(currentResource);
|
|
51881
52491
|
if (changedForProvider.size === 0) for (const key of /* @__PURE__ */ new Set([...Object.keys(updateProps), ...Object.keys(previousForUpdate)])) changedForProvider.add(key);
|
|
51882
52492
|
if (reattached !== void 0) engine.logger.info(safeMsg` ${logicalId} (${resourceType}) lost its attachment to ${reattached.parents.join(", ")}, which this deploy re-created under the same name: attaching it again`);
|
|
51883
52493
|
if (droppedPrincipalKinds.length > 0) {
|
|
@@ -51895,7 +52505,8 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
51895
52505
|
...unsettledIdentity,
|
|
51896
52506
|
names: unsettled,
|
|
51897
52507
|
previous: previousForUpdate,
|
|
51898
|
-
desired: updateProps
|
|
52508
|
+
desired: updateProps,
|
|
52509
|
+
attemptedItems: unsettledItems
|
|
51899
52510
|
});
|
|
51900
52511
|
if (unsettled.has("Tags")) engine.logger.warn(safeMsg`${logicalId} (${resourceType}): an earlier failed update left Tags unsettled. cdkd re-applies the template's tags and removes only the recorded ones the template dropped; a tag that failed update added and no template declares is left on the resource. Remove it by hand if it should not be there.`);
|
|
51901
52512
|
const removal = prepareRemovalForUpdate(updateProvider, resourceType, updateProps, previousSettled);
|
|
@@ -51925,10 +52536,23 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
51925
52536
|
}
|
|
51926
52537
|
marks.add(propertyName);
|
|
51927
52538
|
},
|
|
51928
|
-
|
|
52539
|
+
markAttempted: (path, items) => {
|
|
52540
|
+
if (typeof path !== "string" || path === "") return;
|
|
52541
|
+
let byPath = engine.unsettledItemMarks.get(logicalId);
|
|
52542
|
+
if (byPath === void 0) {
|
|
52543
|
+
byPath = /* @__PURE__ */ new Map();
|
|
52544
|
+
engine.unsettledItemMarks.set(logicalId, byPath);
|
|
52545
|
+
}
|
|
52546
|
+
const names = byPath.get(path) ?? /* @__PURE__ */ new Set();
|
|
52547
|
+
for (const item of items) if (typeof item === "string" && item !== "") names.add(item);
|
|
52548
|
+
byPath.set(path, names);
|
|
52549
|
+
},
|
|
52550
|
+
...unsettled.size > 0 && { unsettledProperties: unsettled },
|
|
52551
|
+
...unsettledItems.size > 0 && { unsettledItems }
|
|
51929
52552
|
})), logicalId, void 0, void 0, updateProvider);
|
|
51930
52553
|
if (result.sentNothing === true) engine.replacementRun.updatesThatSentNothing.add(logicalId);
|
|
51931
52554
|
engine.unsettledMarks.delete(logicalId);
|
|
52555
|
+
engine.unsettledItemMarks.delete(logicalId);
|
|
51932
52556
|
if (result.wasReplaced === true && result.outcome === "partial") engine.replacementRun.replacedOldMaySurvive.set(logicalId, result.oldResourceSurvivor === "kept" ? "kept" : "unconfirmed");
|
|
51933
52557
|
result = withoutInjectedRemovals(result, removal.injected);
|
|
51934
52558
|
const unhandledByCause = splitUnhandledRemovals(removal.unhandled, previousForUpdate, unsettled);
|
|
@@ -52114,6 +52738,7 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
52114
52738
|
generation: fallbackGeneration
|
|
52115
52739
|
}, replaceFallback));
|
|
52116
52740
|
engine.unsettledMarks.delete(logicalId);
|
|
52741
|
+
engine.unsettledItemMarks.delete(logicalId);
|
|
52117
52742
|
result = fallbackOutcome.result;
|
|
52118
52743
|
resultProvisionedBy = fallbackOutcome.provisionedBy;
|
|
52119
52744
|
captureProvider = fallbackOutcome.captureProvider;
|
|
@@ -52137,7 +52762,8 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
52137
52762
|
const stillUnsettled = result.wasReplaced ? [] : await unsettledAfterUpdate({
|
|
52138
52763
|
...unsettledIdentity,
|
|
52139
52764
|
names: unsettled,
|
|
52140
|
-
desired: updateProps
|
|
52765
|
+
desired: updateProps,
|
|
52766
|
+
attemptedItems: unsettledItems
|
|
52141
52767
|
});
|
|
52142
52768
|
if (stillUnsettled.length > 0) engine.logger.warn(safeMsg`${logicalId} (${resourceType}): the update succeeded, but AWS does not yet show the template's ${stillUnsettled.join(", ")}; cdkd keeps ${stillUnsettled.length === 1 ? "it" : "them"} unsettled and converges again on the next deploy.`);
|
|
52143
52769
|
engine.replacementRun.updateWasReplaced.set(logicalId, result.wasReplaced === true);
|
|
@@ -52176,12 +52802,16 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
52176
52802
|
...dependencies && dependencies.length > 0 && { dependencies },
|
|
52177
52803
|
...extractTemplateAttributes(template, logicalId),
|
|
52178
52804
|
provisionedBy: resultProvisionedBy,
|
|
52179
|
-
...stillUnsettled.length > 0 && {
|
|
52805
|
+
...stillUnsettled.length > 0 && {
|
|
52806
|
+
unsettledProperties: stillUnsettled,
|
|
52807
|
+
...unsettledItemsField(currentResource, stillUnsettled)
|
|
52808
|
+
},
|
|
52180
52809
|
...keepsParameterRefusal && {
|
|
52181
52810
|
observedBaselineRefused: true,
|
|
52182
52811
|
observedBaselineRefusalReason: "unverifiable-parameter"
|
|
52183
52812
|
}
|
|
52184
52813
|
};
|
|
52814
|
+
clearCreatedReport();
|
|
52185
52815
|
if (updatePartialReason(result) === void 0) engine.recordInlinePolicyWrite(logicalId, "update");
|
|
52186
52816
|
if (keepsParameterRefusal) engine.logger.debug(safeMsg`observedProperties capture SKIPPED for updated ${logicalId} (${resourceType}): 'cdkd import' refused its baseline because a template parameter was not provably deployed at its 'Default', and this deploy bound the same 'Default' — an in-place update cannot show that AWS no longer holds the deployed value. The refusal stands until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter.`);
|
|
52187
52817
|
const updateCaptureSiblings = keepsParameterRefusal ? void 0 : await buildObservedCaptureSiblings({
|
|
@@ -52834,6 +53464,8 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
|
|
|
52834
53464
|
unwritten,
|
|
52835
53465
|
routeDriving: findActionableSilentDrops(resourceType, desiredForSkipCheck, allowedForRecord, currentProps).map(({ property }) => property),
|
|
52836
53466
|
nested: engine.options.parentStackInfo !== void 0,
|
|
53467
|
+
nowWritten: findHandledUnwrittenCreateOnly(resourceType, currentProps, createOnlyEvidence),
|
|
53468
|
+
evidence: [...createOnlyEvidence],
|
|
52837
53469
|
protectionEvidence: recordedProtectionEvidence(resourceType, currentProps, currentResource.observedProperties, engine.stackRegion)
|
|
52838
53470
|
}), "CREATE_ONLY_DROP_NEEDS_REPLACEMENT")));
|
|
52839
53471
|
}
|
|
@@ -52945,13 +53577,34 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
|
|
|
52945
53577
|
}
|
|
52946
53578
|
function unwrittenCreateOnlyRefusal(input) {
|
|
52947
53579
|
const { logicalId, resourceType, unwritten, routeDriving, nested, protectionEvidence } = input;
|
|
53580
|
+
const nowWritten = (input.nowWritten ?? []).filter((property) => unwritten.includes(property));
|
|
53581
|
+
if (nowWritten.length > 0) return nowWrittenCreateOnlyRefusal({
|
|
53582
|
+
...input,
|
|
53583
|
+
nowWritten
|
|
53584
|
+
});
|
|
52948
53585
|
const one = unwritten.length === 1;
|
|
52949
53586
|
const list = unwritten.join(", ");
|
|
52950
53587
|
const keep = [.../* @__PURE__ */ new Set([...unwritten, ...routeDriving])].sort((a, b) => a.localeCompare(b)).map((property) => `${resourceType}:${property}`).join(",");
|
|
52951
|
-
const replaceFlags =
|
|
53588
|
+
const replaceFlags = unwrittenReplaceFlags(logicalId, nested);
|
|
52952
53589
|
const routed = [...routeDriving].sort((a, b) => a.localeCompare(b)).join(", ");
|
|
52953
53590
|
return safeMsg`${logicalId} (${resourceType}): ${list} ${one ? "is" : "are"} create-only, and the ` + `state record holds ${one ? "it" : "them"} although this type's SDK provider never writes ${one ? "it" : "them"}, so AWS does not. This deploy routes the resource through ` + safeMsg`Cloud Control (--prefer-sdk-route does not cover ${routed}), and applying a create-only ` + `property means replacing the resource, which cdkd does not do on its own. This ` + safeMsg`resource was not changed. To replace it and apply ${list}, re-run with ${replaceFlags}; a ` + `stateful resource also needs --force-stateful-recreation.` + (protectionEvidence !== void 0 ? safeMsg` ${recordedProtectionNote(protectionEvidence, nested ? "--replace" : `--recreate-via-cc-api ${logicalId} or --replace`)}` : "") + safeMsg` To keep dropping ${one ? "it" : "them"}, re-run with --prefer-sdk-route ${keep}.`;
|
|
52954
53591
|
}
|
|
53592
|
+
function unwrittenReplaceFlags(logicalId, nested) {
|
|
53593
|
+
return nested ? "--replace (which creates the new resource before deleting the old one, so a resource holding a unique value other than its name, such as a CIDR block, collides)" : `--recreate-via-cc-api ${logicalId}, which deletes the old resource first (--replace also works, but creates the new one first, so a resource holding a unique value other than its name, such as a CIDR block, collides)`;
|
|
53594
|
+
}
|
|
53595
|
+
function nowWrittenCreateOnlyRefusal(input) {
|
|
53596
|
+
const { logicalId, resourceType, unwritten, routeDriving, nested, protectionEvidence } = input;
|
|
53597
|
+
const nowWritten = input.nowWritten;
|
|
53598
|
+
const one = unwritten.length === 1;
|
|
53599
|
+
const list = unwritten.join(", ");
|
|
53600
|
+
const written = nowWritten.join(", ");
|
|
53601
|
+
const writtenOne = nowWritten.length === 1;
|
|
53602
|
+
const stillDropped = unwritten.filter((property) => !nowWritten.includes(property));
|
|
53603
|
+
const keep = [.../* @__PURE__ */ new Set([...stillDropped, ...routeDriving])].filter((property) => !nowWritten.includes(property)).sort((a, b) => a.localeCompare(b)).map((property) => `${resourceType}:${property}`).join(",");
|
|
53604
|
+
const routed = [...routeDriving].sort((a, b) => a.localeCompare(b)).join(", ");
|
|
53605
|
+
const replaceFlags = unwrittenReplaceFlags(logicalId, nested);
|
|
53606
|
+
return safeMsg`${logicalId} (${resourceType}): ${list} ${one ? "is" : "are"} create-only, and the ` + `state record holds ${one ? "it" : "them"} although the SDK provider that built the resource did not write ${one ? "it" : "them"} (an earlier deploy accepted dropping ${one ? "it" : "them"} with --prefer-sdk-route), so AWS does not. ` + safeMsg`This cdkd version's SDK provider writes ${written}, so no flag keeps ` + `${writtenOne ? "it" : "them"} dropped any more` + (routed.length > 0 ? safeMsg`, and this deploy routes the resource through Cloud Control (--prefer-sdk-route does not cover ${routed})` : "") + "; applying a create-only property means replacing the resource, which cdkd does not do on its own. This " + safeMsg`resource was not changed. To replace it and apply ${list}, re-run with ${replaceFlags}; a ` + `stateful resource also needs --force-stateful-recreation.` + (protectionEvidence !== void 0 ? safeMsg` ${recordedProtectionNote(protectionEvidence, nested ? "--replace" : `--recreate-via-cc-api ${logicalId} or --replace`)}` : "") + safeMsg` To keep the resource as it is, remove ${written} from the template` + (keep.length > 0 ? safeMsg` and re-run with --prefer-sdk-route ${keep}.` : ".") + (nested || stillDropped.length > 0 || (input.evidence ?? []).some((property) => !nowWritten.includes(property)) ? "" : safeMsg` If AWS already holds ${written} (cdkd drift compares it), re-record the ` + safeMsg`resource instead: cdkd import with --resource '${logicalId}=PHYSICAL_ID' (its physical ` + `id, quoted) and --force writes a record without this evidence and changes nothing in AWS.`);
|
|
53607
|
+
}
|
|
52955
53608
|
function scalarLeavesOf(value, into = /* @__PURE__ */ new Set()) {
|
|
52956
53609
|
if (typeof value === "string") into.add(value);
|
|
52957
53610
|
else if (typeof value === "number") into.add(String(value));
|
|
@@ -53038,7 +53691,7 @@ async function provisionResource(engine, logicalId, change, stateResources, stac
|
|
|
53038
53691
|
let nestedChildUnaddressed;
|
|
53039
53692
|
const deleteGuards = [];
|
|
53040
53693
|
try {
|
|
53041
|
-
await withPrintingSecrets(printingRegistry, () => withResourceDeadline(async () => {
|
|
53694
|
+
await withPrintingSecrets(printingRegistry, () => withResourceDeadline(trackInFlightBody(engine, logicalId, async () => {
|
|
53042
53695
|
try {
|
|
53043
53696
|
const { value: bodyResult, unaddressed } = await collectDeleteGuards(deleteGuards, () => collectNestedChildUnaddressed(() => provisionResourceBody(engine, logicalId, change, stateResources, stackName, template, parameterValues, conditions, counts, progress)));
|
|
53044
53697
|
deleteSkipped = bodyResult?.deleteSkipped;
|
|
@@ -53070,7 +53723,7 @@ async function provisionResource(engine, logicalId, change, stateResources, stac
|
|
|
53070
53723
|
reason: guard.reason
|
|
53071
53724
|
});
|
|
53072
53725
|
}
|
|
53073
|
-
}, {
|
|
53726
|
+
}), {
|
|
53074
53727
|
warnAfterMs,
|
|
53075
53728
|
timeoutMs,
|
|
53076
53729
|
onWarn: (elapsedMs) => {
|
|
@@ -53148,6 +53801,17 @@ async function provisionResource(engine, logicalId, change, stateResources, stac
|
|
|
53148
53801
|
renderer.removeTask(logicalId);
|
|
53149
53802
|
}
|
|
53150
53803
|
}
|
|
53804
|
+
function trackInFlightBody(engine, logicalId, body) {
|
|
53805
|
+
return () => {
|
|
53806
|
+
const running = body();
|
|
53807
|
+
const entry = running.then(() => true, () => false);
|
|
53808
|
+
engine.inFlightBodies.set(logicalId, entry);
|
|
53809
|
+
entry.then(() => {
|
|
53810
|
+
if (engine.inFlightBodies.get(logicalId) === entry) engine.inFlightBodies.delete(logicalId);
|
|
53811
|
+
});
|
|
53812
|
+
return running;
|
|
53813
|
+
};
|
|
53814
|
+
}
|
|
53151
53815
|
async function provisionResourceBody(engine, logicalId, change, stateResources, stackName, template, parameterValues, conditions, counts, progress) {
|
|
53152
53816
|
const loadJournal = () => engine.stateBackend.loadRollbackJournal(stackName, engine.stackRegion);
|
|
53153
53817
|
const priorAttempts = priorAttemptLookup(logicalId, async () => priorAttemptsInJournal(await loadJournal(), logicalId, change.resourceType), async () => provenOrphanIdsInJournal(await loadJournal(), logicalId, change.resourceType));
|
|
@@ -53183,6 +53847,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53183
53847
|
};
|
|
53184
53848
|
const completedOperations = [];
|
|
53185
53849
|
const failedOperations = [];
|
|
53850
|
+
const reportedCreatesToSettle = [];
|
|
53186
53851
|
let pendingMigration = migrationPending;
|
|
53187
53852
|
const phaseScope = phaseScopeForStack(stackName, engine.stackRegion);
|
|
53188
53853
|
let saveChain = Promise.resolve();
|
|
@@ -53200,7 +53865,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53200
53865
|
const savedFor = savedIds.join(", ");
|
|
53201
53866
|
try {
|
|
53202
53867
|
const partialState = {
|
|
53203
|
-
version:
|
|
53868
|
+
version: 15,
|
|
53204
53869
|
region: engine.stackRegion,
|
|
53205
53870
|
stackName: currentState.stackName,
|
|
53206
53871
|
resources: newResources,
|
|
@@ -53317,9 +53982,10 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53317
53982
|
settle
|
|
53318
53983
|
});
|
|
53319
53984
|
let succeeded = false;
|
|
53985
|
+
const createdSink = new CreatedResourceSink(logicalId, change.resourceType);
|
|
53320
53986
|
try {
|
|
53321
53987
|
try {
|
|
53322
|
-
await timePhase(phaseScope, `resource ${change.changeType.toLowerCase()}`, () => provisionResource(engine, logicalId, change, newResources, stackName, template, parameterValues, conditions, actualCounts, progress), `${logicalId} ${change.resourceType}`);
|
|
53988
|
+
await timePhase(phaseScope, `resource ${change.changeType.toLowerCase()}`, () => collectCreatedResources(createdSink, () => provisionResource(engine, logicalId, change, newResources, stackName, template, parameterValues, conditions, actualCounts, progress)), `${logicalId} ${change.resourceType}`);
|
|
53323
53989
|
settledUpdates.add(logicalId);
|
|
53324
53990
|
succeeded = true;
|
|
53325
53991
|
} finally {
|
|
@@ -53334,10 +54000,11 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53334
54000
|
const attemptedGeneration = change.changeType === "UPDATE" && !refused && !isReplacementNameRefusal(provisionError, logicalId) ? engine.replacementRun.attemptedNameGeneration.get(logicalId) : void 0;
|
|
53335
54001
|
const statePhysicalId = newResources[logicalId]?.physicalId ?? previousState?.physicalId;
|
|
53336
54002
|
if (refused && change.changeType === "CREATE" && statePhysicalId === void 0) throw provisionError;
|
|
53337
|
-
const
|
|
54003
|
+
const markedCreatedId = createdBeforeFailure(provisionError, logicalId, change.resourceType);
|
|
54004
|
+
const createdId = change.changeType === "CREATE" && statePhysicalId === void 0 ? markedCreatedId : void 0;
|
|
53338
54005
|
const heldRecord = newResources[logicalId] ?? previousState;
|
|
53339
54006
|
const replaced = change.changeType === "UPDATE" && !NO_REPLACEMENT_ORPHAN_TYPES.has(change.resourceType) && statePhysicalId !== void 0 && statePhysicalId !== "" && heldRecord?.physicalId === statePhysicalId ? heldRecord : void 0;
|
|
53340
|
-
const replacementCreatedId = replaced ?
|
|
54007
|
+
const replacementCreatedId = replaced ? markedCreatedId : void 0;
|
|
53341
54008
|
const orphanedBy = replaced !== void 0 && replacementCreatedId !== void 0 && replacementCreatedId !== replaced.physicalId ? {
|
|
53342
54009
|
record: replaced,
|
|
53343
54010
|
createdId: replacementCreatedId
|
|
@@ -53373,34 +54040,17 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53373
54040
|
if (attemptedGeneration !== void 0 && heldNow !== void 0) newResources[logicalId] = withNameGenerationReached(heldNow, logicalId, attemptedGeneration);
|
|
53374
54041
|
let replacementOrphanOp;
|
|
53375
54042
|
if (orphanedBy !== void 0) {
|
|
53376
|
-
replacementOrphanOp =
|
|
53377
|
-
logicalId,
|
|
53378
|
-
changeType: "CREATE",
|
|
53379
|
-
resourceType: change.resourceType,
|
|
53380
|
-
provisionedBy: "sdk",
|
|
53381
|
-
physicalId: orphanedBy.createdId,
|
|
53382
|
-
physicalIdRecoveredFromError: true,
|
|
53383
|
-
deletionPolicy: journaledOrphanPolicy(extractTemplateAttributes(template, logicalId).deletionPolicy),
|
|
53384
|
-
replacedPhysicalId: orphanedBy.record.physicalId,
|
|
53385
|
-
replacedResourceType: orphanedBy.record.resourceType,
|
|
53386
|
-
...engine.replacementRun.oldDeletedBeforeCreate.has(logicalId) && { replacedResourceDeleted: true },
|
|
53387
|
-
...!refused && { attemptedProperties: engine.attemptedResolvedProps.get(logicalId) }
|
|
53388
|
-
};
|
|
54043
|
+
replacementOrphanOp = replacementOrphanOpFor(engine, template, logicalId, change.resourceType, orphanedBy.record, orphanedBy.createdId, refused);
|
|
53389
54044
|
failedOperations.push(replacementOrphanOp);
|
|
53390
54045
|
}
|
|
54046
|
+
if (markedCreatedId === void 0 && (change.changeType === "CREATE" && statePhysicalId === void 0 || replaced !== void 0) && deadlineFiredFor(provisionError, logicalId)) reportedCreatesToSettle.push({
|
|
54047
|
+
sink: createdSink,
|
|
54048
|
+
failedOp,
|
|
54049
|
+
...replaced !== void 0 && { replaced },
|
|
54050
|
+
refused
|
|
54051
|
+
});
|
|
53391
54052
|
const orphanOp = createdId !== void 0 ? failedOp : replacementOrphanOp;
|
|
53392
|
-
if (orphanOp
|
|
53393
|
-
const markedIdentity = createdResourceIdentityBeforeFailure(provisionError, logicalId, change.resourceType);
|
|
53394
|
-
if (markedIdentity !== void 0) orphanOp.createdResourceIdentity = markedIdentity;
|
|
53395
|
-
else if (engine.interruptCause !== "user") {
|
|
53396
|
-
const identity = await readResourceIdentity(engine.providerRegistry, {
|
|
53397
|
-
resourceType: orphanOp.resourceType,
|
|
53398
|
-
physicalId: orphanOp.physicalId,
|
|
53399
|
-
provisionedBy: orphanOp.provisionedBy
|
|
53400
|
-
}, engine.stackRegion);
|
|
53401
|
-
if (typeof identity === "string") orphanOp.createdResourceIdentity = identity;
|
|
53402
|
-
}
|
|
53403
|
-
}
|
|
54053
|
+
if (orphanOp !== void 0) await journalOrphanIdentity(engine, orphanOp, createdResourceIdentityBeforeFailure(provisionError, logicalId, change.resourceType));
|
|
53404
54054
|
throw provisionError;
|
|
53405
54055
|
}
|
|
53406
54056
|
completedOperations.push({
|
|
@@ -53551,9 +54201,10 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53551
54201
|
engine.logger.warn(safeMsg` ⚠ ${lost.logicalId} (${childType}) was removed from a resource this deploy re-created under the same id, and the deploy failed before writing it again: the next deploy writes it there again (its record keeps only the holders it is still on).`.concat(mayStillBeLive));
|
|
53552
54202
|
}
|
|
53553
54203
|
}
|
|
54204
|
+
await settleReportedCreates(engine, template, failedOperations, reportedCreatesToSettle);
|
|
53554
54205
|
try {
|
|
53555
54206
|
const preRollbackState = {
|
|
53556
|
-
version:
|
|
54207
|
+
version: 15,
|
|
53557
54208
|
region: engine.stackRegion,
|
|
53558
54209
|
stackName: currentState.stackName,
|
|
53559
54210
|
resources: newResources,
|
|
@@ -53594,7 +54245,15 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53594
54245
|
engine.logger.warn(safeMsg`Partial state has been saved. ${recoveryHint(engine.rollbackDeps(), "Run 'cdkd deploy' to resume, 'cdkd rollback' to revert, or destroy to clean up.")}`);
|
|
53595
54246
|
} else {
|
|
53596
54247
|
autoRollbackJournaled = await writeRollbackJournalSegment(engine.rollbackDeps(), stackName, completedOperations, failedOperations, "auto-rollback-started", initialDeploy);
|
|
53597
|
-
const rollbackResult = await performRollback(engine.rollbackDeps(), completedOperations, newResources, stackName, currentState, failedOperations, currentState.orphans ?? []
|
|
54248
|
+
const rollbackResult = await performRollback(engine.rollbackDeps(), completedOperations, newResources, stackName, currentState, failedOperations, currentState.orphans ?? [], {
|
|
54249
|
+
runMarks: (logicalId) => ({
|
|
54250
|
+
names: engine.unsettledMarks.get(logicalId) ?? /* @__PURE__ */ new Set(),
|
|
54251
|
+
items: engine.unsettledItemMarks.get(logicalId) ?? /* @__PURE__ */ new Map()
|
|
54252
|
+
}),
|
|
54253
|
+
stillRunning: (logicalId) => engine.inFlightBodies.get(logicalId),
|
|
54254
|
+
recordMarks: (logicalId) => recordUnsettledMarks(engine, newResources, logicalId),
|
|
54255
|
+
onReverted: (logicalId, settled) => dropUnsettledMarks(engine, logicalId, settled)
|
|
54256
|
+
});
|
|
53598
54257
|
autoRollbackClean = autoRollbackJournaled && rollbackResult.failures === 0 && rollbackResult.skipped === 0 && !rollbackResult.interrupted;
|
|
53599
54258
|
if (rollbackResult.interrupted && rollbackResult.failures === 0 && rollbackResult.skipped === 0) {
|
|
53600
54259
|
const remedy = autoRollbackJournaled ? recoveryHint(engine.rollbackDeps(), "The rollback journal keeps them; finish the rollback with: " + pasteableCommand("cdkd rollback", [{
|
|
@@ -53619,7 +54278,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53619
54278
|
recordUnsettledMarks(engine, newResources);
|
|
53620
54279
|
try {
|
|
53621
54280
|
const postRollbackState = {
|
|
53622
|
-
version:
|
|
54281
|
+
version: 15,
|
|
53623
54282
|
region: engine.stackRegion,
|
|
53624
54283
|
stackName: currentState.stackName,
|
|
53625
54284
|
resources: newResources,
|
|
@@ -53642,7 +54301,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53642
54301
|
const freshEtag = (await engine.stateBackend.getState(stackName, engine.stackRegion))?.etag;
|
|
53643
54302
|
recordUnsettledMarks(engine, newResources);
|
|
53644
54303
|
const postRollbackState = {
|
|
53645
|
-
version:
|
|
54304
|
+
version: 15,
|
|
53646
54305
|
region: engine.stackRegion,
|
|
53647
54306
|
stackName: currentState.stackName,
|
|
53648
54307
|
resources: newResources,
|
|
@@ -53679,7 +54338,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53679
54338
|
}
|
|
53680
54339
|
return {
|
|
53681
54340
|
state: {
|
|
53682
|
-
version:
|
|
54341
|
+
version: 15,
|
|
53683
54342
|
region: engine.stackRegion,
|
|
53684
54343
|
stackName: currentState.stackName,
|
|
53685
54344
|
resources: newResources,
|
|
@@ -53698,7 +54357,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
53698
54357
|
}
|
|
53699
54358
|
async function persistStateAfterOutputFailure(engine, stackName, currentState, newResources, currentEtag, pendingMigration) {
|
|
53700
54359
|
const buildState = () => ({
|
|
53701
|
-
version:
|
|
54360
|
+
version: 15,
|
|
53702
54361
|
region: engine.stackRegion,
|
|
53703
54362
|
stackName: currentState.stackName,
|
|
53704
54363
|
resources: newResources,
|
|
@@ -53737,6 +54396,73 @@ function recordUnsettledMarks(engine, newResources, only) {
|
|
|
53737
54396
|
if (only !== void 0 && logicalId !== only) continue;
|
|
53738
54397
|
if (marks.size === 0 || !Object.hasOwn(newResources, logicalId)) continue;
|
|
53739
54398
|
newResources[logicalId] = withUnsettledProperties(newResources[logicalId], marks);
|
|
54399
|
+
const items = engine.unsettledItemMarks.get(logicalId);
|
|
54400
|
+
if (items !== void 0 && items.size > 0) newResources[logicalId] = withUnsettledItems(newResources[logicalId], items);
|
|
54401
|
+
}
|
|
54402
|
+
}
|
|
54403
|
+
function dropUnsettledMarks(engine, logicalId, names) {
|
|
54404
|
+
const marks = engine.unsettledMarks.get(logicalId);
|
|
54405
|
+
if (marks !== void 0) for (const name of names) marks.delete(name);
|
|
54406
|
+
const items = engine.unsettledItemMarks.get(logicalId);
|
|
54407
|
+
if (items !== void 0) {
|
|
54408
|
+
for (const path of [...items.keys()]) if (names.has(unsettledItemsTopKey(path))) items.delete(path);
|
|
54409
|
+
}
|
|
54410
|
+
}
|
|
54411
|
+
function deadlineFiredFor(error, logicalId) {
|
|
54412
|
+
try {
|
|
54413
|
+
let current = error;
|
|
54414
|
+
for (let depth = 0; depth < 5 && typeof current === "object" && current !== null; depth++) {
|
|
54415
|
+
if (current instanceof ResourceTimeoutError) return current.logicalId === logicalId;
|
|
54416
|
+
current = current.cause;
|
|
54417
|
+
}
|
|
54418
|
+
} catch {}
|
|
54419
|
+
return false;
|
|
54420
|
+
}
|
|
54421
|
+
async function settleReportedCreates(engine, template, failedOperations, pending) {
|
|
54422
|
+
for (const { sink, failedOp, replaced, refused } of pending) {
|
|
54423
|
+
const report = sink.report;
|
|
54424
|
+
if (report === void 0) continue;
|
|
54425
|
+
let orphanOp;
|
|
54426
|
+
if (replaced === void 0) {
|
|
54427
|
+
failedOp.provisionedBy = "sdk";
|
|
54428
|
+
failedOp.physicalId = report.physicalId;
|
|
54429
|
+
failedOp.physicalIdRecoveredFromError = true;
|
|
54430
|
+
failedOp.deletionPolicy = journaledOrphanPolicy(extractTemplateAttributes(template, failedOp.logicalId).deletionPolicy);
|
|
54431
|
+
orphanOp = failedOp;
|
|
54432
|
+
} else {
|
|
54433
|
+
if (report.physicalId === replaced.physicalId) continue;
|
|
54434
|
+
failedOp.replacementOrphaned = engine.replacementRun.oldDeletedBeforeCreate.has(failedOp.logicalId) ? "delete-first" : "create-first";
|
|
54435
|
+
orphanOp = replacementOrphanOpFor(engine, template, failedOp.logicalId, failedOp.resourceType, replaced, report.physicalId, refused);
|
|
54436
|
+
failedOperations.push(orphanOp);
|
|
54437
|
+
}
|
|
54438
|
+
await journalOrphanIdentity(engine, orphanOp, report.createdResourceIdentity);
|
|
54439
|
+
}
|
|
54440
|
+
}
|
|
54441
|
+
function replacementOrphanOpFor(engine, template, logicalId, resourceType, record, createdId, refused) {
|
|
54442
|
+
return {
|
|
54443
|
+
logicalId,
|
|
54444
|
+
changeType: "CREATE",
|
|
54445
|
+
resourceType,
|
|
54446
|
+
provisionedBy: "sdk",
|
|
54447
|
+
physicalId: createdId,
|
|
54448
|
+
physicalIdRecoveredFromError: true,
|
|
54449
|
+
deletionPolicy: journaledOrphanPolicy(extractTemplateAttributes(template, logicalId).deletionPolicy),
|
|
54450
|
+
replacedPhysicalId: record.physicalId,
|
|
54451
|
+
replacedResourceType: record.resourceType,
|
|
54452
|
+
...engine.replacementRun.oldDeletedBeforeCreate.has(logicalId) && { replacedResourceDeleted: true },
|
|
54453
|
+
...!refused && { attemptedProperties: engine.attemptedResolvedProps.get(logicalId) }
|
|
54454
|
+
};
|
|
54455
|
+
}
|
|
54456
|
+
async function journalOrphanIdentity(engine, orphanOp, carried) {
|
|
54457
|
+
if (orphanOp.physicalId === void 0 || orphanOp.deletionPolicy === "Retain" || !orphanNeedsIdentity(orphanOp)) return;
|
|
54458
|
+
if (carried !== void 0) orphanOp.createdResourceIdentity = carried;
|
|
54459
|
+
else if (engine.interruptCause !== "user") {
|
|
54460
|
+
const identity = await readResourceIdentity(engine.providerRegistry, {
|
|
54461
|
+
resourceType: orphanOp.resourceType,
|
|
54462
|
+
physicalId: orphanOp.physicalId,
|
|
54463
|
+
provisionedBy: orphanOp.provisionedBy
|
|
54464
|
+
}, engine.stackRegion);
|
|
54465
|
+
if (typeof identity === "string") orphanOp.createdResourceIdentity = identity;
|
|
53740
54466
|
}
|
|
53741
54467
|
}
|
|
53742
54468
|
|
|
@@ -53780,7 +54506,7 @@ async function doDeployWithPrefetch(engine, stackName, template, createOnlyPrefe
|
|
|
53780
54506
|
clock.lap("state load");
|
|
53781
54507
|
noteDeployStateRecord(currentStateData?.state !== void 0);
|
|
53782
54508
|
const currentState = currentStateData?.state ?? {
|
|
53783
|
-
version:
|
|
54509
|
+
version: 15,
|
|
53784
54510
|
region: engine.stackRegion,
|
|
53785
54511
|
stackName,
|
|
53786
54512
|
resources: {},
|
|
@@ -54083,7 +54809,7 @@ async function doDeployWithPrefetch(engine, stackName, template, createOnlyPrefe
|
|
|
54083
54809
|
await resolveStackInstanceId();
|
|
54084
54810
|
try {
|
|
54085
54811
|
const refreshedState = {
|
|
54086
|
-
version:
|
|
54812
|
+
version: 15,
|
|
54087
54813
|
region: engine.stackRegion,
|
|
54088
54814
|
stackName: currentState.stackName,
|
|
54089
54815
|
resources: currentState.resources,
|
|
@@ -54372,6 +55098,8 @@ var DeployEngine = class {
|
|
|
54372
55098
|
outputsRun = new OutputsRunState();
|
|
54373
55099
|
attemptedResolvedProps = /* @__PURE__ */ new Map();
|
|
54374
55100
|
unsettledMarks = /* @__PURE__ */ new Map();
|
|
55101
|
+
unsettledItemMarks = /* @__PURE__ */ new Map();
|
|
55102
|
+
inFlightBodies = /* @__PURE__ */ new Map();
|
|
54375
55103
|
resumedCreates = /* @__PURE__ */ new Map();
|
|
54376
55104
|
generatedNameGuard;
|
|
54377
55105
|
liveTaskLabels = /* @__PURE__ */ new Map();
|
|
@@ -54565,6 +55293,7 @@ var DeployEngine = class {
|
|
|
54565
55293
|
this.replacementRun = new ReplacementRunState();
|
|
54566
55294
|
this.attemptedResolvedProps = /* @__PURE__ */ new Map();
|
|
54567
55295
|
this.unsettledMarks = /* @__PURE__ */ new Map();
|
|
55296
|
+
this.unsettledItemMarks = /* @__PURE__ */ new Map();
|
|
54568
55297
|
this.resumedCreates = /* @__PURE__ */ new Map();
|
|
54569
55298
|
this.generatedNameGuard = void 0;
|
|
54570
55299
|
this.liveTaskLabels = /* @__PURE__ */ new Map();
|
|
@@ -54769,5 +55498,5 @@ function sameGenerationClaimsOf(record) {
|
|
|
54769
55498
|
}
|
|
54770
55499
|
|
|
54771
55500
|
//#endregion
|
|
54772
|
-
export { computeImplicitDeleteEdges as $, coerceParameterTypedValue as $a, DYNAMIC_REFERENCE_TOKEN_SCAN as $c, applyCustomResourceResponseExpiration as $i, stringifyValue as $l, WITHHELD_NAME_DISPLAY as $n, refuseMalformedOrphanRecords as $o, noEchoExactEchoLeavesOf as $r, readConfigString as $s, lookupEachName as $t, MIGRATE_TMP_PREFIX as $u, beginDeleteWait as A, s3BucketRegionalDomainName as Aa, valueAtCoordinate as Ac, isRefusedByName as Ai, isAccessDenied$1 as Al, resolveReplacementOldType as An, isReadableResourceEntry as Ao, awaitInFlightSibling as Ar, withheldAccountClause as As, displacedOpClause as At, redactedDockerCause as Au, waitForIndexesSettled as B, assertFlagRoleArn as Ba, logOnlyValueCount as Bc, stringifyIfAssigned as Bi, hasUnverifiableParameterRefusal as Bl, updatePartialMessage as Bn, malformedOrphansRefusalMessage as Bo, yellow as Br, isStatefulRecreateTargetForReplace as Bs, getCurrentNestedStackContext as Bt, loadCdkJson as Bu, planContributorInsightsOp as C, withoutUnsettledProperties as Ca, noEchoCoordinatesOf as Cc, resolveAssemblyPath as Cd, ledgerForStack as Ci, isLockInfoExpired as Cl, isJournaledOrphan as Cn, accountArgs as Co, rollbackOrphanIds as Cr, repairMalformedOutputsForReadOnly as Cs, makeSiblingClaimReader as Ct, formatDockerLoginError as Cu, reverseMapTableContributorInsights as D, s3BucketArn as Da, readbackPathFor as Dc, resolveBucketRegion as Dd, DeploymentEventsReader as Di, CrossPrefixScanCache as Dl, recheckFailedPlan as Dn, hasReadableOutputs as Do, mappingPairs as Dr, unpreviewableOrphanRecords as Ds, keptForRetainedRecord as Dt, partitionSensitiveEnv as Du, reverseMapIndexContributorInsights as E, isSettledInstanceState as Ea, passedNoEchoParametersOf as Ec, clearBucketRegionCache as Ed, acquireIdempotencyToken as Ei, CrossPrefixReadError as El, planRollback as En, hasReadableOrphans as Eo, looselyEqual as Er, repairMalformedResourcesForReadOnly as Es, resolvePendingCloudControlRequests as Et, isMalformedEnvKey as Eu, DELETE_INDEX_WAIT_PROCEED_NOTE as F, keepHeldTokenProvenance as Fa, snapshotPassProvenance as Fc, readTagList as Fi, acceptedCreateOnlyDropsOf as Fl, inheritProducerRegions as Fn, malformedLocalResourceEntriesWarning as Fo, bold as Fr, NO_CC_HANDLERS_REASON as Fs, recordDisplacedSkips as Ft, getDockerImageBySourceHash as Fu, sendTtlWaitingOutRateLimit as G, AWS_CREDENTIAL_ENV_KEYS as Ga, unionOfSecretBags as Gc, wouldReturnToSdkProvider as Gi, orphansCarriedFrom as Gl, retiredAfterRollback as Gn, malformedResourceEntriesWarning as Go, removeSuperseded as Gr, isWarmThroughputDecrease as Gs, isHandledOrphan as Gt, resolveStateBucketWithDefault as Gu, isTtlRateLimited as H, explicitRoleArnOrThrow as Ha, recordLogOnlyParameterValue as Hc, ProviderRegistry as Hi, importableOutputs as Hl, nameGenerationCarriedFrom as Hn, malformedOutputsRefusalMessage as Ho, deleteSupersededEntry as Hr, renderStatefulReason as Hs, deleteJournaledOrphans as Ht, resolveAutoAssetStorage as Hu, INDEX_SETTLE_POLL_INTERVAL_MS as I, outputReferenceProvenanceOf as Ia, carryLogOnlyValues as Ic, refuseMalformedDesiredTags as Ii, describeRegionValueKind as Il, REDACTED_DELETE_ADDRESS_SKIP_REASON as In, malformedLocalResourcesWarning as Io, cyan as Ir, hasNoCloudControlHandlers as Is, revertNestedChildFromJournal as It, Synthesizer as Iu, hasCdkAutoDeleteTag as J, envCredentialsAreAssumedRole as Ja, maskSecretsInError as Jc, readsNoEchoDeleteValues as Ji, PhaseClock as Jl, withNameGenerationReached as Jn, malformedScrubResourceEntriesRefusalMessage as Jo, supersededHolderOf as Jr, coerceCfnBoolean as Js, makeForeignHolderScan as Jt, stateBucketExistenceConfirmed as Ju, ECR_AUTO_DELETE_IMAGES_TAG as K, applyCallerIdentityCredentials as Ka, createSecretMasker as Kc, waitForLambdaFunctionActive as Ki, shouldRetainResource as Kl, retiredNameGenerationsAfter as Kn, malformedResourcePropertiesWarning as Ko, supersededAfterRollback as Kr, toCfnInteger as Ks, journaledOrphanLines as Kt, resolveStateBucketWithDefaultAndSource as Ku, deleteTableWithIndexBusyRetry as L, recordedOutputReferenceRegions as La, createUnionSecretMasker as Lc, tagMapAsList as Li, exportNamesCarriedFrom as Ll, isRedactedRecordedValue as Ln, malformedOrphanRecordsRefusalMessage as Lo, gray as Lr, findReplacedReadersOfRecreateTargets as Ls, revertedNestedRowIds as Lt, synthesisStatusMessage as Lu, deleteBudgetKey as M, resolveDynamicReferences as Ma, markSameGenerationBag as Mc, DBPROXY_TAGS_WHAT as Mi, stackInstanceIdOf as Ml, orphanNeedsIdentity as Mn, malformedExportNamesWarning as Mo, getStackRecords as Mr, findSilentDropProperties as Ms, dropSettledNestedJournals as Mt, runDockerStreaming as Mu, resolveDynamoDbDeleteBudgetClock as N, producerLookupOver as Na, redactForState as Nc, DBPROXY_TAG_OPTIONS as Ni, withStackInstanceIdWithheld as Nl, findNestedStackTypeChanges as Nn, malformedExportSourceWarning as No, withStackRecords as Nr, unwrittenCreateOnlyReplacement as Ns, getNestedRevertRun as Nt, warnFinchArgvExposure as Nu, stripIndexContributorInsights as O, s3BucketDomainName as Oa, readsNoEchoSource as Oc, DeploymentEventsStore as Oi, applyCrossPrefixScan as Ol, recordUnderIdIsNotOwn as On, hasReadableResources as Oo, parseMappingFile as Or, unreadableOrphanRecords as Os, recordRetainedForReadoption as Ot, redactDockerArgvValues as Ou, resolveDynamoDbDeleteBudgetMs as P, refuseUnreadableCdkCrossAccountRefs as Pa, recordReferenceProvenanceEntry as Pc, planTagDiff as Pi, splitImportedOps as Pl, getCurrentProducerRegions as Pn, malformedLocalOutputsWarning as Po, replacedDeleteFailureVerdict as Pr, withoutSilentDropProperties as Ps, nestedChildStackName as Pt, AssetManifestLoader as Pu, IMPLICIT_DELETE_DEPENDENCIES as Q, regionLessSecretName as Qa, withoutPhysicalNameCopies as Qc, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Qi, isSensitiveAttributeName as Ql, resourcesNamingDeclaredParameter as Qn, refuseMalformedNestedChildOutputs as Qo, noEchoComparisonForTemplate as Qr, configStringRefusal as Qs, isAccessDeniedError as Qt, CFN_TEMPLATE_URL_LIMIT as Qu, maskedLogger as R, recordedReferenceRegions as Ra, hasMaskableValues as Rc, tagPlanWarning as Ri, hasReadableExportSet as Rl, redactedDeleteAddressFields as Rn, malformedOrphanRecordsWarning as Ro, green as Rr, shownType as Rs, withNestedRevertRun as Rt, getDefaultStateBucketName as Ru, indexDeclaresContributorInsights as S, withUnsettledProperties as Sa, maskedLeafCoordinatesOf as Sc, renderAssemblyPathEscape as Sd, earliestDefined as Si, LockManager as Sl, demoteSupersededOrphans as Sn, UNREADABLE_RESOURCES_MAP_ROW as So, movedToHint as Sr, repairMalformedOrphansForReadOnly as Ss, makeCanonicalizePropertiesFn as St, finchSecretArgvRefusal as Su, readContributorInsightsSpec as T, poisonRenderedSpellingsCollidingIn as Ta, noEchoOutputsComparison as Tc, injectedAwsRegionValue as Td, withCreateTokenLedger as Ti, rebuildClientForBucketRegion as Tl, planFailedOps as Tn, displayLogicalId as To, isPairableType as Tr, repairMalformedResourcePropertiesForReadOnly as Ts, pendingRequestCount as Tt, isDockerClientEnvKey as Tu, planTimeToLive as U, isIamRoleArn as Ua, recordLogOnlyValue as Uc, ccBrokenReason as Ui, isReadableBag as Ul, nameGenerationHighWaterOf as Un, malformedOutputsWarning as Uo, holdsSupersededResources as Ur, WARM_THROUGHPUT_MEMBERS as Us, dropFailedCommands as Ut, resolveCaptureObservedState as Uu, isTtlAlreadyDisabled as V, assertSendableRoleArn as Va, printingCorpusOf as Vc, CC_BROKEN_REASON as Vi, importableOutputKeys as Vl, updatePartialReason as Vn, malformedOrphansWarning as Vo, addSuperseded as Vr, isStatefulRecreateTargetSync as Vs, withNestedStackContext as Vt, resolveApp as Vu, readTtlSpec as W, sendableAssumeRoleCommand as Wa, shareLogOnlyValues as Wc, isCustomResource as Wi, orphansAfterRollback as Wl, nameScopeOf as Wn, malformedRenderedContainersWarning as Wo, isSupersededResourceRecord as Wr, coerceWarmThroughput as Ws, dropFailedHint as Wt, resolveSkipPrefix as Wu, getPriorAttempts as X, classifyReplaySecretRegion as Xa, scrubResourceRecord as Xc, getCurrentResourceSecrets as Xi, timePhase as Xl, namesAnyDeclaredParameter as Xn, previewableOrphanRecords as Xo, withoutSuperseded as Xr, configBooleanRefusal as Xs, formatResourceLine as Xt, ssmResolvedValueType as Xu, isTruthyCfnBoolean as Y, classifyRecordedSecretRegion as Ya, maskSecretsInText as Yc, isCustomResourceType as Yi, renderPhaseTimings as Yl, computeParameterTaint as Yn, malformedStateRefusalMessage as Yo, supersededResourcesOf as Yr, coerceCfnInteger as Ys, sameJournaledOrphans as Yt, warnDeprecatedNoPrefixCliFlag as Yu, markRefusedBeforeApplying as Z, producerRegionsFromState as Za, withPhysicalNameCopies as Zc, withPrintingSecrets as Zi, AssetPublisher as Zl, reachableDivergentParameters as Zn, refuseDivergentRecordRegionForDestroy as Zo, noEchoAttributeNamesOf as Zr, configIntegerRefusal as Zs, chunks as Zt, CFN_TEMPLATE_BODY_LIMIT as Zu, streamMemberRefusals as _, reDisableInstanceApiTermination as _a, canonicalCoordinates as _c, nullPrototypeRecord as _d, createPreDeleteFinalSnapshot as _i, recordNoEchoParameterFreshValue as _l, withUnprovenUnsettled as _n, declaresNoEcho as _o, constructPathOf as _r, refuseMalformedResourcesForDeploy as _s, withResourceDeadline as _t, resolveDockerContextDirectory as _u, isProtectionValueActive as a, RollbackInlinePolicyWriters as aa, templateResourceTypes as ac, PARTITION_TABLE as ad, namingSecretsWithRecordedNoEcho as ai, inheritNestedStackParameterAssociations as al, refuseRefactorMarker as an, carriesFetchableDynamicReference as ao, carriedExportAliasExposure as ar, refuseMalformedOutputsForDestroy as as, childTemplateLoader as at, AssetModeResolver as au, CONTRIBUTOR_INSIGHTS_KEY as b, INTRINSIC_KEYS as ba, maskReadbackAtCoordinates as bc, describeFileReadFailure as bd, refusesFinalSnapshot as bi, WHOLE_DYNAMIC_REFERENCE_PATTERN as bl, equalModuloMask as bn, STATE_RESOURCES_MALFORMED as bo, findRefactorHints as br, refuseMalformedState as bs, keptWholeReasonText as bt, describeDockerFailure as bu, DynamoDBGlobalTableProvider as c, deleteLeftInPlace as ca, blockDeviceMappingsDifferOnlyInDeleteOnTermination as cc, AssemblyReader as cd, secretNamePrintingBags as ci, physicalNameCopiesOf as cl, hasPendingMovesOut as cn, AWS_NO_VALUE as co, isWholeDynamicReferenceValue as cr, refuseMalformedResourceEntriesForDeploy as cs, listNestedTemplateRows as ct, ensureAssetStorage as cu, declaredStreamPolicyMember as d, isWaitAbandonedError as da, emrClusterInstancesReplaced as dc, describeJsonParseFailure as dd, stateSecretNameNeedles as di, splitGetAttStringForm as dl, refusePendingMovesOut as dn, lacksRecordedTableArn as do, collectPublishedOutputNames as dr, refuseMalformedResourceEntriesForImportSave as ds, conditionFingerprint as dt, parseBootstrapMarker as du, customResourceResponseExpirationWarning as ea, replayWarn as ec, findLargeInlineResources as ed, noEchoParameterNamesOf as ei, dynamicReferenceTokens as el, withApiLimit as en, isUnboundTemplateParameter as eo, displayTextOrWithheld as er, refuseMalformedOrphanRecordsForDestroy as es, crossStackOutputProvenanceSource as et, WorkGraph as eu, declaredStreamTagsMember as f, markWaitAbandoned as fa, canonicalLambdaFunctionName as fc, parseFailureDebugDetail as fd, storedSecretNameNeedles as fi, carriesSecretMask as fl, replayFailedOperations as fn, refStateLookupFromResource as fo, isExportAliasCollision as fr, refuseMalformedResourceEntriesForOrphan as fs, conditionInputsFrom as ft, readBootstrapMarkerBody as fu, streamDeclaresTags as g, observeThenDisableInstanceApiTermination as ga, TemplateParser as gc, hasPlainPrototype$1 as gd, ccRoutedFinalSnapshotError as gi, recordNoEchoAttributeValues as gl, settleUnsettledPrevious as gn, passedParameterClassesOf as go, maskingRetryLogger as gr, refuseMalformedResourcePropertiesForOrphan as gs, enclosingDeadlineRemainingMs as gt, buildDockerImage as gu, streamDeclaresPolicy as h, isTerminationProtectionPropagationError as ha, DagBuilder as hc, hasOwnKey as hd, buildFinalSnapshotIdentifier as hi, recordMaskOnlyValuesIn as hl, recordAfterRollbackUpdate as hn, parameterInputsFor as ho, DEFAULT_RESOURCE_WARN_AFTER_MS as hr, refuseMalformedResourcePropertiesForExport as hs, enclosingDeadlineExpired as ht, buildDenyExternalAccessPolicy as hu, PROTECTION_PROPERTY_BY_TYPE as i, unchangedBehindSecretReference as ia, prefetchCreateOnlyPropertyPaths as ic, expectedOwnerParam as id, maskEventTextWithBoundBags as ii, identityKeyFor as il, refactorMarkerRefusalMessage as in, carriesDynamicReference as io, secretSafeKeyDisplay as ir, refuseMalformedOutputs as is, serviceTokenBlockingReason as it, rewriteTemplateAssetReferences as iu, compensateRemovedDeletionProtection as j, s3BucketWebsiteUrl as ja, liveMatchesUnresolvedTokenFrame as jc, markDeleteStarted as ji, isNotImplemented as jl, seedsDeleteFirstGuard as jn, malformedDriftResourcePropertiesWarning as jo, destroyStackRecordsView as jr, findActionableSilentDrops as js, displacedPhysicalIdShown as jt, runDockerForeground as ju, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as k, s3BucketDualStackDomainName as ka, recordedNoEchoValuesOf as kc, extractDeploymentEventError as ki, crossPrefixDeniedWarning as kl, replacementNeverSwapped as kn, isReadableOrphanRecord as ko, proposeRenames as kr, unreadableResourceEntries as ks, NESTED_PENDING_PARENT_REASON as kt, redactedCause as ku, STREAM_POLICY_KEY as l, deleteSkipReason as la, dbInstanceEngineChangeIsInPlace as lc, StageLoadError as ld, secretNamedAttributeNamesOf as li, recordAttributeIdCopy as ll, pendingMovesOutOf as ln, cfnRefValueFromPhysicalId as lo, noEchoParameterValueSeed as lr, refuseMalformedResourceEntriesForDestroy as ls, renderNestedTemplateTreeDefect as lt, getBootstrapMarkerKey as lu, reverseMapStreamPolicy as m, ec2InstanceProtectionSite as ma, sameLambdaFunctionAddress as mc, defineOwnKey as md, PRE_DELETE_SNAPSHOT_TYPES as mi, recordMaskOnlyValue as ml, removeProtectionTypeList as mn, withSharedDrainBudget as mo, DEFAULT_RESOURCE_TIMEOUT_MS as mr, refuseMalformedResourcePropertiesForDrift as ms, readRecordedConditionVerdicts as mt, validateContainerRepoName as mu, recordedProtectionEvidence as n, slowCcOperationTimeoutMs as na, requireConfigObject as nc, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as nd, completedReplayEntries as ni, pathCrossesDottedKey as nl, readRefactorMarkerOnce as nn, getAccountInfo as no, secretBearing as nr, refuseMalformedOrphansForDestroy as ns, deferredServiceTokenWarning as nt, createAssetRedirectResolver as nu, perType as o, UNSPECIFIED_SKIP_REASON as oa, describeTypeWithThrottleRetry as oc, canonicalizeRegion as od, orphanRecordsPrintingBag as oi, recordNestedStackParameterExpressions as ol, sameMove as on, isNamelessDynamicReferenceError as oo, exportNameNoEchoParameters as or, refuseMalformedResourceAttributesForOrphan as os, findNestedTemplateTreeDefect as ot, BOOTSTRAP_MARKER_PREFIX as ou, planStreamMemberOps as p, disableInstanceApiTermination as pa, lambdaFunctionNameForMask as pc, utf8ByteLength as pd, ATOMIC_FINAL_SNAPSHOT_TYPES as pi, provenPublicValue as pl, replayRollback as pn, parseWebACLArn as po, bindingSkippedOutputs as pr, refuseMalformedResourcePropertiesForDestroy as ps, parentSuppliedValues as pt, validateAssetBucketName as pu, S3_AUTO_DELETE_OBJECTS_TAG as q, callerEnvCredentials as qa, errorCauseChain as qc, TemplateNoEchoReresolver as qi, stackInstanceIdCarriedFrom as ql, retiredNameGenerationsLeaving as qn, malformedResourcesWarning as qo, supersededHeldByOtherTypeWarning as qr, toFiniteNumber as qs, loadJournaledOrphans as qt, resolveUseCdkBootstrapAssets as qu, recordedProtectionNote as r, onlySecretReferencesDiffer as ra, requireConfigString as rc, decodeListingKey as rd, journaledOrphanPrintingBag as ri, spelledKeysOf as rl, refactorMarkerMovesOf as rn, isImpossibleEmptyStoredAttribute as ro, secretBearingStateKeyWarning as rr, refuseMalformedOrphansForOrphan as rs, findServiceTokenRefusals as rt, loadPublishableAssetManifest as ru, readProtection as s, deleteIndeterminateGuards as sa, withRetry as sc, derivePartitionAndUrlSuffix as sd, secretNamePrintingBag as si, recoverMaskedOutput as sl, updateRefactorMarker as sn, keepsSecretReferenceToken as so, exportNameSecretExposure as sr, refuseMalformedResourceEntries as ss, isAbsoluteAssetPath as st, assertAssetBucketRegion as su, DeployEngine as t, CloudControlProvider as ta, requireConfigArray as tc, uploadCfnTemplate as td, createReadOnlyAttributeHealerFactory as ti, isUncertifiedBaselineMaskPosition as tl, readRefactorMarker as tn, parameterTypeMayLoseSecretIdentity as to, exportAliasCollisionScrubWarning as tr, refuseMalformedOrphans as ts, inheritedProvenanceForChildDiff as tt, buildAssetRedirectMap as tu, STREAM_TAGS_KEY as u, withIndeterminateGuard as ua, ecsServiceLaunchTypeSetOrChanged as uc, processStackMessages as ud, secretNamedRecordNeedles as ui, recordPhysicalNameCopy as ul, pendingMovesRefusalMessage as un, isStalePlaceholderArnAttribute as uo, collectDeclaredOutputNames as ur, refuseMalformedResourceEntriesForImport as us, templateIdentity as ut, isCrossRegionRedirect as uu, streamPolicyMatchesDeclared as v, reEnableInstanceApiTermination as va, isMarkedCoordinate as vc, ownValue as vd, effectiveDeletionPolicy as vi, recordProvenPublicExpression as vl, calculateResourceDrift as vn, JSON_LISTING_HOLE_VALUE as vo, findDestructiveChanges as vr, refuseMalformedResourcesForDestroy as vs, diffSecurity as vt, describeDockerCapturedOutput as vu, planIndexContributorInsightsOps as w, IntrinsicFunctionResolver as wa, noEchoLeavesOf as wc, injectAwsRegion as wd, reserveStackCreateToken as wi, S3StateBackend as wl, isReplacementOrphan as wn, deployRefusesOrphanRowsReason as wo, withMovedTo as wr, repairMalformedResourceEntriesForReadOnly as ws, planOrphanAdoption as wt, getDockerCmd as wu, contributorInsightsRefusals as x, unsettledPropertiesOf as xa, maskWholeValue as xc, displayAssemblyPath as xd, unsupportedFinalSnapshotError as xi, isSingleDynamicReferenceToken as xl, undeclaredEmptyObservedKeys as xn, UNREADABLE_ORPHANS_CONTAINER_ROW as xo, hintSidesOf as xr, repairMalformedOrphanRecordsForReadOnly as xs, mergeNoChangeOutputs as xt, dockerSpawnEnvWithSensitive as xu, streamTagsMatchDeclared as y, DiffCalculator as ya, maskAtCoordinates as yc, absoluteAssemblyPathEscape as yd, isFinalSnapshotError as yi, wholeStringLeavesOf as yl, equalModuloMarkedMask as yn, STATE_REGION_DIVERGED as yo, formatDestructiveChange as yr, refuseMalformedResourcesForExport as ys, isSecretBearingReferenceString as yt, describeDockerExecFailure as yu, relayedIndexBusyDelete as z, applyRoleArnIfSet as za, literalSplitDelimitersOf as zc, definedAttributes as zi, hasReasonlessBaselineRefusal as zl, redactedDeleteAddressSkip as zn, malformedOrphanRowsKeptWarning as zo, red as zr, MULTI_REGION_RECREATE_BLOCKED_TYPES as zs, collectNestedChildUnaddressed as zt, getLegacyStateBucketName as zu };
|
|
54773
|
-
//# sourceMappingURL=deploy-engine-
|
|
55501
|
+
export { getPriorAttempts as $, applyCallerIdentityCredentials as $a, unionOfSecretBags as $c, isCustomResourceType as $i, orphansCarriedFrom as $l, namesAnyDeclaredParameter as $n, malformedResourcePropertiesWarning as $o, withoutSuperseded as $r, isWarmThroughputDecrease as $s, formatResourceLine as $t, resolveStateBucketWithDefault as $u, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as A, withoutUnsettledProperties as Aa, maskedLeafCoordinatesOf as Ac, renderAssemblyPathEscape as Ad, acquireIdempotencyToken as Ai, LockManager as Al, recheckFailedPlan as An, accountArgs as Ao, mappingPairs as Ar, repairMalformedOutputsForReadOnly as As, keptForRetainedRecord as At, finchSecretArgvRefusal as Au, deleteTableWithIndexBusyRetry as B, producerLookupOver as Ba, markSameGenerationBag as Bc, refuseMalformedDesiredTags as Bi, stackInstanceIdOf as Bl, isRedactedRecordedValue as Bn, malformedExportSourceWarning as Bo, gray as Br, findSilentDropProperties as Bs, revertedNestedRowIds as Bt, runDockerStreaming as Bu, planContributorInsightsOp as C, DiffCalculator as Ca, DagBuilder as Cc, hasOwnKey as Cd, isFinalSnapshotError as Ci, recordMaskOnlyValuesIn as Cl, equalModuloMask as Cn, passedParameterClassesOf as Co, findRefactorHints as Cr, refuseMalformedResourcePropertiesForOrphan as Cs, keptWholeReasonText as Ct, buildDenyExternalAccessPolicy as Cu, reverseMapTableContributorInsights as D, unsettledItemsOf as Da, maskAtCoordinates as Dc, absoluteAssemblyPathEscape as Dd, ledgerForStack as Di, wholeStringLeavesOf as Dl, isReplacementOrphan as Dn, STATE_RESOURCES_MALFORMED as Do, withMovedTo as Dr, refuseMalformedState as Ds, planOrphanAdoption as Dt, describeDockerExecFailure as Du, reverseMapIndexContributorInsights as E, unsettledItemsField as Ea, isMarkedCoordinate as Ec, ownValue as Ed, earliestDefined as Ei, recordProvenPublicExpression as El, isJournaledOrphan as En, STATE_REGION_DIVERGED as Eo, rollbackOrphanIds as Er, refuseMalformedResourcesForExport as Es, makeSiblingClaimReader as Et, describeDockerCapturedOutput as Eu, resolveDynamoDbDeleteBudgetClock as F, s3BucketDomainName as Fa, readbackPathFor as Fc, resolveBucketRegion as Fd, markDeleteStarted as Fi, CrossPrefixScanCache as Fl, orphanNeedsIdentity as Fn, hasReadableResources as Fo, getStackRecords as Fr, unreadableOrphanRecords as Fs, dropSettledNestedJournals as Ft, partitionSensitiveEnv as Fu, isTtlRateLimited as G, recordedReferenceRegions as Ga, createUnionSecretMasker as Gc, CC_BROKEN_REASON as Gi, exportNamesCarriedFrom as Gl, nameGenerationCarriedFrom as Gn, malformedOrphanRecordsWarning as Go, deleteSupersededEntry as Gr, findReplacedReadersOfRecreateTargets as Gs, deleteJournaledOrphans as Gt, synthesisStatusMessage as Gu, relayedIndexBusyDelete as H, keepHeldTokenProvenance as Ha, recordReferenceProvenanceEntry as Hc, tagPlanWarning as Hi, splitImportedOps as Hl, redactedDeleteAddressSkip as Hn, malformedLocalResourceEntriesWarning as Ho, red as Hr, withoutSilentDropProperties as Hs, collectNestedChildUnaddressed as Ht, AssetManifestLoader as Hu, resolveDynamoDbDeleteBudgetMs as I, s3BucketDualStackDomainName as Ia, readsNoEchoSource as Ic, DBPROXY_TAGS_WHAT as Ii, applyCrossPrefixScan as Il, findNestedStackTypeChanges as In, isReadableOrphanRecord as Io, withStackRecords as Ir, unreadableResourceEntries as Is, getNestedRevertRun as It, redactDockerArgvValues as Iu, sendTtlWaitingOutRateLimit as J, assertSendableRoleArn as Ja, logOnlyValueCount as Jc, isCustomResource as Ji, hasUnverifiableParameterRefusal as Jl, retiredAfterRollback as Jn, malformedOrphansWarning as Jo, removeSuperseded as Jr, isStatefulRecreateTargetForReplace as Js, isHandledOrphan as Jt, loadCdkJson as Ju, planTimeToLive as K, applyRoleArnIfSet as Ka, hasMaskableValues as Kc, ProviderRegistry as Ki, hasReadableExportSet as Kl, nameGenerationHighWaterOf as Kn, malformedOrphanRowsKeptWarning as Ko, holdsSupersededResources as Kr, shownType as Ks, dropFailedCommands as Kt, getDefaultStateBucketName as Ku, DELETE_INDEX_WAIT_PROCEED_NOTE as L, s3BucketRegionalDomainName as La, recordedNoEchoValuesOf as Lc, DBPROXY_TAG_OPTIONS as Li, crossPrefixDeniedWarning as Ll, getCurrentProducerRegions as Ln, isReadableResourceEntry as Lo, replacedDeleteFailureVerdict as Lr, withheldAccountClause as Ls, nestedChildStackName as Lt, redactedCause as Lu, beginDeleteWait as M, poisonRenderedSpellingsCollidingIn as Ma, noEchoLeavesOf as Mc, injectAwsRegion as Md, DeploymentEventsStore as Mi, S3StateBackend as Ml, replacementNeverSwapped as Mn, displayLogicalId as Mo, proposeRenames as Mr, repairMalformedResourcePropertiesForReadOnly as Ms, NESTED_PENDING_PARENT_REASON as Mt, getDockerCmd as Mu, compensateRemovedDeletionProtection as N, isSettledInstanceState as Na, noEchoOutputsComparison as Nc, injectedAwsRegionValue as Nd, extractDeploymentEventError as Ni, rebuildClientForBucketRegion as Nl, resolveReplacementOldType as Nn, hasReadableOrphans as No, awaitInFlightSibling as Nr, repairMalformedResourcesForReadOnly as Ns, displacedOpClause as Nt, isDockerClientEnvKey as Nu, stripIndexContributorInsights as O, unsettledPropertiesOf as Oa, maskReadbackAtCoordinates as Oc, describeFileReadFailure as Od, reserveStackCreateToken as Oi, WHOLE_DYNAMIC_REFERENCE_PATTERN as Ol, planFailedOps as On, UNREADABLE_ORPHANS_CONTAINER_ROW as Oo, isPairableType as Or, repairMalformedOrphanRecordsForReadOnly as Os, pendingRequestCount as Ot, describeDockerFailure as Ou, deleteBudgetKey as P, s3BucketArn as Pa, passedNoEchoParametersOf as Pc, clearBucketRegionCache as Pd, isRefusedByName as Pi, CrossPrefixReadError as Pl, seedsDeleteFirstGuard as Pn, hasReadableOutputs as Po, destroyStackRecordsView as Pr, unpreviewableOrphanRecords as Ps, displacedPhysicalIdShown as Pt, isMalformedEnvKey as Pu, isTruthyCfnBoolean as Q, AWS_CREDENTIAL_ENV_KEYS as Qa, shareLogOnlyValues as Qc, readsNoEchoDeleteValues as Qi, orphansAfterRollback as Ql, computeParameterTaint as Qn, malformedResourceEntriesWarning as Qo, supersededResourcesOf as Qr, coerceWarmThroughput as Qs, sameJournaledOrphans as Qt, resolveSkipPrefix as Qu, INDEX_SETTLE_POLL_INTERVAL_MS as R, s3BucketWebsiteUrl as Ra, valueAtCoordinate as Rc, planTagDiff as Ri, isAccessDenied$1 as Rl, inheritProducerRegions as Rn, malformedDriftResourcePropertiesWarning as Ro, bold as Rr, findActionableSilentDrops as Rs, recordDisplacedSkips as Rt, redactedDockerCause as Ru, indexDeclaresContributorInsights as S, reEnableInstanceApiTermination as Sa, sameLambdaFunctionAddress as Sc, defineOwnKey as Sd, effectiveDeletionPolicy as Si, recordMaskOnlyValue as Sl, equalModuloMarkedMask as Sn, parameterInputsFor as So, formatDestructiveChange as Sr, refuseMalformedResourcePropertiesForExport as Ss, isSecretBearingReferenceString as St, validateContainerRepoName as Su, readContributorInsightsSpec as T, isUsableAttemptedName as Ta, canonicalCoordinates as Tc, nullPrototypeRecord as Td, unsupportedFinalSnapshotError as Ti, recordNoEchoParameterFreshValue as Tl, demoteSupersededOrphans as Tn, JSON_LISTING_HOLE_VALUE as To, movedToHint as Tr, refuseMalformedResourcesForDestroy as Ts, makeCanonicalizePropertiesFn as Tt, resolveDockerContextDirectory as Tu, waitForIndexesSettled as U, outputReferenceProvenanceOf as Ua, snapshotPassProvenance as Uc, definedAttributes as Ui, acceptedCreateOnlyDropsOf as Ul, updatePartialMessage as Un, malformedLocalResourcesWarning as Uo, yellow as Ur, NO_CC_HANDLERS_REASON as Us, getCurrentNestedStackContext as Ut, getDockerImageBySourceHash as Uu, maskedLogger as V, refuseUnreadableCdkCrossAccountRefs as Va, redactForState as Vc, tagMapAsList as Vi, withStackInstanceIdWithheld as Vl, redactedDeleteAddressFields as Vn, malformedLocalOutputsWarning as Vo, green as Vr, unwrittenCreateOnlyReplacement as Vs, withNestedRevertRun as Vt, warnFinchArgvExposure as Vu, isTtlAlreadyDisabled as W, recordedOutputReferenceRegions as Wa, carryLogOnlyValues as Wc, stringifyIfAssigned as Wi, describeRegionValueKind as Wl, updatePartialReason as Wn, malformedOrphanRecordsRefusalMessage as Wo, addSuperseded as Wr, hasNoCloudControlHandlers as Ws, withNestedStackContext as Wt, Synthesizer as Wu, S3_AUTO_DELETE_OBJECTS_TAG as X, isIamRoleArn as Xa, recordLogOnlyParameterValue as Xc, waitForLambdaFunctionActive as Xi, importableOutputs as Xl, retiredNameGenerationsLeaving as Xn, malformedOutputsWarning as Xo, supersededHeldByOtherTypeWarning as Xr, renderStatefulReason as Xs, loadJournaledOrphans as Xt, resolveAutoAssetStorage as Xu, ECR_AUTO_DELETE_IMAGES_TAG as Y, explicitRoleArnOrThrow as Ya, printingCorpusOf as Yc, wouldReturnToSdkProvider as Yi, importableOutputKeys as Yl, retiredNameGenerationsAfter as Yn, malformedOutputsRefusalMessage as Yo, supersededAfterRollback as Yr, isStatefulRecreateTargetSync as Ys, journaledOrphanLines as Yt, resolveApp as Yu, hasCdkAutoDeleteTag as Z, sendableAssumeRoleCommand as Za, recordLogOnlyValue as Zc, TemplateNoEchoReresolver as Zi, isReadableBag as Zl, withNameGenerationReached as Zn, malformedRenderedContainersWarning as Zo, supersededHolderOf as Zr, WARM_THROUGHPUT_MEMBERS as Zs, makeForeignHolderScan as Zt, resolveCaptureObservedState as Zu, streamMemberRefusals as _, disableInstanceApiTermination as _a, dbInstanceEngineChangeIsInPlace as _c, StageLoadError as _d, ATOMIC_FINAL_SNAPSHOT_TYPES as _i, recordAttributeIdCopy as _l, removeProtectionTypeList as _n, isStalePlaceholderArnAttribute as _o, DEFAULT_RESOURCE_TIMEOUT_MS as _r, refuseMalformedResourceEntriesForImport as _s, readRecordedConditionVerdicts as _t, getBootstrapMarkerKey as _u, isProtectionValueActive as a, CloudControlProvider as aa, configIntegerRefusal as ac, CFN_TEMPLATE_BODY_LIMIT as ad, createReadOnlyAttributeHealerFactory as ai, withPhysicalNameCopies as al, readRefactorMarkerOnce as an, regionLessSecretName as ao, secretBearing as ar, refuseMalformedNestedChildOutputs as as, deferredServiceTokenWarning as at, AssetPublisher as au, CONTRIBUTOR_INSIGHTS_KEY as b, observeThenDisableInstanceApiTermination as ba, canonicalLambdaFunctionName as bc, parseFailureDebugDetail as bd, ccRoutedFinalSnapshotError as bi, carriesSecretMask as bl, withUnprovenUnsettled as bn, parseWebACLArn as bo, constructPathOf as br, refuseMalformedResourcePropertiesForDestroy as bs, withResourceDeadline as bt, readBootstrapMarkerBody as bu, DynamoDBGlobalTableProvider as c, unchangedBehindSecretReference as ca, replayWarn as cc, findLargeInlineResources as cd, maskEventTextWithBoundBags as ci, dynamicReferenceTokens as cl, refuseRefactorMarker as cn, parameterTypeMayLoseSecretIdentity as co, carriedExportAliasExposure as cr, refuseMalformedOrphans as cs, childTemplateLoader as ct, WorkGraph as cu, declaredStreamPolicyMember as d, deleteIndeterminateGuards as da, requireConfigString as dc, decodeListingKey as dd, secretNamePrintingBag as di, spelledKeysOf as dl, hasPendingMovesOut as dn, carriesDynamicReference as do, isWholeDynamicReferenceValue as dr, refuseMalformedOutputs as ds, listNestedTemplateRows as dt, loadPublishableAssetManifest as du, getCurrentResourceSecrets as ea, toCfnInteger as ec, resolveStateBucketWithDefaultAndSource as ed, noEchoAttributeNamesOf as ei, createSecretMasker as el, chunks as en, callerEnvCredentials as eo, reachableDivergentParameters as er, malformedResourcesWarning as es, markRefusedBeforeApplying as et, shouldRetainResource as eu, declaredStreamTagsMember as f, deleteLeftInPlace as fa, prefetchCreateOnlyPropertyPaths as fc, expectedOwnerParam as fd, secretNamePrintingBags as fi, identityKeyFor as fl, pendingMovesOutOf as fn, carriesFetchableDynamicReference as fo, noEchoParameterValueSeed as fr, refuseMalformedOutputsForDestroy as fs, renderNestedTemplateTreeDefect as ft, rewriteTemplateAssetReferences as fu, streamDeclaresTags as g, markWaitAbandoned as ga, blockDeviceMappingsDifferOnlyInDeleteOnTermination as gc, AssemblyReader as gd, storedSecretNameNeedles as gi, physicalNameCopiesOf as gl, replayRollback as gn, cfnRefValueFromPhysicalId as go, bindingSkippedOutputs as gr, refuseMalformedResourceEntriesForDestroy as gs, parentSuppliedValues as gt, ensureAssetStorage as gu, streamDeclaresPolicy as h, isWaitAbandonedError as ha, withRetry as hc, derivePartitionAndUrlSuffix as hd, stateSecretNameNeedles as hi, recoverMaskedOutput as hl, replayFailedOperations as hn, AWS_NO_VALUE as ho, isExportAliasCollision as hr, refuseMalformedResourceEntriesForDeploy as hs, conditionInputsFrom as ht, assertAssetBucketRegion as hu, PROTECTION_PROPERTY_BY_TYPE as i, customResourceResponseExpirationWarning as ia, configBooleanRefusal as ic, ssmResolvedValueType as id, withAttemptedItemsMasked as ii, scrubResourceRecord as il, readRefactorMarker as in, producerRegionsFromState as io, exportAliasCollisionScrubWarning as ir, refuseDivergentRecordRegionForDestroy as is, inheritedProvenanceForChildDiff as it, timePhase as iu, DYNAMODB_DELETE_POLL_COST_MS as j, IntrinsicFunctionResolver as ja, noEchoCoordinatesOf as jc, resolveAssemblyPath as jd, DeploymentEventsReader as ji, isLockInfoExpired as jl, recordUnderIdIsNotOwn as jn, deployRefusesOrphanRowsReason as jo, parseMappingFile as jr, repairMalformedResourceEntriesForReadOnly as js, recordRetainedForReadoption as jt, formatDockerLoginError as ju, DYNAMODB_DELETE_DEADLINE_MARGIN_MS as k, withUnsettledProperties as ka, maskWholeValue as kc, displayAssemblyPath as kd, withCreateTokenLedger as ki, isSingleDynamicReferenceToken as kl, planRollback as kn, UNREADABLE_RESOURCES_MAP_ROW as ko, looselyEqual as kr, repairMalformedOrphansForReadOnly as ks, resolvePendingCloudControlRequests as kt, dockerSpawnEnvWithSensitive as ku, STREAM_POLICY_KEY as l, RollbackInlinePolicyWriters as la, requireConfigArray as lc, uploadCfnTemplate as ld, namingSecretsWithRecordedNoEcho as li, isUncertifiedBaselineMaskPosition as ll, sameMove as ln, getAccountInfo as lo, exportNameNoEchoParameters as lr, refuseMalformedOrphansForDestroy as ls, findNestedTemplateTreeDefect as lt, buildAssetRedirectMap as lu, reverseMapStreamPolicy as m, withIndeterminateGuard as ma, describeTypeWithThrottleRetry as mc, canonicalizeRegion as md, secretNamedRecordNeedles as mi, recordNestedStackParameterExpressions as ml, refusePendingMovesOut as mn, keepsSecretReferenceToken as mo, collectPublishedOutputNames as mr, refuseMalformedResourceEntries as ms, conditionFingerprint as mt, BOOTSTRAP_MARKER_PREFIX as mu, recordedProtectionEvidence as n, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as na, coerceCfnBoolean as nc, stateBucketExistenceConfirmed as nd, noEchoExactEchoLeavesOf as ni, maskSecretsInError as nl, lookupEachName as nn, classifyRecordedSecretRegion as no, WITHHELD_NAME_DISPLAY as nr, malformedStateRefusalMessage as ns, computeImplicitDeleteEdges as nt, PhaseClock as nu, perType as o, slowCcOperationTimeoutMs as oa, configStringRefusal as oc, CFN_TEMPLATE_URL_LIMIT as od, completedReplayEntries as oi, withoutPhysicalNameCopies as ol, refactorMarkerMovesOf as on, coerceParameterTypedValue as oo, secretBearingStateKeyWarning as or, refuseMalformedOrphanRecords as os, findServiceTokenRefusals as ot, isSensitiveAttributeName as ou, planStreamMemberOps as p, deleteSkipReason as pa, templateResourceTypes as pc, PARTITION_TABLE as pd, secretNamedAttributeNamesOf as pi, inheritNestedStackParameterAssociations as pl, pendingMovesRefusalMessage as pn, isNamelessDynamicReferenceError as po, collectDeclaredOutputNames as pr, refuseMalformedResourceAttributesForOrphan as ps, templateIdentity as pt, AssetModeResolver as pu, readTtlSpec as q, assertFlagRoleArn as qa, literalSplitDelimitersOf as qc, ccBrokenReason as qi, hasReasonlessBaselineRefusal as ql, nameScopeOf as qn, malformedOrphansRefusalMessage as qo, isSupersededResourceRecord as qr, MULTI_REGION_RECREATE_BLOCKED_TYPES as qs, dropFailedHint as qt, getLegacyStateBucketName as qu, recordedProtectionNote as r, applyCustomResourceResponseExpiration as ra, coerceCfnInteger as rc, warnDeprecatedNoPrefixCliFlag as rd, noEchoParameterNamesOf as ri, maskSecretsInText as rl, withApiLimit as rn, classifyReplaySecretRegion as ro, displayTextOrWithheld as rr, previewableOrphanRecords as rs, crossStackOutputProvenanceSource as rt, renderPhaseTimings as ru, readProtection as s, onlySecretReferencesDiffer as sa, readConfigString as sc, MIGRATE_TMP_PREFIX as sd, journaledOrphanPrintingBag as si, DYNAMIC_REFERENCE_TOKEN_SCAN as sl, refactorMarkerRefusalMessage as sn, isUnboundTemplateParameter as so, secretSafeKeyDisplay as sr, refuseMalformedOrphanRecordsForDestroy as ss, serviceTokenBlockingReason as st, stringifyValue as su, DeployEngine as t, withPrintingSecrets as ta, toFiniteNumber as tc, resolveUseCdkBootstrapAssets as td, noEchoComparisonForTemplate as ti, errorCauseChain as tl, isAccessDeniedError as tn, envCredentialsAreAssumedRole as to, resourcesNamingDeclaredParameter as tr, malformedScrubResourceEntriesRefusalMessage as ts, IMPLICIT_DELETE_DEPENDENCIES as tt, stackInstanceIdCarriedFrom as tu, STREAM_TAGS_KEY as u, UNSPECIFIED_SKIP_REASON as ua, requireConfigObject as uc, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as ud, orphanRecordsPrintingBag as ui, pathCrossesDottedKey as ul, updateRefactorMarker as un, isImpossibleEmptyStoredAttribute as uo, exportNameSecretExposure as ur, refuseMalformedOrphansForOrphan as us, isAbsoluteAssetPath as ut, createAssetRedirectResolver as uu, streamPolicyMatchesDeclared as v, ec2InstanceProtectionSite as va, ecsServiceLaunchTypeSetOrChanged as vc, processStackMessages as vd, PRE_DELETE_SNAPSHOT_TYPES as vi, recordPhysicalNameCopy as vl, recordAfterRollbackUpdate as vn, lacksRecordedTableArn as vo, DEFAULT_RESOURCE_WARN_AFTER_MS as vr, refuseMalformedResourceEntriesForImportSave as vs, enclosingDeadlineExpired as vt, isCrossRegionRedirect as vu, planIndexContributorInsightsOps as w, INTRINSIC_KEYS as wa, TemplateParser as wc, hasPlainPrototype$1 as wd, refusesFinalSnapshot as wi, recordNoEchoAttributeValues as wl, undeclaredEmptyObservedKeys as wn, declaresNoEcho as wo, hintSidesOf as wr, refuseMalformedResourcesForDeploy as ws, mergeNoChangeOutputs as wt, buildDockerImage as wu, contributorInsightsRefusals as x, reDisableInstanceApiTermination as xa, lambdaFunctionNameForMask as xc, utf8ByteLength as xd, createPreDeleteFinalSnapshot as xi, provenPublicValue as xl, calculateResourceDrift as xn, withSharedDrainBudget as xo, findDestructiveChanges as xr, refuseMalformedResourcePropertiesForDrift as xs, diffSecurity as xt, validateAssetBucketName as xu, streamTagsMatchDeclared as y, isTerminationProtectionPropagationError as ya, emrClusterInstancesReplaced as yc, describeJsonParseFailure as yd, buildFinalSnapshotIdentifier as yi, splitGetAttStringForm as yl, settleUnsettledPrevious as yn, refStateLookupFromResource as yo, maskingRetryLogger as yr, refuseMalformedResourceEntriesForOrphan as ys, enclosingDeadlineRemainingMs as yt, parseBootstrapMarker as yu, TABLE_INDEX_NOUN as z, resolveDynamicReferences as za, liveMatchesUnresolvedTokenFrame as zc, readTagList as zi, isNotImplemented as zl, REDACTED_DELETE_ADDRESS_SKIP_REASON as zn, malformedExportNamesWarning as zo, cyan as zr, findHandledUnwrittenCreateOnly as zs, revertNestedChildFromJournal as zt, runDockerForeground as zu };
|
|
55502
|
+
//# sourceMappingURL=deploy-engine-CVNzK__j.js.map
|