X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftools%2Fpresentation%2Fgenerator_cpta.py;h=b4ff42e4e4fc8ec455a1d772c15857cda1297ed5;hp=5cc56fd9655d994dd95f4154808a5bd2e9388477;hb=ac1fbfcd12d5bd4db1b04bbf27b6d47880bcd3e7;hpb=3b5495d0943283e96ce5fa23c0b1f31846ca0f6f diff --git a/resources/tools/presentation/generator_cpta.py b/resources/tools/presentation/generator_cpta.py index 5cc56fd965..b4ff42e4e4 100644 --- a/resources/tools/presentation/generator_cpta.py +++ b/resources/tools/presentation/generator_cpta.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Cisco and/or its affiliates. +# Copyright (c) 2022 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -13,7 +13,6 @@ """Generation of Continuous Performance Trending and Analysis. """ - import re import logging import csv @@ -21,6 +20,7 @@ import csv from collections import OrderedDict from datetime import datetime from copy import deepcopy +from os import listdir import prettytable import plotly.offline as ploff @@ -223,7 +223,18 @@ def _generate_trending_traces(in_data, job_name, build_info, if u"-cps" in name: hover_str = hover_str.replace(u"[Mpps]", u"[Mcps]").\ replace(u"throughput", u"connection rate") - if u"dpdk" in job_name: + if u"vpp" in job_name: + hover_str = hover_str.format( + date=date, + property=u"average" if incl_tests == u"mrr" else u"throughput", + value=data_y_mpps[index], + sut=u"vpp", + build=build_info[job_name][str_key][1].rsplit(u'~', 1)[0], + test=incl_tests, + period=u"daily" if incl_tests == u"mrr" else u"weekly", + build_nr=str_key, + testbed=build_info[job_name][str_key][2]) + elif u"dpdk" in job_name: hover_str = hover_str.format( date=date, property=u"average" if incl_tests == u"mrr" else u"throughput", @@ -234,13 +245,13 @@ def _generate_trending_traces(in_data, job_name, build_info, period=u"weekly", build_nr=str_key, testbed=build_info[job_name][str_key][2]) - elif u"vpp" in job_name: + elif u"trex" in job_name: hover_str = hover_str.format( date=date, property=u"average" if incl_tests == u"mrr" else u"throughput", value=data_y_mpps[index], - sut=u"vpp", - build=build_info[job_name][str_key][1].rsplit(u'~', 1)[0], + sut=u"trex", + build=u"", test=incl_tests, period=u"daily" if incl_tests == u"mrr" else u"weekly", build_nr=str_key, @@ -827,22 +838,158 @@ def _generate_all_charts(spec, input_data): # Evaluate result: if anomaly_classifications: + test_reg_lst = [] + nic_reg_lst = [] + frmsize_reg_lst = [] + trend_reg_lst = [] + number_reg_lst = [] + ltc_reg_lst = [] + test_prog_lst = [] + nic_prog_lst = [] + frmsize_prog_lst = [] + trend_prog_lst = [] + number_prog_lst = [] + ltc_prog_lst = [] result = u"PASS" + + class MaxLens(): + """Class to store the max lengths of strings displayed in + regressions and progressions. + """ + + def __init__(self, tst, nic, frmsize, trend, run, ltc): + """Initialisation. + + :param tst: Name of the test. + :param nic: NIC used in the test. + :param frmsize: Frame size used in the test. + :param trend: Trend Change. + :param run: Number of runs for last trend. + :param ltc: Regression or Progression + """ + self.tst = tst + self.nic = nic + self.frmsize = frmsize + self.trend = trend + self.run = run + self.ltc = ltc + + max_len = MaxLens(0, 0, 0, 0, 0, 0) + for job_name, job_data in anomaly_classifications.items(): - file_name = \ - f"{spec.cpta[u'output-file']}/regressions-{job_name}.txt" - with open(file_name, u'w') as txt_file: - for test_name, classification in job_data.items(): - if classification == u"regression": - txt_file.write(test_name + u'\n') + data = [] + tb = u"-".join(job_name.split(u"-")[-2:]) + for file in listdir(f"{spec.cpta[u'output-file']}"): + if tb in file and u"performance-trending-dashboard" in \ + file and u"txt" in file: + file_to_read = f"{spec.cpta[u'output-file']}/{file}" + with open(f"{file_to_read}", u"rt") as f_in: + data = data + f_in.readlines() + + for test_name, classification in job_data.items(): + if classification != u"normal": + if u"2n" in test_name: + test_name = test_name.split("-", 2) + tst = test_name[2].split(".")[-1] + nic = test_name[1] + else: + test_name = test_name.split("-", 1) + tst = test_name[1].split(".")[-1] + nic = test_name[0].split(".")[-1] + frmsize = tst.split("-")[0] + tst = u"-".join(tst.split("-")[1:]) + tst_name = f"{nic}-{frmsize}-{tst}" + if len(tst) > max_len.tst: + max_len.tst = len(tst) + if len(nic) > max_len.nic: + max_len.nic = len(nic) + if len(frmsize) > max_len.frmsize: + max_len.frmsize = len(frmsize) + + for line in data: + if tst_name in line: + line = line.replace(" ", "") + trend = line.split("|")[2] + if len(str(trend)) > max_len.trend: + max_len.trend = len(str(trend)) + number = line.split("|")[3] + if len(str(number)) > max_len.run: + max_len.run = len(str(number)) + ltc = line.split("|")[4] + if len(str(ltc)) > max_len.ltc: + max_len.ltc = len(str(ltc)) + if classification == u'regression': + test_reg_lst.append(tst) + nic_reg_lst.append(nic) + frmsize_reg_lst.append(frmsize) + trend_reg_lst.append(trend) + number_reg_lst.append(number) + ltc_reg_lst.append(ltc) + elif classification == u'progression': + test_prog_lst.append(tst) + nic_prog_lst.append(nic) + frmsize_prog_lst.append(frmsize) + trend_prog_lst.append(trend) + number_prog_lst.append(number) + ltc_prog_lst.append(ltc) + if classification in (u"regression", u"outlier"): result = u"FAIL" + + text = u"" + for idx in range(len(test_reg_lst)): + text += ( + f"{test_reg_lst[idx]}" + f"{u' ' * (max_len.tst - len(test_reg_lst[idx]))} " + f"{nic_reg_lst[idx]}" + f"{u' ' * (max_len.nic - len(nic_reg_lst[idx]))} " + f"{frmsize_reg_lst[idx].upper()}" + f"{u' ' * (max_len.frmsize - len(frmsize_reg_lst[idx]))} " + f"{trend_reg_lst[idx]}" + f"{u' ' * (max_len.trend - len(str(trend_reg_lst[idx])))} " + f"{number_reg_lst[idx]}" + f"{u' ' * (max_len.run - len(str(number_reg_lst[idx])))} " + f"{ltc_reg_lst[idx]}" + f"{u' ' * (max_len.ltc - len(str(ltc_reg_lst[idx])))} " + f"\n" + ) + + file_name = \ + f"{spec.cpta[u'output-file']}/regressions-{job_name}.txt" + + try: + with open(f"{file_name}", u'w') as txt_file: + txt_file.write(text) + except IOError: + logging.error( + f"Not possible to write the file {file_name}.") + + text = u"" + for idx in range(len(test_prog_lst)): + text += ( + f"{test_prog_lst[idx]}" + f"{u' ' * (max_len.tst - len(test_prog_lst[idx]))} " + f"{nic_prog_lst[idx]}" + f"{u' ' * (max_len.nic - len(nic_prog_lst[idx]))} " + f"{frmsize_prog_lst[idx].upper()}" + f"{u' ' * (max_len.frmsize - len(frmsize_prog_lst[idx]))} " + f"{trend_prog_lst[idx]}" + f"{u' ' * (max_len.trend -len(str(trend_prog_lst[idx])))} " + f"{number_prog_lst[idx]}" + f"{u' ' * (max_len.run - len(str(number_prog_lst[idx])))} " + f"{ltc_prog_lst[idx]}" + f"{u' ' * (max_len.ltc - len(str(ltc_prog_lst[idx])))} " + f"\n" + ) + file_name = \ f"{spec.cpta[u'output-file']}/progressions-{job_name}.txt" - with open(file_name, u'w') as txt_file: - for test_name, classification in job_data.items(): - if classification == u"progression": - txt_file.write(test_name + u'\n') + try: + with open(f"{file_name}", u'w') as txt_file: + txt_file.write(text) + except IOError: + logging.error(f"Not possible to write the file {file_name}.") + else: result = u"FAIL"