From 6d20db44fddc1fc883fdd22c3e3886fd201743a3 Mon Sep 17 00:00:00 2001 From: Luis Tomas Bolivar Date: Fri, 13 Jan 2023 16:53:42 +0100 Subject: [PATCH] Properly handle virtual port chassis updates When a VIP changes chassis the port_binding table gets the chassis information updated instead of deleted and added. This patch ensures update of chassis field is properly handled in that case so that the IP/FIP gets properly exposed on time, rather than the re-sync function fixing it Change-Id: Idced3467780f7a17aabe5cc2d821020152c7735b --- .../drivers/openstack/watchers/bgp_watcher.py | 4 +-- .../openstack/watchers/test_bgp_watcher.py | 36 +++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py b/ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py index 9f0830d..ed60579 100644 --- a/ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py +++ b/ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py @@ -37,7 +37,7 @@ class PortBindingChassisCreatedEvent(base_watcher.PortBindingChassisEvent): if not self._check_ip_associated(row.mac[0]): return False return (row.chassis[0].name == self.agent.chassis and - not old.chassis) + (not old.chassis or row.chassis != old.chassis)) except (IndexError, AttributeError): return False @@ -62,7 +62,7 @@ class PortBindingChassisDeletedEvent(base_watcher.PortBindingChassisEvent): return False if event == self.ROW_UPDATE: return (old.chassis[0].name == self.agent.chassis and - not row.chassis) + (not row.chassis or row.chassis != old.chassis)) else: return row.chassis[0].name == self.agent.chassis except (IndexError, AttributeError): diff --git a/ovn_bgp_agent/tests/unit/drivers/openstack/watchers/test_bgp_watcher.py b/ovn_bgp_agent/tests/unit/drivers/openstack/watchers/test_bgp_watcher.py index ce57e4e..1fc54bf 100644 --- a/ovn_bgp_agent/tests/unit/drivers/openstack/watchers/test_bgp_watcher.py +++ b/ovn_bgp_agent/tests/unit/drivers/openstack/watchers/test_bgp_watcher.py @@ -47,9 +47,24 @@ class TestPortBindingChassisCreatedEvent(test_base.TestCase): ch = utils.create_row(name=self.chassis) row = utils.create_row(chassis=[ch], mac=['aa:bb:cc:dd:ee:ff 10.10.1.16']) - old = utils.create_row(chassis=self.chassis) + old = utils.create_row(chassis=[ch]) self.assertFalse(self.event.match_fn(mock.Mock(), row, old)) + def test_match_fn_no_old_chassis(self): + ch = utils.create_row(name=self.chassis) + row = utils.create_row(chassis=[ch], + mac=['aa:bb:cc:dd:ee:ff 10.10.1.16']) + old = utils.create_row(chassis=[]) + self.assertTrue(self.event.match_fn(mock.Mock(), row, old)) + + def test_match_fn_different_old_chassis(self): + ch = utils.create_row(name=self.chassis) + ch_old = utils.create_row(name='old-chassis') + row = utils.create_row(chassis=[ch], + mac=['aa:bb:cc:dd:ee:ff 10.10.1.16']) + old = utils.create_row(chassis=[ch_old]) + self.assertTrue(self.event.match_fn(mock.Mock(), row, old)) + def test_match_fn_index_error(self): row = utils.create_row(chassis=[], mac=['aa:bb:cc:dd:ee:ff 10.10.1.16']) @@ -112,9 +127,26 @@ class TestPortBindingChassisDeletedEvent(test_base.TestCase): ch = utils.create_row(name=self.chassis) row = utils.create_row(chassis=[ch], mac=['aa:bb:cc:dd:ee:ff 10.10.1.16']) - old = utils.create_row(chassis=self.chassis) + old = utils.create_row(chassis=[ch]) self.assertFalse(self.event.match_fn(event, row, old)) + def test_match_fn_update_no_chassis(self): + event = self.event.ROW_UPDATE + ch = utils.create_row(name=self.chassis) + row = utils.create_row(chassis=[], + mac=['aa:bb:cc:dd:ee:ff 10.10.1.16']) + old = utils.create_row(chassis=[ch]) + self.assertTrue(self.event.match_fn(event, row, old)) + + def test_match_fn_update_different_chassis(self): + event = self.event.ROW_UPDATE + ch = utils.create_row(name=self.chassis) + ch_new = utils.create_row(name='new-chassis') + row = utils.create_row(chassis=[ch_new], + mac=['aa:bb:cc:dd:ee:ff 10.10.1.16']) + old = utils.create_row(chassis=[ch]) + self.assertTrue(self.event.match_fn(event, row, old)) + def test_match_fn_index_error(self): row = utils.create_row(chassis=[], mac=['aa:bb:cc:dd:ee:ff 10.10.1.16'])