From b3ef8feb382d99787cca45b27329d28d211e89e9 Mon Sep 17 00:00:00 2001 From: Luis Tomas Bolivar Date: Tue, 28 Feb 2023 15:40:18 +0100 Subject: [PATCH] Ensure permanent mac entry is added for the right device For vlan provider network we need to add the mac entry for the cr-lrp pointing to the vlan device, not the bridge itself. Otherwise this won't work when the router has snat disable. Story 2010620 Task 47553 Change-Id: I2171faf62b57030465b5860a9a3c95aaac1e45ec --- .../drivers/openstack/ovn_bgp_driver.py | 10 +++-- .../drivers/openstack/test_ovn_bgp_driver.py | 39 ++++++++++--------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/ovn_bgp_agent/drivers/openstack/ovn_bgp_driver.py b/ovn_bgp_agent/drivers/openstack/ovn_bgp_driver.py index 1c82fa5a..b96967e8 100644 --- a/ovn_bgp_agent/drivers/openstack/ovn_bgp_driver.py +++ b/ovn_bgp_agent/drivers/openstack/ovn_bgp_driver.py @@ -320,13 +320,15 @@ class OVNBGPDriver(driver_api.AgentDriverBase): for ip in port_ips: try: if lladdr: + dev = bridge_device + if bridge_vlan: + dev = '{}.{}'.format(dev, bridge_vlan) linux_net.add_ip_rule( ip, self.ovn_routing_tables[bridge_device], - bridge_device, lladdr=lladdr) + dev=dev, lladdr=lladdr) else: linux_net.add_ip_rule( - ip, self.ovn_routing_tables[bridge_device], - bridge_device) + ip, self.ovn_routing_tables[bridge_device]) except agent_exc.InvalidPortIP: LOG.exception("Invalid IP to create a rule for port" " on the provider network: %s", ip) @@ -912,7 +914,7 @@ class OVNBGPDriver(driver_api.AgentDriverBase): self.chassis) try: linux_net.add_ip_rule( - ip, self.ovn_routing_tables[bridge_device], bridge_device) + ip, self.ovn_routing_tables[bridge_device]) except agent_exc.InvalidPortIP: LOG.exception("Invalid IP to create a rule for the " "lrp (network router interface) port: %s", ip) diff --git a/ovn_bgp_agent/tests/unit/drivers/openstack/test_ovn_bgp_driver.py b/ovn_bgp_agent/tests/unit/drivers/openstack/test_ovn_bgp_driver.py index edfeb723..45e444f9 100644 --- a/ovn_bgp_agent/tests/unit/drivers/openstack/test_ovn_bgp_driver.py +++ b/ovn_bgp_agent/tests/unit/drivers/openstack/test_ovn_bgp_driver.py @@ -281,7 +281,7 @@ class TestOVNBGPDriver(test_base.TestCase): mock_add_ips_dev.assert_called_once_with( CONF.bgp_nic, [self.ipv4]) mock_add_rule.assert_called_once_with( - self.ipv4, 'fake-table', self.bridge) + self.ipv4, 'fake-table') mock_add_route.assert_called_once_with( mock.ANY, self.ipv4, 'fake-table', self.bridge, vlan=10) @@ -301,7 +301,7 @@ class TestOVNBGPDriver(test_base.TestCase): mock_add_ips_dev.assert_called_once_with( CONF.bgp_nic, [self.ipv4]) mock_add_rule.assert_called_once_with( - self.ipv4, 'fake-table', self.bridge) + self.ipv4, 'fake-table') mock_add_route.assert_not_called() @mock.patch.object(linux_net, 'add_ips_to_dev') @@ -319,7 +319,8 @@ class TestOVNBGPDriver(test_base.TestCase): mock_add_ips_dev.assert_called_once_with( CONF.bgp_nic, [self.ipv4]) mock_add_rule.assert_called_once_with( - self.ipv4, 'fake-table', self.bridge, lladdr='fake-mac') + self.ipv4, 'fake-table', dev='{}.{}'.format(self.bridge, 10), + lladdr='fake-mac') mock_add_route.assert_called_once_with( mock.ANY, self.ipv4, 'fake-table', self.bridge, vlan=10) @@ -593,7 +594,7 @@ class TestOVNBGPDriver(test_base.TestCase): # Assert that the add methods were called mock_add_rule.assert_called_once_with( - '{}/32'.format(self.ipv4), 'fake-table', self.bridge) + '{}/32'.format(self.ipv4), 'fake-table') mock_add_route.assert_called_once_with( mock.ANY, self.ipv4, 'fake-table', self.bridge, vlan=10, mask='32', via=self.fip) @@ -680,7 +681,7 @@ class TestOVNBGPDriver(test_base.TestCase): # Assert that the add methods were called mock_ipv6_gua.assert_called_once_with('{}/128'.format(self.ipv6)) mock_add_rule.assert_called_once_with( - '{}/128'.format(self.ipv6), 'fake-table', self.bridge) + '{}/128'.format(self.ipv6), 'fake-table') mock_add_route.assert_called_once_with( mock.ANY, self.ipv6, 'fake-table', self.bridge, vlan=10, mask='128', via=self.fip) @@ -764,7 +765,7 @@ class TestOVNBGPDriver(test_base.TestCase): self.bgp_driver._process_lrp_port(router_port, 'gateway_port') mock_add_rule.assert_called_once_with( - '{}/32'.format(self.ipv4), 'fake-table', self.bridge) + '{}/32'.format(self.ipv4), 'fake-table') # Assert that add_ip_route() was not called mock_add_route.assert_not_called() @@ -927,8 +928,8 @@ class TestOVNBGPDriver(test_base.TestCase): mock_add_ip_dev.assert_called_once_with( CONF.bgp_nic, ips) - expected_calls = [mock.call(self.ipv4, 'fake-table', self.bridge), - mock.call(self.ipv6, 'fake-table', self.bridge)] + expected_calls = [mock.call(self.ipv4, 'fake-table'), + mock.call(self.ipv6, 'fake-table')] mock_add_rule.assert_has_calls(expected_calls) expected_calls = [mock.call(mock.ANY, self.ipv4, 'fake-table', @@ -963,8 +964,8 @@ class TestOVNBGPDriver(test_base.TestCase): mock_add_ip_dev.assert_called_once_with( CONF.bgp_nic, ips) - expected_calls = [mock.call(self.ipv4, 'fake-table', self.bridge), - mock.call(self.ipv6, 'fake-table', self.bridge)] + expected_calls = [mock.call(self.ipv4, 'fake-table'), + mock.call(self.ipv6, 'fake-table')] mock_add_rule.assert_has_calls(expected_calls) expected_calls = [mock.call(mock.ANY, self.ipv4, 'fake-table', @@ -999,7 +1000,7 @@ class TestOVNBGPDriver(test_base.TestCase): mock_add_ip_dev.assert_called_once_with( CONF.bgp_nic, [self.fip]) mock_add_rule.assert_called_once_with( - self.fip, 'fake-table', self.bridge) + self.fip, 'fake-table') mock_add_route.assert_called_once_with( mock.ANY, self.fip, 'fake-table', self.bridge, vlan=10) @@ -1047,8 +1048,8 @@ class TestOVNBGPDriver(test_base.TestCase): mock_add_ip_dev.assert_called_once_with( CONF.bgp_nic, ips) - expected_calls = [mock.call(self.ipv4, 'fake-table', self.bridge), - mock.call(self.ipv6, 'fake-table', self.bridge)] + expected_calls = [mock.call(self.ipv4, 'fake-table'), + mock.call(self.ipv6, 'fake-table')] mock_add_rule.assert_has_calls(expected_calls) expected_calls = [mock.call(mock.ANY, self.ipv4, 'fake-table', @@ -1112,9 +1113,11 @@ class TestOVNBGPDriver(test_base.TestCase): mock_add_ip_dev.assert_called_once_with( CONF.bgp_nic, ips) - expected_calls = [mock.call(self.ipv4, 'fake-table', self.bridge, + expected_calls = [mock.call(self.ipv4, 'fake-table', + dev='{}.{}'.format(self.bridge, 10), lladdr=self.mac), - mock.call(self.ipv6, 'fake-table', self.bridge, + mock.call(self.ipv6, 'fake-table', + dev='{}.{}'.format(self.bridge, 10), lladdr=self.mac)] mock_add_rule.assert_has_calls(expected_calls) @@ -1626,7 +1629,7 @@ class TestOVNBGPDriver(test_base.TestCase): '{}/32'.format(self.ipv4), self.lrp0, self.cr_lrp0, 'fake-lrp-dp') mock_add_rule.assert_called_once_with( - '{}/32'.format(self.ipv4), 'fake-table', self.bridge) + '{}/32'.format(self.ipv4), 'fake-table') mock_add_route.assert_called_once_with( mock.ANY, self.ipv4, 'fake-table', self.bridge, vlan=None, mask='32', via=self.fip) @@ -1671,7 +1674,7 @@ class TestOVNBGPDriver(test_base.TestCase): '{}/32'.format(self.ipv4), self.lrp0, self.cr_lrp0, 'fake-lrp-dp') mock_add_rule.assert_called_once_with( - '{}/32'.format(self.ipv4), 'fake-table', self.bridge) + '{}/32'.format(self.ipv4), 'fake-table') mock_add_route.assert_not_called() mock_expose_tenant_port.assert_not_called() @@ -1712,7 +1715,7 @@ class TestOVNBGPDriver(test_base.TestCase): '{}/128'.format(self.ipv6), self.lrp0, self.cr_lrp0, 'fake-lrp-dp') mock_add_rule.assert_called_once_with( - '{}/128'.format(self.ipv6), 'fake-table', self.bridge) + '{}/128'.format(self.ipv6), 'fake-table') mock_add_route.assert_called_once_with( mock.ANY, self.ipv6, 'fake-table', self.bridge, vlan=None, mask='128', via=self.fip)