diff --git a/moto/cloudformation/models.py b/moto/cloudformation/models.py index bf11bc7ce..0002e8ae5 100644 --- a/moto/cloudformation/models.py +++ b/moto/cloudformation/models.py @@ -51,6 +51,7 @@ class FakeStack(object): self.template = template self.resource_map.update(json.loads(template)) self.output_map = self._create_output_map() + self.status = 'UPDATE_COMPLETE' def delete(self): self.resource_map.delete() diff --git a/moto/cloudformation/responses.py b/moto/cloudformation/responses.py index 64f4293d3..86aeb7d9d 100644 --- a/moto/cloudformation/responses.py +++ b/moto/cloudformation/responses.py @@ -130,14 +130,18 @@ class CloudFormationResponse(BaseResponse): name=stack_name, template=stack_body, ) - stack_body = { - 'UpdateStackResponse': { - 'UpdateStackResult': { - 'StackId': stack.name, + + if self.request_json: + return json.dumps({ + 'UpdateStackResponse': { + 'UpdateStackResult': { + 'StackId': stack.name, + } } - } - } - return json.dumps(stack_body) + }) + else: + template = self.response_template(UPDATE_STACK_RESPONSE_TEMPLATE) + return template.render(stack=stack) def delete_stack(self): name_or_stack_id = self.querystring.get('StackName')[0] @@ -164,6 +168,15 @@ CREATE_STACK_RESPONSE_TEMPLATE = """ """ +UPDATE_STACK_RESPONSE_TEMPLATE = """ + + {{ stack.stack_id }} + + + b9b5b068-3a41-11e5-94eb-example + + +""" DESCRIBE_STACKS_TEMPLATE = """ diff --git a/tests/test_cloudformation/test_cloudformation_stack_crud.py b/tests/test_cloudformation/test_cloudformation_stack_crud.py index 5ca20fe04..040ed4d50 100644 --- a/tests/test_cloudformation/test_cloudformation_stack_crud.py +++ b/tests/test_cloudformation/test_cloudformation_stack_crud.py @@ -263,24 +263,24 @@ def test_stack_tags(): dict(stack.tags).should.equal({"foo": "bar", "baz": "bleh"}) -# @mock_cloudformation -# def test_update_stack(): -# conn = boto.connect_cloudformation() -# conn.create_stack( -# "test_stack", -# template_body=dummy_template_json, -# ) +@mock_cloudformation +def test_update_stack(): + conn = boto.connect_cloudformation() + conn.create_stack( + "test_stack", + template_body=dummy_template_json, + ) -# conn.update_stack("test_stack", dummy_template_json2) + conn.update_stack("test_stack", dummy_template_json2) -# stack = conn.describe_stacks()[0] -# stack.get_template().should.equal({ -# 'GetTemplateResponse': { -# 'GetTemplateResult': { -# 'TemplateBody': dummy_template_json2, -# 'ResponseMetadata': { -# 'RequestId': '2d06e36c-ac1d-11e0-a958-f9382b6eb86bEXAMPLE' -# } -# } -# } -# }) + stack = conn.describe_stacks()[0] + stack.get_template().should.equal({ + 'GetTemplateResponse': { + 'GetTemplateResult': { + 'TemplateBody': dummy_template_json2, + 'ResponseMetadata': { + 'RequestId': '2d06e36c-ac1d-11e0-a958-f9382b6eb86bEXAMPLE' + } + } + } + }) diff --git a/tests/test_cloudformation/test_cloudformation_stack_crud_boto3.py b/tests/test_cloudformation/test_cloudformation_stack_crud_boto3.py index 94d645a43..590535f5f 100644 --- a/tests/test_cloudformation/test_cloudformation_stack_crud_boto3.py +++ b/tests/test_cloudformation/test_cloudformation_stack_crud_boto3.py @@ -19,7 +19,27 @@ dummy_template = { "Resources": {}, } +dummy_update_template = { + "AWSTemplateFormatVersion": "2010-09-09", + "Parameters": { + "KeyName": { + "Description": "Name of an existing EC2 KeyPair", + "Type": "AWS::EC2::KeyPair::KeyName", + "ConstraintDescription": "must be the name of an existing EC2 KeyPair." + } + }, + "Resources": { + "Instance": { + "Type": "AWS::EC2::Instance", + "Properties": { + "ImageId": "ami-08111162" + } + } + } +} + dummy_template_json = json.dumps(dummy_template) +dummy_update_template_json = json.dumps(dummy_template) @mock_cloudformation def test_boto3_create_stack(): @@ -169,6 +189,25 @@ def test_describe_deleted_stack(): stack_by_id['StackName'].should.equal("test_stack") stack_by_id['StackStatus'].should.equal("DELETE_COMPLETE") +@mock_cloudformation +def test_describe_updated_stack(): + cf_conn = boto3.client('cloudformation', region_name='us-east-1') + cf_conn.create_stack( + StackName="test_stack", + TemplateBody=dummy_template_json, + ) + + cf_conn.update_stack( + StackName="test_stack", + TemplateBody=dummy_update_template_json) + + stack = cf_conn.describe_stacks(StackName="test_stack")['Stacks'][0] + stack_id = stack['StackId'] + stack_by_id = cf_conn.describe_stacks(StackName=stack_id)['Stacks'][0] + stack_by_id['StackId'].should.equal(stack['StackId']) + stack_by_id['StackName'].should.equal("test_stack") + stack_by_id['StackStatus'].should.equal("UPDATE_COMPLETE") + @mock_cloudformation def test_bad_describe_stack():