fix both get and describe with arn and name

This commit is contained in:
mwas 2019-11-23 10:12:31 +03:00
parent b31f31d214
commit 5274ffa5e0
2 changed files with 16 additions and 10 deletions

View File

@ -17,7 +17,7 @@ from .exceptions import (
InvalidRequestException, InvalidRequestException,
ClientError, ClientError,
) )
from .utils import random_password, secret_arn from .utils import random_password, secret_arn, get_secret_name_from_arn
class SecretsManager(BaseModel): class SecretsManager(BaseModel):
@ -44,15 +44,7 @@ class SecretsManagerBackend(BaseBackend):
return (dt - epoch).total_seconds() return (dt - epoch).total_seconds()
def get_secret_value(self, secret_id, version_id, version_stage): def get_secret_value(self, secret_id, version_id, version_stage):
# can fetch by both arn and by name secret_id = get_secret_name_from_arn(secret_id)
# but we are storing via name
# so we need to change the arn to name
# if it starts with arn then the secret id is arn
if secret_id.startswith("arn:aws:secretsmanager:%s" % self.region):
# split the arn by colon
# then get the last value which is the name appended with a random string
# then remove the random string
secret_id = '-'.join(secret_id.split(':')[-1].split('-')[:-1])
if not self._is_valid_identifier(secret_id): if not self._is_valid_identifier(secret_id):
raise SecretNotFoundException() raise SecretNotFoundException()
@ -204,6 +196,7 @@ class SecretsManagerBackend(BaseBackend):
return response return response
def describe_secret(self, secret_id): def describe_secret(self, secret_id):
secret_id = get_secret_name_from_arn(secret_id)
if not self._is_valid_identifier(secret_id): if not self._is_valid_identifier(secret_id):
raise SecretNotFoundException() raise SecretNotFoundException()

View File

@ -72,6 +72,19 @@ def secret_arn(region, secret_id):
) )
def get_secret_name_from_arn(secret_id):
# can fetch by both arn and by name
# but we are storing via name
# so we need to change the arn to name
# if it starts with arn then the secret id is arn
if secret_id.startswith("arn:aws:secretsmanager:"):
# split the arn by colon
# then get the last value which is the name appended with a random string
# then remove the random string
secret_id = '-'.join(secret_id.split(':')[-1].split('-')[:-1])
return secret_id
def _exclude_characters(password, exclude_characters): def _exclude_characters(password, exclude_characters):
for c in exclude_characters: for c in exclude_characters:
if c in string.punctuation: if c in string.punctuation: