Merge "Fix OVN LB Delete events for NB driver"

This commit is contained in:
Zuul 2024-03-04 12:11:03 +00:00 committed by Gerrit Code Review
commit aa87c61831
5 changed files with 245 additions and 120 deletions

View File

@ -59,3 +59,16 @@ def get_prefixes_from_ips(ips: 'list[str]') -> 'list[str]':
return ['/'.join([ipaddress.ip_network(ip, strict=False)[0].compressed, return ['/'.join([ipaddress.ip_network(ip, strict=False)[0].compressed,
ip.split('/')[-1]]) ip.split('/')[-1]])
for ip in ips] for ip in ips]
def remove_port_from_ip(ip_address):
last_colon_index = ip_address.rfind(':')
# no port
if last_colon_index == -1:
return ip_address
# check if right side from index is a digit, in positive case remove it.
# For IPv6 it will come on format [ipv6]:port, so will also remove
# correctly just only the port
if ip_address[last_colon_index + 1:].isdigit():
return ip_address[:last_colon_index]
return ip_address

View File

@ -16,6 +16,7 @@ from oslo_log import log as logging
from ovsdbapp.backend.ovs_idl import event as row_event from ovsdbapp.backend.ovs_idl import event as row_event
from ovn_bgp_agent import constants from ovn_bgp_agent import constants
from ovn_bgp_agent.drivers.openstack.utils import driver_utils
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -56,11 +57,32 @@ class OVNLBEvent(Event):
except (AttributeError, KeyError): except (AttributeError, KeyError):
return return
def _get_vip_fip(self, row): def _get_ip_from_vips(self, row):
return [driver_utils.remove_port_from_ip(ipport)
for ipport in getattr(row, 'vips', {}).keys()]
def _get_diff_ip_from_vips(self, new, old):
"""Returns a list of IPs that are present in 'new' but not in 'old'
Note: As LB VIP contains a port (e.g., '192.168.1.1:80'), the port part
is removed before comparison.
"""
return list(set(self._get_ip_from_vips(new)) -
set(self._get_ip_from_vips(old)))
def _is_vip_or_fip(self, row, ip, key):
try: try:
return row.external_ids[constants.OVN_LB_VIP_FIP_EXT_ID_KEY] return ip == row.external_ids.get(key)
except (AttributeError, KeyError): except AttributeError:
return pass
def _is_vip(self, row, ip):
return self._is_vip_or_fip(row, ip, constants.OVN_LB_VIP_IP_EXT_ID_KEY)
def _is_fip(self, row, ip):
return self._is_vip_or_fip(row,
ip,
constants.OVN_LB_VIP_FIP_EXT_ID_KEY)
class LSPChassisEvent(Event): class LSPChassisEvent(Event):

View File

