From 98c8cd3b5dd4b6e685a1f73c66680091bdd0b1f6 Mon Sep 17 00:00:00 2001 From: Brian Pandola Date: Tue, 28 Feb 2023 03:22:42 -0800 Subject: [PATCH] ResourceTaggingAPI: Add support for AWS::RDS::DBCluster resource (#5999) --- moto/resourcegroupstaggingapi/models.py | 15 +++++++ .../test_resourcegroupstaggingapi.py | 44 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/moto/resourcegroupstaggingapi/models.py b/moto/resourcegroupstaggingapi/models.py index 1fa101047..0514901c6 100644 --- a/moto/resourcegroupstaggingapi/models.py +++ b/moto/resourcegroupstaggingapi/models.py @@ -326,6 +326,21 @@ class ResourceGroupsTaggingAPIBackend(BaseBackend): yield {"ResourceARN": f"{kms_key.arn}", "Tags": tags} + # RDS Cluster + if ( + not resource_type_filters + or "rds" in resource_type_filters + or "rds:cluster" in resource_type_filters + ): + for cluster in self.rds_backend.clusters.values(): + tags = cluster.get_tags() + if not tags or not tag_filter(tags): + continue + yield { + "ResourceARN": cluster.db_cluster_arn, + "Tags": tags, + } + # RDS Instance if ( not resource_type_filters diff --git a/tests/test_resourcegroupstaggingapi/test_resourcegroupstaggingapi.py b/tests/test_resourcegroupstaggingapi/test_resourcegroupstaggingapi.py index f0ccce2da..072092ad3 100644 --- a/tests/test_resourcegroupstaggingapi/test_resourcegroupstaggingapi.py +++ b/tests/test_resourcegroupstaggingapi/test_resourcegroupstaggingapi.py @@ -422,6 +422,50 @@ def test_get_resources_rds(): assert_response(resp, 2) +@mock_rds +@mock_resourcegroupstaggingapi +def test_get_resources_rds_clusters(): + client = boto3.client("rds", region_name="us-west-2") + resources_tagged = [] + resources_untagged = [] + for i in range(3): + cluster = client.create_db_cluster( + DBClusterIdentifier=f"db-cluster-{i}", + Engine="postgres", + MasterUsername="admin", + MasterUserPassword="P@ssw0rd!", + CopyTagsToSnapshot=True if i else False, + Tags=[{"Key": "test", "Value": f"value-{i}"}] if i else [], + ).get("DBCluster") + snapshot = client.create_db_cluster_snapshot( + DBClusterIdentifier=cluster["DBClusterIdentifier"], + DBClusterSnapshotIdentifier=f"snapshot-{i}", + ).get("DBClusterSnapshot") + group = resources_tagged if i else resources_untagged + group.append(cluster["DBClusterArn"]) + group.append(snapshot["DBClusterSnapshotArn"]) + + def assert_response(response, expected_count, resource_type=None): + results = response.get("ResourceTagMappingList", []) + results.should.have.length_of(expected_count) + for item in results: + arn = item["ResourceARN"] + arn.should.be.within(resources_tagged) + arn.should_not.be.within(resources_untagged) + if resource_type: + sure.this(f":{resource_type}:").should.be.within(arn) + + rtapi = boto3.client("resourcegroupstaggingapi", region_name="us-west-2") + resp = rtapi.get_resources(ResourceTypeFilters=["rds"]) + assert_response(resp, 4) + resp = rtapi.get_resources(ResourceTypeFilters=["rds:cluster"]) + assert_response(resp, 2, resource_type="cluster") + resp = rtapi.get_resources(ResourceTypeFilters=["rds:cluster-snapshot"]) + assert_response(resp, 2, resource_type="cluster-snapshot") + resp = rtapi.get_resources(TagFilters=[{"Key": "test", "Values": ["value-1"]}]) + assert_response(resp, 2) + + @mock_lambda @mock_resourcegroupstaggingapi @mock_iam