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
This commit is contained in:
Rodolfo Alonso Hernandez 2024-06-17 13:32:24 +00:00 committed by Rodolfo Alonso
parent 305e1451bb
commit 811f74d943
4 changed files with 51 additions and 0 deletions

View File

@ -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)

View File

@ -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()

View File

@ -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)

View File

@ -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