From fd5dc196afa39bfd3376d378dffdee80f2b64212 Mon Sep 17 00:00:00 2001 From: Di Wu Date: Mon, 21 Oct 2024 12:13:05 -0700 Subject: [PATCH 1/5] fix(dynamoDB): add tags to TableV2 --- .../test/integ.table-v2-global.ts | 8 +++++- .../aws-cdk-lib/aws-dynamodb/lib/table-v2.ts | 25 +++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts index 8cf849249f998..cf51c7ba4e13c 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts @@ -52,7 +52,13 @@ class TestStack extends Stack { contributorInsights: false, }, }, - tags: [{ key: 'USE2ReplicaTagKey', value: 'USE2ReplicaTagValue' }], + tags: [{ + key: 'USE2ReplicaTagKey', + value: 'USE2ReplicaTagValue', + }, { + key: 'primaryTableTagKey', + value: 'USE2Replica', + }], }, { region: 'us-west-2', diff --git a/packages/aws-cdk-lib/aws-dynamodb/lib/table-v2.ts b/packages/aws-cdk-lib/aws-dynamodb/lib/table-v2.ts index 65e3c588968e5..29ac8360515ed 100644 --- a/packages/aws-cdk-lib/aws-dynamodb/lib/table-v2.ts +++ b/packages/aws-cdk-lib/aws-dynamodb/lib/table-v2.ts @@ -4,15 +4,19 @@ import { Capacity } from './capacity'; import { CfnGlobalTable } from './dynamodb.generated'; import { TableEncryptionV2 } from './encryption'; import { + Attribute, + BillingMode, + LocalSecondaryIndexProps, + ProjectionType, + SecondaryIndexProps, StreamViewType, - Attribute, TableClass, LocalSecondaryIndexProps, - SecondaryIndexProps, BillingMode, ProjectionType, + TableClass, } from './shared'; -import { TableBaseV2, ITableV2 } from './table-v2-base'; +import { ITableV2, TableBaseV2 } from './table-v2-base'; import { PolicyDocument } from '../../aws-iam'; import { IStream } from '../../aws-kinesis'; import { IKey, Key } from '../../aws-kms'; -import { ArnFormat, CfnTag, Lazy, PhysicalName, RemovalPolicy, Stack, Token } from '../../core'; +import { ArnFormat, CfnTag, Lazy, PhysicalName, RemovalPolicy, Stack, TagManager, TagType, Token } from '../../core'; const HASH_KEY_TYPE = 'HASH'; const RANGE_KEY_TYPE = 'RANGE'; @@ -482,6 +486,8 @@ export class TableV2 extends TableBaseV2 { protected readonly region: string; + protected readonly tags: TagManager; + private readonly billingMode: string; private readonly partitionKey: Attribute; private readonly hasSortKey: boolean; @@ -515,6 +521,7 @@ export class TableV2 extends TableBaseV2 { this.partitionKey = props.partitionKey; this.hasSortKey = props.sortKey !== undefined; this.region = this.stack.region; + this.tags = new TagManager(TagType.STANDARD, CfnGlobalTable.CFN_RESOURCE_TYPE_NAME, props.tags); this.encryption = props.encryption; this.encryptionKey = this.encryption?.tableKey; @@ -665,6 +672,14 @@ export class TableV2 extends TableBaseV2 { const pointInTimeRecovery = props.pointInTimeRecovery ?? this.tableOptions.pointInTimeRecovery; const contributorInsights = props.contributorInsights ?? this.tableOptions.contributorInsights; const resourcePolicy = props.resourcePolicy ?? this.tableOptions.resourcePolicy; + const propTags: Record = (props.tags ?? []).reduce((p, item) => + ({ ...p, [item.key]: item.value }), {}, + ); + + const tags: CfnTag[] = Object.entries({ + ...this.tags.tagValues(), + ...propTags, + }).map(([k, v]) => ({ key: k, value: v })); return { region: props.region, @@ -684,7 +699,7 @@ export class TableV2 extends TableBaseV2 { readProvisionedThroughputSettings: props.readCapacity ? props.readCapacity._renderReadCapacity() : this.readProvisioning, - tags: props.tags, + tags: tags.length === 0 ? undefined : tags, readOnDemandThroughputSettings: props.maxReadRequestUnits ? { maxReadRequestUnits: props.maxReadRequestUnits } : this.maxReadRequestUnits From ee7db9528d69a910fa2bfec55be5692d644a9be0 Mon Sep 17 00:00:00 2001 From: Di Wu Date: Wed, 23 Oct 2024 13:26:48 -0700 Subject: [PATCH 2/5] update test cases --- .../aws-cdk-global-table.assets.json | 6 +- .../aws-cdk-global-table.template.json | 8 +- ...efaultTestDeployAssertA2A9E81F.assets.json | 2 +- .../cdk.out | 2 +- .../integ.json | 2 +- .../manifest.json | 6 +- .../tree.json | 8 +- .../aws-cdk-global-table.assets.json | 6 +- .../aws-cdk-global-table.template.json | 8 ++ ...efaultTestDeployAssertA2A9E81F.assets.json | 2 +- .../integ.table-v2-global.js.snapshot/cdk.out | 2 +- .../integ.json | 2 +- .../manifest.json | 6 +- .../tree.json | 8 ++ .../aws-dynamodb/test/table-v2.test.ts | 75 ++++++++++++++++++- 15 files changed, 121 insertions(+), 22 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.assets.json index aa94a2c7845ca..3a9f78563fbff 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.assets.json @@ -1,7 +1,7 @@ { - "version": "36.0.0", + "version": "38.0.1", "files": { - "cc5278f2745ed14e48839e10ba3e84d52a026101a039e164e937d90f16b69c34": { + "9ef81b5be13e5a6758d41eff3e003dba739ea0f7f9dceddeeaea06422aa3fac2": { "source": { "path": "aws-cdk-global-table.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-us-east-1": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "cc5278f2745ed14e48839e10ba3e84d52a026101a039e164e937d90f16b69c34.json", + "objectKey": "9ef81b5be13e5a6758d41eff3e003dba739ea0f7f9dceddeeaea06422aa3fac2.json", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.template.json index e1e71ad2043c7..f5e79aea3c910 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.template.json @@ -124,7 +124,13 @@ "MaxReadRequestUnits": 222 }, "Region": "eu-west-1", - "TableClass": "STANDARD_INFREQUENT_ACCESS" + "TableClass": "STANDARD_INFREQUENT_ACCESS", + "Tags": [ + { + "Key": "primaryTableTagKey", + "Value": "primaryTableTagValue" + } + ] }, { "ContributorInsightsSpecification": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets.json index 0a9ffc385b09a..a01b555c8d324 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "38.0.1", "files": { "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { "source": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/cdk.out index 1f0068d32659a..c6e612584e352 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"36.0.0"} \ No newline at end of file +{"version":"38.0.1"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/integ.json index 15437c63539c9..2aacd3080724d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "38.0.1", "testCases": { "aws-cdk-global-table-integ/DefaultTest": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/manifest.json index f36374c4697b1..8b569bf46ca06 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "38.0.1", "artifacts": { "aws-cdk-global-table.assets": { "type": "cdk:asset-manifest", @@ -16,9 +16,10 @@ "templateFile": "aws-cdk-global-table.template.json", "terminationProtection": false, "validateOnSynth": false, + "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-us-east-1", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-us-east-1", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/cc5278f2745ed14e48839e10ba3e84d52a026101a039e164e937d90f16b69c34.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/9ef81b5be13e5a6758d41eff3e003dba739ea0f7f9dceddeeaea06422aa3fac2.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -90,6 +91,7 @@ "templateFile": "awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.template.json", "terminationProtection": false, "validateOnSynth": false, + "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/tree.json index 963c19fb401dd..8ed36cfb96b54 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/tree.json @@ -161,6 +161,12 @@ "pointInTimeRecoverySpecification": { "pointInTimeRecoveryEnabled": true }, + "tags": [ + { + "key": "primaryTableTagKey", + "value": "primaryTableTagValue" + } + ], "readOnDemandThroughputSettings": { "maxReadRequestUnits": 222 } @@ -231,7 +237,7 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_dynamodb.TableBaseV2", + "fqn": "aws-cdk-lib.aws_dynamodb.TableV2", "version": "0.0.0" } }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json index 419f067b36e9e..8a39c623a2827 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json @@ -1,7 +1,7 @@ { - "version": "36.0.0", + "version": "38.0.1", "files": { - "a38411fa5a0afe5343485b65f2c16b2b258cbf8f67e1bf8dc53f06668c3b91d2": { + "ed60965669d381f108beb6a1e9435b0e3da69be86f285b978b6aea808720e9fd": { "source": { "path": "aws-cdk-global-table.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-us-east-1": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "a38411fa5a0afe5343485b65f2c16b2b258cbf8f67e1bf8dc53f06668c3b91d2.json", + "objectKey": "ed60965669d381f108beb6a1e9435b0e3da69be86f285b978b6aea808720e9fd.json", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json index 5c42c0eccbdd0..41b2ac8f90885 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json @@ -148,6 +148,10 @@ "Region": "us-east-2", "TableClass": "STANDARD_INFREQUENT_ACCESS", "Tags": [ + { + "Key": "primaryTableTagKey", + "Value": "USE2Replica" + }, { "Key": "USE2ReplicaTagKey", "Value": "USE2ReplicaTagValue" @@ -184,6 +188,10 @@ "Region": "us-west-2", "TableClass": "STANDARD", "Tags": [ + { + "Key": "primaryTableTagKey", + "Value": "primaryTableTagValue" + }, { "Key": "USW2ReplicaTagKey", "Value": "USW2ReplicaTagValue" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets.json index 0a9ffc385b09a..a01b555c8d324 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "38.0.1", "files": { "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { "source": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/cdk.out index 1f0068d32659a..c6e612584e352 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"36.0.0"} \ No newline at end of file +{"version":"38.0.1"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/integ.json index 15437c63539c9..2aacd3080724d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "38.0.1", "testCases": { "aws-cdk-global-table-integ/DefaultTest": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json index fe3ce6aaeb327..8c299166462e3 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "38.0.1", "artifacts": { "aws-cdk-global-table.assets": { "type": "cdk:asset-manifest", @@ -16,9 +16,10 @@ "templateFile": "aws-cdk-global-table.template.json", "terminationProtection": false, "validateOnSynth": false, + "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-us-east-1", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-us-east-1", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/a38411fa5a0afe5343485b65f2c16b2b258cbf8f67e1bf8dc53f06668c3b91d2.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/ed60965669d381f108beb6a1e9435b0e3da69be86f285b978b6aea808720e9fd.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -90,6 +91,7 @@ "templateFile": "awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.template.json", "terminationProtection": false, "validateOnSynth": false, + "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json index e162d51c8274f..c98945a52caad 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json @@ -187,6 +187,10 @@ } }, "tags": [ + { + "key": "primaryTableTagKey", + "value": "USE2Replica" + }, { "key": "USE2ReplicaTagKey", "value": "USE2ReplicaTagValue" @@ -223,6 +227,10 @@ "readCapacityUnits": 10 }, "tags": [ + { + "key": "primaryTableTagKey", + "value": "primaryTableTagValue" + }, { "key": "USW2ReplicaTagKey", "value": "USW2ReplicaTagValue" diff --git a/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts b/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts index 63bbf3319b73e..e9f7760e3bec7 100644 --- a/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts +++ b/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts @@ -2,7 +2,7 @@ import { Match, Template } from '../../assertions'; import { ArnPrincipal, PolicyDocument, PolicyStatement } from '../../aws-iam'; import { Stream } from '../../aws-kinesis'; import { Key } from '../../aws-kms'; -import { CfnDeletionPolicy, Lazy, RemovalPolicy, Stack } from '../../core'; +import { CfnDeletionPolicy, Lazy, RemovalPolicy, Stack, Tags } from '../../core'; import { AttributeType, Billing, Capacity, GlobalSecondaryIndexPropsV2, TableV2, LocalSecondaryIndexProps, ProjectionType, StreamViewType, TableClass, TableEncryptionV2, @@ -777,7 +777,10 @@ describe('table', () => { KMSMasterKeyId: 'arn:aws:kms:us-east-1:123456789012:key/g24efbna-az9b-42ro-m3bp-cq249l94fca6', }, TableClass: 'STANDARD_INFREQUENT_ACCESS', - Tags: [{ Key: 'USE1Key', Value: 'USE1Value' }], + Tags: [ + { Key: 'USW2Key', Value: 'USW2Value' }, + { Key: 'USE1Key', Value: 'USE1Value' }, + ], }, { ContributorInsightsSpecification: { @@ -813,7 +816,10 @@ describe('table', () => { KMSMasterKeyId: 'arn:aws:kms:us-east-2:123456789012:key/g24efbna-az9b-42ro-m3bp-cq249l94fca6', }, TableClass: 'STANDARD', - Tags: [{ Key: 'USE2Key', Value: 'USE2Value' }], + Tags: [ + { Key: 'USW2Key', Value: 'USW2Value' }, + { Key: 'USE2Key', Value: 'USE2Value' }, + ], }, { ContributorInsightsSpecification: { @@ -1293,6 +1299,67 @@ describe('replica tables', () => { }); }); + test('with TagAspect', () => { + // GIVEN + const stack = new Stack(undefined, 'Stack', { env: { region: 'us-east-1' } }); + + // WHEN + const table = new TableV2(stack, 'Table', { + partitionKey: { name: 'pk', type: AttributeType.STRING }, + replicas: [{ + region: 'us-west-1', + }], + }); + + Tags.of(table).add('tagKey', 'tagValue'); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::DynamoDB::GlobalTable', { + Replicas: [ + { + Region: 'us-west-1', + Tags: [{ Key: 'tagKey', Value: 'tagValue' }], + }, + { + Region: 'us-east-1', + }, + ], + }); + }); + + test('replica tags override global table tags', () => { + // GIVEN + const stack = new Stack(undefined, 'Stack', { env: { region: 'us-east-1' } }); + + // WHEN + const table = new TableV2(stack, 'Table', { + partitionKey: { name: 'pk', type: AttributeType.STRING }, + replicas: [{ + region: 'us-west-1', + tags: [{ key: 'tableTagProperty', value: 'replicaTagPropertyValue' }], + }], + tags: [{ key: 'tableTagProperty', value: 'globalTagPropertyValue' }], + }); + + Tags.of(table).add('tagAspect', 'tagAspectValue'); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::DynamoDB::GlobalTable', { + Replicas: [ + { + Region: 'us-west-1', + Tags: [ + { Key: 'tableTagProperty', Value: 'replicaTagPropertyValue' }, + { Key: 'tagAspect', Value: 'tagAspectValue' }, + ], + }, + { + Region: 'us-east-1', + }, + ], + }); + }); + test('with per-replica kinesis stream', () => { // GIVEN const stack = new Stack(undefined, 'Stack', { env: { region: 'us-west-2' } }); @@ -3007,4 +3074,4 @@ test('Resource policy test', () => { }, ], }); -}); \ No newline at end of file +}); From 0b1e04c71bf55c09e5b849df9ebf40064c7ecb21 Mon Sep 17 00:00:00 2001 From: Di Wu Date: Wed, 23 Oct 2024 13:57:52 -0700 Subject: [PATCH 3/5] fix broken unit tests --- packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts b/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts index e9f7760e3bec7..b5ee275e8b645 100644 --- a/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts +++ b/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts @@ -1322,6 +1322,7 @@ describe('replica tables', () => { }, { Region: 'us-east-1', + Tags: [{ Key: 'tagKey', Value: 'tagValue' }], }, ], }); @@ -1355,6 +1356,10 @@ describe('replica tables', () => { }, { Region: 'us-east-1', + Tags: [ + { Key: 'tableTagProperty', Value: 'globalTagPropertyValue' }, + { Key: 'tagAspect', Value: 'tagAspectValue' }, + ], }, ], }); From 4adfb4d4065419a84c01da30584f25c4002f480f Mon Sep 17 00:00:00 2001 From: Di Wu Date: Tue, 29 Oct 2024 12:20:33 -0700 Subject: [PATCH 4/5] keep the tags behavior on TableV2 --- .../aws-cdk-global-table.assets.json | 4 +-- .../aws-cdk-global-table.template.json | 8 +---- .../manifest.json | 2 +- .../tree.json | 10 ++---- .../aws-cdk-global-table.assets.json | 4 +-- .../aws-cdk-global-table.template.json | 12 ++++--- .../manifest.json | 2 +- .../tree.json | 16 ++++++---- .../test/integ.table-v2-global.ts | 14 +++----- .../aws-cdk-lib/aws-dynamodb/lib/table-v2.ts | 4 +-- .../aws-dynamodb/test/table-v2.test.ts | 32 +++++++++---------- 11 files changed, 50 insertions(+), 58 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.assets.json index 3a9f78563fbff..edf92583f5036 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.assets.json @@ -1,7 +1,7 @@ { "version": "38.0.1", "files": { - "9ef81b5be13e5a6758d41eff3e003dba739ea0f7f9dceddeeaea06422aa3fac2": { + "cc5278f2745ed14e48839e10ba3e84d52a026101a039e164e937d90f16b69c34": { "source": { "path": "aws-cdk-global-table.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-us-east-1": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "9ef81b5be13e5a6758d41eff3e003dba739ea0f7f9dceddeeaea06422aa3fac2.json", + "objectKey": "cc5278f2745ed14e48839e10ba3e84d52a026101a039e164e937d90f16b69c34.json", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.template.json index f5e79aea3c910..e1e71ad2043c7 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/aws-cdk-global-table.template.json @@ -124,13 +124,7 @@ "MaxReadRequestUnits": 222 }, "Region": "eu-west-1", - "TableClass": "STANDARD_INFREQUENT_ACCESS", - "Tags": [ - { - "Key": "primaryTableTagKey", - "Value": "primaryTableTagValue" - } - ] + "TableClass": "STANDARD_INFREQUENT_ACCESS" }, { "ContributorInsightsSpecification": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/manifest.json index 8b569bf46ca06..b5799752cf772 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/manifest.json @@ -19,7 +19,7 @@ "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-us-east-1", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-us-east-1", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/9ef81b5be13e5a6758d41eff3e003dba739ea0f7f9dceddeeaea06422aa3fac2.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/cc5278f2745ed14e48839e10ba3e84d52a026101a039e164e937d90f16b69c34.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/tree.json index 8ed36cfb96b54..ff85fbcbd863f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.dynamodb-v2.ondemand.js.snapshot/tree.json @@ -161,12 +161,6 @@ "pointInTimeRecoverySpecification": { "pointInTimeRecoveryEnabled": true }, - "tags": [ - { - "key": "primaryTableTagKey", - "value": "primaryTableTagValue" - } - ], "readOnDemandThroughputSettings": { "maxReadRequestUnits": 222 } @@ -276,7 +270,7 @@ "path": "aws-cdk-global-table-integ/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.3.0" + "version": "10.4.2" } }, "DeployAssert": { @@ -322,7 +316,7 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.3.0" + "version": "10.4.2" } } }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json index 8a39c623a2827..1e2172c91d4eb 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json @@ -1,7 +1,7 @@ { "version": "38.0.1", "files": { - "ed60965669d381f108beb6a1e9435b0e3da69be86f285b978b6aea808720e9fd": { + "89bf0d3b593b71dd8b4f5f2ce39885b1ae01f8e385b5c3e50634ed481cebaa66": { "source": { "path": "aws-cdk-global-table.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-us-east-1": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "ed60965669d381f108beb6a1e9435b0e3da69be86f285b978b6aea808720e9fd.json", + "objectKey": "89bf0d3b593b71dd8b4f5f2ce39885b1ae01f8e385b5c3e50634ed481cebaa66.json", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json index 41b2ac8f90885..7c35bdb8fa94f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json @@ -149,8 +149,8 @@ "TableClass": "STANDARD_INFREQUENT_ACCESS", "Tags": [ { - "Key": "primaryTableTagKey", - "Value": "USE2Replica" + "Key": "tagAspectKey", + "Value": "tagAspectValue" }, { "Key": "USE2ReplicaTagKey", @@ -189,8 +189,8 @@ "TableClass": "STANDARD", "Tags": [ { - "Key": "primaryTableTagKey", - "Value": "primaryTableTagValue" + "Key": "tagAspectKey", + "Value": "tagAspectValue" }, { "Key": "USW2ReplicaTagKey", @@ -239,6 +239,10 @@ "Region": "us-east-1", "TableClass": "STANDARD_INFREQUENT_ACCESS", "Tags": [ + { + "Key": "tagAspectKey", + "Value": "tagAspectValue" + }, { "Key": "primaryTableTagKey", "Value": "primaryTableTagValue" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json index 8c299166462e3..fec4c1c921d7d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json @@ -19,7 +19,7 @@ "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-us-east-1", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-us-east-1", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/ed60965669d381f108beb6a1e9435b0e3da69be86f285b978b6aea808720e9fd.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/89bf0d3b593b71dd8b4f5f2ce39885b1ae01f8e385b5c3e50634ed481cebaa66.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json index c98945a52caad..999a89164b5b5 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json @@ -188,8 +188,8 @@ }, "tags": [ { - "key": "primaryTableTagKey", - "value": "USE2Replica" + "key": "tagAspectKey", + "value": "tagAspectValue" }, { "key": "USE2ReplicaTagKey", @@ -228,8 +228,8 @@ }, "tags": [ { - "key": "primaryTableTagKey", - "value": "primaryTableTagValue" + "key": "tagAspectKey", + "value": "tagAspectValue" }, { "key": "USW2ReplicaTagKey", @@ -278,6 +278,10 @@ "readCapacityUnits": 10 }, "tags": [ + { + "key": "tagAspectKey", + "value": "tagAspectValue" + }, { "key": "primaryTableTagKey", "value": "primaryTableTagValue" @@ -355,7 +359,7 @@ "path": "aws-cdk-global-table-integ/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.3.0" + "version": "10.4.2" } }, "DeployAssert": { @@ -401,7 +405,7 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.3.0" + "version": "10.4.2" } } }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts index cf51c7ba4e13c..5411c61aec2e3 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts @@ -1,5 +1,5 @@ import { IntegTest } from '@aws-cdk/integ-tests-alpha'; -import { App, RemovalPolicy, Stack, StackProps } from 'aws-cdk-lib'; +import { App, RemovalPolicy, Stack, StackProps, Tags } from 'aws-cdk-lib'; import { AttributeType, Billing, Capacity, TableV2, TableClass, TableEncryptionV2 } from 'aws-cdk-lib/aws-dynamodb'; import { Stream } from 'aws-cdk-lib/aws-kinesis'; import { Construct } from 'constructs'; @@ -10,7 +10,7 @@ class TestStack extends Stack { const stream = new Stream(this, 'Stream'); - new TableV2(this, 'GlobalTable', { + const globalTable = new TableV2(this, 'GlobalTable', { tableName: 'my-global-table', partitionKey: { name: 'pk', type: AttributeType.STRING }, sortKey: { name: 'sk', type: AttributeType.NUMBER }, @@ -52,13 +52,7 @@ class TestStack extends Stack { contributorInsights: false, }, }, - tags: [{ - key: 'USE2ReplicaTagKey', - value: 'USE2ReplicaTagValue', - }, { - key: 'primaryTableTagKey', - value: 'USE2Replica', - }], + tags: [{ key: 'USE2ReplicaTagKey', value: 'USE2ReplicaTagValue' }], }, { region: 'us-west-2', @@ -74,6 +68,8 @@ class TestStack extends Stack { ], tags: [{ key: 'primaryTableTagKey', value: 'primaryTableTagValue' }], }); + + Tags.of(globalTable).add('tagAspectKey', 'tagAspectValue'); } } diff --git a/packages/aws-cdk-lib/aws-dynamodb/lib/table-v2.ts b/packages/aws-cdk-lib/aws-dynamodb/lib/table-v2.ts index ad76cb92bdcbd..ac79fb6fad792 100644 --- a/packages/aws-cdk-lib/aws-dynamodb/lib/table-v2.ts +++ b/packages/aws-cdk-lib/aws-dynamodb/lib/table-v2.ts @@ -160,7 +160,7 @@ export interface TableOptionsV2 { readonly kinesisStream?: IStream; /** - * Tags to be applied to the table or replica table + * Tags to be applied to the primary table (default replica table). * * @default - no tags */ @@ -533,7 +533,7 @@ export class TableV2 extends TableBaseV2 { this.partitionKey = props.partitionKey; this.hasSortKey = props.sortKey !== undefined; this.region = this.stack.region; - this.tags = new TagManager(TagType.STANDARD, CfnGlobalTable.CFN_RESOURCE_TYPE_NAME, props.tags); + this.tags = new TagManager(TagType.STANDARD, CfnGlobalTable.CFN_RESOURCE_TYPE_NAME); this.encryption = props.encryption; this.encryptionKey = this.encryption?.tableKey; diff --git a/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts b/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts index b5ee275e8b645..8979c454e662d 100644 --- a/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts +++ b/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts @@ -777,10 +777,7 @@ describe('table', () => { KMSMasterKeyId: 'arn:aws:kms:us-east-1:123456789012:key/g24efbna-az9b-42ro-m3bp-cq249l94fca6', }, TableClass: 'STANDARD_INFREQUENT_ACCESS', - Tags: [ - { Key: 'USW2Key', Value: 'USW2Value' }, - { Key: 'USE1Key', Value: 'USE1Value' }, - ], + Tags: [{ Key: 'USE1Key', Value: 'USE1Value' }], }, { ContributorInsightsSpecification: { @@ -816,10 +813,7 @@ describe('table', () => { KMSMasterKeyId: 'arn:aws:kms:us-east-2:123456789012:key/g24efbna-az9b-42ro-m3bp-cq249l94fca6', }, TableClass: 'STANDARD', - Tags: [ - { Key: 'USW2Key', Value: 'USW2Value' }, - { Key: 'USE2Key', Value: 'USE2Value' }, - ], + Tags: [{ Key: 'USE2Key', Value: 'USE2Value' }], }, { ContributorInsightsSpecification: { @@ -1328,7 +1322,7 @@ describe('replica tables', () => { }); }); - test('replica tags override global table tags', () => { + test('replica tags override tag aspect tags', () => { // GIVEN const stack = new Stack(undefined, 'Stack', { env: { region: 'us-east-1' } }); @@ -1337,12 +1331,14 @@ describe('replica tables', () => { partitionKey: { name: 'pk', type: AttributeType.STRING }, replicas: [{ region: 'us-west-1', - tags: [{ key: 'tableTagProperty', value: 'replicaTagPropertyValue' }], + tags: [{ key: 'tableTagProperty', value: 'replicaW1TagPropertyValue' }], + }, { + region: 'us-west-2', }], - tags: [{ key: 'tableTagProperty', value: 'globalTagPropertyValue' }], + tags: [{ key: 'tableTagProperty', value: 'defaultReplicaTagPropertyValue' }], }); - Tags.of(table).add('tagAspect', 'tagAspectValue'); + Tags.of(table).add('tableTagProperty', 'tagAspectValue'); // THEN Template.fromStack(stack).hasResourceProperties('AWS::DynamoDB::GlobalTable', { @@ -1350,15 +1346,19 @@ describe('replica tables', () => { { Region: 'us-west-1', Tags: [ - { Key: 'tableTagProperty', Value: 'replicaTagPropertyValue' }, - { Key: 'tagAspect', Value: 'tagAspectValue' }, + { Key: 'tableTagProperty', Value: 'replicaW1TagPropertyValue' }, + ], + }, + { + Region: 'us-west-2', + Tags: [ + { Key: 'tableTagProperty', Value: 'tagAspectValue' }, ], }, { Region: 'us-east-1', Tags: [ - { Key: 'tableTagProperty', Value: 'globalTagPropertyValue' }, - { Key: 'tagAspect', Value: 'tagAspectValue' }, + { Key: 'tableTagProperty', Value: 'defaultReplicaTagPropertyValue' }, ], }, ], From 4b1d67413cbd9109d1d800ccfd780b040de33a18 Mon Sep 17 00:00:00 2001 From: Di Wu Date: Thu, 31 Oct 2024 13:03:54 -0700 Subject: [PATCH 5/5] add more unit and integ test cases --- .../aws-cdk-global-table.assets.json | 4 +-- .../aws-cdk-global-table.template.json | 20 ++++++++++++- .../manifest.json | 30 ++++++++++++++++++- .../tree.json | 20 ++++++++++++- .../test/integ.table-v2-global.ts | 1 + .../aws-dynamodb/test/table-v2.test.ts | 29 ++++++++++++++++++ 6 files changed, 99 insertions(+), 5 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json index 1e2172c91d4eb..929f0476cdfd0 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.assets.json @@ -1,7 +1,7 @@ { "version": "38.0.1", "files": { - "89bf0d3b593b71dd8b4f5f2ce39885b1ae01f8e385b5c3e50634ed481cebaa66": { + "f76e4db697eb7d6e297e40f4bafd35a109a7849082124cc1946d6efb31becfbd": { "source": { "path": "aws-cdk-global-table.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-us-east-1": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "89bf0d3b593b71dd8b4f5f2ce39885b1ae01f8e385b5c3e50634ed481cebaa66.json", + "objectKey": "f76e4db697eb7d6e297e40f4bafd35a109a7849082124cc1946d6efb31becfbd.json", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json index 7c35bdb8fa94f..8fda8662e31e9 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/aws-cdk-global-table.template.json @@ -16,7 +16,13 @@ "KeyId": "alias/aws/kinesis" } ] - } + }, + "Tags": [ + { + "Key": "stage", + "Value": "IntegTest" + } + ] }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -148,6 +154,10 @@ "Region": "us-east-2", "TableClass": "STANDARD_INFREQUENT_ACCESS", "Tags": [ + { + "Key": "stage", + "Value": "IntegTest" + }, { "Key": "tagAspectKey", "Value": "tagAspectValue" @@ -188,6 +198,10 @@ "Region": "us-west-2", "TableClass": "STANDARD", "Tags": [ + { + "Key": "stage", + "Value": "IntegTest" + }, { "Key": "tagAspectKey", "Value": "tagAspectValue" @@ -239,6 +253,10 @@ "Region": "us-east-1", "TableClass": "STANDARD_INFREQUENT_ACCESS", "Tags": [ + { + "Key": "stage", + "Value": "IntegTest" + }, { "Key": "tagAspectKey", "Value": "tagAspectValue" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json index fec4c1c921d7d..cdfdbcd507e22 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/manifest.json @@ -15,11 +15,14 @@ "properties": { "templateFile": "aws-cdk-global-table.template.json", "terminationProtection": false, + "tags": { + "stage": "IntegTest" + }, "validateOnSynth": false, "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-us-east-1", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-us-east-1", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/89bf0d3b593b71dd8b4f5f2ce39885b1ae01f8e385b5c3e50634ed481cebaa66.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/f76e4db697eb7d6e297e40f4bafd35a109a7849082124cc1946d6efb31becfbd.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -35,6 +38,17 @@ "aws-cdk-global-table.assets" ], "metadata": { + "/aws-cdk-global-table": [ + { + "type": "aws:cdk:stack-tags", + "data": [ + { + "Key": "stage", + "Value": "IntegTest" + } + ] + } + ], "/aws-cdk-global-table/Stream/Resource": [ { "type": "aws:cdk:logicalId", @@ -90,6 +104,9 @@ "properties": { "templateFile": "awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.template.json", "terminationProtection": false, + "tags": { + "stage": "IntegTest" + }, "validateOnSynth": false, "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", @@ -110,6 +127,17 @@ "awscdkglobaltableintegDefaultTestDeployAssertA2A9E81F.assets" ], "metadata": { + "/aws-cdk-global-table-integ/DefaultTest/DeployAssert": [ + { + "type": "aws:cdk:stack-tags", + "data": [ + { + "Key": "stage", + "Value": "IntegTest" + } + ] + } + ], "/aws-cdk-global-table-integ/DefaultTest/DeployAssert/BootstrapVersion": [ { "type": "aws:cdk:logicalId", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json index 999a89164b5b5..7d72d600d5a9f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.js.snapshot/tree.json @@ -31,7 +31,13 @@ "KeyId": "alias/aws/kinesis" } ] - } + }, + "tags": [ + { + "key": "stage", + "value": "IntegTest" + } + ] } }, "constructInfo": { @@ -187,6 +193,10 @@ } }, "tags": [ + { + "key": "stage", + "value": "IntegTest" + }, { "key": "tagAspectKey", "value": "tagAspectValue" @@ -227,6 +237,10 @@ "readCapacityUnits": 10 }, "tags": [ + { + "key": "stage", + "value": "IntegTest" + }, { "key": "tagAspectKey", "value": "tagAspectValue" @@ -278,6 +292,10 @@ "readCapacityUnits": 10 }, "tags": [ + { + "key": "stage", + "value": "IntegTest" + }, { "key": "tagAspectKey", "value": "tagAspectValue" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts index 5411c61aec2e3..de8d987c23e91 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-dynamodb/test/integ.table-v2-global.ts @@ -74,6 +74,7 @@ class TestStack extends Stack { } const app = new App(); +Tags.of(app).add('stage', 'IntegTest'); new IntegTest(app, 'aws-cdk-global-table-integ', { testCases: [new TestStack(app, 'aws-cdk-global-table', { env: { region: 'us-east-1' } })], regions: ['us-east-1'], diff --git a/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts b/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts index 8979c454e662d..a4c9c66808ff2 100644 --- a/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts +++ b/packages/aws-cdk-lib/aws-dynamodb/test/table-v2.test.ts @@ -1322,6 +1322,35 @@ describe('replica tables', () => { }); }); + test('with TagAspect on parent scope', () => { + // GIVEN + const stack = new Stack(undefined, 'Stack', { env: { region: 'us-east-1' } }); + + // WHEN + new TableV2(stack, 'Table', { + partitionKey: { name: 'pk', type: AttributeType.STRING }, + replicas: [{ + region: 'us-west-1', + }], + }); + + Tags.of(stack).add('stage', 'Prod'); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::DynamoDB::GlobalTable', { + Replicas: [ + { + Region: 'us-west-1', + Tags: [{ Key: 'stage', Value: 'Prod' }], + }, + { + Region: 'us-east-1', + Tags: [{ Key: 'stage', Value: 'Prod' }], + }, + ], + }); + }); + test('replica tags override tag aspect tags', () => { // GIVEN const stack = new Stack(undefined, 'Stack', { env: { region: 'us-east-1' } });