From ee0e546150ab74e7936a315865f8d4d436a1a9a0 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Mon, 10 Jun 2013 10:34:52 +0100 Subject: [PATCH] Some error handling improvements --- openstack/common/messaging/__init__.py | 8 +++- .../common/messaging/_drivers/impl_fake.py | 4 +- openstack/common/messaging/exceptions.py | 11 +++++- openstack/common/messaging/transport.py | 37 ++++++++++++++++--- 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/openstack/common/messaging/__init__.py b/openstack/common/messaging/__init__.py index 89d1ba3ee..9bc5b0d1c 100644 --- a/openstack/common/messaging/__init__.py +++ b/openstack/common/messaging/__init__.py @@ -13,10 +13,14 @@ # License for the specific language governing permissions and limitations # under the License. -from .exceptions import MessagingException -from .exceptions import MessagingTimeout from .rpc.client import RPCClient from .rpc.server import BlockingRPCServer from .serializer import Serializer from .target import Target from .transport import get_transport + +from .exceptions import MessagingException +from .exceptions import MessagingTimeout + +from .transport import DriverLoadFailure +from .transport import InvalidTransportURL diff --git a/openstack/common/messaging/_drivers/impl_fake.py b/openstack/common/messaging/_drivers/impl_fake.py index 92ebc02e3..a4e4236e5 100644 --- a/openstack/common/messaging/_drivers/impl_fake.py +++ b/openstack/common/messaging/_drivers/impl_fake.py @@ -20,7 +20,7 @@ import Queue import time from openstack.common.gettextutils import _ -from openstack.common.messaging import exceptions +from openstack.common import messaging from openstack.common.messaging._drivers import base from openstack.common.messaging import _utils as utils @@ -119,7 +119,7 @@ class FakeDriver(base.BaseDriver): break if timeout and (time.time() - start_time > timeout): - raise exceptions.MessagingTimeout( + raise messaging.MessagingTimeout( _('No listeners found for topic %s') % target.topic) time.sleep(.05) diff --git a/openstack/common/messaging/exceptions.py b/openstack/common/messaging/exceptions.py index c9fb5575e..54b123a07 100644 --- a/openstack/common/messaging/exceptions.py +++ b/openstack/common/messaging/exceptions.py @@ -13,9 +13,16 @@ # License for the specific language governing permissions and limitations # under the License. + class MessagingException(Exception): - pass + """Base class for exceptions.""" + + def __init__(self, msg=None): + self.msg = msg + + def __str__(self): + return self.msg class MessagingTimeout(MessagingException): - pass + """Raised if message sending times out.""" diff --git a/openstack/common/messaging/transport.py b/openstack/common/messaging/transport.py index dbd4cdafb..195774bd4 100644 --- a/openstack/common/messaging/transport.py +++ b/openstack/common/messaging/transport.py @@ -21,6 +21,9 @@ import urlparse from oslo.config import cfg from stevedore import driver +from openstack.common.messaging import exceptions + + _transport_opts = [ cfg.StrOpt('transport_url', default=None, @@ -75,6 +78,24 @@ class Transport(object): return self._driver.listen(target) +class InvalidTransportURL(exceptions.MessagingException): + """Raised if transport URL is invalid.""" + + def __init__(self, url, msg): + super(InvalidTransportURL, self).__init__(msg) + self.url = url + + +class DriverLoadFailure(exceptions.MessagingException): + """Raised if a transport driver can't be loaded.""" + + def __init__(self, driver, ex): + msg = 'Failed to load transport driver "%s": %s' % (driver, ex) + super(DriverLoadFailure, self).__init__(msg) + self.driver = driver + self.ex = ex + + def get_transport(conf, url=None): """A factory method for Transport objects. @@ -102,6 +123,8 @@ def get_transport(conf, url=None): url = url or conf.transport_url if url is not None: rpc_backend = urlparse.urlparse(url).scheme + if not rpc_backend: + raise InvalidTransportURL(url, 'No scheme specified in "%s"' % url) else: rpc_backend = conf.rpc_backend @@ -109,9 +132,13 @@ def get_transport(conf, url=None): if url is not None: kwargs['url'] = url - mgr = driver.DriverManager('openstack.common.messaging.drivers', - rpc_backend, - invoke_on_load=True, - invoke_args=[conf], - invoke_kwds=kwargs) + try: + mgr = driver.DriverManager('openstack.common.messaging.drivers', + rpc_backend, + invoke_on_load=True, + invoke_args=[conf], + invoke_kwds=kwargs) + except RuntimeError as ex: + raise DriverLoadFailure(rpc_backend, ex) + return Transport(mgr.driver)