From 457402fbe2447519feddfbb783d104e23fadf2ca Mon Sep 17 00:00:00 2001 From: Joakim Saario Date: Tue, 2 Mar 2021 10:00:26 +0100 Subject: [PATCH] Support SSM Parameter tags (#3739) --- moto/ssm/models.py | 11 ++++++++++- moto/ssm/responses.py | 3 ++- tests/test_ssm/test_ssm_boto3.py | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/moto/ssm/models.py b/moto/ssm/models.py index 538e700f8..8743e129c 100644 --- a/moto/ssm/models.py +++ b/moto/ssm/models.py @@ -46,6 +46,7 @@ class Parameter(BaseModel): keyid, last_modified_date, version, + tags=None, ): self.name = name self.type = type @@ -54,6 +55,7 @@ class Parameter(BaseModel): self.keyid = keyid self.last_modified_date = last_modified_date self.version = version + self.tags = tags or [] self.labels = [] if self.type == "SecureString": @@ -1151,6 +1153,12 @@ class SimpleSystemManagerBackend(BaseBackend): values = ["/" + value.strip("/") for value in values] elif key == "Type": what = parameter.type + elif key.startswith("tag:"): + what = key[4:] or None + for tag in parameter.tags: + if tag["Key"] == what and tag["Value"] in values: + return True + return False if what is None: return False @@ -1274,7 +1282,7 @@ class SimpleSystemManagerBackend(BaseBackend): return [invalid_labels, version] def put_parameter( - self, name, description, value, type, allowed_pattern, keyid, overwrite + self, name, description, value, type, allowed_pattern, keyid, overwrite, tags, ): if name.lower().lstrip("/").startswith("aws") or name.lower().lstrip( "/" @@ -1315,6 +1323,7 @@ class SimpleSystemManagerBackend(BaseBackend): keyid, last_modified_date, version, + tags or [], ) ) return version diff --git a/moto/ssm/responses.py b/moto/ssm/responses.py index 66606c283..be298d5bc 100644 --- a/moto/ssm/responses.py +++ b/moto/ssm/responses.py @@ -247,9 +247,10 @@ class SimpleSystemManagerResponse(BaseResponse): allowed_pattern = self._get_param("AllowedPattern") keyid = self._get_param("KeyId") overwrite = self._get_param("Overwrite", False) + tags = self._get_param("Tags", []) result = self.ssm_backend.put_parameter( - name, description, value, type_, allowed_pattern, keyid, overwrite + name, description, value, type_, allowed_pattern, keyid, overwrite, tags ) if result is None: diff --git a/tests/test_ssm/test_ssm_boto3.py b/tests/test_ssm/test_ssm_boto3.py index 8f46b1712..6c4a20025 100644 --- a/tests/test_ssm/test_ssm_boto3.py +++ b/tests/test_ssm/test_ssm_boto3.py @@ -962,6 +962,28 @@ def test_describe_parameters_attributes(): parameters[1]["Version"].should.equal(1) +@mock_ssm +def test_describe_parameters_tags(): + client = boto3.client("ssm", region_name="us-east-1") + + client.put_parameter(Name="/foo/bar", Value="spam", Type="String") + client.put_parameter( + Name="/spam/eggs", + Value="eggs", + Type="String", + Tags=[{"Key": "spam", "Value": "eggs"}], + ) + + response = client.describe_parameters( + ParameterFilters=[{"Key": "tag:spam", "Values": ["eggs"]}] + ) + + parameters = response["Parameters"] + parameters.should.have.length_of(1) + + parameters[0]["Name"].should.equal("/spam/eggs") + + @mock_ssm def test_get_parameter_invalid(): client = client = boto3.client("ssm", region_name="us-east-1")