Moto's implementation of autoscaling:CreateLaunchConfiguration is a little too loose, allowing the ImageId parameter to be omitted and defaulting it to None, which results in dozens of deprecation warnings: `PendingDeprecationWarning: Could not find AMI with image-id:ami-123456, in the near future this will cause an error.` This commit refactors calls to CreateLaunchConfiguration to explicitly pass in a known AMI ImageId in order to avoid these warnings. The integrity of the tests is unaffected by this change.
		
			
				
	
	
		
			279 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import boto3
 | 
						|
import sure  # noqa
 | 
						|
 | 
						|
from moto import (
 | 
						|
    mock_autoscaling,
 | 
						|
    mock_cloudformation,
 | 
						|
    mock_ec2,
 | 
						|
)
 | 
						|
 | 
						|
from .utils import setup_networking
 | 
						|
from tests import EXAMPLE_AMI_ID
 | 
						|
 | 
						|
 | 
						|
@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: {0}
 | 
						|
            InstanceType: t2.micro
 | 
						|
            LaunchConfigurationName: test_launch_configuration
 | 
						|
Outputs:
 | 
						|
    LaunchConfigurationName:
 | 
						|
        Value: !Ref LaunchConfiguration
 | 
						|
""".strip().format(
 | 
						|
        EXAMPLE_AMI_ID
 | 
						|
    )
 | 
						|
 | 
						|
    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(EXAMPLE_AMI_ID)
 | 
						|
    lc["InstanceType"].should.be.equal("t2.micro")
 | 
						|
 | 
						|
    cf_template = """
 | 
						|
Resources:
 | 
						|
    LaunchConfiguration:
 | 
						|
        Type: AWS::AutoScaling::LaunchConfiguration
 | 
						|
        Properties:
 | 
						|
            ImageId: {0}
 | 
						|
            InstanceType: m5.large
 | 
						|
            LaunchConfigurationName: test_launch_configuration
 | 
						|
Outputs:
 | 
						|
    LaunchConfigurationName:
 | 
						|
        Value: !Ref LaunchConfiguration
 | 
						|
""".strip().format(
 | 
						|
        EXAMPLE_AMI_ID
 | 
						|
    )
 | 
						|
 | 
						|
    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(EXAMPLE_AMI_ID)
 | 
						|
    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",
 | 
						|
        ImageId=EXAMPLE_AMI_ID,
 | 
						|
    )
 | 
						|
    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",
 | 
						|
        ImageId=EXAMPLE_AMI_ID,
 | 
						|
    )
 | 
						|
 | 
						|
    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": EXAMPLE_AMI_ID, "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": EXAMPLE_AMI_ID, "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")
 |