summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Lennox <jamielennox@gmail.com>2015-11-30 14:32:01 +1100
committerJamie Lennox <jamielennox@gmail.com>2015-11-30 14:37:12 +1100
commit01b446c1fa317fd75db950bb7bcc840e6b0a2225 (patch)
tree51a05204dd8736ed27ff91e97f3c255c7f15202a
parentbb73a14d2419239133e21673754a6994e885e2a0 (diff)
downloadstevedore-01b446c1fa317fd75db950bb7bcc840e6b0a2225.tar.gz
Use Stevedore exceptions for finding extensions1.10.0
When there are no extensions or multiple extensions found for a namespace stevedore raises RuntimeErrors. This means that consuming applications must catch RuntimeErrors when loading plugins which may mask errors coming from the plugin itself. Instead have stevedore raise an error specific to the failure case that can be handled from an application. Change-Id: I0ab0556a589453bd8631d77f42506100b278a83d Closes-Bug: #1501324
-rw-r--r--stevedore/dispatch.py3
-rw-r--r--stevedore/driver.py9
-rw-r--r--stevedore/exception.py10
-rw-r--r--stevedore/extension.py3
-rw-r--r--stevedore/tests/test_driver.py5
-rw-r--r--stevedore/tests/test_extension.py3
6 files changed, 24 insertions, 9 deletions
diff --git a/stevedore/dispatch.py b/stevedore/dispatch.py
index 226d3ae..424d39b 100644
--- a/stevedore/dispatch.py
+++ b/stevedore/dispatch.py
@@ -1,6 +1,7 @@
import logging
from .enabled import EnabledExtensionManager
+from .exception import NoMatches
LOG = logging.getLogger(__name__)
@@ -66,7 +67,7 @@ class DispatchExtensionManager(EnabledExtensionManager):
"""
if not self.extensions:
# FIXME: Use a more specific exception class here.
- raise RuntimeError('No %s extensions found' % self.namespace)
+ raise NoMatches('No %s extensions found' % self.namespace)
response = []
for e in self.extensions:
if filter_func(e, *args, **kwds):
diff --git a/stevedore/driver.py b/stevedore/driver.py
index fedc359..a2825aa 100644
--- a/stevedore/driver.py
+++ b/stevedore/driver.py
@@ -1,3 +1,4 @@
+from .exception import NoMatches, MultipleMatches
from .named import NamedExtensionManager
@@ -93,14 +94,14 @@ class DriverManager(NamedExtensionManager):
if not self.extensions:
name = self._names[0]
- raise RuntimeError('No %r driver found, looking for %r' %
- (self.namespace, name))
+ raise NoMatches('No %r driver found, looking for %r' %
+ (self.namespace, name))
if len(self.extensions) > 1:
discovered_drivers = ','.join(e.entry_point_target
for e in self.extensions)
- raise RuntimeError('Multiple %r drivers found: %s' %
- (self.namespace, discovered_drivers))
+ raise MultipleMatches('Multiple %r drivers found: %s' %
+ (self.namespace, discovered_drivers))
def __call__(self, func, *args, **kwds):
"""Invokes func() for the single loaded extension.
diff --git a/stevedore/exception.py b/stevedore/exception.py
new file mode 100644
index 0000000..10c5cc2
--- /dev/null
+++ b/stevedore/exception.py
@@ -0,0 +1,10 @@
+class NoUniqueMatch(RuntimeError):
+ """There was more that one on no extensions matching the query."""
+
+
+class NoMatches(NoUniqueMatch):
+ """There were no extensions with the diver name found."""
+
+
+class MultipleMatches(NoUniqueMatch):
+ """There were multiple matches for the given name."""
diff --git a/stevedore/extension.py b/stevedore/extension.py
index 5da97c5..d240988 100644
--- a/stevedore/extension.py
+++ b/stevedore/extension.py
@@ -5,6 +5,7 @@ import pkg_resources
import logging
+from .exception import NoMatches
LOG = logging.getLogger(__name__)
@@ -218,7 +219,7 @@ class ExtensionManager(object):
"""
if not self.extensions:
# FIXME: Use a more specific exception class here.
- raise RuntimeError('No %s extensions found' % self.namespace)
+ raise NoMatches('No %s extensions found' % self.namespace)
response = []
for e in self.extensions:
self._invoke_one_plugin(response.append, func, e, args, kwds)
diff --git a/stevedore/tests/test_driver.py b/stevedore/tests/test_driver.py
index ff9c3ea..0a919cf 100644
--- a/stevedore/tests/test_driver.py
+++ b/stevedore/tests/test_driver.py
@@ -4,6 +4,7 @@
import pkg_resources
from stevedore import driver
+from stevedore import exception
from stevedore import extension
from stevedore.tests import test_extension
from stevedore.tests import utils
@@ -37,7 +38,7 @@ class TestCallback(utils.TestCase):
def test_no_drivers(self):
try:
driver.DriverManager('stevedore.test.extension.none', 't1')
- except RuntimeError as err:
+ except exception.NoMatches as err:
self.assertIn("No 'stevedore.test.extension.none' driver found",
str(err))
@@ -70,7 +71,7 @@ class TestCallback(utils.TestCase):
dm = driver.DriverManager.make_test_instance(extensions[0])
# Call the initialization code that verifies the extension
dm._init_plugins(extensions)
- except RuntimeError as err:
+ except exception.MultipleMatches as err:
self.assertIn("Multiple", str(err))
else:
self.fail('Should have had an error')
diff --git a/stevedore/tests/test_extension.py b/stevedore/tests/test_extension.py
index b05b377..1fe0242 100644
--- a/stevedore/tests/test_extension.py
+++ b/stevedore/tests/test_extension.py
@@ -3,6 +3,7 @@
import mock
+from stevedore import exception
from stevedore import extension
from stevedore.tests import utils
@@ -159,7 +160,7 @@ class TestCallback(utils.TestCase):
)
try:
em.map(mapped, 1, 2, a='A', b='B')
- except RuntimeError as err:
+ except exception.NoMatches as err:
self.assertEqual(expected_str, str(err))
def test_map_method(self):