From 038d59778eecf953375da701b4cd55d4e3ca309f Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Tue, 31 Jul 2012 12:16:28 +0100 Subject: Add import_opt() method to ConfigOpts Related to blueprint cfg-global-object When using the global config object pattern, you often have modules which define options that are referenced in other options. So, for example if module A defined option 'foo' and module be needed to reference that option, you might do: import A print CONF.foo However, this makes it entirely unclear to the casual reader why module A was imported. Nova has a flags.DECLARE() function that helps with this problem by allowing you to do: flags.DECLARE('foo', 'A') The function simply imports module A and checks that the 'foo' option is now defined in the global config object. This is fine, but it is also implicit that this function applies to the global config object. Instead, let's do the following: CONF.import_opt('foo', 'A') Change-Id: I7b98f5be71068bbde70cc0eab991eaebb577de52 --- tests/testmods/__init__.py | 15 +++++++++++++++ tests/testmods/bar_foo_opt.py | 21 +++++++++++++++++++++ tests/testmods/blaa_opt.py | 21 +++++++++++++++++++++ tests/unit/test_cfg.py | 26 ++++++++++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 tests/testmods/__init__.py create mode 100644 tests/testmods/bar_foo_opt.py create mode 100644 tests/testmods/blaa_opt.py (limited to 'tests') diff --git a/tests/testmods/__init__.py b/tests/testmods/__init__.py new file mode 100644 index 0000000..e5f41ad --- /dev/null +++ b/tests/testmods/__init__.py @@ -0,0 +1,15 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 Red Hat, Inc. +# +# 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. diff --git a/tests/testmods/bar_foo_opt.py b/tests/testmods/bar_foo_opt.py new file mode 100644 index 0000000..88d0bbf --- /dev/null +++ b/tests/testmods/bar_foo_opt.py @@ -0,0 +1,21 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 Red Hat, Inc. +# +# 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 openstack.common import cfg + +CONF = cfg.CONF + +CONF.register_opt(cfg.StrOpt('foo'), group='bar') diff --git a/tests/testmods/blaa_opt.py b/tests/testmods/blaa_opt.py new file mode 100644 index 0000000..b320a72 --- /dev/null +++ b/tests/testmods/blaa_opt.py @@ -0,0 +1,21 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 Red Hat, Inc. +# +# 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 openstack.common import cfg + +CONF = cfg.CONF + +CONF.register_opt(cfg.StrOpt('blaa')) diff --git a/tests/unit/test_cfg.py b/tests/unit/test_cfg.py index d6286d3..14a85c9 100644 --- a/tests/unit/test_cfg.py +++ b/tests/unit/test_cfg.py @@ -1111,6 +1111,32 @@ class UnregisterOptTestCase(BaseTestCase): self.assertFalse(hasattr(self.conf.blaa, 'foo')) +class ImportOptTestCase(BaseTestCase): + + def test_import_opt(self): + self.assertFalse(hasattr(CONF, 'blaa')) + CONF.import_opt('blaa', 'tests.testmods.blaa_opt') + self.assertTrue(hasattr(CONF, 'blaa')) + + def test_import_opt_in_group(self): + self.assertFalse(hasattr(CONF, 'bar')) + CONF.import_opt('foo', 'tests.testmods.bar_foo_opt', group='bar') + self.assertTrue(hasattr(CONF, 'bar')) + self.assertTrue(hasattr(CONF.bar, 'foo')) + + def test_import_opt_import_errror(self): + self.assertRaises(ImportError, CONF.import_opt, + 'blaa', 'tests.testmods.blaablaa_opt') + + def test_import_opt_no_such_opt(self): + self.assertRaises(NoSuchOptError, CONF.import_opt, + 'blaablaa', 'tests.testmods.blaa_opt') + + def test_import_opt_no_such_group(self): + self.assertRaises(NoSuchGroupError, CONF.import_opt, + 'blaa', 'tests.testmods.blaa_opt', group='blaa') + + class RequiredOptsTestCase(BaseTestCase): def setUp(self): -- cgit