Fix exceptions overwritten when nested import service topology 71/40571/4
authorshangxdy <shang.xiaodong@zte.com.cn>
Tue, 29 Aug 2017 08:42:20 +0000 (16:42 +0800)
committershangxdy <shang.xiaodong@zte.com.cn>
Tue, 5 Sep 2017 05:45:28 +0000 (13:45 +0800)
Currently exceptions will be overwritten when import nested service
topology, the patch will fix the issue.

JIRA: PARSER-145

Change-Id: I531755efe55b43aef304fa972773c63613c915ff
Signed-off-by: shangxdy <shang.xiaodong@zte.com.cn>
tosca2heat/tosca-parser/toscaparser/shell.py
tosca2heat/tosca-parser/toscaparser/tosca_template.py

index 0256dfc..f669e27 100644 (file)
 
 
 import argparse
+import logging
 import os
 import sys
 
+from toscaparser.common.exception import ValidationError
 from toscaparser.tosca_template import ToscaTemplate
 from toscaparser.utils.gettextutils import _
 import toscaparser.utils.urlutils
@@ -38,6 +40,8 @@ e.g.
  --template-file=toscaparser/tests/data/CSAR/csar_hello_world.zip
 """
 
+log = logging.getLogger("tosca.model")
+
 
 class ParserShell(object):
 
@@ -62,17 +66,24 @@ class ParserShell(object):
         path = args.template_file
         nrpv = args.no_required_paras_valid
         if os.path.isfile(path):
-            self.parse(path, no_required_paras_valid=nrpv)
+            self.parse(path, no_req_paras_valid=nrpv)
         elif toscaparser.utils.urlutils.UrlUtils.validate_url(path):
-            self.parse(path, False, no_required_paras_valid=nrpv)
+            self.parse(path, False, no_req_paras_valid=nrpv)
         else:
             raise ValueError(_('"%(path)s" is not a valid file.')
                              % {'path': path})
 
-    def parse(self, path, a_file=True, no_required_paras_valid=False):
+    def parse(self, path, a_file=True, no_req_paras_valid=False):
         output = None
-        tosca = ToscaTemplate(path, None, a_file,
-                              no_required_paras_valid=no_required_paras_valid)
+        tosca = None
+        try:
+            tosca = ToscaTemplate(path, None, a_file,
+                                  no_required_paras_valid=no_req_paras_valid)
+        except ValidationError as e:
+            msg = _('  ===== main service template ===== ')
+            log.error(msg)
+            log.error(e.message)
+            raise e
 
         version = tosca.version
         if tosca.version:
index 3301999..4832bbb 100644 (file)
@@ -236,12 +236,29 @@ class ToscaTemplate(object):
                 if self._is_sub_mapped_node(nodetemplate, tosca_tpl):
                     parsed_params = self._get_params_for_nested_template(
                         nodetemplate)
-                    nested_template = ToscaTemplate(
-                        path=fname, parsed_params=parsed_params,
-                        yaml_dict_tpl=tosca_tpl,
-                        sub_mapped_node_template=nodetemplate,
-                        no_required_paras_valid=self.no_required_paras_valid)
-                    if nested_template._has_substitution_mappings():
+
+                    cache_exeptions = deepcopy(ExceptionCollector.exceptions)
+                    cache_exeptions_state = \
+                        deepcopy(ExceptionCollector.collecting)
+                    nested_template = None
+                    try:
+                        nrpv = self.no_required_paras_valid
+                        nested_template = ToscaTemplate(
+                            path=fname, parsed_params=parsed_params,
+                            sub_mapped_node_template=nodetemplate,
+                            no_required_paras_valid=nrpv)
+                    except ValidationError as e:
+                        msg = _('  ===== nested service template ===== ')
+                        log.error(msg)
+                        log.error(e.message)
+                        raise e
+
+                    ExceptionCollector.exceptions = deepcopy(cache_exeptions)
+                    ExceptionCollector.collecting = \
+                        deepcopy(cache_exeptions_state)
+
+                    if nested_template and \
+                            nested_template._has_substitution_mappings():
                         # Record the nested templates in top level template
                         self.nested_tosca_templates_with_topology.\
                             append(nested_template)