diff --git a/moto/secretsmanager/exceptions.py b/moto/secretsmanager/exceptions.py new file mode 100644 index 000000000..99d74f281 --- /dev/null +++ b/moto/secretsmanager/exceptions.py @@ -0,0 +1,15 @@ +from __future__ import unicode_literals +from moto.core.exceptions import JsonRESTError + + +class SecretsManagerClientError(JsonRESTError): + code = 400 + + +class ResourceNotFoundException(SecretsManagerClientError): + def __init__(self): + self.code = 404 + super(ResourceNotFoundException, self).__init__( + "ResourceNotFoundException", + "Secrets Manager can't find the specified secret" + ) diff --git a/moto/secretsmanager/models.py b/moto/secretsmanager/models.py index fb09d20e4..a553953d4 100644 --- a/moto/secretsmanager/models.py +++ b/moto/secretsmanager/models.py @@ -6,14 +6,17 @@ import json import boto3 from moto.core import BaseBackend, BaseModel +from .exceptions import ResourceNotFoundException class SecretsManager(BaseModel): def __init__(self, region_name, **kwargs): + self.region = region_name self.secret_id = kwargs.get('secret_id', '') self.version_id = kwargs.get('version_id', '') self.version_stage = kwargs.get('version_stage', '') + self.secret_string = '' class SecretsManagerBackend(BaseBackend): @@ -22,15 +25,25 @@ class SecretsManagerBackend(BaseBackend): super(SecretsManagerBackend, self).__init__() self.region = region_name self.secret_id = kwargs.get('secret_id', '') + self.name = kwargs.get('name', '') self.createdate = int(time.time()) + self.secret_string = '' + + def reset(self): + region_name = self.region + self.__dict__ = {} + self.__init__(region_name) def get_secret_value(self, secret_id, version_id, version_stage): + if self.secret_id == '': + raise ResourceNotFoundException() + response = json.dumps({ - "ARN": self.secret_arn(), + "ARN": self.secret_arn(self.region, self.secret_id), "Name": self.secret_id, "VersionId": "A435958A-D821-4193-B719-B7769357AER4", - "SecretString": "mysecretstring", + "SecretString": self.secret_string, "VersionStages": [ "AWSCURRENT", ], @@ -39,11 +52,26 @@ class SecretsManagerBackend(BaseBackend): return response - def secret_arn(self): + def create_secret(self, name, secret_string, **kwargs): + + self.secret_string = secret_string + self.secret_id = name + + response = json.dumps({ + "ARN": self.secret_arn(self.region, name), + "Name": self.secret_id, + "VersionId": "A435958A-D821-4193-B719-B7769357AER4", + }) + + return response + + def secret_arn(self, region, secret_id): return "arn:aws:secretsmanager:{0}:1234567890:secret:{1}-rIjad".format( - self.region, self.secret_id) + region, secret_id) -available_regions = boto3.session.Session().get_available_regions("secretsmanager") -print(available_regions) -secretsmanager_backends = {region: SecretsManagerBackend(region_name=region) for region in available_regions} +available_regions = ( + boto3.session.Session().get_available_regions("secretsmanager") +) +secretsmanager_backends = {region: SecretsManagerBackend(region_name=region) + for region in available_regions} diff --git a/moto/secretsmanager/responses.py b/moto/secretsmanager/responses.py index 144a254ec..52a838732 100644 --- a/moto/secretsmanager/responses.py +++ b/moto/secretsmanager/responses.py @@ -15,3 +15,11 @@ class SecretsManagerResponse(BaseResponse): secret_id=secret_id, version_id=version_id, version_stage=version_stage) + + def create_secret(self): + name = self._get_param('Name') + secret_string = self._get_param('SecretString') + return secretsmanager_backends[self.region].create_secret( + name=name, + secret_string=secret_string + ) diff --git a/tests/test_secretsmanager/test_secretsmanager.py b/tests/test_secretsmanager/test_secretsmanager.py index df4f0f69e..d5abd6abd 100644 --- a/tests/test_secretsmanager/test_secretsmanager.py +++ b/tests/test_secretsmanager/test_secretsmanager.py @@ -3,11 +3,33 @@ from __future__ import unicode_literals import boto3 from moto import mock_secretsmanager +from botocore.exceptions import ClientError import sure # noqa +from nose.tools import assert_raises @mock_secretsmanager def test_get_secret_value(): conn = boto3.client('secretsmanager', region_name='us-west-2') + create_secret = conn.create_secret(Name='java-util-test-password', + SecretString="foosecret") result = conn.get_secret_value(SecretId='java-util-test-password') - assert result['SecretString'] == 'mysecretstring' + assert result['SecretString'] == 'foosecret' + +@mock_secretsmanager +def test_get_secret_that_does_not_exist(): + conn = boto3.client('secretsmanager', region_name='us-west-2') + + with assert_raises(ClientError): + result = conn.get_secret_value(SecretId='i-dont-exist') + +@mock_secretsmanager +def test_create_secret(): + conn = boto3.client('secretsmanager', region_name='us-east-1') + + result = conn.create_secret(Name='test-secret', SecretString="foosecret") + assert result['ARN'] == ( + 'arn:aws:secretsmanager:us-east-1:1234567890:secret:test-secret-rIjad') + assert result['Name'] == 'test-secret' + secret = conn.get_secret_value(SecretId='test-secret') + assert secret['SecretString'] == 'foosecret' diff --git a/tests/test_secretsmanager/test_server.py b/tests/test_secretsmanager/test_server.py index 142e9fe7d..2f73ece07 100644 --- a/tests/test_secretsmanager/test_server.py +++ b/tests/test_secretsmanager/test_server.py @@ -7,7 +7,7 @@ import moto.server as server from moto import mock_secretsmanager ''' -Test the different server responses +Test the different server responses for secretsmanager ''' @@ -17,11 +17,52 @@ def test_get_secret_value(): backend = server.create_backend_app("secretsmanager") test_client = backend.test_client() - res = test_client.post('/', - data={"SecretId": "test", "VersionStage": "AWSCURRENT"}, + create_secret = test_client.post('/', + data={"Name": "test-secret", + "SecretString": "foo-secret"}, + headers={ + "X-Amz-Target": "secretsmanager.CreateSecret"}, + ) + get_secret = test_client.post('/', + data={"SecretId": "test-secret", + "VersionStage": "AWSCURRENT"}, headers={ "X-Amz-Target": "secretsmanager.GetSecretValue"}, ) + json_data = json.loads(get_secret.data.decode("utf-8")) + assert json_data['SecretString'] == 'foo-secret' + +@mock_secretsmanager +def test_get_secret_that_does_not_exist(): + + backend = server.create_backend_app("secretsmanager") + test_client = backend.test_client() + + get_secret = test_client.post('/', + data={"SecretId": "i-dont-exist", + "VersionStage": "AWSCURRENT"}, + headers={ + "X-Amz-Target": "secretsmanager.GetSecretValue"}, + ) + json_data = json.loads(get_secret.data.decode("utf-8")) + assert json_data['message'] == "Secrets Manager can't find the specified secret" + assert json_data['__type'] == 'ResourceNotFoundException' + +@mock_secretsmanager +def test_create_secret(): + + backend = server.create_backend_app("secretsmanager") + test_client = backend.test_client() + + res = test_client.post('/', + data={"Name": "test-secret", + "SecretString": "foo-secret"}, + headers={ + "X-Amz-Target": "secretsmanager.CreateSecret"}, + ) + json_data = json.loads(res.data.decode("utf-8")) - assert json_data['SecretString'] == "mysecretstring" + assert json_data['ARN'] == ( + 'arn:aws:secretsmanager:us-east-1:1234567890:secret:test-secret-rIjad') + assert json_data['Name'] == 'test-secret'