@ -632,10 +632,14 @@ class OVNLBCreateEvent(base_watcher.OVNLBEvent):
if lb_router not in self.agent.ovn_local_cr_lrps.keys(): if lb_router not in self.agent.ovn_local_cr_lrps.keys():
return False return False
# Only expose if there is a modification in the VIPS # Expose if there is a modification in the VIPS, first new item (
# And only expose if it is the first item on VIPs # that could happend with and non existing vips on old event or
# empty one) or additional items because a bigger row.vips is
# including old.vips
if hasattr(old, 'vips'): if hasattr(old, 'vips'):
if not old.vips and row.vips: if ((not old.vips and row.vips) or
(old.vips != row.vips and
set(old.vips.keys()).issubset(set(row.vips.keys())))):
return True return True
if hasattr(old, 'external_ids'): if hasattr(old, 'external_ids'):
@ -643,25 +647,28 @@ class OVNLBCreateEvent(base_watcher.OVNLBEvent):
old_lb_router = self._get_router(old) old_lb_router = self._get_router(old)
if lb_router != old_lb_router: if lb_router != old_lb_router:
return True return True
# Also check if there is a vip_fip addition to expose the FIP except AttributeError:
vip_fip = self._get_vip_fip(row)
if not vip_fip:
return False
old_vip_fip = self._get_vip_fip(old)
if vip_fip != old_vip_fip:
return True
except (IndexError, AttributeError):
return False return False
return False return False
def _run(self, event, row, old): def _run(self, event, row, old):
vip_fip = self._get_vip_fip(row) # vips field grows
old_vip_fip = self._get_vip_fip(old) diff = self._get_diff_ip_from_vips(row, old)
with _SYNC_STATE_LOCK.read_lock(): for ip in diff:
if hasattr(old, 'external_ids') and vip_fip != old_vip_fip: with _SYNC_STATE_LOCK.read_lock():
self.agent.expose_ovn_lb_fip(row) if self._is_vip(row, ip):
else: self.agent.expose_ovn_lb_vip(row)
self.agent.expose_ovn_lb_vip(row) elif self._is_fip(row, ip):
self.agent.expose_ovn_lb_fip(row)
# router set ext-gw
# NOTE(froyo): Not needed to check/call to expose_ovn_lb_fip, since up
# to this point this LB could not have been associated with a FIP
# since the subnet did not have access to the public network
if hasattr(old, 'external_ids'):
with _SYNC_STATE_LOCK.read_lock():
if self._get_router(old) != self._get_router(row):
self.agent.expose_ovn_lb_vip(row)
class OVNLBDeleteEvent(base_watcher.OVNLBEvent): class OVNLBDeleteEvent(base_watcher.OVNLBEvent):
@ -685,9 +692,7 @@ class OVNLBDeleteEvent(base_watcher.OVNLBEvent):
# ROW UPDATE EVENT # ROW UPDATE EVENT
lb_router = self._get_router(row) lb_router = self._get_router(row)
old_external_ids = False
if hasattr(old, 'external_ids'): if hasattr(old, 'external_ids'):
old_external_ids = True
old_lb_router = self._get_router(old) old_lb_router = self._get_router(old)
if not old_lb_router: if not old_lb_router:
return False return False
@ -697,40 +702,44 @@ class OVNLBDeleteEvent(base_watcher.OVNLBEvent):
# Router should not be removed, but if that is the case we # Router should not be removed, but if that is the case we
# should remove the loadbalancer # should remove the loadbalancer
return True return True
# Also check if the vip_fip is removed to withdraw the FIP
vip_fip = self._get_vip_fip(row)
old_vip_fip = self._get_vip_fip(old)
if old_vip_fip and old_vip_fip != vip_fip:
return True
# Withdraw IP if VIPs is removed # Whatever the change removing any field from vips should be manage
if hasattr(old, 'vips'): if hasattr(old, 'vips'):
if old.vips and not row.vips: if ((old.vips != row.vips and
if old_external_ids: set(row.vips.keys()).issubset(
old_lb_router = self._get_router(old) set(old.vips.keys())))):
return (old_lb_router in return True
self.agent.ovn_local_cr_lrps.keys()) except AttributeError:
else:
return (lb_router in
self.agent.ovn_local_cr_lrps.keys())
except (IndexError, AttributeError):
return False return False
return False return False
def _run(self, event, row, old): def _run(self, event, row, old):
vip_fip = self._get_vip_fip(row) # DELETE event need drop all
old_vip_fip = self._get_vip_fip(old) if event == self.ROW_DELETE:
with _SYNC_STATE_LOCK.read_lock(): diff = self._get_ip_from_vips(row)
if event == self.ROW_DELETE: for ip in diff:
self.agent.withdraw_ovn_lb_vip(row) with _SYNC_STATE_LOCK.read_lock():
if vip_fip: if self._is_vip(row, ip):
self.agent.withdraw_ovn_lb_fip(row) self.agent.withdraw_ovn_lb_vip(row)
else: elif self._is_fip(row, ip):
if not vip_fip and vip_fip != old_vip_fip: self.agent.withdraw_ovn_lb_fip(row)
return
# UPDATE event
# vips field decrease
diff = self._get_diff_ip_from_vips(old, row)
for ip in diff:
with _SYNC_STATE_LOCK.read_lock():
if self._is_vip(old, ip):
self.agent.withdraw_ovn_lb_vip(old)
elif self._is_fip(old, ip):
self.agent.withdraw_ovn_lb_fip(old) self.agent.withdraw_ovn_lb_fip(old)
if hasattr(old, 'vips'): # router unset ext-gw
self.agent.withdraw_ovn_lb_vip(row) if hasattr(old, 'external_ids'):
with _SYNC_STATE_LOCK.read_lock():
if self._get_router(old) != self._get_router(row):
self.agent.withdraw_ovn_lb_vip(old)
class OVNPFBaseEvent(base_watcher.OVNLBEvent): class OVNPFBaseEvent(base_watcher.OVNLBEvent):

