Update NB driver to re-use new methods and make code cleaner

Change-Id: I6c3520dfe9bddb30008f61bbbf0d1bc2f4ed30a2
This commit is contained in:
Michel Nederlof 2024-01-29 15:50:56 +01:00
parent 6e0d576650
commit 31c241ce6c
2 changed files with 40 additions and 79 deletions
ovn_bgp_agent
drivers/openstack
tests/unit/drivers/openstack

@ -58,7 +58,7 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
self._post_start_event = threading.Event()
@property
def nb_idl(self):
def nb_idl(self) -> ovn.OvsdbNbOvnIdl:
if not self._nb_idl:
self._post_start_event.wait()
return self._nb_idl
@ -83,7 +83,7 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
self.ovn_routing_tables = {} # {'br-ex': 200}
# {'br-ex': [route1, route2]}
self.ovn_routing_tables_routes = collections.defaultdict()
self.ovn_routing_tables_routes = collections.defaultdict(list)
self.ovn_local_cr_lrps = {}
self.ovn_local_lrps = {}
@ -223,28 +223,12 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
logical_switch = port.external_ids.get(
constants.OVN_LS_NAME_EXT_ID_KEY)
if not logical_switch:
return
if self.ovn_tenant_ls.get(logical_switch):
if not self.is_ls_provider(logical_switch):
return
bridge_info = self.ovn_provider_ls.get(logical_switch)
if bridge_info:
# already known provider ls
bridge_device = bridge_info['bridge_device']
bridge_vlan = bridge_info['bridge_vlan']
else:
localnet, bridge_device, bridge_vlan = self._get_ls_localnet_info(
logical_switch)
if not bridge_device:
# This means it is not a provider network
self.ovn_tenant_ls[logical_switch] = True
return False
if not self.ovn_provider_ls.get(logical_switch):
self.ovn_provider_ls[logical_switch] = {
'bridge_device': bridge_device,
'bridge_vlan': bridge_vlan,
'localnet': localnet}
_, bridge_device, bridge_vlan = self._get_provider_ls_info(
logical_switch)
ips = port.addresses[0].strip().split(' ')[1:]
mac = port.addresses[0].strip().split(' ')[0]
self._expose_ip(ips, mac, logical_switch, bridge_device, bridge_vlan,
@ -257,18 +241,12 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
logical_switch = port.external_ids.get(
constants.OVN_LS_NAME_EXT_ID_KEY)
if not logical_switch:
if not self.is_ls_provider(logical_switch):
return
localnet, bridge_device, bridge_vlan = self._get_ls_localnet_info(
_, bridge_device, bridge_vlan = self._get_provider_ls_info(
logical_switch)
if not bridge_device:
return
self.ovn_provider_ls[logical_switch] = {
'bridge_device': bridge_device,
'bridge_vlan': bridge_vlan,
'localnet': localnet}
ips = [net.split("/")[0] for net in port.networks]
router = port.external_ids.get(constants.OVN_LR_NAME_EXT_ID_KEY)
self._expose_ip(ips, port.mac, logical_switch, bridge_device,
@ -401,30 +379,12 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
- VM IP on the provider network
'''
logical_switch = ips_info.get('logical_switch')
if not logical_switch:
if not self.is_ls_provider(logical_switch):
return False
bridge_info = self.ovn_provider_ls.get(logical_switch)
if bridge_info:
# already known provider ls
bridge_device = bridge_info['bridge_device']
bridge_vlan = bridge_info['bridge_vlan']
localnet = bridge_info['localnet']
else:
localnet, bridge_device, bridge_vlan = self._get_ls_localnet_info(
logical_switch)
if not bridge_device:
# This means it is not a provider network
self.ovn_tenant_ls[logical_switch] = True
return False
if bridge_device not in self.ovn_bridge_mappings.values():
# This node is not properly configured, no need to expose it
return False
if not self.ovn_provider_ls.get(logical_switch):
self.ovn_provider_ls[logical_switch] = {
'bridge_device': bridge_device,
'bridge_vlan': bridge_vlan,
'localnet': localnet}
_, bridge_device, bridge_vlan = self._get_provider_ls_info(
logical_switch)
mac = ips_info.get('mac')
return self._expose_ip(ips, mac, logical_switch, bridge_device,
bridge_vlan, port_type=ips_info['type'],
@ -592,26 +552,12 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
return self._expose_fip(ip, mac, logical_switch, row)
def _expose_fip(self, ip, mac, logical_switch, row):
bridge_info = self.ovn_provider_ls.get(logical_switch)
if bridge_info:
# already known provider ls
bridge_device = bridge_info['bridge_device']
bridge_vlan = bridge_info['bridge_vlan']
localnet = bridge_info['localnet']
else:
localnet, bridge_device, bridge_vlan = self._get_ls_localnet_info(
logical_switch)
if not bridge_device:
# This means it is not a provider network
return False
if bridge_device not in self.ovn_bridge_mappings.values():
# This node is not properly configured, no need to expose it
return False
if not self.ovn_provider_ls.get(logical_switch):
self.ovn_provider_ls[logical_switch] = {
'bridge_device': bridge_device,
'bridge_vlan': bridge_vlan,
'localnet': localnet}
if not self.is_ls_provider(logical_switch):
return False
localnet, bridge_device, bridge_vlan = self._get_provider_ls_info(
logical_switch)
tenant_logical_switch = row.external_ids.get(
constants.OVN_LS_NAME_EXT_ID_KEY)
if not tenant_logical_switch:
@ -861,7 +807,7 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
self._expose_remote_ip([vip_ip], ips_info)
else:
# It is a VIP on a provider network
localnet, bridge_device, bridge_vlan = self._get_ls_localnet_info(
localnet, bridge_device, bridge_vlan = self._get_provider_ls_info(
vip_net)
self._expose_provider_port([vip_ip], None, vip_net, bridge_device,
bridge_vlan, localnet)

@ -273,11 +273,11 @@ class TestNBOVNBGPDriver(test_base.TestCase):
@mock.patch.object(linux_net, 'get_ip_version')
def test__ensure_lsp_exposed_no_fip_no_tenant_ls(self, mock_ip_version):
port0 = fakes.create_object({
'name': 'port-0',
'addresses': ["fake_mac 192.168.0.10"],
'type': constants.OVN_VM_VIF_PORT_TYPE,
'external_ids': {constants.OVN_LS_NAME_EXT_ID_KEY: "test-ls"}})
port0 = utils.create_row(
name='port-0',
addresses=["fake_mac 192.168.0.10"],
type=constants.OVN_VM_VIF_PORT_TYPE,
external_ids={constants.OVN_LS_NAME_EXT_ID_KEY: "test-ls"})
self.nb_bgp_driver.ovn_tenant_ls = {}
self.nb_bgp_driver.ovn_provider_ls = {}
@ -289,6 +289,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
mock_expose_ip = mock.patch.object(
self.nb_bgp_driver, '_expose_ip').start()
mock_expose_ip.return_value = ['192.168.0.10']
mock_is_ls_provider = mock.patch.object(
self.nb_bgp_driver, 'is_ls_provider', return_value=True).start()
mock_get_ls_localnet_info = mock.patch.object(
self.nb_bgp_driver, '_get_ls_localnet_info').start()
mock_get_ls_localnet_info.return_value = ('fake-localnet', 'br-ex', 10)
@ -297,6 +299,7 @@ class TestNBOVNBGPDriver(test_base.TestCase):
self.nb_bgp_driver._ensure_lsp_exposed(port0)
mock_get_port_external_ip_and_ls.assert_not_called()
mock_is_ls_provider.assert_called_once_with('test-ls')
mock_get_ls_localnet_info.assert_called_once_with('test-ls')
mock_expose_fip.assert_not_called()
mock_expose_ip.assert_called_once_with(
@ -315,9 +318,12 @@ class TestNBOVNBGPDriver(test_base.TestCase):
mock_get_ls_localnet_info.return_value = ('fake-localnet', 'br-ex', 10)
mock_expose_ip = mock.patch.object(
self.nb_bgp_driver, '_expose_ip').start()
mock_is_ls_provider = mock.patch.object(
self.nb_bgp_driver, 'is_ls_provider', return_value=True).start()
self.nb_bgp_driver._ensure_crlrp_exposed(port)
mock_is_ls_provider.assert_called_once_with('test-ls')
mock_expose_ip.assert_called_once_with(
['172.24.16.2'], 'fake_mac', 'test-ls', 'br-ex', 10,
constants.OVN_CR_LRP_PORT_TYPE, ['172.24.16.2/24'], router=None)
@ -446,6 +452,15 @@ class TestNBOVNBGPDriver(test_base.TestCase):
self.assertEqual(bridge_device, None)
self.assertEqual(bridge_vlan, None)
def test_is_ip_exposed(self):
self.nb_bgp_driver._exposed_ips['fake-switch'] = {'fake-ip': {}}
self.assertTrue(self.nb_bgp_driver.is_ip_exposed('fake-switch',
'fake-ip'))
self.assertFalse(self.nb_bgp_driver.is_ip_exposed('no-switch',
'fake-ip'))
self.assertFalse(self.nb_bgp_driver.is_ip_exposed('fake-switch',
'other-ip'))
def _test_expose_ip(self, ips, ips_info):
mock_expose_provider_port = mock.patch.object(
self.nb_bgp_driver, '_expose_provider_port').start()