From 6b8a5f0e1d26d2721e7ad7fc67099ff8b880d9ec 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 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' -- 2.45.2