SSM: Fix the formatting associated with label_parameter_version/get_parameter_history updates

This commit is contained in:
Brent Driskill 2020-03-11 11:57:04 -04:00
parent 5705695495
commit e3e4b741d8
4 changed files with 176 additions and 47 deletions

View File

@ -22,23 +22,31 @@ class InvalidFilterValue(JsonRESTError):
def __init__(self, message): def __init__(self, message):
super(InvalidFilterValue, self).__init__("InvalidFilterValue", message) super(InvalidFilterValue, self).__init__("InvalidFilterValue", message)
class ParameterNotFound(JsonRESTError): class ParameterNotFound(JsonRESTError):
code = 400 code = 400
def __init__(self, message): def __init__(self, message):
super(ParameterNotFound, self).__init__("ParameterNotFound", message) super(ParameterNotFound, self).__init__("ParameterNotFound", message)
class ParameterVersionNotFound(JsonRESTError): class ParameterVersionNotFound(JsonRESTError):
code = 400 code = 400
def __init__(self, message): def __init__(self, message):
super(ParameterVersionNotFound, self).__init__("ParameterVersionNotFound", message) super(ParameterVersionNotFound, self).__init__(
"ParameterVersionNotFound", message
)
class ParameterVersionLabelLimitExceeded(JsonRESTError): class ParameterVersionLabelLimitExceeded(JsonRESTError):
code = 400 code = 400
def __init__(self, message): def __init__(self, message):
super(ParameterVersionLabelLimitExceeded, self).__init__("ParameterVersionLabelLimitExceeded", message) super(ParameterVersionLabelLimitExceeded, self).__init__(
"ParameterVersionLabelLimitExceeded", message
)
class ValidationException(JsonRESTError): class ValidationException(JsonRESTError):
code = 400 code = 400

View File

@ -21,7 +21,7 @@ from .exceptions import (
InvalidFilterKey, InvalidFilterKey,
ParameterVersionLabelLimitExceeded, ParameterVersionLabelLimitExceeded,
ParameterVersionNotFound, ParameterVersionNotFound,
ParameterNotFound ParameterNotFound,
) )
@ -35,7 +35,7 @@ class Parameter(BaseModel):
allowed_pattern, allowed_pattern,
keyid, keyid,
last_modified_date, last_modified_date,
version version,
): ):
self.name = name self.name = name
self.type = type self.type = type
@ -624,9 +624,7 @@ class SimpleSystemManagerBackend(BaseBackend):
def label_parameter_version(self, name, version, labels): def label_parameter_version(self, name, version, labels):
previous_parameter_versions = self._parameters[name] previous_parameter_versions = self._parameters[name]
if not previous_parameter_versions: if not previous_parameter_versions:
raise ParameterNotFound( raise ParameterNotFound("Parameter %s not found." % name)
"Parameter %s not found." % name
)
found_parameter = None found_parameter = None
labels_needing_removal = [] labels_needing_removal = []
if not version: if not version:
@ -645,11 +643,16 @@ class SimpleSystemManagerBackend(BaseBackend):
raise ParameterVersionNotFound( raise ParameterVersionNotFound(
"Systems Manager could not find version %s of %s. " "Systems Manager could not find version %s of %s. "
"Verify the version and try again." % (version, name) "Verify the version and try again." % (version, name)
) )
labels_to_append = [] labels_to_append = []
invalid_labels = [] invalid_labels = []
for label in labels: for label in labels:
if label.startswith("aws") or label.startswith("ssm") or label[:1].isdigit() or not re.match("^[a-zA-z0-9_\.\-]*$", label): if (
label.startswith("aws")
or label.startswith("ssm")
or label[:1].isdigit()
or not re.match("^[a-zA-z0-9_\.\-]*$", label)
):
invalid_labels.append(label) invalid_labels.append(label)
continue continue
if len(label) > 100: if len(label) > 100:
@ -657,7 +660,8 @@ class SimpleSystemManagerBackend(BaseBackend):
"1 validation error detected: " "1 validation error detected: "
"Value '[%s]' at 'labels' failed to satisfy constraint: " "Value '[%s]' at 'labels' failed to satisfy constraint: "
"Member must satisfy constraint: " "Member must satisfy constraint: "
"[Member must have length less than or equal to 100, Member must have length greater than or equal to 1]" % label "[Member must have length less than or equal to 100, Member must have length greater than or equal to 1]"
% label
) )
continue continue
if label not in found_parameter.labels: if label not in found_parameter.labels:

