make cloudformation update stack use parameters provided (#843)

This commit is contained in:
David Wilcox 2017-03-05 14:48:51 +11:00 committed by Steve Pulec
parent 783242b696
commit a9554924df
4 changed files with 49 additions and 5 deletions

View File

@ -78,10 +78,10 @@ class FakeStack(object):
def stack_outputs(self): def stack_outputs(self):
return self.output_map.values() return self.output_map.values()
def update(self, template, role_arn=None): def update(self, template, role_arn=None, parameters=None):
self._add_stack_event("UPDATE_IN_PROGRESS", resource_status_reason="User Initiated") self._add_stack_event("UPDATE_IN_PROGRESS", resource_status_reason="User Initiated")
self.template = template self.template = template
self.resource_map.update(json.loads(template)) self.resource_map.update(json.loads(template), parameters)
self.output_map = self._create_output_map() self.output_map = self._create_output_map()
self._add_stack_event("UPDATE_COMPLETE") self._add_stack_event("UPDATE_COMPLETE")
self.status = "UPDATE_COMPLETE" self.status = "UPDATE_COMPLETE"
@ -157,9 +157,9 @@ class CloudFormationBackend(BaseBackend):
if stack.name == name_or_stack_id: if stack.name == name_or_stack_id:
return stack return stack
def update_stack(self, name, template, role_arn=None): def update_stack(self, name, template, role_arn=None, parameters=None):
stack = self.get_stack(name) stack = self.get_stack(name)
stack.update(template, role_arn) stack.update(template, role_arn, parameters=parameters)
return stack return stack
def list_stack_resources(self, stack_name_or_id): def list_stack_resources(self, stack_name_or_id):

View File

@ -374,7 +374,9 @@ class ResourceMap(collections.Mapping):
self.tags['aws:cloudformation:logical-id'] = resource self.tags['aws:cloudformation:logical-id'] = resource
ec2_models.ec2_backends[self._region_name].create_tags([self[resource].physical_resource_id], self.tags) ec2_models.ec2_backends[self._region_name].create_tags([self[resource].physical_resource_id], self.tags)
def update(self, template): def update(self, template, parameters=None):
if parameters:
self.input_parameters = parameters
self.load_mapping() self.load_mapping()
self.load_parameters() self.load_parameters()
self.load_conditions() self.load_conditions()

View File

@ -138,6 +138,11 @@ class CloudFormationResponse(BaseResponse):
stack_body = self.cloudformation_backend.get_stack(stack_name).template stack_body = self.cloudformation_backend.get_stack(stack_name).template
else: else:
stack_body = self._get_param('TemplateBody') stack_body = self._get_param('TemplateBody')
parameters = dict([
(parameter['parameter_key'], parameter['parameter_value'])
for parameter
in self._get_list_prefix("Parameters.member")
])
stack = self.cloudformation_backend.get_stack(stack_name) stack = self.cloudformation_backend.get_stack(stack_name)
if stack.status == 'ROLLBACK_COMPLETE': if stack.status == 'ROLLBACK_COMPLETE':
@ -147,6 +152,7 @@ class CloudFormationResponse(BaseResponse):
name=stack_name, name=stack_name,
template=stack_body, template=stack_body,
role_arn=role_arn, role_arn=role_arn,
parameters=parameters
) )
if self.request_json: if self.request_json:
stack_body = { stack_body = {

View File

@ -444,6 +444,42 @@ def test_update_stack():
}) })
@mock_cloudformation
def test_update_stack_with_parameters():
dummy_template = {
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Stack",
"Resources": {
"VPC": {
"Properties": {
"CidrBlock": {"Ref": "Bar"}
},
"Type": "AWS::EC2::VPC"
}
},
"Parameters": {
"Bar": {
"Type": "String"
}
}
}
dummy_template_json = json.dumps(dummy_template)
conn = boto.connect_cloudformation()
conn.create_stack(
"test_stack",
template_body=dummy_template_json,
parameters=[("Bar", "192.168.0.0/16")]
)
conn.update_stack(
"test_stack",
template_body=dummy_template_json,
parameters=[("Bar", "192.168.0.1/16")]
)
stack = conn.describe_stacks()[0]
assert stack.parameters[0].value == "192.168.0.1/16"
@mock_cloudformation @mock_cloudformation
def test_update_stack_when_rolled_back(): def test_update_stack_when_rolled_back():
conn = boto.connect_cloudformation() conn = boto.connect_cloudformation()