summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/flags.py114
-rw-r--r--nova/tests/test_service.py4
2 files changed, 45 insertions, 73 deletions
diff --git a/nova/flags.py b/nova/flags.py
index dc4e648f0..270190a77 100644
--- a/nova/flags.py
+++ b/nova/flags.py
@@ -19,22 +19,21 @@
"""Command-line flag library.
-Emulates gflags by wrapping optparse.
+Emulates gflags by wrapping cfg.ConfigOpts.
-The idea is to move to optparse eventually, and this wrapper is a
+The idea is to move fully to cfg eventually, and this wrapper is a
stepping stone.
"""
-import copy
-import optparse
import os
import socket
-import string
import sys
import gflags
+from nova.common import cfg
+
class FlagValues(object):
class Flag:
@@ -69,76 +68,50 @@ class FlagValues(object):
return filter(lambda i: i == a or i.startswith(a + "="), args)[0]
def __init__(self):
- self._parser = optparse.OptionParser()
- self._parser.disable_interspersed_args()
- self._multistring_defaults = {}
+ self._conf = cfg.ConfigOpts()
+ self._conf._oparser.disable_interspersed_args()
+ self._opts = {}
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:
+ if self._extra is not None:
return
args = gflags.FlagValues().ReadFlagsFromFiles(self._args)
- values = extra = None
-
- #
- # This horrendous hack is needed because optparse only
- # shallow copies its defaults dict before parsing
- #
- defaults = copy.deepcopy(self._parser.defaults)
+ extra = None
#
# This horrendous hack allows us to stop optparse
# exiting when it encounters an unknown option
#
- error_catcher = self.ErrorCatcher(self._parser.error)
- self._parser.error = error_catcher.catch
+ error_catcher = self.ErrorCatcher(self._conf._oparser.error)
+ self._conf._oparser.error = error_catcher.catch
try:
while True:
error_catcher.reset()
- (values, extra) = self._parser.parse_args(args)
+ extra = self._conf(args)
unknown = error_catcher.get_unknown_arg(args)
if not unknown:
break
args.remove(unknown)
- self._parser.defaults = defaults
- defaults = copy.deepcopy(defaults)
finally:
- self._parser.error = error_catcher.orig_error
- self._parser.defaults = defaults
+ self._conf._oparser.error = error_catcher.orig_error
- values = self._apply_multistring_defaults(values)
-
- (self._values, self._extra) = (values, extra)
+ self._extra = extra
def __call__(self, argv):
+ self.Reset()
self._args = argv[1:]
- self._values = None
self._parse()
return [argv[0]] + self._extra
def __getattr__(self, name):
self._parse()
- val = getattr(self._values, name)
- if type(val) is str:
- tmpl = string.Template(val)
- return tmpl.substitute(vars(self._values))
- return val
+ return getattr(self._conf, name)
def get(self, name, default):
value = getattr(self, name)
@@ -149,11 +122,10 @@ class FlagValues(object):
def __contains__(self, name):
self._parse()
- return hasattr(self._values, name)
+ return hasattr(self._conf, name)
def _update_default(self, name, default):
- self._parser.set_default(name, default)
- self._values = None
+ self._conf.set_default(name, default)
def __iter__(self):
return self.FlagValuesDict().iterkeys()
@@ -165,55 +137,51 @@ class FlagValues(object):
return self.Flag(name, getattr(self, name), self._update_default)
def Reset(self):
+ self._conf.reset()
self._args = []
- self._values = None
self._extra = None
def ParseNewFlags(self):
pass
def FlagValuesDict(self):
+ self._parse()
ret = {}
- for opt in self._parser.option_list:
- if opt.dest:
- ret[opt.dest] = getattr(self, opt.dest)
+ for opt in self._opts.values():
+ ret[opt.dest] = getattr(self, opt.dest)
return ret
- def _add_option(self, name, default, help, prefix='--', **kwargs):
- prefixed_name = prefix + name
- for opt in self._parser.option_list:
- if prefixed_name == opt.get_opt_string():
- return
- self._parser.add_option(prefixed_name, dest=name,
- default=default, help=help, **kwargs)
- self._values = None
+ def _add_option(self, opt):
+ if opt.dest in self._opts:
+ return
+
+ self._opts[opt.dest] = opt
+
+ try:
+ self._conf.register_cli_opts(self._opts.values())
+ except cfg.ArgsAlreadyParsedError:
+ self._conf.reset()
+ self._conf.register_cli_opts(self._opts.values())
+ self._extra = None
def define_string(self, name, default, help):
- self._add_option(name, default, help)
+ self._add_option(cfg.StrOpt(name, default=default, help=help))
def define_integer(self, name, default, help):
- self._add_option(name, default, help, type='int')
+ self._add_option(cfg.IntOpt(name, default=default, help=help))
def define_float(self, name, default, help):
- self._add_option(name, default, help, type='float')
+ self._add_option(cfg.FloatOpt(name, default=default, help=help))
def define_bool(self, name, default, help):
- #
- # FIXME(markmc): this doesn't support --boolflag=true/false/t/f/1/0
- #
- self._add_option(name, default, help, action='store_true')
- self._add_option(name, default, help,
- prefix="--no", action='store_false')
+ self._add_option(cfg.BoolOpt(name, default=default, help=help))
def define_list(self, name, default, help):
- def parse_list(option, opt, value, parser):
- setattr(self._parser.values, name, value.split(','))
- self._add_option(name, default, help, type='string',
- action='callback', callback=parse_list)
+ self._add_option(cfg.ListOpt(name, default=default, help=help))
def define_multistring(self, name, default, help):
- self._add_option(name, [], help, action='append')
- self._multistring_defaults[name] = default
+ self._add_option(cfg.MultiStrOpt(name, default=default, help=help))
+
FLAGS = FlagValues()
diff --git a/nova/tests/test_service.py b/nova/tests/test_service.py
index 760b150be..0e9ffda35 100644
--- a/nova/tests/test_service.py
+++ b/nova/tests/test_service.py
@@ -35,6 +35,10 @@ from nova.compute import manager as compute_manager
flags.DEFINE_string("fake_manager", "nova.tests.test_service.FakeManager",
"Manager for testing")
+flags.DEFINE_string("test_service_listen", None,
+ "Host to bind test service to")
+flags.DEFINE_integer("test_service_listen_port", 0,
+ "Port number to bind test service to")
class FakeManager(manager.Manager):