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
This commit is contained in:
Sudipta Biswas 2014-08-05 19:40:06 +05:30
parent a3022cfce0
commit 6b8a5f0e1d
2 changed files with 21 additions and 1 deletions

View File

@ -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},

View File

@ -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'