diff --git a/ooi/api/helpers.py b/ooi/api/helpers.py index 584ff3c..0bc4c50 100644 --- a/ooi/api/helpers.py +++ b/ooi/api/helpers.py @@ -88,16 +88,26 @@ def exception_from_response(response): 501: webob.exc.HTTPNotImplemented, 503: webob.exc.HTTPServiceUnavailable, } + + message = ('Unexpected API Error. Please report this at ' + 'http://bugs.launchpad.net/ooi/ and attach the ooi ' + 'API log if possible.') + code = response.status_int exc = exceptions.get(code, webob.exc.HTTPInternalServerError) - try: - message = response.json_body.popitem()[1].get("message") - exc = exc(explanation=message) - except Exception: - LOG.exception("Unknown error happenened processing response %s" - % response) - return webob.exc.HTTPInternalServerError() - return exc + + if code in exceptions: + try: + message = response.json_body.popitem()[1].get("message") + except Exception: + LOG.exception("Unknown error happenened processing response %s" + % response) + exc = webob.exc.HTTPInternalServerError + else: + LOG.error("Nova returned an internal server error %s" + % response) + + return exc(explanation=message) class BaseHelper(object): diff --git a/ooi/tests/unit/controllers/test_helpers.py b/ooi/tests/unit/controllers/test_helpers.py index 7f2c48e..2b39875 100644 --- a/ooi/tests/unit/controllers/test_helpers.py +++ b/ooi/tests/unit/controllers/test_helpers.py @@ -114,9 +114,6 @@ class TestExceptionHelper(base.TestCase): 429: webob.exc.HTTPTooManyRequests, 501: webob.exc.HTTPNotImplemented, 503: webob.exc.HTTPServiceUnavailable, - # Any other thing should be a 500 - 500: webob.exc.HTTPInternalServerError, - 507: webob.exc.HTTPInternalServerError, } for code, exception in six.iteritems(code_and_exception): @@ -126,6 +123,23 @@ class TestExceptionHelper(base.TestCase): self.assertIsInstance(ret, exception) self.assertEqual(fault["computeFault"]["message"], ret.explanation) + def test_unexpected_exception(self): + code_and_exception = { + 500: webob.exc.HTTPInternalServerError, + # Any other thing should be a 500 + 507: webob.exc.HTTPInternalServerError, + } + message = ("Unexpected API Error. Please report this at " + "http://bugs.launchpad.net/ooi/ and attach the " + "ooi API log if possible.") + + for code, exception in six.iteritems(code_and_exception): + fault = self.get_fault(code) + resp = fakes.create_fake_json_resp(fault, code) + ret = helpers.exception_from_response(resp) + self.assertIsInstance(ret, exception) + self.assertEqual(message, ret.explanation) + def test_error_handling_exception(self): fault = {} resp = fakes.create_fake_json_resp(fault, 404)