| 
									
										
										
										
											2014-08-27 11:17:06 -04:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							| 
									
										
										
										
											2014-11-15 13:34:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2014-11-15 13:34:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | import boto | 
					
						
							| 
									
										
										
										
											2020-07-19 16:29:19 +05:30
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2019-11-07 17:11:13 +00:00
										 |  |  | import boto.iam | 
					
						
							| 
									
										
										
										
											2014-12-29 22:12:23 -05:00
										 |  |  | import boto.s3 | 
					
						
							|  |  |  | import boto.s3.key | 
					
						
							| 
									
										
										
										
											2014-11-15 13:34:52 -05:00
										 |  |  | import boto.cloudformation | 
					
						
							| 
									
										
										
										
											2014-12-31 14:21:47 -05:00
										 |  |  | from boto.exception import BotoServerError | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | import sure  # noqa | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2019-12-16 21:05:29 -05:00
										 |  |  | from moto.core import ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | from moto import ( | 
					
						
							|  |  |  |     mock_cloudformation_deprecated, | 
					
						
							|  |  |  |     mock_s3_deprecated, | 
					
						
							|  |  |  |     mock_route53_deprecated, | 
					
						
							| 
									
										
										
										
											2019-11-23 10:18:56 +00:00
										 |  |  |     mock_iam_deprecated, | 
					
						
							| 
									
										
										
										
											2020-07-19 16:29:19 +05:30
										 |  |  |     mock_dynamodb2, | 
					
						
							|  |  |  |     mock_cloudformation, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-04-11 21:52:03 +00:00
										 |  |  | from moto.cloudformation import cloudformation_backends | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | dummy_template = { | 
					
						
							|  |  |  |     "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |     "Description": "Stack 1", | 
					
						
							|  |  |  |     "Resources": {}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | dummy_template2 = { | 
					
						
							|  |  |  |     "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |     "Description": "Stack 2", | 
					
						
							|  |  |  |     "Resources": {}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-07 13:31:42 -07:00
										 |  |  | # template with resource which has no delete attribute defined | 
					
						
							|  |  |  | dummy_template3 = { | 
					
						
							|  |  |  |     "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |     "Description": "Stack 3", | 
					
						
							|  |  |  |     "Resources": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "VPC": {"Properties": {"CidrBlock": "192.168.0.0/16"}, "Type": "AWS::EC2::VPC"} | 
					
						
							| 
									
										
										
										
											2016-06-07 13:31:42 -07:00
										 |  |  |     }, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 16:29:19 +05:30
										 |  |  | dummy_template4 = { | 
					
						
							|  |  |  |     "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |     "Resources": { | 
					
						
							|  |  |  |         "myDynamoDBTable": { | 
					
						
							|  |  |  |             "Type": "AWS::DynamoDB::Table", | 
					
						
							|  |  |  |             "Properties": { | 
					
						
							|  |  |  |                 "AttributeDefinitions": [ | 
					
						
							|  |  |  |                     {"AttributeName": "Name", "AttributeType": "S"}, | 
					
						
							|  |  |  |                     {"AttributeName": "Age", "AttributeType": "S"}, | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 "KeySchema": [ | 
					
						
							|  |  |  |                     {"AttributeName": "Name", "KeyType": "HASH"}, | 
					
						
							|  |  |  |                     {"AttributeName": "Age", "KeyType": "RANGE"}, | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 "ProvisionedThroughput": { | 
					
						
							|  |  |  |                     "ReadCapacityUnits": 5, | 
					
						
							|  |  |  |                     "WriteCapacityUnits": 5, | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 "TableName": "Person", | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | dummy_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  | dummy_template_json2 = json.dumps(dummy_template2) | 
					
						
							| 
									
										
										
										
											2016-06-07 13:31:42 -07:00
										 |  |  | dummy_template_json3 = json.dumps(dummy_template3) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | def test_create_stack(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack.stack_name.should.equal("test_stack") | 
					
						
							|  |  |  |     stack.get_template().should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "GetTemplateResponse": { | 
					
						
							|  |  |  |                 "GetTemplateResult": { | 
					
						
							|  |  |  |                     "TemplateBody": dummy_template_json, | 
					
						
							|  |  |  |                     "ResponseMetadata": { | 
					
						
							|  |  |  |                         "RequestId": "2d06e36c-ac1d-11e0-a958-f9382b6eb86bEXAMPLE" | 
					
						
							|  |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2015-10-05 15:21:30 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 09:58:39 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							|  |  |  | @mock_route53_deprecated | 
					
						
							| 
									
										
										
										
											2017-03-05 14:31:45 +11:00
										 |  |  | def test_create_stack_hosted_zone_by_id(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Description": "Stack 1", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "Parameters": {}, | 
					
						
							| 
									
										
										
										
											2017-03-05 14:31:45 +11:00
										 |  |  |         "Resources": { | 
					
						
							|  |  |  |             "Bar": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Type": "AWS::Route53::HostedZone", | 
					
						
							|  |  |  |                 "Properties": {"Name": "foo.bar.baz"}, | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-03-05 14:31:45 +11:00
										 |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     dummy_template2 = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Description": "Stack 2", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "Parameters": {"ZoneId": {"Type": "String"}}, | 
					
						
							| 
									
										
										
										
											2017-03-05 14:31:45 +11:00
										 |  |  |         "Resources": { | 
					
						
							|  |  |  |             "Foo": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Properties": {"HostedZoneId": {"Ref": "ZoneId"}, "RecordSets": []}, | 
					
						
							|  |  |  |                 "Type": "AWS::Route53::RecordSetGroup", | 
					
						
							| 
									
										
										
										
											2017-03-05 14:31:45 +11:00
										 |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     conn.create_stack( | 
					
						
							| 
									
										
										
										
											2020-06-14 11:31:44 +01:00
										 |  |  |         "test_stack1", template_body=json.dumps(dummy_template), parameters={}.items() | 
					
						
							| 
									
										
										
										
											2017-03-05 14:31:45 +11:00
										 |  |  |     ) | 
					
						
							|  |  |  |     r53_conn = boto.connect_route53() | 
					
						
							|  |  |  |     zone_id = r53_conn.get_zones()[0].id | 
					
						
							|  |  |  |     conn.create_stack( | 
					
						
							| 
									
										
										
										
											2020-06-14 11:31:44 +01:00
										 |  |  |         "test_stack2", | 
					
						
							| 
									
										
										
										
											2017-03-05 14:31:45 +11:00
										 |  |  |         template_body=json.dumps(dummy_template2), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         parameters={"ZoneId": zone_id}.items(), | 
					
						
							| 
									
										
										
										
											2017-03-05 14:31:45 +11:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							|  |  |  |     assert stack.list_resources() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-11-15 13:34:52 -05:00
										 |  |  | def test_creating_stacks_across_regions(): | 
					
						
							|  |  |  |     west1_conn = boto.cloudformation.connect_to_region("us-west-1") | 
					
						
							|  |  |  |     west1_conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     west2_conn = boto.cloudformation.connect_to_region("us-west-2") | 
					
						
							|  |  |  |     west2_conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     list(west1_conn.describe_stacks()).should.have.length_of(1) | 
					
						
							|  |  |  |     list(west2_conn.describe_stacks()).should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-10-29 11:59:41 -04:00
										 |  |  | def test_create_stack_with_notification_arn(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     conn.create_stack( | 
					
						
							|  |  |  |         "test_stack_with_notifications", | 
					
						
							|  |  |  |         template_body=dummy_template_json, | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |         notification_arns="arn:aws:sns:us-east-1:{}:fake-queue".format(ACCOUNT_ID), | 
					
						
							| 
									
										
										
										
											2014-10-29 11:59:41 -04:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     [n.value for n in stack.notification_arns].should.contain( | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |         "arn:aws:sns:us-east-1:{}:fake-queue".format(ACCOUNT_ID) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-10-29 11:59:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							|  |  |  | @mock_s3_deprecated | 
					
						
							| 
									
										
										
										
											2014-12-29 22:12:23 -05:00
										 |  |  | def test_create_stack_from_s3_url(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_conn = boto.s3.connect_to_region("us-west-1") | 
					
						
							| 
									
										
										
										
											2020-02-02 12:44:26 +00:00
										 |  |  |     bucket = s3_conn.create_bucket("foobar", location="us-west-1") | 
					
						
							| 
									
										
										
										
											2014-12-29 22:12:23 -05:00
										 |  |  |     key = boto.s3.key.Key(bucket) | 
					
						
							|  |  |  |     key.key = "template-key" | 
					
						
							|  |  |  |     key.set_contents_from_string(dummy_template_json) | 
					
						
							|  |  |  |     key_url = key.generate_url(expires_in=0, query_auth=False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.cloudformation.connect_to_region("us-west-1") | 
					
						
							|  |  |  |     conn.create_stack("new-stack", template_url=key_url) | 
					
						
							| 
									
										
										
										
											2014-12-29 22:12:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack.stack_name.should.equal("new-stack") | 
					
						
							| 
									
										
										
										
											2015-10-05 15:21:30 -04:00
										 |  |  |     stack.get_template().should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "GetTemplateResponse": { | 
					
						
							|  |  |  |                 "GetTemplateResult": { | 
					
						
							|  |  |  |                     "TemplateBody": dummy_template_json, | 
					
						
							|  |  |  |                     "ResponseMetadata": { | 
					
						
							|  |  |  |                         "RequestId": "2d06e36c-ac1d-11e0-a958-f9382b6eb86bEXAMPLE" | 
					
						
							|  |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2015-10-05 15:21:30 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-12-29 22:12:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | def test_describe_stack_by_name(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks("test_stack")[0] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack.stack_name.should.equal("test_stack") | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-10-22 23:58:42 -04:00
										 |  |  | def test_describe_stack_by_stack_id(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2014-10-22 23:58:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks("test_stack")[0] | 
					
						
							|  |  |  |     stack_by_id = conn.describe_stacks(stack.stack_id)[0] | 
					
						
							|  |  |  |     stack_by_id.stack_id.should.equal(stack.stack_id) | 
					
						
							|  |  |  |     stack_by_id.stack_name.should.equal("test_stack") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 16:29:19 +05:30
										 |  |  | @mock_dynamodb2 | 
					
						
							|  |  |  | @mock_cloudformation_deprecated | 
					
						
							|  |  |  | def test_delete_stack_dynamo_template(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     dynamodb_client = boto3.client("dynamodb", region_name="us-east-1") | 
					
						
							|  |  |  |     conn.create_stack("test_stack", template_body=dummy_template4) | 
					
						
							|  |  |  |     table_desc = dynamodb_client.list_tables() | 
					
						
							|  |  |  |     len(table_desc.get("TableNames")).should.equal(1) | 
					
						
							|  |  |  |     conn.delete_stack("test_stack") | 
					
						
							|  |  |  |     table_desc = dynamodb_client.list_tables() | 
					
						
							|  |  |  |     len(table_desc.get("TableNames")).should.equal(0) | 
					
						
							|  |  |  |     conn.create_stack("test_stack", template_body=dummy_template4) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_dynamodb2 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | def test_delete_stack_dynamo_template(): | 
					
						
							|  |  |  |     conn = boto3.client("cloudformation", region_name="us-east-1") | 
					
						
							|  |  |  |     dynamodb_client = boto3.client("dynamodb", region_name="us-east-1") | 
					
						
							|  |  |  |     conn.create_stack(StackName="test_stack", TemplateBody=json.dumps(dummy_template4)) | 
					
						
							|  |  |  |     table_desc = dynamodb_client.list_tables() | 
					
						
							|  |  |  |     len(table_desc.get("TableNames")).should.equal(1) | 
					
						
							|  |  |  |     conn.delete_stack(StackName="test_stack") | 
					
						
							|  |  |  |     table_desc = dynamodb_client.list_tables() | 
					
						
							|  |  |  |     len(table_desc.get("TableNames")).should.equal(0) | 
					
						
							|  |  |  |     conn.create_stack(StackName="test_stack", TemplateBody=json.dumps(dummy_template4)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-10-22 23:58:42 -04:00
										 |  |  | def test_describe_deleted_stack(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2014-10-22 23:58:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks("test_stack")[0] | 
					
						
							|  |  |  |     stack_id = stack.stack_id | 
					
						
							|  |  |  |     conn.delete_stack(stack.stack_id) | 
					
						
							|  |  |  |     stack_by_id = conn.describe_stacks(stack_id)[0] | 
					
						
							|  |  |  |     stack_by_id.stack_id.should.equal(stack.stack_id) | 
					
						
							|  |  |  |     stack_by_id.stack_name.should.equal("test_stack") | 
					
						
							|  |  |  |     stack_by_id.stack_status.should.equal("DELETE_COMPLETE") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | def test_get_template_by_name(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     template = conn.get_template("test_stack") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     template.should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "GetTemplateResponse": { | 
					
						
							|  |  |  |                 "GetTemplateResult": { | 
					
						
							|  |  |  |                     "TemplateBody": dummy_template_json, | 
					
						
							|  |  |  |                     "ResponseMetadata": { | 
					
						
							|  |  |  |                         "RequestId": "2d06e36c-ac1d-11e0-a958-f9382b6eb86bEXAMPLE" | 
					
						
							|  |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2015-10-05 15:21:30 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | def test_list_stacks(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							|  |  |  |     conn.create_stack("test_stack2", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     stacks = conn.list_stacks() | 
					
						
							|  |  |  |     stacks.should.have.length_of(2) | 
					
						
							|  |  |  |     stacks[0].template_description.should.equal("Stack 1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-12 18:09:42 +05:30
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							|  |  |  | def test_list_stacks_with_filter(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							|  |  |  |     conn.create_stack("test_stack2", template_body=dummy_template_json) | 
					
						
							|  |  |  |     conn.update_stack("test_stack", template_body=dummy_template_json2) | 
					
						
							|  |  |  |     stacks = conn.list_stacks("CREATE_COMPLETE") | 
					
						
							|  |  |  |     stacks.should.have.length_of(1) | 
					
						
							|  |  |  |     stacks[0].template_description.should.equal("Stack 1") | 
					
						
							|  |  |  |     stacks = conn.list_stacks("UPDATE_COMPLETE") | 
					
						
							|  |  |  |     stacks.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | def test_delete_stack_by_name(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-27 11:11:13 +00:00
										 |  |  |     conn.describe_stacks().should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  |     conn.delete_stack("test_stack") | 
					
						
							| 
									
										
										
										
											2018-11-27 11:11:13 +00:00
										 |  |  |     conn.describe_stacks().should.have.length_of(0) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | def test_delete_stack_by_id(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack_id = conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-27 11:11:13 +00:00
										 |  |  |     conn.describe_stacks().should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  |     conn.delete_stack(stack_id) | 
					
						
							| 
									
										
										
										
											2018-11-27 11:11:13 +00:00
										 |  |  |     conn.describe_stacks().should.have.length_of(0) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(BotoServerError): | 
					
						
							| 
									
										
										
										
											2014-10-23 14:57:46 -04:00
										 |  |  |         conn.describe_stacks("test_stack") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     conn.describe_stacks(stack_id).should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2014-03-27 19:12:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2016-06-07 13:31:42 -07:00
										 |  |  | def test_delete_stack_with_resource_missing_delete_attr(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json3) | 
					
						
							| 
									
										
										
										
											2016-06-07 13:31:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-27 11:11:13 +00:00
										 |  |  |     conn.describe_stacks().should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2016-06-07 13:31:42 -07:00
										 |  |  |     conn.delete_stack("test_stack") | 
					
						
							| 
									
										
										
										
											2018-11-27 11:11:13 +00:00
										 |  |  |     conn.describe_stacks().should.have.length_of(0) | 
					
						
							| 
									
										
										
										
											2016-06-07 13:31:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2014-10-23 14:46:54 -04:00
										 |  |  | def test_bad_describe_stack(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(BotoServerError): | 
					
						
							| 
									
										
										
										
											2014-10-23 14:46:54 -04:00
										 |  |  |         conn.describe_stacks("bad_stack") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated() | 
					
						
							| 
									
										
										
										
											2014-12-31 14:21:47 -05:00
										 |  |  | def test_cloudformation_params(): | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Description": "Stack 1", | 
					
						
							|  |  |  |         "Resources": {}, | 
					
						
							|  |  |  |         "Parameters": { | 
					
						
							|  |  |  |             "APPNAME": { | 
					
						
							|  |  |  |                 "Default": "app-name", | 
					
						
							|  |  |  |                 "Description": "The name of the app", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Type": "String", | 
					
						
							| 
									
										
										
										
											2014-12-31 14:21:47 -05:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-12-31 14:21:47 -05:00
										 |  |  |     } | 
					
						
							|  |  |  |     dummy_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     cfn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     cfn.create_stack( | 
					
						
							|  |  |  |         "test_stack1", | 
					
						
							|  |  |  |         template_body=dummy_template_json, | 
					
						
							|  |  |  |         parameters=[("APPNAME", "testing123")], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     stack = cfn.describe_stacks("test_stack1")[0] | 
					
						
							| 
									
										
										
										
											2014-12-31 14:21:47 -05:00
										 |  |  |     stack.parameters.should.have.length_of(1) | 
					
						
							|  |  |  |     param = stack.parameters[0] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     param.key.should.equal("APPNAME") | 
					
						
							|  |  |  |     param.value.should.equal("testing123") | 
					
						
							| 
									
										
										
										
											2014-12-31 14:21:47 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 09:58:39 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  | def test_cloudformation_params_conditions_and_resources_are_distinct(): | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Description": "Stack 1", | 
					
						
							|  |  |  |         "Conditions": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "FooEnabled": {"Fn::Equals": [{"Ref": "FooEnabled"}, "true"]}, | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  |             "FooDisabled": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Fn::Not": [{"Fn::Equals": [{"Ref": "FooEnabled"}, "true"]}] | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  |         }, | 
					
						
							|  |  |  |         "Parameters": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "FooEnabled": {"Type": "String", "AllowedValues": ["true", "false"]} | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  |         }, | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "Bar": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Properties": {"CidrBlock": "192.168.0.0/16"}, | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  |                 "Condition": "FooDisabled", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Type": "AWS::EC2::VPC", | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  |     } | 
					
						
							|  |  |  |     dummy_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     cfn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     cfn.create_stack( | 
					
						
							|  |  |  |         "test_stack1", | 
					
						
							|  |  |  |         template_body=dummy_template_json, | 
					
						
							|  |  |  |         parameters=[("FooEnabled", "true")], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     stack = cfn.describe_stacks("test_stack1")[0] | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  |     resources = stack.list_resources() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not [ | 
					
						
							|  |  |  |         resource for resource in resources if resource.logical_resource_id == "Bar" | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2017-03-05 14:26:23 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2015-08-31 16:48:36 -04:00
										 |  |  | def test_stack_tags(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     conn.create_stack( | 
					
						
							|  |  |  |         "test_stack", | 
					
						
							|  |  |  |         template_body=dummy_template_json, | 
					
						
							|  |  |  |         tags={"foo": "bar", "baz": "bleh"}, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							|  |  |  |     dict(stack.tags).should.equal({"foo": "bar", "baz": "bleh"}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2016-04-18 14:37:12 -04:00
										 |  |  | def test_update_stack(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2016-04-18 14:37:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     conn.update_stack("test_stack", dummy_template_json2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							| 
									
										
										
										
											2016-04-28 09:21:54 -04:00
										 |  |  |     stack.stack_status.should.equal("UPDATE_COMPLETE") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack.get_template().should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "GetTemplateResponse": { | 
					
						
							|  |  |  |                 "GetTemplateResult": { | 
					
						
							|  |  |  |                     "TemplateBody": dummy_template_json2, | 
					
						
							|  |  |  |                     "ResponseMetadata": { | 
					
						
							|  |  |  |                         "RequestId": "2d06e36c-ac1d-11e0-a958-f9382b6eb86bEXAMPLE" | 
					
						
							|  |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2016-04-18 14:37:12 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-04-28 09:21:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 21:52:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2017-03-17 23:57:57 +00:00
										 |  |  | def test_update_stack_with_previous_template(): | 
					
						
							| 
									
										
										
										
											2016-04-28 09:21:54 -04:00
										 |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2016-04-28 09:21:54 -04:00
										 |  |  |     conn.update_stack("test_stack", use_previous_template=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							|  |  |  |     stack.stack_status.should.equal("UPDATE_COMPLETE") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack.get_template().should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "GetTemplateResponse": { | 
					
						
							|  |  |  |                 "GetTemplateResult": { | 
					
						
							|  |  |  |                     "TemplateBody": dummy_template_json, | 
					
						
							|  |  |  |                     "ResponseMetadata": { | 
					
						
							|  |  |  |                         "RequestId": "2d06e36c-ac1d-11e0-a958-f9382b6eb86bEXAMPLE" | 
					
						
							|  |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2016-04-28 09:21:54 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-04-11 21:52:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 09:58:39 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2017-03-05 14:48:51 +11:00
										 |  |  | def test_update_stack_with_parameters(): | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Description": "Stack", | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "VPC": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Properties": {"CidrBlock": {"Ref": "Bar"}}, | 
					
						
							|  |  |  |                 "Type": "AWS::EC2::VPC", | 
					
						
							| 
									
										
										
										
											2017-03-05 14:48:51 +11:00
										 |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "Parameters": {"Bar": {"Type": "String"}}, | 
					
						
							| 
									
										
										
										
											2017-03-05 14:48:51 +11:00
										 |  |  |     } | 
					
						
							|  |  |  |     dummy_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     conn.create_stack( | 
					
						
							|  |  |  |         "test_stack", | 
					
						
							|  |  |  |         template_body=dummy_template_json, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         parameters=[("Bar", "192.168.0.0/16")], | 
					
						
							| 
									
										
										
										
											2017-03-05 14:48:51 +11:00
										 |  |  |     ) | 
					
						
							|  |  |  |     conn.update_stack( | 
					
						
							|  |  |  |         "test_stack", | 
					
						
							|  |  |  |         template_body=dummy_template_json, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         parameters=[("Bar", "192.168.0.1/16")], | 
					
						
							| 
									
										
										
										
											2017-03-05 14:48:51 +11:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							|  |  |  |     assert stack.parameters[0].value == "192.168.0.1/16" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-17 23:57:57 +00:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							|  |  |  | def test_update_stack_replace_tags(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     conn.create_stack( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test_stack", template_body=dummy_template_json, tags={"foo": "bar"} | 
					
						
							| 
									
										
										
										
											2017-03-17 23:57:57 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  |     conn.update_stack( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test_stack", template_body=dummy_template_json, tags={"foo": "baz"} | 
					
						
							| 
									
										
										
										
											2017-03-17 23:57:57 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							|  |  |  |     stack.stack_status.should.equal("UPDATE_COMPLETE") | 
					
						
							|  |  |  |     # since there is one tag it doesn't come out as a list | 
					
						
							|  |  |  |     dict(stack.tags).should.equal({"foo": "baz"}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2016-04-11 21:52:03 +00:00
										 |  |  | def test_update_stack_when_rolled_back(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack_id = conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2016-04-11 21:52:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     cloudformation_backends[conn.region.name].stacks[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         stack_id | 
					
						
							|  |  |  |     ].status = "ROLLBACK_COMPLETE" | 
					
						
							| 
									
										
										
										
											2016-04-11 21:52:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(BotoServerError) as err: | 
					
						
							| 
									
										
										
										
											2016-04-11 21:52:03 +00:00
										 |  |  |         conn.update_stack("test_stack", dummy_template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex = err.value | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ex.body.should.match(r"is in ROLLBACK_COMPLETE state and can not be updated") | 
					
						
							|  |  |  |     ex.error_code.should.equal("ValidationError") | 
					
						
							|  |  |  |     ex.reason.should.equal("Bad Request") | 
					
						
							| 
									
										
										
										
											2016-04-11 21:52:03 +00:00
										 |  |  |     ex.status.should.equal(400) | 
					
						
							| 
									
										
										
										
											2016-06-29 21:56:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_cloudformation_deprecated | 
					
						
							| 
									
										
										
										
											2016-06-29 21:56:39 +00:00
										 |  |  | def test_describe_stack_events_shows_create_update_and_delete(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack_id = conn.create_stack("test_stack", template_body=dummy_template_json) | 
					
						
							| 
									
										
										
										
											2016-06-29 21:56:39 +00:00
										 |  |  |     conn.update_stack(stack_id, template_body=dummy_template_json2) | 
					
						
							|  |  |  |     conn.delete_stack(stack_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # assert begins and ends with stack events | 
					
						
							|  |  |  |     events = conn.describe_stack_events(stack_id) | 
					
						
							|  |  |  |     events[0].resource_type.should.equal("AWS::CloudFormation::Stack") | 
					
						
							|  |  |  |     events[-1].resource_type.should.equal("AWS::CloudFormation::Stack") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # testing ordering of stack events without assuming resource events will not exist | 
					
						
							| 
									
										
										
										
											2017-03-04 20:00:25 -08:00
										 |  |  |     # the AWS API returns events in reverse chronological order | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     stack_events_to_look_for = iter( | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             ("DELETE_COMPLETE", None), | 
					
						
							|  |  |  |             ("DELETE_IN_PROGRESS", "User Initiated"), | 
					
						
							|  |  |  |             ("UPDATE_COMPLETE", None), | 
					
						
							|  |  |  |             ("UPDATE_IN_PROGRESS", "User Initiated"), | 
					
						
							|  |  |  |             ("CREATE_COMPLETE", None), | 
					
						
							|  |  |  |             ("CREATE_IN_PROGRESS", "User Initiated"), | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-06-29 21:56:39 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         for event in events: | 
					
						
							|  |  |  |             event.stack_id.should.equal(stack_id) | 
					
						
							|  |  |  |             event.stack_name.should.equal("test_stack") | 
					
						
							| 
									
										
										
										
											2017-03-04 20:12:55 -08:00
										 |  |  |             event.event_id.should.match(r"[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}") | 
					
						
							| 
									
										
										
										
											2016-06-29 21:56:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if event.resource_type == "AWS::CloudFormation::Stack": | 
					
						
							|  |  |  |                 event.logical_resource_id.should.equal("test_stack") | 
					
						
							|  |  |  |                 event.physical_resource_id.should.equal(stack_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 status_to_look_for, reason_to_look_for = next(stack_events_to_look_for) | 
					
						
							| 
									
										
										
										
											2016-06-29 21:56:39 +00:00
										 |  |  |                 event.resource_status.should.equal(status_to_look_for) | 
					
						
							|  |  |  |                 if reason_to_look_for is not None: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                     event.resource_status_reason.should.equal(reason_to_look_for) | 
					
						
							| 
									
										
										
										
											2016-06-29 21:56:39 +00:00
										 |  |  |     except StopIteration: | 
					
						
							|  |  |  |         assert False, "Too many stack events" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     list(stack_events_to_look_for).should.be.empty | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-16 15:42:51 +01:00
										 |  |  |     with pytest.raises(BotoServerError) as exp: | 
					
						
							|  |  |  |         conn.describe_stack_events("non_existing_stack") | 
					
						
							|  |  |  |     err = exp.value | 
					
						
							|  |  |  |     err.message.should.equal("Stack with id non_existing_stack does not exist") | 
					
						
							|  |  |  |     err.body.should.match(r"Stack with id non_existing_stack does not exist") | 
					
						
							|  |  |  |     err.error_code.should.equal("ValidationError") | 
					
						
							|  |  |  |     err.reason.should.equal("Bad Request") | 
					
						
							|  |  |  |     err.status.should.equal(400) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation_deprecated | 
					
						
							|  |  |  | def test_create_stack_lambda_and_dynamodb(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Description": "Stack Lambda Test 1", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "Parameters": {}, | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |         "Resources": { | 
					
						
							|  |  |  |             "func1": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Type": "AWS::Lambda::Function", | 
					
						
							|  |  |  |                 "Properties": { | 
					
						
							|  |  |  |                     "Code": {"S3Bucket": "bucket_123", "S3Key": "key_123"}, | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |                     "FunctionName": "func1", | 
					
						
							|  |  |  |                     "Handler": "handler.handler", | 
					
						
							| 
									
										
										
										
											2019-11-07 17:11:13 +00:00
										 |  |  |                     "Role": get_role_name(), | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |                     "Runtime": "python2.7", | 
					
						
							|  |  |  |                     "Description": "descr", | 
					
						
							|  |  |  |                     "MemorySize": 12345, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |             }, | 
					
						
							|  |  |  |             "func1version": { | 
					
						
							| 
									
										
										
										
											2019-08-20 21:54:57 -04:00
										 |  |  |                 "Type": "AWS::Lambda::Version", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Properties": {"FunctionName": {"Ref": "func1"}}, | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |             }, | 
					
						
							|  |  |  |             "tab1": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Type": "AWS::DynamoDB::Table", | 
					
						
							|  |  |  |                 "Properties": { | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |                     "TableName": "tab1", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                     "KeySchema": [{"AttributeName": "attr1", "KeyType": "HASH"}], | 
					
						
							|  |  |  |                     "AttributeDefinitions": [ | 
					
						
							|  |  |  |                         {"AttributeName": "attr1", "AttributeType": "string"} | 
					
						
							|  |  |  |                     ], | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |                     "ProvisionedThroughput": { | 
					
						
							|  |  |  |                         "ReadCapacityUnits": 10, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                         "WriteCapacityUnits": 10, | 
					
						
							|  |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2020-06-14 12:03:00 -03:00
										 |  |  |                     "StreamSpecification": {"StreamViewType": "KEYS_ONLY"}, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |             }, | 
					
						
							|  |  |  |             "func1mapping": { | 
					
						
							|  |  |  |                 "Type": "AWS::Lambda::EventSourceMapping", | 
					
						
							| 
									
										
										
										
											2019-08-20 21:54:57 -04:00
										 |  |  |                 "Properties": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                     "FunctionName": {"Ref": "func1"}, | 
					
						
							| 
									
										
										
										
											2020-06-14 12:03:00 -03:00
										 |  |  |                     "EventSourceArn": {"Fn::GetAtt": ["tab1", "StreamArn"]}, | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |                     "StartingPosition": "0", | 
					
						
							|  |  |  |                     "BatchSize": 100, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                     "Enabled": True, | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     validate_s3_before = os.environ.get("VALIDATE_LAMBDA_S3", "") | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         os.environ["VALIDATE_LAMBDA_S3"] = "false" | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |         conn.create_stack( | 
					
						
							|  |  |  |             "test_stack_lambda_1", | 
					
						
							|  |  |  |             template_body=json.dumps(dummy_template), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             parameters={}.items(), | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  |         ) | 
					
						
							|  |  |  |     finally: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         os.environ["VALIDATE_LAMBDA_S3"] = validate_s3_before | 
					
						
							| 
									
										
										
										
											2017-05-24 09:54:00 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							|  |  |  |     resources = stack.list_resources() | 
					
						
							|  |  |  |     assert len(resources) == 4 | 
					
						
							| 
									
										
										
										
											2017-07-20 14:25:46 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation_deprecated | 
					
						
							|  |  |  | def test_create_stack_kinesis(): | 
					
						
							|  |  |  |     conn = boto.connect_cloudformation() | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Description": "Stack Kinesis Test 1", | 
					
						
							|  |  |  |         "Parameters": {}, | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "stream1": { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Type": "AWS::Kinesis::Stream", | 
					
						
							|  |  |  |                 "Properties": {"Name": "stream1", "ShardCount": 2}, | 
					
						
							| 
									
										
										
										
											2017-07-20 14:25:46 +10:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2017-07-20 14:25:46 +10:00
										 |  |  |     } | 
					
						
							|  |  |  |     conn.create_stack( | 
					
						
							|  |  |  |         "test_stack_kinesis_1", | 
					
						
							|  |  |  |         template_body=json.dumps(dummy_template), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         parameters={}.items(), | 
					
						
							| 
									
										
										
										
											2017-07-20 14:25:46 +10:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = conn.describe_stacks()[0] | 
					
						
							|  |  |  |     resources = stack.list_resources() | 
					
						
							|  |  |  |     assert len(resources) == 1 | 
					
						
							| 
									
										
										
										
											2019-11-07 17:11:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_role_name(): | 
					
						
							| 
									
										
										
										
											2019-11-23 10:18:56 +00:00
										 |  |  |     with mock_iam_deprecated(): | 
					
						
							|  |  |  |         iam = boto.connect_iam() | 
					
						
							|  |  |  |         role = iam.create_role("my-role")["create_role_response"]["create_role_result"][ | 
					
						
							|  |  |  |             "role" | 
					
						
							|  |  |  |         ]["arn"] | 
					
						
							|  |  |  |         return role |