Fix #1370: Implement suspend_processes in AutoScaling service

This commit is contained in:
Jim Shields 2017-12-13 10:15:40 -05:00
parent 4997694fd6
commit bfeea00774
3 changed files with 55 additions and 1 deletions

View File

@ -179,6 +179,7 @@ class FakeAutoScalingGroup(BaseModel):
self.placement_group = placement_group
self.termination_policies = termination_policies
self.suspended_processes = []
self.instance_states = []
self.tags = tags if tags else []
self.set_desired_capacity(desired_capacity)
@ -621,6 +622,10 @@ class AutoScalingBackend(BaseBackend):
asg_targets = [{'id': x.instance.id} for x in group.instance_states]
self.elbv2_backend.deregister_targets(target_group, (asg_targets))
def suspend_processes(self, group_name, scaling_processes):
group = self.autoscaling_groups[group_name]
group.suspended_processes = scaling_processes or []
autoscaling_backends = {}
for region, ec2_backend in ec2_backends.items():

View File

@ -283,6 +283,13 @@ class AutoScalingResponse(BaseResponse):
template = self.response_template(DETACH_LOAD_BALANCERS_TEMPLATE)
return template.render()
def suspend_processes(self):
autoscaling_group_name = self._get_param('AutoScalingGroupName')
scaling_processes = self._get_multi_param('ScalingProcesses.member')
self.autoscaling_backend.suspend_processes(autoscaling_group_name, scaling_processes)
template = self.response_template(SUSPEND_PROCESSES_TEMPLATE)
return template.render()
CREATE_LAUNCH_CONFIGURATION_TEMPLATE = """<CreateLaunchConfigurationResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
<ResponseMetadata>
@ -463,7 +470,14 @@ DESCRIBE_AUTOSCALING_GROUPS_TEMPLATE = """<DescribeAutoScalingGroupsResponse xml
</member>
{% endfor %}
</Tags>
<SuspendedProcesses/>
<SuspendedProcesses>
{% for suspended_process in group.suspended_processes %}
<member>
<ProcessName>{{suspended_process}}</ProcessName>
<SuspensionReason></SuspensionReason>
</member>
{% endfor %}
</SuspendedProcesses>
<AutoScalingGroupName>{{ group.name }}</AutoScalingGroupName>
<HealthCheckType>{{ group.health_check_type }}</HealthCheckType>
<CreatedTime>2013-05-06T17:47:15.107Z</CreatedTime>
@ -644,6 +658,12 @@ DETACH_LOAD_BALANCERS_TEMPLATE = """<DetachLoadBalancersResponse xmlns="http://a
</ResponseMetadata>
</DetachLoadBalancersResponse>"""
SUSPEND_PROCESSES_TEMPLATE = """<SuspendProcessesResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
<ResponseMetadata>
<RequestId>7c6e177f-f082-11e1-ac58-3714bEXAMPLE</RequestId>
</ResponseMetadata>
</SuspendProcessesResponse>"""
SET_INSTANCE_HEALTH_TEMPLATE = """<SetInstanceHealthResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
<SetInstanceHealthResponse></SetInstanceHealthResponse>
<ResponseMetadata>

View File

@ -1067,3 +1067,32 @@ def test_set_instance_health():
instance1 = response['AutoScalingGroups'][0]['Instances'][0]
instance1['HealthStatus'].should.equal('Unhealthy')
@mock_autoscaling
def test_asg():
client = boto3.client('autoscaling')
client.create_launch_configuration(
LaunchConfigurationName='lc',
)
client.create_auto_scaling_group(
LaunchConfigurationName='lc',
AutoScalingGroupName='test-asg',
MinSize=1,
MaxSize=1,
)
# Testing something that calls the below...
client.suspend_processes(
AutoScalingGroupName='test-asg',
ScalingProcesses=['Launch']
)
res = client.describe_auto_scaling_groups(
AutoScalingGroupNames=['test-asg']
)
launch_suspended = False
for proc in res['AutoScalingGroups'][0]['SuspendedProcesses']:
if proc.get('ProcessName') == 'Launch':
launch_suspended = True
assert launch_suspended is True