| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2021-10-15 22:43:00 +00:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  | import sure  # noqa # pylint: disable=unused-import | 
					
						
							| 
									
										
										
										
											2019-12-26 17:12:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 22:43:00 +00:00
										 |  |  | from botocore.exceptions import ClientError | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | from moto import mock_autoscaling, mock_ec2, mock_elb | 
					
						
							| 
									
										
										
										
											2014-08-26 16:42:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  | from tests import EXAMPLE_AMI_ID, EXAMPLE_AMI_ID2 | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  | from uuid import uuid4 | 
					
						
							|  |  |  | from .test_instances import retrieve_all_instances | 
					
						
							| 
									
										
										
										
											2017-05-26 12:37:33 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | def add_servers_to_region_boto3(ami_id, count, region): | 
					
						
							|  |  |  |     ec2 = boto3.resource("ec2", region_name=region) | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |     return ec2.create_instances(ImageId=ami_id, MinCount=count, MaxCount=count) | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_add_servers_to_a_single_region_boto3(): | 
					
						
							|  |  |  |     region = "ap-northeast-1" | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |     id_1 = add_servers_to_region_boto3(EXAMPLE_AMI_ID, 1, region)[0].id | 
					
						
							|  |  |  |     id_2 = add_servers_to_region_boto3(EXAMPLE_AMI_ID2, 1, region)[0].id | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     client = boto3.client("ec2", region_name=region) | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |     instances = retrieve_all_instances(client) | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |     instance1 = [i for i in instances if i["InstanceId"] == id_1][0] | 
					
						
							|  |  |  |     instance1["ImageId"].should.equal(EXAMPLE_AMI_ID) | 
					
						
							|  |  |  |     instance2 = [i for i in instances if i["InstanceId"] == id_2][0] | 
					
						
							|  |  |  |     instance2["ImageId"].should.equal(EXAMPLE_AMI_ID2) | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_add_servers_to_multiple_regions_boto3(): | 
					
						
							|  |  |  |     region1 = "us-east-1" | 
					
						
							|  |  |  |     region2 = "ap-northeast-1" | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |     us_id = add_servers_to_region_boto3(EXAMPLE_AMI_ID, 1, region1)[0].id | 
					
						
							|  |  |  |     ap_id = add_servers_to_region_boto3(EXAMPLE_AMI_ID2, 1, region2)[0].id | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     us_client = boto3.client("ec2", region_name=region1) | 
					
						
							|  |  |  |     ap_client = boto3.client("ec2", region_name=region2) | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |     us_instances = retrieve_all_instances(us_client) | 
					
						
							|  |  |  |     ap_instances = retrieve_all_instances(ap_client) | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |     [r["InstanceId"] for r in us_instances].should.contain(us_id) | 
					
						
							|  |  |  |     [r["InstanceId"] for r in us_instances].shouldnt.contain(ap_id) | 
					
						
							|  |  |  |     [r["InstanceId"] for r in ap_instances].should.contain(ap_id) | 
					
						
							|  |  |  |     [r["InstanceId"] for r in ap_instances].shouldnt.contain(us_id) | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |     us_instance = us_client.describe_instances(InstanceIds=[us_id])["Reservations"][0][ | 
					
						
							|  |  |  |         "Instances" | 
					
						
							|  |  |  |     ][0] | 
					
						
							|  |  |  |     us_instance["ImageId"].should.equal(EXAMPLE_AMI_ID) | 
					
						
							|  |  |  |     ap_instance = ap_client.describe_instances(InstanceIds=[ap_id])["Reservations"][0][ | 
					
						
							|  |  |  |         "Instances" | 
					
						
							|  |  |  |     ][0] | 
					
						
							|  |  |  |     ap_instance["ImageId"].should.equal(EXAMPLE_AMI_ID2) | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_autoscaling | 
					
						
							|  |  |  | @mock_elb | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_create_autoscaling_group_boto3(): | 
					
						
							|  |  |  |     regions = [("us-east-1", "c"), ("ap-northeast-1", "a")] | 
					
						
							|  |  |  |     for region, zone in regions: | 
					
						
							|  |  |  |         a_zone = "{}{}".format(region, zone) | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |         asg_name = "{}_tester_group_{}".format(region, str(uuid4())[0:6]) | 
					
						
							|  |  |  |         lb_name = "{}_lb_{}".format(region, str(uuid4())[0:6]) | 
					
						
							|  |  |  |         config_name = "{}_tester_{}".format(region, str(uuid4())[0:6]) | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         elb_client = boto3.client("elb", region_name=region) | 
					
						
							|  |  |  |         elb_client.create_load_balancer( | 
					
						
							|  |  |  |             LoadBalancerName=lb_name, | 
					
						
							|  |  |  |             Listeners=[ | 
					
						
							|  |  |  |                 {"Protocol": "http", "LoadBalancerPort": 80, "InstancePort": 8080} | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |             AvailabilityZones=[], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         as_client = boto3.client("autoscaling", region_name=region) | 
					
						
							|  |  |  |         as_client.create_launch_configuration( | 
					
						
							|  |  |  |             LaunchConfigurationName=config_name, | 
					
						
							|  |  |  |             ImageId=EXAMPLE_AMI_ID, | 
					
						
							|  |  |  |             InstanceType="m1.small", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ec2_client = boto3.client("ec2", region_name=region) | 
					
						
							|  |  |  |         subnet_id = ec2_client.describe_subnets( | 
					
						
							|  |  |  |             Filters=[{"Name": "availability-zone", "Values": [a_zone]}] | 
					
						
							|  |  |  |         )["Subnets"][0]["SubnetId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         as_client.create_auto_scaling_group( | 
					
						
							|  |  |  |             AutoScalingGroupName=asg_name, | 
					
						
							|  |  |  |             AvailabilityZones=[a_zone], | 
					
						
							|  |  |  |             DefaultCooldown=60, | 
					
						
							|  |  |  |             DesiredCapacity=2, | 
					
						
							|  |  |  |             HealthCheckGracePeriod=100, | 
					
						
							|  |  |  |             HealthCheckType="EC2", | 
					
						
							|  |  |  |             LaunchConfigurationName=config_name, | 
					
						
							|  |  |  |             LoadBalancerNames=[lb_name], | 
					
						
							|  |  |  |             MinSize=2, | 
					
						
							|  |  |  |             MaxSize=2, | 
					
						
							|  |  |  |             PlacementGroup="us_test_placement", | 
					
						
							|  |  |  |             VPCZoneIdentifier=subnet_id, | 
					
						
							|  |  |  |             TerminationPolicies=["OldestInstance", "NewestInstance"], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 17:11:07 +00:00
										 |  |  |         groups = as_client.describe_auto_scaling_groups( | 
					
						
							|  |  |  |             AutoScalingGroupNames=[asg_name] | 
					
						
							|  |  |  |         )["AutoScalingGroups"] | 
					
						
							| 
									
										
										
										
											2021-09-25 11:13:07 +00:00
										 |  |  |         groups.should.have.length_of(1) | 
					
						
							|  |  |  |         group = groups[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         group["AutoScalingGroupName"].should.equal(asg_name) | 
					
						
							|  |  |  |         group["DesiredCapacity"].should.equal(2) | 
					
						
							|  |  |  |         group["MaxSize"].should.equal(2) | 
					
						
							|  |  |  |         group["MinSize"].should.equal(2) | 
					
						
							|  |  |  |         group["VPCZoneIdentifier"].should.equal(subnet_id) | 
					
						
							|  |  |  |         group["LaunchConfigurationName"].should.equal(config_name) | 
					
						
							|  |  |  |         group["DefaultCooldown"].should.equal(60) | 
					
						
							|  |  |  |         group["HealthCheckGracePeriod"].should.equal(100) | 
					
						
							|  |  |  |         group["HealthCheckType"].should.equal("EC2") | 
					
						
							|  |  |  |         group["LoadBalancerNames"].should.equal([lb_name]) | 
					
						
							|  |  |  |         group["PlacementGroup"].should.equal("us_test_placement") | 
					
						
							|  |  |  |         group["TerminationPolicies"].should.equal(["OldestInstance", "NewestInstance"]) | 
					
						
							| 
									
										
										
										
											2021-10-15 22:43:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_describe_regions_dryrun(): | 
					
						
							|  |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.describe_regions(DryRun=True) | 
					
						
							|  |  |  |     ex.value.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(412) | 
					
						
							|  |  |  |     ex.value.response["Error"]["Code"].should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "An error occurred (DryRunOperation) when calling the DescribeRegions operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) |