[openstack-dev] [oslo] usage patterns for oslo.config

Mark McLoughlin markmc at redhat.com
Tue Aug 26 10:30:11 UTC 2014


On Mon, 2014-08-11 at 15:06 -0400, Doug Hellmann wrote:
> On Aug 8, 2014, at 7:22 PM, Devananda van der Veen <devananda.vdv at gmail.com> wrote:
> 
> > On Fri, Aug 8, 2014 at 12:41 PM, Doug Hellmann <doug at doughellmann.com> wrote:
> >> 
> >> That’s right. The preferred approach is to put the register_opt() in
> >> *runtime* code somewhere before the option will be used. That might be in
> >> the constructor for a class that uses an option, for example, as described
> >> in
> >> http://docs.openstack.org/developer/oslo.config/cfg.html#registering-options
> >> 
> >> Doug
> > 
> > Interesting.
> > 
> > I've been following the prevailing example in Nova, which is to
> > register opts at the top of a module, immediately after defining them.
> > Is there a situation in which one approach is better than the other?
> 
> The approach used in Nova is the “old” way of doing it. It works, but
> assumes that all of the application code is modifying a global
> configuration object. The runtime approach allows you to pass a
> configuration object to a library, which makes it easier to mock the
> configuration for testing and avoids having the configuration options
> bleed into the public API of the library. We’ve started using the
> runtime approach in new Oslo libraries that have configuration
> options, but changing the implementation in existing application code
> isn’t strictly necessary.

I've been meaning to dig up some of the old threads and reviews to
document how we got here.

But briefly:

  * this global CONF variable originates from the gflags FLAGS variable 
    in Nova before oslo.config

  * I was initially determined to get rid of any global variable use 
    and did a lot of work to allow glance use oslo.config without a 
    global variable

      * one example detail of this work - when you use paste.deploy to 
        load an app, you have no ability to pass a config object 
        through paste.deploy to the app. I wrote a little helper that 
        used a thread-local variable to mimic this pass-through.

  * with glance done, I moved on to making keystone use oslo.config and 
    initially didn't use the global variable. Then I ran into a veto 
    from termie who felt very strongly that a global variable should be 
    used.

  * in the end, I bought the argument that the use of a global variable 
    was pretty deeply ingrained (especially in Nova) and that we should 
    aim for consistent coding patterns across projects (i.e. Oslo 
    shouldn't be just about shared code, but also shared patterns). The 
    only realistic "standard pattern" we could hope for was the use of 
    the global variable.

  * with that agreed, we reverted glance back to using a global 
    variable and all projects followed suit

  * the case of libraries is different IMO - we'd be foolish to design 
    APIs which lock us into using the global object

So ... I wouldn't quite agree that this is "the new way" vs "the old
way", but I think it would be reasonable to re-open the discussion about
using the global object in our applications. Perhaps, at least, we could
reduce our dependence on it.

Oh look, we have a FAQ on this:

https://wiki.openstack.org/wiki/Oslo#Why_does_oslo.config_have_a_CONF_object.3F_Global_object_SUCK.21

Mark.





More information about the OpenStack-dev mailing list