Merge "Propagate AttributeErrors when lazily loading plugins"

This commit is contained in:
Jenkins 2016-04-18 17:01:42 +00:00 committed by Gerrit Code Review
commit 1de0831b63
3 changed files with 24 additions and 1 deletions

View File

@ -22,8 +22,10 @@ import sys
from oslo_utils import strutils
import requests
import six
from openstackclient.api import auth
from openstackclient.common import exceptions
from openstackclient.common import session as osc_session
from openstackclient.identity import client as identity_client
@ -45,7 +47,13 @@ class ClientCache(object):
def __get__(self, instance, owner):
# Tell the ClientManager to login to keystone
if self._handle is None:
self._handle = self.factory(instance)
try:
self._handle = self.factory(instance)
except AttributeError as err:
# Make sure the failure propagates. Otherwise, the plugin just
# quietly isn't there.
new_err = exceptions.PluginAttributeError(err)
six.reraise(new_err.__class__, new_err, sys.exc_info()[2])
return self._handle

View File

@ -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

View File

@ -41,6 +41,7 @@ auth.get_options_list()
class Container(object):
attr = clientmanager.ClientCache(lambda x: object())
buggy_attr = clientmanager.ClientCache(lambda x: x.foo)
def __init__(self):
pass
@ -72,6 +73,13 @@ class TestClientCache(utils.TestCase):
c = Container()
self.assertEqual(c.attr, c.attr)
def test_attribute_error_propagates(self):
c = Container()
err = self.assertRaises(exc.PluginAttributeError,
getattr, c, 'buggy_attr')
self.assertNotIsInstance(err, AttributeError)
self.assertEqual("'Container' object has no attribute 'foo'", str(err))
class TestClientManager(utils.TestCase):