| 
									
										
										
										
											2014-08-27 11:17:06 -04:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-05 13:43:47 +02:00
										 |  |  | from botocore.exceptions import ClientError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2021-01-29 03:31:56 -08:00
										 |  |  | from unittest import SkipTest | 
					
						
							| 
									
										
										
										
											2014-08-25 15:09:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-17 19:35:53 -04:00
										 |  |  | import base64 | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | import ipaddress | 
					
						
							| 
									
										
										
										
											2013-05-17 19:35:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  | import boto | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  | from boto.ec2.instance import Reservation, InstanceAttribute | 
					
						
							| 
									
										
										
										
											2020-09-13 16:08:23 +01:00
										 |  |  | from boto.exception import EC2ResponseError | 
					
						
							| 
									
										
										
										
											2015-01-19 13:44:15 -05:00
										 |  |  | from freezegun import freeze_time | 
					
						
							| 
									
										
										
										
											2013-08-03 17:21:25 -04:00
										 |  |  | import sure  # noqa | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-29 03:31:56 -08:00
										 |  |  | from moto import mock_ec2_deprecated, mock_ec2, settings | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  | from tests import EXAMPLE_AMI_ID | 
					
						
							| 
									
										
										
										
											2014-09-12 11:51:50 -07:00
										 |  |  | from tests.helpers import requires_boto_gte | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-26 07:40:39 +01:00
										 |  |  | decode_method = base64.decodebytes | 
					
						
							| 
									
										
										
										
											2020-09-02 15:40:29 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | ################ Test Readme ############### | 
					
						
							|  |  |  | def add_servers(ami_id, count): | 
					
						
							| 
									
										
										
										
											2013-06-27 00:01:33 -04:00
										 |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     for index in range(count): | 
					
						
							|  |  |  |         conn.run_instances(ami_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | def test_add_servers(): | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     add_servers(EXAMPLE_AMI_ID, 2) | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-27 00:01:33 -04:00
										 |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations() | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     assert len(reservations) == 2 | 
					
						
							|  |  |  |     instance1 = reservations[0].instances[0] | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     assert instance1.image_id == EXAMPLE_AMI_ID | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ############################################ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-19 13:44:15 -05:00
										 |  |  | @freeze_time("2014-01-01 05:00:00") | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  | def test_instance_launch_and_terminate(): | 
					
						
							| 
									
										
										
										
											2019-05-25 03:18:16 -07:00
										 |  |  |     conn = boto.ec2.connect_to_region("us-east-1") | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         reservation = conn.run_instances(EXAMPLE_AMI_ID, dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the RunInstance operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  |     reservation.should.be.a(Reservation) | 
					
						
							|  |  |  |     reservation.instances.should.have.length_of(1) | 
					
						
							|  |  |  |     instance = reservation.instances[0] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.state.should.equal("pending") | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations() | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].id.should.equal(reservation.id) | 
					
						
							|  |  |  |     instances = reservations[0].instances | 
					
						
							|  |  |  |     instances.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2016-01-10 00:54:48 -05:00
										 |  |  |     instance = instances[0] | 
					
						
							|  |  |  |     instance.id.should.equal(instance.id) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.state.should.equal("running") | 
					
						
							| 
									
										
										
										
											2016-01-10 00:54:48 -05:00
										 |  |  |     instance.launch_time.should.equal("2014-01-01T05:00:00.000Z") | 
					
						
							| 
									
										
										
										
											2020-04-08 13:53:53 +01:00
										 |  |  |     instance.vpc_id.shouldnt.equal(None) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.placement.should.equal("us-east-1a") | 
					
						
							| 
									
										
										
										
											2016-01-10 00:54:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     root_device_name = instance.root_device_name | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.block_device_mapping[root_device_name].status.should.equal("in-use") | 
					
						
							| 
									
										
										
										
											2016-01-10 00:54:48 -05:00
										 |  |  |     volume_id = instance.block_device_mapping[root_device_name].volume_id | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     volume_id.should.match(r"vol-\w+") | 
					
						
							| 
									
										
										
										
											2015-11-28 09:19:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     volume = conn.get_all_volumes(volume_ids=[volume_id])[0] | 
					
						
							|  |  |  |     volume.attach_data.instance_id.should.equal(instance.id) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     volume.status.should.equal("in-use") | 
					
						
							| 
									
										
										
										
											2014-09-11 11:29:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  |         conn.terminate_instances([instance.id], dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the TerminateInstance operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 00:54:48 -05:00
										 |  |  |     conn.terminate_instances([instance.id]) | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations() | 
					
						
							| 
									
										
										
										
											2013-02-18 16:09:40 -05:00
										 |  |  |     instance = reservations[0].instances[0] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.state.should.equal("terminated") | 
					
						
							| 
									
										
										
										
											2013-02-18 21:56:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-09 21:20:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_instance_terminate_discard_volumes(): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ec2_resource = boto3.resource("ec2", "us-west-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = ec2_resource.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |         MinCount=1, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							|  |  |  |         BlockDeviceMappings=[ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "DeviceName": "/dev/sda1", | 
					
						
							|  |  |  |                 "Ebs": {"VolumeSize": 50, "DeleteOnTermination": True}, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     instance = result[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_volume_ids = [] | 
					
						
							|  |  |  |     for volume in instance.volumes.all(): | 
					
						
							|  |  |  |         instance_volume_ids.append(volume.volume_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.terminate() | 
					
						
							|  |  |  |     instance.wait_until_terminated() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert not list(ec2_resource.volumes.all()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							| 
									
										
										
										
											2020-06-16 08:03:02 +03:00
										 |  |  | def test_instance_terminate_keep_volumes_explicit(): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ec2_resource = boto3.resource("ec2", "us-west-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = ec2_resource.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-06-16 08:03:02 +03:00
										 |  |  |         MinCount=1, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							|  |  |  |         BlockDeviceMappings=[ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "DeviceName": "/dev/sda1", | 
					
						
							|  |  |  |                 "Ebs": {"VolumeSize": 50, "DeleteOnTermination": False}, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     instance = result[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_volume_ids = [] | 
					
						
							|  |  |  |     for volume in instance.volumes.all(): | 
					
						
							|  |  |  |         instance_volume_ids.append(volume.volume_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.terminate() | 
					
						
							|  |  |  |     instance.wait_until_terminated() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert len(list(ec2_resource.volumes.all())) == 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_instance_terminate_keep_volumes_implicit(): | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |     ec2_resource = boto3.resource("ec2", "us-west-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = ec2_resource.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |         MinCount=1, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							|  |  |  |         BlockDeviceMappings=[{"DeviceName": "/dev/sda1", "Ebs": {"VolumeSize": 50}}], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     instance = result[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_volume_ids = [] | 
					
						
							|  |  |  |     for volume in instance.volumes.all(): | 
					
						
							|  |  |  |         instance_volume_ids.append(volume.volume_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.terminate() | 
					
						
							|  |  |  |     instance.wait_until_terminated() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert len(instance_volume_ids) == 1 | 
					
						
							|  |  |  |     volume = ec2_resource.Volume(instance_volume_ids[0]) | 
					
						
							|  |  |  |     volume.state.should.equal("available") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_instance_terminate_detach_volumes(): | 
					
						
							|  |  |  |     ec2_resource = boto3.resource("ec2", "us-west-1") | 
					
						
							|  |  |  |     result = ec2_resource.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |         MinCount=1, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							|  |  |  |         BlockDeviceMappings=[ | 
					
						
							|  |  |  |             {"DeviceName": "/dev/sda1", "Ebs": {"VolumeSize": 50}}, | 
					
						
							|  |  |  |             {"DeviceName": "/dev/sda2", "Ebs": {"VolumeSize": 50}}, | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     instance = result[0] | 
					
						
							|  |  |  |     for volume in instance.volumes.all(): | 
					
						
							|  |  |  |         response = instance.detach_volume(VolumeId=volume.volume_id) | 
					
						
							|  |  |  |         response["State"].should.equal("detaching") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.terminate() | 
					
						
							|  |  |  |     instance.wait_until_terminated() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert len(list(ec2_resource.volumes.all())) == 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_instance_detach_volume_wrong_path(): | 
					
						
							|  |  |  |     ec2_resource = boto3.resource("ec2", "us-west-1") | 
					
						
							|  |  |  |     result = ec2_resource.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |         MinCount=1, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							| 
									
										
										
										
											2020-11-11 15:55:37 +00:00
										 |  |  |         BlockDeviceMappings=[{"DeviceName": "/dev/sda1", "Ebs": {"VolumeSize": 50}},], | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |     ) | 
					
						
							|  |  |  |     instance = result[0] | 
					
						
							|  |  |  |     for volume in instance.volumes.all(): | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |             instance.detach_volume(VolumeId=volume.volume_id, Device="/dev/sdf") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |         ex.value.response["Error"]["Code"].should.equal("InvalidAttachment.NotFound") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ex.value.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |         ex.value.response["Error"]["Message"].should.equal( | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |             "The volume {0} is not attached to instance {1} as device {2}".format( | 
					
						
							|  |  |  |                 volume.volume_id, instance.instance_id, "/dev/sdf" | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2016-10-09 21:20:53 -04:00
										 |  |  | def test_terminate_empty_instances(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							|  |  |  |     conn.terminate_instances.when.called_with([]).should.throw(EC2ResponseError) | 
					
						
							| 
									
										
										
										
											2016-10-09 21:20:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-26 09:53:03 +10:00
										 |  |  | @freeze_time("2014-01-01 05:00:00") | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2015-07-26 09:53:03 +10:00
										 |  |  | def test_instance_attach_volume(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2015-07-26 09:53:03 +10:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vol1 = conn.create_volume(size=36, zone=conn.region.name) | 
					
						
							|  |  |  |     vol1.attach(instance.id, "/dev/sda1") | 
					
						
							|  |  |  |     vol1.update() | 
					
						
							|  |  |  |     vol2 = conn.create_volume(size=65, zone=conn.region.name) | 
					
						
							|  |  |  |     vol2.attach(instance.id, "/dev/sdb1") | 
					
						
							|  |  |  |     vol2.update() | 
					
						
							|  |  |  |     vol3 = conn.create_volume(size=130, zone=conn.region.name) | 
					
						
							|  |  |  |     vol3.attach(instance.id, "/dev/sdc1") | 
					
						
							|  |  |  |     vol3.update() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations() | 
					
						
							| 
									
										
										
										
											2015-07-26 09:53:03 +10:00
										 |  |  |     instance = reservations[0].instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.block_device_mapping.should.have.length_of(3) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     for v in conn.get_all_volumes( | 
					
						
							|  |  |  |         volume_ids=[instance.block_device_mapping["/dev/sdc1"].volume_id] | 
					
						
							|  |  |  |     ): | 
					
						
							| 
									
										
										
										
											2015-07-26 09:53:03 +10:00
										 |  |  |         v.attach_data.instance_id.should.equal(instance.id) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |         # can do due to freeze_time decorator. | 
					
						
							|  |  |  |         v.attach_data.attach_time.should.equal(instance.launch_time) | 
					
						
							|  |  |  |         # can do due to freeze_time decorator. | 
					
						
							|  |  |  |         v.create_time.should.equal(instance.launch_time) | 
					
						
							| 
									
										
										
										
											2015-07-26 09:53:03 +10:00
										 |  |  |         v.region.name.should.equal(instance.region.name) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         v.status.should.equal("in-use") | 
					
						
							| 
									
										
										
										
											2015-07-26 09:53:03 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-18 21:56:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-07-08 19:25:47 -04:00
										 |  |  | def test_get_instances_by_id(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=2) | 
					
						
							| 
									
										
										
										
											2013-07-08 19:25:47 -04:00
										 |  |  |     instance1, instance2 = reservation.instances | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(instance_ids=[instance1.id]) | 
					
						
							| 
									
										
										
										
											2013-07-08 19:25:47 -04:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservation = reservations[0] | 
					
						
							|  |  |  |     reservation.instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservation.instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(instance_ids=[instance1.id, instance2.id]) | 
					
						
							| 
									
										
										
										
											2013-07-08 19:25:47 -04:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservation = reservations[0] | 
					
						
							|  |  |  |     reservation.instances.should.have.length_of(2) | 
					
						
							|  |  |  |     instance_ids = [instance.id for instance in reservation.instances] | 
					
						
							|  |  |  |     instance_ids.should.equal([instance1.id, instance2.id]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     # Call get_all_reservations with a bad id should raise an error | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as cm: | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |         conn.get_all_reservations(instance_ids=[instance1.id, "i-1234abcd"]) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     cm.value.code.should.equal("InvalidInstanceID.NotFound") | 
					
						
							|  |  |  |     cm.value.status.should.equal(400) | 
					
						
							|  |  |  |     cm.value.request_id.should_not.be.none | 
					
						
							| 
									
										
										
										
											2013-07-08 21:18:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_get_paginated_instances(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     conn = boto3.resource("ec2", "us-east-1") | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  |     for i in range(100): | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         conn.create_instances(ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1) | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  |     resp = client.describe_instances(MaxResults=50) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     reservations = resp["Reservations"] | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  |     reservations.should.have.length_of(50) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     next_token = resp["NextToken"] | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  |     next_token.should_not.be.none | 
					
						
							|  |  |  |     resp2 = client.describe_instances(NextToken=next_token) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     reservations.extend(resp2["Reservations"]) | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  |     reservations.should.have.length_of(100) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert "NextToken" not in resp2.keys() | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 19:48:14 -04:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_create_with_tags(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ec2 = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2017-05-12 19:48:14 -04:00
										 |  |  |     instances = ec2.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2017-05-12 19:48:14 -04:00
										 |  |  |         MinCount=1, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         InstanceType="t2.micro", | 
					
						
							| 
									
										
										
										
											2017-05-12 19:48:14 -04:00
										 |  |  |         TagSpecifications=[ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "ResourceType": "instance", | 
					
						
							|  |  |  |                 "Tags": [ | 
					
						
							|  |  |  |                     {"Key": "MY_TAG1", "Value": "MY_VALUE1"}, | 
					
						
							|  |  |  |                     {"Key": "MY_TAG2", "Value": "MY_VALUE2"}, | 
					
						
							| 
									
										
										
										
											2017-05-12 19:48:14 -04:00
										 |  |  |                 ], | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "ResourceType": "instance", | 
					
						
							|  |  |  |                 "Tags": [{"Key": "MY_TAG3", "Value": "MY_VALUE3"}], | 
					
						
							| 
									
										
										
										
											2017-05-12 19:48:14 -04:00
										 |  |  |             }, | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert "Tags" in instances["Instances"][0] | 
					
						
							|  |  |  |     len(instances["Instances"][0]["Tags"]).should.equal(3) | 
					
						
							| 
									
										
										
										
											2017-05-12 19:48:14 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 22:35:34 -07:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_create_with_volume_tags(): | 
					
						
							|  |  |  |     ec2 = boto3.client("ec2", region_name="us-west-2") | 
					
						
							|  |  |  |     volume_tags = [ | 
					
						
							|  |  |  |         {"Key": "MY_TAG1", "Value": "MY_VALUE1"}, | 
					
						
							|  |  |  |         {"Key": "MY_TAG2", "Value": "MY_VALUE2"}, | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     instances = ec2.run_instances( | 
					
						
							|  |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							|  |  |  |         MinCount=2, | 
					
						
							|  |  |  |         MaxCount=2, | 
					
						
							|  |  |  |         InstanceType="t2.micro", | 
					
						
							|  |  |  |         TagSpecifications=[{"ResourceType": "volume", "Tags": volume_tags}], | 
					
						
							|  |  |  |     ).get("Instances") | 
					
						
							|  |  |  |     instance_ids = [i["InstanceId"] for i in instances] | 
					
						
							|  |  |  |     instances = ( | 
					
						
							|  |  |  |         ec2.describe_instances(InstanceIds=instance_ids) | 
					
						
							|  |  |  |         .get("Reservations")[0] | 
					
						
							|  |  |  |         .get("Instances") | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     for instance in instances: | 
					
						
							|  |  |  |         instance_volume = instance["BlockDeviceMappings"][0]["Ebs"] | 
					
						
							|  |  |  |         volumes = ec2.describe_volumes(VolumeIds=[instance_volume["VolumeId"]]).get( | 
					
						
							|  |  |  |             "Volumes" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         for volume in volumes: | 
					
						
							|  |  |  |             sorted(volume["Tags"], key=lambda i: i["Key"]).should.equal(volume_tags) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-07-08 21:18:05 -04:00
										 |  |  | def test_get_instances_filtering_by_state(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=3) | 
					
						
							| 
									
										
										
										
											2013-07-08 21:18:05 -04:00
										 |  |  |     instance1, instance2, instance3 = reservation.instances | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     conn.terminate_instances([instance1.id]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"instance-state-name": "running"}) | 
					
						
							| 
									
										
										
										
											2013-07-08 21:18:05 -04:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     # Since we terminated instance1, only instance2 and instance3 should be | 
					
						
							|  |  |  |     # returned | 
					
						
							| 
									
										
										
										
											2013-07-08 21:18:05 -04:00
										 |  |  |     instance_ids = [instance.id for instance in reservations[0].instances] | 
					
						
							|  |  |  |     set(instance_ids).should.equal(set([instance2.id, instance3.id])) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [instance2.id], filters={"instance-state-name": "running"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2013-07-08 21:18:05 -04:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     instance_ids = [instance.id for instance in reservations[0].instances] | 
					
						
							|  |  |  |     instance_ids.should.equal([instance2.id]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [instance2.id], filters={"instance-state-name": "terminated"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2013-07-08 22:25:25 -04:00
										 |  |  |     list(reservations).should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     # get_all_reservations should still return all 3 | 
					
						
							|  |  |  |     reservations = conn.get_all_reservations() | 
					
						
							| 
									
										
										
										
											2013-07-08 22:20:55 -04:00
										 |  |  |     reservations[0].instances.should.have.length_of(3) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     conn.get_all_reservations.when.called_with( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         filters={"not-implemented-filter": "foobar"} | 
					
						
							|  |  |  |     ).should.throw(NotImplementedError) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-08 21:18:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-06-05 11:12:42 +02:00
										 |  |  | def test_get_instances_filtering_by_instance_id(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=3) | 
					
						
							| 
									
										
										
										
											2014-06-05 11:12:42 +02:00
										 |  |  |     instance1, instance2, instance3 = reservation.instances | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"instance-id": instance1.id}) | 
					
						
							|  |  |  |     # get_all_reservations should return just instance1 | 
					
						
							| 
									
										
										
										
											2014-06-05 11:12:42 +02:00
										 |  |  |     reservations[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         filters={"instance-id": [instance1.id, instance2.id]} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     # get_all_reservations should return two | 
					
						
							| 
									
										
										
										
											2014-06-05 11:12:42 +02:00
										 |  |  |     reservations[0].instances.should.have.length_of(2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"instance-id": "non-existing-id"}) | 
					
						
							| 
									
										
										
										
											2014-06-05 11:12:42 +02:00
										 |  |  |     reservations.should.have.length_of(0) | 
					
						
							| 
									
										
										
										
											2013-07-08 19:25:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  | def test_get_instances_filtering_by_instance_type(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation1 = conn.run_instances(EXAMPLE_AMI_ID, instance_type="m1.small") | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  |     instance1 = reservation1.instances[0] | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation2 = conn.run_instances(EXAMPLE_AMI_ID, instance_type="m1.small") | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  |     instance2 = reservation2.instances[0] | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation3 = conn.run_instances(EXAMPLE_AMI_ID, instance_type="t1.micro") | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  |     instance3 = reservation3.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"instance-type": "m1.small"}) | 
					
						
							|  |  |  |     # get_all_reservations should return instance1,2 | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  |     reservations.should.have.length_of(2) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[1].instances.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance_ids = [reservations[0].instances[0].id, reservations[1].instances[0].id] | 
					
						
							| 
									
										
										
										
											2015-02-24 07:39:50 -06:00
										 |  |  |     set(instance_ids).should.equal(set([instance1.id, instance2.id])) | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"instance-type": "t1.micro"}) | 
					
						
							|  |  |  |     # get_all_reservations should return one | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance3.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         filters={"instance-type": ["t1.micro", "m1.small"]} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  |     reservations.should.have.length_of(3) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[1].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[2].instances.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2015-02-24 07:39:50 -06:00
										 |  |  |     instance_ids = [ | 
					
						
							|  |  |  |         reservations[0].instances[0].id, | 
					
						
							|  |  |  |         reservations[1].instances[0].id, | 
					
						
							|  |  |  |         reservations[2].instances[0].id, | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     set(instance_ids).should.equal(set([instance1.id, instance2.id, instance3.id])) | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"instance-type": "bogus"}) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     # bogus instance-type should return none | 
					
						
							| 
									
										
										
										
											2015-02-23 11:03:59 -06:00
										 |  |  |     reservations.should.have.length_of(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-10-20 21:00:33 +00:00
										 |  |  | def test_get_instances_filtering_by_reason_code(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=3) | 
					
						
							| 
									
										
										
										
											2014-10-20 21:00:33 +00:00
										 |  |  |     instance1, instance2, instance3 = reservation.instances | 
					
						
							|  |  |  |     instance1.stop() | 
					
						
							|  |  |  |     instance2.terminate() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         filters={"state-reason-code": "Client.UserInitiatedShutdown"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     # get_all_reservations should return instance1 and instance2 | 
					
						
							| 
									
										
										
										
											2014-10-20 21:00:33 +00:00
										 |  |  |     reservations[0].instances.should.have.length_of(2) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     set([instance1.id, instance2.id]).should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         set([i.id for i in reservations[0].instances]) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-10-20 21:00:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"state-reason-code": ""}) | 
					
						
							|  |  |  |     # get_all_reservations should return instance 3 | 
					
						
							| 
									
										
										
										
											2014-10-20 21:00:33 +00:00
										 |  |  |     reservations[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance3.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-04 16:56:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-11-04 16:56:56 -05:00
										 |  |  | def test_get_instances_filtering_by_source_dest_check(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=2) | 
					
						
							| 
									
										
										
										
											2014-11-04 16:56:56 -05:00
										 |  |  |     instance1, instance2 = reservation.instances | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     conn.modify_instance_attribute( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         instance1.id, attribute="sourceDestCheck", value=False | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-11-04 16:56:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     source_dest_check_false = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         filters={"source-dest-check": "false"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     source_dest_check_true = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         filters={"source-dest-check": "true"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-11-04 16:56:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     source_dest_check_false[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     source_dest_check_false[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     source_dest_check_true[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     source_dest_check_true[0].instances[0].id.should.equal(instance2.id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-11-05 11:06:14 -05:00
										 |  |  | def test_get_instances_filtering_by_vpc_id(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_vpc("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2014-11-05 11:06:14 -05:00
										 |  |  |     vpc1 = conn.create_vpc("10.0.0.0/16") | 
					
						
							|  |  |  |     subnet1 = conn.create_subnet(vpc1.id, "10.0.0.0/27") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation1 = conn.run_instances(EXAMPLE_AMI_ID, min_count=1, subnet_id=subnet1.id) | 
					
						
							| 
									
										
										
										
											2014-11-05 11:06:14 -05:00
										 |  |  |     instance1 = reservation1.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vpc2 = conn.create_vpc("10.1.0.0/16") | 
					
						
							|  |  |  |     subnet2 = conn.create_subnet(vpc2.id, "10.1.0.0/27") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation2 = conn.run_instances(EXAMPLE_AMI_ID, min_count=1, subnet_id=subnet2.id) | 
					
						
							| 
									
										
										
										
											2014-11-05 11:06:14 -05:00
										 |  |  |     instance2 = reservation2.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations1 = conn.get_all_reservations(filters={"vpc-id": vpc1.id}) | 
					
						
							| 
									
										
										
										
											2014-11-05 11:06:14 -05:00
										 |  |  |     reservations1.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations1[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations1[0].instances[0].id.should.equal(instance1.id) | 
					
						
							| 
									
										
										
										
											2017-09-08 15:07:44 -07:00
										 |  |  |     reservations1[0].instances[0].vpc_id.should.equal(vpc1.id) | 
					
						
							|  |  |  |     reservations1[0].instances[0].subnet_id.should.equal(subnet1.id) | 
					
						
							| 
									
										
										
										
											2014-11-05 11:06:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations2 = conn.get_all_reservations(filters={"vpc-id": vpc2.id}) | 
					
						
							| 
									
										
										
										
											2014-11-05 11:06:14 -05:00
										 |  |  |     reservations2.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations2[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations2[0].instances[0].id.should.equal(instance2.id) | 
					
						
							| 
									
										
										
										
											2017-09-08 15:07:44 -07:00
										 |  |  |     reservations2[0].instances[0].vpc_id.should.equal(vpc2.id) | 
					
						
							|  |  |  |     reservations2[0].instances[0].subnet_id.should.equal(subnet2.id) | 
					
						
							| 
									
										
										
										
											2014-11-05 11:06:14 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2016-04-18 16:41:57 -04:00
										 |  |  | def test_get_instances_filtering_by_architecture(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=1) | 
					
						
							| 
									
										
										
										
											2016-04-18 16:41:57 -04:00
										 |  |  |     instance = reservation.instances | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"architecture": "x86_64"}) | 
					
						
							|  |  |  |     # get_all_reservations should return the instance | 
					
						
							| 
									
										
										
										
											2016-04-18 16:41:57 -04:00
										 |  |  |     reservations[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_get_instances_filtering_by_image_id(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     conn = boto3.resource("ec2", "us-east-1") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     conn.create_instances(ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1) | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     reservations = client.describe_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         Filters=[{"Name": "image-id", "Values": [EXAMPLE_AMI_ID]}] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     )["Reservations"] | 
					
						
							|  |  |  |     reservations[0]["Instances"].should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:29:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 15:14:58 +05:30
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_get_instances_filtering_by_account_id(): | 
					
						
							|  |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     conn = boto3.resource("ec2", "us-east-1") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     conn.create_instances(ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1) | 
					
						
							| 
									
										
										
										
											2020-07-19 15:14:58 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |     reservations = client.describe_instances( | 
					
						
							|  |  |  |         Filters=[{"Name": "owner-id", "Values": ["123456789012"]}] | 
					
						
							|  |  |  |     )["Reservations"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     reservations[0]["Instances"].should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-23 01:39:50 -07:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_get_instances_filtering_by_private_dns(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     conn = boto3.resource("ec2", "us-east-1") | 
					
						
							|  |  |  |     conn.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1, PrivateIpAddress="10.0.0.1" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     reservations = client.describe_instances( | 
					
						
							|  |  |  |         Filters=[{"Name": "private-dns-name", "Values": ["ip-10-0-0-1.ec2.internal"]}] | 
					
						
							|  |  |  |     )["Reservations"] | 
					
						
							|  |  |  |     reservations[0]["Instances"].should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2017-08-23 01:39:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:29:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-23 01:39:50 -07:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_get_instances_filtering_by_ni_private_dns(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="us-west-2") | 
					
						
							|  |  |  |     conn = boto3.resource("ec2", "us-west-2") | 
					
						
							|  |  |  |     conn.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1, PrivateIpAddress="10.0.0.1" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     reservations = client.describe_instances( | 
					
						
							|  |  |  |         Filters=[ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "Name": "network-interface.private-dns-name", | 
					
						
							|  |  |  |                 "Values": ["ip-10-0-0-1.us-west-2.compute.internal"], | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     )["Reservations"] | 
					
						
							|  |  |  |     reservations[0]["Instances"].should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2017-05-10 21:58:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:29:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-25 23:43:29 -07:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_get_instances_filtering_by_instance_group_name(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     client.create_security_group(Description="test", GroupName="test_sg") | 
					
						
							|  |  |  |     client.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1, SecurityGroups=["test_sg"] | 
					
						
							| 
									
										
										
										
											2017-08-25 23:43:29 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     reservations = client.describe_instances( | 
					
						
							|  |  |  |         Filters=[{"Name": "instance.group-name", "Values": ["test_sg"]}] | 
					
						
							|  |  |  |     )["Reservations"] | 
					
						
							|  |  |  |     reservations[0]["Instances"].should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2017-08-25 23:43:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:29:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-25 23:43:29 -07:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_get_instances_filtering_by_instance_group_id(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     create_sg = client.create_security_group(Description="test", GroupName="test_sg") | 
					
						
							|  |  |  |     group_id = create_sg["GroupId"] | 
					
						
							|  |  |  |     client.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1, SecurityGroups=["test_sg"] | 
					
						
							| 
									
										
										
										
											2017-08-25 23:43:29 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     reservations = client.describe_instances( | 
					
						
							|  |  |  |         Filters=[{"Name": "instance.group-id", "Values": [group_id]}] | 
					
						
							|  |  |  |     )["Reservations"] | 
					
						
							|  |  |  |     reservations[0]["Instances"].should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2017-08-25 23:43:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:29:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-15 09:38:40 -07:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_get_instances_filtering_by_subnet_id(): | 
					
						
							|  |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vpc_cidr = ipaddress.ip_network("192.168.42.0/24") | 
					
						
							|  |  |  |     subnet_cidr = ipaddress.ip_network("192.168.42.0/25") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.create_vpc(CidrBlock=str(vpc_cidr),) | 
					
						
							|  |  |  |     vpc_id = resp["Vpc"]["VpcId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.create_subnet(CidrBlock=str(subnet_cidr), VpcId=vpc_id) | 
					
						
							|  |  |  |     subnet_id = resp["Subnet"]["SubnetId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.run_instances( | 
					
						
							|  |  |  |         ImageId=EXAMPLE_AMI_ID, MaxCount=1, MinCount=1, SubnetId=subnet_id, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     reservations = client.describe_instances( | 
					
						
							|  |  |  |         Filters=[{"Name": "subnet-id", "Values": [subnet_id]}] | 
					
						
							|  |  |  |     )["Reservations"] | 
					
						
							|  |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-09-03 16:14:21 -07:00
										 |  |  | def test_get_instances_filtering_by_tag(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=3) | 
					
						
							| 
									
										
										
										
											2014-09-03 16:14:21 -07:00
										 |  |  |     instance1, instance2, instance3 = reservation.instances | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance1.add_tag("tag1", "value1") | 
					
						
							|  |  |  |     instance1.add_tag("tag2", "value2") | 
					
						
							|  |  |  |     instance2.add_tag("tag1", "value1") | 
					
						
							|  |  |  |     instance2.add_tag("tag2", "wrong value") | 
					
						
							|  |  |  |     instance3.add_tag("tag2", "value2") | 
					
						
							| 
									
										
										
										
											2014-09-03 16:14:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag:tag0": "value0"}) | 
					
						
							|  |  |  |     # get_all_reservations should return no instances | 
					
						
							| 
									
										
										
										
											2014-09-03 16:14:21 -07:00
										 |  |  |     reservations.should.have.length_of(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag:tag1": "value1"}) | 
					
						
							|  |  |  |     # get_all_reservations should return both instances with this tag value | 
					
						
							| 
									
										
										
										
											2014-09-03 16:14:21 -07:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(2) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  |     reservations[0].instances[1].id.should.equal(instance2.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         filters={"tag:tag1": "value1", "tag:tag2": "value2"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     # get_all_reservations should return the instance with both tag values | 
					
						
							| 
									
										
										
										
											2014-09-03 16:14:21 -07:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         filters={"tag:tag1": "value1", "tag:tag2": "value2"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     # get_all_reservations should return the instance with both tag values | 
					
						
							| 
									
										
										
										
											2014-09-03 16:14:21 -07:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag:tag2": ["value2", "bogus"]}) | 
					
						
							|  |  |  |     # get_all_reservations should return both instances with one of the | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     # acceptable tag values | 
					
						
							| 
									
										
										
										
											2014-09-03 16:14:21 -07:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(2) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  |     reservations[0].instances[1].id.should.equal(instance3.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-09 21:20:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2015-02-23 10:52:47 -06:00
										 |  |  | def test_get_instances_filtering_by_tag_value(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=3) | 
					
						
							| 
									
										
										
										
											2015-02-23 10:52:47 -06:00
										 |  |  |     instance1, instance2, instance3 = reservation.instances | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance1.add_tag("tag1", "value1") | 
					
						
							|  |  |  |     instance1.add_tag("tag2", "value2") | 
					
						
							|  |  |  |     instance2.add_tag("tag1", "value1") | 
					
						
							|  |  |  |     instance2.add_tag("tag2", "wrong value") | 
					
						
							|  |  |  |     instance3.add_tag("tag2", "value2") | 
					
						
							| 
									
										
										
										
											2015-02-23 10:52:47 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag-value": "value0"}) | 
					
						
							|  |  |  |     # get_all_reservations should return no instances | 
					
						
							| 
									
										
										
										
											2015-02-23 10:52:47 -06:00
										 |  |  |     reservations.should.have.length_of(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag-value": "value1"}) | 
					
						
							|  |  |  |     # get_all_reservations should return both instances with this tag value | 
					
						
							| 
									
										
										
										
											2015-02-23 10:52:47 -06:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(2) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  |     reservations[0].instances[1].id.should.equal(instance2.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations( | 
					
						
							|  |  |  |         filters={"tag-value": ["value2", "value1"]} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     # get_all_reservations should return both instances with one of the | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     # acceptable tag values | 
					
						
							| 
									
										
										
										
											2015-02-23 10:52:47 -06:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(3) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  |     reservations[0].instances[1].id.should.equal(instance2.id) | 
					
						
							|  |  |  |     reservations[0].instances[2].id.should.equal(instance3.id) | 
					
						
							| 
									
										
										
										
											2015-03-28 14:30:30 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag-value": ["value2", "bogus"]}) | 
					
						
							|  |  |  |     # get_all_reservations should return both instances with one of the | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     # acceptable tag values | 
					
						
							| 
									
										
										
										
											2015-02-23 10:52:47 -06:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(2) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  |     reservations[0].instances[1].id.should.equal(instance3.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2015-02-23 10:45:16 -06:00
										 |  |  | def test_get_instances_filtering_by_tag_name(): | 
					
						
							|  |  |  |     conn = boto.connect_ec2() | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=3) | 
					
						
							| 
									
										
										
										
											2015-02-23 10:45:16 -06:00
										 |  |  |     instance1, instance2, instance3 = reservation.instances | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance1.add_tag("tag1") | 
					
						
							|  |  |  |     instance1.add_tag("tag2") | 
					
						
							|  |  |  |     instance2.add_tag("tag1") | 
					
						
							|  |  |  |     instance2.add_tag("tag2X") | 
					
						
							|  |  |  |     instance3.add_tag("tag3") | 
					
						
							| 
									
										
										
										
											2015-02-23 10:45:16 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag-key": "tagX"}) | 
					
						
							|  |  |  |     # get_all_reservations should return no instances | 
					
						
							| 
									
										
										
										
											2015-02-23 10:45:16 -06:00
										 |  |  |     reservations.should.have.length_of(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag-key": "tag1"}) | 
					
						
							|  |  |  |     # get_all_reservations should return both instances with this tag value | 
					
						
							| 
									
										
										
										
											2015-02-23 10:45:16 -06:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(2) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  |     reservations[0].instances[1].id.should.equal(instance2.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 06:07:19 -08:00
										 |  |  |     reservations = conn.get_all_reservations(filters={"tag-key": ["tag1", "tag3"]}) | 
					
						
							|  |  |  |     # get_all_reservations should return both instances with one of the | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     # acceptable tag values | 
					
						
							| 
									
										
										
										
											2015-02-23 10:45:16 -06:00
										 |  |  |     reservations.should.have.length_of(1) | 
					
						
							|  |  |  |     reservations[0].instances.should.have.length_of(3) | 
					
						
							|  |  |  |     reservations[0].instances[0].id.should.equal(instance1.id) | 
					
						
							|  |  |  |     reservations[0].instances[1].id.should.equal(instance2.id) | 
					
						
							|  |  |  |     reservations[0].instances[2].id.should.equal(instance3.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-02-18 21:56:22 -05:00
										 |  |  | def test_instance_start_and_stop(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=2) | 
					
						
							| 
									
										
										
										
											2013-02-18 21:56:22 -05:00
										 |  |  |     instances = reservation.instances | 
					
						
							| 
									
										
										
										
											2013-02-18 23:06:23 -05:00
										 |  |  |     instances.should.have.length_of(2) | 
					
						
							| 
									
										
										
										
											2013-02-18 21:56:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     instance_ids = [instance.id for instance in instances] | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  |         stopped_instances = conn.stop_instances(instance_ids, dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the StopInstance operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     stopped_instances = conn.stop_instances(instance_ids) | 
					
						
							| 
									
										
										
										
											2013-02-18 21:56:22 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for instance in stopped_instances: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         instance.state.should.equal("stopping") | 
					
						
							| 
									
										
										
										
											2013-02-18 21:56:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         started_instances = conn.start_instances([instances[0].id], dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the StartInstance operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-28 00:08:35 -05:00
										 |  |  |     started_instances = conn.start_instances([instances[0].id]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     started_instances[0].state.should.equal("pending") | 
					
						
							| 
									
										
										
										
											2013-02-18 23:06:23 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-02-19 23:55:01 -05:00
										 |  |  | def test_instance_reboot(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2013-02-19 23:55:01 -05:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  |         instance.reboot(dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the RebootInstance operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 23:55:01 -05:00
										 |  |  |     instance.reboot() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.state.should.equal("pending") | 
					
						
							| 
									
										
										
										
											2013-02-19 23:55:01 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  | def test_instance_attribute_instance_type(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  |         instance.modify_attribute("instanceType", "m1.small", dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the ModifyInstanceType operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  |     instance.modify_attribute("instanceType", "m1.small") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_attribute = instance.get_attribute("instanceType") | 
					
						
							|  |  |  |     instance_attribute.should.be.a(InstanceAttribute) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance_attribute.get("instanceType").should.equal("m1.small") | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-11-27 11:05:39 -06:00
										 |  |  | def test_modify_instance_attribute_security_groups(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2014-11-27 11:05:39 -06:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sg_id = conn.create_security_group( | 
					
						
							|  |  |  |         "test security group", "this is a test security group" | 
					
						
							|  |  |  |     ).id | 
					
						
							|  |  |  |     sg_id2 = conn.create_security_group( | 
					
						
							|  |  |  |         "test security group 2", "this is a test security group 2" | 
					
						
							|  |  |  |     ).id | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  |         instance.modify_attribute("groupSet", [sg_id, sg_id2], dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the ModifyInstanceSecurityGroups operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-27 11:05:39 -06:00
										 |  |  |     instance.modify_attribute("groupSet", [sg_id, sg_id2]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_attribute = instance.get_attribute("groupSet") | 
					
						
							|  |  |  |     instance_attribute.should.be.a(InstanceAttribute) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     group_list = instance_attribute.get("groupSet") | 
					
						
							| 
									
										
										
										
											2014-11-27 11:05:39 -06:00
										 |  |  |     any(g.id == sg_id for g in group_list).should.be.ok | 
					
						
							|  |  |  |     any(g.id == sg_id2 for g in group_list).should.be.ok | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  | def test_instance_attribute_user_data(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         instance.modify_attribute("userData", "this is my user data", dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the ModifyUserData operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 23:01:13 -05:00
										 |  |  |     instance.modify_attribute("userData", "this is my user data") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_attribute = instance.get_attribute("userData") | 
					
						
							|  |  |  |     instance_attribute.should.be.a(InstanceAttribute) | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     instance_attribute.get("userData").should.equal("this is my user data") | 
					
						
							| 
									
										
										
										
											2013-05-17 19:35:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-10-22 15:11:37 -07:00
										 |  |  | def test_instance_attribute_source_dest_check(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2014-10-22 15:11:37 -07:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Default value is true | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.sourceDestCheck.should.equal("true") | 
					
						
							| 
									
										
										
										
											2014-10-22 15:11:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     instance_attribute = instance.get_attribute("sourceDestCheck") | 
					
						
							|  |  |  |     instance_attribute.should.be.a(InstanceAttribute) | 
					
						
							|  |  |  |     instance_attribute.get("sourceDestCheck").should.equal(True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Set to false (note: Boto converts bool to string, eg 'false') | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  |         instance.modify_attribute("sourceDestCheck", False, dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the ModifySourceDestCheck operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 15:11:37 -07:00
										 |  |  |     instance.modify_attribute("sourceDestCheck", False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.update() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.sourceDestCheck.should.equal("false") | 
					
						
							| 
									
										
										
										
											2014-10-22 15:11:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     instance_attribute = instance.get_attribute("sourceDestCheck") | 
					
						
							|  |  |  |     instance_attribute.should.be.a(InstanceAttribute) | 
					
						
							|  |  |  |     instance_attribute.get("sourceDestCheck").should.equal(False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Set back to true | 
					
						
							|  |  |  |     instance.modify_attribute("sourceDestCheck", True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.update() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.sourceDestCheck.should.equal("true") | 
					
						
							| 
									
										
										
										
											2014-10-22 15:11:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     instance_attribute = instance.get_attribute("sourceDestCheck") | 
					
						
							|  |  |  |     instance_attribute.should.be.a(InstanceAttribute) | 
					
						
							|  |  |  |     instance_attribute.get("sourceDestCheck").should.equal(True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2013-05-17 19:35:53 -04:00
										 |  |  | def test_user_data_with_run_instance(): | 
					
						
							| 
									
										
										
										
											2014-08-26 13:25:50 -04:00
										 |  |  |     user_data = b"some user data" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, user_data=user_data) | 
					
						
							| 
									
										
										
										
											2013-05-17 19:35:53 -04:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_attribute = instance.get_attribute("userData") | 
					
						
							|  |  |  |     instance_attribute.should.be.a(InstanceAttribute) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     retrieved_user_data = instance_attribute.get("userData").encode("utf-8") | 
					
						
							| 
									
										
										
										
											2020-09-02 15:40:29 +05:30
										 |  |  |     decoded_user_data = decode_method(retrieved_user_data) | 
					
						
							| 
									
										
										
										
											2014-08-26 13:25:50 -04:00
										 |  |  |     decoded_user_data.should.equal(b"some user data") | 
					
						
							| 
									
										
										
										
											2014-03-22 14:02:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-05-07 09:16:28 -04:00
										 |  |  | def test_run_instance_with_security_group_name(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         group = conn.create_security_group("group1", "some description", dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the CreateSecurityGroup operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     group = conn.create_security_group("group1", "some description") | 
					
						
							| 
									
										
										
										
											2014-03-22 14:02:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, security_groups=["group1"]) | 
					
						
							| 
									
										
										
										
											2014-05-07 09:16:28 -04:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.groups[0].id.should.equal(group.id) | 
					
						
							|  |  |  |     instance.groups[0].name.should.equal("group1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-05-07 09:16:28 -04:00
										 |  |  | def test_run_instance_with_security_group_id(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							|  |  |  |     group = conn.create_security_group("group1", "some description") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, security_group_ids=[group.id]) | 
					
						
							| 
									
										
										
										
											2014-03-22 14:02:47 -04:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.groups[0].id.should.equal(group.id) | 
					
						
							|  |  |  |     instance.groups[0].name.should.equal("group1") | 
					
						
							| 
									
										
										
										
											2014-05-07 08:36:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-05-07 08:36:19 -04:00
										 |  |  | def test_run_instance_with_instance_type(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, instance_type="t1.micro") | 
					
						
							| 
									
										
										
										
											2014-05-07 08:36:19 -04:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.instance_type.should.equal("t1.micro") | 
					
						
							| 
									
										
										
										
											2014-05-07 08:47:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2016-02-10 17:59:48 +00:00
										 |  |  | def test_run_instance_with_default_placement(): | 
					
						
							| 
									
										
										
										
											2019-05-25 03:18:16 -07:00
										 |  |  |     conn = boto.ec2.connect_to_region("us-east-1") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2016-02-10 17:59:48 +00:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.placement.should.equal("us-east-1a") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2016-02-10 17:59:48 +00:00
										 |  |  | def test_run_instance_with_placement(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, placement="us-east-1b") | 
					
						
							| 
									
										
										
										
											2016-02-10 17:59:48 +00:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.placement.should.equal("us-east-1b") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | @mock_ec2 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:29:56 +01:00
										 |  |  | def test_run_instance_with_subnet_boto3(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="eu-central-1") | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     ip_networks = [ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         (ipaddress.ip_network("10.0.0.0/16"), ipaddress.ip_network("10.0.99.0/24")), | 
					
						
							|  |  |  |         ( | 
					
						
							|  |  |  |             ipaddress.ip_network("192.168.42.0/24"), | 
					
						
							|  |  |  |             ipaddress.ip_network("192.168.42.0/25"), | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     # Tests instances are created with the correct IPs | 
					
						
							|  |  |  |     for vpc_cidr, subnet_cidr in ip_networks: | 
					
						
							|  |  |  |         resp = client.create_vpc( | 
					
						
							|  |  |  |             CidrBlock=str(vpc_cidr), | 
					
						
							|  |  |  |             AmazonProvidedIpv6CidrBlock=False, | 
					
						
							|  |  |  |             DryRun=False, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             InstanceTenancy="default", | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         vpc_id = resp["Vpc"]["VpcId"] | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         resp = client.create_subnet(CidrBlock=str(subnet_cidr), VpcId=vpc_id) | 
					
						
							|  |  |  |         subnet_id = resp["Subnet"]["SubnetId"] | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         resp = client.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |             ImageId=EXAMPLE_AMI_ID, MaxCount=1, MinCount=1, SubnetId=subnet_id | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         instance = resp["Instances"][0] | 
					
						
							|  |  |  |         instance["SubnetId"].should.equal(subnet_id) | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-26 07:40:39 +01:00
										 |  |  |         priv_ipv4 = ipaddress.ip_address(str(instance["PrivateIpAddress"])) | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |         subnet_cidr.should.contain(priv_ipv4) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_run_instance_with_specified_private_ipv4(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="eu-central-1") | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     vpc_cidr = ipaddress.ip_network("192.168.42.0/24") | 
					
						
							|  |  |  |     subnet_cidr = ipaddress.ip_network("192.168.42.0/25") | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     resp = client.create_vpc( | 
					
						
							|  |  |  |         CidrBlock=str(vpc_cidr), | 
					
						
							|  |  |  |         AmazonProvidedIpv6CidrBlock=False, | 
					
						
							|  |  |  |         DryRun=False, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         InstanceTenancy="default", | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     vpc_id = resp["Vpc"]["VpcId"] | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     resp = client.create_subnet(CidrBlock=str(subnet_cidr), VpcId=vpc_id) | 
					
						
							|  |  |  |     subnet_id = resp["Subnet"]["SubnetId"] | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     resp = client.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |         MaxCount=1, | 
					
						
							|  |  |  |         MinCount=1, | 
					
						
							|  |  |  |         SubnetId=subnet_id, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         PrivateIpAddress="192.168.42.5", | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance = resp["Instances"][0] | 
					
						
							|  |  |  |     instance["SubnetId"].should.equal(subnet_id) | 
					
						
							|  |  |  |     instance["PrivateIpAddress"].should.equal("192.168.42.5") | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_run_instance_mapped_public_ipv4(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="eu-central-1") | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     vpc_cidr = ipaddress.ip_network("192.168.42.0/24") | 
					
						
							|  |  |  |     subnet_cidr = ipaddress.ip_network("192.168.42.0/25") | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     resp = client.create_vpc( | 
					
						
							|  |  |  |         CidrBlock=str(vpc_cidr), | 
					
						
							|  |  |  |         AmazonProvidedIpv6CidrBlock=False, | 
					
						
							|  |  |  |         DryRun=False, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         InstanceTenancy="default", | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     vpc_id = resp["Vpc"]["VpcId"] | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     resp = client.create_subnet(CidrBlock=str(subnet_cidr), VpcId=vpc_id) | 
					
						
							|  |  |  |     subnet_id = resp["Subnet"]["SubnetId"] | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     client.modify_subnet_attribute( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SubnetId=subnet_id, MapPublicIpOnLaunch={"Value": True} | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, MaxCount=1, MinCount=1, SubnetId=subnet_id | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance = resp["Instances"][0] | 
					
						
							|  |  |  |     instance.should.contain("PublicDnsName") | 
					
						
							|  |  |  |     instance.should.contain("PublicIpAddress") | 
					
						
							|  |  |  |     len(instance["PublicDnsName"]).should.be.greater_than(0) | 
					
						
							|  |  |  |     len(instance["PublicIpAddress"]).should.be.greater_than(0) | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  | def test_run_instance_with_nic_autocreated(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_vpc("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  |     vpc = conn.create_vpc("10.0.0.0/16") | 
					
						
							|  |  |  |     subnet = conn.create_subnet(vpc.id, "10.0.0.0/18") | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     security_group1 = conn.create_security_group( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test security group #1", "this is a test security group" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     security_group2 = conn.create_security_group( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test security group #2", "this is a test security group" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-10-25 19:29:56 +01:00
										 |  |  |     private_ip = "10.0.0.1" | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     reservation = conn.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         subnet_id=subnet.id, | 
					
						
							|  |  |  |         security_groups=[security_group1.name], | 
					
						
							|  |  |  |         security_group_ids=[security_group2.id], | 
					
						
							|  |  |  |         private_ip_address=private_ip, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-05-07 08:47:25 -04:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  |     all_enis = conn.get_all_network_interfaces() | 
					
						
							|  |  |  |     all_enis.should.have.length_of(1) | 
					
						
							|  |  |  |     eni = all_enis[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.interfaces.should.have.length_of(1) | 
					
						
							|  |  |  |     instance.interfaces[0].id.should.equal(eni.id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.subnet_id.should.equal(subnet.id) | 
					
						
							|  |  |  |     instance.groups.should.have.length_of(2) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     set([group.id for group in instance.groups]).should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         set([security_group1.id, security_group2.id]) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     eni.subnet_id.should.equal(subnet.id) | 
					
						
							|  |  |  |     eni.groups.should.have.length_of(2) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     set([group.id for group in eni.groups]).should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         set([security_group1.id, security_group2.id]) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  |     eni.private_ip_addresses.should.have.length_of(1) | 
					
						
							|  |  |  |     eni.private_ip_addresses[0].private_ip_address.should.equal(private_ip) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  | def test_run_instance_with_nic_preexisting(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_vpc("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  |     vpc = conn.create_vpc("10.0.0.0/16") | 
					
						
							|  |  |  |     subnet = conn.create_subnet(vpc.id, "10.0.0.0/18") | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     security_group1 = conn.create_security_group( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test security group #1", "this is a test security group" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     security_group2 = conn.create_security_group( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test security group #2", "this is a test security group" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  |     private_ip = "54.0.0.1" | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     eni = conn.create_network_interface( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         subnet.id, private_ip, groups=[security_group1.id] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Boto requires NetworkInterfaceCollection of NetworkInterfaceSpecifications... | 
					
						
							|  |  |  |     #   annoying, but generates the desired querystring. | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     from boto.ec2.networkinterface import ( | 
					
						
							|  |  |  |         NetworkInterfaceSpecification, | 
					
						
							|  |  |  |         NetworkInterfaceCollection, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     interface = NetworkInterfaceSpecification( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         network_interface_id=eni.id, device_index=0 | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  |     interfaces = NetworkInterfaceCollection(interface) | 
					
						
							|  |  |  |     # end Boto objects | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     reservation = conn.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         network_interfaces=interfaces, | 
					
						
							|  |  |  |         security_group_ids=[security_group2.id], | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.subnet_id.should.equal(subnet.id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     all_enis = conn.get_all_network_interfaces() | 
					
						
							|  |  |  |     all_enis.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.interfaces.should.have.length_of(1) | 
					
						
							|  |  |  |     instance_eni = instance.interfaces[0] | 
					
						
							|  |  |  |     instance_eni.id.should.equal(eni.id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_eni.subnet_id.should.equal(subnet.id) | 
					
						
							|  |  |  |     instance_eni.groups.should.have.length_of(2) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     set([group.id for group in instance_eni.groups]).should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         set([security_group1.id, security_group2.id]) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-08 16:50:18 -07:00
										 |  |  |     instance_eni.private_ip_addresses.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance_eni.private_ip_addresses[0].private_ip_address.should.equal(private_ip) | 
					
						
							| 
									
										
										
										
											2014-05-07 08:54:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-12 11:51:50 -07:00
										 |  |  | @requires_boto_gte("2.32.0") | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | def test_instance_with_nic_attach_detach(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_vpc("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  |     vpc = conn.create_vpc("10.0.0.0/16") | 
					
						
							|  |  |  |     subnet = conn.create_subnet(vpc.id, "10.0.0.0/18") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     security_group1 = conn.create_security_group( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test security group #1", "this is a test security group" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     security_group2 = conn.create_security_group( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test security group #2", "this is a test security group" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     reservation = conn.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         EXAMPLE_AMI_ID, security_group_ids=[security_group1.id] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     eni = conn.create_network_interface(subnet.id, groups=[security_group2.id]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Check initial instance and ENI data | 
					
						
							| 
									
										
										
										
											2015-02-14 14:42:20 -05:00
										 |  |  |     instance.interfaces.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     eni.groups.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     set([group.id for group in eni.groups]).should.equal(set([security_group2.id])) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Attach | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         conn.attach_network_interface(eni.id, instance.id, device_index=1, dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the AttachNetworkInterface operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-14 14:42:20 -05:00
										 |  |  |     conn.attach_network_interface(eni.id, instance.id, device_index=1) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Check attached instance and ENI data | 
					
						
							|  |  |  |     instance.update() | 
					
						
							| 
									
										
										
										
											2015-02-14 14:42:20 -05:00
										 |  |  |     instance.interfaces.should.have.length_of(2) | 
					
						
							|  |  |  |     instance_eni = instance.interfaces[1] | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  |     instance_eni.id.should.equal(eni.id) | 
					
						
							|  |  |  |     instance_eni.groups.should.have.length_of(2) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     set([group.id for group in instance_eni.groups]).should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         set([security_group1.id, security_group2.id]) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     eni = conn.get_all_network_interfaces(filters={"network-interface-id": eni.id})[0] | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  |     eni.groups.should.have.length_of(2) | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     set([group.id for group in eni.groups]).should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         set([security_group1.id, security_group2.id]) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Detach | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  |         conn.detach_network_interface(instance_eni.attachment.id, dry_run=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the DetachNetworkInterface operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  |     conn.detach_network_interface(instance_eni.attachment.id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Check detached instance and ENI data | 
					
						
							|  |  |  |     instance.update() | 
					
						
							| 
									
										
										
										
											2015-02-14 14:42:20 -05:00
										 |  |  |     instance.interfaces.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     eni = conn.get_all_network_interfaces(filters={"network-interface-id": eni.id})[0] | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  |     eni.groups.should.have.length_of(1) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     set([group.id for group in eni.groups]).should.equal(set([security_group2.id])) | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Detach with invalid attachment ID | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as cm: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         conn.detach_network_interface("eni-attach-1234abcd") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     cm.value.code.should.equal("InvalidAttachmentID.NotFound") | 
					
						
							|  |  |  |     cm.value.status.should.equal(400) | 
					
						
							|  |  |  |     cm.value.request_id.should_not.be.none | 
					
						
							| 
									
										
										
										
											2014-09-12 10:53:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2015-02-14 14:42:20 -05:00
										 |  |  | def test_ec2_classic_has_public_ip_address(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, key_name="keypair_name") | 
					
						
							| 
									
										
										
										
											2015-02-14 14:42:20 -05:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  |     instance.ip_address.should_not.equal(None) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.public_dns_name.should.contain(instance.ip_address.replace(".", "-")) | 
					
						
							| 
									
										
										
										
											2015-02-14 14:42:20 -05:00
										 |  |  |     instance.private_ip_address.should_not.equal(None) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.private_dns_name.should.contain( | 
					
						
							|  |  |  |         instance.private_ip_address.replace(".", "-") | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-02-14 14:42:20 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-24 23:57:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-05-07 08:54:27 -04:00
										 |  |  | def test_run_instance_with_keypair(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, key_name="keypair_name") | 
					
						
							| 
									
										
										
										
											2014-05-07 08:54:27 -04:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance.key_name.should.equal("keypair_name") | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_run_instance_with_block_device_mappings(): | 
					
						
							|  |  |  |     ec2_client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     kwargs = { | 
					
						
							|  |  |  |         "MinCount": 1, | 
					
						
							|  |  |  |         "MaxCount": 1, | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  |         "KeyName": "the_key", | 
					
						
							|  |  |  |         "InstanceType": "t1.micro", | 
					
						
							|  |  |  |         "BlockDeviceMappings": [{"DeviceName": "/dev/sda2", "Ebs": {"VolumeSize": 50}}], | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ec2_client.run_instances(**kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = ec2_client.describe_instances() | 
					
						
							|  |  |  |     volume = instances["Reservations"][0]["Instances"][0]["BlockDeviceMappings"][0][ | 
					
						
							|  |  |  |         "Ebs" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     volumes = ec2_client.describe_volumes(VolumeIds=[volume["VolumeId"]]) | 
					
						
							|  |  |  |     volumes["Volumes"][0]["Size"].should.equal(50) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_run_instance_with_block_device_mappings_missing_ebs(): | 
					
						
							|  |  |  |     ec2_client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     kwargs = { | 
					
						
							|  |  |  |         "MinCount": 1, | 
					
						
							|  |  |  |         "MaxCount": 1, | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  |         "KeyName": "the_key", | 
					
						
							|  |  |  |         "InstanceType": "t1.micro", | 
					
						
							|  |  |  |         "BlockDeviceMappings": [{"DeviceName": "/dev/sda2"}], | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  |         ec2_client.run_instances(**kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.response["Error"]["Code"].should.equal("MissingParameter") | 
					
						
							|  |  |  |     ex.value.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |     ex.value.response["Error"]["Message"].should.equal( | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  |         "The request must contain the parameter ebs" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_run_instance_with_block_device_mappings_missing_size(): | 
					
						
							|  |  |  |     ec2_client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     kwargs = { | 
					
						
							|  |  |  |         "MinCount": 1, | 
					
						
							|  |  |  |         "MaxCount": 1, | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  |         "KeyName": "the_key", | 
					
						
							|  |  |  |         "InstanceType": "t1.micro", | 
					
						
							|  |  |  |         "BlockDeviceMappings": [ | 
					
						
							|  |  |  |             {"DeviceName": "/dev/sda2", "Ebs": {"VolumeType": "standard"}} | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  |         ec2_client.run_instances(**kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.response["Error"]["Code"].should.equal("MissingParameter") | 
					
						
							|  |  |  |     ex.value.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |     ex.value.response["Error"]["Message"].should.equal( | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  |         "The request must contain the parameter size or snapshotId" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_run_instance_with_block_device_mappings_from_snapshot(): | 
					
						
							|  |  |  |     ec2_client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     ec2_resource = boto3.resource("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     volume_details = { | 
					
						
							|  |  |  |         "AvailabilityZone": "1a", | 
					
						
							|  |  |  |         "Size": 30, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     volume = ec2_resource.create_volume(**volume_details) | 
					
						
							|  |  |  |     snapshot = volume.create_snapshot() | 
					
						
							|  |  |  |     kwargs = { | 
					
						
							|  |  |  |         "MinCount": 1, | 
					
						
							|  |  |  |         "MaxCount": 1, | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2020-05-11 15:23:45 +03:00
										 |  |  |         "KeyName": "the_key", | 
					
						
							|  |  |  |         "InstanceType": "t1.micro", | 
					
						
							|  |  |  |         "BlockDeviceMappings": [ | 
					
						
							|  |  |  |             {"DeviceName": "/dev/sda2", "Ebs": {"SnapshotId": snapshot.snapshot_id}} | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ec2_client.run_instances(**kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = ec2_client.describe_instances() | 
					
						
							|  |  |  |     volume = instances["Reservations"][0]["Instances"][0]["BlockDeviceMappings"][0][ | 
					
						
							|  |  |  |         "Ebs" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     volumes = ec2_client.describe_volumes(VolumeIds=[volume["VolumeId"]]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     volumes["Volumes"][0]["Size"].should.equal(30) | 
					
						
							|  |  |  |     volumes["Volumes"][0]["SnapshotId"].should.equal(snapshot.snapshot_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  | def test_describe_instance_status_no_instances(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  |     all_status = conn.get_all_instance_status() | 
					
						
							|  |  |  |     len(all_status).should.equal(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  | def test_describe_instance_status_with_instances(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     conn.run_instances(EXAMPLE_AMI_ID, key_name="keypair_name") | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     all_status = conn.get_all_instance_status() | 
					
						
							|  |  |  |     len(all_status).should.equal(1) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     all_status[0].instance_status.status.should.equal("ok") | 
					
						
							|  |  |  |     all_status[0].system_status.status.should.equal("ok") | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  | def test_describe_instance_status_with_instance_filter_deprecated(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # We want to filter based on this one | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, key_name="keypair_name") | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  |     instance = reservation.instances[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # This is just to setup the test | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     conn.run_instances(EXAMPLE_AMI_ID, key_name="keypair_name") | 
					
						
							| 
									
										
										
										
											2014-08-20 14:52:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     all_status = conn.get_all_instance_status(instance_ids=[instance.id]) | 
					
						
							|  |  |  |     len(all_status).should.equal(1) | 
					
						
							| 
									
										
										
										
											2014-08-25 13:43:23 -07:00
										 |  |  |     all_status[0].id.should.equal(instance.id) | 
					
						
							| 
									
										
										
										
											2014-08-25 14:00:35 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Call get_all_instance_status with a bad id should raise an error | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as cm: | 
					
						
							| 
									
										
										
										
											2014-08-25 14:00:35 -07:00
										 |  |  |         conn.get_all_instance_status(instance_ids=[instance.id, "i-1234abcd"]) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     cm.value.code.should.equal("InvalidInstanceID.NotFound") | 
					
						
							|  |  |  |     cm.value.status.should.equal(400) | 
					
						
							|  |  |  |     cm.value.request_id.should_not.be.none | 
					
						
							| 
									
										
										
										
											2014-10-24 16:18:52 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-07 08:49:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-06 21:25:59 +05:30
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_describe_instance_credit_specifications(): | 
					
						
							|  |  |  |     conn = boto3.client("ec2", region_name="us-west-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # We want to filter based on this one | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1) | 
					
						
							| 
									
										
										
										
											2020-04-07 08:49:19 +01:00
										 |  |  |     result = conn.describe_instance_credit_specifications( | 
					
						
							|  |  |  |         InstanceIds=[reservation["Instances"][0]["InstanceId"]] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         result["InstanceCreditSpecifications"][0]["InstanceId"] | 
					
						
							|  |  |  |         == reservation["Instances"][0]["InstanceId"] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_describe_instance_status_with_instance_filter(): | 
					
						
							|  |  |  |     conn = boto3.client("ec2", region_name="us-west-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # We want to filter based on this one | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(ImageId=EXAMPLE_AMI_ID, MinCount=3, MaxCount=3) | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:58 +00:00
										 |  |  |     instance1 = reservation["Instances"][0] | 
					
						
							|  |  |  |     instance2 = reservation["Instances"][1] | 
					
						
							|  |  |  |     instance3 = reservation["Instances"][2] | 
					
						
							|  |  |  |     conn.stop_instances(InstanceIds=[instance1["InstanceId"]]) | 
					
						
							|  |  |  |     stopped_instance_ids = [instance1["InstanceId"]] | 
					
						
							|  |  |  |     running_instance_ids = sorted([instance2["InstanceId"], instance3["InstanceId"]]) | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  |     all_instance_ids = sorted(stopped_instance_ids + running_instance_ids) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Filter instance using the state name | 
					
						
							|  |  |  |     state_name_filter = { | 
					
						
							|  |  |  |         "running_and_stopped": [ | 
					
						
							|  |  |  |             {"Name": "instance-state-name", "Values": ["running", "stopped"]} | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "running": [{"Name": "instance-state-name", "Values": ["running"]}], | 
					
						
							|  |  |  |         "stopped": [{"Name": "instance-state-name", "Values": ["stopped"]}], | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:58 +00:00
										 |  |  |     found_statuses = conn.describe_instance_status( | 
					
						
							|  |  |  |         IncludeAllInstances=True, Filters=state_name_filter["running_and_stopped"] | 
					
						
							|  |  |  |     )["InstanceStatuses"] | 
					
						
							|  |  |  |     found_instance_ids = [status["InstanceId"] for status in found_statuses] | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  |     sorted(found_instance_ids).should.equal(all_instance_ids) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:58 +00:00
										 |  |  |     found_statuses = conn.describe_instance_status( | 
					
						
							|  |  |  |         IncludeAllInstances=True, Filters=state_name_filter["running"] | 
					
						
							|  |  |  |     )["InstanceStatuses"] | 
					
						
							|  |  |  |     found_instance_ids = [status["InstanceId"] for status in found_statuses] | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  |     sorted(found_instance_ids).should.equal(running_instance_ids) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:58 +00:00
										 |  |  |     found_statuses = conn.describe_instance_status( | 
					
						
							|  |  |  |         IncludeAllInstances=True, Filters=state_name_filter["stopped"] | 
					
						
							|  |  |  |     )["InstanceStatuses"] | 
					
						
							|  |  |  |     found_instance_ids = [status["InstanceId"] for status in found_statuses] | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  |     sorted(found_instance_ids).should.equal(stopped_instance_ids) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Filter instance using the state code | 
					
						
							|  |  |  |     state_code_filter = { | 
					
						
							|  |  |  |         "running_and_stopped": [ | 
					
						
							|  |  |  |             {"Name": "instance-state-code", "Values": ["16", "80"]} | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "running": [{"Name": "instance-state-code", "Values": ["16"]}], | 
					
						
							|  |  |  |         "stopped": [{"Name": "instance-state-code", "Values": ["80"]}], | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:58 +00:00
										 |  |  |     found_statuses = conn.describe_instance_status( | 
					
						
							|  |  |  |         IncludeAllInstances=True, Filters=state_code_filter["running_and_stopped"] | 
					
						
							|  |  |  |     )["InstanceStatuses"] | 
					
						
							|  |  |  |     found_instance_ids = [status["InstanceId"] for status in found_statuses] | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  |     sorted(found_instance_ids).should.equal(all_instance_ids) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:58 +00:00
										 |  |  |     found_statuses = conn.describe_instance_status( | 
					
						
							|  |  |  |         IncludeAllInstances=True, Filters=state_code_filter["running"] | 
					
						
							|  |  |  |     )["InstanceStatuses"] | 
					
						
							|  |  |  |     found_instance_ids = [status["InstanceId"] for status in found_statuses] | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  |     sorted(found_instance_ids).should.equal(running_instance_ids) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:58 +00:00
										 |  |  |     found_statuses = conn.describe_instance_status( | 
					
						
							|  |  |  |         IncludeAllInstances=True, Filters=state_code_filter["stopped"] | 
					
						
							|  |  |  |     )["InstanceStatuses"] | 
					
						
							|  |  |  |     found_instance_ids = [status["InstanceId"] for status in found_statuses] | 
					
						
							| 
									
										
										
										
											2020-02-24 13:43:19 +00:00
										 |  |  |     sorted(found_instance_ids).should.equal(stopped_instance_ids) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-27 14:48:17 +00:00
										 |  |  | @requires_boto_gte("2.32.0") | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-10-24 16:18:52 -04:00
										 |  |  | def test_describe_instance_status_with_non_running_instances(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     reservation = conn.run_instances(EXAMPLE_AMI_ID, min_count=3) | 
					
						
							| 
									
										
										
										
											2014-10-24 16:18:52 -04:00
										 |  |  |     instance1, instance2, instance3 = reservation.instances | 
					
						
							|  |  |  |     instance1.stop() | 
					
						
							|  |  |  |     instance2.terminate() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     all_running_status = conn.get_all_instance_status() | 
					
						
							|  |  |  |     all_running_status.should.have.length_of(1) | 
					
						
							|  |  |  |     all_running_status[0].id.should.equal(instance3.id) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     all_running_status[0].state_name.should.equal("running") | 
					
						
							| 
									
										
										
										
											2014-10-24 16:18:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     all_status = conn.get_all_instance_status(include_all_instances=True) | 
					
						
							|  |  |  |     all_status.should.have.length_of(3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     status1 = next((s for s in all_status if s.id == instance1.id), None) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     status1.state_name.should.equal("stopped") | 
					
						
							| 
									
										
										
										
											2014-10-24 16:18:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     status2 = next((s for s in all_status if s.id == instance2.id), None) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     status2.state_name.should.equal("terminated") | 
					
						
							| 
									
										
										
										
											2014-10-24 16:18:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     status3 = next((s for s in all_status if s.id == instance3.id), None) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     status3.state_name.should.equal("running") | 
					
						
							| 
									
										
										
										
											2014-12-10 11:53:40 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 22:35:45 -05:00
										 |  |  | @mock_ec2_deprecated | 
					
						
							| 
									
										
										
										
											2014-12-10 11:53:40 -06:00
										 |  |  | def test_get_instance_by_security_group(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto.connect_ec2("the_key", "the_secret") | 
					
						
							| 
									
										
										
										
											2015-01-18 16:30:39 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     conn.run_instances(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2014-12-10 11:53:40 -06:00
										 |  |  |     instance = conn.get_only_instances()[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     security_group = conn.create_security_group("test", "test") | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(EC2ResponseError) as ex: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         conn.modify_instance_attribute( | 
					
						
							|  |  |  |             instance.id, "groupSet", [security_group.id], dry_run=True | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.error_code.should.equal("DryRunOperation") | 
					
						
							|  |  |  |     ex.value.status.should.equal(400) | 
					
						
							|  |  |  |     ex.value.message.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "An error occurred (DryRunOperation) when calling the ModifyInstanceSecurityGroups operation: Request would have succeeded, but DryRun flag is set" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-10-15 23:08:44 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.modify_instance_attribute(instance.id, "groupSet", [security_group.id]) | 
					
						
							| 
									
										
										
										
											2015-01-18 16:30:39 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-10 11:53:40 -06:00
										 |  |  |     security_group_instances = security_group.instances() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert len(security_group_instances) == 1 | 
					
						
							|  |  |  |     assert security_group_instances[0].id == instance.id | 
					
						
							| 
									
										
										
										
											2017-10-12 21:59:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_modify_delete_on_termination(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ec2_client = boto3.resource("ec2", region_name="us-west-1") | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     result = ec2_client.create_instances(ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1) | 
					
						
							| 
									
										
										
										
											2017-10-12 21:59:02 +01:00
										 |  |  |     instance = result[0] | 
					
						
							|  |  |  |     instance.load() | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |     instance.block_device_mappings[0]["Ebs"]["DeleteOnTermination"].should.be(True) | 
					
						
							| 
									
										
										
										
											2017-10-12 21:59:02 +01:00
										 |  |  |     instance.modify_attribute( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         BlockDeviceMappings=[ | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |             {"DeviceName": "/dev/sda1", "Ebs": {"DeleteOnTermination": False}} | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ] | 
					
						
							| 
									
										
										
										
											2017-10-12 21:59:02 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  |     instance.load() | 
					
						
							| 
									
										
										
										
											2020-05-24 14:22:45 +03:00
										 |  |  |     instance.block_device_mappings[0]["Ebs"]["DeleteOnTermination"].should.be(False) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-14 15:31:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_create_instance_ebs_optimized(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ec2_resource = boto3.resource("ec2", region_name="eu-west-1") | 
					
						
							| 
									
										
										
										
											2017-11-14 15:31:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     instance = ec2_resource.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, MaxCount=1, MinCount=1, EbsOptimized=True | 
					
						
							| 
									
										
										
										
											2017-11-14 15:31:54 +01:00
										 |  |  |     )[0] | 
					
						
							|  |  |  |     instance.load() | 
					
						
							|  |  |  |     instance.ebs_optimized.should.be(True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance.modify_attribute(EbsOptimized={"Value": False}) | 
					
						
							| 
									
										
										
										
											2017-11-14 15:31:54 +01:00
										 |  |  |     instance.load() | 
					
						
							|  |  |  |     instance.ebs_optimized.should.be(False) | 
					
						
							| 
									
										
										
										
											2019-01-15 17:34:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-24 09:24:38 +00:00
										 |  |  |     instance = ec2_resource.create_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, MaxCount=1, MinCount=1, | 
					
						
							| 
									
										
										
										
											2020-03-24 09:24:38 +00:00
										 |  |  |     )[0] | 
					
						
							|  |  |  |     instance.load() | 
					
						
							|  |  |  |     instance.ebs_optimized.should.be(False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-05 13:43:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 17:34:22 +01:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_run_multiple_instances_in_same_command(): | 
					
						
							|  |  |  |     instance_count = 4 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							|  |  |  |     client.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, MinCount=instance_count, MaxCount=instance_count | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     reservations = client.describe_instances()["Reservations"] | 
					
						
							| 
									
										
										
										
											2019-01-15 17:34:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     reservations[0]["Instances"].should.have.length_of(instance_count) | 
					
						
							| 
									
										
										
										
											2019-01-15 17:34:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instances = reservations[0]["Instances"] | 
					
						
							| 
									
										
										
										
											2019-01-15 17:34:22 +01:00
										 |  |  |     for i in range(0, instance_count): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         instances[i]["AmiLaunchIndex"].should.be(i) | 
					
						
							| 
									
										
										
										
											2019-07-05 13:43:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_describe_instance_attribute(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("ec2", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2019-07-05 15:12:38 +02:00
										 |  |  |     security_group_id = client.create_security_group( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         GroupName="test security group", Description="this is a test security group" | 
					
						
							|  |  |  |     )["GroupId"] | 
					
						
							|  |  |  |     client.run_instances( | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         MinCount=1, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							|  |  |  |         SecurityGroupIds=[security_group_id], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     instance_id = client.describe_instances()["Reservations"][0]["Instances"][0][ | 
					
						
							|  |  |  |         "InstanceId" | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-07-05 13:43:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     valid_instance_attributes = [ | 
					
						
							|  |  |  |         "instanceType", | 
					
						
							|  |  |  |         "kernel", | 
					
						
							|  |  |  |         "ramdisk", | 
					
						
							|  |  |  |         "userData", | 
					
						
							|  |  |  |         "disableApiTermination", | 
					
						
							|  |  |  |         "instanceInitiatedShutdownBehavior", | 
					
						
							|  |  |  |         "rootDeviceName", | 
					
						
							|  |  |  |         "blockDeviceMapping", | 
					
						
							|  |  |  |         "productCodes", | 
					
						
							|  |  |  |         "sourceDestCheck", | 
					
						
							|  |  |  |         "groupSet", | 
					
						
							|  |  |  |         "ebsOptimized", | 
					
						
							|  |  |  |         "sriovNetSupport", | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-07-05 13:43:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for valid_instance_attribute in valid_instance_attributes: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         response = client.describe_instance_attribute( | 
					
						
							|  |  |  |             InstanceId=instance_id, Attribute=valid_instance_attribute | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-07-05 15:12:38 +02:00
										 |  |  |         if valid_instance_attribute == "groupSet": | 
					
						
							| 
									
										
										
										
											2019-07-05 15:24:16 +02:00
										 |  |  |             response.should.have.key("Groups") | 
					
						
							| 
									
										
										
										
											2019-07-05 15:12:38 +02:00
										 |  |  |             response["Groups"].should.have.length_of(1) | 
					
						
							|  |  |  |             response["Groups"][0]["GroupId"].should.equal(security_group_id) | 
					
						
							| 
									
										
										
										
											2019-07-05 15:24:16 +02:00
										 |  |  |         elif valid_instance_attribute == "userData": | 
					
						
							|  |  |  |             response.should.have.key("UserData") | 
					
						
							|  |  |  |             response["UserData"].should.be.empty | 
					
						
							| 
									
										
										
										
											2019-07-05 13:43:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     invalid_instance_attributes = [ | 
					
						
							|  |  |  |         "abc", | 
					
						
							|  |  |  |         "Kernel", | 
					
						
							|  |  |  |         "RamDisk", | 
					
						
							|  |  |  |         "userdata", | 
					
						
							|  |  |  |         "iNsTaNcEtYpE", | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-07-05 13:43:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for invalid_instance_attribute in invalid_instance_attributes: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |         with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             client.describe_instance_attribute( | 
					
						
							|  |  |  |                 InstanceId=instance_id, Attribute=invalid_instance_attribute | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ex.value.response["Error"]["Code"].should.equal("InvalidParameterValue") | 
					
						
							|  |  |  |         ex.value.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         message = "Value ({invalid_instance_attribute}) for parameter attribute is invalid. Unknown attribute.".format( | 
					
						
							|  |  |  |             invalid_instance_attribute=invalid_instance_attribute | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ex.value.response["Error"]["Message"].should.equal(message) | 
					
						
							| 
									
										
										
										
											2021-01-29 03:31:56 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_warn_on_invalid_ami(): | 
					
						
							|  |  |  |     if settings.TEST_SERVER_MODE: | 
					
						
							|  |  |  |         raise SkipTest("Can't capture warnings in server mode.") | 
					
						
							|  |  |  |     ec2 = boto3.resource("ec2", "us-east-1") | 
					
						
							|  |  |  |     with pytest.warns( | 
					
						
							|  |  |  |         PendingDeprecationWarning, | 
					
						
							|  |  |  |         match=r"Could not find AMI with image-id:invalid-ami.+", | 
					
						
							|  |  |  |     ): | 
					
						
							|  |  |  |         ec2.create_instances(ImageId="invalid-ami", MinCount=1, MaxCount=1) | 
					
						
							| 
									
										
										
										
											2021-08-17 22:02:19 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_filter_wildcard_in_specified_tag_only(): | 
					
						
							|  |  |  |     ec2_client = boto3.client("ec2", region_name="us-west-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tags_name = [{"Key": "Name", "Value": "alice in wonderland"}] | 
					
						
							|  |  |  |     ec2_client.run_instances( | 
					
						
							|  |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							|  |  |  |         MinCount=1, | 
					
						
							|  |  |  |         TagSpecifications=[{"ResourceType": "instance", "Tags": tags_name}], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tags_owner = [{"Key": "Owner", "Value": "alice in wonderland"}] | 
					
						
							|  |  |  |     ec2_client.run_instances( | 
					
						
							|  |  |  |         ImageId=EXAMPLE_AMI_ID, | 
					
						
							|  |  |  |         MaxCount=1, | 
					
						
							|  |  |  |         MinCount=1, | 
					
						
							|  |  |  |         TagSpecifications=[{"ResourceType": "instance", "Tags": tags_owner}], | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # should only match the Name tag | 
					
						
							|  |  |  |     response = ec2_client.describe_instances( | 
					
						
							|  |  |  |         Filters=[{"Name": "tag:Name", "Values": ["*alice*"]}] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     instances = [i for r in response["Reservations"] for i in r["Instances"]] | 
					
						
							|  |  |  |     instances.should.have.length_of(1) | 
					
						
							|  |  |  |     instances[0]["Tags"][0].should.have.key("Key").should.equal("Name") |