summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Lennox <jamielennox@redhat.com>2015-02-17 16:19:19 +1100
committerJamie Lennox <jamielennox@redhat.com>2015-04-15 11:36:15 +1000
commitf5e2aab08b9ce71067fade4af576062e5fdb7032 (patch)
tree957b9e8ee45eb7ec4ab71b0402c5b3408715702f
parent96c038004fbd42b391926038ffd7429a7de12500 (diff)
downloadpython-keystoneclient-f5e2aab08b9ce71067fade4af576062e5fdb7032.tar.gz
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
-rw-r--r--keystoneclient/auth/__init__.py2
-rw-r--r--keystoneclient/auth/base.py28
-rw-r--r--keystoneclient/tests/unit/auth/test_auth.py36
3 files changed, 66 insertions, 0 deletions
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)