[OVN] Skip the port status UP update during a live migration

Skip the port status UP update during a live migration due to a
``PortBindingChassisUpdateEvent`` event.

The port status will be set by  the ``LogicalSwitchPortCreateUpEvent``
and ``LogicalSwitchPortCreateDownEvent`` events, that will be issued
when the port is deleted from the source host and created in the
destination host. This is a planned operation and controlled by Nova,
not a reactive event due to an unplanned host down event.

Conflicts:
    neutron/common/ovn/utils.py
    neutron/common/ovn/constants.py

Related-Bug: #2027605
Change-Id: I81390af2ea2fc384423518b84de3acf7adaf9193
(cherry picked from commit e1f887ca9f)
(cherry picked from commit 6a9990dba1)
This commit is contained in:
Rodolfo Alonso Hernandez 2023-07-17 23:27:58 +00:00
parent 41df9488a8
commit f2a74b8c4c
4 changed files with 33 additions and 1 deletions

View File

@ -300,6 +300,7 @@ LSP_TYPE_VIRTUAL = 'virtual'
LSP_TYPE_EXTERNAL = 'external'
LSP_TYPE_LOCALPORT = 'localport'
LSP_TYPE_ROUTER = 'router'
LSP_OPTIONS_REQUESTED_CHASSIS_KEY = 'requested-chassis'
LSP_OPTIONS_VIRTUAL_PARENTS_KEY = 'virtual-parents'
LSP_OPTIONS_VIRTUAL_IP_KEY = 'virtual-ip'
LSP_OPTIONS_MCAST_FLOOD_REPORTS = 'mcast_flood_reports'

View File

@ -797,3 +797,10 @@ def get_ovn_chassis_other_config(chassis):
return chassis.other_config
except AttributeError:
return chassis.external_ids
def get_requested_chassis(requested_chassis):
"""Returns a list with the items in the LSP.options:requested-chassis"""
if isinstance(requested_chassis, str):
return requested_chassis.split(',')
return []

View File

@ -275,6 +275,15 @@ class PortBindingChassisUpdateEvent(row_event.RowEvent):
{'port': row.logical_port, 'binding': row.uuid})
return False
req_chassis = utils.get_requested_chassis(
row.options.get(ovn_const.LSP_OPTIONS_REQUESTED_CHASSIS_KEY, ''))
if len(req_chassis) > 1:
# This event has been issued during a LSP migration. During this
# process, the LSP will change the port binding but the port status
# will be handled by the ``LogicalSwitchPortUpdateDownEvent`` and
# ``LogicalSwitchPortUpdateUpEvent`` events.
return False
return bool(lsp.up)
def run(self, event, row, old=None):

View File

@ -360,6 +360,7 @@ class TestPortBindingChassisUpdateEvent(base.BaseTestCase):
self.driver.set_port_status_up.assert_called()
else:
self.driver.set_port_status_up.assert_not_called()
self.driver.set_port_status_up.reset_mock()
def test_event_matches(self):
# NOTE(twilson) This primarily tests implementation details. If a
@ -369,10 +370,24 @@ class TestPortBindingChassisUpdateEvent(base.BaseTestCase):
attrs={'name': 'Port_Binding'})
ovsdb_row = fakes.FakeOvsdbRow.create_one_ovsdb_row
self.driver.nb_ovn.lookup.return_value = ovsdb_row(attrs={'up': True})
# Port binding change.
self._test_event(
self.event.ROW_UPDATE,
ovsdb_row(attrs={'_table': pbtable, 'chassis': 'one',
'type': '_fake_', 'logical_port': 'foo'}),
'type': '_fake_', 'logical_port': 'foo',
'options': {}}),
ovsdb_row(attrs={'_table': pbtable, 'chassis': 'two',
'type': '_fake_'}))
# Port binding change because of a live migration in progress.
options = {
ovn_const.LSP_OPTIONS_REQUESTED_CHASSIS_KEY: 'chassis1,chassis2'}
self._test_event(
self.event.ROW_UPDATE,
ovsdb_row(attrs={'_table': pbtable, 'chassis': 'one',
'type': '_fake_', 'logical_port': 'foo',
'options': options}),
ovsdb_row(attrs={'_table': pbtable, 'chassis': 'two',
'type': '_fake_'}))