Merge "Address various issues with Octavia delete cascade"
This commit is contained in:
commit
bff0c44668
@ -38,11 +38,13 @@ class EdgeMemberManagerFromDict(base_mgr.EdgeLoadbalancerBaseManager):
|
|||||||
def _get_pool_lb_id(self, member):
|
def _get_pool_lb_id(self, member):
|
||||||
if not member.get('pool'):
|
if not member.get('pool'):
|
||||||
return
|
return
|
||||||
listener = member['pool']['listener']
|
listener = member['pool'].get('listener')
|
||||||
if listener:
|
if listener:
|
||||||
lb_id = listener['loadbalancer_id']
|
lb_id = listener['loadbalancer_id']
|
||||||
|
elif member['pool'].get('loadbalancer_id'):
|
||||||
|
lb_id = member['pool']['loadbalancer_id']
|
||||||
else:
|
else:
|
||||||
lb_id = member['pool']['loadbalancer']['id']
|
lb_id = member['pool'].get('loadbalancer', []).get('id')
|
||||||
return lb_id
|
return lb_id
|
||||||
|
|
||||||
def _get_pool_member_ips(self, pool, operation, address):
|
def _get_pool_member_ips(self, pool, operation, address):
|
||||||
|
@ -174,15 +174,16 @@ class EdgePoolManagerFromDict(base_mgr.EdgeLoadbalancerBaseManager):
|
|||||||
|
|
||||||
listener_binding = nsxv_db.get_nsxv_lbaas_listener_binding(
|
listener_binding = nsxv_db.get_nsxv_lbaas_listener_binding(
|
||||||
context.session, lb_id, listener['id'])
|
context.session, lb_id, listener['id'])
|
||||||
vse = listener_mgr.listener_to_edge_vse(
|
if listener_binding:
|
||||||
context,
|
vse = listener_mgr.listener_to_edge_vse(
|
||||||
listener,
|
context,
|
||||||
lb_binding['vip_address'],
|
listener,
|
||||||
None,
|
lb_binding['vip_address'],
|
||||||
listener_binding['app_profile_id'])
|
None,
|
||||||
with locking.LockManager.get_lock(edge_id):
|
listener_binding['app_profile_id'])
|
||||||
self.vcns.update_vip(
|
with locking.LockManager.get_lock(edge_id):
|
||||||
edge_id, listener_binding['vse_id'], vse)
|
self.vcns.update_vip(
|
||||||
|
edge_id, listener_binding['vse_id'], vse)
|
||||||
self.vcns.delete_pool(edge_id, edge_pool_id)
|
self.vcns.delete_pool(edge_id, edge_pool_id)
|
||||||
completor(success=True)
|
completor(success=True)
|
||||||
nsxv_db.del_nsxv_lbaas_pool_binding(
|
nsxv_db.del_nsxv_lbaas_pool_binding(
|
||||||
|
@ -324,26 +324,43 @@ class NSXOctaviaListenerEndpoint(object):
|
|||||||
def dummy_completor(success=True):
|
def dummy_completor(success=True):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
completor = self.get_completor_func(constants.LOADBALANCERS,
|
||||||
|
loadbalancer, delete=True)
|
||||||
|
|
||||||
|
listener_dict = {}
|
||||||
# Go over the LB tree and delete one by one using the cascade
|
# Go over the LB tree and delete one by one using the cascade
|
||||||
# api implemented for each resource
|
# api implemented for each resource
|
||||||
for listener in loadbalancer.get('listeners', []):
|
try:
|
||||||
for policy in listener.get('l7policies', []):
|
for listener in loadbalancer.get('listeners', []):
|
||||||
for rule in policy.get('rules', []):
|
listener['loadbalancer'] = loadbalancer
|
||||||
self.l7rule.delete_cascade(ctx, rule, dummy_completor)
|
listener_dict[listener['id']] = listener
|
||||||
self.l7policy.delete_cascade(ctx, policy, dummy_completor)
|
for policy in listener.get('l7policies', []):
|
||||||
self.listener.delete_cascade(ctx, listener, dummy_completor)
|
for rule in policy.get('rules', []):
|
||||||
for pool in loadbalancer.get('pools', []):
|
self.l7rule.delete_cascade(ctx, rule, dummy_completor)
|
||||||
for member in pool.get('members', []):
|
self.l7policy.delete_cascade(ctx, policy, dummy_completor)
|
||||||
self.member.delete_cascade(ctx, member, dummy_completor)
|
self.listener.delete_cascade(ctx, listener, dummy_completor)
|
||||||
if pool.get('healthmonitor'):
|
for pool in loadbalancer.get('pools', []):
|
||||||
self.healthmonitor.delete_cascade(
|
if not pool.get('loadbalancer'):
|
||||||
ctx, pool['healthmonitor'], dummy_completor)
|
pool['loadbalancer'] = loadbalancer
|
||||||
self.pool.delete_cascade(ctx, pool, dummy_completor)
|
if pool.get('listener_id'):
|
||||||
|
pool['listener'] = listener_dict[pool['listener_id']]
|
||||||
|
pool['listeners'] = [pool['listener']]
|
||||||
|
for member in pool.get('members', []):
|
||||||
|
if not member.get('pool'):
|
||||||
|
member['pool'] = pool
|
||||||
|
self.member.delete_cascade(ctx, member, dummy_completor)
|
||||||
|
if pool.get('healthmonitor'):
|
||||||
|
self.healthmonitor.delete_cascade(
|
||||||
|
ctx, pool['healthmonitor'], dummy_completor)
|
||||||
|
self.pool.delete_cascade(ctx, pool, dummy_completor)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.error('NSX driver loadbalancer_delete_cascade failed to '
|
||||||
|
'delete sub-object %s', e)
|
||||||
|
completor(success=False)
|
||||||
|
return False
|
||||||
|
|
||||||
# Delete the loadbalancer itself with the completor that marks all
|
# Delete the loadbalancer itself with the completor that marks all
|
||||||
# as deleted
|
# as deleted
|
||||||
completor = self.get_completor_func(constants.LOADBALANCERS,
|
|
||||||
loadbalancer, delete=True)
|
|
||||||
try:
|
try:
|
||||||
self.loadbalancer.delete_cascade(
|
self.loadbalancer.delete_cascade(
|
||||||
ctx, loadbalancer, self.get_completor_func(
|
ctx, loadbalancer, self.get_completor_func(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user