Only query for port do not get directly

It was observed in the tempest tests that the port could be already
deleted by some other concurrent event when the `run` is called.
This caused a flood of exception logs. Thus, with this patch we only
query for the port and only update_router_port when the port was
found.

Closes-Bug: #2073567
Change-Id: I54d027f7cb5014d296a99029cfa0a13a7800da0a
This commit is contained in:
Miro Tomaska
2024-07-26 10:50:40 -04:00
parent 725f3cbd8e
commit c1b88fc5f5
2 changed files with 40 additions and 14 deletions

View File

@@ -578,8 +578,24 @@ class LogicalSwitchPortUpdateLogicalRouterPortEvent(row_event.RowEvent):
return False
def run(self, event, row, old):
port = self.driver._plugin.get_port(self.admin_context, row.name)
self.l3_plugin._ovn_client.update_router_port(self.admin_context, port)
# In some cases, it is possible for the logical switch port to be
# already removed from db by some other concurrent event when this
# method is called. Therefore, use get_ports to just query for this
# port instead of directly trying to get it from db causing not
# found exception.
ports = self.driver._plugin.get_ports(
self.admin_context,
filters={'id': [row.name]})
if ports:
self.l3_plugin._ovn_client.update_router_port(
self.admin_context,
ports[0])
else:
LOG.debug('Port %(port_id)s not found when '
'run of %(event_name)s was called. '
'Router port was not updated.',
{'port_id': row.name,
'event_name': self.event_name})
class PortBindingUpdateVirtualPortsEvent(row_event.RowEvent):

View File

@@ -924,23 +924,33 @@ class TestLogicalSwitchPortUpdateLogicalRouterPortEvent(
self.ext_api = test_extensions.setup_extensions_middleware(
test_l3.L3TestExtensionManager())
def test_create_router_port(self):
def _set_logical_port_events_add_subnet_to_router(self):
lsp_event = WaitForLogicalSwitchPortUpdateEvent()
lrp_event = WaitForLogicalRouterPortCreateEvent()
self.mech_driver.nb_ovn.idl.notify_handler.watch_events(
(lsp_event, lrp_event))
router = self._make_router(self.fmt, self._tenant_id)
self._router_interface_action('add', router['router']['id'],
self.subnet['subnet']['id'], None)
self.assertTrue(lsp_event.wait())
self.assertTrue(lrp_event.wait())
# Wait for the
# ``LogicalSwitchPortUpdateLogicalRouterPortEvent.run`` call.
time.sleep(1)
def test_create_router_port(self):
with mock.patch.object(self.l3_plugin._ovn_client,
'update_router_port') as mock_update_rp:
lsp_event = WaitForLogicalSwitchPortUpdateEvent()
lrp_event = WaitForLogicalRouterPortCreateEvent()
self.mech_driver.nb_ovn.idl.notify_handler.watch_events(
(lsp_event, lrp_event))
self._router_interface_action('add', router['router']['id'],
self.subnet['subnet']['id'], None)
self.assertTrue(lsp_event.wait())
self.assertTrue(lrp_event.wait())
# Wait for the
# ``LogicalSwitchPortUpdateLogicalRouterPortEvent.run`` call.
time.sleep(1)
self._set_logical_port_events_add_subnet_to_router()
mock_update_rp.assert_called()
def test_create_router_port_port_deleted_concurrently(self):
with mock.patch.object(self.l3_plugin._ovn_client,
'update_router_port') as mock_update_rp, \
mock.patch.object(self.plugin, 'get_ports', return_value=[]):
self._set_logical_port_events_add_subnet_to_router()
mock_update_rp.assert_not_called()
def test_create_non_router_port(self):
with mock.patch.object(self.l3_plugin._ovn_client,
'update_router_port') as mock_update_rp: