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