From c05a8cfb88bd1219a086e8826f7783b64f1e8537 Mon Sep 17 00:00:00 2001 From: Michael Johnson Date: Mon, 23 Oct 2017 10:40:17 -0700 Subject: [PATCH] Fix non-cascade LB delete with children When the user attempts to delete a load balancer, without the cascade option, the load balancer is locked in "PENDING_DELETE" prior to the check for child objects. The child object check will return the error to the user, but would leave the load balancer locked in "PENDING_DELETE". This patch corrects the order to do the validation prior to locking the load balancer in "PENDING_DELETE". Change-Id: If1694743d098b1c1337601770a7b3466a43dda07 Story: 2001256 Task: 5786 --- octavia/api/v1/controllers/load_balancer.py | 6 +++--- octavia/api/v2/controllers/load_balancer.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/octavia/api/v1/controllers/load_balancer.py b/octavia/api/v1/controllers/load_balancer.py index abb256b6b9..8af40659af 100644 --- a/octavia/api/v1/controllers/load_balancer.py +++ b/octavia/api/v1/controllers/load_balancer.py @@ -238,12 +238,12 @@ class LoadBalancersController(base.BaseController): """Deletes a load balancer.""" context = pecan.request.context.get('octavia_context') db_lb = self._get_db_lb(context.session, id) - self._test_lb_status(context.session, id, - lb_status=constants.PENDING_DELETE) if (db_lb.listeners or db_lb.pools) and not cascade: msg = _("Cannot delete Load Balancer %s - it has children") % id - LOG.exception(msg) + LOG.warning(msg) raise exceptions.ValidationException(detail=msg) + self._test_lb_status(context.session, id, + lb_status=constants.PENDING_DELETE) try: LOG.info("Sending deleted Load Balancer %s to the handler", diff --git a/octavia/api/v2/controllers/load_balancer.py b/octavia/api/v2/controllers/load_balancer.py index c7227d4f82..227bf903f9 100644 --- a/octavia/api/v2/controllers/load_balancer.py +++ b/octavia/api/v2/controllers/load_balancer.py @@ -441,13 +441,13 @@ class LoadBalancersController(base.BaseController): constants.RBAC_DELETE) with db_api.get_lock_session() as lock_session: - self._test_lb_status(lock_session, id, - lb_status=constants.PENDING_DELETE) if (db_lb.listeners or db_lb.pools) and not cascade: msg = _("Cannot delete Load Balancer %s - " "it has children") % id LOG.warning(msg) raise exceptions.ValidationException(detail=msg) + self._test_lb_status(lock_session, id, + lb_status=constants.PENDING_DELETE) try: LOG.info("Sending deleted Load Balancer %s to the handler", id)