From 811f74d943aa902771dfb58a88553df099a44bc5 Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Mon, 17 Jun 2024 13:32:24 +0000 Subject: [PATCH] Add a new process to spawn the plugin services in the Neutron server When using the Neutron WSGI module, the plugin services (periodic workers created on demand in the ML2 plugin initialization) were not spawned. This patch adds a new service that should be spawned within the Neutron API processes, similar to the RPC server. Closes-Bug: #2069581 Change-Id: Ia5376a68bfbcff4156800f550f28b59944b863c3 --- neutron/cmd/eventlet/server/__init__.py | 5 ++++ neutron/server/periodic_eventlet.py | 38 +++++++++++++++++++++++++ neutron/service.py | 7 +++++ setup.cfg | 1 + 4 files changed, 51 insertions(+) create mode 100644 neutron/server/periodic_eventlet.py diff --git a/neutron/cmd/eventlet/server/__init__.py b/neutron/cmd/eventlet/server/__init__.py index 8508249af56..5849e4eb2c0 100644 --- a/neutron/cmd/eventlet/server/__init__.py +++ b/neutron/cmd/eventlet/server/__init__.py @@ -12,6 +12,7 @@ from neutron import server from neutron.server import api_eventlet +from neutron.server import periodic_eventlet from neutron.server import rpc_eventlet from neutron.server import wsgi_eventlet @@ -26,3 +27,7 @@ def main_rpc_eventlet(): def main_api_eventlet(): return server.boot_server(api_eventlet.eventlet_api_server) + + +def main_periodic_eventlet(): + server.boot_server(periodic_eventlet.eventlet_periodic_workers) diff --git a/neutron/server/periodic_eventlet.py b/neutron/server/periodic_eventlet.py new file mode 100644 index 00000000000..5de6b926bf9 --- /dev/null +++ b/neutron/server/periodic_eventlet.py @@ -0,0 +1,38 @@ +# Copyright (c) 2024 Red Hat, Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from neutron_lib.api import attributes +from oslo_log import log + +from neutron.api import extensions +from neutron import manager +from neutron import service + +LOG = log.getLogger(__name__) + + +def eventlet_periodic_workers(): + LOG.info('Eventlet based periodic workers process starting...') + + try: + manager.init() + ext_mgr = extensions.PluginAwareExtensionManager.get_instance() + ext_mgr.extend_resources('2.0', attributes.RESOURCES) + periodic_workers_launcher = service.start_periodic_workers() + except NotImplementedError: + LOG.info('Periodic workers process was already started in ' + 'parent process by plugin.') + else: + periodic_workers_launcher.wait() diff --git a/neutron/service.py b/neutron/service.py index 2d942605b74..2432f1f71cb 100644 --- a/neutron/service.py +++ b/neutron/service.py @@ -310,6 +310,13 @@ def start_rpc_workers(): return launcher +def start_periodic_workers(): + periodic_workers = _get_plugins_workers() + launcher = _start_workers(periodic_workers) + registry.publish(resources.PROCESS, events.AFTER_SPAWN, None) + return launcher + + def start_plugins_workers(): plugins_workers = _get_plugins_workers() return _start_workers(plugins_workers) diff --git a/setup.cfg b/setup.cfg index aca634fc417..78b9498a75a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -57,6 +57,7 @@ console_scripts = neutron-metering-agent = neutron.cmd.eventlet.services.metering_agent:main neutron-sriov-nic-agent = neutron.cmd.eventlet.plugins.sriov_nic_neutron_agent:main neutron-sanity-check = neutron.cmd.sanity_check:main + neutron-periodic-workers = neutron.cmd.eventlet.server:main_periodic_eventlet neutron-status = neutron.cmd.status:main neutron-ovn-agent = neutron.cmd.eventlet.agents.ovn_neutron_agent:main neutron-ovn-metadata-agent = neutron.cmd.eventlet.agents.ovn_metadata:main