2016-11-07 14:53:44 +00: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 14:53:44 +00:00
|
|
|
|
|
|
|
from moto import mock_ec2
|
2019-12-17 02:05:29 +00:00
|
|
|
from moto.core import 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 14:53:44 +00:00
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
|
2016-11-08 04:08:30 +00:00
|
|
|
def get_subnet_id(conn):
|
2019-10-31 15:44:26 +00:00
|
|
|
vpc = conn.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"]
|
2017-02-24 02:37:43 +00:00
|
|
|
subnet = conn.create_subnet(
|
2019-10-31 15:44:26 +00:00
|
|
|
VpcId=vpc["VpcId"], CidrBlock="10.0.0.0/16", AvailabilityZone="us-east-1a"
|
|
|
|
)["Subnet"]
|
|
|
|
subnet_id = subnet["SubnetId"]
|
2016-11-08 04:08:30 +00:00
|
|
|
return subnet_id
|
|
|
|
|
|
|
|
|
|
|
|
def spot_config(subnet_id, allocation_strategy="lowestPrice"):
|
|
|
|
return {
|
2019-10-31 15:44:26 +00:00
|
|
|
"ClientToken": "string",
|
|
|
|
"SpotPrice": "0.12",
|
|
|
|
"TargetCapacity": 6,
|
2019-12-16 00:22:26 +00:00
|
|
|
"IamFleetRole": "arn:aws:iam::{}:role/fleet".format(ACCOUNT_ID),
|
2019-10-31 15:44:26 +00:00
|
|
|
"LaunchSpecifications": [
|
|
|
|
{
|
2021-01-13 09:02:11 +00:00
|
|
|
"ImageId": EXAMPLE_AMI_ID,
|
2019-10-31 15:44:26 +00: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-08 04:08:30 +00:00
|
|
|
},
|
2019-10-31 15:44:26 +00:00
|
|
|
"NoDevice": "string",
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"Monitoring": {"Enabled": True},
|
|
|
|
"SubnetId": subnet_id,
|
2019-12-17 02:25:20 +00:00
|
|
|
"IamInstanceProfile": {
|
|
|
|
"Arn": "arn:aws:iam::{}:role/fleet".format(ACCOUNT_ID)
|
|
|
|
},
|
2019-10-31 15:44:26 +00:00
|
|
|
"EbsOptimized": False,
|
|
|
|
"WeightedCapacity": 2.0,
|
|
|
|
"SpotPrice": "0.13",
|
2017-02-24 02:37:43 +00:00
|
|
|
},
|
2019-10-31 15:44:26 +00:00
|
|
|
{
|
2021-01-13 09:02:11 +00:00
|
|
|
"ImageId": EXAMPLE_AMI_ID,
|
2019-10-31 15:44:26 +00:00
|
|
|
"KeyName": "my-key",
|
|
|
|
"SecurityGroups": [{"GroupId": "sg-123"}],
|
|
|
|
"UserData": "some user data",
|
|
|
|
"InstanceType": "t2.large",
|
|
|
|
"Monitoring": {"Enabled": True},
|
|
|
|
"SubnetId": subnet_id,
|
2019-12-17 02:25:20 +00:00
|
|
|
"IamInstanceProfile": {
|
|
|
|
"Arn": "arn:aws:iam::{}:role/fleet".format(ACCOUNT_ID)
|
|
|
|
},
|
2019-10-31 15:44:26 +00:00
|
|
|
"EbsOptimized": False,
|
|
|
|
"WeightedCapacity": 4.0,
|
|
|
|
"SpotPrice": "10.00",
|
2017-02-24 02:37:43 +00:00
|
|
|
},
|
2019-10-31 15:44:26 +00:00
|
|
|
],
|
|
|
|
"AllocationStrategy": allocation_strategy,
|
|
|
|
"FulfilledCapacity": 6,
|
2016-11-08 04:08:30 +00:00
|
|
|
}
|
2016-11-07 14:53:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_create_spot_fleet_with_lowest_price():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2016-11-08 04:08:30 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
2016-11-07 14:53:44 +00:00
|
|
|
|
|
|
|
spot_fleet_res = conn.request_spot_fleet(
|
2016-11-08 04:08:30 +00:00
|
|
|
SpotFleetRequestConfig=spot_config(subnet_id)
|
2016-11-07 14:53:44 +00:00
|
|
|
)
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2016-11-07 14:53:44 +00:00
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
spot_fleet_requests = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestIds=[spot_fleet_id]
|
|
|
|
)["SpotFleetRequestConfigs"]
|
2016-11-07 14:53:44 +00:00
|
|
|
len(spot_fleet_requests).should.equal(1)
|
|
|
|
spot_fleet_request = spot_fleet_requests[0]
|
2019-10-31 15:44:26 +00: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(
|
2019-12-16 00:22:26 +00:00
|
|
|
"arn:aws:iam::{}:role/fleet".format(ACCOUNT_ID)
|
2019-10-31 15:44:26 +00: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(
|
2019-12-16 00:22:26 +00:00
|
|
|
{"Arn": "arn:aws:iam::{}:role/fleet".format(ACCOUNT_ID)}
|
2019-10-31 15:44:26 +00:00
|
|
|
)
|
2021-01-13 09:02:11 +00:00
|
|
|
launch_spec["ImageId"].should.equal(EXAMPLE_AMI_ID)
|
2019-10-31 15:44:26 +00: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)
|
|
|
|
|
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
2016-11-07 14:53:44 +00:00
|
|
|
len(instances).should.equal(3)
|
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_create_diversified_spot_fleet():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2016-11-08 04:08:30 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
2019-10-31 15:44:26 +00:00
|
|
|
diversified_config = spot_config(subnet_id, allocation_strategy="diversified")
|
2016-11-07 14:53:44 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_res = conn.request_spot_fleet(SpotFleetRequestConfig=diversified_config)
|
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2016-11-07 14:53:44 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
2016-11-07 14:53:44 +00:00
|
|
|
len(instances).should.equal(2)
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_types = set([instance["InstanceType"] for instance in instances])
|
2016-11-11 22:22:45 +00:00
|
|
|
instance_types.should.equal(set(["t2.small", "t2.large"]))
|
2019-10-31 15:44:26 +00:00
|
|
|
instances[0]["InstanceId"].should.contain("i-")
|
2016-11-07 14:53:44 +00: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 16:04:36 +00: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"]
|
|
|
|
|
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
|
|
|
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 16:04:36 +00: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"]
|
|
|
|
|
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
|
|
|
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 16:04:36 +00: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"]
|
|
|
|
|
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
|
|
|
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 23:59:31 +00:00
|
|
|
@mock_ec2
|
|
|
|
def test_create_spot_fleet_request_with_tag_spec():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2019-01-23 23:59:31 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
|
|
|
|
|
|
|
tag_spec = [
|
|
|
|
{
|
2019-10-31 15:44:26 +00:00
|
|
|
"ResourceType": "instance",
|
|
|
|
"Tags": [
|
|
|
|
{"Key": "tag-1", "Value": "foo"},
|
|
|
|
{"Key": "tag-2", "Value": "bar"},
|
|
|
|
],
|
|
|
|
}
|
2019-01-23 23:59:31 +00:00
|
|
|
]
|
|
|
|
config = spot_config(subnet_id)
|
2019-10-31 15:44:26 +00: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 23:59:31 +00:00
|
|
|
spot_fleet_requests = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00: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 23:59:31 +00:00
|
|
|
|
|
|
|
|
2016-11-07 14:53:44 +00:00
|
|
|
@mock_ec2
|
|
|
|
def test_cancel_spot_fleet_request():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2016-11-08 04:08:30 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
2016-11-07 14:53:44 +00:00
|
|
|
|
|
|
|
spot_fleet_res = conn.request_spot_fleet(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestConfig=spot_config(subnet_id)
|
2016-11-07 14:53:44 +00:00
|
|
|
)
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2016-11-07 14:53:44 +00:00
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
conn.cancel_spot_fleet_requests(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestIds=[spot_fleet_id], TerminateInstances=True
|
|
|
|
)
|
2016-11-07 14:53:44 +00:00
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
spot_fleet_requests = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestIds=[spot_fleet_id]
|
|
|
|
)["SpotFleetRequestConfigs"]
|
2016-11-07 14:53:44 +00:00
|
|
|
len(spot_fleet_requests).should.equal(0)
|
2017-10-05 19:50:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_modify_spot_fleet_request_up():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2017-10-05 19:50:42 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
|
|
|
|
|
|
|
spot_fleet_res = conn.request_spot_fleet(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestConfig=spot_config(subnet_id)
|
2017-10-05 19:50:42 +00:00
|
|
|
)
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
conn.modify_spot_fleet_request(SpotFleetRequestId=spot_fleet_id, TargetCapacity=20)
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
2017-10-05 19:50:42 +00:00
|
|
|
len(instances).should.equal(10)
|
|
|
|
|
|
|
|
spot_fleet_config = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00: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 19:50:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_modify_spot_fleet_request_up_diversified():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2017-10-05 19:50:42 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
|
|
|
|
|
|
|
spot_fleet_res = conn.request_spot_fleet(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestConfig=spot_config(subnet_id, allocation_strategy="diversified")
|
2017-10-05 19:50:42 +00:00
|
|
|
)
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
conn.modify_spot_fleet_request(SpotFleetRequestId=spot_fleet_id, TargetCapacity=19)
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
2017-10-05 19:50:42 +00:00
|
|
|
len(instances).should.equal(7)
|
|
|
|
|
|
|
|
spot_fleet_config = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00: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 19:50:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_modify_spot_fleet_request_down_no_terminate():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2017-10-05 19:50:42 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
|
|
|
|
|
|
|
spot_fleet_res = conn.request_spot_fleet(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestConfig=spot_config(subnet_id)
|
2017-10-05 19:50:42 +00:00
|
|
|
)
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2017-10-05 19:50:42 +00:00
|
|
|
|
|
|
|
conn.modify_spot_fleet_request(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestId=spot_fleet_id,
|
|
|
|
TargetCapacity=1,
|
|
|
|
ExcessCapacityTerminationPolicy="noTermination",
|
|
|
|
)
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
2017-10-05 19:50:42 +00:00
|
|
|
len(instances).should.equal(3)
|
|
|
|
|
|
|
|
spot_fleet_config = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00: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-06 01:46:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_modify_spot_fleet_request_down_odd():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2017-10-06 01:46:58 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
|
|
|
|
|
|
|
spot_fleet_res = conn.request_spot_fleet(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestConfig=spot_config(subnet_id)
|
2017-10-06 01:46:58 +00:00
|
|
|
)
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2017-10-06 01:46:58 +00:00
|
|
|
|
2019-10-31 15:44:26 +00: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-06 01:46:58 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
2017-10-06 01:46:58 +00:00
|
|
|
len(instances).should.equal(3)
|
|
|
|
|
|
|
|
spot_fleet_config = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00: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 19:50:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_modify_spot_fleet_request_down():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2017-10-05 19:50:42 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
|
|
|
|
|
|
|
spot_fleet_res = conn.request_spot_fleet(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestConfig=spot_config(subnet_id)
|
2017-10-05 19:50:42 +00:00
|
|
|
)
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
conn.modify_spot_fleet_request(SpotFleetRequestId=spot_fleet_id, TargetCapacity=1)
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
2017-10-05 19:50:42 +00:00
|
|
|
len(instances).should.equal(1)
|
|
|
|
|
|
|
|
spot_fleet_config = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00: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 19:50:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_modify_spot_fleet_request_down_no_terminate_after_custom_terminate():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2017-10-05 19:50:42 +00:00
|
|
|
subnet_id = get_subnet_id(conn)
|
|
|
|
|
|
|
|
spot_fleet_res = conn.request_spot_fleet(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestConfig=spot_config(subnet_id)
|
2017-10-05 19:50:42 +00:00
|
|
|
)
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = spot_fleet_res["SpotFleetRequestId"]
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
|
|
|
conn.terminate_instances(InstanceIds=[i["InstanceId"] for i in instances[1:]])
|
2017-10-05 19:50:42 +00:00
|
|
|
|
|
|
|
conn.modify_spot_fleet_request(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestId=spot_fleet_id,
|
|
|
|
TargetCapacity=1,
|
|
|
|
ExcessCapacityTerminationPolicy="noTermination",
|
|
|
|
)
|
2017-10-05 19:50:42 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
instance_res = conn.describe_spot_fleet_instances(SpotFleetRequestId=spot_fleet_id)
|
|
|
|
instances = instance_res["ActiveInstances"]
|
2017-10-05 19:50:42 +00:00
|
|
|
len(instances).should.equal(1)
|
|
|
|
|
|
|
|
spot_fleet_config = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00: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 22:09:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_ec2
|
|
|
|
def test_create_spot_fleet_without_spot_price():
|
2019-10-31 15:44:26 +00:00
|
|
|
conn = boto3.client("ec2", region_name="us-west-2")
|
2018-02-01 22:09:10 +00: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 15:44:26 +00:00
|
|
|
del spot_config_without_price["SpotPrice"]
|
|
|
|
for spec in spot_config_without_price["LaunchSpecifications"]:
|
|
|
|
del spec["SpotPrice"]
|
2018-02-01 22:09:10 +00:00
|
|
|
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_id = conn.request_spot_fleet(
|
|
|
|
SpotFleetRequestConfig=spot_config_without_price
|
|
|
|
)["SpotFleetRequestId"]
|
2018-02-01 22:09:10 +00:00
|
|
|
spot_fleet_requests = conn.describe_spot_fleet_requests(
|
2019-10-31 15:44:26 +00:00
|
|
|
SpotFleetRequestIds=[spot_fleet_id]
|
|
|
|
)["SpotFleetRequestConfigs"]
|
2018-02-01 22:09:10 +00:00
|
|
|
len(spot_fleet_requests).should.equal(1)
|
|
|
|
spot_fleet_request = spot_fleet_requests[0]
|
2019-10-31 15:44:26 +00:00
|
|
|
spot_fleet_config = spot_fleet_request["SpotFleetRequestConfig"]
|
2018-02-01 22:09:10 +00:00
|
|
|
|
2019-10-31 15:44:26 +00: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 22:09:10 +00:00
|
|
|
|
|
|
|
# AWS will figure out the price
|
2019-10-31 15:44:26 +00:00
|
|
|
assert "SpotPrice" not in launch_spec1
|
|
|
|
assert "SpotPrice" not in launch_spec2
|