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
This commit is contained in:
Luis Tomas Bolivar 2023-01-13 16:53:42 +01:00
parent b17b1d4f2c
commit 6d20db44fd
2 changed files with 36 additions and 4 deletions

View File

@ -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):

View File

@ -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'])