X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftools%2Fpresentation%2Finput_data_parser.py;h=c43d46014edbd8d8c4a4f63c8734e6f28a069c13;hp=db1fc5a0925853687f7940c1381c098842a5bfa3;hb=d9bcff4067f5bc4541d12df15137bfcc297aab39;hpb=8ca63f49d365d589af2a6667cfdceda098b677cc diff --git a/resources/tools/presentation/input_data_parser.py b/resources/tools/presentation/input_data_parser.py index db1fc5a092..c43d46014e 100644 --- a/resources/tools/presentation/input_data_parser.py +++ b/resources/tools/presentation/input_data_parser.py @@ -29,6 +29,7 @@ from os import remove from datetime import datetime as dt from datetime import timedelta from json import loads +from json.decoder import JSONDecodeError import hdrh.histogram import hdrh.codec @@ -368,12 +369,12 @@ class ExecutionChecker(ResultVisitor): groups = re.search(self.REGEX_MRR_MSG_INFO, msg) if not groups or groups.lastindex != 1: - return msg + return u"Test Failed." try: data = groups.group(1).split(u", ") except (AttributeError, IndexError, ValueError, KeyError): - return msg + return u"Test Failed." out_str = u"[" try: @@ -381,7 +382,7 @@ class ExecutionChecker(ResultVisitor): out_str += f"{(float(item) / 1e6):.2f}, " return out_str[:-2] + u"]" except (AttributeError, IndexError, ValueError, KeyError): - return msg + return u"Test Failed." def _get_data_from_perf_test_msg(self, msg): """Get info from message of NDRPDR performance tests. @@ -394,7 +395,7 @@ class ExecutionChecker(ResultVisitor): groups = re.search(self.REGEX_PERF_MSG_INFO, msg) if not groups or groups.lastindex != 10: - return msg + return u"Test Failed." try: data = { @@ -410,7 +411,7 @@ class ExecutionChecker(ResultVisitor): u"pdr_lat_10_2": groups.group(10), } except (AttributeError, IndexError, ValueError, KeyError): - return msg + return u"Test Failed." def _process_lat(in_str_1, in_str_2): """Extract min, avg, max values from latency string. @@ -459,10 +460,10 @@ class ExecutionChecker(ResultVisitor): try: out_msg = ( - f"1. {(data[u'ndr_low'] / 1e6):.2f} " - f"{data[u'ndr_low_b']:.2f}" - f"\n2. {(data[u'pdr_low'] / 1e6):.2f} " - f"{data[u'pdr_low_b']:.2f}" + f"1. {(data[u'ndr_low'] / 1e6):5.2f} " + f"{data[u'ndr_low_b']:5.2f}" + f"\n2. {(data[u'pdr_low'] / 1e6):5.2f} " + f"{data[u'pdr_low_b']:5.2f}" ) latency = ( _process_lat(data[u'pdr_lat_10_1'], data[u'pdr_lat_10_2']), @@ -471,21 +472,25 @@ class ExecutionChecker(ResultVisitor): ) if all(latency): max_len = len(str(max((max(item) for item in latency)))) + max_len = 4 if max_len < 4 else max_len for idx, lat in enumerate(latency): if not idx: out_msg += u"\n" - out_msg += f"\n{idx + 3}. " - for count, itm in enumerate(lat): - if count == 3: - out_msg += u" " * 6 - out_msg += u" " * (max_len - len(str(itm)) + 1) - out_msg += str(itm) + out_msg += ( + f"\n{idx + 3}. " + f"{lat[0]:{max_len}d} " + f"{lat[1]:{max_len}d} " + f"{lat[2]:{max_len}d} " + f"{lat[3]:{max_len}d} " + f"{lat[4]:{max_len}d} " + f"{lat[5]:{max_len}d} " + ) return out_msg except (AttributeError, IndexError, ValueError, KeyError): - return msg + return u"Test Failed." def _get_testbed(self, msg): """Called when extraction of testbed IP is required. @@ -867,6 +872,40 @@ class ExecutionChecker(ResultVisitor): return latency, u"FAIL" + @staticmethod + def _get_hoststack_data(msg, tags): + """Get data from the hoststack test message. + + :param msg: The test message to be parsed. + :param tags: Test tags. + :type msg: str + :type tags: list + :returns: Parsed data as a JSON dict and the status (PASS/FAIL). + :rtype: tuple(dict, str) + """ + result = dict() + status = u"FAIL" + + msg = msg.replace(u"'", u'"').replace(u" ", u"") + if u"LDPRELOAD" in tags: + try: + result = loads(msg) + status = u"PASS" + except JSONDecodeError: + pass + elif u"VPPECHO" in tags: + try: + msg_lst = msg.replace(u"}{", u"} {").split(u" ") + result = dict( + client=loads(msg_lst[0]), + server=loads(msg_lst[1]) + ) + status = u"PASS" + except (JSONDecodeError, IndexError): + pass + + return result, status + def visit_suite(self, suite): """Implements traversing through the suite and its direct children. @@ -974,13 +1013,24 @@ class ExecutionChecker(ResultVisitor): replace(u'\r', u'').\ replace(u'[', u' |br| [').\ replace(u' |br| [', u'[', 1) - test_result[u"msg"] = test.message.\ - replace(u'\n', u' |br| ').\ - replace(u'\r', u'').\ - replace(u'"', u"'") test_result[u"type"] = u"FUNC" test_result[u"status"] = test.status + if test.status == u"PASS": + if u"NDRPDR" in tags: + test_result[u"msg"] = self._get_data_from_perf_test_msg( + test.message).replace(u'\n', u' |br| ').\ + replace(u'\r', u'').replace(u'"', u"'") + elif u"MRR" in tags or u"FRMOBL" in tags or u"BMRR" in tags: + test_result[u"msg"] = self._get_data_from_mrr_test_msg( + test.message).replace(u'\n', u' |br| ').\ + replace(u'\r', u'').replace(u'"', u"'") + else: + test_result[u"msg"] = test.message.replace(u'\n', u' |br| ').\ + replace(u'\r', u'').replace(u'"', u"'") + else: + test_result[u"msg"] = u"Test Failed." + if u"PERFTEST" 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 @@ -996,14 +1046,14 @@ class ExecutionChecker(ResultVisitor): 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) + 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 @@ -1016,11 +1066,6 @@ class ExecutionChecker(ResultVisitor): if test.status == u"PASS": if u"NDRPDR" in tags: - test_result[u"msg"] = self._get_data_from_perf_test_msg( - test.message). \ - replace(u'\n', u' |br| '). \ - replace(u'\r', u''). \ - replace(u'"', u"'") test_result[u"type"] = u"NDRPDR" test_result[u"throughput"], test_result[u"status"] = \ self._get_ndrpdr_throughput(test.message) @@ -1030,16 +1075,15 @@ class ExecutionChecker(ResultVisitor): test_result[u"type"] = u"SOAK" test_result[u"throughput"], test_result[u"status"] = \ self._get_plr_throughput(test.message) + elif u"HOSTSTACK" in tags: + test_result[u"type"] = u"HOSTSTACK" + test_result[u"result"], test_result[u"status"] = \ + self._get_hoststack_data(test.message, tags) elif u"TCP" in tags: test_result[u"type"] = u"TCP" groups = re.search(self.REGEX_TCP, test.message) test_result[u"result"] = int(groups.group(2)) elif u"MRR" in tags or u"FRMOBL" in tags or u"BMRR" in tags: - test_result[u"msg"] = self._get_data_from_mrr_test_msg( - test.message). \ - replace(u'\n', u' |br| '). \ - replace(u'\r', u''). \ - replace(u'"', u"'") if u"MRR" in tags: test_result[u"type"] = u"MRR" else: @@ -1147,7 +1191,8 @@ class ExecutionChecker(ResultVisitor): test_kw.name.count(u"Show Runtime Counters On All Duts"): self._msg_type = u"test-show-runtime" self._sh_run_counter += 1 - elif test_kw.name.count(u"Install Dpdk Test") and not self._version: + elif test_kw.name.count(u"Install Dpdk Test On All Duts") and \ + not self._version: self._msg_type = u"dpdk-version" else: return