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']:
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
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)
'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)
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
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,
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)