[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
This commit is contained in:
Rodolfo Alonso Hernandez 2024-06-21 12:39:24 +00:00 committed by Rodolfo Alonso
parent 73a9d509ef
commit cfab008eef
2 changed files with 15 additions and 4 deletions

View File

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

View File

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