Merge "Add create_plugin to loader"
This commit is contained in:
commit
702f32a34b
|
@ -102,10 +102,28 @@ def get_plugin_options(name):
|
||||||
@six.add_metaclass(abc.ABCMeta)
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
class BaseLoader(object):
|
class BaseLoader(object):
|
||||||
|
|
||||||
@abc.abstractproperty
|
@property
|
||||||
def plugin_class(self):
|
def plugin_class(self):
|
||||||
raise NotImplemented()
|
raise NotImplemented()
|
||||||
|
|
||||||
|
def create_plugin(self, **kwargs):
|
||||||
|
"""Create a plugin from the options available for the loader.
|
||||||
|
|
||||||
|
Given the options that were specified by the loader create an
|
||||||
|
appropriate plugin. You can override this function in your loader.
|
||||||
|
|
||||||
|
This used to be specified by providing the plugin_class property and
|
||||||
|
this is still supported, however specifying a property didn't let you
|
||||||
|
choose a plugin type based upon the options that were presented.
|
||||||
|
|
||||||
|
Override this function if you wish to return different plugins based on
|
||||||
|
the options presented, otherwise you can simply provide the
|
||||||
|
plugin_class property.
|
||||||
|
|
||||||
|
Added 2.9
|
||||||
|
"""
|
||||||
|
return self.plugin_class(**kwargs)
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def get_options(self):
|
def get_options(self):
|
||||||
"""Return the list of parameters associated with the auth plugin.
|
"""Return the list of parameters associated with the auth plugin.
|
||||||
|
@ -143,7 +161,7 @@ class BaseLoader(object):
|
||||||
if missing_required:
|
if missing_required:
|
||||||
raise exceptions.MissingRequiredOptions(missing_required)
|
raise exceptions.MissingRequiredOptions(missing_required)
|
||||||
|
|
||||||
return self.plugin_class(**kwargs)
|
return self.create_plugin(**kwargs)
|
||||||
|
|
||||||
def load_from_options_getter(self, getter, **kwargs):
|
def load_from_options_getter(self, getter, **kwargs):
|
||||||
"""Load a plugin from getter function that returns appropriate values.
|
"""Load a plugin from getter function that returns appropriate values.
|
||||||
|
|
|
@ -19,6 +19,34 @@ from keystoneauth1 import loading
|
||||||
from keystoneauth1.tests.unit.loading import utils
|
from keystoneauth1.tests.unit.loading import utils
|
||||||
|
|
||||||
|
|
||||||
|
class PluginA(object):
|
||||||
|
|
||||||
|
def __init__(self, a):
|
||||||
|
self.val = a
|
||||||
|
|
||||||
|
|
||||||
|
class PluginB(object):
|
||||||
|
|
||||||
|
def __init__(self, b):
|
||||||
|
self.val = b
|
||||||
|
|
||||||
|
|
||||||
|
class TestSplitLoader(loading.BaseLoader):
|
||||||
|
|
||||||
|
def get_options(self):
|
||||||
|
opts = super(TestSplitLoader, self).get_options()
|
||||||
|
opts += [loading.Opt('a'), loading.Opt('b')]
|
||||||
|
return opts
|
||||||
|
|
||||||
|
def create_plugin(self, a=None, b=None, **kwargs):
|
||||||
|
if a:
|
||||||
|
return PluginA(a)
|
||||||
|
if b:
|
||||||
|
return PluginB(b)
|
||||||
|
|
||||||
|
raise AssertionError('Expected A or B')
|
||||||
|
|
||||||
|
|
||||||
class LoadingTests(utils.TestCase):
|
class LoadingTests(utils.TestCase):
|
||||||
|
|
||||||
def test_required_values(self):
|
def test_required_values(self):
|
||||||
|
@ -100,3 +128,18 @@ class LoadingTests(utils.TestCase):
|
||||||
self.assertEqual(99.99, p['a_float'])
|
self.assertEqual(99.99, p['a_float'])
|
||||||
self.assertEqual('another', p['a_str'])
|
self.assertEqual('another', p['a_str'])
|
||||||
self.assertEqual(66, p['a_int'])
|
self.assertEqual(66, p['a_int'])
|
||||||
|
|
||||||
|
def test_create_plugin_loader(self):
|
||||||
|
val_a = uuid.uuid4().hex
|
||||||
|
val_b = uuid.uuid4().hex
|
||||||
|
|
||||||
|
loader = TestSplitLoader()
|
||||||
|
|
||||||
|
plugin_a = loader.load_from_options(a=val_a)
|
||||||
|
plugin_b = loader.load_from_options(b=val_b)
|
||||||
|
|
||||||
|
self.assertIsInstance(plugin_a, PluginA)
|
||||||
|
self.assertIsInstance(plugin_b, PluginB)
|
||||||
|
|
||||||
|
self.assertEqual(val_a, plugin_a.val)
|
||||||
|
self.assertEqual(val_b, plugin_b.val)
|
||||||
|
|
Loading…
Reference in New Issue