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
This commit is contained in:
		| @@ -20,6 +20,8 @@ __all__ = [ | |||||||
|     # auth.base |     # auth.base | ||||||
|     'AUTH_INTERFACE', |     'AUTH_INTERFACE', | ||||||
|     'BaseAuthPlugin', |     'BaseAuthPlugin', | ||||||
|  |     'get_available_plugin_names', | ||||||
|  |     'get_available_plugin_classes', | ||||||
|     'get_plugin_class', |     'get_plugin_class', | ||||||
|     'IDENTITY_AUTH_HEADER_NAME', |     'IDENTITY_AUTH_HEADER_NAME', | ||||||
|     'PLUGIN_NAMESPACE', |     'PLUGIN_NAMESPACE', | ||||||
|   | |||||||
| @@ -27,6 +27,34 @@ PLUGIN_NAMESPACE = 'keystoneclient.auth.plugin' | |||||||
| IDENTITY_AUTH_HEADER_NAME = 'X-Auth-Token' | 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): | def get_plugin_class(name): | ||||||
|     """Retrieve a plugin class by its entrypoint name. |     """Retrieve a plugin class by its entrypoint name. | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								keystoneclient/tests/unit/auth/test_auth.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								keystoneclient/tests/unit/auth/test_auth.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||||
		Reference in New Issue
	
	Block a user
	 Jamie Lennox
					Jamie Lennox