| 
									
										
										
										
											2021-08-04 17:24:26 +01:00
										 |  |  | import boto3 | 
					
						
							|  |  |  | import json | 
					
						
							|  |  |  | import sure  # noqa | 
					
						
							|  |  |  | from moto import mock_cloudformation, mock_ec2, mock_rds2 | 
					
						
							| 
									
										
										
										
											2021-10-04 13:47:40 +00:00
										 |  |  | from tests.test_cloudformation.fixtures import rds_mysql_with_db_parameter_group | 
					
						
							|  |  |  | from tests.test_cloudformation.fixtures import rds_mysql_with_read_replica | 
					
						
							| 
									
										
										
										
											2021-08-04 17:24:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | @mock_rds2 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | def test_create_subnetgroup_via_cf(): | 
					
						
							|  |  |  |     vpc_conn = boto3.client("ec2", "us-west-2") | 
					
						
							|  |  |  |     vpc = vpc_conn.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"] | 
					
						
							|  |  |  |     subnet = vpc_conn.create_subnet(VpcId=vpc["VpcId"], CidrBlock="10.0.1.0/24")[ | 
					
						
							|  |  |  |         "Subnet" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rds = boto3.client("rds", region_name="us-west-2") | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", region_name="us-west-2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "subnet": { | 
					
						
							|  |  |  |                 "Type": "AWS::RDS::DBSubnetGroup", | 
					
						
							|  |  |  |                 "Properties": { | 
					
						
							|  |  |  |                     "DBSubnetGroupName": "subnetgroupname", | 
					
						
							|  |  |  |                     "DBSubnetGroupDescription": "subnetgroupdesc", | 
					
						
							|  |  |  |                     "SubnetIds": [subnet["SubnetId"]], | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     template_json = json.dumps(template) | 
					
						
							|  |  |  |     cf.create_stack(StackName="test_stack", TemplateBody=template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = rds.describe_db_subnet_groups()["DBSubnetGroups"] | 
					
						
							|  |  |  |     response.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     created_subnet = response[0] | 
					
						
							|  |  |  |     created_subnet.should.have.key("DBSubnetGroupName").equal("subnetgroupname") | 
					
						
							|  |  |  |     created_subnet.should.have.key("DBSubnetGroupDescription").equal("subnetgroupdesc") | 
					
						
							|  |  |  |     created_subnet.should.have.key("VpcId").equal(vpc["VpcId"]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | @mock_rds2 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | def test_create_dbinstance_via_cf(): | 
					
						
							|  |  |  |     vpc_conn = boto3.client("ec2", "us-west-2") | 
					
						
							|  |  |  |     vpc = vpc_conn.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"] | 
					
						
							|  |  |  |     vpc_conn.create_subnet(VpcId=vpc["VpcId"], CidrBlock="10.0.1.0/24") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rds = boto3.client("rds", region_name="us-west-2") | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", region_name="us-west-2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "db": { | 
					
						
							|  |  |  |                 "Type": "AWS::RDS::DBInstance", | 
					
						
							|  |  |  |                 "Properties": { | 
					
						
							|  |  |  |                     "Port": 3307, | 
					
						
							|  |  |  |                     "Engine": "mysql", | 
					
						
							|  |  |  |                     # Required - throws exception when describing an instance without tags | 
					
						
							|  |  |  |                     "Tags": [], | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     template_json = json.dumps(template) | 
					
						
							|  |  |  |     cf.create_stack(StackName="test_stack", TemplateBody=template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     summaries = cf.list_stack_resources(StackName="test_stack")[ | 
					
						
							|  |  |  |         "StackResourceSummaries" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     db_instance_identifier = summaries[0]["PhysicalResourceId"] | 
					
						
							|  |  |  |     resp = rds.describe_db_instances()["DBInstances"] | 
					
						
							|  |  |  |     resp.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     created = resp[0] | 
					
						
							|  |  |  |     created["DBInstanceIdentifier"].should.equal(db_instance_identifier) | 
					
						
							|  |  |  |     created["Engine"].should.equal("mysql") | 
					
						
							|  |  |  |     created["DBInstanceStatus"].should.equal("available") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | @mock_rds2 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | def test_create_dbsecuritygroup_via_cf(): | 
					
						
							|  |  |  |     vpc_conn = boto3.client("ec2", "us-west-2") | 
					
						
							|  |  |  |     vpc = vpc_conn.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"] | 
					
						
							|  |  |  |     vpc_conn.create_subnet(VpcId=vpc["VpcId"], CidrBlock="10.0.1.0/24") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rds = boto3.client("rds", region_name="us-west-2") | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", region_name="us-west-2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "db": { | 
					
						
							|  |  |  |                 "Type": "AWS::RDS::DBSecurityGroup", | 
					
						
							|  |  |  |                 "Properties": {"GroupDescription": "my sec group"}, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     template_json = json.dumps(template) | 
					
						
							|  |  |  |     cf.create_stack(StackName="test_stack", TemplateBody=template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = rds.describe_db_security_groups()["DBSecurityGroups"] | 
					
						
							|  |  |  |     result.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     created = result[0] | 
					
						
							|  |  |  |     created["DBSecurityGroupDescription"].should.equal("my sec group") | 
					
						
							| 
									
										
										
										
											2021-10-04 13:47:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | @mock_rds2 | 
					
						
							|  |  |  | def test_rds_db_parameter_groups(): | 
					
						
							|  |  |  |     ec2_conn = boto3.client("ec2", region_name="us-west-1") | 
					
						
							|  |  |  |     ec2_conn.create_security_group( | 
					
						
							|  |  |  |         GroupName="application", Description="Our Application Group" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_json = json.dumps(rds_mysql_with_db_parameter_group.template) | 
					
						
							|  |  |  |     cf_conn = boto3.client("cloudformation", "us-west-1") | 
					
						
							|  |  |  |     cf_conn.create_stack( | 
					
						
							|  |  |  |         StackName="test_stack", | 
					
						
							|  |  |  |         TemplateBody=template_json, | 
					
						
							|  |  |  |         Parameters=[ | 
					
						
							|  |  |  |             {"ParameterKey": key, "ParameterValue": value} | 
					
						
							|  |  |  |             for key, value in [ | 
					
						
							|  |  |  |                 ("DBInstanceIdentifier", "master_db"), | 
					
						
							|  |  |  |                 ("DBName", "my_db"), | 
					
						
							|  |  |  |                 ("DBUser", "my_user"), | 
					
						
							|  |  |  |                 ("DBPassword", "my_password"), | 
					
						
							|  |  |  |                 ("DBAllocatedStorage", "20"), | 
					
						
							|  |  |  |                 ("DBInstanceClass", "db.m1.medium"), | 
					
						
							|  |  |  |                 ("EC2SecurityGroup", "application"), | 
					
						
							|  |  |  |                 ("MultiAZ", "true"), | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rds_conn = boto3.client("rds", region_name="us-west-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     db_parameter_groups = rds_conn.describe_db_parameter_groups() | 
					
						
							|  |  |  |     db_parameter_groups["DBParameterGroups"].should.have.length_of(1) | 
					
						
							|  |  |  |     db_parameter_group_name = db_parameter_groups["DBParameterGroups"][0][ | 
					
						
							|  |  |  |         "DBParameterGroupName" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     found_cloudformation_set_parameter = False | 
					
						
							|  |  |  |     for db_parameter in rds_conn.describe_db_parameters( | 
					
						
							|  |  |  |         DBParameterGroupName=db_parameter_group_name | 
					
						
							|  |  |  |     )["Parameters"]: | 
					
						
							|  |  |  |         if ( | 
					
						
							|  |  |  |             db_parameter["ParameterName"] == "BACKLOG_QUEUE_LIMIT" | 
					
						
							|  |  |  |             and db_parameter["ParameterValue"] == "2048" | 
					
						
							|  |  |  |         ): | 
					
						
							|  |  |  |             found_cloudformation_set_parameter = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     found_cloudformation_set_parameter.should.equal(True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | @mock_rds2 | 
					
						
							|  |  |  | def test_rds_mysql_with_read_replica(): | 
					
						
							|  |  |  |     ec2_conn = boto3.client("ec2", region_name="us-west-1") | 
					
						
							|  |  |  |     ec2_conn.create_security_group( | 
					
						
							|  |  |  |         GroupName="application", Description="Our Application Group" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_json = json.dumps(rds_mysql_with_read_replica.template) | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", "us-west-1") | 
					
						
							|  |  |  |     cf.create_stack( | 
					
						
							|  |  |  |         StackName="test_stack", | 
					
						
							|  |  |  |         TemplateBody=template_json, | 
					
						
							|  |  |  |         Parameters=[ | 
					
						
							|  |  |  |             {"ParameterKey": "DBInstanceIdentifier", "ParameterValue": "master_db"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBName", "ParameterValue": "my_db"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBUser", "ParameterValue": "my_user"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBPassword", "ParameterValue": "my_password"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBAllocatedStorage", "ParameterValue": "20"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBInstanceClass", "ParameterValue": "db.m1.medium"}, | 
					
						
							|  |  |  |             {"ParameterKey": "EC2SecurityGroup", "ParameterValue": "application"}, | 
					
						
							|  |  |  |             {"ParameterKey": "MultiAZ", "ParameterValue": "true"}, | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rds = boto3.client("rds", region_name="us-west-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     primary = rds.describe_db_instances(DBInstanceIdentifier="master_db")[ | 
					
						
							|  |  |  |         "DBInstances" | 
					
						
							|  |  |  |     ][0] | 
					
						
							|  |  |  |     primary.should.have.key("MasterUsername").equal("my_user") | 
					
						
							|  |  |  |     primary.should.have.key("AllocatedStorage").equal(20) | 
					
						
							|  |  |  |     primary.should.have.key("DBInstanceClass").equal("db.m1.medium") | 
					
						
							|  |  |  |     primary.should.have.key("MultiAZ").equal(True) | 
					
						
							|  |  |  |     primary.should.have.key("ReadReplicaDBInstanceIdentifiers").being.length_of(1) | 
					
						
							|  |  |  |     replica_id = primary["ReadReplicaDBInstanceIdentifiers"][0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     replica = rds.describe_db_instances(DBInstanceIdentifier=replica_id)["DBInstances"][ | 
					
						
							|  |  |  |         0 | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     replica.should.have.key("DBInstanceClass").equal("db.m1.medium") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     security_group_name = primary["DBSecurityGroups"][0]["DBSecurityGroupName"] | 
					
						
							|  |  |  |     security_group = rds.describe_db_security_groups( | 
					
						
							|  |  |  |         DBSecurityGroupName=security_group_name | 
					
						
							|  |  |  |     )["DBSecurityGroups"][0] | 
					
						
							|  |  |  |     security_group["EC2SecurityGroups"][0]["EC2SecurityGroupName"].should.equal( | 
					
						
							|  |  |  |         "application" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | @mock_rds2 | 
					
						
							|  |  |  | def test_rds_mysql_with_read_replica_in_vpc(): | 
					
						
							|  |  |  |     template_json = json.dumps(rds_mysql_with_read_replica.template) | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", "eu-central-1") | 
					
						
							|  |  |  |     cf.create_stack( | 
					
						
							|  |  |  |         StackName="test_stack", | 
					
						
							|  |  |  |         TemplateBody=template_json, | 
					
						
							|  |  |  |         Parameters=[ | 
					
						
							|  |  |  |             {"ParameterKey": "DBInstanceIdentifier", "ParameterValue": "master_db"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBName", "ParameterValue": "my_db"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBUser", "ParameterValue": "my_user"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBPassword", "ParameterValue": "my_password"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBAllocatedStorage", "ParameterValue": "20"}, | 
					
						
							|  |  |  |             {"ParameterKey": "DBInstanceClass", "ParameterValue": "db.m1.medium"}, | 
					
						
							|  |  |  |             {"ParameterKey": "MultiAZ", "ParameterValue": "true"}, | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rds = boto3.client("rds", region_name="eu-central-1") | 
					
						
							|  |  |  |     primary = rds.describe_db_instances(DBInstanceIdentifier="master_db")[ | 
					
						
							|  |  |  |         "DBInstances" | 
					
						
							|  |  |  |     ][0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     subnet_group_name = primary["DBSubnetGroup"]["DBSubnetGroupName"] | 
					
						
							|  |  |  |     subnet_group = rds.describe_db_subnet_groups(DBSubnetGroupName=subnet_group_name)[ | 
					
						
							|  |  |  |         "DBSubnetGroups" | 
					
						
							|  |  |  |     ][0] | 
					
						
							|  |  |  |     subnet_group.should.have.key("DBSubnetGroupDescription").equal("my db subnet group") |