summaryrefslogtreecommitdiffstats
path: root/nova/flags.py
diff options
context:
space:
mode:
authorSoren Hansen <soren.hansen@rackspace.com>2010-11-29 15:49:12 +0100
committerSoren Hansen <soren.hansen@rackspace.com>2010-11-29 15:49:12 +0100
commitc8f6db354f5e8f55b432854d5259dcf84f0c8ba0 (patch)
treef542c5baa940d4101a2dd2ad478975c02233303a /nova/flags.py
parentc5d3e310376b3fb5c548e1d2e70c5ce7a489bb9f (diff)
downloadnova-c8f6db354f5e8f55b432854d5259dcf84f0c8ba0.tar.gz
nova-c8f6db354f5e8f55b432854d5259dcf84f0c8ba0.tar.xz
nova-c8f6db354f5e8f55b432854d5259dcf84f0c8ba0.zip
Make sure templated flags work across calls to ParseNewFlags.
ParseNewFlags creates a new FlagValues object, which doesn't have all the previously defined flags, so template lookups fail miserably. Pass the existing FlagValues object too the template mapping object to fix this.
Diffstat (limited to 'nova/flags.py')
-rw-r--r--nova/flags.py26
1 files changed, 17 insertions, 9 deletions
diff --git a/nova/flags.py b/nova/flags.py
index 70a049491..641bda5f9 100644
--- a/nova/flags.py
+++ b/nova/flags.py
@@ -40,11 +40,12 @@ class FlagValues(gflags.FlagValues):
"""
- def __init__(self):
+ def __init__(self, extra_context=None):
gflags.FlagValues.__init__(self)
self.__dict__['__dirty'] = []
self.__dict__['__was_already_parsed'] = False
self.__dict__['__stored_argv'] = []
+ self.__dict__['__extra_context'] = extra_context
def __call__(self, argv):
# We're doing some hacky stuff here so that we don't have to copy
@@ -114,7 +115,7 @@ class FlagValues(gflags.FlagValues):
def ParseNewFlags(self):
if '__stored_argv' not in self.__dict__:
return
- new_flags = FlagValues()
+ new_flags = FlagValues(self)
for k in self.__dict__['__dirty']:
new_flags[k] = gflags.FlagValues.__getitem__(self, k)
@@ -139,18 +140,25 @@ class FlagValues(gflags.FlagValues):
val = gflags.FlagValues.__getattr__(self, name)
if type(val) is str:
tmpl = Template(val)
- return tmpl.substitute(StrWrapper(self))
+ context = [self, self.__dict__['__extra_context']]
+ return tmpl.substitute(StrWrapper(context))
return val
+
class StrWrapper(object):
- def __init__(self, obj):
- self.wrapped = obj
+ """Wrapper around FlagValues objects
+
+ Wraps FlagValues objects for string.Template so that we're
+ sure to return strings."""
+ def __init__(self, context_objs):
+ self.context_objs = context_objs
def __getitem__(self, name):
- if hasattr(self.wrapped, name):
- return str(getattr(self.wrapped, name))
- else:
- raise KeyError(name)
+ for context in self.context_objs:
+ val = getattr(context, name, False)
+ if val:
+ return str(val)
+ raise KeyError(name)
FLAGS = FlagValues()
gflags.FLAGS = FLAGS