diff --git a/moto/ec2/models.py b/moto/ec2/models.py
index f6f53683a..05224a45d 100755
--- a/moto/ec2/models.py
+++ b/moto/ec2/models.py
@@ -2919,12 +2919,14 @@ class SpotFleetBackend(object):
return spot_requests
def modify_spot_fleet_request(self, spot_fleet_request_id, target_capacity, terminate_instances):
+ if target_capacity < 0:
+ raise ValueError('Cannot reduce spot fleet capacity below 0')
spot_fleet_request = self.spot_fleet_requests[spot_fleet_request_id]
- delta = target_capacity - spot_fleet_request.target_capacity
+ delta = target_capacity - spot_fleet_request.fulfilled_capacity
spot_fleet_request.target_capacity = target_capacity
if delta > 0:
spot_fleet_request.create_spot_requests(delta)
- elif delta < 0 and terminate_instances == 'default':
+ elif delta < 0 and terminate_instances == 'Default':
spot_fleet_request.terminate_instances()
return True
diff --git a/moto/ec2/responses/spot_fleets.py b/moto/ec2/responses/spot_fleets.py
index 167618215..81d1e0146 100644
--- a/moto/ec2/responses/spot_fleets.py
+++ b/moto/ec2/responses/spot_fleets.py
@@ -32,7 +32,7 @@ class SpotFleets(BaseResponse):
def modify_spot_fleet_request(self):
spot_fleet_request_id = self._get_param("SpotFleetRequestId")
target_capacity = self._get_int_param("TargetCapacity")
- terminate_instances = self._get_param("ExcessCapacityTerminationPolicy", if_none="default")
+ terminate_instances = self._get_param("ExcessCapacityTerminationPolicy", if_none="Default")
successful = self.ec2_backend.modify_spot_fleet_request(
spot_fleet_request_id, target_capacity, terminate_instances)
template = self.response_template(MODIFY_SPOT_FLEET_REQUEST_TEMPLATE)
@@ -65,10 +65,10 @@ REQUEST_SPOT_FLEET_TEMPLATE = """
+MODIFY_SPOT_FLEET_REQUEST_TEMPLATE = """
21681fea-9987-aef3-2121-example
- {{ successful }}
-"""
+ {{ 'true' if successful else 'false' }}
+"""
DESCRIBE_SPOT_FLEET_TEMPLATE = """
4d68a6cc-8f2e-4be1-b425-example
diff --git a/tests/test_ec2/test_spot_fleet.py b/tests/test_ec2/test_spot_fleet.py
index a8737a17c..442f77a94 100644
--- a/tests/test_ec2/test_spot_fleet.py
+++ b/tests/test_ec2/test_spot_fleet.py
@@ -239,6 +239,32 @@ def test_modify_spot_fleet_request_down_no_terminate():
spot_fleet_config['FulfilledCapacity'].should.equal(6)
+@mock_ec2
+def test_modify_spot_fleet_request_down_odd():
+ 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']
+
+ conn.modify_spot_fleet_request(
+ SpotFleetRequestId=spot_fleet_id, TargetCapacity=7)
+ conn.modify_spot_fleet_request(
+ SpotFleetRequestId=spot_fleet_id, TargetCapacity=5)
+
+ instance_res = conn.describe_spot_fleet_instances(
+ SpotFleetRequestId=spot_fleet_id)
+ instances = instance_res['ActiveInstances']
+ len(instances).should.equal(3)
+
+ spot_fleet_config = conn.describe_spot_fleet_requests(
+ SpotFleetRequestIds=[spot_fleet_id])['SpotFleetRequestConfigs'][0]['SpotFleetRequestConfig']
+ spot_fleet_config['TargetCapacity'].should.equal(5)
+ spot_fleet_config['FulfilledCapacity'].should.equal(6)
+
+
@mock_ec2
def test_modify_spot_fleet_request_down():
conn = boto3.client("ec2", region_name='us-west-2')