diff options
author | termie <github@anarkystic.com> | 2011-02-23 15:14:16 -0800 |
---|---|---|
committer | termie <github@anarkystic.com> | 2011-02-23 15:14:16 -0800 |
commit | 24090232272e0db163060e0ca32dbf97c05120c9 (patch) | |
tree | c4b605caf028637d3c1d8d8d203bb6bbd5e40f1c /nova/flags.py | |
parent | cd301d67506bcb6d67d921492435e9d7d56aafb1 (diff) | |
download | nova-24090232272e0db163060e0ca32dbf97c05120c9.tar.gz nova-24090232272e0db163060e0ca32dbf97c05120c9.tar.xz nova-24090232272e0db163060e0ca32dbf97c05120c9.zip |
updates to nova.flags to get help working better
Fixes some old bugs that were brought up on the mailing list.
First step towards moving flags into the places where they belong.
Also moves manager import into service's init so that we can get all the
dynamically loaded flags shortly after loading.
Diffstat (limited to 'nova/flags.py')
-rw-r--r-- | nova/flags.py | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/nova/flags.py b/nova/flags.py index f64a62da9..24bca0caf 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -160,9 +160,45 @@ class StrWrapper(object): raise KeyError(name) -FLAGS = FlagValues() -gflags.FLAGS = FLAGS -gflags.DEFINE_flag(gflags.HelpFlag(), FLAGS) +# Copied from gflags with small mods to get the naming correct. +# Originally gflags checks for the first module that is not gflags that is +# in the call chain, we want to check for the first module that is not gflags +# and not this module. +def _GetCallingModule(): + """Returns the name of the module that's calling into this module. + + We generally use this function to get the name of the module calling a + DEFINE_foo... function. + """ + # Walk down the stack to find the first globals dict that's not ours. + for depth in range(1, sys.getrecursionlimit()): + if not sys._getframe(depth).f_globals is globals(): + module_name = __GetModuleName(sys._getframe(depth).f_globals) + if module_name == 'gflags': + continue + if module_name is not None: + return module_name + raise AssertionError("No module was found") + + +# Copied from gflags because it is a private function +def __GetModuleName(globals_dict): + """Given a globals dict, returns the name of the module that defines it. + + Args: + globals_dict: A dictionary that should correspond to an environment + providing the values of the globals. + + Returns: + A string (the name of the module) or None (if the module could not + be identified. + """ + for name, module in sys.modules.iteritems(): + if getattr(module, '__dict__', None) is globals_dict: + if name == '__main__': + return sys.argv[0] + return name + return None def _wrapper(func): @@ -173,6 +209,11 @@ def _wrapper(func): return _wrapped +FLAGS = FlagValues() +gflags.FLAGS = FLAGS +gflags._GetCallingModule = _GetCallingModule + + DEFINE = _wrapper(gflags.DEFINE) DEFINE_string = _wrapper(gflags.DEFINE_string) DEFINE_integer = _wrapper(gflags.DEFINE_integer) @@ -185,8 +226,6 @@ DEFINE_spaceseplist = _wrapper(gflags.DEFINE_spaceseplist) DEFINE_multistring = _wrapper(gflags.DEFINE_multistring) DEFINE_multi_int = _wrapper(gflags.DEFINE_multi_int) DEFINE_flag = _wrapper(gflags.DEFINE_flag) - - HelpFlag = gflags.HelpFlag HelpshortFlag = gflags.HelpshortFlag HelpXMLFlag = gflags.HelpXMLFlag |