Add register_opts param to PlacementFixture

There are scenarios where it is useful to create a ConfigOpts
and register_opts on it before ever calling the PlacementFixture.
If that is done we don't want to re-register the opts within
the fixture as this can lead to errors (especially when CLI
opts are involved).

The scenario that discovered this problem is in nova in a regression
test [1] where a ConfigOpts is created and registered, the placement
DatabaseFixture is started and then that same config is used in
multiple instances of the PlacementFixture, each of which again
register_opts(). Until commit b647919666
this wasn't a problem because the default opts in placement did
not include any CLI options. Adding logging opts brought some in.

This change adds a flag to the constructor for PlacementFixture,
register_opts, defaulting to True, which lets the caller say
no, I don't want do register.

It also reverts the revert of b647919666
to perform oslo_log.log.register_opts() from a central location.

[1] test_bug_1679750.TestLocalDeleteAllocations.test_local_delete_removes_allocations_after_compute_restart

Change-Id: I360a306b5d05ada75274733038b73ec2f2bdc4d4
Needed-By: I042e41ac8c41c0e5f0389904eb548e0e97d54c60
Related-Bug: #1821092
This commit is contained in:
Chris Dent 2019-03-20 22:16:04 +00:00
parent 4b35ee2cae
commit f7f5231677
3 changed files with 9 additions and 4 deletions

View File

@ -14,6 +14,8 @@
# under the License.
from __future__ import absolute_import
from oslo_log import log as logging
from placement.conf import api
from placement.conf import base
from placement.conf import database
@ -21,7 +23,7 @@ from placement.conf import paths
from placement.conf import placement
# To avoid global config, we require an existing ConfigOpts is passed
# To avoid global config, we require an existing ConfigOpts to be passed
# to register_opts. Then the caller can have some assurance that the
# config they are using will maintain some independence.
def register_opts(conf):
@ -30,3 +32,4 @@ def register_opts(conf):
database.register_opts(conf)
paths.register_opts(conf)
placement.register_opts(conf)
logging.register_options(conf)

View File

@ -42,7 +42,7 @@ class PlacementFixture(fixtures.Fixture):
Used by other services, including nova, for functional tests.
"""
def __init__(self, token='admin', conf_fixture=None, db=True,
use_intercept=True):
use_intercept=True, register_opts=True):
"""Create a Placement Fixture.
:param token: The value to be used when passing an auth token
@ -52,18 +52,21 @@ class PlacementFixture(fixtures.Fixture):
:param db: Whether to start the Database fixture.
:param use_intercept: If true, install a wsgi-intercept of the
placement WSGI app.
:param register_opts: If True, register configuration options.
"""
self.token = token
self.db = db
self.use_intercept = use_intercept
self.conf_fixture = conf_fixture
self.register_opts = register_opts
def setUp(self):
super(PlacementFixture, self).setUp()
if not self.conf_fixture:
config = cfg.ConfigOpts()
self.conf_fixture = self.useFixture(config_fixture.Config(config))
conf.register_opts(self.conf_fixture.conf)
if self.register_opts:
conf.register_opts(self.conf_fixture.conf)
if self.db:
self.useFixture(db_fixture.Database(self.conf_fixture,

View File

@ -71,7 +71,6 @@ def _get_config_files(env=None):
def _parse_args(config, argv, default_config_files):
# register placement's config options
conf.register_opts(config)
logging.register_options(config)
if profiler:
profiler.set_defaults(config)