Fix stackset describe/delete. Fix stackset update. (#3713)

* Fix stack set fetching and deleting.

* Also fix stackset update operation to accept previous values.

* Fix linting.

* Rename aliased test.
This commit is contained in:
Jakub Musko 2021-02-21 10:47:10 +01:00 committed by GitHub
commit c8c6b0bf58
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 102 additions and 29 deletions

View file

@ -467,6 +467,28 @@ class CloudFormationBackend(BaseBackend):
self.exports = OrderedDict()
self.change_sets = OrderedDict()
def _resolve_update_parameters(self, instance, incoming_params):
parameters = dict(
[
(parameter["parameter_key"], parameter["parameter_value"])
for parameter in incoming_params
if "parameter_value" in parameter
]
)
previous = dict(
[
(
parameter["parameter_key"],
instance.parameters[parameter["parameter_key"]],
)
for parameter in incoming_params
if "use_previous_value" in parameter
]
)
parameters.update(previous)
return parameters
def create_stack_set(
self,
name,
@ -494,6 +516,8 @@ class CloudFormationBackend(BaseBackend):
def get_stack_set(self, name):
stacksets = self.stacksets.keys()
if name in stacksets:
return self.stacksets[name]
for stackset in stacksets:
if self.stacksets[stackset].name == name:
return self.stacksets[stackset]
@ -501,6 +525,8 @@ class CloudFormationBackend(BaseBackend):
def delete_stack_set(self, name):
stacksets = self.stacksets.keys()
if name in stacksets:
self.stacksets[name].delete()
for stackset in stacksets:
if self.stacksets[stackset].name == name:
self.stacksets[stackset].delete()
@ -532,10 +558,13 @@ class CloudFormationBackend(BaseBackend):
operation_id=None,
):
stackset = self.get_stack_set(stackset_name)
resolved_parameters = self._resolve_update_parameters(
instance=stackset, incoming_params=parameters
)
update = stackset.update(
template=template,
description=description,
parameters=parameters,
parameters=resolved_parameters,
tags=tags,
admin_role=admin_role,
execution_role=execution_role,
@ -711,7 +740,10 @@ class CloudFormationBackend(BaseBackend):
def update_stack(self, name, template, role_arn=None, parameters=None, tags=None):
stack = self.get_stack(name)
stack.update(template, role_arn, parameters=parameters, tags=tags)
resolved_parameters = self._resolve_update_parameters(
instance=stack, incoming_params=parameters
)
stack.update(template, role_arn, parameters=resolved_parameters, tags=tags)
return stack
def list_stack_resources(self, stack_name_or_id):

View file

@ -315,24 +315,6 @@ class CloudFormationResponse(BaseResponse):
stack_body = self._get_stack_from_s3_url(template_url)
incoming_params = self._get_list_prefix("Parameters.member")
parameters = dict(
[
(parameter["parameter_key"], parameter["parameter_value"])
for parameter in incoming_params
if "parameter_value" in parameter
]
)
previous = dict(
[
(
parameter["parameter_key"],
stack.parameters[parameter["parameter_key"]],
)
for parameter in incoming_params
if "use_previous_value" in parameter
]
)
parameters.update(previous)
# boto3 is supposed to let you clear the tags by passing an empty value, but the request body doesn't
# end up containing anything we can use to differentiate between passing an empty value versus not
# passing anything. so until that changes, moto won't be able to clear tags, only update them.
@ -357,7 +339,7 @@ class CloudFormationResponse(BaseResponse):
name=stack_name,
template=stack_body,
role_arn=role_arn,
parameters=parameters,
parameters=incoming_params,
tags=tags,
)
if self.request_json:
@ -560,17 +542,12 @@ class CloudFormationResponse(BaseResponse):
for item in self._get_list_prefix("Tags.member")
)
parameters_list = self._get_list_prefix("Parameters.member")
parameters = dict(
[
(parameter["parameter_key"], parameter["parameter_value"])
for parameter in parameters_list
]
)
operation = self.cloudformation_backend.update_stack_set(
stackset_name=stackset_name,
template=template_body,
description=description,
parameters=parameters,
parameters=parameters_list,
tags=tags,
admin_role=admin_role,
execution_role=execution_role,