diff --git a/moto/ssm/models.py b/moto/ssm/models.py index f1aac336b..63cb3c8ba 100644 --- a/moto/ssm/models.py +++ b/moto/ssm/models.py @@ -1,5 +1,7 @@ from __future__ import unicode_literals +from collections import defaultdict + from moto.core import BaseBackend, BaseModel from moto.ec2 import ec2_backends @@ -42,6 +44,7 @@ class SimpleSystemManagerBackend(BaseBackend): def __init__(self): self._parameters = {} + self._resource_tags = defaultdict(lambda: defaultdict(dict)) def delete_parameter(self, name): try: @@ -68,6 +71,19 @@ class SimpleSystemManagerBackend(BaseBackend): self._parameters[name] = Parameter( name, value, type, description, keyid) + def add_tags_to_resource(self, resource_type, resource_id, tags): + for key, value in tags.items(): + self._resource_tags[resource_type][resource_id][key] = value + + def remove_tags_from_resource(self, resource_type, resource_id, keys): + tags = self._resource_tags[resource_type][resource_id] + for key in keys: + if key in tags: + del tags[key] + + def list_tags_for_resource(self, resource_type, resource_id): + return self._resource_tags[resource_type][resource_id] + ssm_backends = {} for region, ec2_backend in ec2_backends.items(): diff --git a/moto/ssm/responses.py b/moto/ssm/responses.py index 09fe6d0c2..1fa1a81b2 100644 --- a/moto/ssm/responses.py +++ b/moto/ssm/responses.py @@ -108,3 +108,28 @@ class SimpleSystemManagerResponse(BaseResponse): self.ssm_backend.put_parameter( name, description, value, type_, keyid, overwrite) return json.dumps({}) + + def add_tags_to_resource(self): + resource_id = self._get_param('ResourceId') + resource_type = self._get_param('ResourceType') + tags = {t['Key']: t['Value'] for t in self._get_param('Tags')} + self.ssm_backend.add_tags_to_resource( + resource_id, resource_type, tags) + return json.dumps({}) + + def remove_tags_from_resource(self): + resource_id = self._get_param('ResourceId') + resource_type = self._get_param('ResourceType') + keys = self._get_param('TagKeys') + self.ssm_backend.remove_tags_from_resource( + resource_id, resource_type, keys) + return json.dumps({}) + + def list_tags_for_resource(self): + resource_id = self._get_param('ResourceId') + resource_type = self._get_param('ResourceType') + tags = self.ssm_backend.list_tags_for_resource( + resource_id, resource_type) + tag_list = [{'Key': k, 'Value': v} for (k, v) in tags.items()] + response = {'TagList': tag_list} + return json.dumps(response) diff --git a/tests/test_ssm/test_ssm_boto3.py b/tests/test_ssm/test_ssm_boto3.py index 60a027933..418c58708 100644 --- a/tests/test_ssm/test_ssm_boto3.py +++ b/tests/test_ssm/test_ssm_boto3.py @@ -247,3 +247,33 @@ def test_put_parameter_secure_custom_kms(): response['Parameters'][0]['Name'].should.equal('test') response['Parameters'][0]['Value'].should.equal('value') response['Parameters'][0]['Type'].should.equal('SecureString') + +@mock_ssm +def test_add_remove_list_tags_for_resource(): + client = boto3.client('ssm', region_name='us-east-1') + + client.add_tags_to_resource( + ResourceId='test', + ResourceType='Parameter', + Tags=[{'Key': 'test-key', 'Value': 'test-value'}] + ) + + response = client.list_tags_for_resource( + ResourceId='test', + ResourceType='Parameter' + ) + len(response['TagList']).should.equal(1) + response['TagList'][0]['Key'].should.equal('test-key') + response['TagList'][0]['Value'].should.equal('test-value') + + client.remove_tags_from_resource( + ResourceId='test', + ResourceType='Parameter', + TagKeys=['test-key'] + ) + + response = client.list_tags_for_resource( + ResourceId='test', + ResourceType='Parameter' + ) + len(response['TagList']).should.equal(0)