Skip to content

Commit 6b38789

Browse files
TaggingService: Allow key value field names to be overridden (#12306)
1 parent 3cac154 commit 6b38789

File tree

2 files changed

+48
-23
lines changed

2 files changed

+48
-23
lines changed

localstack-core/localstack/utils/tagging.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@
22

33

44
class TaggingService:
5-
def __init__(self):
5+
def __init__(self, key_field: str = None, value_field: str = None):
6+
"""
7+
:param key_field: the field name representing the tag key as used by botocore specs
8+
:param value_field: the field name representing the tag value as used by botocore specs
9+
"""
10+
self.key_field = key_field or "Key"
11+
self.value_field = value_field or "Value"
12+
613
self.tags = {}
714

815
def list_tags_for_resource(self, arn: str, root_name: Optional[str] = None):
916
root_name = root_name or "Tags"
17+
1018
result = []
1119
if arn in self.tags:
1220
for k, v in self.tags[arn].items():
13-
result.append({"Key": k, "Value": v})
21+
result.append({self.key_field: k, self.value_field: v})
1422
return {root_name: result}
1523

1624
def tag_resource(self, arn: str, tags: List[Dict[str, str]]):
@@ -19,7 +27,7 @@ def tag_resource(self, arn: str, tags: List[Dict[str, str]]):
1927
if arn not in self.tags:
2028
self.tags[arn] = {}
2129
for t in tags:
22-
self.tags[arn][t["Key"]] = t["Value"]
30+
self.tags[arn][t[self.key_field]] = t[self.value_field]
2331

2432
def untag_resource(self, arn: str, tag_names: List[str]):
2533
tags = self.tags.get(arn, {})

tests/unit/test_tagging.py

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,47 @@
1-
import unittest
1+
import pytest
22

33
from localstack.utils.tagging import TaggingService
44

55

6-
class TestTaggingService(unittest.TestCase):
7-
svc = TaggingService()
6+
class TestTaggingService:
7+
@pytest.fixture
8+
def tagging_service(self):
9+
def _factory(**kwargs):
10+
return TaggingService(**kwargs)
811

9-
def test_list_empty(self):
10-
result = self.svc.list_tags_for_resource("test")
11-
self.assertEqual({"Tags": []}, result)
12+
return _factory
1213

13-
def test_create_tag(self):
14+
def test_list_empty(self, tagging_service):
15+
svc = tagging_service()
16+
result = svc.list_tags_for_resource("test")
17+
assert result == {"Tags": []}
18+
19+
def test_create_tag(self, tagging_service):
20+
svc = tagging_service()
1421
tags = [{"Key": "key_key", "Value": "value_value"}]
15-
self.svc.tag_resource("arn", tags)
16-
actual = self.svc.list_tags_for_resource("arn")
22+
svc.tag_resource("arn", tags)
23+
actual = svc.list_tags_for_resource("arn")
1724
expected = {"Tags": [{"Key": "key_key", "Value": "value_value"}]}
18-
self.assertDictEqual(expected, actual)
25+
assert actual == expected
1926

20-
def test_delete_tag(self):
27+
def test_delete_tag(self, tagging_service):
28+
svc = tagging_service()
2129
tags = [{"Key": "key_key", "Value": "value_value"}]
22-
self.svc.tag_resource("arn", tags)
23-
self.svc.untag_resource("arn", ["key_key"])
24-
result = self.svc.list_tags_for_resource("arn")
25-
self.assertEqual({"Tags": []}, result)
26-
27-
def test_list_empty_delete(self):
28-
self.svc.untag_resource("arn", ["key_key"])
29-
result = self.svc.list_tags_for_resource("arn")
30-
self.assertEqual({"Tags": []}, result)
30+
svc.tag_resource("arn", tags)
31+
svc.untag_resource("arn", ["key_key"])
32+
result = svc.list_tags_for_resource("arn")
33+
assert result == {"Tags": []}
34+
35+
def test_list_empty_delete(self, tagging_service):
36+
svc = tagging_service()
37+
svc.untag_resource("arn", ["key_key"])
38+
result = svc.list_tags_for_resource("arn")
39+
assert result == {"Tags": []}
40+
41+
def test_field_name_override(self, tagging_service):
42+
svc = tagging_service(key_field="keY", value_field="valuE")
43+
tags = [{"keY": "my", "valuE": "congratulations"}]
44+
svc.tag_resource("arn", tags)
45+
assert svc.list_tags_for_resource("arn") == {
46+
"Tags": [{"keY": "my", "valuE": "congratulations"}]
47+
}

0 commit comments

Comments
 (0)