Path: blob/develop/tests/functional/ec2/test_run_instances.py
1567 views
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.1#2# Licensed under the Apache License, Version 2.0 (the "License"). You3# may not use this file except in compliance with the License. A copy of4# the License is located at5#6# http://aws.amazon.com/apache2.0/7#8# or in the "license" file accompanying this file. This file is9# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF10# ANY KIND, either express or implied. See the License for the specific11# language governing permissions and limitations under the License.12from awscli.compat import compat_open1314from awscli.testutils import temporary_file15from awscli.testutils import BaseAWSCommandParamsTest161718class TestRunInstances(BaseAWSCommandParamsTest):1920prefix = 'ec2 run-instances'2122def assert_run_instances_call(self, args, result):23if not isinstance(args, list):24args_list = (self.prefix + args).split()25else:26args_list = self.prefix.split() + args27self.assert_params_for_cmd(28args_list, result, ignore_params=['ClientToken'])2930def test_no_count(self):31args = ' --image-id ami-foobar'32result = {33'ImageId': 'ami-foobar',34'MaxCount': 1,35'MinCount': 136}37self.assert_run_instances_call(args, result)3839def test_count_scalar(self):40args = ' --image-id ami-foobar --count 2'41result = {42'ImageId': 'ami-foobar',43'MaxCount': 2,44'MinCount': 245}46self.assert_run_instances_call(args, result)4748def test_user_data(self):49data = u'\u0039'50with temporary_file('r+') as tmp:51with compat_open(tmp.name, 'w') as f:52f.write(data)53f.flush()54args = ' --image-id foo --user-data file://%s' % f.name55result = {'ImageId': 'foo',56'MaxCount': 1,57'MinCount': 1,58# base64 encoded content of utf-8 encoding of data.59'UserData': 'OQ=='}60self.assert_run_instances_call(args, result)6162def test_count_range(self):63args = ' --image-id ami-foobar --count 5:10'64result = {65'ImageId': 'ami-foobar',66'MaxCount': 10,67'MinCount': 568}69self.assert_run_instances_call(args, result)7071def test_count_in_json_only(self):72input_json = '{"ImageId":"ami-xxxx","MaxCount":9,"MinCount":5}'73args = ' --cli-input-json ' + input_json74result = {'ImageId': 'ami-xxxx', 'MaxCount': 9, 'MinCount': 5}75self.assert_run_instances_call(args, result)7677def test_count_in_cli_and_in_json(self):78input_json = '{"ImageId":"ami-xxxx","MaxCount":9,"MinCount":5}'79args = ' --count 3 --cli-input-json ' + input_json80result = {'ImageId': 'ami-xxxx', 'MaxCount': 3, 'MinCount': 3}81self.assert_run_instances_call(args, result)8283def test_block_device_mapping(self):84args_list = ' --image-id ami-foobar --count 1'.split()85# We're switching to list form because we need to test86# when there's leading spaces. This is the CLI equivalent87# of --block-dev-mapping ' [{"device_name" ...'88# (note the space between ``'`` and ``[``)89args_list.append('--block-device-mapping')90args_list.append(91' [{"DeviceName":"/dev/sda1","Ebs":{"VolumeSize":20}}]')92result = {93'BlockDeviceMappings': [94{'DeviceName': '/dev/sda1',95'Ebs': {'VolumeSize': 20}},96],97'ImageId': 'ami-foobar',98'MaxCount': 1,99'MinCount': 1100}101self.assert_run_instances_call(args_list, result)102103def test_secondary_ip_address(self):104args = ' --image-id ami-foobar --count 1 '105args += '--secondary-private-ip-addresses 10.0.2.106'106args_list = (self.prefix + args).split()107result = {108'ImageId': 'ami-foobar',109'NetworkInterfaces': [110{'DeviceIndex': 0,111'PrivateIpAddresses': [112{'Primary': False, 'PrivateIpAddress': '10.0.2.106'}]}],113'MaxCount': 1,114'MinCount': 1}115self.assert_run_instances_call(args, result)116117def test_secondary_ip_address_with_subnet(self):118args = ' --image-id ami-foobar --count 1 --subnet subnet-12345678 '119args += '--secondary-private-ip-addresses 10.0.2.106'120result = {121'ImageId': 'ami-foobar',122'NetworkInterfaces': [123{'DeviceIndex': 0,124'SubnetId': 'subnet-12345678',125'PrivateIpAddresses': [126{'Primary': False, 'PrivateIpAddress': '10.0.2.106'}]}],127'MaxCount': 1,128'MinCount': 1}129self.assert_run_instances_call(args, result)130131def test_secondary_ip_addresses(self):132args = ' --image-id ami-foobar --count 1 '133args += '--secondary-private-ip-addresses 10.0.2.106 10.0.2.107'134result = {135'ImageId': 'ami-foobar',136'NetworkInterfaces': [137{'DeviceIndex': 0,138'PrivateIpAddresses': [139{'Primary': False, 'PrivateIpAddress': u'10.0.2.106'},140{'Primary': False, 'PrivateIpAddress': u'10.0.2.107'}]}],141'MaxCount': 1,142'MinCount': 1}143self.assert_run_instances_call(args, result)144145def test_secondary_ip_address_count(self):146args = ' --image-id ami-foobar --count 1 '147args += '--secondary-private-ip-address-count 4'148result = {149'NetworkInterfaces': [{'DeviceIndex': 0,150'SecondaryPrivateIpAddressCount': 4}],151'ImageId': 'ami-foobar',152'MaxCount': 1,153'MinCount': 1154}155self.assert_run_instances_call(args, result)156157def test_secondary_ip_address_count_with_subnet(self):158args = ' --image-id ami-foobar --count 1 --subnet subnet-12345678 '159args += '--secondary-private-ip-address-count 4'160result = {161'NetworkInterfaces': [{'DeviceIndex': 0,162'SubnetId': 'subnet-12345678',163'SecondaryPrivateIpAddressCount': 4}],164'ImageId': 'ami-foobar',165'MaxCount': 1,166'MinCount': 1167}168self.assert_run_instances_call(args, result)169170def test_associate_public_ip_address(self):171args = ' --image-id ami-foobar --count 1 --subnet-id subnet-12345678 '172args += '--associate-public-ip-address'173result = {174'NetworkInterfaces': [175{'DeviceIndex': 0,176'AssociatePublicIpAddress': True,177'SubnetId': 'subnet-12345678'},178],179'ImageId': 'ami-foobar',180'MaxCount': 1,181'MinCount': 1182}183self.assert_run_instances_call(args, result)184185def test_associate_public_ip_address_switch_order(self):186args = ' --image-id ami-foobar --count 1 '187args += '--associate-public-ip-address --subnet-id subnet-12345678'188result = {189'NetworkInterfaces': [190{'DeviceIndex': 0,191'AssociatePublicIpAddress': True,192'SubnetId': 'subnet-12345678'}193],194'ImageId': 'ami-foobar',195'MaxCount': 1,196'MinCount': 1197}198self.assert_run_instances_call(args, result)199200def test_no_associate_public_ip_address(self):201args = ' --image-id ami-foobar --count 1 --subnet-id subnet-12345678 '202args += '--no-associate-public-ip-address'203result = {204'ImageId': 'ami-foobar',205'NetworkInterfaces': [{'AssociatePublicIpAddress': False,206'DeviceIndex': 0,207'SubnetId': 'subnet-12345678'}],208'MaxCount': 1,209'MinCount': 1}210self.assert_run_instances_call(args, result)211212def test_subnet_alone(self):213args = ' --image-id ami-foobar --count 1 --subnet-id subnet-12345678'214result = {215'SubnetId': 'subnet-12345678',216'ImageId': 'ami-foobar',217'MaxCount': 1,218'MinCount': 1219}220self.assert_run_instances_call(args, result)221222def test_associate_public_ip_address_and_group_id(self):223args = ' --image-id ami-foobar --count 1 '224args += '--security-group-id sg-12345678 '225args += '--associate-public-ip-address --subnet-id subnet-12345678'226result = {227'NetworkInterfaces': [228{'DeviceIndex': 0,229'AssociatePublicIpAddress': True,230'SubnetId': 'subnet-12345678',231'Groups': ['sg-12345678']}232],233'ImageId': 'ami-foobar',234'MaxCount': 1,235'MinCount': 1236}237self.assert_run_instances_call(args, result)238239def test_group_id_alone(self):240args = ' --image-id ami-foobar --count 1 '241args += '--security-group-id sg-12345678'242result = {243'SecurityGroupIds': ['sg-12345678'],244'ImageId': 'ami-foobar',245'MaxCount': 1,246'MinCount': 1247}248self.assert_run_instances_call(args, result)249250def test_associate_public_ip_address_and_private_ip_address(self):251args = ' --image-id ami-foobar --count 1 '252args += '--private-ip-address 10.0.0.200 '253args += '--associate-public-ip-address --subnet-id subnet-12345678'254result = {255'NetworkInterfaces': [{256'DeviceIndex': 0,257'AssociatePublicIpAddress': True,258'SubnetId': 'subnet-12345678',259'PrivateIpAddresses': [260{'PrivateIpAddress': '10.0.0.200',261'Primary': True}],262}],263'ImageId': 'ami-foobar',264'MaxCount': 1,265'MinCount': 1266}267self.assert_run_instances_call(args, result)268269def test_private_ip_address_alone(self):270args = ' --image-id ami-foobar --count 1 '271args += '--private-ip-address 10.0.0.200'272result = {273'PrivateIpAddress': '10.0.0.200',274'ImageId': 'ami-foobar',275'MaxCount': 1,276'MinCount': 1277}278self.assert_run_instances_call(args, result)279280def test_ipv6_address_count_and_associate_public_ip_address(self):281args = ' --associate-public-ip-address'282args += ' --ipv6-address-count 5 --image-id ami-foobar --count 1'283expected = {284'NetworkInterfaces': [{285'DeviceIndex': 0,286'AssociatePublicIpAddress': True,287'Ipv6AddressCount': 5288}],289'ImageId': 'ami-foobar',290'MaxCount': 1,291'MinCount': 1292}293self.assert_run_instances_call(args, expected)294295def test_ipv6_addresses_and_associate_public_ip_address(self):296args = ' --associate-public-ip-address --count 1'297args += ' --ipv6-addresses Ipv6Address=::1 --image-id ami-foobar '298expected = {299'NetworkInterfaces': [{300'DeviceIndex': 0,301'AssociatePublicIpAddress': True,302'Ipv6Addresses': [{'Ipv6Address': '::1'}]303}],304'ImageId': 'ami-foobar',305'MaxCount': 1,306'MinCount': 1307}308self.assert_run_instances_call(args, expected)309310def test_enable_primary_ipv6_and_associate_public_ip_address(self):311args = ' --associate-public-ip-address'312args += ' --enable-primary-ipv6 --image-id ami-foobar --count 1'313expected = {314'NetworkInterfaces': [{315'DeviceIndex': 0,316'AssociatePublicIpAddress': True,317'PrimaryIpv6': True318}],319'ImageId': 'ami-foobar',320'MaxCount': 1,321'MinCount': 1322}323self.assert_run_instances_call(args, expected)324325