From a11344c3185717cb2e264ed126b904a56b6ea38b Mon Sep 17 00:00:00 2001 From: vagrant Date: Mon, 3 Jul 2017 08:13:26 +0000 Subject: [PATCH] Error handling for vnfd-create with empty vnfd-file Error handling for empty vnfd-file and yaml load. Closes-Bug: #1490067 Change-Id: I48c21d193251a95c8fc7b10d3c6549b74c5287df --- tackerclient/common/exceptions.py | 4 +++ tackerclient/tacker/v1_0/nfvo/ns.py | 8 +++-- tackerclient/tacker/v1_0/nfvo/vim.py | 11 +++++-- tackerclient/tacker/v1_0/nfvo/vnffg.py | 10 ++++-- tackerclient/tacker/v1_0/vnfm/vnf.py | 32 ++++++++++++++----- tackerclient/tacker/v1_0/vnfm/vnfd.py | 15 ++++++--- tackerclient/tests/unit/vm/test_cli10_vnfd.py | 25 +++++++++++++++ 7 files changed, 85 insertions(+), 20 deletions(-) diff --git a/tackerclient/common/exceptions.py b/tackerclient/common/exceptions.py index a906187a..94c338ee 100644 --- a/tackerclient/common/exceptions.py +++ b/tackerclient/common/exceptions.py @@ -203,6 +203,10 @@ class InvalidContentType(TackerClientException): message = _("Invalid content type %(content_type)s.") +class InvalidInput(TackerClientException): + message = _("Invalid input: %(reason)s") + + # Command line exceptions class TackerCLIError(TackerException): diff --git a/tackerclient/tacker/v1_0/nfvo/ns.py b/tackerclient/tacker/v1_0/nfvo/ns.py index b05ed62c..3427e7f8 100644 --- a/tackerclient/tacker/v1_0/nfvo/ns.py +++ b/tackerclient/tacker/v1_0/nfvo/ns.py @@ -12,6 +12,7 @@ import yaml +from tackerclient.common import exceptions from tackerclient.i18n import _ from tackerclient.tacker import v1_0 as tackerV10 @@ -91,8 +92,11 @@ class CreateNS(tackerV10.CreateCommand): if parsed_args.param_file: with open(parsed_args.param_file) as f: param_yaml = f.read() - args['attributes']['param_values'] = yaml.load( - param_yaml, Loader=yaml.SafeLoader) + try: + args['attributes']['param_values'] = yaml.load( + param_yaml, Loader=yaml.SafeLoader) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id', 'name', 'description', 'nsd_id', 'vim_id']) diff --git a/tackerclient/tacker/v1_0/nfvo/vim.py b/tackerclient/tacker/v1_0/nfvo/vim.py index d4742ae8..903dd953 100644 --- a/tackerclient/tacker/v1_0/nfvo/vim.py +++ b/tackerclient/tacker/v1_0/nfvo/vim.py @@ -67,7 +67,11 @@ class CreateVIM(tackerV10.CreateCommand): if parsed_args.config_file: with open(parsed_args.config_file) as f: vim_config = f.read() - config_param = yaml.load(vim_config, Loader=yaml.SafeLoader) + try: + config_param = yaml.load(vim_config, + Loader=yaml.SafeLoader) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) vim_obj = body[self.resource] try: auth_url = config_param.pop('auth_url') @@ -113,7 +117,10 @@ class UpdateVIM(tackerV10.UpdateCommand): if parsed_args.config_file: with open(parsed_args.config_file) as f: config_yaml = f.read() - config_param = yaml.load(config_yaml) + try: + config_param = yaml.load(config_yaml) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) vim_obj = body[self.resource] if config_param is not None: vim_utils.args2body_vim(config_param, vim_obj) diff --git a/tackerclient/tacker/v1_0/nfvo/vnffg.py b/tackerclient/tacker/v1_0/nfvo/vnffg.py index ecb1e1b4..729cd192 100644 --- a/tackerclient/tacker/v1_0/nfvo/vnffg.py +++ b/tackerclient/tacker/v1_0/nfvo/vnffg.py @@ -10,9 +10,10 @@ # License for the specific language governing permissions and limitations # under the License. -from tackerclient.i18n import _ import yaml +from tackerclient.common import exceptions +from tackerclient.i18n import _ from tackerclient.tacker import v1_0 as tackerV10 @@ -131,8 +132,11 @@ class CreateVNFFG(tackerV10.CreateCommand): if parsed_args.param_file: with open(parsed_args.param_file) as f: param_yaml = f.read() - args['attributes']['param_values'] = yaml.load( - param_yaml, Loader=yaml.SafeLoader) + try: + args['attributes']['param_values'] = yaml.load( + param_yaml, Loader=yaml.SafeLoader) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id', 'name', 'vnffgd_id', diff --git a/tackerclient/tacker/v1_0/vnfm/vnf.py b/tackerclient/tacker/v1_0/vnfm/vnf.py index 07ecf2f6..190974f8 100644 --- a/tackerclient/tacker/v1_0/vnfm/vnf.py +++ b/tackerclient/tacker/v1_0/vnfm/vnf.py @@ -17,6 +17,7 @@ import yaml +from tackerclient.common import exceptions from tackerclient.i18n import _ from tackerclient.tacker import v1_0 as tackerV10 @@ -87,8 +88,11 @@ class CreateVNF(tackerV10.CreateCommand): if parsed_args.config_file: with open(parsed_args.config_file) as f: config_yaml = f.read() - config = yaml.load( - config_yaml, Loader=yaml.SafeLoader) + try: + config = yaml.load( + config_yaml, Loader=yaml.SafeLoader) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) if config: args['attributes']['config'] = config @@ -113,14 +117,20 @@ class CreateVNF(tackerV10.CreateCommand): elif parsed_args.vnfd_template: with open(parsed_args.vnfd_template) as f: template = f.read() - args['vnfd_template'] = yaml.load( - template, Loader=yaml.SafeLoader) + try: + args['vnfd_template'] = yaml.load( + template, Loader=yaml.SafeLoader) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) if parsed_args.param_file: with open(parsed_args.param_file) as f: param_yaml = f.read() - args['attributes']['param_values'] = yaml.load( - param_yaml, Loader=yaml.SafeLoader) + try: + args['attributes']['param_values'] = yaml.load( + param_yaml, Loader=yaml.SafeLoader) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id', 'name', 'description', 'vnfd_id', 'vim_id']) @@ -147,12 +157,18 @@ class UpdateVNF(tackerV10.UpdateCommand): if parsed_args.config_file: with open(parsed_args.config_file) as f: config_yaml = f.read() - config = yaml.load(config_yaml, Loader=yaml.SafeLoader) + try: + config = yaml.load(config_yaml, Loader=yaml.SafeLoader) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) if parsed_args.config: config = parsed_args.config if isinstance(config, str) or isinstance(config, unicode): config_str = parsed_args.config.decode('unicode_escape') - config = yaml.load(config_str, Loader=yaml.SafeLoader) + try: + config = yaml.load(config_str, Loader=yaml.SafeLoader) + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) if config: body[self.resource]['attributes'] = {'config': config} tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id']) diff --git a/tackerclient/tacker/v1_0/vnfm/vnfd.py b/tackerclient/tacker/v1_0/vnfm/vnfd.py index 56096faf..57b4049f 100644 --- a/tackerclient/tacker/v1_0/vnfm/vnfd.py +++ b/tackerclient/tacker/v1_0/vnfm/vnfd.py @@ -20,6 +20,7 @@ from __future__ import print_function from oslo_serialization import jsonutils import yaml +from tackerclient.common import exceptions from tackerclient.i18n import _ from tackerclient.tacker import v1_0 as tackerV10 @@ -75,13 +76,17 @@ class CreateVNFD(tackerV10.CreateCommand): def args2body(self, parsed_args): body = {self.resource: {}} vnfd = None - if parsed_args.vnfd_file: - with open(parsed_args.vnfd_file) as f: - vnfd = f.read() + if not parsed_args.vnfd_file: + raise exceptions.InvalidInput("Invalid input for vnfd file") + with open(parsed_args.vnfd_file) as f: + vnfd = f.read() + try: vnfd = yaml.load(vnfd, Loader=yaml.SafeLoader) - if vnfd: + except yaml.YAMLError as e: + raise exceptions.InvalidInput(e) + if not vnfd: + raise exceptions.InvalidInput("vnfd file is empty") body[self.resource]['attributes'] = {'vnfd': vnfd} - tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id', 'name', 'description']) return body diff --git a/tackerclient/tests/unit/vm/test_cli10_vnfd.py b/tackerclient/tests/unit/vm/test_cli10_vnfd.py index 53615763..491e7b35 100644 --- a/tackerclient/tests/unit/vm/test_cli10_vnfd.py +++ b/tackerclient/tests/unit/vm/test_cli10_vnfd.py @@ -18,6 +18,7 @@ from mock import mock_open from mock import patch import sys +from tackerclient.common.exceptions import InvalidInput from tackerclient.tacker.v1_0.vnfm import vnfd from tackerclient.tests.unit import test_cli10 @@ -73,6 +74,30 @@ class CLITestV10VmVNFDJSON(test_cli10.CLITestV10Base): args, position_names, position_values, extra_body=extra_body) + @patch("tackerclient.tacker.v1_0.vnfm.vnfd.open", + side_effect=mock_open(read_data=""), + create=True) + def test_create_vnfd_with_empty_file(self, mo): + cmd = vnfd.CreateVNFD( + test_cli10.MyApp(sys.stdout), None) + name = 'my_name' + my_id = 'my-id' + args = [name, '--vnfd-file', 'vnfd-file', ] + position_names = ['name'] + position_values = [name] + extra_body = { + 'service_types': [{'service_type': 'vnfd'}], + 'attributes': {'vnfd': 'vnfd'} + } + err = None + try: + self._test_create_resource(self._RESOURCE, cmd, name, my_id, + args, position_names, position_values, + extra_body=extra_body) + except InvalidInput: + err = True + self.assertEqual(True, err) + def test_list_vnfds(self): cmd = vnfd.ListVNFD(test_cli10.MyApp(sys.stdout), None) self._test_list_resources(self._RESOURCES, cmd, True,