View File

@ -168,8 +168,7 @@ class SimpleSystemManagerResponse(BaseResponse):
response = {"Parameters": []} response = {"Parameters": []}
for parameter_version in result: for parameter_version in result:
param_data = parameter_version.describe_response_object( param_data = parameter_version.describe_response_object(
decrypt=with_decryption, decrypt=with_decryption, include_labels=True
include_labels=True
) )
response["Parameters"].append(param_data) response["Parameters"].append(param_data)
@ -180,7 +179,9 @@ class SimpleSystemManagerResponse(BaseResponse):
version = self._get_param("ParameterVersion") version = self._get_param("ParameterVersion")
labels = self._get_param("Labels") labels = self._get_param("Labels")
invalid_labels, version = self.ssm_backend.label_parameter_version(name, version, labels) invalid_labels, version = self.ssm_backend.label_parameter_version(
name, version, labels
)
response = {"InvalidLabels": invalid_labels, "ParameterVersion": version} response = {"InvalidLabels": invalid_labels, "ParameterVersion": version}
return json.dumps(response) return json.dumps(response)

View File

@ -938,40 +938,66 @@ def test_get_parameter_history_with_secure_string():
len(parameters_response).should.equal(3) len(parameters_response).should.equal(3)
@mock_ssm @mock_ssm
def test_label_parameter_version(): def test_label_parameter_version():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
test_parameter_name = "test" test_parameter_name = "test"
client.put_parameter(Name=test_parameter_name, Description="A test parameter", Value="value", Type="String") client.put_parameter(
Name=test_parameter_name,
Description="A test parameter",
Value="value",
Type="String",
)
response = client.label_parameter_version(Name=test_parameter_name, Labels=["test-label"]) response = client.label_parameter_version(
Name=test_parameter_name, Labels=["test-label"]
)
response["InvalidLabels"].should.equal([]) response["InvalidLabels"].should.equal([])
response["ParameterVersion"].should.equal(1) response["ParameterVersion"].should.equal(1)
@mock_ssm @mock_ssm
def test_label_parameter_version_with_specific_version(): def test_label_parameter_version_with_specific_version():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
test_parameter_name = "test" test_parameter_name = "test"
client.put_parameter(Name=test_parameter_name, Description="A test parameter", Value="value", Type="String") client.put_parameter(
Name=test_parameter_name,
Description="A test parameter",
Value="value",
Type="String",
)
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=["test-label"]) response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=["test-label"]
)
response["InvalidLabels"].should.equal([]) response["InvalidLabels"].should.equal([])
response["ParameterVersion"].should.equal(1) response["ParameterVersion"].should.equal(1)
@mock_ssm @mock_ssm
def test_label_parameter_version_twice(): def test_label_parameter_version_twice():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
test_parameter_name = "test" test_parameter_name = "test"
test_labels = ["test-label"] test_labels = ["test-label"]
client.put_parameter(Name=test_parameter_name, Description="A test parameter", Value="value", Type="String") client.put_parameter(
Name=test_parameter_name,
Description="A test parameter",
Value="value",
Type="String",
)
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=test_labels) response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=test_labels
)
response["InvalidLabels"].should.equal([]) response["InvalidLabels"].should.equal([])
response["ParameterVersion"].should.equal(1) response["ParameterVersion"].should.equal(1)
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=test_labels) response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=test_labels
)
response["InvalidLabels"].should.equal([]) response["InvalidLabels"].should.equal([])
response["ParameterVersion"].should.equal(1) response["ParameterVersion"].should.equal(1)
@ -979,6 +1005,7 @@ def test_label_parameter_version_twice():
len(response["Parameters"]).should.equal(1) len(response["Parameters"]).should.equal(1)
response["Parameters"][0]["Labels"].should.equal(test_labels) response["Parameters"][0]["Labels"].should.equal(test_labels)
@mock_ssm @mock_ssm
def test_label_parameter_moving_versions(): def test_label_parameter_moving_versions():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
@ -992,13 +1019,17 @@ def test_label_parameter_moving_versions():
Description="A test parameter version %d" % i, Description="A test parameter version %d" % i,
Value="value-%d" % i, Value="value-%d" % i,
Type="String", Type="String",
Overwrite=True Overwrite=True,
) )
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=test_labels) response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=test_labels
)
response["InvalidLabels"].should.equal([]) response["InvalidLabels"].should.equal([])
response["ParameterVersion"].should.equal(1) response["ParameterVersion"].should.equal(1)
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=2, Labels=test_labels) response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=2, Labels=test_labels
)
response["InvalidLabels"].should.equal([]) response["InvalidLabels"].should.equal([])
response["ParameterVersion"].should.equal(2) response["ParameterVersion"].should.equal(2)
@ -1016,6 +1047,7 @@ def test_label_parameter_moving_versions():
len(parameters_response).should.equal(3) len(parameters_response).should.equal(3)
@mock_ssm @mock_ssm
def test_label_parameter_moving_versions_complex(): def test_label_parameter_moving_versions_complex():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
@ -1028,13 +1060,21 @@ def test_label_parameter_moving_versions_complex():
Description="A test parameter version %d" % i, Description="A test parameter version %d" % i,
Value="value-%d" % i, Value="value-%d" % i,
Type="String", Type="String",
Overwrite=True Overwrite=True,
) )
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=["test-label1", "test-label2", "test-label3"]) response = client.label_parameter_version(
Name=test_parameter_name,
ParameterVersion=1,
Labels=["test-label1", "test-label2", "test-label3"],
)
response["InvalidLabels"].should.equal([]) response["InvalidLabels"].should.equal([])
response["ParameterVersion"].should.equal(1) response["ParameterVersion"].should.equal(1)
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=2, Labels=["test-label2", "test-label3"]) response = client.label_parameter_version(
Name=test_parameter_name,
ParameterVersion=2,
Labels=["test-label2", "test-label3"],
)
response["InvalidLabels"].should.equal([]) response["InvalidLabels"].should.equal([])
response["ParameterVersion"].should.equal(2) response["ParameterVersion"].should.equal(2)
@ -1047,45 +1087,93 @@ def test_label_parameter_moving_versions_complex():
param["Value"].should.equal("value-%d" % index) param["Value"].should.equal("value-%d" % index)
param["Version"].should.equal(index + 1) param["Version"].should.equal(index + 1)
param["Description"].should.equal("A test parameter version %d" % index) param["Description"].should.equal("A test parameter version %d" % index)
labels = ["test-label2", "test-label3"] if param["Version"] == 2 else (["test-label1"] if param["Version"] == 1 else []) labels = (
["test-label2", "test-label3"]
if param["Version"] == 2
else (["test-label1"] if param["Version"] == 1 else [])
)
param["Labels"].should.equal(labels) param["Labels"].should.equal(labels)
len(parameters_response).should.equal(3) len(parameters_response).should.equal(3)
@mock_ssm @mock_ssm
def test_label_parameter_version_exception_ten_labels_at_once(): def test_label_parameter_version_exception_ten_labels_at_once():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
test_parameter_name = "test" test_parameter_name = "test"
test_labels = ["test-label1", "test-label2", "test-label3", "test-label4", "test-label5", "test-label6", "test-label7", "test-label8", "test-label9", "test-label10", "test-label11"] test_labels = [
"test-label1",
"test-label2",
"test-label3",
"test-label4",
"test-label5",
"test-label6",
"test-label7",
"test-label8",
"test-label9",
"test-label10",
"test-label11",
]
client.put_parameter(Name=test_parameter_name, Description="A test parameter", Value="value", Type="String") client.put_parameter(
Name=test_parameter_name,
Description="A test parameter",
Value="value",
Type="String",
)
client.label_parameter_version.when.called_with( client.label_parameter_version.when.called_with(
Name="test", ParameterVersion=1, Labels=test_labels Name="test", ParameterVersion=1, Labels=test_labels
).should.throw( ).should.throw(
ClientError, ClientError,
"An error occurred (ParameterVersionLabelLimitExceeded) when calling the LabelParameterVersion operation: " "An error occurred (ParameterVersionLabelLimitExceeded) when calling the LabelParameterVersion operation: "
"A parameter version can have maximum 10 labels." "A parameter version can have maximum 10 labels."
"Move one or more labels to another version and try again." "Move one or more labels to another version and try again.",
) )
@mock_ssm @mock_ssm
def test_label_parameter_version_exception_ten_labels_over_multiple_calls(): def test_label_parameter_version_exception_ten_labels_over_multiple_calls():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
test_parameter_name = "test" test_parameter_name = "test"
client.put_parameter(Name=test_parameter_name, Description="A test parameter", Value="value", Type="String") client.put_parameter(
client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=["test-label1", "test-label2", "test-label3", "test-label4", "test-label5"]) Name=test_parameter_name,
Description="A test parameter",
Value="value",
Type="String",
)
client.label_parameter_version(
Name=test_parameter_name,
ParameterVersion=1,
Labels=[
"test-label1",
"test-label2",
"test-label3",
"test-label4",
"test-label5",
],
)
client.label_parameter_version.when.called_with( client.label_parameter_version.when.called_with(
Name="test", ParameterVersion=1, Labels=["test-label6", "test-label7", "test-label8", "test-label9", "test-label10", "test-label11"] Name="test",
ParameterVersion=1,
Labels=[
"test-label6",
"test-label7",
"test-label8",
"test-label9",
"test-label10",
"test-label11",
],
).should.throw( ).should.throw(
ClientError, ClientError,
"An error occurred (ParameterVersionLabelLimitExceeded) when calling the LabelParameterVersion operation: " "An error occurred (ParameterVersionLabelLimitExceeded) when calling the LabelParameterVersion operation: "
"A parameter version can have maximum 10 labels." "A parameter version can have maximum 10 labels."
"Move one or more labels to another version and try again." "Move one or more labels to another version and try again.",
) )
@mock_ssm @mock_ssm
def test_label_parameter_version_invalid_name(): def test_label_parameter_version_invalid_name():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
@ -1097,15 +1185,21 @@ def test_label_parameter_version_invalid_name():
).should.throw( ).should.throw(
ClientError, ClientError,
"An error occurred (ParameterNotFound) when calling the LabelParameterVersion operation: " "An error occurred (ParameterNotFound) when calling the LabelParameterVersion operation: "
"Parameter test not found." "Parameter test not found.",
) )
@mock_ssm @mock_ssm
def test_label_parameter_version_invalid_parameter_version(): def test_label_parameter_version_invalid_parameter_version():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
test_parameter_name = "test" test_parameter_name = "test"
client.put_parameter(Name=test_parameter_name, Description="A test parameter", Value="value", Type="String") client.put_parameter(
Name=test_parameter_name,
Description="A test parameter",
Value="value",
Type="String",
)
response = client.label_parameter_version.when.called_with( response = client.label_parameter_version.when.called_with(
Name=test_parameter_name, Labels=["test-label"], ParameterVersion=5 Name=test_parameter_name, Labels=["test-label"], ParameterVersion=5
@ -1113,37 +1207,52 @@ def test_label_parameter_version_invalid_parameter_version():
ClientError, ClientError,
"An error occurred (ParameterVersionNotFound) when calling the LabelParameterVersion operation: " "An error occurred (ParameterVersionNotFound) when calling the LabelParameterVersion operation: "
"Systems Manager could not find version 5 of test. " "Systems Manager could not find version 5 of test. "
"Verify the version and try again." "Verify the version and try again.",
) )
@mock_ssm @mock_ssm
def test_label_parameter_version_invalid_label(): def test_label_parameter_version_invalid_label():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
test_parameter_name = "test" test_parameter_name = "test"
client.put_parameter(Name=test_parameter_name, Description="A test parameter", Value="value", Type="String") client.put_parameter(
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=["awsabc"]) Name=test_parameter_name,
Description="A test parameter",
Value="value",
Type="String",
)
response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=["awsabc"]
)
response["InvalidLabels"].should.equal(["awsabc"]) response["InvalidLabels"].should.equal(["awsabc"])
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=["ssmabc"]) response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=["ssmabc"]
)
response["InvalidLabels"].should.equal(["ssmabc"]) response["InvalidLabels"].should.equal(["ssmabc"])
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=["9abc"]) response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=["9abc"]
)
response["InvalidLabels"].should.equal(["9abc"]) response["InvalidLabels"].should.equal(["9abc"])
response = client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=["abc/123"]) response = client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=["abc/123"]
)
response["InvalidLabels"].should.equal(["abc/123"]) response["InvalidLabels"].should.equal(["abc/123"])
client.label_parameter_version.when.called_with( client.label_parameter_version.when.called_with(
Name=test_parameter_name, ParameterVersion=1, Labels=["a"*101] Name=test_parameter_name, ParameterVersion=1, Labels=["a" * 101]
).should.throw( ).should.throw(
ClientError, ClientError,
"1 validation error detected: " "1 validation error detected: "
"Value '[%s]' at 'labels' failed to satisfy constraint: " "Value '[%s]' at 'labels' failed to satisfy constraint: "
"Member must satisfy constraint: " "Member must satisfy constraint: "
"[Member must have length less than or equal to 100, Member must have length greater than or equal to 1]" % ("a"*101) "[Member must have length less than or equal to 100, Member must have length greater than or equal to 1]"
% ("a" * 101),
) )
@mock_ssm @mock_ssm
def test_get_parameter_history_with_label(): def test_get_parameter_history_with_label():
@ -1161,7 +1270,9 @@ def test_get_parameter_history_with_label():
Overwrite=True, Overwrite=True,
) )
client.label_parameter_version(Name=test_parameter_name, ParameterVersion=1, Labels=test_labels) client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=1, Labels=test_labels
)
response = client.get_parameter_history(Name=test_parameter_name) response = client.get_parameter_history(Name=test_parameter_name)
parameters_response = response["Parameters"] parameters_response = response["Parameters"]
@ -1177,6 +1288,7 @@ def test_get_parameter_history_with_label():
len(parameters_response).should.equal(3) len(parameters_response).should.equal(3)
@mock_ssm @mock_ssm
def test_get_parameter_history_with_label_non_latest(): def test_get_parameter_history_with_label_non_latest():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
@ -1193,7 +1305,9 @@ def test_get_parameter_history_with_label_non_latest():
Overwrite=True, Overwrite=True,
) )
client.label_parameter_version(Name=test_parameter_name, ParameterVersion=2, Labels=test_labels) client.label_parameter_version(
Name=test_parameter_name, ParameterVersion=2, Labels=test_labels
)
response = client.get_parameter_history(Name=test_parameter_name) response = client.get_parameter_history(Name=test_parameter_name)
parameters_response = response["Parameters"] parameters_response = response["Parameters"]
@ -1209,6 +1323,7 @@ def test_get_parameter_history_with_label_non_latest():
len(parameters_response).should.equal(3) len(parameters_response).should.equal(3)
@mock_ssm @mock_ssm
def test_get_parameter_history_with_label_latest_assumed(): def test_get_parameter_history_with_label_latest_assumed():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")
@ -1241,6 +1356,7 @@ def test_get_parameter_history_with_label_latest_assumed():
len(parameters_response).should.equal(3) len(parameters_response).should.equal(3)
@mock_ssm @mock_ssm
def test_get_parameter_history_missing_parameter(): def test_get_parameter_history_missing_parameter():
client = boto3.client("ssm", region_name="us-east-1") client = boto3.client("ssm", region_name="us-east-1")