Skip to content

Commit ec9a505

Browse files
LydinaPavuhjohnsom
authored andcommitted
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]>
1 parent a4317a8 commit ec9a505

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
@@ -431,8 +431,8 @@ def delete_load_balancer(self, load_balancer, cascade=False):
431431
constants.SERVER_GROUP_ID: db_lb.server_group_id,
432432
constants.PROJECT_ID: db_lb.project_id}
433433
if cascade:
434-
listeners = flow_utils.get_listeners_on_lb(db_lb)
435-
pools = flow_utils.get_pools_on_lb(db_lb)
434+
listeners = flow_utils.get_listeners_on_lb(db_lb, True)
435+
pools = flow_utils.get_pools_on_lb(db_lb, True)
436436

437437
self.run_flow(
438438
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
@@ -40,29 +40,31 @@ def get_delete_load_balancer_flow(lb):
4040
return LB_FLOWS.get_delete_load_balancer_flow(lb)
4141

4242

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

5657

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

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()
@@ -804,6 +804,61 @@ def test_delete_load_balancer_with_cascade(self,
804804
})
805805
)
806806

807+
@mock.patch(
808+
"octavia.common.tls_utils.cert_parser.load_certificates_data",
809+
side_effect=RuntimeError
810+
)
811+
def test_delete_load_balancer_with_cascade_tls_unavailable(
812+
self,
813+
mock_load_tls_cert,
814+
mock_api_get_session,
815+
mock_dyn_log_listener,
816+
mock_taskflow_load,
817+
mock_pool_repo_get,
818+
mock_member_repo_get,
819+
mock_l7rule_repo_get,
820+
mock_l7policy_repo_get,
821+
mock_listener_repo_get,
822+
mock_lb_repo_get,
823+
mock_health_mon_repo_get,
824+
mock_amp_repo_get
825+
):
826+
_flow_mock.reset_mock()
827+
828+
_listener_mock.tls_certificate_id = TLS_CERT_ID
829+
_listener_mock.to_dict.return_value[
830+
constants.TLS_CERTIFICATE_ID] = TLS_CERT_ID
831+
832+
cw = controller_worker.ControllerWorker()
833+
cw.delete_load_balancer(_load_balancer_mock, cascade=True)
834+
835+
mock_lb_repo_get.assert_called_once_with(
836+
_db_session,
837+
id=LB_ID)
838+
839+
# Check load_certificates_data called and error is raised
840+
# Error must be ignored because it is not critical for current flow
841+
mock_load_tls_cert.assert_called_once()
842+
843+
listener_list = [{constants.LISTENER_ID: LISTENER_ID,
844+
constants.LOADBALANCER_ID: LB_ID,
845+
constants.PROJECT_ID: PROJECT_ID,
846+
"default_tls_container_ref": TLS_CERT_ID}]
847+
848+
(cw.services_controller.run_poster.
849+
assert_called_once_with(
850+
flow_utils.get_cascade_delete_load_balancer_flow,
851+
_load_balancer_mock, listener_list, [],
852+
store={constants.LOADBALANCER: _load_balancer_mock,
853+
constants.LOADBALANCER_ID: LB_ID,
854+
constants.SERVER_GROUP_ID:
855+
_db_load_balancer_mock.server_group_id,
856+
constants.PROJECT_ID: _db_load_balancer_mock.project_id,
857+
})
858+
)
859+
860+
_listener_mock.reset_mock()
861+
807862
@mock.patch('octavia.db.repositories.ListenerRepository.get_all',
808863
return_value=([_listener_mock], None))
809864
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)