X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftools%2Fpresentation%2Fgenerator_tables.py;h=576766952b9297b82271afbe325cb64e7551923d;hp=71651969e196e52b07d37f145b22a47f135836b9;hb=b47c8f8ed56880eda3f64cf06abd47155ea97db0;hpb=ba15109cf5b9972be50821ef500e8a637cdac4f9 diff --git a/resources/tools/presentation/generator_tables.py b/resources/tools/presentation/generator_tables.py index 71651969e1..576766952b 100644 --- a/resources/tools/presentation/generator_tables.py +++ b/resources/tools/presentation/generator_tables.py @@ -34,7 +34,7 @@ from pal_utils import mean, stdev, relative_change, classify_anomalies, \ convert_csv_to_pretty_txt, relative_change_stdev -REGEX_NIC = re.compile(r'\d*ge\dp\d\D*\d*') +REGEX_NIC = re.compile(r'(\d*ge\dp\d\D*\d*[a-z]*)') def generate_tables(spec, data): @@ -57,7 +57,8 @@ def generate_tables(spec, data): u"table_perf_trending_dash_html": table_perf_trending_dash_html, u"table_last_failed_tests": table_last_failed_tests, u"table_failed_tests": table_failed_tests, - u"table_failed_tests_html": table_failed_tests_html + u"table_failed_tests_html": table_failed_tests_html, + u"table_oper_data_html": table_oper_data_html } logging.info(u"Generating the tables ...") @@ -72,6 +73,200 @@ def generate_tables(spec, data): logging.info(u"Done.") +def table_oper_data_html(table, input_data): + """Generate the table(s) with algorithm: html_table_oper_data + specified in the specification file. + + :param table: Table to generate. + :param input_data: Data to process. + :type table: pandas.Series + :type input_data: InputData + """ + + logging.info(f" Generating the table {table.get(u'title', u'')} ...") + # Transform the data + logging.info( + f" Creating the data set for the {table.get(u'type', u'')} " + f"{table.get(u'title', u'')}." + ) + data = input_data.filter_data( + table, + params=[u"name", u"parent", u"show-run", u"type"], + continue_on_error=True + ) + if data.empty: + return + data = input_data.merge_data(data) + data.sort_index(inplace=True) + + suites = input_data.filter_data( + table, + continue_on_error=True, + data_set=u"suites" + ) + if suites.empty: + return + suites = input_data.merge_data(suites) + + def _generate_html_table(tst_data): + """Generate an HTML table with operational data for the given test. + + :param tst_data: Test data to be used to generate the table. + :type tst_data: pandas.Series + :returns: HTML table with operational data. + :rtype: str + """ + + colors = { + u"header": u"#7eade7", + u"empty": u"#ffffff", + u"body": (u"#e9f1fb", u"#d4e4f7") + } + + tbl = ET.Element(u"table", attrib=dict(width=u"100%", border=u"0")) + + trow = ET.SubElement(tbl, u"tr", attrib=dict(bgcolor=colors[u"header"])) + thead = ET.SubElement( + trow, u"th", attrib=dict(align=u"left", colspan=u"6") + ) + thead.text = tst_data[u"name"] + + trow = ET.SubElement(tbl, u"tr", attrib=dict(bgcolor=colors[u"empty"])) + thead = ET.SubElement( + trow, u"th", attrib=dict(align=u"left", colspan=u"6") + ) + thead.text = u"\t" + + if tst_data.get(u"show-run", u"No Data") == u"No Data": + trow = ET.SubElement( + tbl, u"tr", attrib=dict(bgcolor=colors[u"header"]) + ) + tcol = ET.SubElement( + trow, u"td", attrib=dict(align=u"left", colspan=u"6") + ) + tcol.text = u"No Data" + return str(ET.tostring(tbl, encoding=u"unicode")) + + tbl_hdr = ( + u"Name", + u"Nr of Vectors", + u"Nr of Packets", + u"Suspends", + u"Cycles per Packet", + u"Average Vector Size" + ) + + for dut_name, dut_data in tst_data[u"show-run"].items(): + trow = ET.SubElement( + tbl, u"tr", attrib=dict(bgcolor=colors[u"header"]) + ) + tcol = ET.SubElement( + trow, u"td", attrib=dict(align=u"left", colspan=u"6") + ) + if dut_data.get(u"threads", None) is None: + tcol.text = u"No Data" + continue + bold = ET.SubElement(tcol, u"b") + bold.text = dut_name + + trow = ET.SubElement( + tbl, u"tr", attrib=dict(bgcolor=colors[u"body"][0]) + ) + tcol = ET.SubElement( + trow, u"td", attrib=dict(align=u"left", colspan=u"6") + ) + bold = ET.SubElement(tcol, u"b") + bold.text = ( + f"Host IP: {dut_data.get(u'host', '')}, " + f"Socket: {dut_data.get(u'socket', '')}" + ) + trow = ET.SubElement( + tbl, u"tr", attrib=dict(bgcolor=colors[u"empty"]) + ) + thead = ET.SubElement( + trow, u"th", attrib=dict(align=u"left", colspan=u"6") + ) + thead.text = u"\t" + + for thread_nr, thread in dut_data[u"threads"].items(): + trow = ET.SubElement( + tbl, u"tr", attrib=dict(bgcolor=colors[u"header"]) + ) + tcol = ET.SubElement( + trow, u"td", attrib=dict(align=u"left", colspan=u"6") + ) + bold = ET.SubElement(tcol, u"b") + bold.text = u"main" if thread_nr == 0 else f"worker_{thread_nr}" + trow = ET.SubElement( + tbl, u"tr", attrib=dict(bgcolor=colors[u"header"]) + ) + for idx, col in enumerate(tbl_hdr): + tcol = ET.SubElement( + trow, u"td", + attrib=dict(align=u"right" if idx else u"left") + ) + font = ET.SubElement( + tcol, u"font", attrib=dict(size=u"2") + ) + bold = ET.SubElement(font, u"b") + bold.text = col + for row_nr, row in enumerate(thread): + trow = ET.SubElement( + tbl, u"tr", + attrib=dict(bgcolor=colors[u"body"][row_nr % 2]) + ) + for idx, col in enumerate(row): + tcol = ET.SubElement( + trow, u"td", + attrib=dict(align=u"right" if idx else u"left") + ) + font = ET.SubElement( + tcol, u"font", attrib=dict(size=u"2") + ) + if isinstance(col, float): + font.text = f"{col:.2f}" + else: + font.text = str(col) + trow = ET.SubElement( + tbl, u"tr", attrib=dict(bgcolor=colors[u"empty"]) + ) + thead = ET.SubElement( + trow, u"th", attrib=dict(align=u"left", colspan=u"6") + ) + thead.text = u"\t" + + trow = ET.SubElement(tbl, u"tr", attrib=dict(bgcolor=colors[u"empty"])) + thead = ET.SubElement( + trow, u"th", attrib=dict(align=u"left", colspan=u"6") + ) + font = ET.SubElement( + thead, u"font", attrib=dict(size=u"12px", color=u"#ffffff") + ) + font.text = u"." + + return str(ET.tostring(tbl, encoding=u"unicode")) + + for suite in suites.values: + html_table = str() + for test_data in data.values: + if test_data[u"parent"] not in suite[u"name"]: + continue + html_table += _generate_html_table(test_data) + if not html_table: + continue + try: + file_name = f"{table[u'output-file']}_{suite[u'name']}.rst" + with open(f"{file_name}", u'w') as html_file: + logging.info(f" Writing file: {file_name}") + html_file.write(u".. raw:: html\n\n\t") + html_file.write(html_table) + html_file.write(u"\n\t



