277 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			277 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import boto3
							 | 
						||
| 
								 | 
							
								import sure  # noqa
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from moto import (
							 | 
						||
| 
								 | 
							
								    mock_autoscaling,
							 | 
						||
| 
								 | 
							
								    mock_cloudformation,
							 | 
						||
| 
								 | 
							
								    mock_ec2,
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from utils import setup_networking
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_autoscaling
							 | 
						||
| 
								 | 
							
								@mock_cloudformation
							 | 
						||
| 
								 | 
							
								def test_launch_configuration():
							 | 
						||
| 
								 | 
							
								    cf_client = boto3.client("cloudformation", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								    client = boto3.client("autoscaling", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    stack_name = "test-launch-configuration"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_template = """
							 | 
						||
| 
								 | 
							
								Resources:
							 | 
						||
| 
								 | 
							
								    LaunchConfiguration:
							 | 
						||
| 
								 | 
							
								        Type: AWS::AutoScaling::LaunchConfiguration
							 | 
						||
| 
								 | 
							
								        Properties:
							 | 
						||
| 
								 | 
							
								            ImageId: ami-0cc293023f983ed53
							 | 
						||
| 
								 | 
							
								            InstanceType: t2.micro
							 | 
						||
| 
								 | 
							
								            LaunchConfigurationName: test_launch_configuration
							 | 
						||
| 
								 | 
							
								Outputs:
							 | 
						||
| 
								 | 
							
								    LaunchConfigurationName:
							 | 
						||
| 
								 | 
							
								        Value: !Ref LaunchConfiguration
							 | 
						||
| 
								 | 
							
								""".strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_client.create_stack(
							 | 
						||
| 
								 | 
							
								        StackName=stack_name, TemplateBody=cf_template,
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    stack = cf_client.describe_stacks(StackName=stack_name)["Stacks"][0]
							 | 
						||
| 
								 | 
							
								    stack["Outputs"][0]["OutputValue"].should.be.equal("test_launch_configuration")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    lc = client.describe_launch_configurations()["LaunchConfigurations"][0]
							 | 
						||
| 
								 | 
							
								    lc["LaunchConfigurationName"].should.be.equal("test_launch_configuration")
							 | 
						||
| 
								 | 
							
								    lc["ImageId"].should.be.equal("ami-0cc293023f983ed53")
							 | 
						||
| 
								 | 
							
								    lc["InstanceType"].should.be.equal("t2.micro")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_template = """
							 | 
						||
| 
								 | 
							
								Resources:
							 | 
						||
| 
								 | 
							
								    LaunchConfiguration:
							 | 
						||
| 
								 | 
							
								        Type: AWS::AutoScaling::LaunchConfiguration
							 | 
						||
| 
								 | 
							
								        Properties:
							 | 
						||
| 
								 | 
							
								            ImageId: ami-1ea5b10a3d8867db4
							 | 
						||
| 
								 | 
							
								            InstanceType: m5.large
							 | 
						||
| 
								 | 
							
								            LaunchConfigurationName: test_launch_configuration
							 | 
						||
| 
								 | 
							
								Outputs:
							 | 
						||
| 
								 | 
							
								    LaunchConfigurationName:
							 | 
						||
| 
								 | 
							
								        Value: !Ref LaunchConfiguration
							 | 
						||
| 
								 | 
							
								""".strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_client.update_stack(
							 | 
						||
| 
								 | 
							
								        StackName=stack_name, TemplateBody=cf_template,
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    stack = cf_client.describe_stacks(StackName=stack_name)["Stacks"][0]
							 | 
						||
| 
								 | 
							
								    stack["Outputs"][0]["OutputValue"].should.be.equal("test_launch_configuration")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    lc = client.describe_launch_configurations()["LaunchConfigurations"][0]
							 | 
						||
| 
								 | 
							
								    lc["LaunchConfigurationName"].should.be.equal("test_launch_configuration")
							 | 
						||
| 
								 | 
							
								    lc["ImageId"].should.be.equal("ami-1ea5b10a3d8867db4")
							 | 
						||
| 
								 | 
							
								    lc["InstanceType"].should.be.equal("m5.large")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_autoscaling
							 | 
						||
| 
								 | 
							
								@mock_cloudformation
							 | 
						||
| 
								 | 
							
								def test_autoscaling_group_from_launch_config():
							 | 
						||
| 
								 | 
							
								    subnet_id = setup_networking()["subnet1"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_client = boto3.client("cloudformation", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								    client = boto3.client("autoscaling", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    client.create_launch_configuration(
							 | 
						||
| 
								 | 
							
								        LaunchConfigurationName="test_launch_configuration", InstanceType="t2.micro",
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    stack_name = "test-auto-scaling-group"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_template = """
							 | 
						||
| 
								 | 
							
								Parameters:
							 | 
						||
| 
								 | 
							
								    SubnetId:
							 | 
						||
| 
								 | 
							
								        Type: AWS::EC2::Subnet::Id
							 | 
						||
| 
								 | 
							
								Resources:
							 | 
						||
| 
								 | 
							
								    AutoScalingGroup:
							 | 
						||
| 
								 | 
							
								        Type: AWS::AutoScaling::AutoScalingGroup
							 | 
						||
| 
								 | 
							
								        Properties:
							 | 
						||
| 
								 | 
							
								            AutoScalingGroupName: test_auto_scaling_group
							 | 
						||
| 
								 | 
							
								            AvailabilityZones:
							 | 
						||
| 
								 | 
							
								                - us-east-1a
							 | 
						||
| 
								 | 
							
								            LaunchConfigurationName: test_launch_configuration
							 | 
						||
| 
								 | 
							
								            MaxSize: "5"
							 | 
						||
| 
								 | 
							
								            MinSize: "1"
							 | 
						||
| 
								 | 
							
								            VPCZoneIdentifier:
							 | 
						||
| 
								 | 
							
								                - !Ref SubnetId
							 | 
						||
| 
								 | 
							
								Outputs:
							 | 
						||
| 
								 | 
							
								    AutoScalingGroupName:
							 | 
						||
| 
								 | 
							
								        Value: !Ref AutoScalingGroup
							 | 
						||
| 
								 | 
							
								""".strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_client.create_stack(
							 | 
						||
| 
								 | 
							
								        StackName=stack_name,
							 | 
						||
| 
								 | 
							
								        TemplateBody=cf_template,
							 | 
						||
| 
								 | 
							
								        Parameters=[{"ParameterKey": "SubnetId", "ParameterValue": subnet_id}],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    stack = cf_client.describe_stacks(StackName=stack_name)["Stacks"][0]
							 | 
						||
| 
								 | 
							
								    stack["Outputs"][0]["OutputValue"].should.be.equal("test_auto_scaling_group")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    asg = client.describe_auto_scaling_groups()["AutoScalingGroups"][0]
							 | 
						||
| 
								 | 
							
								    asg["AutoScalingGroupName"].should.be.equal("test_auto_scaling_group")
							 | 
						||
| 
								 | 
							
								    asg["MinSize"].should.be.equal(1)
							 | 
						||
| 
								 | 
							
								    asg["MaxSize"].should.be.equal(5)
							 | 
						||
| 
								 | 
							
								    asg["LaunchConfigurationName"].should.be.equal("test_launch_configuration")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    client.create_launch_configuration(
							 | 
						||
| 
								 | 
							
								        LaunchConfigurationName="test_launch_configuration_new",
							 | 
						||
| 
								 | 
							
								        InstanceType="t2.micro",
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_template = """
							 | 
						||
| 
								 | 
							
								Parameters:
							 | 
						||
| 
								 | 
							
								    SubnetId:
							 | 
						||
| 
								 | 
							
								        Type: AWS::EC2::Subnet::Id
							 | 
						||
| 
								 | 
							
								Resources:
							 | 
						||
| 
								 | 
							
								    AutoScalingGroup:
							 | 
						||
| 
								 | 
							
								        Type: AWS::AutoScaling::AutoScalingGroup
							 | 
						||
| 
								 | 
							
								        Properties:
							 | 
						||
| 
								 | 
							
								            AutoScalingGroupName: test_auto_scaling_group
							 | 
						||
| 
								 | 
							
								            AvailabilityZones:
							 | 
						||
| 
								 | 
							
								                - us-east-1a
							 | 
						||
| 
								 | 
							
								            LaunchConfigurationName: test_launch_configuration_new
							 | 
						||
| 
								 | 
							
								            MaxSize: "6"
							 | 
						||
| 
								 | 
							
								            MinSize: "2"
							 | 
						||
| 
								 | 
							
								            VPCZoneIdentifier:
							 | 
						||
| 
								 | 
							
								                - !Ref SubnetId
							 | 
						||
| 
								 | 
							
								Outputs:
							 | 
						||
| 
								 | 
							
								    AutoScalingGroupName:
							 | 
						||
| 
								 | 
							
								        Value: !Ref AutoScalingGroup
							 | 
						||
| 
								 | 
							
								""".strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_client.update_stack(
							 | 
						||
| 
								 | 
							
								        StackName=stack_name,
							 | 
						||
| 
								 | 
							
								        TemplateBody=cf_template,
							 | 
						||
| 
								 | 
							
								        Parameters=[{"ParameterKey": "SubnetId", "ParameterValue": subnet_id}],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    stack = cf_client.describe_stacks(StackName=stack_name)["Stacks"][0]
							 | 
						||
| 
								 | 
							
								    stack["Outputs"][0]["OutputValue"].should.be.equal("test_auto_scaling_group")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    asg = client.describe_auto_scaling_groups()["AutoScalingGroups"][0]
							 | 
						||
| 
								 | 
							
								    asg["AutoScalingGroupName"].should.be.equal("test_auto_scaling_group")
							 | 
						||
| 
								 | 
							
								    asg["MinSize"].should.be.equal(2)
							 | 
						||
| 
								 | 
							
								    asg["MaxSize"].should.be.equal(6)
							 | 
						||
| 
								 | 
							
								    asg["LaunchConfigurationName"].should.be.equal("test_launch_configuration_new")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_autoscaling
							 | 
						||
| 
								 | 
							
								@mock_cloudformation
							 | 
						||
| 
								 | 
							
								@mock_ec2
							 | 
						||
| 
								 | 
							
								def test_autoscaling_group_from_launch_template():
							 | 
						||
| 
								 | 
							
								    subnet_id = setup_networking()["subnet1"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_client = boto3.client("cloudformation", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								    ec2_client = boto3.client("ec2", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								    client = boto3.client("autoscaling", region_name="us-east-1")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template_response = ec2_client.create_launch_template(
							 | 
						||
| 
								 | 
							
								        LaunchTemplateName="test_launch_template",
							 | 
						||
| 
								 | 
							
								        LaunchTemplateData={
							 | 
						||
| 
								 | 
							
								            "ImageId": "ami-0cc293023f983ed53",
							 | 
						||
| 
								 | 
							
								            "InstanceType": "t2.micro",
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    launch_template_id = template_response["LaunchTemplate"]["LaunchTemplateId"]
							 | 
						||
| 
								 | 
							
								    stack_name = "test-auto-scaling-group"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_template = """
							 | 
						||
| 
								 | 
							
								Parameters:
							 | 
						||
| 
								 | 
							
								    SubnetId:
							 | 
						||
| 
								 | 
							
								        Type: AWS::EC2::Subnet::Id
							 | 
						||
| 
								 | 
							
								    LaunchTemplateId:
							 | 
						||
| 
								 | 
							
								        Type: String
							 | 
						||
| 
								 | 
							
								Resources:
							 | 
						||
| 
								 | 
							
								    AutoScalingGroup:
							 | 
						||
| 
								 | 
							
								        Type: AWS::AutoScaling::AutoScalingGroup
							 | 
						||
| 
								 | 
							
								        Properties:
							 | 
						||
| 
								 | 
							
								            AutoScalingGroupName: test_auto_scaling_group
							 | 
						||
| 
								 | 
							
								            AvailabilityZones:
							 | 
						||
| 
								 | 
							
								                - us-east-1a
							 | 
						||
| 
								 | 
							
								            LaunchTemplate:
							 | 
						||
| 
								 | 
							
								                LaunchTemplateId: !Ref LaunchTemplateId
							 | 
						||
| 
								 | 
							
								                Version: "1"
							 | 
						||
| 
								 | 
							
								            MaxSize: "5"
							 | 
						||
| 
								 | 
							
								            MinSize: "1"
							 | 
						||
| 
								 | 
							
								            VPCZoneIdentifier:
							 | 
						||
| 
								 | 
							
								                - !Ref SubnetId
							 | 
						||
| 
								 | 
							
								Outputs:
							 | 
						||
| 
								 | 
							
								    AutoScalingGroupName:
							 | 
						||
| 
								 | 
							
								        Value: !Ref AutoScalingGroup
							 | 
						||
| 
								 | 
							
								""".strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_client.create_stack(
							 | 
						||
| 
								 | 
							
								        StackName=stack_name,
							 | 
						||
| 
								 | 
							
								        TemplateBody=cf_template,
							 | 
						||
| 
								 | 
							
								        Parameters=[
							 | 
						||
| 
								 | 
							
								            {"ParameterKey": "SubnetId", "ParameterValue": subnet_id},
							 | 
						||
| 
								 | 
							
								            {"ParameterKey": "LaunchTemplateId", "ParameterValue": launch_template_id},
							 | 
						||
| 
								 | 
							
								        ],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    stack = cf_client.describe_stacks(StackName=stack_name)["Stacks"][0]
							 | 
						||
| 
								 | 
							
								    stack["Outputs"][0]["OutputValue"].should.be.equal("test_auto_scaling_group")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    asg = client.describe_auto_scaling_groups()["AutoScalingGroups"][0]
							 | 
						||
| 
								 | 
							
								    asg["AutoScalingGroupName"].should.be.equal("test_auto_scaling_group")
							 | 
						||
| 
								 | 
							
								    asg["MinSize"].should.be.equal(1)
							 | 
						||
| 
								 | 
							
								    asg["MaxSize"].should.be.equal(5)
							 | 
						||
| 
								 | 
							
								    lt = asg["LaunchTemplate"]
							 | 
						||
| 
								 | 
							
								    lt["LaunchTemplateId"].should.be.equal(launch_template_id)
							 | 
						||
| 
								 | 
							
								    lt["LaunchTemplateName"].should.be.equal("test_launch_template")
							 | 
						||
| 
								 | 
							
								    lt["Version"].should.be.equal("1")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template_response = ec2_client.create_launch_template(
							 | 
						||
| 
								 | 
							
								        LaunchTemplateName="test_launch_template_new",
							 | 
						||
| 
								 | 
							
								        LaunchTemplateData={
							 | 
						||
| 
								 | 
							
								            "ImageId": "ami-1ea5b10a3d8867db4",
							 | 
						||
| 
								 | 
							
								            "InstanceType": "m5.large",
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    launch_template_id = template_response["LaunchTemplate"]["LaunchTemplateId"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_template = """
							 | 
						||
| 
								 | 
							
								Parameters:
							 | 
						||
| 
								 | 
							
								    SubnetId:
							 | 
						||
| 
								 | 
							
								        Type: AWS::EC2::Subnet::Id
							 | 
						||
| 
								 | 
							
								    LaunchTemplateId:
							 | 
						||
| 
								 | 
							
								        Type: String
							 | 
						||
| 
								 | 
							
								Resources:
							 | 
						||
| 
								 | 
							
								    AutoScalingGroup:
							 | 
						||
| 
								 | 
							
								        Type: AWS::AutoScaling::AutoScalingGroup
							 | 
						||
| 
								 | 
							
								        Properties:
							 | 
						||
| 
								 | 
							
								            AutoScalingGroupName: test_auto_scaling_group
							 | 
						||
| 
								 | 
							
								            AvailabilityZones:
							 | 
						||
| 
								 | 
							
								                - us-east-1a
							 | 
						||
| 
								 | 
							
								            LaunchTemplate:
							 | 
						||
| 
								 | 
							
								                LaunchTemplateId: !Ref LaunchTemplateId
							 | 
						||
| 
								 | 
							
								                Version: "1"
							 | 
						||
| 
								 | 
							
								            MaxSize: "6"
							 | 
						||
| 
								 | 
							
								            MinSize: "2"
							 | 
						||
| 
								 | 
							
								            VPCZoneIdentifier:
							 | 
						||
| 
								 | 
							
								                - !Ref SubnetId
							 | 
						||
| 
								 | 
							
								Outputs:
							 | 
						||
| 
								 | 
							
								    AutoScalingGroupName:
							 | 
						||
| 
								 | 
							
								        Value: !Ref AutoScalingGroup
							 | 
						||
| 
								 | 
							
								""".strip()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cf_client.update_stack(
							 | 
						||
| 
								 | 
							
								        StackName=stack_name,
							 | 
						||
| 
								 | 
							
								        TemplateBody=cf_template,
							 | 
						||
| 
								 | 
							
								        Parameters=[
							 | 
						||
| 
								 | 
							
								            {"ParameterKey": "SubnetId", "ParameterValue": subnet_id},
							 | 
						||
| 
								 | 
							
								            {"ParameterKey": "LaunchTemplateId", "ParameterValue": launch_template_id},
							 | 
						||
| 
								 | 
							
								        ],
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    stack = cf_client.describe_stacks(StackName=stack_name)["Stacks"][0]
							 | 
						||
| 
								 | 
							
								    stack["Outputs"][0]["OutputValue"].should.be.equal("test_auto_scaling_group")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    asg = client.describe_auto_scaling_groups()["AutoScalingGroups"][0]
							 | 
						||
| 
								 | 
							
								    asg["AutoScalingGroupName"].should.be.equal("test_auto_scaling_group")
							 | 
						||
| 
								 | 
							
								    asg["MinSize"].should.be.equal(2)
							 | 
						||
| 
								 | 
							
								    asg["MaxSize"].should.be.equal(6)
							 | 
						||
| 
								 | 
							
								    lt = asg["LaunchTemplate"]
							 | 
						||
| 
								 | 
							
								    lt["LaunchTemplateId"].should.be.equal(launch_template_id)
							 | 
						||
| 
								 | 
							
								    lt["LaunchTemplateName"].should.be.equal("test_launch_template_new")
							 | 
						||
| 
								 | 
							
								    lt["Version"].should.be.equal("1")
							 |