Merge "[OVN] The OVN agent should be able to re-register"

This commit is contained in:
Zuul
2025-08-01 11:18:36 +00:00
committed by Gerrit Code Review
3 changed files with 39 additions and 8 deletions

View File

@@ -44,9 +44,7 @@ class SbGlobalUpdateEvent(row_event.RowEvent):
self.event_name = self.__class__.__name__
def run(self, event, row, old):
ext_ids = {ovn_const.OVN_AGENT_NEUTRON_SB_CFG_KEY: str(row.nb_cfg)}
self.ovn_agent.sb_idl.db_set('Chassis_Private', self.ovn_agent.chassis,
('external_ids', ext_ids)).execute()
self.ovn_agent.update_neutron_sb_cfg_key(nb_cfg=row.nb_cfg)
class ChassisPrivateCreateEvent(row_event.RowEvent):
@@ -73,6 +71,7 @@ class ChassisPrivateCreateEvent(row_event.RowEvent):
# Re-register the OVN agent with the local chassis in case its
# entry was re-created (happens when restarting the ovn-controller)
self.ovn_agent.register_ovn_agent()
self.ovn_agent.update_neutron_sb_cfg_key()
class OVNNeutronAgent(service.Service):
@@ -205,9 +204,10 @@ class OVNNeutronAgent(service.Service):
'Chassis_Private', self.chassis, 'external_ids',
*metadata_keys, if_exists=True).execute(check_error=True)
def update_neutron_sb_cfg_key(self):
nb_cfg = self.sb_idl.db_get('Chassis_Private',
self.chassis, 'nb_cfg').execute()
def update_neutron_sb_cfg_key(self, nb_cfg=None):
nb_cfg = (nb_cfg or
self.sb_idl.db_get('Chassis_Private',
self.chassis, 'nb_cfg').execute())
external_ids = {ovn_const.OVN_AGENT_NEUTRON_SB_CFG_KEY: str(nb_cfg)}
self.sb_idl.db_set(
'Chassis_Private', self.chassis,

View File

@@ -19,6 +19,7 @@ import threading
from oslo_config import cfg
from oslo_log import log
from ovsdbapp.backend.ovs_idl import event as row_event
from ovsdbapp.backend.ovs_idl import vlog
from neutron.agent.linux import external_process
@@ -65,6 +66,29 @@ def _sync_lock(f):
return wrapped
class ChassisPrivateCreateEvent(extension_manager.OVNExtensionEvent,
row_event.RowEvent):
"""Row create event - Chassis name == our_chassis."""
def __init__(self, ovn_agent):
self._first_time = True
events = (self.ROW_CREATE,)
super().__init__(events, 'Chassis_Private', None)
self._agent = ovn_agent
self.conditions = (('name', '=', self._agent.chassis),)
self.event_name = self.__class__.__name__
def run(self, event, row, old):
if self._first_time:
self._first_time = False
return
# Re-register the OVN agent with the local chassis in case its
# entry was re-created (happens when restarting the ovn-controller)
self.agent._update_chassis_private_config()
self.agent.sync()
class MetadataExtension(extension_manager.OVNAgentExtension,
metadata_agent.MetadataAgent):
@@ -115,6 +139,7 @@ class MetadataExtension(extension_manager.OVNAgentExtension,
def sb_idl_events(self):
return [metadata_agent.PortBindingUpdatedEvent,
metadata_agent.PortBindingDeletedEvent,
ChassisPrivateCreateEvent,
]
# NOTE(ralonsoh): the following properties are needed during the migration

View File

@@ -105,8 +105,13 @@ class TestOVNNeutronAgent(TestOVNNeutronAgentBase):
ext_ids = self.ovn_agent.sb_idl.db_get(
'Chassis_Private', self.chassis_name,
'external_ids').execute(check_error=True)
return (ext_ids.get(ovn_const.OVN_AGENT_NEUTRON_ID_KEY)
is not None)
neutron_id = (ext_ids.get(ovn_const.OVN_AGENT_NEUTRON_ID_KEY)
is not None)
agt_cfg = (ext_ids.get(ovn_const.OVN_AGENT_NEUTRON_SB_CFG_KEY)
is not None)
bridge = (ext_ids.get(ovn_const.OVN_AGENT_OVN_BRIDGE)
is not None)
return neutron_id and agt_cfg and bridge
except idlutils.RowNotFound:
return False
@@ -115,6 +120,7 @@ class TestOVNNeutronAgent(TestOVNNeutronAgentBase):
self.ovn_agent.sb_idl.chassis_del(self.chassis_name).execute(
check_error=True)
self.add_fake_chassis(self.host_name, name=self.chassis_name)
n_utils.wait_until_true(_check_chassis_private, timeout=10)