Skip to content

Commit 97603dd

Browse files
committed
Fix loadbalancer stuck in cascade delete
- Fix loadbalancer stuck in PENDING_DELETE in cascade delete with TERMINATED_HTTPS listener if TLS storage not available Closes-Bug: #2077348 Change-Id: Iae2b075de5412bb183db6a21f7f8376801853e00 Signed-off-by: Evgeniy Bykov <[email protected]> (cherry picked from commit ec9a505)
1 parent 7f6ad90 commit 97603dd

File tree

4 files changed

+69
-7
lines changed

4 files changed

+69
-7
lines changed

octavia/controller/worker/v2/controller_worker.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,8 @@ def delete_load_balancer(self, load_balancer, cascade=False):
380380
constants.SERVER_GROUP_ID: db_lb.server_group_id,
381381
constants.PROJECT_ID: db_lb.project_id}
382382
if cascade:
383-
listeners = flow_utils.get_listeners_on_lb(db_lb)
384-
pools = flow_utils.get_pools_on_lb(db_lb)
383+
listeners = flow_utils.get_listeners_on_lb(db_lb, True)
384+
pools = flow_utils.get_pools_on_lb(db_lb, True)
385385

386386
self.run_flow(
387387
flow_utils.get_cascade_delete_load_balancer_flow,

octavia/controller/worker/v2/flows/flow_utils.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,29 +41,31 @@ def get_delete_load_balancer_flow(lb):
4141
return LB_FLOWS.get_delete_load_balancer_flow(lb)
4242

4343

44-
def get_listeners_on_lb(db_lb):
44+
def get_listeners_on_lb(db_lb, for_delete=False):
4545
"""Get a list of the listeners on a load balancer.
4646
4747
:param db_lb: A load balancer database model object.
48+
:param for_delete: Skip errors on tls certs loading.
4849
:returns: A list of provider dict format listeners.
4950
"""
5051
listener_dicts = []
5152
for listener in db_lb.listeners:
5253
prov_listener = provider_utils.db_listener_to_provider_listener(
53-
listener)
54+
listener, for_delete)
5455
listener_dicts.append(prov_listener.to_dict())
5556
return listener_dicts
5657

5758

58-
def get_pools_on_lb(db_lb):
59+
def get_pools_on_lb(db_lb, for_delete=False):
5960
"""Get a list of the pools on a load balancer.
6061
6162
:param db_lb: A load balancer database model object.
63+
:param for_delete: Skip errors on tls certs loading.
6264
:returns: A list of provider dict format pools.
6365
"""
6466
pool_dicts = []
6567
for pool in db_lb.pools:
66-
prov_pool = provider_utils.db_pool_to_provider_pool(pool)
68+
prov_pool = provider_utils.db_pool_to_provider_pool(pool, for_delete)
6769
pool_dicts.append(prov_pool.to_dict())
6870
return pool_dicts
6971

octavia/tests/unit/controller/worker/v2/test_controller_worker.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from octavia.controller.worker.v2.flows import flow_utils
2828
import octavia.tests.unit.base as base
2929

30-
30+
TLS_CERT_ID = uuidutils.generate_uuid()
3131
AMP_ID = uuidutils.generate_uuid()
3232
LB_ID = uuidutils.generate_uuid()
3333
LISTENER_ID = uuidutils.generate_uuid()
@@ -771,6 +771,61 @@ def test_delete_load_balancer_with_cascade(self,
771771
})
772772
)
773773

774+
@mock.patch(
775+
"octavia.common.tls_utils.cert_parser.load_certificates_data",
776+
side_effect=RuntimeError
777+
)
778+
def test_delete_load_balancer_with_cascade_tls_unavailable(
779+
self,
780+
mock_load_tls_cert,
781+
mock_api_get_session,
782+
mock_dyn_log_listener,
783+
mock_taskflow_load,
784+
mock_pool_repo_get,
785+
mock_member_repo_get,
786+
mock_l7rule_repo_get,
787+
mock_l7policy_repo_get,
788+
mock_listener_repo_get,
789+
mock_lb_repo_get,
790+
mock_health_mon_repo_get,
791+
mock_amp_repo_get
792+
):
793+
_flow_mock.reset_mock()
794+
795+
_listener_mock.tls_certificate_id = TLS_CERT_ID
796+
_listener_mock.to_dict.return_value[
797+
constants.TLS_CERTIFICATE_ID] = TLS_CERT_ID
798+
799+
cw = controller_worker.ControllerWorker()
800+
cw.delete_load_balancer(_load_balancer_mock, cascade=True)
801+
802+
mock_lb_repo_get.assert_called_once_with(
803+
_db_session,
804+
id=LB_ID)
805+
806+
# Check load_certificates_data called and error is raised
807+
# Error must be ignored because it is not critical for current flow
808+
mock_load_tls_cert.assert_called_once()
809+
810+
listener_list = [{constants.LISTENER_ID: LISTENER_ID,
811+
constants.LOADBALANCER_ID: LB_ID,
812+
constants.PROJECT_ID: PROJECT_ID,
813+
"default_tls_container_ref": TLS_CERT_ID}]
814+
815+
(cw.services_controller.run_poster.
816+
assert_called_once_with(
817+
flow_utils.get_cascade_delete_load_balancer_flow,
818+
_load_balancer_mock, listener_list, [],
819+
store={constants.LOADBALANCER: _load_balancer_mock,
820+
constants.LOADBALANCER_ID: LB_ID,
821+
constants.SERVER_GROUP_ID:
822+
_db_load_balancer_mock.server_group_id,
823+
constants.PROJECT_ID: _db_load_balancer_mock.project_id,
824+
})
825+
)
826+
827+
_listener_mock.reset_mock()
828+
774829
@mock.patch('octavia.db.repositories.ListenerRepository.get_all',
775830
return_value=([_listener_mock], None))
776831
def test_update_load_balancer(self,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
fixes:
3+
- |
4+
Fix load balancer stuck in PENDING_DELETE if TLS storage unavailable or
5+
returns error

0 commit comments

Comments
 (0)