Add name parameter to NoMatchingPlugin exception

If you want to handle a NoMatchingPlugin exception rather than simply
exit then the name of the missing plugin is generally more useful than
the message.

The exception is specific enough that you can know what went wrong, but
you cannot determine the name of the missing plugin if you want to do
your own logging - only use the message that is generated.

We should keep the message but expose the plugin name as well.

Closes-Bug: #1410391
Change-Id: Ic93ec6583b8d7797529d36d63995ef0d8db754f1
This commit is contained in:
Jamie Lennox 2014-12-08 13:12:53 +10:00
parent bf99f4c1ef
commit c57e562d2b
3 changed files with 20 additions and 8 deletions

View File

@ -17,7 +17,6 @@ import six
import stevedore
from keystoneclient import exceptions
from keystoneclient.i18n import _
# NOTE(jamielennox): The AUTH_INTERFACE is a special value that can be
@ -44,8 +43,7 @@ def get_plugin_class(name):
name=name,
invoke_on_load=False)
except RuntimeError:
msg = _('The plugin %s could not be found') % name
raise exceptions.NoMatchingPlugin(msg)
raise exceptions.NoMatchingPlugin(name)
return mgr.driver

View File

@ -81,8 +81,19 @@ class MissingAuthPlugin(ClientException):
class NoMatchingPlugin(ClientException):
"""There were no auth plugins that could be created from the parameters
provided.
:param str name: The name of the plugin that was attempted to load.
.. py:attribute:: name
The name of the plugin that was attempted to load.
"""
def __init__(self, name):
self.name = name
msg = _('The plugin %s could not be found') % name
super(NoMatchingPlugin, self).__init__(msg)
class InvalidResponse(ClientException):
"""The response from the server is not valid for this request."""

View File

@ -92,13 +92,16 @@ class ConfTests(utils.TestCase):
self.assertEqual(project_domain_name, a.project_domain_name)
def test_loading_invalid_plugin(self):
self.conf_fixture.config(auth_plugin=uuid.uuid4().hex,
auth_plugin = uuid.uuid4().hex
self.conf_fixture.config(auth_plugin=auth_plugin,
group=self.GROUP)
self.assertRaises(exceptions.NoMatchingPlugin,
conf.load_from_conf_options,
self.conf_fixture.conf,
self.GROUP)
e = self.assertRaises(exceptions.NoMatchingPlugin,
conf.load_from_conf_options,
self.conf_fixture.conf,
self.GROUP)
self.assertEqual(auth_plugin, e.name)
def test_loading_with_no_data(self):
self.assertIsNone(conf.load_from_conf_options(self.conf_fixture.conf,