Ben Nemec 3d85afb24a Fix sample config value when set_defaults is used
By calling set_default[1] on a conf object it only applies to opts
registered to that object. This causes an incorrect value to appear in
the generated sample config because it deals with a list of raw opts,
not a conf object.

To fix this, we can call the global set_defaults[2] on the cfg module
which alters the opts directly. This is the method used in the cors
middleware[3] and works as expected there.

This does complicate the unit tests, however. Because we're altering
global state we need to save the original opts and restore them after
the test. Furthermore, the conf.reset() call in the config fixture
doesn't sufficiently reset the conf object to allow it to recognize
the replaced opts. For the purposes of this test we can just create
a standalone conf object though, which gets past that problem.

It's possible that we should fix reset() so it actually removes opts
in groups completely, but I'm unsure what implications that might
have for other users of the function.

1: b5df53543f/oslo_config/cfg.py (L2433)
2: b5df53543f/oslo_config/cfg.py (L391)
3: 8c7fa5bb10/oslo_middleware/cors.py (L88)

Change-Id: I3af9de1b39b6360ecfcb448d8c37b463e1a42ca7
Closes-Bug: 1807184
2019-01-07 18:11:41 +00:00

40 lines
1.4 KiB
Python

# 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.
import copy
from oslo_config import cfg
from oslotest import base as test_base
from oslo_policy import opts
class OptsTestCase(test_base.BaseTestCase):
def setUp(self):
super(OptsTestCase, self).setUp()
self.conf = cfg.ConfigOpts()
self.original_opts = opts._options
opts._options = copy.deepcopy(opts._options)
def reset():
opts._options = self.original_opts
self.addCleanup(reset)
def test_set_defaults_policy_file(self):
opts._register(self.conf)
self.assertNotEqual('new-value.json',
self.conf.oslo_policy.policy_file)
opts.set_defaults(self.conf, policy_file='new-value.json')
self.assertEqual('new-value.json',
self.conf.oslo_policy.policy_file)