summaryrefslogtreecommitdiffstats
path: root/nova
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
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')
-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