Merge "Allow providing a default value to CLI loading"

This commit is contained in:
Jenkins
2014-08-26 20:44:03 +00:00
committed by Gerrit Code Review
2 changed files with 55 additions and 8 deletions

View File

@@ -14,9 +14,11 @@ import argparse
import os
from keystoneclient.auth import base
from keystoneclient import utils
def register_argparse_arguments(parser, argv):
@utils.positional()
def register_argparse_arguments(parser, argv, default=None):
"""Register CLI options needed to create a plugin.
The function inspects the provided arguments so that it can also register
@@ -24,13 +26,15 @@ def register_argparse_arguments(parser, argv):
:param argparse.ArgumentParser: the parser to attach argparse options to.
:param list argv: the arguments provided to the appliation.
:param str/class default: a default plugin name or a plugin object to use
if one isn't specified by the CLI. default: None.
:returns: The plugin class that will be loaded or None if not provided.
:raises exceptions.NoMatchingPlugin: if a plugin cannot be created.
"""
in_parser = argparse.ArgumentParser(add_help=False)
env_plugin = os.environ.get('OS_AUTH_PLUGIN')
env_plugin = os.environ.get('OS_AUTH_PLUGIN', default)
for p in (in_parser, parser):
p.add_argument('--os-auth-plugin',
metavar='<name>',
@@ -38,15 +42,18 @@ def register_argparse_arguments(parser, argv):
help='The auth plugin to load')
options, _args = in_parser.parse_known_args(argv)
name = options.os_auth_plugin
if not name:
if not options.os_auth_plugin:
return None
msg = 'Options specific to the %s plugin.' % name
group = parser.add_argument_group('Authentication Options', msg)
if isinstance(options.os_auth_plugin, type):
msg = 'Default Authentication options'
plugin = options.os_auth_plugin
else:
msg = 'Options specific to the %s plugin.' % options.os_auth_plugin
plugin = base.get_plugin_class(options.os_auth_plugin)
plugin = base.get_plugin_class(name)
group = parser.add_argument_group('Authentication Options', msg)
plugin.register_argparse_arguments(group)
return plugin
@@ -66,5 +73,9 @@ def load_from_argparse_arguments(namespace, **kwargs):
if not namespace.os_auth_plugin:
return None
plugin = base.get_plugin_class(namespace.os_auth_plugin)
if isinstance(namespace.os_auth_plugin, type):
plugin = namespace.os_auth_plugin
else:
plugin = base.get_plugin_class(namespace.os_auth_plugin)
return plugin.load_from_argparse_arguments(namespace, **kwargs)

View File

@@ -104,6 +104,42 @@ class CliTests(utils.TestCase):
self.assertEqual(self.a_float, a['a_float'])
self.assertEqual(3, a['a_int'])
@utils.mock_plugin
def test_with_default_string_value(self, m):
name = uuid.uuid4().hex
klass = cli.register_argparse_arguments(self.p, [], default=name)
self.assertIs(utils.MockPlugin, klass)
m.assert_called_once_with(name)
@utils.mock_plugin
def test_overrides_default_string_value(self, m):
name = uuid.uuid4().hex
default = uuid.uuid4().hex
argv = ['--os-auth-plugin', name]
klass = cli.register_argparse_arguments(self.p, argv, default=default)
self.assertIs(utils.MockPlugin, klass)
m.assert_called_once_with(name)
@utils.mock_plugin
def test_with_default_type_value(self, m):
klass = cli.register_argparse_arguments(self.p, [],
default=utils.MockPlugin)
self.assertIs(utils.MockPlugin, klass)
self.assertEqual(0, m.call_count)
@utils.mock_plugin
def test_overrides_default_type_value(self, m):
# using this test plugin would fail if called because there
# is no get_options() function
class TestPlugin(object):
pass
name = uuid.uuid4().hex
argv = ['--os-auth-plugin', name]
klass = cli.register_argparse_arguments(self.p, argv,
default=TestPlugin)
self.assertIs(utils.MockPlugin, klass)
m.assert_called_once_with(name)
def test_deprecated_cli_options(self):
TesterPlugin.register_argparse_arguments(self.p)
val = uuid.uuid4().hex