Remove HM uuiid from LB external_ids when the HM's pool is deleted

The expected behavior when a HM is deleted is that any reference to it
in the LB's external_ids must be cleanup or removed. Until this patch,
this reference was not removed when the pool associated to the HM
is deleted.

Closes-Bug: #2008695
Change-Id: Ieeef917d9e293af27e5feed14335f25fd9a6fb48
(cherry picked from commit cc30eae60c)
This commit is contained in:
Fernando Royo 2023-02-27 12:10:25 +01:00
parent 68251e4b41
commit 2428bf88e6
4 changed files with 57 additions and 9 deletions

View File

@ -146,6 +146,9 @@ class OvnProviderDriver(driver_base.ProviderDriver):
self.health_monitor_create(pool.healthmonitor)
def pool_delete(self, pool):
if pool.healthmonitor:
self.health_monitor_delete(pool.healthmonitor)
for member in pool.members:
self.member_delete(member)

View File

@ -2777,15 +2777,22 @@ class OvnProviderHelper():
commands.append(
self.ovn_nbdb_api.db_remove('Load_Balancer', ovn_lb.uuid,
'health_check', lbhc.uuid))
commands.append(
self.ovn_nbdb_api.db_set(
'Load_Balancer', ovn_lb.uuid,
('external_ids', {ovn_const.LB_EXT_IDS_HMS_KEY:
jsonutils.dumps(hms_key)})))
for lbhc in lbhcs:
commands.append(
self.ovn_nbdb_api.db_destroy('Load_Balancer_Health_Check',
lbhc.uuid))
if hms_key:
commands.append(
self.ovn_nbdb_api.db_set(
'Load_Balancer', ovn_lb.uuid,
('external_ids', {
ovn_const.LB_EXT_IDS_HMS_KEY:
jsonutils.dumps(hms_key)})))
else:
commands.append(
self.ovn_nbdb_api.db_remove(
'Load_Balancer', ovn_lb.uuid,
'external_ids', (ovn_const.LB_EXT_IDS_HMS_KEY)))
self._execute_commands(commands)
# Delete the hm port if not in use by other health monitors

View File

@ -898,24 +898,31 @@ class TestOvnProviderDriver(ovn_base.TestOvnOctaviaBase):
self.driver.pool_delete(self.ref_pool)
self.mock_add_request.assert_called_once_with(expected)
def test_pool_delete_with_members(self):
def test_pool_delete_with_members_and_hm(self):
self.ref_pool.healthmonitor = self.ref_health_monitor
info = {'id': self.ref_pool.pool_id,
'protocol': self.ref_pool.protocol,
'loadbalancer_id': self.ref_pool.loadbalancer_id}
expected = {'type': ovn_const.REQ_TYPE_POOL_DELETE,
'info': info}
info_hm = {'id': self.ref_pool.healthmonitor.healthmonitor_id,
'pool_id': self.ref_pool.pool_id}
info_member = {'id': self.ref_member.member_id,
'pool_id': self.ref_member.pool_id,
'subnet_id': self.ref_member.subnet_id,
'protocol_port': self.ref_member.protocol_port,
'address': self.ref_member.address}
expected_hm = {
'type': ovn_const.REQ_TYPE_HM_DELETE,
'info': info_hm}
expected_members = {
'type': ovn_const.REQ_TYPE_MEMBER_DELETE,
'info': info_member}
expected_members_dvr = {
'type': ovn_const.REQ_TYPE_HANDLE_MEMBER_DVR,
'info': mock.ANY}
calls = [mock.call(expected_members),
calls = [mock.call(expected_hm),
mock.call(expected_members),
mock.call(expected_members_dvr),
mock.call(expected)]
self.driver.pool_delete(self.ref_pool)

View File

@ -3918,7 +3918,9 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase):
'ip_port_mappings')]
expected_remove_calls = [
mock.call('Load_Balancer', self.ovn_hm_lb.uuid, 'health_check',
self.ovn_hm.uuid)]
self.ovn_hm.uuid),
mock.call('Load_Balancer', self.ovn_hm_lb.uuid,
'external_ids', ovn_const.LB_EXT_IDS_HMS_KEY)]
expected_destroy_calls = [
mock.call('Load_Balancer_Health_Check', self.ovn_hm.uuid)]
del_hm_port.assert_called_once_with(self.member_subnet_id)
@ -3988,6 +3990,35 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase):
constants.NO_MONITOR)
self.helper.ovn_nbdb_api.db_clear.assert_not_called()
@mock.patch.object(ovn_helper.OvnProviderHelper, '_find_ovn_lb_from_hm_id')
def test_hm_delete_hm_not_found_in_external_ids(self, folbfhi):
folbfhi.return_value = (self.ovn_hm, self.ovn_hm_lb)
self.ovn_hm_lb.external_ids[ovn_const.LB_EXT_IDS_HMS_KEY] = []
status = self.helper.hm_delete(self.health_monitor)
self.assertEqual(status['healthmonitors'][0]['provisioning_status'],
constants.DELETED)
self.assertEqual(status['healthmonitors'][0]['operating_status'],
constants.NO_MONITOR)
@mock.patch.object(ovn_helper.OvnProviderHelper, '_find_ovn_lb_from_hm_id')
def test_hm_delete_hm_not_match_in_external_ids(self, folbfhi):
folbfhi.return_value = (self.ovn_hm, self.ovn_hm_lb)
self.ovn_hm_lb.external_ids[ovn_const.LB_EXT_IDS_HMS_KEY] = \
'["%s"]' % (uuidutils.generate_uuid())
status = self.helper.hm_delete(self.health_monitor)
self.assertEqual(status['healthmonitors'][0]['provisioning_status'],
constants.DELETED)
self.assertEqual(status['healthmonitors'][0]['operating_status'],
constants.NO_MONITOR)
expected_set_external_ids_calls = [
mock.call('Load_Balancer', self.ovn_hm_lb.uuid,
('external_ids', {
ovn_const.LB_EXT_IDS_HMS_KEY:
self.ovn_hm_lb.external_ids[
ovn_const.LB_EXT_IDS_HMS_KEY]}))]
self.helper.ovn_nbdb_api.db_set.assert_has_calls(
expected_set_external_ids_calls)
def test_hm_update_event_offline(self):
self.helper.ovn_nbdb_api.db_find_rows.return_value.\
execute.return_value = [self.ovn_hm_lb]