| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  | import sure  # noqa # pylint: disable=unused-import | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | from moto import mock_ec2 | 
					
						
							| 
									
										
										
										
											2022-08-13 09:49:43 +00:00
										 |  |  | from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  | from tests import EXAMPLE_AMI_ID | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  | from uuid import uuid4 | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-07 23:08:30 -05:00
										 |  |  | def get_subnet_id(conn): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     vpc = conn.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"] | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     subnet = conn.create_subnet( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         VpcId=vpc["VpcId"], CidrBlock="10.0.0.0/16", AvailabilityZone="us-east-1a" | 
					
						
							|  |  |  |     )["Subnet"] | 
					
						
							|  |  |  |     subnet_id = subnet["SubnetId"] | 
					
						
							| 
									
										
										
										
											2016-11-07 23:08:30 -05:00
										 |  |  |     return subnet_id | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def spot_config(subnet_id, allocation_strategy="lowestPrice"): | 
					
						
							|  |  |  |     return { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "ClientToken": "string", | 
					
						
							|  |  |  |         "SpotPrice": "0.12", | 
					
						
							|  |  |  |         "TargetCapacity": 6, | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         "IamFleetRole": f"arn:aws:iam::{ACCOUNT_ID}:role/fleet", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "LaunchSpecifications": [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |                 "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "KeyName": "my-key", | 
					
						
							|  |  |  |                 "SecurityGroups": [{"GroupId": "sg-123"}], | 
					
						
							|  |  |  |                 "UserData": "some user data", | 
					
						
							|  |  |  |                 "InstanceType": "t2.small", | 
					
						
							|  |  |  |                 "BlockDeviceMappings": [ | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         "VirtualName": "string", | 
					
						
							|  |  |  |                         "DeviceName": "string", | 
					
						
							|  |  |  |                         "Ebs": { | 
					
						
							|  |  |  |                             "SnapshotId": "string", | 
					
						
							|  |  |  |                             "VolumeSize": 123, | 
					
						
							|  |  |  |                             "DeleteOnTermination": True | False, | 
					
						
							|  |  |  |                             "VolumeType": "standard", | 
					
						
							|  |  |  |                             "Iops": 123, | 
					
						
							|  |  |  |                             "Encrypted": True | False, | 
					
						
							| 
									
										
										
										
											2016-11-07 23:08:30 -05:00
										 |  |  |                         }, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                         "NoDevice": "string", | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 "Monitoring": {"Enabled": True}, | 
					
						
							|  |  |  |                 "SubnetId": subnet_id, | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |                 "IamInstanceProfile": {"Arn": f"arn:aws:iam::{ACCOUNT_ID}:role/fleet"}, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "EbsOptimized": False, | 
					
						
							|  |  |  |                 "WeightedCapacity": 2.0, | 
					
						
							|  |  |  |                 "SpotPrice": "0.13", | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |                 "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "KeyName": "my-key", | 
					
						
							|  |  |  |                 "SecurityGroups": [{"GroupId": "sg-123"}], | 
					
						
							|  |  |  |                 "UserData": "some user data", | 
					
						
							|  |  |  |                 "InstanceType": "t2.large", | 
					
						
							|  |  |  |                 "Monitoring": {"Enabled": True}, | 
					
						
							|  |  |  |                 "SubnetId": subnet_id, | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |                 "IamInstanceProfile": {"Arn": f"arn:aws:iam::{ACCOUNT_ID}:role/fleet"}, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "EbsOptimized": False, | 
					
						
							|  |  |  |                 "WeightedCapacity": 4.0, | 
					
						
							|  |  |  |                 "SpotPrice": "10.00", | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ], | 
					
						
							|  |  |  |         "AllocationStrategy": allocation_strategy, | 
					
						
							|  |  |  |         "FulfilledCapacity": 6, | 
					
						
							| 
									
										
										
										
											2016-11-07 23:08:30 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_create_spot_fleet_with_lowest_price(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2016-11-07 23:08:30 -05:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							| 
									
										
										
										
											2016-11-07 23:08:30 -05:00
										 |  |  |         SpotFleetRequestConfig=spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     spot_fleet_requests = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"] | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  |     len(spot_fleet_requests).should.equal(1) | 
					
						
							|  |  |  |     spot_fleet_request = spot_fleet_requests[0] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_request["SpotFleetRequestState"].should.equal("active") | 
					
						
							|  |  |  |     spot_fleet_config = spot_fleet_request["SpotFleetRequestConfig"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_config["SpotPrice"].should.equal("0.12") | 
					
						
							|  |  |  |     spot_fleet_config["TargetCapacity"].should.equal(6) | 
					
						
							|  |  |  |     spot_fleet_config["IamFleetRole"].should.equal( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         f"arn:aws:iam::{ACCOUNT_ID}:role/fleet" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     spot_fleet_config["AllocationStrategy"].should.equal("lowestPrice") | 
					
						
							|  |  |  |     spot_fleet_config["FulfilledCapacity"].should.equal(6.0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     len(spot_fleet_config["LaunchSpecifications"]).should.equal(2) | 
					
						
							|  |  |  |     launch_spec = spot_fleet_config["LaunchSpecifications"][0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     launch_spec["EbsOptimized"].should.equal(False) | 
					
						
							|  |  |  |     launch_spec["SecurityGroups"].should.equal([{"GroupId": "sg-123"}]) | 
					
						
							|  |  |  |     launch_spec["IamInstanceProfile"].should.equal( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         {"Arn": f"arn:aws:iam::{ACCOUNT_ID}:role/fleet"} | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-01-13 09:02:11 +00:00
										 |  |  |     launch_spec["ImageId"].should.equal(EXAMPLE_AMI_ID) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     launch_spec["InstanceType"].should.equal("t2.small") | 
					
						
							|  |  |  |     launch_spec["KeyName"].should.equal("my-key") | 
					
						
							|  |  |  |     launch_spec["Monitoring"].should.equal({"Enabled": True}) | 
					
						
							|  |  |  |     launch_spec["SpotPrice"].should.equal("0.13") | 
					
						
							|  |  |  |     launch_spec["SubnetId"].should.equal(subnet_id) | 
					
						
							|  |  |  |     launch_spec["UserData"].should.equal("some user data") | 
					
						
							|  |  |  |     launch_spec["WeightedCapacity"].should.equal(2.0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  |     len(instances).should.equal(3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_create_diversified_spot_fleet(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2016-11-07 23:08:30 -05:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     diversified_config = spot_config(subnet_id, allocation_strategy="diversified") | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_res = conn.request_spot_fleet(SpotFleetRequestConfig=diversified_config) | 
					
						
							|  |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  |     len(instances).should.equal(2) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instance_types = set([instance["InstanceType"] for instance in instances]) | 
					
						
							| 
									
										
										
										
											2016-11-11 17:22:45 -05:00
										 |  |  |     instance_types.should.equal(set(["t2.small", "t2.large"])) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     instances[0]["InstanceId"].should.contain("i-") | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | @pytest.mark.parametrize("allocation_strategy", ["diversified", "lowestCost"]) | 
					
						
							|  |  |  | def test_request_spot_fleet_using_launch_template_config__name(allocation_strategy): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     conn = boto3.client("ec2", region_name="us-east-2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_data = { | 
					
						
							| 
									
										
										
										
											2022-05-26 18:04:36 +02:00
										 |  |  |         "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  |         "InstanceType": "t2.medium", | 
					
						
							|  |  |  |         "DisableApiTermination": False, | 
					
						
							|  |  |  |         "TagSpecifications": [ | 
					
						
							|  |  |  |             {"ResourceType": "instance", "Tags": [{"Key": "test", "Value": "value"}]} | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "SecurityGroupIds": ["sg-abcd1234"], | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_name = str(uuid4()) | 
					
						
							|  |  |  |     conn.create_launch_template( | 
					
						
							|  |  |  |         LaunchTemplateName=template_name, LaunchTemplateData=template_data | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_config = { | 
					
						
							|  |  |  |         "ClientToken": "string", | 
					
						
							|  |  |  |         "SpotPrice": "0.01", | 
					
						
							|  |  |  |         "TargetCapacity": 1, | 
					
						
							|  |  |  |         "IamFleetRole": "arn:aws:iam::486285699788:role/aws-ec2-spot-fleet-tagging-role", | 
					
						
							|  |  |  |         "LaunchTemplateConfigs": [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "LaunchTemplateSpecification": { | 
					
						
							|  |  |  |                     "LaunchTemplateName": template_name, | 
					
						
							|  |  |  |                     "Version": "$Latest", | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "AllocationStrategy": allocation_strategy, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet(SpotFleetRequestConfig=template_config) | 
					
						
							|  |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  |     len(instances).should.equal(1) | 
					
						
							|  |  |  |     instance_types = set([instance["InstanceType"] for instance in instances]) | 
					
						
							|  |  |  |     instance_types.should.equal(set(["t2.medium"])) | 
					
						
							|  |  |  |     instances[0]["InstanceId"].should.contain("i-") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_request_spot_fleet_using_launch_template_config__id(): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     conn = boto3.client("ec2", region_name="us-east-2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_data = { | 
					
						
							| 
									
										
										
										
											2022-05-26 18:04:36 +02:00
										 |  |  |         "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  |         "InstanceType": "t2.medium", | 
					
						
							|  |  |  |         "DisableApiTermination": False, | 
					
						
							|  |  |  |         "TagSpecifications": [ | 
					
						
							|  |  |  |             {"ResourceType": "instance", "Tags": [{"Key": "test", "Value": "value"}]} | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "SecurityGroupIds": ["sg-abcd1234"], | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_name = str(uuid4()) | 
					
						
							|  |  |  |     template = conn.create_launch_template( | 
					
						
							|  |  |  |         LaunchTemplateName=template_name, LaunchTemplateData=template_data | 
					
						
							|  |  |  |     )["LaunchTemplate"] | 
					
						
							|  |  |  |     template_id = template["LaunchTemplateId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_config = { | 
					
						
							|  |  |  |         "ClientToken": "string", | 
					
						
							|  |  |  |         "SpotPrice": "0.01", | 
					
						
							|  |  |  |         "TargetCapacity": 1, | 
					
						
							|  |  |  |         "IamFleetRole": "arn:aws:iam::486285699788:role/aws-ec2-spot-fleet-tagging-role", | 
					
						
							|  |  |  |         "LaunchTemplateConfigs": [ | 
					
						
							|  |  |  |             {"LaunchTemplateSpecification": {"LaunchTemplateId": template_id}} | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "AllocationStrategy": "lowestCost", | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet(SpotFleetRequestConfig=template_config) | 
					
						
							|  |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  |     len(instances).should.equal(1) | 
					
						
							|  |  |  |     instance_types = set([instance["InstanceType"] for instance in instances]) | 
					
						
							|  |  |  |     instance_types.should.equal(set(["t2.medium"])) | 
					
						
							|  |  |  |     instances[0]["InstanceId"].should.contain("i-") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_request_spot_fleet_using_launch_template_config__overrides(): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     conn = boto3.client("ec2", region_name="us-east-2") | 
					
						
							|  |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_data = { | 
					
						
							| 
									
										
										
										
											2022-05-26 18:04:36 +02:00
										 |  |  |         "ImageId": EXAMPLE_AMI_ID, | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  |         "InstanceType": "t2.medium", | 
					
						
							|  |  |  |         "DisableApiTermination": False, | 
					
						
							|  |  |  |         "TagSpecifications": [ | 
					
						
							|  |  |  |             {"ResourceType": "instance", "Tags": [{"Key": "test", "Value": "value"}]} | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "SecurityGroupIds": ["sg-abcd1234"], | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_name = str(uuid4()) | 
					
						
							|  |  |  |     template = conn.create_launch_template( | 
					
						
							|  |  |  |         LaunchTemplateName=template_name, LaunchTemplateData=template_data | 
					
						
							|  |  |  |     )["LaunchTemplate"] | 
					
						
							|  |  |  |     template_id = template["LaunchTemplateId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template_config = { | 
					
						
							|  |  |  |         "ClientToken": "string", | 
					
						
							|  |  |  |         "SpotPrice": "0.01", | 
					
						
							|  |  |  |         "TargetCapacity": 1, | 
					
						
							|  |  |  |         "IamFleetRole": "arn:aws:iam::486285699788:role/aws-ec2-spot-fleet-tagging-role", | 
					
						
							|  |  |  |         "LaunchTemplateConfigs": [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "LaunchTemplateSpecification": {"LaunchTemplateId": template_id}, | 
					
						
							|  |  |  |                 "Overrides": [ | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         "InstanceType": "t2.nano", | 
					
						
							|  |  |  |                         "SubnetId": subnet_id, | 
					
						
							|  |  |  |                         "AvailabilityZone": "us-west-1", | 
					
						
							|  |  |  |                         "WeightedCapacity": 2, | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "AllocationStrategy": "lowestCost", | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet(SpotFleetRequestConfig=template_config) | 
					
						
							|  |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2022-05-01 13:52:38 +00:00
										 |  |  |     instances.should.have.length_of(1) | 
					
						
							|  |  |  |     instances[0].should.have.key("InstanceType").equals("t2.nano") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance = conn.describe_instances( | 
					
						
							|  |  |  |         InstanceIds=[i["InstanceId"] for i in instances] | 
					
						
							|  |  |  |     )["Reservations"][0]["Instances"][0] | 
					
						
							|  |  |  |     instance.should.have.key("SubnetId").equals(subnet_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 15:59:31 -08:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_create_spot_fleet_request_with_tag_spec(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-01-23 15:59:31 -08:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tag_spec = [ | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "ResourceType": "instance", | 
					
						
							|  |  |  |             "Tags": [ | 
					
						
							|  |  |  |                 {"Key": "tag-1", "Value": "foo"}, | 
					
						
							|  |  |  |                 {"Key": "tag-2", "Value": "bar"}, | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-01-23 15:59:31 -08:00
										 |  |  |     ] | 
					
						
							|  |  |  |     config = spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     config["LaunchSpecifications"][0]["TagSpecifications"] = tag_spec | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet(SpotFleetRequestConfig=config) | 
					
						
							|  |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2019-01-23 15:59:31 -08:00
										 |  |  |     spot_fleet_requests = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"] | 
					
						
							|  |  |  |     spot_fleet_config = spot_fleet_requests[0]["SpotFleetRequestConfig"] | 
					
						
							|  |  |  |     spot_fleet_config["LaunchSpecifications"][0]["TagSpecifications"][0][ | 
					
						
							|  |  |  |         "ResourceType" | 
					
						
							|  |  |  |     ].should.equal("instance") | 
					
						
							|  |  |  |     for tag in tag_spec[0]["Tags"]: | 
					
						
							|  |  |  |         spot_fleet_config["LaunchSpecifications"][0]["TagSpecifications"][0][ | 
					
						
							|  |  |  |             "Tags" | 
					
						
							|  |  |  |         ].should.contain(tag) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id) | 
					
						
							|  |  |  |     instances = conn.describe_instances( | 
					
						
							|  |  |  |         InstanceIds=[i["InstanceId"] for i in instance_res["ActiveInstances"]] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     for instance in instances["Reservations"][0]["Instances"]: | 
					
						
							|  |  |  |         for tag in tag_spec[0]["Tags"]: | 
					
						
							|  |  |  |             instance["Tags"].should.contain(tag) | 
					
						
							| 
									
										
										
										
											2019-01-23 15:59:31 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_cancel_spot_fleet_request(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2016-11-07 23:08:30 -05:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestConfig=spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     conn.cancel_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id], TerminateInstances=True | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     spot_fleet_requests = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"] | 
					
						
							| 
									
										
										
										
											2016-11-07 09:53:44 -05:00
										 |  |  |     len(spot_fleet_requests).should.equal(0) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_cancel_spot_fleet_request__but_dont_terminate_instances(): | 
					
						
							|  |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							|  |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							|  |  |  |         SpotFleetRequestConfig=spot_config(subnet_id) | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get_active_instances(conn, spot_fleet_id).should.have.length_of(3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     conn.cancel_spot_fleet_requests( | 
					
						
							|  |  |  |         SpotFleetRequestIds=[spot_fleet_id], TerminateInstances=False | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_requests = conn.describe_spot_fleet_requests( | 
					
						
							|  |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"] | 
					
						
							|  |  |  |     spot_fleet_requests.should.have.length_of(1) | 
					
						
							|  |  |  |     spot_fleet_requests[0]["SpotFleetRequestState"].should.equal("cancelled_running") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get_active_instances(conn, spot_fleet_id).should.have.length_of(3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Cancel again and terminate instances | 
					
						
							|  |  |  |     conn.cancel_spot_fleet_requests( | 
					
						
							|  |  |  |         SpotFleetRequestIds=[spot_fleet_id], TerminateInstances=True | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get_active_instances(conn, spot_fleet_id).should.have.length_of(0) | 
					
						
							|  |  |  |     spot_fleet_requests = conn.describe_spot_fleet_requests( | 
					
						
							|  |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"] | 
					
						
							|  |  |  |     spot_fleet_requests.should.have.length_of(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_modify_spot_fleet_request_up(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestConfig=spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.modify_spot_fleet_request(SpotFleetRequestId=spot_fleet_id, TargetCapacity=20) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     len(instances).should.equal(10) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_config = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"][0]["SpotFleetRequestConfig"] | 
					
						
							|  |  |  |     spot_fleet_config["TargetCapacity"].should.equal(20) | 
					
						
							|  |  |  |     spot_fleet_config["FulfilledCapacity"].should.equal(20.0) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_modify_spot_fleet_request_up_diversified(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestConfig=spot_config(subnet_id, allocation_strategy="diversified") | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.modify_spot_fleet_request(SpotFleetRequestId=spot_fleet_id, TargetCapacity=19) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     len(instances).should.equal(7) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_config = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"][0]["SpotFleetRequestConfig"] | 
					
						
							|  |  |  |     spot_fleet_config["TargetCapacity"].should.equal(19) | 
					
						
							|  |  |  |     spot_fleet_config["FulfilledCapacity"].should.equal(20.0) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_modify_spot_fleet_request_down_no_terminate(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestConfig=spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     conn.modify_spot_fleet_request( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestId=spot_fleet_id, | 
					
						
							|  |  |  |         TargetCapacity=1, | 
					
						
							|  |  |  |         ExcessCapacityTerminationPolicy="noTermination", | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     len(instances).should.equal(3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_config = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"][0]["SpotFleetRequestConfig"] | 
					
						
							|  |  |  |     spot_fleet_config["TargetCapacity"].should.equal(1) | 
					
						
							|  |  |  |     spot_fleet_config["FulfilledCapacity"].should.equal(6.0) | 
					
						
							| 
									
										
										
										
											2017-10-05 18:46:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_modify_spot_fleet_request_down_odd(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2017-10-05 18:46:58 -07:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestConfig=spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 18:46:58 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2017-10-05 18:46:58 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.modify_spot_fleet_request(SpotFleetRequestId=spot_fleet_id, TargetCapacity=7) | 
					
						
							|  |  |  |     conn.modify_spot_fleet_request(SpotFleetRequestId=spot_fleet_id, TargetCapacity=5) | 
					
						
							| 
									
										
										
										
											2017-10-05 18:46:58 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 18:46:58 -07:00
										 |  |  |     len(instances).should.equal(3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_config = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"][0]["SpotFleetRequestConfig"] | 
					
						
							|  |  |  |     spot_fleet_config["TargetCapacity"].should.equal(5) | 
					
						
							|  |  |  |     spot_fleet_config["FulfilledCapacity"].should.equal(6.0) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_modify_spot_fleet_request_down(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestConfig=spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.modify_spot_fleet_request(SpotFleetRequestId=spot_fleet_id, TargetCapacity=1) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     len(instances).should.equal(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_config = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"][0]["SpotFleetRequestConfig"] | 
					
						
							|  |  |  |     spot_fleet_config["TargetCapacity"].should.equal(1) | 
					
						
							|  |  |  |     spot_fleet_config["FulfilledCapacity"].should.equal(2.0) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_modify_spot_fleet_request_down_no_terminate_after_custom_terminate(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_res = conn.request_spot_fleet( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestConfig=spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = spot_fleet_res["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.terminate_instances(InstanceIds=[i["InstanceId"] for i in instances[1:]]) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     conn.modify_spot_fleet_request( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestId=spot_fleet_id, | 
					
						
							|  |  |  |         TargetCapacity=1, | 
					
						
							|  |  |  |         ExcessCapacityTerminationPolicy="noTermination", | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  |     instances = get_active_instances(conn, spot_fleet_id) | 
					
						
							| 
									
										
										
										
											2017-10-05 12:50:42 -07:00
										 |  |  |     len(instances).should.equal(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spot_fleet_config = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"][0]["SpotFleetRequestConfig"] | 
					
						
							|  |  |  |     spot_fleet_config["TargetCapacity"].should.equal(1) | 
					
						
							|  |  |  |     spot_fleet_config["FulfilledCapacity"].should.equal(2.0) | 
					
						
							| 
									
										
										
										
											2018-02-01 17:09:10 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ec2 | 
					
						
							|  |  |  | def test_create_spot_fleet_without_spot_price(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("ec2", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2018-02-01 17:09:10 -05:00
										 |  |  |     subnet_id = get_subnet_id(conn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # remove prices to force a fallback to ondemand price | 
					
						
							|  |  |  |     spot_config_without_price = spot_config(subnet_id) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     del spot_config_without_price["SpotPrice"] | 
					
						
							|  |  |  |     for spec in spot_config_without_price["LaunchSpecifications"]: | 
					
						
							|  |  |  |         del spec["SpotPrice"] | 
					
						
							| 
									
										
										
										
											2018-02-01 17:09:10 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_id = conn.request_spot_fleet( | 
					
						
							|  |  |  |         SpotFleetRequestConfig=spot_config_without_price | 
					
						
							|  |  |  |     )["SpotFleetRequestId"] | 
					
						
							| 
									
										
										
										
											2018-02-01 17:09:10 -05:00
										 |  |  |     spot_fleet_requests = conn.describe_spot_fleet_requests( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         SpotFleetRequestIds=[spot_fleet_id] | 
					
						
							|  |  |  |     )["SpotFleetRequestConfigs"] | 
					
						
							| 
									
										
										
										
											2018-02-01 17:09:10 -05:00
										 |  |  |     len(spot_fleet_requests).should.equal(1) | 
					
						
							|  |  |  |     spot_fleet_request = spot_fleet_requests[0] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     spot_fleet_config = spot_fleet_request["SpotFleetRequestConfig"] | 
					
						
							| 
									
										
										
										
											2018-02-01 17:09:10 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     len(spot_fleet_config["LaunchSpecifications"]).should.equal(2) | 
					
						
							|  |  |  |     launch_spec1 = spot_fleet_config["LaunchSpecifications"][0] | 
					
						
							|  |  |  |     launch_spec2 = spot_fleet_config["LaunchSpecifications"][1] | 
					
						
							| 
									
										
										
										
											2018-02-01 17:09:10 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # AWS will figure out the price | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert "SpotPrice" not in launch_spec1 | 
					
						
							|  |  |  |     assert "SpotPrice" not in launch_spec2 | 
					
						
							| 
									
										
										
										
											2022-10-03 12:30:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_active_instances(conn, spot_fleet_id): | 
					
						
							|  |  |  |     instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id) | 
					
						
							|  |  |  |     return instance_res["ActiveInstances"] |