From: Sudipta Biswas Date: Tue, 5 Aug 2014 14:10:06 +0000 (+0530) Subject: Fix to throw correct error code for bad attribute X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=6b8a5f0e1d26d2721e7ad7fc67099ff8b880d9ec;p=openstack-build%2Fneutron-build.git Fix to throw correct error code for bad attribute Currently the neutron network API throws up error code 500 for the extended attribute for segmentation id. This can be reproduced if the user types in a random string in place of an integer value for the segmentation id. The proper behavior should throw an error code 400 with the appropriate failure message. This patch fixes the same issue and covers it with a test case. Change-Id: I4735e20f5b8b23c5b2a9d896415c2e84561a279c Closes-bug: #1348056 --- diff --git a/neutron/extensions/providernet.py b/neutron/extensions/providernet.py index 944de104f..2dc966ae7 100644 --- a/neutron/extensions/providernet.py +++ b/neutron/extensions/providernet.py @@ -35,7 +35,7 @@ EXTENDED_ATTRIBUTES_2_0 = { 'enforce_policy': True, 'is_visible': True}, SEGMENTATION_ID: {'allow_post': True, 'allow_put': True, - 'convert_to': int, + 'convert_to': attributes.convert_to_int, 'enforce_policy': True, 'default': attributes.ATTR_NOT_SPECIFIED, 'is_visible': True}, diff --git a/neutron/tests/unit/test_extension_pnet.py b/neutron/tests/unit/test_extension_pnet.py index e6959a122..211fe7151 100644 --- a/neutron/tests/unit/test_extension_pnet.py +++ b/neutron/tests/unit/test_extension_pnet.py @@ -122,6 +122,18 @@ class ProvidernetExtensionTestCase(testlib_api.WebTestCase): expect_errors=expect_errors) return res, data + def _post_network_with_bad_provider_attrs(self, ctx, bad_data, + expect_errors=False): + data = self._prepare_net_data() + data.update(bad_data) + env = {'neutron.context': ctx} + res = self.api.post(test_api_v2._get_path('networks', fmt=self.fmt), + self.serialize({'network': data}), + content_type='application/' + self.fmt, + extra_environ=env, + expect_errors=expect_errors) + return res, data + def test_network_create_with_provider_attrs(self): ctx = context.get_admin_context() ctx.tenant_id = 'an_admin' @@ -135,6 +147,14 @@ class ProvidernetExtensionTestCase(testlib_api.WebTestCase): network=exp_input) self.assertEqual(res.status_int, web_exc.HTTPCreated.code) + def test_network_create_with_bad_provider_attrs_400(self): + ctx = context.get_admin_context() + ctx.tenant_id = 'an_admin' + bad_data = {pnet.SEGMENTATION_ID: "abc"} + res, _1 = self._post_network_with_bad_provider_attrs(ctx, bad_data, + True) + self.assertEqual(web_exc.HTTPBadRequest.code, res.status_int) + def test_network_update_with_provider_attrs(self): ctx = context.get_admin_context() ctx.tenant_id = 'an_admin'