From 2cd75e073aa7d949f8842db8d4adbc4d7d2c36ac Mon Sep 17 00:00:00 2001 From: Terry Wilson Date: Fri, 31 Jan 2020 14:49:48 -0600 Subject: [PATCH] OVN Metadata agent gets OVSDB updates for only its Chassis The metadata agent registers the Chassis table with ovsdb-server and therefor gets database updates every time *any* Chassis is updated--even if the update is just a liveness check that updates nb_cfg. This patch adds a condition so that metadata agent only gets updates for the Chassis that it is running on. Change-Id: I452b7de09312ecea621c4b448cc63f037cad9675 Related-bug: #1861092 --- neutron/agent/ovn/metadata/agent.py | 14 ++++++++------ neutron/agent/ovn/metadata/ovsdb.py | 3 ++- neutron/agent/ovn/metadata/server.py | 10 ++++++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/neutron/agent/ovn/metadata/agent.py b/neutron/agent/ovn/metadata/agent.py index af39467b609..35ff2dfe4f5 100644 --- a/neutron/agent/ovn/metadata/agent.py +++ b/neutron/agent/ovn/metadata/agent.py @@ -166,18 +166,20 @@ class MetadataAgent(object): self.sync() def start(self): - # Launch the server that will act as a proxy between the VM's and Nova. - proxy = metadata_server.UnixDomainMetadataProxy(self.conf) - proxy.run() - # Open the connection to OVS database self.ovs_idl = ovsdb.MetadataAgentOvsIdl().start() self._load_config() + # Launch the server that will act as a proxy between the VM's and Nova. + proxy = metadata_server.UnixDomainMetadataProxy(self.conf, + self.chassis) + proxy.run() + # Open the connection to OVN SB database. self.sb_idl = ovsdb.MetadataAgentOvnSbIdl( - [PortBindingChassisEvent(self), ChassisCreateEvent(self), - SbGlobalUpdateEvent(self)]).start() + chassis=self.chassis, + events=[PortBindingChassisEvent(self), ChassisCreateEvent(self), + SbGlobalUpdateEvent(self)]).start() # Do the initial sync. self.sync() diff --git a/neutron/agent/ovn/metadata/ovsdb.py b/neutron/agent/ovn/metadata/ovsdb.py index 965670f4d18..703edc68042 100644 --- a/neutron/agent/ovn/metadata/ovsdb.py +++ b/neutron/agent/ovn/metadata/ovsdb.py @@ -27,7 +27,7 @@ class MetadataAgentOvnSbIdl(ovsdb_monitor.OvnIdl): SCHEMA = 'OVN_Southbound' - def __init__(self, events=None): + def __init__(self, chassis, events=None): connection_string = config.get_ovn_sb_connection() ovsdb_monitor._check_and_set_ssl_files(self.SCHEMA) helper = self._get_ovsdb_helper(connection_string) @@ -37,6 +37,7 @@ class MetadataAgentOvnSbIdl(ovsdb_monitor.OvnIdl): helper.register_table(table) super(MetadataAgentOvnSbIdl, self).__init__( None, connection_string, helper) + self.tables['Chassis'].condition = [['name', '==', chassis]] if events: self.notify_handler.watch_events(events) diff --git a/neutron/agent/ovn/metadata/server.py b/neutron/agent/ovn/metadata/server.py index 10bee18ca40..8ab2f71bb93 100644 --- a/neutron/agent/ovn/metadata/server.py +++ b/neutron/agent/ovn/metadata/server.py @@ -44,8 +44,9 @@ MODE_MAP = { class MetadataProxyHandler(object): - def __init__(self, conf): + def __init__(self, conf, chassis=''): self.conf = conf + self.chassis = chassis self.subscribe() def subscribe(self): @@ -56,7 +57,7 @@ class MetadataProxyHandler(object): def post_fork_initialize(self, resource, event, trigger, payload=None): # We need to open a connection to OVN SouthBound database for # each worker so that we can process the metadata requests. - self.sb_idl = ovsdb.MetadataAgentOvnSbIdl().start() + self.sb_idl = ovsdb.MetadataAgentOvnSbIdl(chassis=self.chassis).start() @webob.dec.wsgify(RequestClass=webob.Request) def __call__(self, req): @@ -161,8 +162,9 @@ class MetadataProxyHandler(object): class UnixDomainMetadataProxy(object): - def __init__(self, conf): + def __init__(self, conf, chassis=''): self.conf = conf + self.chassis = chassis agent_utils.ensure_directory_exists_without_file( cfg.CONF.metadata_proxy_socket) @@ -187,7 +189,7 @@ class UnixDomainMetadataProxy(object): def run(self): self.server = agent_utils.UnixDomainWSGIServer( 'networking-ovn-metadata-agent') - self.server.start(MetadataProxyHandler(self.conf), + self.server.start(MetadataProxyHandler(self.conf, self.chassis), self.conf.metadata_proxy_socket, workers=self.conf.metadata_workers, backlog=self.conf.metadata_backlog,