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')