summaryrefslogtreecommitdiffstats
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
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.
-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