import boto3 import sure # noqa from nose.tools import assert_raises from botocore.client import ClientError from moto import mock_ec2 @mock_ec2 def test_launch_template_create(): cli = boto3.client("ec2", region_name="us-east-1") resp = cli.create_launch_template( LaunchTemplateName="test-template", # the absolute minimum needed to create a template without other resources LaunchTemplateData={ "TagSpecifications": [{ "ResourceType": "instance", "Tags": [{ "Key": "test", "Value": "value", }], }], }, ) resp.should.have.key("LaunchTemplate") lt = resp["LaunchTemplate"] lt["LaunchTemplateName"].should.equal("test-template") lt["DefaultVersionNumber"].should.equal(1) lt["LatestVersionNumber"].should.equal(1) with assert_raises(ClientError) as ex: cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "TagSpecifications": [{ "ResourceType": "instance", "Tags": [{ "Key": "test", "Value": "value", }], }], }, ) str(ex.exception).should.equal( 'An error occurred (InvalidLaunchTemplateName.AlreadyExistsException) when calling the CreateLaunchTemplate operation: Launch template name already in use.') @mock_ec2 def test_describe_launch_template_versions(): template_data = { "ImageId": "ami-abc123", "DisableApiTermination": False, "TagSpecifications": [{ "ResourceType": "instance", "Tags": [{ "Key": "test", "Value": "value", }], }], "SecurityGroupIds": [ "sg-1234", "sg-ab5678", ], } cli = boto3.client("ec2", region_name="us-east-1") create_resp = cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData=template_data) # test using name resp = cli.describe_launch_template_versions( LaunchTemplateName="test-template", Versions=['1']) templ = resp["LaunchTemplateVersions"][0]["LaunchTemplateData"] templ.should.equal(template_data) # test using id resp = cli.describe_launch_template_versions( LaunchTemplateId=create_resp["LaunchTemplate"]["LaunchTemplateId"], Versions=['1']) templ = resp["LaunchTemplateVersions"][0]["LaunchTemplateData"] templ.should.equal(template_data) @mock_ec2 def test_create_launch_template_version(): cli = boto3.client("ec2", region_name="us-east-1") create_resp = cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) version_resp = cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-def456" }, VersionDescription="new ami") version_resp.should.have.key("LaunchTemplateVersion") version = version_resp["LaunchTemplateVersion"] version["DefaultVersion"].should.equal(False) version["LaunchTemplateId"].should.equal(create_resp["LaunchTemplate"]["LaunchTemplateId"]) version["VersionDescription"].should.equal("new ami") version["VersionNumber"].should.equal(2) @mock_ec2 def test_create_launch_template_version_by_id(): cli = boto3.client("ec2", region_name="us-east-1") create_resp = cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) version_resp = cli.create_launch_template_version( LaunchTemplateId=create_resp["LaunchTemplate"]["LaunchTemplateId"], LaunchTemplateData={ "ImageId": "ami-def456" }, VersionDescription="new ami") version_resp.should.have.key("LaunchTemplateVersion") version = version_resp["LaunchTemplateVersion"] version["DefaultVersion"].should.equal(False) version["LaunchTemplateId"].should.equal(create_resp["LaunchTemplate"]["LaunchTemplateId"]) version["VersionDescription"].should.equal("new ami") version["VersionNumber"].should.equal(2) @mock_ec2 def test_describe_launch_template_versions_with_multiple_versions(): cli = boto3.client("ec2", region_name="us-east-1") cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-def456" }, VersionDescription="new ami") resp = cli.describe_launch_template_versions( LaunchTemplateName="test-template") resp["LaunchTemplateVersions"].should.have.length_of(2) resp["LaunchTemplateVersions"][0]["LaunchTemplateData"]["ImageId"].should.equal("ami-abc123") resp["LaunchTemplateVersions"][1]["LaunchTemplateData"]["ImageId"].should.equal("ami-def456") @mock_ec2 def test_describe_launch_template_versions_with_versions_option(): cli = boto3.client("ec2", region_name="us-east-1") cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-def456" }, VersionDescription="new ami") cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-hij789" }, VersionDescription="new ami, again") resp = cli.describe_launch_template_versions( LaunchTemplateName="test-template", Versions=["2", "3"]) resp["LaunchTemplateVersions"].should.have.length_of(2) resp["LaunchTemplateVersions"][0]["LaunchTemplateData"]["ImageId"].should.equal("ami-def456") resp["LaunchTemplateVersions"][1]["LaunchTemplateData"]["ImageId"].should.equal("ami-hij789") @mock_ec2 def test_describe_launch_template_versions_with_min(): cli = boto3.client("ec2", region_name="us-east-1") cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-def456" }, VersionDescription="new ami") cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-hij789" }, VersionDescription="new ami, again") resp = cli.describe_launch_template_versions( LaunchTemplateName="test-template", MinVersion="2") resp["LaunchTemplateVersions"].should.have.length_of(2) resp["LaunchTemplateVersions"][0]["LaunchTemplateData"]["ImageId"].should.equal("ami-def456") resp["LaunchTemplateVersions"][1]["LaunchTemplateData"]["ImageId"].should.equal("ami-hij789") @mock_ec2 def test_describe_launch_template_versions_with_max(): cli = boto3.client("ec2", region_name="us-east-1") cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-def456" }, VersionDescription="new ami") cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-hij789" }, VersionDescription="new ami, again") resp = cli.describe_launch_template_versions( LaunchTemplateName="test-template", MaxVersion="2") resp["LaunchTemplateVersions"].should.have.length_of(2) resp["LaunchTemplateVersions"][0]["LaunchTemplateData"]["ImageId"].should.equal("ami-abc123") resp["LaunchTemplateVersions"][1]["LaunchTemplateData"]["ImageId"].should.equal("ami-def456") @mock_ec2 def test_describe_launch_template_versions_with_min_and_max(): cli = boto3.client("ec2", region_name="us-east-1") cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-def456" }, VersionDescription="new ami") cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-hij789" }, VersionDescription="new ami, again") cli.create_launch_template_version( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-345abc" }, VersionDescription="new ami, because why not") resp = cli.describe_launch_template_versions( LaunchTemplateName="test-template", MinVersion="2", MaxVersion="3") resp["LaunchTemplateVersions"].should.have.length_of(2) resp["LaunchTemplateVersions"][0]["LaunchTemplateData"]["ImageId"].should.equal("ami-def456") resp["LaunchTemplateVersions"][1]["LaunchTemplateData"]["ImageId"].should.equal("ami-hij789") @mock_ec2 def test_describe_launch_templates(): cli = boto3.client("ec2", region_name="us-east-1") lt_ids = [] r = cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) lt_ids.append(r["LaunchTemplate"]["LaunchTemplateId"]) r = cli.create_launch_template( LaunchTemplateName="test-template2", LaunchTemplateData={ "ImageId": "ami-abc123" }) lt_ids.append(r["LaunchTemplate"]["LaunchTemplateId"]) # general call, all templates resp = cli.describe_launch_templates() resp.should.have.key("LaunchTemplates") resp["LaunchTemplates"].should.have.length_of(2) resp["LaunchTemplates"][0]["LaunchTemplateName"].should.equal("test-template") resp["LaunchTemplates"][1]["LaunchTemplateName"].should.equal("test-template2") # filter by names resp = cli.describe_launch_templates( LaunchTemplateNames=["test-template2", "test-template"]) resp.should.have.key("LaunchTemplates") resp["LaunchTemplates"].should.have.length_of(2) resp["LaunchTemplates"][0]["LaunchTemplateName"].should.equal("test-template2") resp["LaunchTemplates"][1]["LaunchTemplateName"].should.equal("test-template") # filter by ids resp = cli.describe_launch_templates(LaunchTemplateIds=lt_ids) resp.should.have.key("LaunchTemplates") resp["LaunchTemplates"].should.have.length_of(2) resp["LaunchTemplates"][0]["LaunchTemplateName"].should.equal("test-template") resp["LaunchTemplates"][1]["LaunchTemplateName"].should.equal("test-template2") @mock_ec2 def test_describe_launch_templates_with_filters(): cli = boto3.client("ec2", region_name="us-east-1") r = cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={ "ImageId": "ami-abc123" }) cli.create_tags( Resources=[r["LaunchTemplate"]["LaunchTemplateId"]], Tags=[ {"Key": "tag1", "Value": "a value"}, {"Key": "another-key", "Value": "this value"}, ]) cli.create_launch_template( LaunchTemplateName="no-tags", LaunchTemplateData={ "ImageId": "ami-abc123" }) resp = cli.describe_launch_templates(Filters=[{ "Name": "tag:tag1", "Values": ["a value"] }]) resp["LaunchTemplates"].should.have.length_of(1) resp["LaunchTemplates"][0]["LaunchTemplateName"].should.equal("test-template") resp = cli.describe_launch_templates(Filters=[{ "Name": "launch-template-name", "Values": ["no-tags"] }]) resp["LaunchTemplates"].should.have.length_of(1) resp["LaunchTemplates"][0]["LaunchTemplateName"].should.equal("no-tags") @mock_ec2 def test_create_launch_template_with_tag_spec(): cli = boto3.client("ec2", region_name="us-east-1") cli.create_launch_template( LaunchTemplateName="test-template", LaunchTemplateData={"ImageId": "ami-abc123"}, TagSpecifications=[{ "ResourceType": "instance", "Tags": [ {"Key": "key", "Value": "value"} ] }], ) resp = cli.describe_launch_template_versions( LaunchTemplateName="test-template", Versions=["1"]) version = resp["LaunchTemplateVersions"][0] version["LaunchTemplateData"].should.have.key("TagSpecifications") version["LaunchTemplateData"]["TagSpecifications"].should.have.length_of(1) version["LaunchTemplateData"]["TagSpecifications"][0].should.equal({ "ResourceType": "instance", "Tags": [ {"Key": "key", "Value": "value"} ] })