Init zun centralize config

Initialize zun centralize config folder and test cases.

Change-Id: I93b0186c431947fe54650dd5d030e659d6776f41
Implements:blueprint centralize-config-zun
This commit is contained in:
Namrata 2016-10-07 21:02:22 +05:30
parent 56420cb254
commit 761e8ccb73
6 changed files with 180 additions and 0 deletions

View File

@ -0,0 +1,5 @@
[DEFAULT]
output_file = etc/zun/zun.conf.sample
wrap_width = 79
namespace=zun.conf

View File

@ -52,6 +52,7 @@ console_scripts =
oslo.config.opts =
zun = zun.opts:list_opts
zun.conf = zun.opts:list_opts
oslo.config.opts.defaults =
zun = zun.common.config:set_cors_middleware_defaults

31
zun/conf/__init__.py Normal file
View File

@ -0,0 +1,31 @@
# All Rights Reserved.
#
# 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 oslo_config import cfg
# from zun.conf import api
# from zun.conf import compute
# from zun.conf import database
# from zun.conf import glance_client
# from zun.conf import keystone
# from zun.conf import zun_client
CONF = cfg.CONF
# api.register_opts(CONF)
# compute.register_opts(CONF)
# database.register_opts(CONF)
# glance_client.register_opts(CONF)
# keystone.register_opts(CONF)
# zun_client.register_opts(CONF)

79
zun/conf/opts.py Normal file
View File

@ -0,0 +1,79 @@
# Copyright 2015 OpenStack Foundation
# All Rights Reserved.
#
# 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.
"""
This is the single point of entry to generate the sample configuration
file for Zun. It collects all the necessary info from the other modules
in this package. It is assumed that:
* every other module in this package has a 'list_opts' function which
return a dict where
* the keys are strings which are the group names
* the value of each key is a list of config options for that group
* the zun.conf package doesn't have further packages with config options
* this module is only used in the context of sample file generation
"""
import collections
import importlib
import os
import pkgutil
LIST_OPTS_FUNC_NAME = "list_opts"
def _tupleize(dct):
"""Take the dict of options and convert to the 2-tuple format."""
return [(key, val) for key, val in dct.items()]
def list_opts():
opts = collections.defaultdict(list)
module_names = _list_module_names()
imported_modules = _import_modules(module_names)
_append_config_options(imported_modules, opts)
return _tupleize(opts)
def _list_module_names():
module_names = []
package_path = os.path.dirname(os.path.abspath(__file__))
for _, modname, ispkg in pkgutil.iter_modules(path=[package_path]):
if modname == "opts" or ispkg:
continue
else:
module_names.append(modname)
return module_names
def _import_modules(module_names):
imported_modules = []
for modname in module_names:
mod = importlib.import_module("zun.conf." + modname)
if not hasattr(mod, LIST_OPTS_FUNC_NAME):
msg = "The module 'zun.conf.%s' should have a '%s' "\
"function which returns the config options." % \
(modname, LIST_OPTS_FUNC_NAME)
raise AttributeError(msg)
else:
imported_modules.append(mod)
return imported_modules
def _append_config_options(imported_modules, config_options):
for mod in imported_modules:
configs = mod.list_opts()
for key, val in configs.items():
config_options[key].extend(val)

View File

View File

@ -0,0 +1,64 @@
# 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 collections
import mock
from oslo_config import cfg
from zun.conf import opts
from zun.tests import base
class ConfTestCase(base.TestCase):
def test_list_opts(self):
for group, opt_list in opts.list_opts():
self.assertIsInstance(group, cfg.OptGroup)
for opt in opt_list:
self.assertIsInstance(opt, cfg.Opt)
def test_list_module_name_invalid_mods(self):
with mock.patch('pkgutil.iter_modules') as mock_mods:
mock_mods.return_value = [(None, 'foo', True),
(None, 'opts', False)]
self.assertEqual([], opts._list_module_names())
def test_list_module_name_valid_mods(self):
with mock.patch('pkgutil.iter_modules') as mock_mods:
mock_mods.return_value = [(None, 'foo', False)]
self.assertEqual(['foo'], opts._list_module_names())
def test_import_mods_no_func(self):
modules = ['foo', 'bar']
with mock.patch('importlib.import_module') as mock_import:
mock_import.return_value = mock.sentinel.mods
self.assertRaises(AttributeError, opts._import_modules, modules)
mock_import.assert_called_once_with('zun.conf.foo')
def test_import_mods_valid_func(self):
modules = ['foo', 'bar']
with mock.patch('importlib.import_module') as mock_import:
mock_mod = mock.MagicMock()
mock_import.return_value = mock_mod
self.assertEqual([mock_mod, mock_mod],
opts._import_modules(modules))
mock_import.assert_has_calls([mock.call('zun.conf.foo'),
mock.call('zun.conf.bar')])
def test_append_config(self):
opt = collections.defaultdict(list)
mock_module = mock.MagicMock()
mock_conf = mock.MagicMock()
mock_module.list_opts.return_value = mock_conf
mock_conf.items.return_value = [('foo', 'bar')]
opts._append_config_options([mock_module], opt)
self.assertEqual({'foo': ['b', 'a', 'r']}, opt)