diff --git a/quantum/api/v2/resource.py b/quantum/api/v2/resource.py index 97fc8a8ada..bf9bcb132c 100644 --- a/quantum/api/v2/resource.py +++ b/quantum/api/v2/resource.py @@ -94,6 +94,17 @@ def Resource(controller, faults=None, deserializers=None, serializers=None): e.body = serializer.serialize({'QuantumError': e}) e.content_type = content_type raise + except NotImplementedError as e: + # NOTE(armando-migliaccio): from a client standpoint + # it makes sense to receive these errors, because + # extensions may or may not be implemented by + # the underlying plugin. So if something goes south, + # because a plugin does not implement a feature, + # returning 500 is definitely confusing. + body = serializer.serialize( + {'NotImplementedError': e.message}) + kwargs = {'body': body, 'content_type': content_type} + raise webob.exc.HTTPNotImplemented(**kwargs) except Exception as e: # NOTE(jkoelker) Everyting else is 500 LOG.exception(_('%s failed'), action) diff --git a/quantum/tests/unit/test_extensions.py b/quantum/tests/unit/test_extensions.py index 3ac43b2b64..a1bd09e5ac 100644 --- a/quantum/tests/unit/test_extensions.py +++ b/quantum/tests/unit/test_extensions.py @@ -76,7 +76,7 @@ class ResourceExtensionTest(base.BaseTestCase): return {'data': {'id': id}} def notimplemented_function(self, request, id): - return webob.exc.HTTPClientError(NotImplementedError()) + return webob.exc.HTTPNotImplemented() def custom_member_action(self, request, id): return {'member_action': 'value'} @@ -114,8 +114,8 @@ class ResourceExtensionTest(base.BaseTestCase): test_app.get("/tweedles/some_id/notimplemented_function") # Shouldn't be reached self.assertTrue(False) - except webtest.AppError: - pass + except webtest.AppError as e: + self.assertTrue('501' in e.message) def test_resource_can_be_added_as_extension(self): res_ext = extensions.ResourceExtension(