View File

@ -69,12 +69,38 @@ class TestOVNLBEvent(test_base.TestCase):
row = utils.create_row(external_ids={}) row = utils.create_row(external_ids={})
self.assertEqual(None, self.ovnlb_event._get_router(row)) self.assertEqual(None, self.ovnlb_event._get_router(row))
def test__get_vip_fip(self): def test__is_vip(self):
row = utils.create_row( row = utils.create_row(
external_ids={constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip'}) external_ids={constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50',
self.assertEqual('fip', self.ovnlb_event._get_vip_fip(row)) constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertFalse(self.ovnlb_event._is_vip(row, '172.24.4.5'))
self.assertTrue(self.ovnlb_event._is_vip(row, '192.168.1.50'))
row = utils.create_row(external_ids={}) row = utils.create_row(external_ids={})
self.assertEqual(None, self.ovnlb_event._get_vip_fip(row)) self.assertFalse(self.ovnlb_event._is_vip(row, '172.24.4.5'))
self.assertFalse(self.ovnlb_event._is_vip(row, '192.168.1.50'))
def test__is_fip(self):
row = utils.create_row(
external_ids={constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertTrue(self.ovnlb_event._is_fip(row, '172.24.4.5'))
self.assertFalse(self.ovnlb_event._is_fip(row, '192.168.1.50'))
row = utils.create_row(external_ids={})
self.assertFalse(self.ovnlb_event._is_fip(row, '172.24.4.5'))
self.assertFalse(self.ovnlb_event._is_fip(row, '192.168.1.50'))
def test__get_ip_from_vips(self):
row = utils.create_row(
external_ids={constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertEqual(self.ovnlb_event._get_ip_from_vips(row),
['192.168.1.50', '172.24.4.5'])
class FakeLSPChassisEvent(base_watcher.LSPChassisEvent): class FakeLSPChassisEvent(base_watcher.LSPChassisEvent):

View File

@ -1,4 +1,3 @@
# Copyright 2023 Red Hat, Inc. # Copyright 2023 Red Hat, Inc.
# All Rights Reserved. # All Rights Reserved.
# #
@ -1189,9 +1188,10 @@ class TestOVNLBCreateEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row(vips={}) old = utils.create_row(vips={})
self.assertTrue(self.event.match_fn(mock.Mock(), row, old)) self.assertTrue(self.event.match_fn(mock.Mock(), row, old))
@ -1199,9 +1199,10 @@ class TestOVNLBCreateEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row(external_ids={}) old = utils.create_row(external_ids={})
self.assertTrue(self.event.match_fn(mock.Mock(), row, old)) self.assertTrue(self.event.match_fn(mock.Mock(), row, old))
@ -1209,18 +1210,34 @@ class TestOVNLBCreateEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
old = utils.create_row(external_ids={ '172.24.4.5:80': '192.168.1.100:80'})
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1'}) old = utils.create_row(
external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1'},
vips={'192.168.1.50:80': '192.168.1.100:80'})
self.assertTrue(self.event.match_fn(mock.Mock(), row, old)) self.assertTrue(self.event.match_fn(mock.Mock(), row, old))
def test_match_fn_vips_no_change(self):
row = utils.create_row(
external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row(
external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1'})
self.assertFalse(self.event.match_fn(mock.Mock(), row, old))
def test_match_fn_no_vips(self): def test_match_fn_no_vips(self):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={}) vips={})
self.assertFalse(self.event.match_fn(mock.Mock(), row, mock.Mock())) self.assertFalse(self.event.match_fn(mock.Mock(), row, mock.Mock()))
@ -1229,18 +1246,19 @@ class TestOVNLBCreateEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router2', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router2',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertFalse(self.event.match_fn(mock.Mock(), row, mock.Mock())) self.assertFalse(self.event.match_fn(mock.Mock(), row, mock.Mock()))
def test_run_vip(self): def test_run_vip(self):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80'})
old = utils.create_row(vips={}) old = utils.create_row(vips={})
self.event.run(None, row, old) self.event.run(None, row, old)
@ -1248,19 +1266,37 @@ class TestOVNLBCreateEvent(test_base.TestCase):
self.agent.expose_ovn_lb_vip.assert_called_once_with(row) self.agent.expose_ovn_lb_vip.assert_called_once_with(row)
self.agent.expose_ovn_lb_fip.assert_not_called() self.agent.expose_ovn_lb_fip.assert_not_called()
def test_run_vip_and_fip(self):
row = utils.create_row(
external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row(vips={})
self.event.run(None, row, old)
self.agent.expose_ovn_lb_vip.assert_called_once_with(row)
self.agent.expose_ovn_lb_fip.assert_called_once_with(row)
def test_run_vip_added_router(self): def test_run_vip_added_router(self):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1', constants.OVN_LS_NAME_EXT_ID_KEY: 'net1',
'other': 'info'}, 'other': 'info'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row( old = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}) constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.event.run(None, row, old) self.event.run(None, row, old)
self.agent.expose_ovn_lb_vip.assert_called_once_with(row) self.agent.expose_ovn_lb_vip.assert_called_once_with(row)
@ -1270,9 +1306,10 @@ class TestOVNLBCreateEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row(external_ids={ old = utils.create_row(external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1'}) constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1'})
@ -1300,10 +1337,12 @@ class TestOVNLBDeleteEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={}) vips={})
old = utils.create_row(vips={'vip': 'member', 'fip': 'member'}) old = utils.create_row(
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertTrue(self.event.match_fn(mock.Mock(), row, old)) self.assertTrue(self.event.match_fn(mock.Mock(), row, old))
def test_match_fn_delete(self): def test_match_fn_delete(self):
@ -1311,9 +1350,10 @@ class TestOVNLBDeleteEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertTrue(self.event.match_fn(event, row, mock.Mock())) self.assertTrue(self.event.match_fn(event, row, mock.Mock()))
def test_match_fn_delete_no_vips(self): def test_match_fn_delete_no_vips(self):
@ -1321,7 +1361,7 @@ class TestOVNLBDeleteEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={}) vips={})
self.assertFalse(self.event.match_fn(event, row, mock.Mock())) self.assertFalse(self.event.match_fn(event, row, mock.Mock()))
@ -1331,17 +1371,19 @@ class TestOVNLBDeleteEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router2', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router2',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertFalse(self.event.match_fn(event, row, mock.Mock())) self.assertFalse(self.event.match_fn(event, row, mock.Mock()))
def test_match_fn_router_deleted(self): def test_match_fn_router_deleted(self):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row(external_ids={ old = utils.create_row(external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1' constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1'
}) })
@ -1351,18 +1393,20 @@ class TestOVNLBDeleteEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row(external_ids={}) old = utils.create_row(external_ids={})
self.assertFalse(self.event.match_fn(mock.Mock(), row, old)) self.assertFalse(self.event.match_fn(mock.Mock(), row, old))
def test_match_fn_old_router_non_local(self): def test_match_fn_old_router_non_local(self):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
old = utils.create_row(external_ids={ old = utils.create_row(external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router2', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router2',
}) })
@ -1372,41 +1416,48 @@ class TestOVNLBDeleteEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
vips={'vip': 'member', 'fip': 'member'}) constants.OVN_LS_NAME_EXT_ID_KEY: 'net1',
old = utils.create_row(external_ids={ constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50'},
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', vips={'192.168.1.50:80': '192.168.1.100:80'})
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip'}) old = utils.create_row(
external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertTrue(self.event.match_fn(mock.Mock(), row, old)) self.assertTrue(self.event.match_fn(mock.Mock(), row, old))
def test_match_fn_vip_deleted_with_ext_id_update(self): def test_match_fn_vip_deleted_with_ext_id_update(self):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={}) vips={})
old = utils.create_row( old = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1', constants.OVN_LS_NAME_EXT_ID_KEY: 'net1',
'other': 'info'}, constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.assertTrue(self.event.match_fn(mock.Mock(), row, old)) self.assertTrue(self.event.match_fn(mock.Mock(), row, old))
def test_run_vip(self): def test_run_vip_delete_without_external_ids_on_old(self):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={}) vips={})
old = utils.create_row(vips={'vip': 'member'}) old = utils.create_row(vips={'192.168.1.50:80': '192.168.1.100:80'})
self.event.run(None, row, old) self.event.run(None, row, old)
self.agent.withdraw_ovn_lb_vip.assert_called_once_with(row) self.agent.withdraw_ovn_lb_vip.assert_not_called()
self.agent.withdraw_ovn_lb_fip.assert_not_called() self.agent.withdraw_ovn_lb_fip.assert_not_called()
def test_run_vip_delete(self): def test_run_vip_delete(self):
@ -1414,43 +1465,47 @@ class TestOVNLBDeleteEvent(test_base.TestCase):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LS_NAME_EXT_ID_KEY: 'net1',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50'},
vips={}) vips={'192.168.1.50:80': '192.168.1.100:80'})
self.event.run(event, row, None) self.event.run(event, row, None)
self.agent.withdraw_ovn_lb_vip.assert_called_once_with(row) self.agent.withdraw_ovn_lb_vip.assert_called_once_with(row)
self.agent.withdraw_ovn_lb_fip.assert_called_once_with(row)
def test_run_vip_deleted_extra_ext_id_info(self): def test_run_vip_deleted_extra_ext_id_info(self):
row = utils.create_row(
external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'})
old = utils.create_row( old = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip', constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LB_VIP_IP_EXT_ID_KEY: '192.168.1.50',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
row = utils.create_row(
external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1', constants.OVN_LS_NAME_EXT_ID_KEY: 'net1',
'other': 'info'}) 'other': 'info'},
vips={})
self.event.run(None, row, old) self.event.run(None, row, old)
self.agent.withdraw_ovn_lb_vip.assert_not_called() self.agent.withdraw_ovn_lb_vip.assert_called_once_with(old)
self.agent.withdraw_ovn_lb_fip.assert_not_called() self.agent.withdraw_ovn_lb_fip.assert_called_once_with(old)
def test_run_fip(self): def test_run_fip(self):
row = utils.create_row( row = utils.create_row(
external_ids={ external_ids={
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'}, constants.OVN_LS_NAME_EXT_ID_KEY: 'net1'},
vips={'vip': 'member', 'fip': 'member'}) vips={'192.168.1.50:80': '192.168.1.100:80'})
old = utils.create_row(external_ids={ old = utils.create_row(
constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1', external_ids={
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: 'fip'}) constants.OVN_LB_LR_REF_EXT_ID_KEY: 'neutron-router1',
constants.OVN_LB_VIP_FIP_EXT_ID_KEY: '172.24.4.5'},
vips={'192.168.1.50:80': '192.168.1.100:80',
'172.24.4.5:80': '192.168.1.100:80'})
self.event.run(None, row, old) self.event.run(None, row, old)