| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | import boto3 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-20 19:44:22 -08:00
										 |  |  | import sure  # noqa | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  | from moto import mock_autoscaling, mock_ec2,  mock_elbv2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-27 19:17:59 +00:00
										 |  |  | from utils import setup_networking | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  | @mock_elbv2 | 
					
						
							|  |  |  | @mock_autoscaling | 
					
						
							|  |  |  | def test_attach_detach_target_groups(): | 
					
						
							| 
									
										
										
										
											2017-12-27 19:17:59 +00:00
										 |  |  |     mocked_networking = setup_networking() | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  |     INSTANCE_COUNT = 2 | 
					
						
							|  |  |  |     client = boto3.client('autoscaling', region_name='us-east-1') | 
					
						
							|  |  |  |     elbv2_client = boto3.client('elbv2', region_name='us-east-1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = elbv2_client.create_target_group( | 
					
						
							|  |  |  |         Name='a-target', | 
					
						
							|  |  |  |         Protocol='HTTP', | 
					
						
							|  |  |  |         Port=8080, | 
					
						
							| 
									
										
										
										
											2017-12-27 19:17:59 +00:00
										 |  |  |         VpcId=mocked_networking['vpc'], | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  |         HealthCheckProtocol='HTTP', | 
					
						
							|  |  |  |         HealthCheckPort='8080', | 
					
						
							|  |  |  |         HealthCheckPath='/', | 
					
						
							|  |  |  |         HealthCheckIntervalSeconds=5, | 
					
						
							|  |  |  |         HealthCheckTimeoutSeconds=5, | 
					
						
							|  |  |  |         HealthyThresholdCount=5, | 
					
						
							|  |  |  |         UnhealthyThresholdCount=2, | 
					
						
							|  |  |  |         Matcher={'HttpCode': '200'}) | 
					
						
							|  |  |  |     target_group_arn = response['TargetGroups'][0]['TargetGroupArn'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.create_launch_configuration( | 
					
						
							|  |  |  |         LaunchConfigurationName='test_launch_configuration') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # create asg, attach to target group on create | 
					
						
							|  |  |  |     client.create_auto_scaling_group( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg', | 
					
						
							|  |  |  |         LaunchConfigurationName='test_launch_configuration', | 
					
						
							|  |  |  |         MinSize=0, | 
					
						
							|  |  |  |         MaxSize=INSTANCE_COUNT, | 
					
						
							|  |  |  |         DesiredCapacity=INSTANCE_COUNT, | 
					
						
							|  |  |  |         TargetGroupARNs=[target_group_arn], | 
					
						
							| 
									
										
										
										
											2017-12-27 19:17:59 +00:00
										 |  |  |         VPCZoneIdentifier=mocked_networking['subnet1']) | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  |     # create asg without attaching to target group | 
					
						
							|  |  |  |     client.create_auto_scaling_group( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg2', | 
					
						
							|  |  |  |         LaunchConfigurationName='test_launch_configuration', | 
					
						
							|  |  |  |         MinSize=0, | 
					
						
							|  |  |  |         MaxSize=INSTANCE_COUNT, | 
					
						
							|  |  |  |         DesiredCapacity=INSTANCE_COUNT, | 
					
						
							| 
									
										
										
										
											2017-12-27 19:17:59 +00:00
										 |  |  |         VPCZoneIdentifier=mocked_networking['subnet2']) | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     response = client.describe_load_balancer_target_groups( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg') | 
					
						
							|  |  |  |     list(response['LoadBalancerTargetGroups']).should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = elbv2_client.describe_target_health( | 
					
						
							|  |  |  |         TargetGroupArn=target_group_arn) | 
					
						
							|  |  |  |     list(response['TargetHealthDescriptions']).should.have.length_of(INSTANCE_COUNT) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.attach_load_balancer_target_groups( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg2', | 
					
						
							|  |  |  |         TargetGroupARNs=[target_group_arn]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = elbv2_client.describe_target_health( | 
					
						
							|  |  |  |         TargetGroupArn=target_group_arn) | 
					
						
							|  |  |  |     list(response['TargetHealthDescriptions']).should.have.length_of(INSTANCE_COUNT * 2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = client.detach_load_balancer_target_groups( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg2', | 
					
						
							|  |  |  |         TargetGroupARNs=[target_group_arn]) | 
					
						
							|  |  |  |     response = elbv2_client.describe_target_health( | 
					
						
							|  |  |  |         TargetGroupArn=target_group_arn) | 
					
						
							|  |  |  |     list(response['TargetHealthDescriptions']).should.have.length_of(INSTANCE_COUNT) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_elbv2 | 
					
						
							|  |  |  | @mock_autoscaling | 
					
						
							|  |  |  | def test_detach_all_target_groups(): | 
					
						
							| 
									
										
										
										
											2017-12-27 19:17:59 +00:00
										 |  |  |     mocked_networking = setup_networking() | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  |     INSTANCE_COUNT = 2 | 
					
						
							|  |  |  |     client = boto3.client('autoscaling', region_name='us-east-1') | 
					
						
							|  |  |  |     elbv2_client = boto3.client('elbv2', region_name='us-east-1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = elbv2_client.create_target_group( | 
					
						
							|  |  |  |         Name='a-target', | 
					
						
							|  |  |  |         Protocol='HTTP', | 
					
						
							|  |  |  |         Port=8080, | 
					
						
							| 
									
										
										
										
											2017-12-27 19:17:59 +00:00
										 |  |  |         VpcId=mocked_networking['vpc'], | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  |         HealthCheckProtocol='HTTP', | 
					
						
							|  |  |  |         HealthCheckPort='8080', | 
					
						
							|  |  |  |         HealthCheckPath='/', | 
					
						
							|  |  |  |         HealthCheckIntervalSeconds=5, | 
					
						
							|  |  |  |         HealthCheckTimeoutSeconds=5, | 
					
						
							|  |  |  |         HealthyThresholdCount=5, | 
					
						
							|  |  |  |         UnhealthyThresholdCount=2, | 
					
						
							|  |  |  |         Matcher={'HttpCode': '200'}) | 
					
						
							|  |  |  |     target_group_arn = response['TargetGroups'][0]['TargetGroupArn'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.create_launch_configuration( | 
					
						
							|  |  |  |         LaunchConfigurationName='test_launch_configuration') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.create_auto_scaling_group( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg', | 
					
						
							|  |  |  |         LaunchConfigurationName='test_launch_configuration', | 
					
						
							|  |  |  |         MinSize=0, | 
					
						
							|  |  |  |         MaxSize=INSTANCE_COUNT, | 
					
						
							|  |  |  |         DesiredCapacity=INSTANCE_COUNT, | 
					
						
							|  |  |  |         TargetGroupARNs=[target_group_arn], | 
					
						
							| 
									
										
										
										
											2017-12-27 19:17:59 +00:00
										 |  |  |         VPCZoneIdentifier=mocked_networking['vpc']) | 
					
						
							| 
									
										
										
										
											2017-10-17 02:42:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     response = client.describe_load_balancer_target_groups( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg') | 
					
						
							|  |  |  |     list(response['LoadBalancerTargetGroups']).should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = elbv2_client.describe_target_health( | 
					
						
							|  |  |  |         TargetGroupArn=target_group_arn) | 
					
						
							|  |  |  |     list(response['TargetHealthDescriptions']).should.have.length_of(INSTANCE_COUNT) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = client.detach_load_balancer_target_groups( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg', | 
					
						
							|  |  |  |         TargetGroupARNs=[target_group_arn]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = elbv2_client.describe_target_health( | 
					
						
							|  |  |  |         TargetGroupArn=target_group_arn) | 
					
						
							|  |  |  |     list(response['TargetHealthDescriptions']).should.have.length_of(0) | 
					
						
							|  |  |  |     response = client.describe_load_balancer_target_groups( | 
					
						
							|  |  |  |         AutoScalingGroupName='test_asg') | 
					
						
							|  |  |  |     list(response['LoadBalancerTargetGroups']).should.have.length_of(0) |