Report: Add RC2 data
[csit.git] / resources / tools / presentation / input_data_parser.py
index 67c3636..325e28c 100644 (file)
@@ -287,8 +287,6 @@ class ExecutionChecker(ResultVisitor):
     )
     REGEX_TC_TAG = re.compile(r'\d+[tT]\d+[cC]')
 
-    REGEX_TC_NAME_OLD = re.compile(r'-\d+[tT]\d+[cC]-')
-
     REGEX_TC_NAME_NEW = re.compile(r'-\d+[cC]-')
 
     REGEX_TC_NUMBER = re.compile(r'tc\d{2}-')
@@ -299,7 +297,7 @@ class ExecutionChecker(ResultVisitor):
         r'hostname=\"(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\",hook=\"(.*)\"'
     )
 
-    def __init__(self, metadata, mapping, ignore, for_output):
+    def __init__(self, metadata, mapping, ignore, process_oper):
         """Initialisation.
 
         :param metadata: Key-value pairs to be included in "metadata" part of
@@ -307,11 +305,12 @@ class ExecutionChecker(ResultVisitor):
         :param mapping: Mapping of the old names of test cases to the new
             (actual) one.
         :param ignore: List of TCs to be ignored.
-        :param for_output: Output to be generated from downloaded data.
+        :param process_oper: If True, operational data (show run, telemetry) is
+            processed.
         :type metadata: dict
         :type mapping: dict
         :type ignore: list
-        :type for_output: str
+        :type process_oper: bool
         """
 
         # Type of message to parse out from the test messages
@@ -332,7 +331,7 @@ class ExecutionChecker(ResultVisitor):
         # Ignore list
         self._ignore = ignore
 
-        self._for_output = for_output
+        self._process_oper = process_oper
 
         # Number of PAPI History messages found:
         # 0 - no message
@@ -479,7 +478,8 @@ class ExecutionChecker(ResultVisitor):
             return u"Test Failed."
 
         def _process_lat(in_str_1, in_str_2):
-            """Extract min, avg, max values from latency string.
+            """Extract P50, P90 and P99 latencies or min, avg, max values from
+            latency string.
 
             :param in_str_1: Latency string for one direction produced by robot
                 framework.
@@ -500,13 +500,13 @@ class ExecutionChecker(ResultVisitor):
             try:
                 hdr_lat_1 = hdrh.histogram.HdrHistogram.decode(in_list_1[3])
             except hdrh.codec.HdrLengthException:
-                return None
+                hdr_lat_1 = None
 
             in_list_2[3] += u"=" * (len(in_list_2[3]) % 4)
             try:
                 hdr_lat_2 = hdrh.histogram.HdrHistogram.decode(in_list_2[3])
             except hdrh.codec.HdrLengthException:
-                return None
+                hdr_lat_2 = None
 
             if hdr_lat_1 and hdr_lat_2:
                 hdr_lat = (
@@ -517,11 +517,17 @@ class ExecutionChecker(ResultVisitor):
                     hdr_lat_2.get_value_at_percentile(90.0),
                     hdr_lat_2.get_value_at_percentile(99.0)
                 )
-
                 if all(hdr_lat):
                     return hdr_lat
 
-            return None
+            hdr_lat = (
+                int(in_list_1[0]), int(in_list_1[1]), int(in_list_1[2]),
+                int(in_list_2[0]), int(in_list_2[1]), int(in_list_2[2])
+            )
+            for item in hdr_lat:
+                if item in (-1, 4294967295, 0):
+                    return None
+            return hdr_lat
 
         try:
             out_msg = (
@@ -1123,38 +1129,36 @@ class ExecutionChecker(ResultVisitor):
         else:
             test_result[u"msg"] = test.message
 
-        if u"PERFTEST" in tags:
+        if u"PERFTEST" in tags and u"TREX" not in tags:
             # Replace info about cores (e.g. -1c-) with the info about threads
             # and cores (e.g. -1t1c-) in the long test case names and in the
             # test case names if necessary.
-            groups = re.search(self.REGEX_TC_NAME_OLD, self._test_id)
-            if not groups:
-                tag_count = 0
-                tag_tc = str()
-                for tag in test_result[u"tags"]:
-                    groups = re.search(self.REGEX_TC_TAG, tag)
-                    if groups:
-                        tag_count += 1
-                        tag_tc = tag
-
-                if tag_count == 1:
-                    self._test_id = re.sub(
-                        self.REGEX_TC_NAME_NEW, f"-{tag_tc.lower()}-",
-                        self._test_id, count=1
-                    )
-                    test_result[u"name"] = re.sub(
-                        self.REGEX_TC_NAME_NEW, f"-{tag_tc.lower()}-",
-                        test_result["name"], count=1
-                    )
-                else:
-                    test_result[u"status"] = u"FAIL"
-                    self._data[u"tests"][self._test_id] = test_result
-                    logging.debug(
-                        f"The test {self._test_id} has no or more than one "
-                        f"multi-threading tags.\n"
-                        f"Tags: {test_result[u'tags']}"
-                    )
-                    return
+            tag_count = 0
+            tag_tc = str()
+            for tag in test_result[u"tags"]:
+                groups = re.search(self.REGEX_TC_TAG, tag)
+                if groups:
+                    tag_count += 1
+                    tag_tc = tag
+
+            if tag_count == 1:
+                self._test_id = re.sub(
+                    self.REGEX_TC_NAME_NEW, f"-{tag_tc.lower()}-",
+                    self._test_id, count=1
+                )
+                test_result[u"name"] = re.sub(
+                    self.REGEX_TC_NAME_NEW, f"-{tag_tc.lower()}-",
+                    test_result["name"], count=1
+                )
+            else:
+                test_result[u"status"] = u"FAIL"
+                self._data[u"tests"][self._test_id] = test_result
+                logging.debug(
+                    f"The test {self._test_id} has no or more than one "
+                    f"multi-threading tags.\n"
+                    f"Tags: {test_result[u'tags']}"
+                )
+                return
 
         if u"DEVICETEST" in tags:
             test_result[u"type"] = u"DEVICETEST"
@@ -1294,7 +1298,7 @@ class ExecutionChecker(ResultVisitor):
         :type test_kw: Keyword
         :returns: Nothing.
         """
-        if self._for_output == u"trending":
+        if not self._process_oper:
             return
 
         if test_kw.name.count(u"Run Telemetry On All Duts"):
@@ -1523,8 +1527,18 @@ class InputData:
                     f"Error occurred while parsing output.xml: {repr(err)}"
                 )
                 return None
+
+        process_oper = False
+        if u"-vpp-perf-report-coverage-" in job:
+            process_oper = True
+        elif u"-vpp-perf-report-iterative-" in job:
+            # Exceptions for TBs where we do not have coverage data:
+            for item in (u"-2n-icx", u"-2n-aws", u"-3n-aws"):
+                if item in job:
+                    process_oper = True
+                    break
         checker = ExecutionChecker(
-            metadata, self._cfg.mapping, self._cfg.ignore, self._for_output
+            metadata, self._cfg.mapping, self._cfg.ignore, process_oper
         )
         result.visit(checker)