diff options
Diffstat (limited to 'csit.infra.dash')
26 files changed, 368 insertions, 133 deletions
diff --git a/csit.infra.dash/app/cdash/comparisons/layout.py b/csit.infra.dash/app/cdash/comparisons/layout.py index 57a1c2a1b4..735f199158 100644 --- a/csit.infra.dash/app/cdash/comparisons/layout.py +++ b/csit.infra.dash/app/cdash/comparisons/layout.py @@ -33,7 +33,8 @@ from ..utils.control_panel import ControlPanel from ..utils.trigger import Trigger from ..utils.url_processing import url_decode from ..utils.utils import generate_options, gen_new_url, navbar_report, \ - filter_table_data, sort_table_data, show_iterative_graph_data, show_tooltip + filter_table_data, sort_table_data, show_iterative_graph_data, \ + show_tooltip, get_topo_arch from .tables import comparison_table from ..report.graphs import graph_iterative @@ -124,7 +125,7 @@ class Layout: lst_job = row["job"].split("-") dut = lst_job[1] dver = f"{row['release']}-{row['dut_version']}" - tbed = "-".join(lst_job[-2:]) + tbed = get_topo_arch(lst_job) lst_test_id = row["test_id"].split(".") suite = lst_test_id[-2].replace("2n1l-", "").replace("1n1l-", "").\ diff --git a/csit.infra.dash/app/cdash/comparisons/tables.py b/csit.infra.dash/app/cdash/comparisons/tables.py index a951ab85e9..fa92f3da7f 100644 --- a/csit.infra.dash/app/cdash/comparisons/tables.py +++ b/csit.infra.dash/app/cdash/comparisons/tables.py @@ -232,7 +232,7 @@ def comparison_table( :returns: A list of simple items. :rtype: list """ - l_infra = sel["infra"].split("-") + l_infra = sel["infra"].rsplit("-", maxsplit=2) selection = list() for core in sel["core"]: for fsize in sel["frmsize"]: @@ -240,8 +240,8 @@ def comparison_table( selection.append({ "dut": sel["dut"], "dutver": sel["dutver"], - "tbed": f"{l_infra[0]}-{l_infra[1]}", - "nic": l_infra[2], + "tbed": l_infra[0], + "nic": l_infra[1], "driver": l_infra[-1].replace("_", "-"), "core": core, "frmsize": fsize, diff --git a/csit.infra.dash/app/cdash/coverage/layout.py b/csit.infra.dash/app/cdash/coverage/layout.py index b8fa0236a5..7442891198 100644 --- a/csit.infra.dash/app/cdash/coverage/layout.py +++ b/csit.infra.dash/app/cdash/coverage/layout.py @@ -32,7 +32,7 @@ from ..utils.constants import Constants as C from ..utils.control_panel import ControlPanel from ..utils.trigger import Trigger from ..utils.utils import label, gen_new_url, generate_options, navbar_report, \ - show_tooltip + show_tooltip, get_topo_arch from ..utils.url_processing import url_decode from .tables import coverage_tables, select_coverage_data @@ -96,7 +96,7 @@ class Layout: lst_job = row["job"].split("-") dut = lst_job[1] d_ver = row["dut_version"] - tbed = "-".join(lst_job[-2:]) + tbed = get_topo_arch(lst_job) lst_test_id = row["test_id"].split(".") if dut == "dpdk": area = "dpdk" diff --git a/csit.infra.dash/app/cdash/coverage/tables.py b/csit.infra.dash/app/cdash/coverage/tables.py index 84adb091a1..d38e51e243 100644 --- a/csit.infra.dash/app/cdash/coverage/tables.py +++ b/csit.infra.dash/app/cdash/coverage/tables.py @@ -52,9 +52,9 @@ def select_coverage_data( l_data = list() # Filter data selected by the user. - phy = selected["phy"].split("-") - if len(phy) == 4: - topo, arch, nic, drv = phy + phy = selected["phy"].rsplit("-", maxsplit=2) + if len(phy) == 3: + topo_arch, nic, drv = phy drv_str = "" if drv == "dpdk" else drv.replace("_", "-") else: return l_data, None @@ -66,7 +66,7 @@ def select_coverage_data( (data["release"] == selected["rls"]) )]) df = df[ - (df.job.str.endswith(f"{topo}-{arch}")) & + (df.job.str.endswith(topo_arch)) & (df.test_id.str.contains( f"^.*\.{selected['area']}\..*{nic}.*{drv_str}.*$", regex=True diff --git a/csit.infra.dash/app/cdash/data/_metadata/coverage_rls2410_device b/csit.infra.dash/app/cdash/data/_metadata/coverage_rls2410_device Binary files differnew file mode 100644 index 0000000000..011ebba41f --- /dev/null +++ b/csit.infra.dash/app/cdash/data/_metadata/coverage_rls2410_device diff --git a/csit.infra.dash/app/cdash/data/_metadata/coverage_rls2410_ndrpdr b/csit.infra.dash/app/cdash/data/_metadata/coverage_rls2410_ndrpdr Binary files differnew file mode 100644 index 0000000000..06bc618bea --- /dev/null +++ b/csit.infra.dash/app/cdash/data/_metadata/coverage_rls2410_ndrpdr diff --git a/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_hoststack b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_hoststack Binary files differnew file mode 100644 index 0000000000..1e9c708253 --- /dev/null +++ b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_hoststack diff --git a/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_mrr b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_mrr Binary files differnew file mode 100644 index 0000000000..ced78967c5 --- /dev/null +++ b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_mrr diff --git a/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_ndrpdr b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_ndrpdr Binary files differnew file mode 100644 index 0000000000..cf2b8a116b --- /dev/null +++ b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_ndrpdr diff --git a/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_soak b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_soak Binary files differnew file mode 100644 index 0000000000..4502ca4f59 --- /dev/null +++ b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2410_soak diff --git a/csit.infra.dash/app/cdash/data/data.yaml b/csit.infra.dash/app/cdash/data/data.yaml index c1b45536b7..36fb450587 100644 --- a/csit.infra.dash/app/cdash/data/data.yaml +++ b/csit.infra.dash/app/cdash/data/data.yaml @@ -539,3 +539,165 @@ - passed - test_id - version +- data_type: iterative + partition: test_type + partition_name: mrr + release: rls2410 + path: s3://fdio-docs-s3-cloudfront-index/csit/parquet/iterative_rls2410 + schema: iterative_rls2410_mrr + columns: + - job + - build + - dut_type + - dut_version + - tg_type + - hosts + - start_time + - passed + - test_id + - version + - result_receive_rate_rate_avg + - result_receive_rate_rate_stdev + - result_receive_rate_rate_unit + - result_receive_rate_bandwidth_avg + - result_receive_rate_bandwidth_stdev + - result_receive_rate_bandwidth_unit +- data_type: iterative + partition: test_type + partition_name: ndrpdr + release: rls2410 + path: s3://fdio-docs-s3-cloudfront-index/csit/parquet/iterative_rls2410 + schema: iterative_rls2410_ndrpdr + columns: + - job + - build + - dut_type + - dut_version + - tg_type + - hosts + - start_time + - passed + - test_id + - version + - result_pdr_lower_rate_unit + - result_pdr_lower_rate_value + - result_ndr_lower_rate_unit + - result_ndr_lower_rate_value + - result_pdr_lower_bandwidth_unit + - result_pdr_lower_bandwidth_value + - result_ndr_lower_bandwidth_unit + - result_ndr_lower_bandwidth_value + - result_latency_reverse_pdr_90_hdrh + - result_latency_reverse_pdr_50_hdrh + - result_latency_reverse_pdr_10_hdrh + - result_latency_reverse_pdr_0_hdrh + - result_latency_forward_pdr_90_hdrh + - result_latency_forward_pdr_50_avg + - result_latency_forward_pdr_50_hdrh + - result_latency_forward_pdr_50_unit + - result_latency_forward_pdr_10_hdrh + - result_latency_forward_pdr_0_hdrh +- data_type: iterative + partition: test_type + partition_name: hoststack + release: rls2410 + path: s3://fdio-docs-s3-cloudfront-index/csit/parquet/iterative_rls2410 + schema: iterative_rls2410_hoststack + columns: + - job + - build + - dut_type + - dut_version + - hosts + - tg_type + - result_bandwidth_unit + - result_bandwidth_value + - result_rate_unit + - result_rate_value + - start_time + - passed + - test_id + - version +- data_type: iterative + partition: test_type + partition_name: soak + release: rls2410 + path: s3://fdio-docs-s3-cloudfront-index/csit/parquet/iterative_rls2410 + schema: iterative_rls2410_soak + columns: + - job + - build + - dut_type + - dut_version + - hosts + - tg_type + - result_critical_rate_lower_bandwidth_unit + - result_critical_rate_lower_bandwidth_value + - result_critical_rate_lower_rate_unit + - result_critical_rate_lower_rate_value + - start_time + - passed + - telemetry + - test_id + - version +- data_type: coverage + partition: test_type + partition_name: ndrpdr + release: rls2410 + path: s3://fdio-docs-s3-cloudfront-index/csit/parquet/coverage_rls2410 + schema: coverage_rls2410_ndrpdr + columns: + - job + - build + - dut_type + - dut_version + - tg_type + - start_time + - passed + - test_id + - version + - result_pdr_lower_rate_unit + - result_pdr_lower_rate_value + - result_ndr_lower_rate_value + - result_pdr_lower_bandwidth_value + - result_ndr_lower_bandwidth_value + - result_latency_reverse_pdr_90_hdrh + - result_latency_reverse_pdr_50_hdrh + - result_latency_reverse_pdr_10_hdrh + - result_latency_forward_pdr_90_hdrh + - result_latency_forward_pdr_50_hdrh + - result_latency_forward_pdr_10_hdrh +- data_type: coverage + partition: test_type + partition_name: mrr + release: rls2410 + path: s3://fdio-docs-s3-cloudfront-index/csit/parquet/coverage_rls2410 + schema: iterative_rls2410_mrr + columns: + - job + - build + - dut_type + - dut_version + - tg_type + - start_time + - passed + - test_id + - version + - result_receive_rate_rate_avg + - result_receive_rate_rate_stdev + - result_receive_rate_rate_unit +- data_type: coverage + partition: test_type + partition_name: device + release: rls2410 + path: s3://fdio-docs-s3-cloudfront-index/csit/parquet/coverage_rls2410 + schema: coverage_rls2410_device + columns: + - job + - build + - dut_type + - dut_version + - tg_type + - passed + - test_id + - version diff --git a/csit.infra.dash/app/cdash/news/layout.py b/csit.infra.dash/app/cdash/news/layout.py index ba4fc85163..8fe3d35e6a 100644 --- a/csit.infra.dash/app/cdash/news/layout.py +++ b/csit.infra.dash/app/cdash/news/layout.py @@ -24,7 +24,7 @@ from dash import callback_context from dash import Input, Output, State from ..utils.constants import Constants as C -from ..utils.utils import gen_new_url, navbar_trending +from ..utils.utils import gen_new_url, navbar_trending, get_topo_arch from ..utils.anomalies import classify_anomalies from ..utils.url_processing import url_decode from .tables import table_summary @@ -78,7 +78,7 @@ class Layout: d_job_info["dut"].append(lst_job[1]) d_job_info["ttype"].append(lst_job[3]) d_job_info["cadence"].append(lst_job[4]) - d_job_info["tbed"].append("-".join(lst_job[-2:])) + d_job_info["tbed"].append(get_topo_arch(lst_job)) self.job_info = pd.DataFrame.from_dict(d_job_info) # Pre-process the data: diff --git a/csit.infra.dash/app/cdash/report/graphs.py b/csit.infra.dash/app/cdash/report/graphs.py index e13ec54a89..5e57713f11 100644 --- a/csit.infra.dash/app/cdash/report/graphs.py +++ b/csit.infra.dash/app/cdash/report/graphs.py @@ -24,7 +24,7 @@ from ..utils.constants import Constants as C from ..utils.utils import get_color, get_hdrh_latencies -def select_iterative_data(data: pd.DataFrame, itm:dict) -> pd.DataFrame: +def select_iterative_data(data: pd.DataFrame, itm: dict) -> pd.DataFrame: """Select the data for graphs and tables from the provided data frame. :param data: Data frame with data for graphs and tables. @@ -36,9 +36,9 @@ def select_iterative_data(data: pd.DataFrame, itm:dict) -> pd.DataFrame: :rtype: pandas.DataFrame """ - phy = itm["phy"].split("-") - if len(phy) == 4: - topo, arch, nic, drv = phy + phy = itm["phy"].rsplit("-", maxsplit=2) + if len(phy) == 3: + topo_arch, nic, drv = phy if drv == "dpdk": drv = "" else: @@ -61,12 +61,12 @@ def select_iterative_data(data: pd.DataFrame, itm:dict) -> pd.DataFrame: (data["passed"] == True) )] - core = str() if itm["dut"] == "trex" else f"{itm['core']}" + core = str() if itm["dut"] == "trex" else itm["core"] ttype = "ndrpdr" if itm["testtype"] in ("ndr", "pdr") else itm["testtype"] regex_test = \ f"^.*[.|-]{nic}.*{itm['framesize']}-{core}-{drv}{itm['test']}-{ttype}$" df = df[ - (df.job.str.endswith(f"{topo}-{arch}")) & + (df.job.str.endswith(topo_arch)) & (df.dut_version.str.contains(itm["dutver"].replace(".r", "-r").\ replace("rls", "release"))) & (df.test_id.str.contains(regex_test, regex=True)) @@ -96,16 +96,9 @@ def graph_iterative(data: pd.DataFrame, sel: list, layout: dict, :rtype: tuple(plotly.graph_objects.Figure, plotly.graph_objects.Figure) """ - def get_y_values(data, y_data_max, param, norm_factor, release=str(), + def get_y_values(data, y_data_max, param, norm_factor, remove_outliers=False): - if param == "result_receive_rate_rate_values": - if release in ("rls2402", "rls2406", "rls2410"): - y_vals_raw = data["result_receive_rate_rate_avg"].to_list() - else: - y_vals_raw = data[param].to_list()[0] - else: - y_vals_raw = data[param].to_list() - y_data = [(y * norm_factor) for y in y_vals_raw] + y_data = [(y * norm_factor) for y in data[param].to_list()] if remove_outliers: try: @@ -146,9 +139,9 @@ def graph_iterative(data: pd.DataFrame, sel: list, layout: dict, if itm_data.empty: continue - phy = itm["phy"].split("-") - topo_arch = f"{phy[0]}-{phy[1]}" if len(phy) == 4 else str() - norm_factor = (C.NORM_FREQUENCY / C.FREQUENCY[topo_arch]) \ + phy = itm["phy"].rsplit("-", maxsplit=2) + topo_arch = phy[0] if len(phy) == 3 else str() + norm_factor = (C.NORM_FREQUENCY / C.FREQUENCY.get(topo_arch, 1.0)) \ if normalize else 1.0 if itm["area"] == "hoststack": @@ -163,7 +156,6 @@ def graph_iterative(data: pd.DataFrame, sel: list, layout: dict, y_tput_max, C.VALUE_ITER[ttype], norm_factor, - itm["rls"], remove_outliers ) @@ -181,28 +173,19 @@ def graph_iterative(data: pd.DataFrame, sel: list, layout: dict, ) } - if itm["testtype"] == "mrr" and itm["rls"] == "rls2310": - trial_run = "trial" - metadata["csit-ref"] = ( - f"{itm_data['job'].to_list()[0]}/", - f"{itm_data['build'].to_list()[0]}" - ) - customdata = [{"metadata": metadata}, ] * nr_of_samples - else: - trial_run = "run" - for _, row in itm_data.iterrows(): - metadata["csit-ref"] = f"{row['job']}/{row['build']}" - try: - metadata["hosts"] = ", ".join(row["hosts"]) - except (KeyError, TypeError): - pass - customdata.append({"metadata": deepcopy(metadata)}) + for _, row in itm_data.iterrows(): + metadata["csit-ref"] = f"{row['job']}/{row['build']}" + try: + metadata["hosts"] = ", ".join(row["hosts"]) + except (KeyError, TypeError): + pass + customdata.append({"metadata": deepcopy(metadata)}) tput_kwargs = dict( y=y_data, name=( f"{idx + 1}. " f"({nr_of_samples:02d} " - f"{trial_run}{'s' if nr_of_samples > 1 else ''}) " + f"run{'s' if nr_of_samples > 1 else ''}) " f"{itm['id']}" ), hoverinfo=u"y+name", diff --git a/csit.infra.dash/app/cdash/report/layout.py b/csit.infra.dash/app/cdash/report/layout.py index 2d325b0447..cd16bfbca0 100644 --- a/csit.infra.dash/app/cdash/report/layout.py +++ b/csit.infra.dash/app/cdash/report/layout.py @@ -32,7 +32,7 @@ from ..utils.constants import Constants as C from ..utils.control_panel import ControlPanel from ..utils.trigger import Trigger from ..utils.utils import show_tooltip, label, sync_checklists, gen_new_url, \ - generate_options, get_list_group_items, navbar_report, \ + generate_options, get_list_group_items, navbar_report, get_topo_arch, \ show_iterative_graph_data from ..utils.url_processing import url_decode from .graphs import graph_iterative, select_iterative_data @@ -122,7 +122,7 @@ class Layout: lst_job = row["job"].split("-") dut = lst_job[1] d_ver = row["dut_version"] - tbed = "-".join(lst_job[-2:]) + tbed = get_topo_arch(lst_job) lst_test_id = row["test_id"].split(".") if dut == "dpdk": area = "dpdk" diff --git a/csit.infra.dash/app/cdash/search/layout.py b/csit.infra.dash/app/cdash/search/layout.py index aa4dd53d5b..8dd244a3c1 100644 --- a/csit.infra.dash/app/cdash/search/layout.py +++ b/csit.infra.dash/app/cdash/search/layout.py @@ -33,7 +33,7 @@ from ..utils.control_panel import ControlPanel from ..utils.trigger import Trigger from ..utils.utils import gen_new_url, generate_options, navbar_trending, \ filter_table_data, sort_table_data, show_trending_graph_data, \ - show_iterative_graph_data, show_tooltip + show_iterative_graph_data, show_tooltip, get_topo_arch from ..utils.url_processing import url_decode from .tables import search_table from ..coverage.tables import coverage_tables @@ -110,7 +110,7 @@ class Layout: l_id = row["test_id"].split(".") suite = l_id[-2].replace("2n1l-", "").replace("1n1l-", "").\ replace("2n-", "") - tb = "-".join(row["job"].split("-")[-2:]) + tb = get_topo_arch(row["job"].split("-")) nic = suite.split("-")[0] for driver in C.DRIVERS: if driver in suite: @@ -644,7 +644,7 @@ class Layout: "release-dis": C.STYLE_DONT_DISPLAY, "release-val": str(), "help-dis": disabled, - "help-val": "<testbed> <nic> <driver> " + \ + "help-val": "<topo> <arch> <nic> <driver> " + \ "<framesize> <cores> <test>", "search-dis": disabled, "search-val": str() @@ -664,7 +664,7 @@ class Layout: ctrl_panel.set({ "release-val": trigger.value, "help-dis": C.STYLE_DISPLAY, - "help-val": "<DUT version> <testbed> <nic> " + \ + "help-val": "<DUT version> <topo> <arch> <nic> " + \ "<driver> <framesize> <core> <test>", "search-dis": C.STYLE_DISPLAY, "search-val": str() @@ -758,7 +758,6 @@ class Layout: (data["dut_version"] == dutver) & (data["release"] == rls) )]) - df = df[df.full_id.str.contains( f".*{tb}.*{nic}.*{test_name}", regex=True diff --git a/csit.infra.dash/app/cdash/search/tables.py b/csit.infra.dash/app/cdash/search/tables.py index a5ffd76d3d..3492fba16f 100644 --- a/csit.infra.dash/app/cdash/search/tables.py +++ b/csit.infra.dash/app/cdash/search/tables.py @@ -18,6 +18,7 @@ import pandas as pd from ..utils.constants import Constants as C +from ..utils.utils import get_topo_arch def select_search_data(data: pd.DataFrame, selection: list) -> pd.DataFrame: @@ -80,7 +81,7 @@ def search_table(data: pd.DataFrame, selection: list) -> pd.DataFrame: l_id = row["test_id"].split(".") suite = l_id[-2].replace("2n1l-", "").replace("1n1l-", "").\ replace("2n-", "") - l_tb.append("-".join(row["job"].split("-")[-2:])) + l_tb.append(get_topo_arch(row["job"].split("-"))) l_nic.append(suite.split("-")[0]) if selection["datatype"] != "trending": l_dutver.append(row["dut_version"]) diff --git a/csit.infra.dash/app/cdash/stats/graphs.py b/csit.infra.dash/app/cdash/stats/graphs.py index 4b25396680..61eef41115 100644 --- a/csit.infra.dash/app/cdash/stats/graphs.py +++ b/csit.infra.dash/app/cdash/stats/graphs.py @@ -17,6 +17,9 @@ import plotly.graph_objects as go import pandas as pd +from datetime import datetime +from pytz import UTC + from ..utils.constants import Constants as C @@ -86,6 +89,7 @@ def graph_statistics(df: pd.DataFrame, job: str, layout: dict) -> tuple: ) ) + x_range = [data["start_time"][0], datetime.now(tz=UTC).strftime("%Y-%m-%d")] tickvals = [0, ] step = max(data["duration"]) / 5 for i in range(5): @@ -97,6 +101,7 @@ def graph_statistics(df: pd.DataFrame, job: str, layout: dict) -> tuple: f"{(val // 3600):02d}:{((val % 3600) // 60):02d}" \ for val in tickvals ] + layout_duration["xaxis"]["range"] = x_range fig_duration.update_layout(layout_duration) # Passed / failed: @@ -124,6 +129,7 @@ def graph_statistics(df: pd.DataFrame, job: str, layout: dict) -> tuple: ) layout_pf = layout.get("plot-stats-passed", dict()) if layout_pf: + layout_pf["xaxis"]["range"] = x_range fig_passed.update_layout(layout_pf) return fig_passed, fig_duration diff --git a/csit.infra.dash/app/cdash/stats/layout.py b/csit.infra.dash/app/cdash/stats/layout.py index 6f7031aedc..4aae11a06b 100644 --- a/csit.infra.dash/app/cdash/stats/layout.py +++ b/csit.infra.dash/app/cdash/stats/layout.py @@ -29,7 +29,8 @@ from yaml import load, FullLoader, YAMLError from ..utils.constants import Constants as C from ..utils.control_panel import ControlPanel from ..utils.utils import show_tooltip, gen_new_url, get_ttypes, get_cadences, \ - get_test_beds, get_job, generate_options, set_job_params, navbar_trending + get_test_beds, get_job, generate_options, set_job_params, navbar_trending, \ + get_url_job, get_url_logs, get_topo_arch from ..utils.url_processing import url_decode from .graphs import graph_statistics, select_data @@ -92,13 +93,12 @@ class Layout: "tbed": list() } for job in jobs: - idx = -3 if "-x-" in job else -2 lst_job = job.split("-") d_job_info["job"].append(job) d_job_info["dut"].append(lst_job[1]) d_job_info["ttype"].append(lst_job[3]) d_job_info["cadence"].append(lst_job[4]) - d_job_info["tbed"].append("-".join(lst_job[idx:])) + d_job_info["tbed"].append(get_topo_arch(lst_job)) self._job_info = pd.DataFrame.from_dict(d_job_info) self._default = set_job_params(self._job_info, d_job_info["job"][0]) @@ -197,7 +197,7 @@ class Layout: "dd-tbeds-value": self._default["tbed"], "al-job-children": html.A( self._default["job"], - href=f"{C.URL_CICD}{self._default['job']}", + href=get_url_job(self._default["job"]), target="_blank" ) } @@ -631,10 +631,7 @@ class Layout: "dd-tbeds-value": job_params["tbed"], "al-job-children": html.A( self._default["job"], - href=( - f"{C.URL_CICD}" - f"{self._default['job']}" - ), + href=get_url_job(self._default["job"]), target="_blank" ) }, @@ -655,7 +652,7 @@ class Layout: { "al-job-children": html.A( job, - href=f"{C.URL_CICD}{job}", + href=get_url_job(job), target="_blank" ) } @@ -785,7 +782,7 @@ class Layout: dbc.Badge(lst_itm[0]), html.A( lst_itm[1], - href=f"{C.URL_LOGS}{lst_itm[1]}", + href=get_url_logs(lst_itm[1]), target="_blank" ) ]) diff --git a/csit.infra.dash/app/cdash/stats/layout.yaml b/csit.infra.dash/app/cdash/stats/layout.yaml index 488654640f..70ba940910 100644 --- a/csit.infra.dash/app/cdash/stats/layout.yaml +++ b/csit.infra.dash/app/cdash/stats/layout.yaml @@ -15,7 +15,7 @@ plot-stats-passed: xaxis: title: 'Date [MMDD]' type: "date" - autorange: True + autorange: False fixedrange: False showgrid: True gridcolor: "rgb(238, 238, 238)" @@ -56,7 +56,7 @@ plot-stats-duration: xaxis: title: 'Date [MMDD]' type: "date" - autorange: True + autorange: False fixedrange: False showgrid: True gridcolor: "rgb(238, 238, 238)" diff --git a/csit.infra.dash/app/cdash/trending/graphs.py b/csit.infra.dash/app/cdash/trending/graphs.py index 10eb392648..512a9d8de9 100644 --- a/csit.infra.dash/app/cdash/trending/graphs.py +++ b/csit.infra.dash/app/cdash/trending/graphs.py @@ -19,6 +19,8 @@ import plotly.graph_objects as go import pandas as pd from numpy import nan +from datetime import datetime +from pytz import UTC from ..utils.constants import Constants as C from ..utils.utils import get_color, get_hdrh_latencies @@ -37,9 +39,9 @@ def select_trending_data(data: pd.DataFrame, itm: dict) -> pd.DataFrame: :rtype: pandas.DataFrame """ - phy = itm["phy"].split("-") - if len(phy) == 4: - topo, arch, nic, drv = phy + phy = itm["phy"].rsplit("-", maxsplit=2) + if len(phy) == 3: + topo_arch, nic, drv = phy if drv == "dpdk": drv = "" else: @@ -60,8 +62,8 @@ def select_trending_data(data: pd.DataFrame, itm: dict) -> pd.DataFrame: (data["test_type"] == test_type) & (data["passed"] == True) )] - df = df[df.job.str.endswith(f"{topo}-{arch}")] - core = str() if itm["dut"] == "trex" else f"{itm['core']}" + df = df[df.job.str.endswith(topo_arch)] + core = str() if itm["dut"] == "trex" else itm["core"] ttype = "ndrpdr" if itm["testtype"] in ("ndr", "pdr") else itm["testtype"] df = df[df.test_id.str.contains( f"^.*[.|-]{nic}.*{itm['framesize']}-{core}-{drv}{itm['test']}-{ttype}$", @@ -237,10 +239,17 @@ def graph_trending( hosts = f"<br>hosts: {', '.join(row['hosts'])}" except (KeyError, TypeError): hosts = str() + + for drv in C.DRIVERS: + if drv in name_lst: + split_idx = name_lst.index(drv) + 1 + break + else: + split_idx = 5 hover_itm = ( f"dut: {name_lst[0]}<br>" - f"infra: {'-'.join(name_lst[1:5])}<br>" - f"test: {'-'.join(name_lst[5:])}<br>" + f"infra: {'-'.join(name_lst[1:split_idx])}<br>" + f"test: {'-'.join(name_lst[split_idx:])}<br>" f"date: {row['start_time'].strftime('%Y-%m-%d %H:%M:%S')}<br>" f"{h_tput}{h_tput_trials}{h_band}{h_band_trials}{h_lat}" f"{row['dut_type']}-ref: {row['dut_version']}<br>" @@ -446,15 +455,17 @@ def graph_trending( fig_tput = None fig_lat = None fig_band = None + start_times = list() y_units = set() for idx, itm in enumerate(sel): df = select_trending_data(data, itm) if df is None or df.empty: continue + start_times.append(df["start_time"][0]) if normalize: - phy = itm["phy"].split("-") - topo_arch = f"{phy[0]}-{phy[1]}" if len(phy) == 4 else str() + phy = itm["phy"].rsplit("-", maxsplit=2) + topo_arch = phy[0] if len(phy) == 3 else str() norm_factor = (C.NORM_FREQUENCY / C.FREQUENCY.get(topo_arch, 1.0)) \ if topo_arch else 1.0 else: @@ -521,15 +532,21 @@ def graph_trending( y_units.update(units) + x_range = [min(start_times), datetime.now(tz=UTC).strftime("%Y-%m-%d")] if fig_tput: - fig_layout = layout.get("plot-trending-tput", dict()) - fig_layout["yaxis"]["title"] = \ + layout_tput = layout.get("plot-trending-tput", dict()) + layout_tput["yaxis"]["title"] = \ f"Throughput [{'|'.join(sorted(y_units))}]" - fig_tput.update_layout(fig_layout) + layout_tput["xaxis"]["range"] = x_range + fig_tput.update_layout(layout_tput) if fig_band: - fig_band.update_layout(layout.get("plot-trending-bandwidth", dict())) + layout_band = layout.get("plot-trending-bandwidth", dict()) + layout_band["xaxis"]["range"] = x_range + fig_band.update_layout(layout_band) if fig_lat: - fig_lat.update_layout(layout.get("plot-trending-lat", dict())) + layout_lat = layout.get("plot-trending-lat", dict()) + layout_lat["xaxis"]["range"] = x_range + fig_lat.update_layout(layout_lat) return fig_tput, fig_band, fig_lat diff --git a/csit.infra.dash/app/cdash/trending/layout.py b/csit.infra.dash/app/cdash/trending/layout.py index c844f73b65..1e2d4cdbd2 100644 --- a/csit.infra.dash/app/cdash/trending/layout.py +++ b/csit.infra.dash/app/cdash/trending/layout.py @@ -34,7 +34,7 @@ from ..utils.control_panel import ControlPanel from ..utils.trigger import Trigger from ..utils.telemetry_data import TelemetryData from ..utils.utils import show_tooltip, label, sync_checklists, gen_new_url, \ - generate_options, get_list_group_items, navbar_trending, \ + generate_options, get_list_group_items, navbar_trending, get_topo_arch, \ show_trending_graph_data from ..utils.url_processing import url_decode from .graphs import graph_trending, select_trending_data, graph_tm_trending @@ -116,7 +116,7 @@ class Layout: for _, row in self._data[cols].drop_duplicates().iterrows(): lst_job = row["job"].split("-") dut = lst_job[1] - tbed = "-".join(lst_job[-2:]) + tbed = get_topo_arch(lst_job) lst_test = row["test_id"].split(".") if dut == "dpdk": area = "dpdk" diff --git a/csit.infra.dash/app/cdash/trending/layout.yaml b/csit.infra.dash/app/cdash/trending/layout.yaml index e4fcd29260..948ca9372b 100644 --- a/csit.infra.dash/app/cdash/trending/layout.yaml +++ b/csit.infra.dash/app/cdash/trending/layout.yaml @@ -16,7 +16,7 @@ plot-trending-tput: xaxis: title: 'Date [MMDD]' type: "date" - autorange: True + autorange: False fixedrange: False showgrid: True gridcolor: "rgb(238, 238, 238)" @@ -56,7 +56,7 @@ plot-trending-bandwidth: xaxis: title: 'Date [MMDD]' type: "date" - autorange: True + autorange: False fixedrange: False showgrid: True gridcolor: "rgb(238, 238, 238)" @@ -96,7 +96,7 @@ plot-trending-lat: xaxis: title: 'Date [MMDD]' type: "date" - autorange: True + autorange: False fixedrange: False showgrid: True gridcolor: "rgb(238, 238, 238)" diff --git a/csit.infra.dash/app/cdash/utils/constants.py b/csit.infra.dash/app/cdash/utils/constants.py index 3b6e125d8e..444ccd3981 100644 --- a/csit.infra.dash/app/cdash/utils/constants.py +++ b/csit.infra.dash/app/cdash/utils/constants.py @@ -331,7 +331,7 @@ class Constants: } VALUE_ITER = { - "mrr": "result_receive_rate_rate_values", + "mrr": "result_receive_rate_rate_avg", "ndr": "result_ndr_lower_rate_value", "pdr": "result_pdr_lower_rate_value", "mrr-bandwidth": "result_receive_rate_bandwidth_avg", diff --git a/csit.infra.dash/app/cdash/utils/telemetry_data.py b/csit.infra.dash/app/cdash/utils/telemetry_data.py index c63ee0057a..d3a114c596 100644 --- a/csit.infra.dash/app/cdash/utils/telemetry_data.py +++ b/csit.infra.dash/app/cdash/utils/telemetry_data.py @@ -283,8 +283,11 @@ class TelemetryData: for _, row in self._unique_metrics_labels.iterrows(): if _is_selected(row["labels"], selection): lst_items.append(row.to_frame().T) - self._selected_metrics_labels = \ - pd.concat(lst_items, ignore_index=True, axis=0, copy=False) + if len(lst_items) == 1: + self._selected_metrics_labels = lst_items[0] + elif len(lst_items) > 1: + self._selected_metrics_labels = \ + pd.concat(lst_items, ignore_index=True, axis=0, copy=False) return self._selected_metrics_labels def select_tm_trending_data( diff --git a/csit.infra.dash/app/cdash/utils/utils.py b/csit.infra.dash/app/cdash/utils/utils.py index 27ecd1f763..8171c905c3 100644 --- a/csit.infra.dash/app/cdash/utils/utils.py +++ b/csit.infra.dash/app/cdash/utils/utils.py @@ -721,7 +721,7 @@ def show_trending_graph_data( dbc.Badge(lst_itm[0]), html.A( lst_itm[1], - href=f"{C.URL_LOGS}{lst_itm[1]}", + href=get_url_logs(lst_itm[1]), target="_blank" ) ]) @@ -853,7 +853,7 @@ def show_iterative_graph_data( continue list_group_item = dbc.ListGroupItem([ dbc.Badge(k), - html.A(v, href=f"{C.URL_LOGS}{v}", target="_blank") + html.A(v, href=get_url_logs(v), target="_blank") ]) else: list_group_item = dbc.ListGroupItem([dbc.Badge(k), v]) @@ -904,3 +904,67 @@ def show_iterative_graph_data( ] return metadata, graph, True + + +def get_url_job(job: str) -> str: + """Generates a URL to CI/CD job. + + :param job: The name of job. + :type job: str + :raises KeyError: If the job name is not a valid job name. + :returns: The URL to CI/CD job. + """ + + if C.CICD_TYPE == "jenkins": + return f"{C.URL_CICD}{job}" + elif C.CICD_TYPE == "github": + l_j = job.split("-") + try: + return f"{C.URL_CICD}{l_j[0]}-{l_j[1]}-{l_j[2]}-{l_j[4]}.yml" + except KeyError: + return str() + else: + return str() + + +def get_url_logs(job_build: str) -> str: + """Generates a URL to CI/CD job and its build. + + :param job_build: The name of job and number of build. Its structure is: + "<job name>/<build number>". + :type job: str + :raises KeyError: If the job name is not a valid job name. + :returns: The URL to CI/CD build. + """ + + if C.CICD_TYPE == "jenkins": + return f"{C.URL_LOGS}{job_build}" + elif C.CICD_TYPE == "github": + try: + return f"{C.URL_LOGS}{job_build.split('/')[1]}" + except KeyError: + return str() + else: + return str() + + +def get_topo_arch(lst_job: list) -> str: + """Get the topology and architecture string from the job name. + + :param lst_job: The job name split into substrings. + :type lst_job: list + :returns: String with information about topology and architecture. + :rtype: str + """ + + if len(lst_job) < 2: + return str() + + if "x" in lst_job[1:-1]: + # External testbeds. + # The structure of the name: + # <to be removed>-x-<topo>-<arch>-<other parts separated by dashes> + return "-".join(lst_job[(lst_job.index("x") + 1):]) + else: + # Topology and architecture are the last two substrings. + return "-".join(lst_job[-2:]) diff --git a/csit.infra.dash/app/requirements.txt b/csit.infra.dash/app/requirements.txt index edea01075d..7dfd7c8ccf 100644 --- a/csit.infra.dash/app/requirements.txt +++ b/csit.infra.dash/app/requirements.txt @@ -1,58 +1,60 @@ # AWS integration -awswrangler==3.2.1 -pip==23.2.1 +awswrangler==3.9.0 +pip==24.1.2 # Dash integration -dash==2.11.1 -dash-bootstrap-components==1.4.2 +dash==2.17.1 +dash-bootstrap-components==1.6.0 dash-core-components==2.0.0 dash-html-components==2.0.0 dash-renderer==1.9.1 dash-table==5.0.0 -numpy==1.25.2 -pandas==2.0.3 -plotly==5.15.0 -numexpr==2.8.4 -Bottleneck==1.3.7 +numpy==1.26.4 # awswrangler 3.9.0 depends on numpy<2.0 and >=1.18 +pandas==2.2.2 +plotly==5.23.0 +numexpr==2.10.1 +Bottleneck==1.4.0 # Web Application Integration -Flask==2.2.5 -Flask-Assets==2.0 -Flask-Compress==1.13 -Jinja2==3.1.2 -libsass==0.22.0 -uWSGI==2.0.22 -uwsgitop==0.11 +Flask==3.0.3 +Flask-Assets==2.1.0 +Flask-Compress==1.15 +Jinja2==3.1.4 +libsass==0.23.0 +uWSGI==2.0.26 +uwsgitop==0.12 webassets==2.0 # Web Application Dependencies -hdrhistogram==0.10.2 -python-dateutil==2.8.2 +hdrhistogram==0.10.3 +python-dateutil==2.9.0 PyYAML==6.0.1 # PIP freeze -ansi2html==1.8.0 -boto3==1.28.17 -botocore==1.31.17 -Brotli==1.0.9 -certifi==2023.7.22 -charset-normalizer==3.2.0 -click==8.1.6 -idna==3.4 -itsdangerous==2.1.2 +blinker==1.8.2 +boto3==1.34.149 +Brotli==1.1.0 +certifi==2024.7.4 +charset-normalizer==3.3.2 +click==8.1.7 +idna==3.7 +importlib_metadata==8.2.0 +itsdangerous==2.2.0 jmespath==1.0.1 -MarkupSafe==2.1.3 -nest-asyncio==1.5.7 -packaging==23.1 -pbr==5.11.1 -pyarrow==12.0.1 -pytz==2023.3 -requests==2.31.0 +MarkupSafe==2.1.5 +nest-asyncio==1.6.0 +packaging==24.1 +pbr==6.0.0 +pyarrow==17.0.0 +pytz==2024.1 +requests==2.32.3 retrying==1.3.4 -s3transfer==0.6.1 +s3transfer==0.10.2 six==1.16.0 -tenacity==8.2.2 -typing_extensions==4.7.1 -tzdata==2023.3 -urllib3==1.26.16 -Werkzeug==2.2.3
\ No newline at end of file +tenacity==8.5.0 +typing_extensions==4.12.2 +tzdata==2024.1 +urllib3==2.2.2 +Werkzeug==3.0.3 +zipp==3.19.2 +zstandard==0.23.0 |