Config option to enable OVN IDL on other workers
Add a configuration option to ovn group: additional_worker_classes_with_ovn_idl to optionally enable OVN IDL connections on additional workers. By default the IDL connections are only initialized on API and maintenance workers as other worker types normally don't need them. But some plugins or extensions might still require IDL connections on other workers and now may enable them via configuration, by adding the worker class (or its alias from neutron.worker_classes) to additional_worker_classes_with_ovn_idl. Closes-Bug: #1927977 Change-Id: Ia0d882220cd281e3c91648e3f32a842d61a5f57d
This commit is contained in:
parent
1e2088abbe
commit
66ac943b64
@ -197,6 +197,13 @@ ovn_opts = [
|
||||
'or by checking the output of the following command: \n'
|
||||
'ovs-appctl -t ovs-vswitchd dpif/show-dp-features '
|
||||
'br-int | grep "Check pkt length action".')),
|
||||
cfg.ListOpt('additional_worker_classes_with_ovn_idl',
|
||||
default=[],
|
||||
help=_('Additional worker classes to enable OVN IDLs for.\n'
|
||||
'By default only the API and maintenance workers '
|
||||
'have access to the IDL connections. List additional '
|
||||
'worker classes here if necessary. You can use aliases '
|
||||
'from neutron.worker_classes.')),
|
||||
]
|
||||
|
||||
cfg.CONF.register_opts(ovn_opts, group='ovn')
|
||||
@ -304,3 +311,7 @@ def is_ovn_emit_need_to_frag_enabled():
|
||||
|
||||
def is_igmp_snooping_enabled():
|
||||
return cfg.CONF.OVS.igmp_snooping_enable
|
||||
|
||||
|
||||
def additional_worker_classes_with_ovn_idl():
|
||||
return cfg.CONF.ovn.additional_worker_classes_with_ovn_idl
|
||||
|
@ -33,6 +33,7 @@ from neutron_lib import context as n_context
|
||||
from neutron_lib import exceptions as n_exc
|
||||
from neutron_lib.plugins import directory
|
||||
from neutron_lib.plugins.ml2 import api
|
||||
from neutron_lib.utils import runtime
|
||||
from oslo_config import cfg
|
||||
from oslo_db import exception as os_db_exc
|
||||
from oslo_log import log
|
||||
@ -275,8 +276,26 @@ class OVNMechanismDriver(api.MechanismDriver):
|
||||
|
||||
@staticmethod
|
||||
def should_post_fork_initialize(worker_class):
|
||||
return worker_class in (neutron.wsgi.WorkerService,
|
||||
worker.MaintenanceWorker)
|
||||
# By default only API and maintenace workers need to initialize
|
||||
# the OVN IDL connections
|
||||
if worker_class in (neutron.wsgi.WorkerService,
|
||||
worker.MaintenanceWorker):
|
||||
return True
|
||||
|
||||
# Configuration may allow other worker types to use IDL connections.
|
||||
# Look for a match in additional_worker_classes_with_ovn_idl,
|
||||
# gracefully skipping unknown classes in the config list.
|
||||
for worker_type in ovn_conf.additional_worker_classes_with_ovn_idl():
|
||||
try:
|
||||
additional_class = runtime.load_class_by_alias_or_classname(
|
||||
'neutron.worker_classes', worker_type)
|
||||
if worker_class == additional_class:
|
||||
return True
|
||||
except ImportError:
|
||||
# ignore unknown additional worker class
|
||||
pass
|
||||
|
||||
return False
|
||||
|
||||
def post_fork_initialize(self, resource, event, trigger, payload=None):
|
||||
# Initialize API/Maintenance workers with OVN IDL connections
|
||||
|
@ -1977,6 +1977,56 @@ class TestOVNMechanismDriver(TestOVNMechanismDriverBase):
|
||||
expected_candidates = [ch0.name, ch2.name]
|
||||
self.assertEqual(sorted(expected_candidates), sorted(candidates))
|
||||
|
||||
def _test_should_post_fork_initialize(self, enabled, disabled):
|
||||
for worker_class in enabled:
|
||||
self.assertTrue(
|
||||
self.mech_driver.should_post_fork_initialize(worker_class))
|
||||
for worker_class in disabled:
|
||||
self.assertFalse(
|
||||
self.mech_driver.should_post_fork_initialize(worker_class))
|
||||
|
||||
def test_should_post_fork_initialize_default(self):
|
||||
enabled = (mech_driver.neutron.wsgi.WorkerService,
|
||||
mech_driver.worker.MaintenanceWorker)
|
||||
disabled = (mech_driver.neutron.service.AllServicesNeutronWorker,
|
||||
mech_driver.neutron.service.RpcWorker)
|
||||
self._test_should_post_fork_initialize(enabled, disabled)
|
||||
|
||||
def test_should_post_fork_initialize__allservices_worker(self):
|
||||
ovn_conf.cfg.CONF.set_override(
|
||||
'additional_worker_classes_with_ovn_idl',
|
||||
['neutron.service.AllServicesNeutronWorker'],
|
||||
group='ovn')
|
||||
enabled = (mech_driver.neutron.wsgi.WorkerService,
|
||||
mech_driver.worker.MaintenanceWorker,
|
||||
mech_driver.neutron.service.AllServicesNeutronWorker)
|
||||
disabled = (mech_driver.neutron.service.RpcWorker,)
|
||||
self._test_should_post_fork_initialize(enabled, disabled)
|
||||
|
||||
def test_should_post_fork_initialize__rpc_workers(self):
|
||||
ovn_conf.cfg.CONF.set_override(
|
||||
'additional_worker_classes_with_ovn_idl',
|
||||
['RpcWorker'],
|
||||
group='ovn')
|
||||
enabled = (mech_driver.neutron.wsgi.WorkerService,
|
||||
mech_driver.worker.MaintenanceWorker,
|
||||
mech_driver.neutron.service.RpcWorker)
|
||||
disabled = (mech_driver.neutron.service.AllServicesNeutronWorker,)
|
||||
self._test_should_post_fork_initialize(enabled, disabled)
|
||||
|
||||
def test_should_post_fork_initialize__bad_config(self):
|
||||
# test that `should_post_fork_initialize` works even with
|
||||
# unknown alias in additional_worker_classes_with_ovn_idl
|
||||
ovn_conf.cfg.CONF.set_override(
|
||||
'additional_worker_classes_with_ovn_idl',
|
||||
['UnknownAlias'],
|
||||
group='ovn')
|
||||
enabled = (mech_driver.neutron.wsgi.WorkerService,
|
||||
mech_driver.worker.MaintenanceWorker)
|
||||
disabled = (mech_driver.neutron.service.AllServicesNeutronWorker,
|
||||
mech_driver.neutron.service.RpcWorker)
|
||||
self._test_should_post_fork_initialize(enabled, disabled)
|
||||
|
||||
|
||||
class OVNMechanismDriverTestCase(test_plugin.Ml2PluginV2TestCase):
|
||||
_mechanism_drivers = ['logger', 'ovn']
|
||||
|
@ -0,0 +1,7 @@
|
||||
---
|
||||
other:
|
||||
- |
|
||||
Added a new config option ``additional_worker_classes_with_ovn_idl``
|
||||
to allow initialization of OVN IDL connections for additional worker
|
||||
classes. Can be used for plugins or extensions that need IDL connections
|
||||
for other worker classes than API and maintenance workers.
|
@ -266,3 +266,9 @@ neutron.objects =
|
||||
Trunk = neutron.objects.trunk:Trunk
|
||||
neutron.status.upgrade.checks =
|
||||
neutron = neutron.cmd.upgrade_checks.checks:CoreChecks
|
||||
neutron.worker_classes =
|
||||
APIWorker = neutron.wsgi:WorkerService
|
||||
RpcWorker = neutron.service:RpcWorker
|
||||
RpcReportsWorker = neutron.service:RpcReportsWorker
|
||||
AllServicesNeutronWorker = neutron.service:AllServicesNeutronWorker
|
||||
MaintenanceWorker = neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.worker:MaintenanceWorker
|
||||
|
Loading…
Reference in New Issue
Block a user