From 926330d3726e9ce7001190730c69bf6ee45b422a Mon Sep 17 00:00:00 2001 From: Tim Burke Date: Thu, 14 Apr 2016 14:18:16 -0700 Subject: Propagate AttributeErrors when lazily loading plugins Previously, if an AttributeError was raised in a plugin's make_client method, the plugin simply wouldn't be an attribute of the ClientManager, producing tracebacks like Traceback (most recent call last): File ".../openstackclient/shell.py", line 118, in run ret_val = super(OpenStackShell, self).run(argv) ... File ".../openstackclient/object/v1/container.py", line 150, in take_action data = self.app.client_manager.object_store.container_list( File ".../openstackclient/common/clientmanager.py", line 66, in __getattr__ raise AttributeError(name) AttributeError: object_store This made writing minimal third-party auth plugins difficult, as it obliterated the original AttributeError. Now, AttributeErrors that are raised during plugin initialization will be re-raised as PluginAttributeErrors, and the original traceback will be preserved. This gives much more useful information to plugin developers, as in Traceback (most recent call last): File ".../openstackclient/shell.py", line 118, in run ret_val = super(OpenStackShell, self).run(argv) ... File ".../openstackclient/object/v1/container.py", line 150, in take_action data = self.app.client_manager.object_store.container_list( File ".../openstackclient/common/clientmanager.py", line 57, in __get__ err_val, err_tb) File ".../openstackclient/common/clientmanager.py", line 51, in __get__ self._handle = self.factory(instance) File ".../openstackclient/object/client.py", line 35, in make_client interface=instance._interface, File ".../openstackclient/common/clientmanager.py", line 258, in get_endpoint_for_service_type endpoint = self.auth_ref.service_catalog.url_for( PluginAttributeError: 'NoneType' object has no attribute 'url_for' Change-Id: I0eee7eba6eccc6d471a699a381185c4e76da10bd --- openstackclient/common/exceptions.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'openstackclient/common/exceptions.py') diff --git a/openstackclient/common/exceptions.py b/openstackclient/common/exceptions.py index 5f81e6a6..bdc33ddb 100644 --- a/openstackclient/common/exceptions.py +++ b/openstackclient/common/exceptions.py @@ -24,6 +24,13 @@ class AuthorizationFailure(Exception): pass +class PluginAttributeError(Exception): + """A plugin threw an AttributeError while being lazily loaded.""" + # This *must not* inherit from AttributeError; + # that would defeat the whole purpose. + pass + + class NoTokenLookupException(Exception): """This does not support looking up endpoints from an existing token.""" pass -- cgit v1.2.1