Merge "Don't leave LBs in PENDING_DELETE after refusing to cascade"

This commit is contained in:
Jenkins 2017-06-01 19:28:31 +00:00 committed by Gerrit Code Review
commit 29219e4345
2 changed files with 12 additions and 9 deletions

View File

@ -330,21 +330,22 @@ class LoadBalancersController(base.BaseController):
context = pecan.request.context.get('octavia_context') context = pecan.request.context.get('octavia_context')
cascade = strutils.bool_from_string(cascade) cascade = strutils.bool_from_string(cascade)
db_lb = self._get_db_lb(context.session, id) db_lb = self._get_db_lb(context.session, id)
self._test_lb_status(context.session, id, with db_api.get_lock_session() as lock_session:
lb_status=constants.PENDING_DELETE) self._test_lb_status(lock_session, id,
if (db_lb.listeners or db_lb.pools) and not cascade: lb_status=constants.PENDING_DELETE)
msg = _("Cannot delete Load Balancer %s - it has children") % id if (db_lb.listeners or db_lb.pools) and not cascade:
LOG.warning(msg) msg = _("Cannot delete Load Balancer %s - "
raise exceptions.ValidationException(detail=msg) "it has children") % id
LOG.warning(msg)
raise exceptions.ValidationException(detail=msg)
try: try:
LOG.info("Sending deleted Load Balancer %s to the handler", LOG.info("Sending deleted Load Balancer %s to the handler", id)
db_lb.id)
self.handler.delete(db_lb, cascade) self.handler.delete(db_lb, cascade)
except Exception: except Exception:
with excutils.save_and_reraise_exception(reraise=False): with excutils.save_and_reraise_exception(reraise=False):
self.repositories.load_balancer.update( self.repositories.load_balancer.update(
context.session, db_lb.id, context.session, id,
provisioning_status=constants.ERROR) provisioning_status=constants.ERROR)
result = self._convert_db_to_type(db_lb, lb_types.LoadBalancerResponse) result = self._convert_db_to_type(db_lb, lb_types.LoadBalancerResponse)
return lb_types.LoadBalancersRootResponse(loadbalancer=result) return lb_types.LoadBalancersRootResponse(loadbalancer=result)

View File

@ -594,6 +594,7 @@ class TestLoadBalancer(base.BaseAPITest):
constants.LB_ALGORITHM_ROUND_ROBIN) constants.LB_ALGORITHM_ROUND_ROBIN)
self.set_lb_status(lb_id) self.set_lb_status(lb_id)
self.delete(self.LB_PATH.format(lb_id=lb_id), status=400) self.delete(self.LB_PATH.format(lb_id=lb_id), status=400)
self.assert_correct_status(lb_id=lb_id)
def test_delete_fails_with_listener(self): def test_delete_fails_with_listener(self):
project_id = uuidutils.generate_uuid() project_id = uuidutils.generate_uuid()
@ -606,6 +607,7 @@ class TestLoadBalancer(base.BaseAPITest):
self.create_listener(constants.PROTOCOL_HTTP, 80, lb_id) self.create_listener(constants.PROTOCOL_HTTP, 80, lb_id)
self.set_lb_status(lb_id) self.set_lb_status(lb_id)
self.delete(self.LB_PATH.format(lb_id=lb_id), status=400) self.delete(self.LB_PATH.format(lb_id=lb_id), status=400)
self.assert_correct_status(lb_id=lb_id)
def test_cascade_delete(self): def test_cascade_delete(self):
project_id = uuidutils.generate_uuid() project_id = uuidutils.generate_uuid()