Add oslo-config-generator

Add a sample config file generator utility. This is a dramatically
different approach from the generator in oslo-incubator, whereby we move
away from magic towards much more explicit control over the generator.

Change-Id: I2b9ab294a6c64820c92a8d9fb238448eda4c5474
This commit is contained in:
Mark McLoughlin 2014-06-25 15:54:04 +01:00
parent b8db3662fb
commit ec539d4c14
1 changed files with 263 additions and 0 deletions

View File

@ -0,0 +1,263 @@
=====================
oslo-config-generator
=====================
https://blueprints.launchpad.net/oslo/+spec/oslo-config-generator
Add a command line utility for generating sample config files to
oslo.config which will replace the generator utility in
oslo-incubator.
Problem description
===================
The need for such a utility is well understood:
* A sample config file containing the list of all available config
options, the associated help text, type and commented out default
value makes it much easier for operators to discover and understand
config options.
* It needs to be possible for operators to run the tool themselves
rather than attempting to maintain these auto-generated files in
git.
The issues with the current tool include:
* Loading modules and expecting them to register their options with
cfg.CONF is slow, weird, and error prone.
* This reliance on cfg.CONF perpetuates the use of a global object.
* The generator doesn't have information about which groups an option
belongs to so it resorts to guessing - this probably has resulted in
people avoiding adding a 'debug' option in multiple groups, for
example.
* It's impossible to to handle "split configs" - i.e. some config
options only make sense in glance-api.conf and others only make
sense in glance-registry.conf - because the generator has no
information on to decide which service an option is used by.
* We already have a pattern of explicitly registering config options
under the oslo.config.opts entry point namespace, but it's not
used outside oslo.messaging right now.
Proposed change
===============
We will add a sample config file generator utility called
oslo-config-generator to the oslo.config package.
This new utility will take a dramatically different approach to
discovery from the current generator in oslo-incubator, whereby we
move away from magic towards much more explicit control over the
options the generator sees.
To generate a sample config file for oslo.messaging you would run::
$> oslo-config-generator --namespace oslo.messaging > oslo.messaging.conf
This generated sample lists all of the available options, along with their help
string, type, deprecated aliases and defaults.
The --namespace option specifies an entry point name registered under the
'oslo.config.opts' entry point namespace. For example, in oslo.messaging's
setup.cfg we have::
[entry_points]
oslo.config.opts =
oslo.messaging = oslo.messaging.opts:list_opts
The callable referenced by the entry point should take no arguments and return
a list of (group_name, [opt_1, opt_2]) tuples. For example::
opts = [
cfg.StrOpt('foo'),
cfg.StrOpt('bar'),
]
cfg.CONF.register_opts(opts, group='blaa')
def list_opts():
return [('blaa', opts)]
You might choose to return a copy of the options so that the return value can't
be modified for nefarious purposes::
def list_opts():
return [('blaa', copy.deepcopy(opts))]
A single codebase might have multiple programs, each of which use a subset of
the total set of options registered by the codebase. In that case, you can
register multiple entry points::
[entry_points]
oslo.config.opts =
nova.common = nova.config:list_common_opts
nova.api = nova.config:list_api_opts
nova.compute = nova.config:list_compute_opts
and generate a config file specific to each program::
$> oslo-config-generator --namespace oslo.messaging \
--namespace nova.common \
--namespace nova.api > nova-api.conf
$> oslo-config-generator --namespace oslo.messaging \
--namespace nova.common \
--namespace nova.compute > nova-compute.conf
To make this more convenient, you can use config files to describe your config
files::
$> cat > config-generator/api.conf <<EOF
[DEFAULT]
output_file = etc/nova/nova-api.conf
namespace = oslo.messaging
namespace = nova.common
namespace = nova.api
EOF
$> cat > config-generator/compute.conf <<EOF
[DEFAULT]
output_file = etc/nova/nova-compute.conf
namespace = oslo.messaging
namespace = nova.compute
namespace = nova.compute
EOF
$> oslo-config-generator --config-file config-generator/api.conf
$> oslo-config-generator --config-file config-generator/compute.conf
The default runtime values of configuration options are not always the most
suitable values to include in sample config files - for example, rather than
including the IP address or hostname of the machine where the config file
was generated, you might want to include something like '10.0.0.1'. To
facilitate this, options can be supplied with a 'sample_default' attribute::
cfg.StrOpt('base_dir'
default=os.getcwd(),
sample_default='/usr/lib/myapp')
Alternatives
------------
The alternative would be to stick with the current generator's
automagic option discovery approach and attempt to work around its
deficiencies. This has been the path we've been on for quite some
time, but has been a constant source of frustration.
Impact on Existing APIs
-----------------------
The generator is primarily intended to be used via the
oslo-config-generator command line interface, but it is also available
via a public generate(conf) API. There is also a
register_cli_opts(conf) API so that callers to generate() can set
config options beforehand.
Security impact
---------------
There is no security impact.
Performance Impact
------------------
The generator completes more quickly because it has to load less
modules in order to discover options.
Configuration Impact
--------------------
No configuration impact.
Developer Impact
----------------
The explicit approach of advertising configuration options means that
developers will need to manually maintain a list of the config options
available in their code so it can be returned by the callable
registered as a oslo.config.opts entry point.
This shouldn't be a huge burden because it typically is a list which
references existing lists of options.
However, some sort of automated assistance to help catch cases where
the list needs updating would be hugely helpful. How exactly that will
work remains to be seen.
Implementation
==============
Assignee(s)
-----------
Primary assignee:
markmc
Other contributors:
None
Milestones
----------
juno-2
Work Items
----------
* Add oslo-config-generator to oslo.config.
* Advertise the keystone auth_token options under oslo.config.opts.
* Demonstrate how services like Nova, Ceilometer, Glance or Heat can
adopt this new utility.
* Remove the old generator from oslo-incubator.
* Set up infra jobs to publish sample config files somewhere like
docs.openstack.org.
* Consider adding something like 'python setup.py sample_config'.
Incubation
==========
The new utility replaces the one in oslo-incubator.
Adoption
--------
All applications are expected to adopt it.
Library
-------
oslo.config.
Note this means that oslo.config gains a dependency on stevedore.
Anticipated API Stabilization
-----------------------------
The API is pretty minimal and is expected to be stable from the time
it is merged.
Documentation Impact
====================
The operators guide would benefit from instructions on how to use the utility.
Dependencies
============
None.
References
==========
* https://blueprints.launchpad.net/oslo/+spec/oslo-config-generator
* https://bugs.launchpad.net/oslo/+bug/1300546
* http://lists.openstack.org/pipermail/openstack-dev/2014-June/thread.html#37954
.. note::
This work is licensed under a Creative Commons Attribution 3.0
Unported License.
http://creativecommons.org/licenses/by/3.0/legalcode