From cfab008eef3d11055ad16b8dd0d49aaa1801bc95 Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Fri, 21 Jun 2024 12:39:24 +0000 Subject: [PATCH] [OVN] Enable the WSGI module for the OVN mechanism driver This patch enables the use of the WSGI module with the ML2/OVN mechanism driver. The ML2/OVN requires two events that are called during the Neutron eventlet server initialization: * BEFORE_SPAWN: called once before the API workers have been created and after the ML2 plugin code has been initalizated. * AFTER_INIT: called when the API worker is started; at this point the different worker processes have been spawned. The WSGI module didn't make these event calls. Now these events are called during the API server initialization, after the ML2 plugin has been initalizated but before the server is running and attending any request. This approach differs from the Neutron eventlet server event calls because the BEFORE_SPAWN event is called for all API workers; that means the method ``OVNMechanismDriver.pre_fork_initialize`` is called as many times as workers are configured. Closes-Bug: #1912359 Change-Id: I684c6cea620308a6617b665400ce608650a2adfd --- neutron/common/ovn/utils.py | 8 +++++--- neutron/server/api_eventlet.py | 11 ++++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/neutron/common/ovn/utils.py b/neutron/common/ovn/utils.py index 9313a6a8f6e..f862e63d673 100644 --- a/neutron/common/ovn/utils.py +++ b/neutron/common/ovn/utils.py @@ -706,10 +706,12 @@ def get_port_subnet_ids(port): return [f['subnet_id'] for f in fixed_ips] -def get_method_class(method): - if not inspect.ismethod(method): +def get_method_class(method_or_class): + if not inspect.ismethod(method_or_class): + if inspect.isclass(method_or_class): + return method_or_class return - return method.__self__.__class__ + return method_or_class.__self__.__class__ def ovn_metadata_name(id_): diff --git a/neutron/server/api_eventlet.py b/neutron/server/api_eventlet.py index 194514aad19..d7eaa667aa1 100644 --- a/neutron/server/api_eventlet.py +++ b/neutron/server/api_eventlet.py @@ -14,12 +14,21 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.callbacks import events +from neutron_lib.callbacks import registry +from neutron_lib.callbacks import resources from oslo_config import cfg +from neutron.api import wsgi from neutron.common import config from neutron.common import profiler def eventlet_api_server(): profiler.setup('neutron-server', cfg.CONF.host) - return config.load_paste_app('neutron') + app = config.load_paste_app('neutron') + registry.publish(resources.PROCESS, events.BEFORE_SPAWN, + wsgi.WorkerService) + registry.publish(resources.PROCESS, events.AFTER_INIT, + wsgi.WorkerService) + return app