nova team mailing list archive
-
nova team
-
Mailing list archive
-
Message #00017
Re: Gflags, Settings, Dependency Injection
+termie since he wasn't subscribed
On Wed, Jul 28, 2010 at 2:44 PM, Chris Behrens
<chris.behrens@xxxxxxxxxxxxx>wrote:
> ++
>
> We should list requirements and look for what we need.
>
> On Jul 28, 2010, at 2:41 PM, Monty Taylor wrote:
>
> > On 07/28/2010 02:28 PM, Eric Day wrote:
> >> ++
> >>
> >> I'm all for using an existing solution if one exists. I've not looked
> >> enough to make calls either way though. I want to figure out *what*
> >> we are looking for in features to make those decisions.
> >
> > ++
> >
> >> On Wed, Jul 28, 2010 at 01:37:18PM -0700, Monty Taylor wrote:
> >>> So I know I haven't convinced everyone to love bzr yet ... but as they
> >>> are a large python project with command line and config file options -
> >>> and plugins - perhaps looking at the infrastructure/design they use
> >>> might be a good idea?
> >>>
> >>> Also, the work derks did with cement might be of help.
> >>>
> >>> I believe both are designed to do things similar to how you are
> >>> discussing them below (although different, of course - we're all python
> >>> devs, there's no way we're going to actually do things the same. :) )
> >>>
> >>> Monty
> >>>
> >>> (what Eric is saying makes sense to me - but I don't have a whole bunch
> >>> of stake either way here- I am a fan of reusing solutions that exist
> >>> where possible though of course)
> >>>
> >>> On 07/28/2010 01:24 PM, Eric Day wrote:
> >>>> Hi Vish,
> >>>>
> >>>> If we want to keep things modular and have runtime module selection
> >>>> like you mention, we probably need to rethink flags. Using gflags
> >>>> may not be an option unless we can somehow make 'undefok=' a global
> >>>> option. In other project (that was not in Python, so no code to help),
> >>>> the flow is:
> >>>>
> >>>> * Enforce the use of module names in the options. For example, for
> >>>> generic queue module options use --queue.*, for libvirt module
> >>>> options, use --libvirt.*. If we want to make this seamless, we
> >>>> would probably need to use something else instead gflags or create
> >>>> a wrapper to enforce the required behavior.
> >>>>
> >>>> * Import the core option manager, first thing that happens when
> >>>> starting a binary.
> >>>>
> >>>> * Parse all options, separating each out into the modules they belong
> >>>> to. We don't know what is valid yet, but we can at least group by
> module.
> >>>>
> >>>> * Load any required modules via normal 'import' lines. They can verify
> >>>> options for their module space.
> >>>>
> >>>> * Have some core flags that specify which modules to load, for
> example,
> >>>> use rabbit vs fakerabbit. Then 'import' the selected optional
> modules.
> >>>>
> >>>> * As optional modules load, let them verify the module namespace
> >>>> options just like the required modules did.
> >>>>
> >>>> * Any options for modules that were not loaded are just ignored.
> >>>>
> >>>> Thoughts on this? It has worked out quite well in the other C++
> project
> >>>> for me, and with Python it would be even easier to put together. :)
> >>>>
> >>>> -Eric
> >>>>
> >>>> On Wed, Jul 28, 2010 at 11:13:40AM -0700, Vishvananda Ishaya wrote:
> >>>>> I'm having some annoyances with gflags which I'd like to air out
> here.
> >>>>> Maybe we can come to a consensus about how to move forward with
> them. I
> >>>>> find gflags annoying in the following ways:
> >>>>> a) flags are irritating for global settings. Settings that apply
> to the
> >>>>> project as a whole have to be set in multiple places so that the
> binaries
> >>>>> all get them properly. This can be fixed somewhat by a shared
> flagfile.
> >>>>> For example:
> >>>>> /etc/nova/nova-manage.conf:
> >>>>> --flagfile=/etc/nova/nova-common.conf # shared settings
> >>>>> --otherflag=true #manage specific settings
> >>>>> The problem here is that the shared settings can only include
> settings
> >>>>> that are imported by EVERY binary, or one of the binaries will
> choke. So
> >>>>> if you have a flag that 4 of 5 binaries use, you either have to set
> it in
> >>>>> four flagfiles or put it in common with an ugly undefok= line.
> This all
> >>>>> seems nasty to me. Other possibilities include moving truly
> >>>>> common/settings related flags into the common flags.py so that they
> are
> >>>>> available to all binaries. It all seems a bit hackish.
> >>>>> b) including files for flags only
> >>>>> There are places where we need access to a flag, but we aren't
> actually
> >>>>> making calls in the file. Pyflakes and pylint complain about
> unused
> >>>>> imports. Perhaps we fix this by moving these flags into common
> flagfile?
> >>>>> c) dependency injection
> >>>>> This is related to the issue above. If we are dynamically loading
> >>>>> specific drivers (for example the auth driver or a datastore
> backend) as
> >>>>> specified by a flag, the import is often done later than the parent
> file
> >>>>> is imported. Therefore using flags to configure settings for the
> driver
> >>>>> will fail, because the binary recognizing the flags is dependent on
> the
> >>>>> file that contains the flags being imported. Workarounds here
> include
> >>>>> finding a different method for dependency injection, hacking flags
> to
> >>>>> search for flags in injected dependencies somehow, or configuring
> drivers
> >>>>> differently than the rest of the system.
> >>>>> So I see 3 options for moving forward
> >>>>> 1) ditch gflags completely and use a different method for
> specifying
> >>>>> settings
> >>>>> 2) use a combination of some kind of settings file for general
> >>>>> configuration, and flags for specific runtime settings/hacks
> >>>>> 3) find good standard practices/workarounds for the above issues
> >>>>> Thoughts?
> >>>>> Vish
> >>>>
> >>>>> _______________________________________________
> >>>>> Mailing list: https://launchpad.net/~nova
> >>>>> Post to : nova@xxxxxxxxxxxxxxxxxxx
> >>>>> Unsubscribe : https://launchpad.net/~nova
> >>>>> More help : https://help.launchpad.net/ListHelp
> >>>>
> >>>>
> >>>> _______________________________________________
> >>>> Mailing list: https://launchpad.net/~nova
> >>>> Post to : nova@xxxxxxxxxxxxxxxxxxx
> >>>> Unsubscribe : https://launchpad.net/~nova
> >>>> More help : https://help.launchpad.net/ListHelp
> >>>>
> >>
> >
> >
> > _______________________________________________
> > Mailing list: https://launchpad.net/~nova
> > Post to : nova@xxxxxxxxxxxxxxxxxxx
> > Unsubscribe : https://launchpad.net/~nova
> > More help : https://help.launchpad.net/ListHelp
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~nova
> Post to : nova@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~nova
> More help : https://help.launchpad.net/ListHelp
>
Follow ups
References
-
Gflags, Settings, Dependency Injection
From: Vishvananda Ishaya, 2010-07-28
-
Re: Gflags, Settings, Dependency Injection
From: Eric Day, 2010-07-28
-
Re: Gflags, Settings, Dependency Injection
From: Monty Taylor, 2010-07-28
-
Re: Gflags, Settings, Dependency Injection
From: Eric Day, 2010-07-28
-
Re: Gflags, Settings, Dependency Injection
From: Monty Taylor, 2010-07-28
-
Re: Gflags, Settings, Dependency Injection
From: Chris Behrens, 2010-07-28