From f5e2aab08b9ce71067fade4af576062e5fdb7032 Mon Sep 17 00:00:00 2001 From: Jamie Lennox Date: Tue, 17 Feb 2015 16:19:19 +1100 Subject: Provide a means to get all installed plugins Particular for use in writing error messages and help text it can be useful to get a list of all the plugins that are installed on the system. Provide a version that returns the classes as well so that you don't have to reload the modules if the user is picking one. Closes-Bug: #1423711 Change-Id: I021249eac8156c2d3ccbbacb7503184b6eb6e784 --- keystoneclient/auth/__init__.py | 2 ++ keystoneclient/auth/base.py | 28 ++++++++++++++++++++++ keystoneclient/tests/unit/auth/test_auth.py | 36 +++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 keystoneclient/tests/unit/auth/test_auth.py diff --git a/keystoneclient/auth/__init__.py b/keystoneclient/auth/__init__.py index 463bcef..3b761c2 100644 --- a/keystoneclient/auth/__init__.py +++ b/keystoneclient/auth/__init__.py @@ -20,6 +20,8 @@ __all__ = [ # auth.base 'AUTH_INTERFACE', 'BaseAuthPlugin', + 'get_available_plugin_names', + 'get_available_plugin_classes', 'get_plugin_class', 'IDENTITY_AUTH_HEADER_NAME', 'PLUGIN_NAMESPACE', diff --git a/keystoneclient/auth/base.py b/keystoneclient/auth/base.py index b63d4c7..bfaea61 100644 --- a/keystoneclient/auth/base.py +++ b/keystoneclient/auth/base.py @@ -27,6 +27,34 @@ PLUGIN_NAMESPACE = 'keystoneclient.auth.plugin' IDENTITY_AUTH_HEADER_NAME = 'X-Auth-Token' +def get_available_plugin_names(): + """Get the names of all the plugins that are available on the system. + + This is particularly useful for help and error text to prompt a user for + example what plugins they may specify. + + :returns: A list of names. + :rtype: frozenset + """ + mgr = stevedore.ExtensionManager(namespace=PLUGIN_NAMESPACE, + invoke_on_load=False) + return frozenset(mgr.names()) + + +def get_available_plugin_classes(): + """Retrieve all the plugin classes available on the system. + + :returns: A dict with plugin entrypoint name as the key and the plugin + class as the value. + :rtype: dict + """ + mgr = stevedore.ExtensionManager(namespace=PLUGIN_NAMESPACE, + propagate_map_exceptions=True, + invoke_on_load=False) + + return dict(mgr.map(lambda ext: (ext.entry_point.name, ext.plugin))) + + def get_plugin_class(name): """Retrieve a plugin class by its entrypoint name. diff --git a/keystoneclient/tests/unit/auth/test_auth.py b/keystoneclient/tests/unit/auth/test_auth.py new file mode 100644 index 0000000..f490f2d --- /dev/null +++ b/keystoneclient/tests/unit/auth/test_auth.py @@ -0,0 +1,36 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from keystoneclient import auth +from keystoneclient.auth import identity +from keystoneclient.tests.unit.auth import utils + + +class AuthTests(utils.TestCase): + + def test_plugin_names_in_available(self): + plugins = auth.get_available_plugin_names() + + for p in ('password', 'v2password', 'v3password', + 'token', 'v2token', 'v3token'): + self.assertIn(p, plugins) + + def test_plugin_classes_in_available(self): + plugins = auth.get_available_plugin_classes() + + self.assertIs(plugins['password'], identity.Password) + self.assertIs(plugins['v2password'], identity.V2Password) + self.assertIs(plugins['v3password'], identity.V3Password) + + self.assertIs(plugins['token'], identity.Token) + self.assertIs(plugins['v2token'], identity.V2Token) + self.assertIs(plugins['v3token'], identity.V3Token) -- cgit v1.2.1