From aeb7974549fc4443be44fe62158996670a339e3b Mon Sep 17 00:00:00 2001 From: William Richard Date: Mon, 4 Nov 2019 12:49:09 -0500 Subject: [PATCH] Add get_parameter_history implementation and tests --- moto/ssm/models.py | 5 ++- moto/ssm/responses.py | 13 ++++++++ tests/test_ssm/test_ssm_boto3.py | 54 ++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/moto/ssm/models.py b/moto/ssm/models.py index 0f58a5ad5..e4f1727be 100644 --- a/moto/ssm/models.py +++ b/moto/ssm/models.py @@ -527,7 +527,10 @@ class SimpleSystemManagerBackend(BaseBackend): return result - return result + def get_parameter_history(self, name, with_decryption): + if name in self._parameters: + return self._parameters[name] + return None def _match_filters(self, parameter, filters=None): """Return True if the given parameter matches all the filters""" diff --git a/moto/ssm/responses.py b/moto/ssm/responses.py index 0bb034428..2711e5c6e 100644 --- a/moto/ssm/responses.py +++ b/moto/ssm/responses.py @@ -139,6 +139,19 @@ class SimpleSystemManagerResponse(BaseResponse): response = {"Version": result} return json.dumps(response) + def get_parameter_history(self): + name = self._get_param('Name') + with_decryption = self._get_param("WithDecryption") + + result = self.ssm_backend.get_parameter_history(name, with_decryption) + + response = {"Parameters": []} + for parameter_version in result: + param_data = parameter_version.describe_response_object(decrypt=with_decryption) + response['Parameters'].append(param_data) + + return json.dumps(response) + def add_tags_to_resource(self): resource_id = self._get_param("ResourceId") resource_type = self._get_param("ResourceType") diff --git a/tests/test_ssm/test_ssm_boto3.py b/tests/test_ssm/test_ssm_boto3.py index d50ceb528..0c8874c7b 100644 --- a/tests/test_ssm/test_ssm_boto3.py +++ b/tests/test_ssm/test_ssm_boto3.py @@ -813,6 +813,60 @@ def test_put_parameter_secure_custom_kms(): response["Parameters"][0]["Value"].should.equal("value") response["Parameters"][0]["Type"].should.equal("SecureString") +@mock_ssm +def test_get_parameter_history(): + client = boto3.client("ssm", region_name="us-east-1") + + test_parameter_name = "test" + + for i in range(3): + client.put_parameter( + Name=test_parameter_name, Description="A test parameter version %d" % i, Value="value-%d" % i, Type="String", + Overwrite=True + ) + + response = client.get_parameter_history(Name=test_parameter_name) + parameters_response = response['Parameters'] + + for index, param in enumerate(parameters_response): + param['Name'].should.equal(test_parameter_name) + param['Type'].should.equal('String') + param['Value'].should.equal('value-%d' % index) + param['Version'].should.equal(index + 1) + param['Description'].should.equal("A test parameter version %d" % index) + + len(parameters_response).should.equal(3) + +@mock_ssm +def test_get_parameter_history_with_secure_string(): + client = boto3.client("ssm", region_name="us-east-1") + + test_parameter_name = "test" + + for i in range(3): + client.put_parameter( + Name=test_parameter_name, Description="A test parameter version %d" % i, Value="value-%d" % i, Type="SecureString", + Overwrite=True + ) + + for with_decryption in [True, False]: + response = client.get_parameter_history(Name=test_parameter_name, WithDecryption=with_decryption) + parameters_response = response['Parameters'] + + for index, param in enumerate(parameters_response): + param['Name'].should.equal(test_parameter_name) + param['Type'].should.equal('SecureString') + expected_plaintext_value = 'value-%d' % index + if with_decryption: + param['Value'].should.equal(expected_plaintext_value) + else: + param['Value'].should.equal('kms:alias/aws/ssm:%s' % expected_plaintext_value) + param['Version'].should.equal(index + 1) + param['Description'].should.equal("A test parameter version %d" % index) + + len(parameters_response).should.equal(3) + + @mock_ssm def test_add_remove_list_tags_for_resource():