Fix/autoscaling elb interaction (#3757)
* Add minimal failing test case. * Improve ELB instance ids handling. We need to handle the instances originated by an autoscaling group differently.
This commit is contained in:
parent
bcc7938615
commit
273d632515
3 changed files with 65 additions and 15 deletions
|
|
@ -946,10 +946,10 @@ class AutoScalingBackend(BaseBackend):
|
|||
for elb in elbs:
|
||||
elb_instace_ids = set(elb.instance_ids)
|
||||
self.elb_backend.register_instances(
|
||||
elb.name, group_instance_ids - elb_instace_ids
|
||||
elb.name, group_instance_ids - elb_instace_ids, from_autoscaling=True,
|
||||
)
|
||||
self.elb_backend.deregister_instances(
|
||||
elb.name, elb_instace_ids - group_instance_ids
|
||||
elb.name, elb_instace_ids - group_instance_ids, from_autoscaling=True,
|
||||
)
|
||||
|
||||
def update_attached_target_groups(self, group_name):
|
||||
|
|
@ -1007,7 +1007,9 @@ class AutoScalingBackend(BaseBackend):
|
|||
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)
|
||||
self.elb_backend.deregister_instances(
|
||||
elb.name, group_instance_ids, from_autoscaling=True
|
||||
)
|
||||
group.load_balancers = [
|
||||
x for x in group.load_balancers if x not in load_balancer_names
|
||||
]
|
||||
|
|
|
|||
|
|
@ -82,7 +82,8 @@ class FakeLoadBalancer(CloudFormationModel):
|
|||
):
|
||||
self.name = name
|
||||
self.health_check = None
|
||||
self.instance_ids = []
|
||||
self.instance_sparse_ids = []
|
||||
self.instance_autoscaling_ids = []
|
||||
self.zones = zones
|
||||
self.listeners = []
|
||||
self.backends = []
|
||||
|
|
@ -119,6 +120,11 @@ class FakeLoadBalancer(CloudFormationModel):
|
|||
)
|
||||
self.backends.append(backend)
|
||||
|
||||
@property
|
||||
def instance_ids(self):
|
||||
"""Return all the instances attached to the ELB"""
|
||||
return self.instance_sparse_ids + self.instance_autoscaling_ids
|
||||
|
||||
@staticmethod
|
||||
def cloudformation_name_type():
|
||||
return "LoadBalancerName"
|
||||
|
|
@ -403,19 +409,39 @@ class ELBBackend(BaseBackend):
|
|||
|
||||
return balancer
|
||||
|
||||
def register_instances(self, load_balancer_name, instance_ids):
|
||||
def register_instances(
|
||||
self, load_balancer_name, instance_ids, from_autoscaling=False
|
||||
):
|
||||
load_balancer = self.get_load_balancer(load_balancer_name)
|
||||
load_balancer.instance_ids.extend(instance_ids)
|
||||
attr_name = (
|
||||
"instance_sparse_ids"
|
||||
if not from_autoscaling
|
||||
else "instance_autoscaling_ids"
|
||||
)
|
||||
|
||||
actual_instance_ids = getattr(load_balancer, attr_name)
|
||||
actual_instance_ids.extend(instance_ids)
|
||||
return load_balancer
|
||||
|
||||
def deregister_instances(self, load_balancer_name, instance_ids):
|
||||
def deregister_instances(
|
||||
self, load_balancer_name, instance_ids, from_autoscaling=False
|
||||
):
|
||||
load_balancer = self.get_load_balancer(load_balancer_name)
|
||||
attr_name = (
|
||||
"instance_sparse_ids"
|
||||
if not from_autoscaling
|
||||
else "instance_autoscaling_ids"
|
||||
)
|
||||
actual_instance_ids = getattr(load_balancer, attr_name)
|
||||
|
||||
new_instance_ids = [
|
||||
instance_id
|
||||
for instance_id in load_balancer.instance_ids
|
||||
for instance_id in actual_instance_ids
|
||||
if instance_id not in instance_ids
|
||||
]
|
||||
load_balancer.instance_ids = new_instance_ids
|
||||
|
||||
setattr(load_balancer, attr_name, new_instance_ids)
|
||||
|
||||
return load_balancer
|
||||
|
||||
def set_cross_zone_load_balancing_attribute(self, load_balancer_name, attribute):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue