diff --git a/aws-rds-globalcluster/aws-rds-globalcluster.json b/aws-rds-globalcluster/aws-rds-globalcluster.json index abd295996..2b2b5f55c 100644 --- a/aws-rds-globalcluster/aws-rds-globalcluster.json +++ b/aws-rds-globalcluster/aws-rds-globalcluster.json @@ -12,6 +12,16 @@ "aurora-postgresql" ] }, + "Tags": { + "type": "array", + "maxItems": 50, + "uniqueItems": true, + "insertionOrder": false, + "description": "An array of key-value pairs to apply to this resource.", + "items": { + "$ref": "#/definitions/Tag" + } + }, "EngineLifecycleSupport": { "description": "The life cycle type of the global cluster. You can use this setting to enroll your global cluster into Amazon RDS Extended Support.", "type": "string" @@ -46,6 +56,30 @@ "type": "boolean" } }, + "definitions": { + "Tag": { + "description": "A key-value pair to associate with a resource.", + "type": "object", + "additionalProperties": false, + "properties": { + "Key": { + "type": "string", + "description": "The key name of the tag. You can specify a value that is 1 to 128 Unicode characters in length and cannot be prefixed with aws:. You can use any of the following characters: the set of Unicode letters, digits, whitespace, _, ., /, =, +, and -. ", + "minLength": 1, + "maxLength": 128 + }, + "Value": { + "type": "string", + "description": "The value for the tag. You can specify a value that is 0 to 256 Unicode characters in length and cannot be prefixed with aws:. You can use any of the following characters: the set of Unicode letters, digits, whitespace, _, ., /, =, +, and -. ", + "minLength": 0, + "maxLength": 256 + } + }, + "required": [ + "Key" + ] + } + }, "oneOf": [ { "required": [ @@ -87,7 +121,9 @@ "update": { "permissions": [ "rds:ModifyGlobalCluster", - "rds:DescribeGlobalClusters" + "rds:DescribeGlobalClusters", + "rds:AddTagsToResource", + "rds:RemoveTagsFromResource" ] }, "delete": { @@ -105,6 +141,14 @@ } }, "tagging": { - "taggable": false + "taggable": true, + "tagOnCreate": true, + "tagUpdatable": true, + "cloudFormationSystemTags": true, + "tagProperty": "/properties/Tags", + "permissions": [ + "rds:AddTagsToResource", + "rds:RemoveTagsFromResource" + ] } } diff --git a/aws-rds-globalcluster/src/main/java/software/amazon/rds/globalcluster/BaseHandlerStd.java b/aws-rds-globalcluster/src/main/java/software/amazon/rds/globalcluster/BaseHandlerStd.java index f3544bba1..aeb088d5f 100644 --- a/aws-rds-globalcluster/src/main/java/software/amazon/rds/globalcluster/BaseHandlerStd.java +++ b/aws-rds-globalcluster/src/main/java/software/amazon/rds/globalcluster/BaseHandlerStd.java @@ -188,7 +188,8 @@ protected ProgressEvent removeFromGlobalCluster( protected ProgressEvent createGlobalClusterWithSourceDBCluster(final AmazonWebServicesClientProxy proxy, final ProxyClient proxyClient, - final ProgressEvent progress) { + final ProgressEvent progress, + final Tagging.TagSet tagSet) { if(progress.getCallbackContext().isGlobalClusterCreated()) return progress; //check if sourceDbCluster is not null and is in format of Identifier @@ -199,7 +200,7 @@ protected ProgressEvent createGlobalClusterWithS .done((describeDbClusterRequest, describeDbClusterResponse, proxyClient2, resourceModel, callbackContext) -> { final String arn = describeDbClusterResponse.dbClusters().get(0).dbClusterArn(); try { - proxyClient2.injectCredentialsAndInvokeV2(Translator.createGlobalClusterRequest(resourceModel, arn), proxyClient2.client()::createGlobalCluster); + proxyClient2.injectCredentialsAndInvokeV2(Translator.createGlobalClusterRequest(resourceModel, arn, tagSet), proxyClient2.client()::createGlobalCluster); callbackContext.setGlobalClusterCreated(true); } catch (GlobalClusterAlreadyExistsException e) { throw new CfnAlreadyExistsException(e); @@ -210,7 +211,8 @@ protected ProgressEvent createGlobalClusterWithS protected ProgressEvent createGlobalCluster(final AmazonWebServicesClientProxy proxy, final ProxyClient proxyClient, - final ProgressEvent progress) { + final ProgressEvent progress, + final Tagging.TagSet tagSet) { return proxy.initiate("rds::create-global-cluster", proxyClient, progress.getResourceModel(), progress.getCallbackContext()) // request to create global cluster diff --git a/aws-rds-globalcluster/src/main/java/software/amazon/rds/globalcluster/Translator.java b/aws-rds-globalcluster/src/main/java/software/amazon/rds/globalcluster/Translator.java index 15c8f7f7c..2b6df2945 100644 --- a/aws-rds-globalcluster/src/main/java/software/amazon/rds/globalcluster/Translator.java +++ b/aws-rds-globalcluster/src/main/java/software/amazon/rds/globalcluster/Translator.java @@ -20,11 +20,16 @@ public class Translator { +<<<<<<< HEAD static CreateGlobalClusterRequest createGlobalClusterRequest(final ResourceModel model) { - return createGlobalClusterRequest(model, null); + return createGlobalClusterRequest(model, null, Tagging.TagSet.emptySet()); +======= + static CreateGlobalClusterRequest createGlobalClusterRequest(final ResourceModel model, final Tagging.TagSet tagSet) { + return createGlobalClusterRequest(model, null, tagSet); +>>>>>>> d618efc (add tagging parameter for createGlobalCluster) } - static CreateGlobalClusterRequest createGlobalClusterRequest(final ResourceModel model, String dbClusterArn) { + static CreateGlobalClusterRequest createGlobalClusterRequest(final ResourceModel model, String dbClusterArn, final Tagging.TagSet tagSet) { return CreateGlobalClusterRequest.builder() .engine(model.getEngine()) .engineVersion(model.getEngineVersion()) @@ -33,6 +38,7 @@ static CreateGlobalClusterRequest createGlobalClusterRequest(final ResourceModel .sourceDBClusterIdentifier(StringUtils.isBlank(dbClusterArn) ? model.getSourceDBClusterIdentifier() : dbClusterArn) .storageEncrypted(model.getStorageEncrypted()) .engineLifecycleSupport(model.getEngineLifecycleSupport()) + .tags(Tagging.translateTagsToSdk(tagSet)) .build(); } @@ -85,4 +91,16 @@ static DescribeDbClustersRequest describeDbClustersRequest(final ResourceModel m .dbClusterIdentifier(model.getSourceDBClusterIdentifier()) .build(); } + + static Set translateTagsToSdk( + final Collection tags + ) { + return Optional.ofNullable(tags).orElse(Collections.emptySet()) + .stream() + .map(tag -> software.amazon.awssdk.services.rds.model.Tag.builder() + .key(tag.getKey()) + .value(tag.getValue()) + .build()) + .collect(Collectors.toSet()); + } }