From 874e619f838a59617f86f7b66f96edc7affb2cc5 Mon Sep 17 00:00:00 2001 From: Alexandru Coman Date: Tue, 10 Jan 2017 00:28:40 +0200 Subject: [PATCH] Add support for config options management --- hnv_client/config/__init__.py | 24 +++++++++++++ hnv_client/config/base.py | 44 +++++++++++++++++++++++ hnv_client/config/factory.py | 31 ++++++++++++++++ hnv_client/config/hnv.py | 66 +++++++++++++++++++++++++++++++++++ hnv_client/config/options.py | 34 ++++++++++++++++++ setup.cfg | 4 +++ 6 files changed, 203 insertions(+) create mode 100644 hnv_client/config/__init__.py create mode 100644 hnv_client/config/base.py create mode 100644 hnv_client/config/factory.py create mode 100644 hnv_client/config/hnv.py create mode 100644 hnv_client/config/options.py diff --git a/hnv_client/config/__init__.py b/hnv_client/config/__init__.py new file mode 100644 index 0000000..529dd20 --- /dev/null +++ b/hnv_client/config/__init__.py @@ -0,0 +1,24 @@ +# Copyright 2017 Cloudbase Solutions Srl +# +# 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. + +"""Config options available for HNV client project.""" + +from oslo_config import cfg + +from hnv_client.config import factory + + +CONFIG = cfg.CONF +for option_class in factory.get_options(): + option_class(CONFIG).register() diff --git a/hnv_client/config/base.py b/hnv_client/config/base.py new file mode 100644 index 0000000..9c0add5 --- /dev/null +++ b/hnv_client/config/base.py @@ -0,0 +1,44 @@ +# Copyright 2017 Cloudbase Solutions Srl +# +# 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. + +"""Contact class for all the collections of config options.""" + +import abc + +import six + + +@six.add_metaclass(abc.ABCMeta) +class Options(object): + + """Contact class for all the collections of config options.""" + + def __init__(self, config, group="DEFAULT"): + self._config = config + self._group_name = group + + @property + def group_name(self): + """The group name for the current options.""" + return self._group_name + + @abc.abstractmethod + def register(self): + """Register the current options to the global ConfigOpts object.""" + pass + + @abc.abstractmethod + def list(self): + """Return a list which contains all the available options.""" + pass diff --git a/hnv_client/config/factory.py b/hnv_client/config/factory.py new file mode 100644 index 0000000..7f1d667 --- /dev/null +++ b/hnv_client/config/factory.py @@ -0,0 +1,31 @@ +# Copyright 2017 Cloudbase Solutions Srl +# +# 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. + +"""Factory for all the available config options.""" + +_OPT_PATHS = ( + 'hnv_client.config.hnv.HVNOptions', +) + + +def _load_class(class_path): + """Load the module and return the required class.""" + parts = class_path.rsplit('.', 1) + module = __import__(parts[0], fromlist=parts[1]) + return getattr(module, parts[1]) + + +def get_options(): + """Return a list of all the available `Options` subclasses.""" + return [_load_class(class_path) for class_path in _OPT_PATHS] diff --git a/hnv_client/config/hnv.py b/hnv_client/config/hnv.py new file mode 100644 index 0000000..0ac639f --- /dev/null +++ b/hnv_client/config/hnv.py @@ -0,0 +1,66 @@ +# Copyright 2017 Cloudbase Solutions Srl +# +# 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. + +"""Config options available for HVN.""" + +from oslo_config import cfg + +from hnv_client.config import base as config_base + + +class HVNOptions(config_base.Options): + + """Config options available for HVN.""" + + def __init__(self, config): + super(HVNOptions, self).__init__(config, group="HNV") + self._options = [ + cfg.StrOpt( + "url", default="http://127.0.0.1/", + help=("The base URL where the agent looks for " + "Network Controller API.")), + cfg.StrOpt( + "username", + help=("The username required for connecting to the Netowork " + "Controller API.")), + cfg.StrOpt( + "password", + help=("The password required for connecting to the Netowork " + "Controller API."), + secret=True), + cfg.BoolOpt( + "https_allow_insecure", default=False, + help=("Whether to disable the validation of " + "HTTPS certificates.")), + cfg.StrOpt( + "https_ca_bundle", default=None, + help=("The path to a CA_BUNDLE file or directory with " + "certificates of trusted CAs.")), + cfg.FloatOpt( + "retry_interval", default=1, + help=("Interval between attempts in case of transient errors, " + "expressed in seconds")), + ] + + def register(self): + """Register the current options to the global ConfigOpts object.""" + group = cfg.OptGroup( + self.group_name, + title="HNV (Hyper-V Network Virtualization) Options") + self._config.register_group(group) + self._config.register_opts(self._options, group=group) + + def list(self): + """Return a list which contains all the available options.""" + return self._options diff --git a/hnv_client/config/options.py b/hnv_client/config/options.py new file mode 100644 index 0000000..ea78abf --- /dev/null +++ b/hnv_client/config/options.py @@ -0,0 +1,34 @@ +# Copyright 2017 Cloudbase Solutions Srl +# +# 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 Cloudbase-Init. +""" + +import collections + +from hnv_client.config import base as config_base +from hnv_client.config import factory as config_factory + + +def get_options(): + """Collect all the options info from the other modules.""" + options = collections.defaultdict(list) + for opt_class in config_factory.get_options(): + if not issubclass(opt_class, config_base.Options): + continue + config_options = opt_class(None) + options[config_options.group_name].extend(config_options.list()) + return [(key, value) for key, value in options.items()] diff --git a/setup.cfg b/setup.cfg index 5a89b81..29c7ce7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,3 +26,7 @@ packages = [global] setup-hooks = pbr.hooks.setup_hook + +[entry_points] +oslo.config.opts = + hnv_client = hnv_client.config.options:get_options