summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2011-11-15 07:01:43 +0000
committerMark McLoughlin <markmc@redhat.com>2011-11-15 07:54:57 +0000
commit065a7ea03d97943cd669948ebaabd5271bf2afef (patch)
tree6beeaf0423c272aeb45409248d012d555fbb8232
parent06c8064af50a76dd276d472316f78780a170d6dc (diff)
downloadnova-065a7ea03d97943cd669948ebaabd5271bf2afef.tar.gz
nova-065a7ea03d97943cd669948ebaabd5271bf2afef.tar.xz
nova-065a7ea03d97943cd669948ebaabd5271bf2afef.zip
Fix multistring flags default handling (#890489)
With its 'append' action, optparse appends values to the supplied default value. This leaves the user with no way of overriding the default value. If you want to support overriding, you need to manually handle setting the default value after parsing. gflags supports overriding the default value so we must do the same. Change-Id: I5810e16806e74876c7a310edbb6f8f27f0a3313b
-rw-r--r--nova/flags.py17
-rw-r--r--nova/tests/test_flags.py6
2 files changed, 21 insertions, 2 deletions
diff --git a/nova/flags.py b/nova/flags.py
index bc4fd475d..1f85b3098 100644
--- a/nova/flags.py
+++ b/nova/flags.py
@@ -71,8 +71,20 @@ class FlagValues(object):
self._parser = optparse.OptionParser()
self._parser.disable_interspersed_args()
self._extra_context = extra_context
+ self._multistring_defaults = {}
self.Reset()
+ def _apply_multistring_defaults(self, values):
+ #
+ # This horrendous hack is to stop optparse appending
+ # values to the default value. See:
+ # http://bugs.python.org/issue5088
+ #
+ for flag, default in self._multistring_defaults.items():
+ if not getattr(values, flag):
+ setattr(values, flag, default)
+ return values
+
def _parse(self):
if not self._values is None:
return
@@ -101,6 +113,8 @@ class FlagValues(object):
finally:
self._parser.error = error_catcher.orig_error
+ values = self._apply_multistring_defaults(values)
+
(self._values, self._extra) = (values, extra)
def __call__(self, argv):
@@ -190,7 +204,8 @@ class FlagValues(object):
action='callback', callback=parse_list)
def define_multistring(self, name, default, help):
- self._add_option(name, default, help, action='append')
+ self._add_option(name, [], help, action='append')
+ self._multistring_defaults[name] = default
FLAGS = FlagValues()
diff --git a/nova/tests/test_flags.py b/nova/tests/test_flags.py
index dab11c5e0..2865eef55 100644
--- a/nova/tests/test_flags.py
+++ b/nova/tests/test_flags.py
@@ -74,7 +74,11 @@ class FlagsTestCase(test.TestCase):
self.assertEqual(self.FLAGS.float, 6.66)
def test_define_multistring(self):
- flags.DEFINE_multistring('multi', [], 'desc', flag_values=self.FLAGS)
+ flags.DEFINE_multistring('multi', ['blaa'], 'desc',
+ flag_values=self.FLAGS)
+
+ self.assert_(self.FLAGS['multi'])
+ self.assertEqual(self.FLAGS.multi, ['blaa'])
argv = ['flags_test', '--multi', 'foo', '--multi', 'bar']
self.FLAGS(argv)