Add debug mode parameter 69/41269/3
authorshangxdy <shang.xiaodong@zte.com.cn>
Thu, 7 Sep 2017 04:50:34 +0000 (12:50 +0800)
committershangxdy <shang.xiaodong@zte.com.cn>
Thu, 7 Sep 2017 05:40:31 +0000 (13:40 +0800)
In debug mode, it's not allowed to raise exceptions as possible for
convinient to debug more details, this patch will add parameter to
enable such scenario.
The requirement is from ONAP

JIRA: PARSER-148

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

index f669e27..ba9c28f 100644 (file)
@@ -53,55 +53,70 @@ class ParserShell(object):
                             required=True,
                             help=_('YAML template or CSAR file to parse.'))
 
-        parser.add_argument('-nrpv', dest='no_required_paras_valid',
+        parser.add_argument('-nrpv', dest='no_required_paras_check',
                             action='store_true', default=False,
                             help=_('Ignore input parameter validation '
                                    'when parse template.'))
 
+        parser.add_argument('--debug', dest='debug_mode',
+                            action='store_true', default=False,
+                            help=_('debug mode for print more details '
+                                   'other than raise exceptions when '
+                                   'errors happen as possible'))
+
         return parser
 
     def main(self, argv):
         parser = self.get_parser(argv)
         (args, extra_args) = parser.parse_known_args(argv)
         path = args.template_file
-        nrpv = args.no_required_paras_valid
+        nrpv = args.no_required_paras_check
+        debug = args.debug_mode
+
         if os.path.isfile(path):
-            self.parse(path, no_req_paras_valid=nrpv)
+            self.parse(path, no_required_paras_check=nrpv, debug_mode=debug)
         elif toscaparser.utils.urlutils.UrlUtils.validate_url(path):
-            self.parse(path, False, no_req_paras_valid=nrpv)
+            self.parse(path, False,
+                       no_required_paras_check=nrpv,
+                       debug_mode=debug)
         else:
             raise ValueError(_('"%(path)s" is not a valid file.')
                              % {'path': path})
 
-    def parse(self, path, a_file=True, no_req_paras_valid=False):
-        output = None
-        tosca = None
+    def parse(self, path, a_file=True, no_required_paras_check=False,
+              debug_mode=False):
+        nrpv = no_required_paras_check
         try:
             tosca = ToscaTemplate(path, None, a_file,
-                                  no_required_paras_valid=no_req_paras_valid)
+                                  no_required_paras_check=nrpv,
+                                  debug_mode=debug_mode)
         except ValidationError as e:
             msg = _('  ===== main service template ===== ')
             log.error(msg)
             log.error(e.message)
-            raise e
-
-        version = tosca.version
-        if tosca.version:
+            if debug_mode:
+                print(msg)
+                print(e.message)
+            else:
+                raise e
+
+        version = tosca.version if tosca else "unknown"
+        if tosca and tosca.version:
             print("\nversion: " + version)
 
-        if hasattr(tosca, 'description'):
+        if tosca and hasattr(tosca, 'description'):
             description = tosca.description
             if description:
                 print("\ndescription: " + description)
 
-        if hasattr(tosca, 'inputs'):
+        if tosca and hasattr(tosca, 'inputs'):
             inputs = tosca.inputs
             if inputs:
                 print("\ninputs:")
                 for input in inputs:
                     print("\t" + input.name)
 
-        if hasattr(tosca, 'nodetemplates'):
+        if tosca and hasattr(tosca, 'nodetemplates'):
             nodetemplates = tosca.nodetemplates
             if nodetemplates:
                 print("\nnodetemplates:")
@@ -120,7 +135,7 @@ class ParserShell(object):
                         for trigger in policy.triggers:
                             print("\ttrigger name:" + trigger.name)'''
 
-        if hasattr(tosca, 'outputs'):
+        if tosca and hasattr(tosca, 'outputs'):
             outputs = tosca.outputs
             if outputs:
                 print("\noutputs:")
index c961941..c9be9dd 100644 (file)
@@ -69,7 +69,8 @@ class ToscaTemplate(object):
     '''Load the template data.'''
     def __init__(self, path=None, parsed_params=None, a_file=True,
                  yaml_dict_tpl=None, sub_mapped_node_template=None,
-                 no_required_paras_valid=False):
+                 no_required_paras_check=False,
+                 debug_mode=False):
         if sub_mapped_node_template is None:
             ExceptionCollector.start()
         self.a_file = a_file
@@ -79,7 +80,9 @@ class ToscaTemplate(object):
         self.sub_mapped_node_template = sub_mapped_node_template
         self.nested_tosca_tpls_with_topology = {}
         self.nested_tosca_templates_with_topology = []
-        self.no_required_paras_valid = no_required_paras_valid
+        self.no_required_paras_check = no_required_paras_check
+        self.debug_mode = debug_mode
+
         if path:
             self.input_path = path
             self.path = self._get_path(path)
@@ -244,16 +247,20 @@ class ToscaTemplate(object):
                         deepcopy(ExceptionCollector.collecting)
                     nested_template = None
                     try:
-                        nrpv = self.no_required_paras_valid
+                        nrpv = self.no_required_paras_check
                         nested_template = ToscaTemplate(
                             path=fname, parsed_params=parsed_params,
                             sub_mapped_node_template=nodetemplate,
-                            no_required_paras_valid=nrpv)
+                            no_required_paras_check=nrpv)
                     except ValidationError as e:
                         msg = _('  ===== nested service template ===== ')
                         log.error(msg)
                         log.error(e.message)
-                        raise e
+                        if self.debug_mode:
+                            print(msg)
+                            print(e.message)
+                        else:
+                            raise e
 
                     ExceptionCollector.exceptions = deepcopy(cache_exeptions)
                     ExceptionCollector.collecting = \
@@ -312,21 +319,26 @@ class ToscaTemplate(object):
 
     def verify_template(self):
         if ExceptionCollector.exceptionsCaught():
-            if self.no_required_paras_valid:
+            if self.no_required_paras_check:
                 ExceptionCollector.removeException(
                     MissingRequiredParameterError)
 
             if self.input_path:
-                raise ValidationError(
+                exceptions = ValidationError(
                     message=(_('\nThe input "%(path)s" failed validation with '
                                'the following error(s): \n\n\t')
                              % {'path': self.input_path}) +
                     '\n\t'.join(ExceptionCollector.getExceptionsReport()))
             else:
-                raise ValidationError(
+                exceptions = ValidationError(
                     message=_('\nThe pre-parsed input failed validation with '
                               'the following error(s): \n\n\t') +
                     '\n\t'.join(ExceptionCollector.getExceptionsReport()))
+            if not self.debug_mode:
+                raise exceptions
+            else:
+                print(exceptions.message)
+            log.error(exceptions.message)
         else:
             if self.input_path:
                 msg = (_('The input "%(path)s" successfully passed '