Skip to content

Commit 29f5534

Browse files
OPENSTACK-2799: fix to delete pool
if bigip partition is missing, we can not delete pool in neutron db. it is because pool has relationship with pool member and listener. when the partition is missing, member can not update(create if missing) allocate route domain in the misssing partition. when the partition is missing, listener can not update(create if missing) in the missing partition.
1 parent e3126b3 commit 29f5534

3 files changed

Lines changed: 25 additions & 7 deletions

File tree

f5_openstack_agent/lbaasv2/drivers/bigip/icontrol_driver.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import os
1919

2020
from time import strftime
21+
from requests import HTTPError
2122

2223
from oslo_config import cfg
2324
from oslo_log import helpers as log_helpers
@@ -835,10 +836,12 @@ def annotate_service_members(self, service):
835836
self.network_builder._annotate_service_route_domains(service)
836837
except f5ex.InvalidNetworkType as exc:
837838
LOG.warning(exc.message)
839+
except HTTPError as err:
840+
raise err
838841
except Exception as err:
839842
LOG.exception(err)
840843
raise f5ex.RouteDomainCreationException(
841-
"Route domain annotation error")
844+
"Service Member Route domain annotation error")
842845

843846
def update_service_status(self, service, timed_out=False):
844847
"""Update status of objects in controller."""

f5_openstack_agent/lbaasv2/drivers/bigip/network_service.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,6 @@ def create_rd_by_net(
396396
exists = self.network_helper.route_domain_exists(
397397
bigip, partition=partition, name=name
398398
)
399-
400399
if exists:
401400
LOG.info("route domain: %s, %s exists on bigip: %s"
402401
% (name, route_domain, bigip.hostname))
@@ -411,13 +410,16 @@ def create_rd_by_net(
411410

412411
LOG.info("create route domain: %s, %s on bigip: %s"
413412
% (name, route_domain, bigip.hostname))
414-
except Exception as ex:
415-
if ex.response.status_code == 409:
413+
except HTTPError as err:
414+
if err.response.status_code == 409:
416415
LOG.info("route domain %s already exists: %s, ignored.." % (
417-
route_domain, ex.message))
416+
route_domain, err.message))
417+
elif err.response.status_code == 400:
418+
LOG.info("maybe partition is misssing, dirty data.")
419+
raise err
418420
else:
419421
# FIXME(pzhang): what to do with multiple agent race?
420-
LOG.error(ex.message)
422+
LOG.error(err.message)
421423
raise f5_ex.RouteDomainCreationException(
422424
"Failed to create route domain: %s, %s on bigip %s"
423425
% (name, route_domain, bigip.hostname)

f5_openstack_agent/lbaasv2/drivers/bigip/resource_manager.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,13 @@ def _delete(self, bigip, payload, pool, service):
16121612
service['listener'] = listener
16131613
""" Unmap listener and pool"""
16141614
vs = self.driver.service_adapter.get_virtual_name(service)
1615+
vs_exist = mgr.resource_helper.exists(
1616+
bigip, name=vs['name'],
1617+
partition=vs['partition']
1618+
)
1619+
if not vs_exist:
1620+
continue
1621+
16151622
vs['pool'] = ""
16161623
# Need to remove persist profile from virtual server,
16171624
# if its persist profile is configured by its default pool.
@@ -1641,7 +1648,13 @@ def update(self, old_pool, pool, service, **kwargs):
16411648
@serialized('PoolManager.delete')
16421649
@log_helpers.log_method_call
16431650
def delete(self, pool, service, **kwargs):
1644-
self.driver.annotate_service_members(service)
1651+
try:
1652+
self.driver.annotate_service_members(service)
1653+
except HTTPError as err:
1654+
if err.response.status_code == 400:
1655+
LOG.debug(err)
1656+
else:
1657+
raise err
16451658
super(PoolManager, self).delete(pool, service)
16461659

16471660

0 commit comments

Comments
 (0)