\n") + except KeyError: + logging.warning(u"The output file is not defined.") + return + logging.info(u" Done.") + + def table_details(table, input_data): """Generate the table(s) with algorithm: table_detailed_test_results specified in the specification file. @@ -122,9 +317,11 @@ def table_details(table, input_data): try: col_data = str(data[job][build][test][column[ u"data"].split(" ")[1]]).replace(u'"', u'""') + if column[u"data"].split(u" ")[1] in (u"name", ): + col_data = f" |prein| {col_data} |preout| " if column[u"data"].split(u" ")[1] in \ (u"conf-history", u"show-run"): - col_data = col_data.replace(u" |br| ", u"", ) + col_data = col_data.replace(u" |br| ", u"", 1) col_data = f" |prein| {col_data[:-5]} |preout| " row_lst.append(f'"{col_data}"') except KeyError: @@ -138,7 +335,7 @@ def table_details(table, input_data): f"{table[u'output-file-ext']}" ) logging.info(f" Writing file: {file_name}") - with open(file_name, u"w") as file_handler: + with open(file_name, u"wt") as file_handler: file_handler.write(u",".join(header) + u"\n") for item in table_lst: file_handler.write(u",".join(item) + u"\n") @@ -196,8 +393,10 @@ def table_merged_details(table, input_data): col_data = col_data.replace( u"No Data", u"Not Captured " ) + if column[u"data"].split(u" ")[1] in (u"name", ): + col_data = f" |prein| {col_data} |preout| " if column[u"data"].split(u" ")[1] in \ - (u"conf-history", u"show-run"): + (u"conf-history", u"show-run", u"msg"): col_data = col_data.replace(u" |br| ", u"", 1) col_data = f" |prein| {col_data[:-5]} |preout| " row_lst.append(f'"{col_data}"') @@ -212,7 +411,7 @@ def table_merged_details(table, input_data): f"{table[u'output-file-ext']}" ) logging.info(f" Writing file: {file_name}") - with open(file_name, u"w") as file_handler: + with open(file_name, u"wt") as file_handler: file_handler.write(u",".join(header) + u"\n") for item in table_lst: file_handler.write(u",".join(item) + u"\n") @@ -469,9 +668,9 @@ def table_perf_comparison(table, input_data): # Prepare data to the table: tbl_dict = dict() - topo = "" + # topo = "" for job, builds in table[u"reference"][u"data"].items(): - topo = u"2n-skx" if u"2n-skx" in job else u"" + # topo = u"2n-skx" if u"2n-skx" in job else u"" for build in builds: for tst_name, tst_data in data[job][str(build)].items(): tst_name_mod = _tpc_modify_test_name(tst_name) @@ -494,6 +693,38 @@ def table_perf_comparison(table, input_data): src=tst_data, include_tests=table[u"include-tests"]) + replacement = table[u"reference"].get(u"data-replacement", None) + if replacement: + create_new_list = True + rpl_data = input_data.filter_data( + table, data=replacement, continue_on_error=True) + for job, builds in replacement.items(): + for build in builds: + for tst_name, tst_data in rpl_data[job][str(build)].items(): + tst_name_mod = _tpc_modify_test_name(tst_name) + if u"across topologies" in table[u"title"].lower(): + tst_name_mod = tst_name_mod.replace(u"2n1l-", u"") + if tbl_dict.get(tst_name_mod, None) is None: + name = \ + f"{u'-'.join(tst_data[u'name'].split(u'-')[:-1])}" + if u"across testbeds" in table[u"title"].lower() or \ + u"across topologies" in table[u"title"].lower(): + name = _tpc_modify_displayed_test_name(name) + tbl_dict[tst_name_mod] = { + u"name": name, + u"ref-data": list(), + u"cmp-data": list() + } + if create_new_list: + create_new_list = False + tbl_dict[tst_name_mod][u"ref-data"] = list() + + _tpc_insert_data( + target=tbl_dict[tst_name_mod][u"ref-data"], + src=tst_data, + include_tests=table[u"include-tests"] + ) + for job, builds in table[u"compare"][u"data"].items(): for build in builds: for tst_name, tst_data in data[job][str(build)].items(): @@ -609,10 +840,10 @@ def table_perf_comparison(table, input_data): if item[-2] == u"Not tested": pass elif item[-4] == u"Not tested": - item.append(u"New in CSIT-1908") - elif topo == u"2n-skx" and u"dot1q" in tbl_dict[tst_name][u"name"]: - item.append(u"See footnote [1]") - footnote = True + item.append(u"New in CSIT-2001") + # elif topo == u"2n-skx" and u"dot1q" in tbl_dict[tst_name][u"name"]: + # item.append(u"See footnote [1]") + # footnote = True elif item[-4] != 0: item.append(int(relative_change(float(item[-4]), float(item[-2])))) if (len(item) == len(header)) and (item[-3] != u"Not tested"): @@ -622,7 +853,7 @@ def table_perf_comparison(table, input_data): # Generate csv tables: csv_file = f"{table[u'output-file']}.csv" - with open(csv_file, u"w") as file_handler: + with open(csv_file, u"wt") as file_handler: file_handler.write(header_str) for test in tbl_lst: file_handler.write(u",".join([str(item) for item in test]) + u"\n") @@ -700,9 +931,9 @@ def table_perf_comparison_nic(table, input_data): # Prepare data to the table: tbl_dict = dict() - topo = u"" + # topo = u"" for job, builds in table[u"reference"][u"data"].items(): - topo = u"2n-skx" if u"2n-skx" in job else u"" + # topo = u"2n-skx" if u"2n-skx" in job else u"" for build in builds: for tst_name, tst_data in data[job][str(build)].items(): if table[u"reference"][u"nic"] not in tst_data[u"tags"]: @@ -726,6 +957,40 @@ def table_perf_comparison_nic(table, input_data): include_tests=table[u"include-tests"] ) + replacement = table[u"reference"].get(u"data-replacement", None) + if replacement: + create_new_list = True + rpl_data = input_data.filter_data( + table, data=replacement, continue_on_error=True) + for job, builds in replacement.items(): + for build in builds: + for tst_name, tst_data in rpl_data[job][str(build)].items(): + if table[u"reference"][u"nic"] not in tst_data[u"tags"]: + continue + tst_name_mod = _tpc_modify_test_name(tst_name) + if u"across topologies" in table[u"title"].lower(): + tst_name_mod = tst_name_mod.replace(u"2n1l-", u"") + if tbl_dict.get(tst_name_mod, None) is None: + name = \ + f"{u'-'.join(tst_data[u'name'].split(u'-')[:-1])}" + if u"across testbeds" in table[u"title"].lower() or \ + u"across topologies" in table[u"title"].lower(): + name = _tpc_modify_displayed_test_name(name) + tbl_dict[tst_name_mod] = { + u"name": name, + u"ref-data": list(), + u"cmp-data": list() + } + if create_new_list: + create_new_list = False + tbl_dict[tst_name_mod][u"ref-data"] = list() + + _tpc_insert_data( + target=tbl_dict[tst_name_mod][u"ref-data"], + src=tst_data, + include_tests=table[u"include-tests"] + ) + for job, builds in table[u"compare"][u"data"].items(): for build in builds: for tst_name, tst_data in data[job][str(build)].items(): @@ -844,10 +1109,10 @@ def table_perf_comparison_nic(table, input_data): if item[-2] == u"Not tested": pass elif item[-4] == u"Not tested": - item.append(u"New in CSIT-1908") - elif topo == u"2n-skx" and u"dot1q" in tbl_dict[tst_name][u"name"]: - item.append(u"See footnote [1]") - footnote = True + item.append(u"New in CSIT-2001") + # elif topo == u"2n-skx" and u"dot1q" in tbl_dict[tst_name][u"name"]: + # item.append(u"See footnote [1]") + # footnote = True elif item[-4] != 0: item.append(int(relative_change(float(item[-4]), float(item[-2])))) if (len(item) == len(header)) and (item[-3] != u"Not tested"): @@ -857,7 +1122,7 @@ def table_perf_comparison_nic(table, input_data): # Generate csv tables: csv_file = f"{table[u'output-file']}.csv" - with open(csv_file, u"w") as file_handler: + with open(csv_file, u"wt") as file_handler: file_handler.write(header_str) for test in tbl_lst: file_handler.write(u",".join([str(item) for item in test]) + u"\n") @@ -983,7 +1248,7 @@ def table_nics_comparison(table, input_data): tbl_lst.sort(key=lambda rel: rel[-1], reverse=True) # Generate csv tables: - with open(f"{table[u'output-file']}.csv", u"w") as file_handler: + with open(f"{table[u'output-file']}.csv", u"wt") as file_handler: file_handler.write(u",".join(header) + u"\n") for test in tbl_lst: file_handler.write(u",".join([str(item) for item in test]) + u"\n") @@ -1117,7 +1382,7 @@ def table_soak_vs_ndr(table, input_data): # Generate csv tables: csv_file = f"{table[u'output-file']}.csv" - with open(csv_file, u"w") as file_handler: + with open(csv_file, u"wt") as file_handler: file_handler.write(header_str) for test in tbl_lst: file_handler.write(u",".join([str(item) for item in test]) + u"\n") @@ -1240,7 +1505,7 @@ def table_perf_trending_dash(table, input_data): file_name = f"{table[u'output-file']}{table[u'output-file-ext']}" logging.info(f" Writing file: {file_name}") - with open(file_name, u"w") as file_handler: + with open(file_name, u"wt") as file_handler: file_handler.write(header_str) for test in tbl_sorted: file_handler.write(u",".join([str(item) for item in test]) + u'\n') @@ -1275,6 +1540,8 @@ def _generate_url(testbed, test_name): nic = u"vic1385" elif u"x553" in test_name: nic = u"x553" + elif u"cx556" in test_name or u"cx556a" in test_name: + nic = u"cx556a" else: nic = u"" @@ -1307,11 +1574,15 @@ def _generate_url(testbed, test_name): cores = u"4t4c" elif u"2t1c" in test_name or \ (u"-1c-" in test_name and - testbed in (u"2n-skx", u"3n-skx")): + testbed in (u"2n-skx", u"3n-skx", u"2n-clx")): cores = u"2t1c" - elif u"4t2c" in test_name: + elif u"4t2c" in test_name or \ + (u"-2c-" in test_name and + testbed in (u"2n-skx", u"3n-skx", u"2n-clx")): cores = u"4t2c" - elif u"8t4c" in test_name: + elif u"8t4c" in test_name or \ + (u"-4c-" in test_name and + testbed in (u"2n-skx", u"3n-skx", u"2n-clx")): cores = u"8t4c" else: cores = u"" @@ -1322,6 +1593,8 @@ def _generate_url(testbed, test_name): driver = u"l3fwd" elif u"avf" in test_name: driver = u"avf" + elif u"rdma" in test_name: + driver = u"rdma" elif u"dnv" in testbed or u"tsh" in testbed: driver = u"ixgbe" else: @@ -1548,7 +1821,7 @@ def table_last_failed_tests(table, input_data): file_name = f"{table[u'output-file']}{table[u'output-file-ext']}" logging.info(f" Writing file: {file_name}") - with open(file_name, u"w") as file_handler: + with open(file_name, u"wt") as file_handler: for test in tbl_list: file_handler.write(test + u'\n') @@ -1653,7 +1926,7 @@ def table_failed_tests(table, input_data): file_name = f"{table[u'output-file']}{table[u'output-file-ext']}" logging.info(f" Writing file: {file_name}") - with open(file_name, u"w") as file_handler: + with open(file_name, u"wt") as file_handler: file_handler.write(u",".join(header) + u"\n") for test in tbl_sorted: file_handler.write(u",".join([str(item) for item in test]) + u'\n')