Adding create_secret, exception handle, fix (#1680)
This commit is contained in:
parent
c20e8568e0
commit
ba1ceee95f
15
moto/secretsmanager/exceptions.py
Normal file
15
moto/secretsmanager/exceptions.py
Normal file
@ -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"
|
||||||
|
)
|
@ -6,14 +6,17 @@ import json
|
|||||||
import boto3
|
import boto3
|
||||||
|
|
||||||
from moto.core import BaseBackend, BaseModel
|
from moto.core import BaseBackend, BaseModel
|
||||||
|
from .exceptions import ResourceNotFoundException
|
||||||
|
|
||||||
|
|
||||||
class SecretsManager(BaseModel):
|
class SecretsManager(BaseModel):
|
||||||
|
|
||||||
def __init__(self, region_name, **kwargs):
|
def __init__(self, region_name, **kwargs):
|
||||||
|
self.region = region_name
|
||||||
self.secret_id = kwargs.get('secret_id', '')
|
self.secret_id = kwargs.get('secret_id', '')
|
||||||
self.version_id = kwargs.get('version_id', '')
|
self.version_id = kwargs.get('version_id', '')
|
||||||
self.version_stage = kwargs.get('version_stage', '')
|
self.version_stage = kwargs.get('version_stage', '')
|
||||||
|
self.secret_string = ''
|
||||||
|
|
||||||
|
|
||||||
class SecretsManagerBackend(BaseBackend):
|
class SecretsManagerBackend(BaseBackend):
|
||||||
@ -22,15 +25,25 @@ class SecretsManagerBackend(BaseBackend):
|
|||||||
super(SecretsManagerBackend, self).__init__()
|
super(SecretsManagerBackend, self).__init__()
|
||||||
self.region = region_name
|
self.region = region_name
|
||||||
self.secret_id = kwargs.get('secret_id', '')
|
self.secret_id = kwargs.get('secret_id', '')
|
||||||
|
self.name = kwargs.get('name', '')
|
||||||
self.createdate = int(time.time())
|
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):
|
def get_secret_value(self, secret_id, version_id, version_stage):
|
||||||
|
|
||||||
|
if self.secret_id == '':
|
||||||
|
raise ResourceNotFoundException()
|
||||||
|
|
||||||
response = json.dumps({
|
response = json.dumps({
|
||||||
"ARN": self.secret_arn(),
|
"ARN": self.secret_arn(self.region, self.secret_id),
|
||||||
"Name": self.secret_id,
|
"Name": self.secret_id,
|
||||||
"VersionId": "A435958A-D821-4193-B719-B7769357AER4",
|
"VersionId": "A435958A-D821-4193-B719-B7769357AER4",
|
||||||
"SecretString": "mysecretstring",
|
"SecretString": self.secret_string,
|
||||||
"VersionStages": [
|
"VersionStages": [
|
||||||
"AWSCURRENT",
|
"AWSCURRENT",
|
||||||
],
|
],
|
||||||
@ -39,11 +52,26 @@ class SecretsManagerBackend(BaseBackend):
|
|||||||
|
|
||||||
return response
|
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(
|
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")
|
available_regions = (
|
||||||
print(available_regions)
|
boto3.session.Session().get_available_regions("secretsmanager")
|
||||||
secretsmanager_backends = {region: SecretsManagerBackend(region_name=region) for region in available_regions}
|
)
|
||||||
|
secretsmanager_backends = {region: SecretsManagerBackend(region_name=region)
|
||||||
|
for region in available_regions}
|
||||||
|
@ -15,3 +15,11 @@ class SecretsManagerResponse(BaseResponse):
|
|||||||
secret_id=secret_id,
|
secret_id=secret_id,
|
||||||
version_id=version_id,
|
version_id=version_id,
|
||||||
version_stage=version_stage)
|
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
|
||||||
|
)
|
||||||
|
@ -3,11 +3,33 @@ from __future__ import unicode_literals
|
|||||||
import boto3
|
import boto3
|
||||||
|
|
||||||
from moto import mock_secretsmanager
|
from moto import mock_secretsmanager
|
||||||
|
from botocore.exceptions import ClientError
|
||||||
import sure # noqa
|
import sure # noqa
|
||||||
|
from nose.tools import assert_raises
|
||||||
|
|
||||||
@mock_secretsmanager
|
@mock_secretsmanager
|
||||||
def test_get_secret_value():
|
def test_get_secret_value():
|
||||||
conn = boto3.client('secretsmanager', region_name='us-west-2')
|
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')
|
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'
|
||||||
|
@ -7,7 +7,7 @@ import moto.server as server
|
|||||||
from moto import mock_secretsmanager
|
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")
|
backend = server.create_backend_app("secretsmanager")
|
||||||
test_client = backend.test_client()
|
test_client = backend.test_client()
|
||||||
|
|
||||||
res = test_client.post('/',
|
create_secret = test_client.post('/',
|
||||||
data={"SecretId": "test", "VersionStage": "AWSCURRENT"},
|
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={
|
headers={
|
||||||
"X-Amz-Target": "secretsmanager.GetSecretValue"},
|
"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"))
|
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'
|
||||||
|
Loading…
Reference in New Issue
Block a user