Add autoscaling load balancer methods (#1265)
* add attach_load_balancers, detach_load_balancers, describe_load_balancers methods * prefer using amzn_request_id decorator to generate unique request ids
This commit is contained in:
parent
5ef236e966
commit
0af3427c15
@ -539,6 +539,24 @@ class AutoScalingBackend(BaseBackend):
|
|||||||
|
|
||||||
group.tags = new_tags
|
group.tags = new_tags
|
||||||
|
|
||||||
|
def attach_load_balancers(self, group_name, load_balancer_names):
|
||||||
|
group = self.autoscaling_groups[group_name]
|
||||||
|
group.load_balancers.extend(load_balancer_names)
|
||||||
|
self.update_attached_elbs(group_name)
|
||||||
|
|
||||||
|
def describe_load_balancers(self, group_name):
|
||||||
|
return self.autoscaling_groups[group_name].load_balancers
|
||||||
|
|
||||||
|
def detach_load_balancers(self, group_name, load_balancer_names):
|
||||||
|
group = self.autoscaling_groups[group_name]
|
||||||
|
group_instance_ids = set(
|
||||||
|
state.instance.id for state in group.instance_states)
|
||||||
|
elbs = self.elb_backend.describe_load_balancers(names=group.load_balancers)
|
||||||
|
for elb in elbs:
|
||||||
|
self.elb_backend.deregister_instances(
|
||||||
|
elb.name, group_instance_ids)
|
||||||
|
group.load_balancers = [x for x in group.load_balancers if x not in load_balancer_names]
|
||||||
|
|
||||||
|
|
||||||
autoscaling_backends = {}
|
autoscaling_backends = {}
|
||||||
for region, ec2_backend in ec2_backends.items():
|
for region, ec2_backend in ec2_backends.items():
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from moto.core.responses import BaseResponse
|
from moto.core.responses import BaseResponse
|
||||||
|
from moto.core.utils import amz_crc32, amzn_request_id
|
||||||
from .models import autoscaling_backends
|
from .models import autoscaling_backends
|
||||||
|
|
||||||
|
|
||||||
@ -87,6 +88,8 @@ class AutoScalingResponse(BaseResponse):
|
|||||||
template = self.response_template(CREATE_AUTOSCALING_GROUP_TEMPLATE)
|
template = self.response_template(CREATE_AUTOSCALING_GROUP_TEMPLATE)
|
||||||
return template.render()
|
return template.render()
|
||||||
|
|
||||||
|
@amz_crc32
|
||||||
|
@amzn_request_id
|
||||||
def attach_instances(self):
|
def attach_instances(self):
|
||||||
group_name = self._get_param('AutoScalingGroupName')
|
group_name = self._get_param('AutoScalingGroupName')
|
||||||
instance_ids = self._get_multi_param("InstanceIds.member")
|
instance_ids = self._get_multi_param("InstanceIds.member")
|
||||||
@ -95,6 +98,8 @@ class AutoScalingResponse(BaseResponse):
|
|||||||
template = self.response_template(ATTACH_INSTANCES_TEMPLATE)
|
template = self.response_template(ATTACH_INSTANCES_TEMPLATE)
|
||||||
return template.render()
|
return template.render()
|
||||||
|
|
||||||
|
@amz_crc32
|
||||||
|
@amzn_request_id
|
||||||
def detach_instances(self):
|
def detach_instances(self):
|
||||||
group_name = self._get_param('AutoScalingGroupName')
|
group_name = self._get_param('AutoScalingGroupName')
|
||||||
instance_ids = self._get_multi_param("InstanceIds.member")
|
instance_ids = self._get_multi_param("InstanceIds.member")
|
||||||
@ -207,6 +212,34 @@ class AutoScalingResponse(BaseResponse):
|
|||||||
template = self.response_template(EXECUTE_POLICY_TEMPLATE)
|
template = self.response_template(EXECUTE_POLICY_TEMPLATE)
|
||||||
return template.render()
|
return template.render()
|
||||||
|
|
||||||
|
@amz_crc32
|
||||||
|
@amzn_request_id
|
||||||
|
def attach_load_balancers(self):
|
||||||
|
group_name = self._get_param('AutoScalingGroupName')
|
||||||
|
load_balancer_names = self._get_multi_param("LoadBalancerNames.member")
|
||||||
|
self.autoscaling_backend.attach_load_balancers(
|
||||||
|
group_name, load_balancer_names)
|
||||||
|
template = self.response_template(ATTACH_LOAD_BALANCERS_TEMPLATE)
|
||||||
|
return template.render()
|
||||||
|
|
||||||
|
@amz_crc32
|
||||||
|
@amzn_request_id
|
||||||
|
def describe_load_balancers(self):
|
||||||
|
group_name = self._get_param('AutoScalingGroupName')
|
||||||
|
load_balancers = self.autoscaling_backend.describe_load_balancers(group_name)
|
||||||
|
template = self.response_template(DESCRIBE_LOAD_BALANCERS_TEMPLATE)
|
||||||
|
return template.render(load_balancers=load_balancers)
|
||||||
|
|
||||||
|
@amz_crc32
|
||||||
|
@amzn_request_id
|
||||||
|
def detach_load_balancers(self):
|
||||||
|
group_name = self._get_param('AutoScalingGroupName')
|
||||||
|
load_balancer_names = self._get_multi_param("LoadBalancerNames.member")
|
||||||
|
self.autoscaling_backend.detach_load_balancers(
|
||||||
|
group_name, load_balancer_names)
|
||||||
|
template = self.response_template(DETACH_LOAD_BALANCERS_TEMPLATE)
|
||||||
|
return template.render()
|
||||||
|
|
||||||
|
|
||||||
CREATE_LAUNCH_CONFIGURATION_TEMPLATE = """<CreateLaunchConfigurationResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
|
CREATE_LAUNCH_CONFIGURATION_TEMPLATE = """<CreateLaunchConfigurationResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
|
||||||
<ResponseMetadata>
|
<ResponseMetadata>
|
||||||
@ -309,7 +342,7 @@ ATTACH_INSTANCES_TEMPLATE = """<AttachInstancesResponse xmlns="http://autoscalin
|
|||||||
<AttachInstancesResult>
|
<AttachInstancesResult>
|
||||||
</AttachInstancesResult>
|
</AttachInstancesResult>
|
||||||
<ResponseMetadata>
|
<ResponseMetadata>
|
||||||
<RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
|
<RequestId>{{ requestid }}</RequestId>
|
||||||
</ResponseMetadata>
|
</ResponseMetadata>
|
||||||
</AttachInstancesResponse>"""
|
</AttachInstancesResponse>"""
|
||||||
|
|
||||||
@ -335,7 +368,7 @@ DETACH_INSTANCES_TEMPLATE = """<DetachInstancesResponse xmlns="http://autoscalin
|
|||||||
</Activities>
|
</Activities>
|
||||||
</DetachInstancesResult>
|
</DetachInstancesResult>
|
||||||
<ResponseMetadata>
|
<ResponseMetadata>
|
||||||
<RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
|
<RequestId>{{ requestid }}</RequestId>
|
||||||
</ResponseMetadata>
|
</ResponseMetadata>
|
||||||
</DetachInstancesResponse>"""
|
</DetachInstancesResponse>"""
|
||||||
|
|
||||||
@ -505,3 +538,33 @@ DELETE_POLICY_TEMPLATE = """<DeleteScalingPolicyResponse xmlns="http://autoscali
|
|||||||
<RequestId>70a76d42-9665-11e2-9fdf-211deEXAMPLE</RequestId>
|
<RequestId>70a76d42-9665-11e2-9fdf-211deEXAMPLE</RequestId>
|
||||||
</ResponseMetadata>
|
</ResponseMetadata>
|
||||||
</DeleteScalingPolicyResponse>"""
|
</DeleteScalingPolicyResponse>"""
|
||||||
|
|
||||||
|
ATTACH_LOAD_BALANCERS_TEMPLATE = """<AttachLoadBalancersResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
|
||||||
|
<AttachLoadBalancersResult></AttachLoadBalancersResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>{{ requestid }}</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</AttachLoadBalancersResponse>"""
|
||||||
|
|
||||||
|
DESCRIBE_LOAD_BALANCERS_TEMPLATE = """<DescribeLoadBalancersResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
|
||||||
|
<DescribeLoadBalancersResult>
|
||||||
|
<LoadBalancers>
|
||||||
|
{% for load_balancer in load_balancers %}
|
||||||
|
<member>
|
||||||
|
<LoadBalancerName>{{ load_balancer }}</LoadBalancerName>
|
||||||
|
<State>Added</State>
|
||||||
|
</member>
|
||||||
|
{% endfor %}
|
||||||
|
</LoadBalancers>
|
||||||
|
</DescribeLoadBalancersResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>{{ requestid }}</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</DescribeLoadBalancersResponse>"""
|
||||||
|
|
||||||
|
DETACH_LOAD_BALANCERS_TEMPLATE = """<DetachLoadBalancersResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
|
||||||
|
<DetachLoadBalancersResult></DetachLoadBalancersResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>{{ requestid }}</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</DetachLoadBalancersResponse>"""
|
||||||
|
@ -8,7 +8,7 @@ from boto.ec2.autoscale import Tag
|
|||||||
import boto.ec2.elb
|
import boto.ec2.elb
|
||||||
import sure # noqa
|
import sure # noqa
|
||||||
|
|
||||||
from moto import mock_autoscaling, mock_ec2_deprecated, mock_elb_deprecated, mock_autoscaling_deprecated, mock_ec2
|
from moto import mock_autoscaling, mock_ec2_deprecated, mock_elb_deprecated, mock_elb, mock_autoscaling_deprecated, mock_ec2
|
||||||
from tests.helpers import requires_boto_gte
|
from tests.helpers import requires_boto_gte
|
||||||
|
|
||||||
|
|
||||||
@ -484,6 +484,131 @@ Boto3
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
@mock_autoscaling
|
||||||
|
@mock_elb
|
||||||
|
def test_describe_load_balancers():
|
||||||
|
INSTANCE_COUNT = 2
|
||||||
|
|
||||||
|
elb_client = boto3.client('elb', region_name='us-east-1')
|
||||||
|
elb_client.create_load_balancer(
|
||||||
|
LoadBalancerName='my-lb',
|
||||||
|
Listeners=[
|
||||||
|
{'Protocol': 'tcp', 'LoadBalancerPort': 80, 'InstancePort': 8080}],
|
||||||
|
AvailabilityZones=['us-east-1a', 'us-east-1b']
|
||||||
|
)
|
||||||
|
|
||||||
|
client = boto3.client('autoscaling', region_name='us-east-1')
|
||||||
|
_ = client.create_launch_configuration(
|
||||||
|
LaunchConfigurationName='test_launch_configuration'
|
||||||
|
)
|
||||||
|
_ = client.create_auto_scaling_group(
|
||||||
|
AutoScalingGroupName='test_asg',
|
||||||
|
LaunchConfigurationName='test_launch_configuration',
|
||||||
|
LoadBalancerNames=['my-lb'],
|
||||||
|
MinSize=0,
|
||||||
|
MaxSize=INSTANCE_COUNT,
|
||||||
|
DesiredCapacity=INSTANCE_COUNT,
|
||||||
|
Tags=[{
|
||||||
|
"ResourceId": 'test_asg',
|
||||||
|
"Key": 'test_key',
|
||||||
|
"Value": 'test_value',
|
||||||
|
"PropagateAtLaunch": True
|
||||||
|
}]
|
||||||
|
)
|
||||||
|
|
||||||
|
response = client.describe_load_balancers(AutoScalingGroupName='test_asg')
|
||||||
|
list(response['LoadBalancers']).should.have.length_of(1)
|
||||||
|
response['LoadBalancers'][0]['LoadBalancerName'].should.equal('my-lb')
|
||||||
|
|
||||||
|
|
||||||
|
@mock_autoscaling
|
||||||
|
@mock_elb
|
||||||
|
def test_attach_load_balancer():
|
||||||
|
INSTANCE_COUNT = 2
|
||||||
|
|
||||||
|
elb_client = boto3.client('elb', region_name='us-east-1')
|
||||||
|
elb_client.create_load_balancer(
|
||||||
|
LoadBalancerName='my-lb',
|
||||||
|
Listeners=[
|
||||||
|
{'Protocol': 'tcp', 'LoadBalancerPort': 80, 'InstancePort': 8080}],
|
||||||
|
AvailabilityZones=['us-east-1a', 'us-east-1b']
|
||||||
|
)
|
||||||
|
|
||||||
|
client = boto3.client('autoscaling', region_name='us-east-1')
|
||||||
|
_ = client.create_launch_configuration(
|
||||||
|
LaunchConfigurationName='test_launch_configuration'
|
||||||
|
)
|
||||||
|
_ = client.create_auto_scaling_group(
|
||||||
|
AutoScalingGroupName='test_asg',
|
||||||
|
LaunchConfigurationName='test_launch_configuration',
|
||||||
|
MinSize=0,
|
||||||
|
MaxSize=INSTANCE_COUNT,
|
||||||
|
DesiredCapacity=INSTANCE_COUNT,
|
||||||
|
Tags=[{
|
||||||
|
"ResourceId": 'test_asg',
|
||||||
|
"Key": 'test_key',
|
||||||
|
"Value": 'test_value',
|
||||||
|
"PropagateAtLaunch": True
|
||||||
|
}]
|
||||||
|
)
|
||||||
|
|
||||||
|
response = client.attach_load_balancers(
|
||||||
|
AutoScalingGroupName='test_asg',
|
||||||
|
LoadBalancerNames=['my-lb'])
|
||||||
|
response['ResponseMetadata']['HTTPStatusCode'].should.equal(200)
|
||||||
|
|
||||||
|
response = elb_client.describe_load_balancers(
|
||||||
|
LoadBalancerNames=['my-lb']
|
||||||
|
)
|
||||||
|
list(response['LoadBalancerDescriptions'][0]['Instances']).should.have.length_of(INSTANCE_COUNT)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_autoscaling
|
||||||
|
@mock_elb
|
||||||
|
def test_detach_load_balancer():
|
||||||
|
INSTANCE_COUNT = 2
|
||||||
|
|
||||||
|
elb_client = boto3.client('elb', region_name='us-east-1')
|
||||||
|
elb_client.create_load_balancer(
|
||||||
|
LoadBalancerName='my-lb',
|
||||||
|
Listeners=[
|
||||||
|
{'Protocol': 'tcp', 'LoadBalancerPort': 80, 'InstancePort': 8080}],
|
||||||
|
AvailabilityZones=['us-east-1a', 'us-east-1b']
|
||||||
|
)
|
||||||
|
|
||||||
|
client = boto3.client('autoscaling', region_name='us-east-1')
|
||||||
|
_ = client.create_launch_configuration(
|
||||||
|
LaunchConfigurationName='test_launch_configuration'
|
||||||
|
)
|
||||||
|
_ = client.create_auto_scaling_group(
|
||||||
|
AutoScalingGroupName='test_asg',
|
||||||
|
LaunchConfigurationName='test_launch_configuration',
|
||||||
|
LoadBalancerNames=['my-lb'],
|
||||||
|
MinSize=0,
|
||||||
|
MaxSize=INSTANCE_COUNT,
|
||||||
|
DesiredCapacity=INSTANCE_COUNT,
|
||||||
|
Tags=[{
|
||||||
|
"ResourceId": 'test_asg',
|
||||||
|
"Key": 'test_key',
|
||||||
|
"Value": 'test_value',
|
||||||
|
"PropagateAtLaunch": True
|
||||||
|
}]
|
||||||
|
)
|
||||||
|
|
||||||
|
response = client.detach_load_balancers(
|
||||||
|
AutoScalingGroupName='test_asg',
|
||||||
|
LoadBalancerNames=['my-lb'])
|
||||||
|
response['ResponseMetadata']['HTTPStatusCode'].should.equal(200)
|
||||||
|
|
||||||
|
response = elb_client.describe_load_balancers(
|
||||||
|
LoadBalancerNames=['my-lb']
|
||||||
|
)
|
||||||
|
list(response['LoadBalancerDescriptions'][0]['Instances']).should.have.length_of(0)
|
||||||
|
|
||||||
|
response = client.describe_load_balancers(AutoScalingGroupName='test_asg')
|
||||||
|
list(response['LoadBalancers']).should.have.length_of(0)
|
||||||
|
|
||||||
|
|
||||||
@mock_autoscaling
|
@mock_autoscaling
|
||||||
def test_create_autoscaling_group_boto3():
|
def test_create_autoscaling_group_boto3():
|
||||||
client = boto3.client('autoscaling', region_name='us-east-1')
|
client = boto3.client('autoscaling', region_name='us-east-1')
|
||||||
|
Loading…
Reference in New Issue
Block a user