diff --git a/moto/kms/models.py b/moto/kms/models.py index b4eeb638d..7ea40d8b4 100644 --- a/moto/kms/models.py +++ b/moto/kms/models.py @@ -346,7 +346,8 @@ class KmsBackend(BaseBackend): return plaintext, ciphertext_blob, arn - def list_resource_tags(self, key_id): + def list_resource_tags(self, key_id_or_arn): + key_id = self.get_key_id(key_id_or_arn) if key_id in self.keys: return self.tagger.list_tags_for_resource(key_id) raise JsonRESTError( @@ -354,7 +355,8 @@ class KmsBackend(BaseBackend): "The request was rejected because the specified entity or resource could not be found.", ) - def tag_resource(self, key_id, tags): + def tag_resource(self, key_id_or_arn, tags): + key_id = self.get_key_id(key_id_or_arn) if key_id in self.keys: self.tagger.tag_resource(key_id, tags) return {} @@ -363,7 +365,8 @@ class KmsBackend(BaseBackend): "The request was rejected because the specified entity or resource could not be found.", ) - def untag_resource(self, key_id, tag_names): + def untag_resource(self, key_id_or_arn, tag_names): + key_id = self.get_key_id(key_id_or_arn) if key_id in self.keys: self.tagger.untag_resource_using_names(key_id, tag_names) return {} diff --git a/tests/test_kms/test_kms.py b/tests/test_kms/test_kms.py index ba4ef1707..2e0af4c5a 100644 --- a/tests/test_kms/test_kms.py +++ b/tests/test_kms/test_kms.py @@ -671,6 +671,18 @@ def test__assert_default_policy(): sort = lambda l: sorted(l, key=lambda d: d.keys()) +def _check_tags(key_id, created_tags, client): + result = client.list_resource_tags(KeyId=key_id) + actual = result.get("Tags", []) + assert sort(created_tags) == sort(actual) + + client.untag_resource(KeyId=key_id, TagKeys=["key1"]) + + actual = client.list_resource_tags(KeyId=key_id).get("Tags", []) + expected = [{"TagKey": "key2", "TagValue": "value2"}] + assert sort(expected) == sort(actual) + + @mock_kms def test_key_tag_on_create_key_happy(): client = boto3.client("kms", region_name="us-east-1") @@ -680,17 +692,19 @@ def test_key_tag_on_create_key_happy(): {"TagKey": "key2", "TagValue": "value2"}, ] key = client.create_key(Description="test-key-tagging", Tags=tags) - key_id = key["KeyMetadata"]["KeyId"] + _check_tags(key["KeyMetadata"]["KeyId"], tags, client) - result = client.list_resource_tags(KeyId=key_id) - actual = result.get("Tags", []) - assert sort(tags) == sort(actual) - client.untag_resource(KeyId=key_id, TagKeys=["key1"]) +@mock_kms +def test_key_tag_on_create_key_on_arn_happy(): + client = boto3.client("kms", region_name="us-east-1") - actual = client.list_resource_tags(KeyId=key_id).get("Tags", []) - expected = [{"TagKey": "key2", "TagValue": "value2"}] - assert sort(expected) == sort(actual) + tags = [ + {"TagKey": "key1", "TagValue": "value1"}, + {"TagKey": "key2", "TagValue": "value2"}, + ] + key = client.create_key(Description="test-key-tagging", Tags=tags) + _check_tags(key["KeyMetadata"]["Arn"], tags, client) @mock_kms @@ -704,16 +718,21 @@ def test_key_tag_added_happy(): {"TagKey": "key2", "TagValue": "value2"}, ] client.tag_resource(KeyId=key_id, Tags=tags) + _check_tags(key_id, tags, client) - result = client.list_resource_tags(KeyId=key_id) - actual = result.get("Tags", []) - assert sort(tags) == sort(actual) - client.untag_resource(KeyId=key_id, TagKeys=["key1"]) +@mock_kms +def test_key_tag_added_arn_based_happy(): + client = boto3.client("kms", region_name="us-east-1") - actual = client.list_resource_tags(KeyId=key_id).get("Tags", []) - expected = [{"TagKey": "key2", "TagValue": "value2"}] - assert sort(expected) == sort(actual) + key = client.create_key(Description="test-key-tagging") + key_id = key["KeyMetadata"]["Arn"] + tags = [ + {"TagKey": "key1", "TagValue": "value1"}, + {"TagKey": "key2", "TagValue": "value2"}, + ] + client.tag_resource(KeyId=key_id, Tags=tags) + _check_tags(key_id, tags, client) @mock_kms_deprecated diff --git a/tests/test_kms/test_kms_boto3.py b/tests/test_kms/test_kms_boto3.py index 8b29ad748..34d0a6a4d 100644 --- a/tests/test_kms/test_kms_boto3.py +++ b/tests/test_kms/test_kms_boto3.py @@ -398,6 +398,20 @@ def test_list_resource_tags(): assert response["Tags"][0]["TagValue"] == "string" +@mock_kms +def test_list_resource_tags_with_arn(): + client = boto3.client("kms", region_name="us-east-1") + key = client.create_key(Description="cancel-key-deletion") + client.schedule_key_deletion(KeyId=key["KeyMetadata"]["KeyId"]) + + keyid = key["KeyMetadata"]["Arn"] + client.tag_resource(KeyId=keyid, Tags=[{"TagKey": "string", "TagValue": "string"}]) + + response = client.list_resource_tags(KeyId=keyid) + assert response["Tags"][0]["TagKey"] == "string" + assert response["Tags"][0]["TagValue"] == "string" + + @pytest.mark.parametrize( "kwargs,expected_key_length", (