From 3a0c7fd6652b3ace0d28d5f67aa12227b710e239 Mon Sep 17 00:00:00 2001 From: Brian Curtin Date: Thu, 19 Mar 2015 10:01:55 -0500 Subject: [PATCH] Raise NotFoundException for 404s We need to provide better exceptions on top of 404s, so rather than having multiple places in Resources or Proxies checkout HttpException.status_code, we should capture that early and raise this more specific exception. Change-Id: I4b50f54bc6236fecb4b9262417259fd32a2bcd65 --- openstack/exceptions.py | 5 +++++ openstack/tests/test_transport.py | 2 +- openstack/transport.py | 13 +++++++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/openstack/exceptions.py b/openstack/exceptions.py index ae3ed563..5180cc43 100644 --- a/openstack/exceptions.py +++ b/openstack/exceptions.py @@ -75,6 +75,11 @@ class HttpException(SDKException): return self.__unicode__() +class NotFoundException(HttpException): + """HTTP 404 Not Found.""" + pass + + class MethodNotSupported(SDKException): """The resource does not support this operation type.""" pass diff --git a/openstack/tests/test_transport.py b/openstack/tests/test_transport.py index c14e79b6..469ef58d 100644 --- a/openstack/tests/test_transport.py +++ b/openstack/tests/test_transport.py @@ -273,7 +273,7 @@ class TestTransport(base.TestTransportBase): status = 404 self.stub_url(httpretty.GET, status=status) - exc = self.assertRaises(exceptions.HttpException, xport.get, + exc = self.assertRaises(exceptions.NotFoundException, xport.get, self.TEST_URL) self.assertEqual(status, exc.status_code) diff --git a/openstack/transport.py b/openstack/transport.py index 133c9371..c5925304 100644 --- a/openstack/transport.py +++ b/openstack/transport.py @@ -262,10 +262,15 @@ class Transport(requests.Session): try: resp.raise_for_status() except requests.RequestException as e: - raise exceptions.HttpException( - six.text_type(e), - details=self._parse_error_response(resp), - status_code=resp.status_code) + if resp.status_code == 404: + exc_type = exceptions.NotFoundException + else: + exc_type = exceptions.HttpException + + raise exc_type(six.text_type(e), + details=self._parse_error_response(resp), + status_code=resp.status_code) + if accept == JSON: try: resp.body = resp.json()