summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-05-22 08:42:12 +0000
committerGerrit Code Review <review@openstack.org>2013-05-22 08:42:12 +0000
commitea4a642587c12852777d5af05e23fa6c0de51f16 (patch)
tree6b6198d56034845c7f330cb16e1d6e92c7933455
parent46382e32469f58f6b40fd986a665e75b076b068d (diff)
parente1f884174eb65895ade604933b25ed245fb45942 (diff)
downloadoslo-config-ea4a642587c12852777d5af05e23fa6c0de51f16.tar.gz
Merge "Allow Multiple sets of deprecated name/group for options"1.2.0a1
-rw-r--r--oslo/config/cfg.py75
-rw-r--r--tests/test_cfg.py44
2 files changed, 100 insertions, 19 deletions
diff --git a/oslo/config/cfg.py b/oslo/config/cfg.py
index 0fd6023..71702f3 100644
--- a/oslo/config/cfg.py
+++ b/oslo/config/cfg.py
@@ -524,7 +524,8 @@ class Opt(object):
def __init__(self, name, dest=None, short=None, default=None,
positional=False, metavar=None, help=None,
secret=False, required=False,
- deprecated_name=None, deprecated_group=None):
+ deprecated_name=None, deprecated_group=None,
+ deprecated_opts=None):
"""Construct an Opt object.
The only required parameter is the option's name. However, it is
@@ -541,6 +542,7 @@ class Opt(object):
:param required: true iff a value must be supplied for this option
:param deprecated_name: deprecated name option. Acts like an alias
:param deprecated_group: the group containing a deprecated alias
+ :param deprecated_opts: array of DeprecatedOpt(s)
"""
self.name = name
if dest is None:
@@ -555,10 +557,11 @@ class Opt(object):
self.secret = secret
self.required = required
if deprecated_name is not None:
- self.deprecated_name = deprecated_name.replace('-', '_')
- else:
- self.deprecated_name = None
- self.deprecated_group = deprecated_group
+ deprecated_name = deprecated_name.replace('-', '_')
+
+ self.deprecated_opts = copy.deepcopy(deprecated_opts) or []
+ self.deprecated_opts.append(DeprecatedOpt(deprecated_name,
+ group=deprecated_group))
def __ne__(self, another):
return vars(self) != vars(another)
@@ -579,10 +582,11 @@ class Opt(object):
"""If cannot find option as dest try deprecated_name alias."""
names = [(section, self.dest)]
- dname, dgroup = self.deprecated_name, self.deprecated_group
- if dname or dgroup:
- names.append((dgroup if dgroup else section,
- dname if dname else self.dest))
+ for opt in self.deprecated_opts:
+ dname, dgroup = opt.name, opt.group
+ if dname or dgroup:
+ names.append((dgroup if dgroup else section,
+ dname if dname else self.dest))
return cparser.get(names, multi)
@@ -599,10 +603,12 @@ class Opt(object):
container = self._get_argparse_container(parser, group)
kwargs = self._get_argparse_kwargs(group)
prefix = self._get_argparse_prefix('', group.name if group else None)
- deprecated_name = self._get_deprecated_cli_name(self.deprecated_name,
- self.deprecated_group)
- self._add_to_argparse(container, self.name, self.short, kwargs, prefix,
- self.positional, deprecated_name)
+ for opt in self.deprecated_opts:
+ deprecated_name = self._get_deprecated_cli_name(opt.name,
+ opt.group)
+ self._add_to_argparse(container, self.name, self.short,
+ kwargs, prefix,
+ self.positional, deprecated_name)
def _add_to_argparse(self, container, name, short, kwargs, prefix='',
positional=False, deprecated_name=None):
@@ -708,6 +714,36 @@ class Opt(object):
return self._get_argparse_prefix(prefix, dgroup) + dname
+class DeprecatedOpt(object):
+
+ """Represents a Deprecated option. Here's how you can use it
+
+ oldopts = [cfg.DeprecatedOpt('oldfoo', group='oldgroup'),
+ cfg.DeprecatedOpt('oldfoo2', group='oldgroup2')]
+ cfg.CONF.register_group(cfg.OptGroup('blaa'))
+ cfg.CONF.register_opt(cfg.StrOpt('foo', deprecated_opts=oldopts),
+ group='blaa')
+ """
+
+ def __init__(self, name, group=None):
+ """Constructs an DeprecatedOpt object.
+
+ :param name: the name of the option
+ :param group: the group of the option
+ """
+ self.name = name
+ self.group = group
+
+ def __key(self):
+ return (self.name, self.group)
+
+ def __eq__(x, y):
+ return x.__key() == y.__key()
+
+ def __hash__(self):
+ return hash(self.__key())
+
+
class StrOpt(Opt):
"""String options.
@@ -758,12 +794,13 @@ class BoolOpt(Opt):
container = self._get_argparse_container(parser, group)
kwargs = self._get_argparse_kwargs(group, action='store_false')
prefix = self._get_argparse_prefix('no', group.name if group else None)
- deprecated_name = self._get_deprecated_cli_name(self.deprecated_name,
- self.deprecated_group,
- prefix='no')
- kwargs["help"] = "The inverse of --" + self.name
- self._add_to_argparse(container, self.name, None, kwargs, prefix,
- self.positional, deprecated_name)
+ for opt in self.deprecated_opts:
+ deprecated_name = self._get_deprecated_cli_name(opt.name,
+ opt.group,
+ prefix='no')
+ kwargs["help"] = "The inverse of --" + self.name
+ self._add_to_argparse(container, self.name, None, kwargs, prefix,
+ self.positional, deprecated_name)
def _get_argparse_kwargs(self, group, action='store_true', **kwargs):
"""Extends the base argparse keyword dict for boolean options."""
diff --git a/tests/test_cfg.py b/tests/test_cfg.py
index 06e928a..26ccade 100644
--- a/tests/test_cfg.py
+++ b/tests/test_cfg.py
@@ -2470,3 +2470,47 @@ class SetDefaultsTestCase(BaseTestCase):
cfg.set_defaults(opts, foo='bar')
self.conf([])
self.assertEquals(self.conf.blaa.foo, 'bar')
+
+
+class MultipleDeprecatedOptionsTestCase(BaseTestCase):
+
+ def test_conf_file_override_use_deprecated_name_and_group(self):
+ self.conf.register_group(cfg.OptGroup('blaa'))
+ self.conf.register_opt(cfg.StrOpt('foo',
+ deprecated_name='oldfoo',
+ deprecated_group='oldgroup'),
+ group='blaa')
+
+ paths = self.create_tempfiles([('test',
+ '[oldgroup]\n'
+ 'oldfoo = bar\n')])
+
+ self.conf(['--config-file', paths[0]])
+ self.assertEquals(self.conf.blaa.foo, 'bar')
+
+ def test_conf_file_override_use_deprecated_opts(self):
+ self.conf.register_group(cfg.OptGroup('blaa'))
+ oldopts = [cfg.DeprecatedOpt('oldfoo', group='oldgroup')]
+ self.conf.register_opt(cfg.StrOpt('foo', deprecated_opts=oldopts),
+ group='blaa')
+
+ paths = self.create_tempfiles([('test',
+ '[oldgroup]\n'
+ 'oldfoo = bar\n')])
+
+ self.conf(['--config-file', paths[0]])
+ self.assertEquals(self.conf.blaa.foo, 'bar')
+
+ def test_conf_file_override_use_deprecated_multi_opts(self):
+ self.conf.register_group(cfg.OptGroup('blaa'))
+ oldopts = [cfg.DeprecatedOpt('oldfoo', group='oldgroup'),
+ cfg.DeprecatedOpt('oldfoo2', group='oldgroup2')]
+ self.conf.register_opt(cfg.StrOpt('foo', deprecated_opts=oldopts),
+ group='blaa')
+
+ paths = self.create_tempfiles([('test',
+ '[oldgroup2]\n'
+ 'oldfoo2 = bar\n')])
+
+ self.conf(['--config-file', paths[0]])
+ self.assertEquals(self.conf.blaa.foo, 'bar')