From 54ea36a5076a7399646a482cc7949e55912a605d Mon Sep 17 00:00:00 2001 From: Sudipta Biswas Date: Tue, 5 Aug 2014 19:40:06 +0530 Subject: [PATCH] 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 --- neutron/extensions/providernet.py | 2 +- neutron/tests/unit/test_extension_pnet.py | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/neutron/extensions/providernet.py b/neutron/extensions/providernet.py index 944de104fb..2dc966ae72 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 e6959a1227..211fe7151c 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'