]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Raising error if invalid attribute passed in.
authorJason Zhang <zhesen@nttmcl.com>
Wed, 13 Feb 2013 02:40:12 +0000 (18:40 -0800)
committerJason Zhang <zhesen@nttmcl.com>
Tue, 19 Feb 2013 19:38:53 +0000 (11:38 -0800)
400 will be returned when invalid attributes
are passed into Quantum API.

Fixed the some test cases failed since the
enforcement of invalid attribute checking

Fixes: bug #1076179
Change-Id: I4e9e2891c444f9dcd051f7b325d3c9403b28db86

quantum/api/v2/base.py
quantum/tests/unit/test_api_v2.py
quantum/tests/unit/test_db_plugin.py
quantum/tests/unit/test_servicetype.py

index 463fb77f554ab4d5d541a26943e51393de167347..01a4a84922077f5e1ee88124978ac8e7e1f48f56 100644 (file)
@@ -482,6 +482,8 @@ class Controller(object):
 
         Controller._populate_tenant_id(context, res_dict, is_create)
 
+        Controller._verify_attributes(res_dict, attr_info)
+
         if is_create:  # POST
             for attr, attr_vals in attr_info.iteritems():
                 if attr_vals['allow_post']:
@@ -522,6 +524,13 @@ class Controller(object):
                     raise webob.exc.HTTPBadRequest(msg)
         return body
 
+    @staticmethod
+    def _verify_attributes(res_dict, attr_info):
+        extra_keys = set(res_dict.keys()) - set(attr_info.keys())
+        if extra_keys:
+            msg = _("Unrecognized attribute(s) '%s'") % ', '.join(extra_keys)
+            raise webob.exc.HTTPBadRequest(msg)
+
     def _validate_network_tenant_ownership(self, request, resource_item):
         # TODO(salvatore-orlando): consider whether this check can be folded
         # in the policy engine
index 95cd6d4a3a1a375953fbe666c0fe83ac65752fc7..b1da94cf137224f3c5caec9c73d963a9c81f3edd 100644 (file)
@@ -672,12 +672,26 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase):
                            expect_errors=True)
         self.assertEqual(res.status_int, 400)
 
+    def test_invalid_attribute_field(self):
+        data = {'network': {'invalid_key1': "foo1", 'invalid_key2': "foo2"}}
+        res = self.api.put(_get_path('networks', id=_uuid()),
+                           self.serialize(data),
+                           content_type='application/' + self.fmt,
+                           expect_errors=True)
+        self.assertEqual(res.status_int, 400)
+
 
 class SubresourceTest(unittest.TestCase):
     def setUp(self):
         plugin = 'quantum.tests.unit.test_api_v2.TestSubresourcePlugin'
         QuantumManager._instance = None
         PluginAwareExtensionManager._instance = None
+
+        # Save the global RESOURCE_ATTRIBUTE_MAP
+        self.saved_attr_map = {}
+        for resource, attrs in attributes.RESOURCE_ATTRIBUTE_MAP.iteritems():
+            self.saved_attr_map[resource] = attrs.copy()
+
         args = ['--config-file', etcdir('quantum.conf.test')]
         config.parse(args=args)
         cfg.CONF.set_override('core_plugin', plugin)
@@ -690,7 +704,15 @@ class SubresourceTest(unittest.TestCase):
             'parent': {'collection_name': 'networks',
                        'member_name': 'network'}
         }
-
+        attributes.RESOURCE_ATTRIBUTE_MAP['dummies'] = {
+            'foo': {'allow_post': True, 'allow_put': True,
+                    'validate': {'type:string': None},
+                    'default': '', 'is_visible': True},
+            'tenant_id': {'allow_post': True, 'allow_put': False,
+                          'validate': {'type:string': None},
+                          'required_by_policy': True,
+                          'is_visible': True}
+        }
         api = router.APIRouter()
         self.api = webtest.TestApp(api)
 
@@ -699,6 +721,8 @@ class SubresourceTest(unittest.TestCase):
         self.api = None
         self.plugin = None
         cfg.CONF.reset()
+        # Restore the global RESOURCE_ATTRIBUTE_MAP
+        attributes.RESOURCE_ATTRIBUTE_MAP = self.saved_attr_map
 
     def test_index_sub_resource(self):
         instance = self.plugin.return_value
@@ -732,7 +756,7 @@ class SubresourceTest(unittest.TestCase):
         instance = self.plugin.return_value
 
         dummy_id = _uuid()
-        body = {'dummy': {'foo': 'bar', 'tenant_id': _uuid()}}
+        body = {'dummy': {'foo': 'bar'}}
         self.api.put_json('/networks/id1' + _get_path('dummies', id=dummy_id),
                           body)
         instance.update_network_dummy.assert_called_once_with(mock.ANY,
index 032ad06a2dd56c2f9052a768642fd28e341e0936..0acb2757a3bb940ea2143a4b6b8b71d7ee4894c3 100644 (file)
@@ -1503,7 +1503,7 @@ class TestNetworksV2(QuantumDbPluginV2TestCase):
         name = 'net1'
         keys = [('subnets', []), ('name', name), ('admin_state_up', True),
                 ('status', 'ACTIVE'), ('shared', False)]
-        with self.network(name=name, arg_list=('test',), test=None) as net:
+        with self.network(name=name) as net:
             for k, v in keys:
                 self.assertEqual(net['network'][k], v)
 
index bfac2c8b4eb150385a1b3e79df2d5fa85a4b410e..5319ffcc36645ffb10979fa4402b9f8a6415068e 100644 (file)
@@ -146,8 +146,8 @@ class ServiceTypeExtensionTestCase(ServiceTypeTestCaseBase):
         tenant_id = 'fake'
         if env and 'quantum.context' in env:
             tenant_id = env['quantum.context'].tenant_id
-        data = {self.resource_name: {'name': svc_type_name,
-                                     'tenant-id': tenant_id}}
+        data = {self.resource_name: {'name': svc_type_name}}
+
         svc_type_id = _uuid()
         return_value = {'id': svc_type_id,
                         'name': svc_type_name}