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:
parent
68251e4b41
commit
2428bf88e6
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue