From 9cec2e6b7aa1b51f7a6e2d964ed6cc0cfdbd2f71 Mon Sep 17 00:00:00 2001 From: Vasyl Saienko Date: Tue, 4 Mar 2025 10:32:48 +0000 Subject: [PATCH] Prepare to handle ha_chassis_group for LRP Neutron has a goal to switch to ``ha_chassis_group`` [1]. This patch prepare octavia ovn provider to handle both ``gateway_chassis`` and ``ha_chassis_group`` for LRPs to make update seamless. [0] https://man7.org/linux/man-pages/man5/ovn-nb.5.html [1] https://bugs.launchpad.net/neutron/+bug/2092271 Related-Bug: #2092271 Change-Id: I9ce207e54c2988ad6d0f7fab7192be7eecaa0047 --- ovn_octavia_provider/helper.py | 2 +- ovn_octavia_provider/ovsdb/impl_idl_ovn.py | 2 +- ovn_octavia_provider/tests/unit/test_helper.py | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/ovn_octavia_provider/helper.py b/ovn_octavia_provider/helper.py index 443366cc..a63d6aff 100644 --- a/ovn_octavia_provider/helper.py +++ b/ovn_octavia_provider/helper.py @@ -1172,7 +1172,7 @@ class OvnProviderHelper(): def _find_ls_for_lr(self, router, ip_version): ls = [] for port in router.ports: - if port.gateway_chassis: + if port.gateway_chassis or port.ha_chassis_group: continue if netaddr.IPNetwork(port.networks[0]).version != ip_version: continue diff --git a/ovn_octavia_provider/ovsdb/impl_idl_ovn.py b/ovn_octavia_provider/ovsdb/impl_idl_ovn.py index 3c1e05e0..93c52246 100644 --- a/ovn_octavia_provider/ovsdb/impl_idl_ovn.py +++ b/ovn_octavia_provider/ovsdb/impl_idl_ovn.py @@ -209,7 +209,7 @@ class OvnNbIdlForLb(ovsdb_monitor.OvnIdl): SCHEMA = "OVN_Northbound" TABLES = ('Logical_Switch', 'Load_Balancer', 'Load_Balancer_Health_Check', 'Logical_Router', 'Logical_Switch_Port', 'Logical_Router_Port', - 'Gateway_Chassis', 'NAT') + 'Gateway_Chassis', 'NAT', 'HA_Chassis_Group') def __init__(self, event_lock_name=None, notifier=True): self.conn_string = config.get_ovn_nb_connection() diff --git a/ovn_octavia_provider/tests/unit/test_helper.py b/ovn_octavia_provider/tests/unit/test_helper.py index ab521008..d6532fa7 100644 --- a/ovn_octavia_provider/tests/unit/test_helper.py +++ b/ovn_octavia_provider/tests/unit/test_helper.py @@ -3036,11 +3036,13 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase): def test__find_ls_for_lr(self): p1 = fakes.FakeOVNPort.create_one_port(attrs={ 'gateway_chassis': [], + 'ha_chassis_group': [], 'external_ids': { ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY: 'foo1'}, 'networks': ["10.0.0.1/24"]}) p2 = fakes.FakeOVNPort.create_one_port(attrs={ 'gateway_chassis': [], + 'ha_chassis_group': [], 'external_ids': { ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY: 'foo2'}, 'networks': ["10.0.10.1/24"]}) @@ -3052,11 +3054,13 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase): def test__find_ls_for_lr_net_not_found(self): p1 = fakes.FakeOVNPort.create_one_port(attrs={ 'gateway_chassis': [], + 'ha_chassis_group': [], 'external_ids': { ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY: 'foo1'}, 'networks': ["10.0.0.1/24"]}) p2 = fakes.FakeOVNPort.create_one_port(attrs={ 'gateway_chassis': [], + 'ha_chassis_group': [], 'external_ids': {}, 'networks': ["10.0.10.1/24"]}) self.router.ports.append(p2) @@ -3067,11 +3071,13 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase): def test__find_ls_for_lr_different_ip_version(self): p1 = fakes.FakeOVNPort.create_one_port(attrs={ 'gateway_chassis': [], + 'ha_chassis_group': [], 'external_ids': { ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY: 'foo1'}, 'networks': ["10.0.0.1/24"]}) p2 = fakes.FakeOVNPort.create_one_port(attrs={ 'gateway_chassis': [], + 'ha_chassis_group': [], 'external_ids': { ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY: 'foo2'}, 'networks': ["fdaa:4ad8:e8fb::/64"]}) @@ -3085,6 +3091,18 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase): def test__find_ls_for_lr_gw_port(self): p1 = fakes.FakeOVNPort.create_one_port(attrs={ 'gateway_chassis': ['foo-gw-chassis'], + 'ha_chassis_group': [], + 'external_ids': { + ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY: 'foo1'}, + 'networks': ["10.0.0.1/24"]}) + self.router.ports.append(p1) + result = self.helper._find_ls_for_lr(self.router, n_const.IP_VERSION_4) + self.assertListEqual([], result) + + def test__find_ls_for_lr_gw_port_ha_chassis_group(self): + p1 = fakes.FakeOVNPort.create_one_port(attrs={ + 'gateway_chassis': [], + 'ha_chassis_group': 'foo-chassis-group', 'external_ids': { ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY: 'foo1'}, 'networks': ["10.0.0.1/24"]})