From cf7e07b728e10ad47d067084f6816c4b7b440c4a Mon Sep 17 00:00:00 2001 From: Terry Cain Date: Mon, 18 Sep 2017 14:13:02 +0100 Subject: [PATCH 1/3] Added GetParameter support --- moto/ssm/models.py | 5 +++++ moto/ssm/responses.py | 19 +++++++++++++++++++ tests/test_ssm/test_ssm_boto3.py | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/moto/ssm/models.py b/moto/ssm/models.py index bbb84ad9..a0e4a215 100644 --- a/moto/ssm/models.py +++ b/moto/ssm/models.py @@ -75,6 +75,11 @@ class SimpleSystemManagerBackend(BaseBackend): result.append(self._parameters[name]) return result + def get_parameter(self, name, with_decryption): + if name in self._parameters: + return self._parameters[name] + return None + def put_parameter(self, name, description, value, type, keyid, overwrite): if not overwrite and name in self._parameters: return diff --git a/moto/ssm/responses.py b/moto/ssm/responses.py index 7c31a6dd..a2673f7e 100644 --- a/moto/ssm/responses.py +++ b/moto/ssm/responses.py @@ -42,6 +42,25 @@ class SimpleSystemManagerResponse(BaseResponse): response['InvalidParameters'].append(name) return json.dumps(response) + def get_parameter(self): + name = self._get_param('Name') + with_decryption = self._get_param('WithDecryption') + + result = self.ssm_backend.get_parameter(name, with_decryption) + + if result is None: + return '', dict(status=400) + + response = { + 'Parameter': { + 'Name': name, + 'Type': result.type, + 'Value': result.value + } + } + + return json.dumps(response) + def get_parameters(self): names = self._get_param('Names') with_decryption = self._get_param('WithDecryption') diff --git a/tests/test_ssm/test_ssm_boto3.py b/tests/test_ssm/test_ssm_boto3.py index 7a783299..859ec7a8 100644 --- a/tests/test_ssm/test_ssm_boto3.py +++ b/tests/test_ssm/test_ssm_boto3.py @@ -66,6 +66,25 @@ def test_put_parameter(): response['Parameters'][0]['Type'].should.equal('String') +@mock_ssm +def test_get_parameter(): + client = boto3.client('ssm', region_name='us-east-1') + + client.put_parameter( + Name='test', + Description='A test parameter', + Value='value', + Type='String') + + response = client.get_parameter( + Name='test', + WithDecryption=False) + + response['Parameter']['Name'].should.equal('test') + response['Parameter']['Value'].should.equal('value') + response['Parameter']['Type'].should.equal('String') + + @mock_ssm def test_describe_parameters(): client = boto3.client('ssm', region_name='us-east-1') From 783c287e51c1614cd8341ede263c914aad691449 Mon Sep 17 00:00:00 2001 From: Terry Cain Date: Mon, 18 Sep 2017 21:27:56 +0100 Subject: [PATCH 2/3] Added non existant parameter test + needed error responses --- moto/ssm/responses.py | 6 +++++- tests/test_ssm/test_ssm_boto3.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/moto/ssm/responses.py b/moto/ssm/responses.py index a2673f7e..ca033969 100644 --- a/moto/ssm/responses.py +++ b/moto/ssm/responses.py @@ -49,7 +49,11 @@ class SimpleSystemManagerResponse(BaseResponse): result = self.ssm_backend.get_parameter(name, with_decryption) if result is None: - return '', dict(status=400) + error = { + '__type': 'ParameterNotFound', + 'message': 'Parameter {0} not found.'.format(name) + } + return json.dumps(error), dict(status=400) response = { 'Parameter': { diff --git a/tests/test_ssm/test_ssm_boto3.py b/tests/test_ssm/test_ssm_boto3.py index 859ec7a8..2374ebf3 100644 --- a/tests/test_ssm/test_ssm_boto3.py +++ b/tests/test_ssm/test_ssm_boto3.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals import boto3 +import botocore.exceptions import sure # noqa from moto import mock_ssm @@ -85,6 +86,20 @@ def test_get_parameter(): response['Parameter']['Type'].should.equal('String') +@mock_ssm +def test_get_nonexistant_parameter(): + client = boto3.client('ssm', region_name='us-east-1') + + try: + client.get_parameter( + Name='test_noexist', + WithDecryption=False) + raise RuntimeError('Should of failed') + except botocore.exceptions.ClientError as err: + err.operation_name.should.equal('GetParameter') + err.response['Error']['Message'].should.equal('Parameter test_noexist not found.') + + @mock_ssm def test_describe_parameters(): client = boto3.client('ssm', region_name='us-east-1') From 81026dd1d7cce227706459251fb42652c771123a Mon Sep 17 00:00:00 2001 From: Terry Cain Date: Mon, 18 Sep 2017 21:46:07 +0100 Subject: [PATCH 3/3] Newlines for more pep8 compliance --- tests/test_ssm/test_ssm_boto3.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_ssm/test_ssm_boto3.py b/tests/test_ssm/test_ssm_boto3.py index 2374ebf3..7f4aca53 100644 --- a/tests/test_ssm/test_ssm_boto3.py +++ b/tests/test_ssm/test_ssm_boto3.py @@ -25,6 +25,7 @@ def test_delete_parameter(): response = client.get_parameters(Names=['test']) len(response['Parameters']).should.equal(0) + @mock_ssm def test_delete_parameters(): client = boto3.client('ssm', region_name='us-east-1') @@ -45,6 +46,7 @@ def test_delete_parameters(): response = client.get_parameters(Names=['test']) len(response['Parameters']).should.equal(0) + @mock_ssm def test_put_parameter(): client = boto3.client('ssm', region_name='us-east-1') @@ -313,6 +315,7 @@ 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_add_remove_list_tags_for_resource(): client = boto3.client('ssm', region_name='us-east-1')