diff --git a/tacker/api/v1/attributes.py b/tacker/api/v1/attributes.py index 08fe1226c..ba9f77835 100644 --- a/tacker/api/v1/attributes.py +++ b/tacker/api/v1/attributes.py @@ -449,6 +449,16 @@ def _validate_dict_or_nodata(data, key_specs=None): return _validate_dict(data, key_specs) +def _validate_dict_not_empty(data, key_specs=None): + if not isinstance(data, dict) or len(data) == 0: + msg = _("'%s' is not a valid dictionary or it is an" + " empty dictionary") % data + LOG.debug(msg) + return msg + else: + return _validate_dict(data, key_specs) + + def _validate_non_negative(data, valid_values=None): try: data = int(data) @@ -553,6 +563,7 @@ validators = {'type:dict': _validate_dict, 'type:dict_or_none': _validate_dict_or_none, 'type:dict_or_empty': _validate_dict_or_empty, 'type:dict_or_nodata': _validate_dict_or_nodata, + 'type:dict_not_empty': _validate_dict_not_empty, 'type:fixed_ips': _validate_fixed_ips, 'type:hostroutes': _validate_hostroutes, 'type:ip_address': _validate_ip_address, diff --git a/tacker/extensions/nfvo.py b/tacker/extensions/nfvo.py index cc91aef58..8636dd945 100644 --- a/tacker/extensions/nfvo.py +++ b/tacker/extensions/nfvo.py @@ -312,13 +312,13 @@ RESOURCE_ATTRIBUTE_MAP = { 'auth_cred': { 'allow_post': True, 'allow_put': True, - 'validate': {'type:dict_or_nodata': None}, + 'validate': {'type:dict_not_empty': None}, 'is_visible': True, }, 'vim_project': { 'allow_post': True, 'allow_put': True, - 'validate': {'type:dict_or_nodata': None}, + 'validate': {'type:dict_not_empty': None}, 'is_visible': True, }, 'name': { diff --git a/tacker/tests/unit/api/v1/test_vim.py b/tacker/tests/unit/api/v1/test_vim.py index 09627d0a3..97f598331 100644 --- a/tacker/tests/unit/api/v1/test_vim.py +++ b/tacker/tests/unit/api/v1/test_vim.py @@ -137,3 +137,33 @@ class VIMCreateTestCase(base.TestCase): self.assertRaises(exc.HTTPBadRequest, self.controller.create, request, vim_dict) + + @ddt.data('', 'testing', {}) + def test_create_vim_with_invalid_auth_cred(self, value): + vim_dict = get_vim_config() + vim_dict['vim']['auth_cred'] = value + request = wsgi.Request.blank("/vims.json", method='POST', + headers={'Content-Type': "application/json"}) + request.environ['tacker.context'] = self.fake_admin_context() + msg = ("Invalid input for auth_cred. Reason: '%s' is " + "not a valid dictionary or it is an empty" + " dictionary.") % vim_dict['vim']['auth_cred'] + exp = self.assertRaises(exc.HTTPBadRequest, + self.controller.create, + request, vim_dict) + self.assertEqual(msg, six.text_type(exp)) + + @ddt.data('', 'testing', {}) + def test_create_vim_invalid_vim_project(self, value): + vim_dict = get_vim_config() + vim_dict['vim']['vim_project'] = value + request = wsgi.Request.blank("/vims.json", method='POST', + headers={'Content-Type': "application/json"}) + request.environ['tacker.context'] = self.fake_admin_context() + msg = ("Invalid input for vim_project. Reason: '%s' is" + " not a valid dictionary or it is an empty" + " dictionary.") % vim_dict['vim']['vim_project'] + exp = self.assertRaises(exc.HTTPBadRequest, + self.controller.create, + request, vim_dict) + self.assertEqual(msg, six.text_type(exp)) diff --git a/tacker/tests/unit/test_attributes.py b/tacker/tests/unit/test_attributes.py index e233aa925..5f8f569d0 100644 --- a/tacker/tests/unit/test_attributes.py +++ b/tacker/tests/unit/test_attributes.py @@ -680,6 +680,15 @@ class TestAttributes(base.BaseTestCase): self.assertIsNone(msg, 'Validation of a valid dictionary failed.') self.assertIsNone(msg, 'Validation of a valid dictionary failed.') + def test_validate_dict_or_not_empty(self): + dictionary, constraints = self._construct_dict_and_constraints() + msg = attributes._validate_dict_not_empty({}, constraints) + self.assertEqual(msg, u"'{}' is not a valid dictionary or it is" + u" an empty dictionary") + msg = attributes._validate_dict_not_empty("", constraints) + self.assertEqual(msg, u"'' is not a valid dictionary or it is an" + u" empty dictionary") + def test_validate_non_negative(self): for value in (-1, '-2'): self.assertEqual("'%s' should be non-negative" % value,