Fix unused members deletion
Unused members are not being deleted from the pools. This commit
fixes the issue by associating the current target ports with the pool,
and removing the members not presented in these current targets.
Change-Id: I60ce63d2d50daf9a1cea9897dae4926137fc2352
Closes-Bug: #1812370
(cherry picked from commit 66faa8a38b
)
This commit is contained in:
parent
1d56b5b26d
commit
7fb4044238
|
@ -414,20 +414,38 @@ class LoadBalancerHandler(k8s_base.ResourceEventHandler):
|
|||
for subnet in network.subnets.objects
|
||||
if ip in subnet.cidr][0]
|
||||
|
||||
def _get_port_in_pool(self, pool, lbaas_state, lbaas_spec):
|
||||
for l in lbaas_state.listeners:
|
||||
if l.id != pool.listener_id:
|
||||
continue
|
||||
for port in lbaas_spec.ports:
|
||||
if l.port == port.port and l.protocol == port.protocol:
|
||||
return port
|
||||
return None
|
||||
|
||||
def _remove_unused_members(self, endpoints, lbaas_state, lbaas_spec):
|
||||
spec_port_names = {p.name for p in lbaas_spec.ports}
|
||||
current_targets = {(a['ip'], p['port'])
|
||||
spec_ports = {}
|
||||
for pool in lbaas_state.pools:
|
||||
port = self._get_port_in_pool(pool, lbaas_state, lbaas_spec)
|
||||
if port:
|
||||
spec_ports[port.name] = pool.id
|
||||
|
||||
current_targets = {(a['ip'], p['port'],
|
||||
spec_ports.get(p.get('name')))
|
||||
for s in endpoints['subsets']
|
||||
for a in s['addresses']
|
||||
for p in s['ports']
|
||||
if p.get('name') in spec_port_names}
|
||||
if p.get('name') in spec_ports}
|
||||
|
||||
removed_ids = set()
|
||||
for member in lbaas_state.members:
|
||||
if (str(member.ip), member.port) in current_targets:
|
||||
if ((str(member.ip), member.port, member.pool_id) in
|
||||
current_targets):
|
||||
continue
|
||||
self._drv_lbaas.release_member(lbaas_state.loadbalancer,
|
||||
member)
|
||||
removed_ids.add(member.id)
|
||||
|
||||
if removed_ids:
|
||||
lbaas_state.members = [m for m in lbaas_state.members
|
||||
if m.id not in removed_ids]
|
||||
|
|
Loading…
Reference in New Issue