X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftools%2Fpresentation%2Finput_data_parser.py;h=5d9234e9413516ade099999eb8db1ed3f59a2cb7;hp=ddfd96c77f47ebe2148a33ce3b4c479725e7e0dd;hb=b47c8f8ed56880eda3f64cf06abd47155ea97db0;hpb=2c06090c7b919783a91d3ca9ca8c8319b5c35b07 diff --git a/resources/tools/presentation/input_data_parser.py b/resources/tools/presentation/input_data_parser.py index ddfd96c77f..5d9234e941 100644 --- a/resources/tools/presentation/input_data_parser.py +++ b/resources/tools/presentation/input_data_parser.py @@ -30,6 +30,8 @@ from datetime import datetime as dt from datetime import timedelta from json import loads +import hdrh.histogram +import hdrh.codec import prettytable import pandas as pd @@ -212,12 +214,11 @@ class ExecutionChecker(ResultVisitor): r'PDR_UPPER:\s(\d+.\d+)' ) REGEX_PERF_MSG_INFO = re.compile( - r'NDR_LOWER:\s(\d+.\d+)\s([a-zA-Z]*).*\s(\d+.\d+)\s([a-zA-Z]*).*\n' - r'LATENCY.*\[\'(.*)\', \'(.*)\'\].*\n' - r'NDR_UPPER:\s(\d+.\d+)\s([a-zA-Z]*).*\s(\d+.\d+)\s([a-zA-Z]*).*\n' - r'PDR_LOWER:\s(\d+.\d+)\s([a-zA-Z]*).*\s(\d+.\d+)\s([a-zA-Z]*).*\n' - r'LATENCY.*\[\'(.*)\', \'(.*)\'\].*\n' - r'PDR_UPPER:\s(\d+.\d+)\s([a-zA-Z]*).*\s(\d+.\d+)\s([a-zA-Z]*)' + r'NDR_LOWER:\s(\d+.\d+)\s.*\s(\d+.\d+)\s.*\n.*\n.*\n' + r'PDR_LOWER:\s(\d+.\d+)\s.*\s(\d+.\d+)\s.*\n.*\n.*\n' + r'Latency at 90% PDR:.*\[\'(.*)\', \'(.*)\'\].*\n' + r'Latency at 50% PDR:.*\[\'(.*)\', \'(.*)\'\].*\n' + r'Latency at 10% PDR:.*\[\'(.*)\', \'(.*)\'\].*\n' ) # TODO: Remove when not needed REGEX_NDRPDR_LAT_BASE = re.compile( @@ -315,6 +316,8 @@ class ExecutionChecker(ResultVisitor): # 2 - PAPI History of DUT2 self._conf_history_lookup_nr = 0 + self._sh_run_counter = 0 + # Test ID of currently processed test- the lowercase full path to the # test self._test_id = None @@ -369,68 +372,90 @@ class ExecutionChecker(ResultVisitor): """ groups = re.search(self.REGEX_PERF_MSG_INFO, msg) - if not groups or groups.lastindex != 20: + if not groups or groups.lastindex != 10: return msg try: data = { u"ndr_low": float(groups.group(1)), - u"ndr_low_unit": groups.group(2), - u"ndr_low_b": float(groups.group(3)), - u"ndr_low_b_unit": groups.group(4), - u"ndr_lat_1": groups.group(5), - u"ndr_lat_2": groups.group(6), - u"ndr_up": float(groups.group(7)), - u"ndr_up_unit": groups.group(8), - u"ndr_up_b": float(groups.group(9)), - u"ndr_up_b_unit": groups.group(10), - u"pdr_low": float(groups.group(11)), - u"pdr_low_unit": groups.group(12), - u"pdr_low_b": float(groups.group(13)), - u"pdr_low_b_unit": groups.group(14), - u"pdr_lat_1": groups.group(15), - u"pdr_lat_2": groups.group(16), - u"pdr_up": float(groups.group(17)), - u"pdr_up_unit": groups.group(18), - u"pdr_up_b": float(groups.group(19)), - u"pdr_up_b_unit": groups.group(20) + u"ndr_low_b": float(groups.group(2)), + u"pdr_low": float(groups.group(3)), + u"pdr_low_b": float(groups.group(4)), + u"pdr_lat_90_1": groups.group(5), + u"pdr_lat_90_2": groups.group(6), + u"pdr_lat_50_1": groups.group(7), + u"pdr_lat_50_2": groups.group(8), + u"pdr_lat_10_1": groups.group(9), + u"pdr_lat_10_2": groups.group(10), } except (AttributeError, IndexError, ValueError, KeyError): return msg - def _process_lat(in_str): + def _process_lat(in_str_1, in_str_2): """Extract min, avg, max values from latency string. - :param in_str: Latency string produced by robot framework. - :type in_str: str - :returns: Processed latency string or original string if a problem + :param in_str_1: Latency string for one direction produced by robot + framework. + :param in_str_2: Latency string for second direction produced by + robot framework. + :type in_str_1: str + :type in_str_2: str + :returns: Processed latency string or empty string if a problem occurs. - :rtype: str + :rtype: tuple(str, str) """ - in_list = in_str.split('/', 3) - if len(in_list) < 3: - return in_str + in_list_1 = in_str_1.split('/', 3) + in_list_2 = in_str_2.split('/', 3) - return f"min={in_list[0]}, avg={in_list[1]}, max={in_list[2]}" + if len(in_list_1) != 4 and len(in_list_2) != 4: + return u"" + + in_list_1[3] += u"=" * (len(in_list_1[3]) % 4) + try: + hdr_lat_1 = hdrh.histogram.HdrHistogram.decode(in_list_1[3]) + except hdrh.codec.HdrLengthException: + return u"" + + 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 u"" + + if hdr_lat_1 and hdr_lat_2: + hdr_lat_1_50 = hdr_lat_1.get_value_at_percentile(50.0) + hdr_lat_1_90 = hdr_lat_1.get_value_at_percentile(90.0) + hdr_lat_1_99 = hdr_lat_1.get_value_at_percentile(99.0) + hdr_lat_2_50 = hdr_lat_2.get_value_at_percentile(50.0) + hdr_lat_2_90 = hdr_lat_2.get_value_at_percentile(90.0) + hdr_lat_2_99 = hdr_lat_2.get_value_at_percentile(99.0) + + if (hdr_lat_1_50 + hdr_lat_1_90 + hdr_lat_1_99 + + hdr_lat_2_50 + hdr_lat_2_90 + hdr_lat_2_99): + return ( + f"{hdr_lat_1_50} {hdr_lat_1_90} {hdr_lat_1_99} , " + f"{hdr_lat_2_50} {hdr_lat_2_90} {hdr_lat_2_99}" + ) + + return u"" try: + pdr_lat_10 = _process_lat(data[u'pdr_lat_10_1'], + data[u'pdr_lat_10_2']) + pdr_lat_50 = _process_lat(data[u'pdr_lat_50_1'], + data[u'pdr_lat_50_2']) + pdr_lat_90 = _process_lat(data[u'pdr_lat_90_1'], + data[u'pdr_lat_90_2']) + pdr_lat_10 = f"\n3. {pdr_lat_10}" if pdr_lat_10 else u"" + pdr_lat_50 = f"\n4. {pdr_lat_50}" if pdr_lat_50 else u"" + pdr_lat_90 = f"\n5. {pdr_lat_90}" if pdr_lat_90 else u"" + return ( - f"NDR Lower: {(data[u'ndr_low'] / 1e6):.2f}" - f"M{data[u'ndr_low_unit']}, " - f"{data[u'ndr_low_b']:.2f}{data[u'ndr_low_b_unit']}\n" - # f"NDR Upper: {(data[u'ndr_up'] / 1e6):.2f}" - # f"M{data[u'ndr_up_unit']}, " - # f"{data[u'ndr_up_b']:.2f}{data[u'ndr_up_b_unit']}\n" - f"NDR Latency W-E: {_process_lat(data[u'ndr_lat_1'])}\n" - f"NDR Latency E-W: {_process_lat(data[u'ndr_lat_2'])}\n" - f"PDR Lower: {(data[u'pdr_low'] / 1e6):.2f}" - f"M{data[u'pdr_low_unit']}, " - f"{data[u'pdr_low_b']:.2f}{data[u'pdr_low_b_unit']}\n" - # f"PDR Upper: {(data[u'pdr_up'] / 1e6):.2f}" - # f"M{data[u'pdr_up_unit']}, " - # f"{data[u'pdr_up_b']:.2f}{data[u'pdr_up_b_unit']}\n" - f"PDR Latency W-E: {_process_lat(data[u'pdr_lat_1'])}\n" - f"PDR Latency E-W: {_process_lat(data[u'pdr_lat_2'])}" + f"1. {(data[u'ndr_low'] / 1e6):.2f} {data[u'ndr_low_b']:.2f}" + f"\n2. {(data[u'pdr_low'] / 1e6):.2f} {data[u'pdr_low_b']:.2f}" + f"{pdr_lat_10}" + f"{pdr_lat_50}" + f"{pdr_lat_90}" ) except (AttributeError, IndexError, ValueError, KeyError): return msg @@ -559,6 +584,10 @@ class ExecutionChecker(ResultVisitor): if not msg.message.count(u"stats runtime"): return + # Temporary solution + if self._sh_run_counter > 1: + return + if u"show-run" not in self._data[u"tests"][self._test_id].keys(): self._data[u"tests"][self._test_id][u"show-run"] = dict() @@ -882,6 +911,8 @@ class ExecutionChecker(ResultVisitor): :returns: Nothing. """ + self._sh_run_counter = 0 + longname_orig = test.longname.lower() # Check the ignore list @@ -1002,6 +1033,8 @@ class ExecutionChecker(ResultVisitor): } except (AttributeError, IndexError, ValueError, TypeError): test_result[u"status"] = u"FAIL" + elif u"DEVICETEST" in tags: + test_result[u"type"] = u"DEVICETEST" else: test_result[u"status"] = u"FAIL" self._data[u"tests"][self._test_id] = test_result @@ -1076,6 +1109,7 @@ class ExecutionChecker(ResultVisitor): if test_kw.name.count(u"Show Runtime On All Duts") or \ 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: self._msg_type = u"dpdk-version" else: