diff options
author | Tibor Frank <tifrank@cisco.com> | 2022-07-20 15:51:21 +0200 |
---|---|---|
committer | Tibor Frank <tifrank@cisco.com> | 2022-07-21 07:45:39 +0000 |
commit | ae1fe880286d7b0414664bce2b2c7c91c3f543f3 (patch) | |
tree | 5790af6de3884e0aa6918d44f23aca59cf0d86a7 /resources/tools/dash/app/pal/report | |
parent | 739e01de7a65045dc42e6c16406a6d054da72f7b (diff) |
UTI: Move constatns to a separate file
Change-Id: If3796b71d02bcf5a92612585dfa8867e5039f037
Signed-off-by: Tibor Frank <tifrank@cisco.com>
Diffstat (limited to 'resources/tools/dash/app/pal/report')
-rw-r--r-- | resources/tools/dash/app/pal/report/graphs.py | 144 | ||||
-rw-r--r-- | resources/tools/dash/app/pal/report/layout.py | 172 | ||||
-rw-r--r-- | resources/tools/dash/app/pal/report/report.py | 14 |
3 files changed, 70 insertions, 260 deletions
diff --git a/resources/tools/dash/app/pal/report/graphs.py b/resources/tools/dash/app/pal/report/graphs.py index 76aa8b7793..c5d8f8f2d7 100644 --- a/resources/tools/dash/app/pal/report/graphs.py +++ b/resources/tools/dash/app/pal/report/graphs.py @@ -20,75 +20,13 @@ import pandas as pd from copy import deepcopy -import hdrh.histogram -import hdrh.codec - - -_NORM_FREQUENCY = 2.0 # [GHz] -_FREQURENCY = { # [GHz] - "2n-aws": 1.000, - "2n-dnv": 2.000, - "2n-clx": 2.300, - "2n-icx": 2.600, - "2n-skx": 2.500, - "2n-tx2": 2.500, - "2n-zn2": 2.900, - "3n-alt": 3.000, - "3n-aws": 1.000, - "3n-dnv": 2.000, - "3n-icx": 2.600, - "3n-skx": 2.500, - "3n-tsh": 2.200 -} - -_VALUE = { - "mrr": "result_receive_rate_rate_values", - "ndr": "result_ndr_lower_rate_value", - "pdr": "result_pdr_lower_rate_value", - "pdr-lat": "result_latency_forward_pdr_50_avg" -} -_UNIT = { - "mrr": "result_receive_rate_rate_unit", - "ndr": "result_ndr_lower_rate_unit", - "pdr": "result_pdr_lower_rate_unit", - "pdr-lat": "result_latency_forward_pdr_50_unit" -} -_LAT_HDRH = ( # Do not change the order - "result_latency_forward_pdr_0_hdrh", - "result_latency_reverse_pdr_0_hdrh", - "result_latency_forward_pdr_10_hdrh", - "result_latency_reverse_pdr_10_hdrh", - "result_latency_forward_pdr_50_hdrh", - "result_latency_reverse_pdr_50_hdrh", - "result_latency_forward_pdr_90_hdrh", - "result_latency_reverse_pdr_90_hdrh", -) -# This value depends on latency stream rate (9001 pps) and duration (5s). -# Keep it slightly higher to ensure rounding errors to not remove tick mark. -PERCENTILE_MAX = 99.999501 - -_GRAPH_LAT_HDRH_DESC = { - "result_latency_forward_pdr_0_hdrh": "No-load.", - "result_latency_reverse_pdr_0_hdrh": "No-load.", - "result_latency_forward_pdr_10_hdrh": "Low-load, 10% PDR.", - "result_latency_reverse_pdr_10_hdrh": "Low-load, 10% PDR.", - "result_latency_forward_pdr_50_hdrh": "Mid-load, 50% PDR.", - "result_latency_reverse_pdr_50_hdrh": "Mid-load, 50% PDR.", - "result_latency_forward_pdr_90_hdrh": "High-load, 90% PDR.", - "result_latency_reverse_pdr_90_hdrh": "High-load, 90% PDR." -} +from ..utils.constants import Constants as C def _get_color(idx: int) -> str: """ """ - _COLORS = ( - "#1A1110", "#DA2647", "#214FC6", "#01786F", "#BD8260", "#FFD12A", - "#A6E7FF", "#738276", "#C95A49", "#FC5A8D", "#CEC8EF", "#391285", - "#6F2DA8", "#FF878D", "#45A27D", "#FFD0B9", "#FD5240", "#DB91EF", - "#44D7A8", "#4F86F7", "#84DE02", "#FFCFF1", "#614051" - ) - return _COLORS[idx % len(_COLORS)] + return C.PLOT_COLORS[idx % len(C.PLOT_COLORS)] def get_short_version(version: str, dut_type: str="vpp") -> str: @@ -182,16 +120,16 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict, continue phy = itm["phy"].split("-") topo_arch = f"{phy[0]}-{phy[1]}" if len(phy) == 4 else str() - norm_factor = (_NORM_FREQUENCY / _FREQURENCY[topo_arch]) \ + norm_factor = (C.NORM_FREQUENCY / C.FREQUENCY[topo_arch]) \ if normalize else 1.0 if itm["testtype"] == "mrr": - y_data_raw = itm_data[_VALUE[itm["testtype"]]].to_list()[0] + y_data_raw = itm_data[C.VALUE_ITER[itm["testtype"]]].to_list()[0] y_data = [(y * norm_factor) for y in y_data_raw] if len(y_data) > 0: y_tput_max = \ max(y_data) if max(y_data) > y_tput_max else y_tput_max else: - y_data_raw = itm_data[_VALUE[itm["testtype"]]].to_list() + y_data_raw = itm_data[C.VALUE_ITER[itm["testtype"]]].to_list() y_data = [(y * norm_factor) for y in y_data_raw] if y_data: y_tput_max = \ @@ -214,7 +152,7 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict, show_tput = True if itm["testtype"] == "pdr": - y_lat_row = itm_data[_VALUE["pdr-lat"]].to_list() + y_lat_row = itm_data[C.VALUE_ITER["pdr-lat"]].to_list() y_lat = [(y / norm_factor) for y in y_lat_row] if y_lat: y_lat_max = max(y_lat) if max(y_lat) > y_lat_max else y_lat_max @@ -302,73 +240,3 @@ def table_comparison(data: pd.DataFrame, sel:dict, ) return pd.DataFrame() #table - - -def graph_hdrh_latency(data: dict, layout: dict) -> go.Figure: - """ - """ - - fig = None - - traces = list() - for idx, (lat_name, lat_hdrh) in enumerate(data.items()): - try: - decoded = hdrh.histogram.HdrHistogram.decode(lat_hdrh) - except (hdrh.codec.HdrLengthException, TypeError) as err: - continue - previous_x = 0.0 - prev_perc = 0.0 - xaxis = list() - yaxis = list() - hovertext = list() - for item in decoded.get_recorded_iterator(): - # The real value is "percentile". - # For 100%, we cut that down to "x_perc" to avoid - # infinity. - percentile = item.percentile_level_iterated_to - x_perc = min(percentile, PERCENTILE_MAX) - xaxis.append(previous_x) - yaxis.append(item.value_iterated_to) - hovertext.append( - f"<b>{_GRAPH_LAT_HDRH_DESC[lat_name]}</b><br>" - f"Direction: {('W-E', 'E-W')[idx % 2]}<br>" - f"Percentile: {prev_perc:.5f}-{percentile:.5f}%<br>" - f"Latency: {item.value_iterated_to}uSec" - ) - next_x = 100.0 / (100.0 - x_perc) - xaxis.append(next_x) - yaxis.append(item.value_iterated_to) - hovertext.append( - f"<b>{_GRAPH_LAT_HDRH_DESC[lat_name]}</b><br>" - f"Direction: {('W-E', 'E-W')[idx % 2]}<br>" - f"Percentile: {prev_perc:.5f}-{percentile:.5f}%<br>" - f"Latency: {item.value_iterated_to}uSec" - ) - previous_x = next_x - prev_perc = percentile - - traces.append( - go.Scatter( - x=xaxis, - y=yaxis, - name=_GRAPH_LAT_HDRH_DESC[lat_name], - mode="lines", - legendgroup=_GRAPH_LAT_HDRH_DESC[lat_name], - showlegend=bool(idx % 2), - line=dict( - color=_get_color(int(idx/2)), - dash="solid", - width=1 if idx % 2 else 2 - ), - hovertext=hovertext, - hoverinfo="text" - ) - ) - if traces: - fig = go.Figure() - fig.add_traces(traces) - layout_hdrh = layout.get("plot-hdrh-latency", None) - if lat_hdrh: - fig.update_layout(layout_hdrh) - - return fig diff --git a/resources/tools/dash/app/pal/report/layout.py b/resources/tools/dash/app/pal/report/layout.py index e7c8db43ae..164f2d48d9 100644 --- a/resources/tools/dash/app/pal/report/layout.py +++ b/resources/tools/dash/app/pal/report/layout.py @@ -27,8 +27,9 @@ from yaml import load, FullLoader, YAMLError from copy import deepcopy from ast import literal_eval +from ..utils.constants import Constants as C +from ..utils.url_processing import url_decode, url_encode from ..data.data import Data -from ..data.url_processing import url_decode, url_encode from .graphs import graph_iterative, table_comparison, get_short_version @@ -36,51 +37,6 @@ class Layout: """ """ - # If True, clear all inputs in control panel when button "ADD SELECTED" is - # pressed. - CLEAR_ALL_INPUTS = False - - STYLE_DISABLED = {"display": "none"} - STYLE_ENABLED = {"display": "inherit"} - - CL_ALL_DISABLED = [{ - "label": "All", - "value": "all", - "disabled": True - }] - CL_ALL_ENABLED = [{ - "label": "All", - "value": "all", - "disabled": False - }] - - PLACEHOLDER = html.Nobr("") - - DRIVERS = ("avf", "af-xdp", "rdma", "dpdk") - - LABELS = { - "dpdk": "DPDK", - "container_memif": "LXC/DRC Container Memif", - "crypto": "IPSec IPv4 Routing", - "ip4": "IPv4 Routing", - "ip6": "IPv6 Routing", - "ip4_tunnels": "IPv4 Tunnels", - "l2": "L2 Ethernet Switching", - "srv6": "SRv6 Routing", - "vm_vhost": "VMs vhost-user", - "nfv_density-dcr_memif-chain_ipsec": "CNF Service Chains Routing IPSec", - "nfv_density-vm_vhost-chain_dot1qip4vxlan":"VNF Service Chains Tunnels", - "nfv_density-vm_vhost-chain": "VNF Service Chains Routing", - "nfv_density-dcr_memif-pipeline": "CNF Service Pipelines Routing", - "nfv_density-dcr_memif-chain": "CNF Service Chains Routing", - } - - URL_STYLE = { - "background-color": "#d2ebf5", - "border-color": "#bce1f1", - "color": "#135d7c" - } - def __init__(self, app: Flask, releases: list, html_layout_file: str, graph_layout_file: str, data_spec_file: str, tooltip_file: str) -> None: """ @@ -125,7 +81,7 @@ class Layout: replace("2n-", "") test = lst_test_id[-1] nic = suite.split("-")[0] - for drv in self.DRIVERS: + for drv in C.DRIVERS: if drv in test: driver = drv.replace("-", "_") test = test.replace(f"{drv}-", "") @@ -234,7 +190,7 @@ class Layout: return self._graph_layout def label(self, key: str) -> str: - return self.LABELS.get(key, key) + return C.LABELS.get(key, key) def _show_tooltip(self, id: str, title: str, clipboard_id: str=None) -> list: @@ -359,9 +315,7 @@ class Layout: dbc.Row( # Throughput id="row-graph-tput", class_name="g-0 p-2", - children=[ - self.PLACEHOLDER - ] + children=[C.PLACEHOLDER, ] ), width=6 ), @@ -369,9 +323,7 @@ class Layout: dbc.Row( # Latency id="row-graph-lat", class_name="g-0 p-2", - children=[ - self.PLACEHOLDER - ] + children=[C.PLACEHOLDER, ] ), width=6 ) @@ -380,16 +332,12 @@ class Layout: dbc.Row( # Tables id="row-table", class_name="g-0 p-2", - children=[ - self.PLACEHOLDER - ] + children=[C.PLACEHOLDER, ] ), dbc.Row( # Download id="row-btn-download", class_name="g-0 p-2", - children=[ - self.PLACEHOLDER - ] + children=[C.PLACEHOLDER, ] ) ] ) @@ -548,7 +496,7 @@ class Layout: children=[ dbc.Checklist( id="cl-ctrl-framesize-all", - options=self.CL_ALL_DISABLED, + options=C.CL_ALL_DISABLED, inline=True, switch=False ), @@ -579,7 +527,7 @@ class Layout: children=[ dbc.Checklist( id="cl-ctrl-core-all", - options=self.CL_ALL_DISABLED, + options=C.CL_ALL_DISABLED, inline=False, switch=False ) @@ -610,7 +558,7 @@ class Layout: children=[ dbc.Checklist( id="cl-ctrl-testtype-all", - options=self.CL_ALL_DISABLED, + options=C.CL_ALL_DISABLED, inline=True, switch=False ), @@ -675,7 +623,7 @@ class Layout: dbc.Row( id="row-card-sel-tests", class_name="gy-1", - style=self.STYLE_DISABLED, + style=C.STYLE_DISABLED, children=[ dbc.Label( "Selected tests", @@ -692,7 +640,7 @@ class Layout: ), dbc.Row( id="row-btns-sel-tests", - style=self.STYLE_DISABLED, + style=C.STYLE_DISABLED, children=[ dbc.ButtonGroup( class_name="gy-2", @@ -722,12 +670,6 @@ class Layout: class ControlPanel: def __init__(self, panel: dict) -> None: - CL_ALL_DISABLED = [{ - "label": "All", - "value": "all", - "disabled": True - }] - # Defines also the order of keys self._defaults = { "dd-rls-value": str(), @@ -749,15 +691,15 @@ class Layout: "cl-core-options": list(), "cl-core-value": list(), "cl-core-all-value": list(), - "cl-core-all-options": CL_ALL_DISABLED, + "cl-core-all-options": C.CL_ALL_DISABLED, "cl-framesize-options": list(), "cl-framesize-value": list(), "cl-framesize-all-value": list(), - "cl-framesize-all-options": CL_ALL_DISABLED, + "cl-framesize-all-options": C.CL_ALL_DISABLED, "cl-testtype-options": list(), "cl-testtype-value": list(), "cl-testtype-all-value": list(), - "cl-testtype-all-options": CL_ALL_DISABLED, + "cl-testtype-all-options": C.CL_ALL_DISABLED, "btn-add-disabled": True, "cl-normalize-value": list(), "cl-selected-options": list() @@ -818,10 +760,10 @@ class Layout: (fig_tput, fig_lat) = figs - row_fig_tput = self.PLACEHOLDER - row_fig_lat = self.PLACEHOLDER - row_table = self.PLACEHOLDER - row_btn_dwnld = self.PLACEHOLDER + row_fig_tput = C.PLACEHOLDER + row_fig_lat = C.PLACEHOLDER + row_table = C.PLACEHOLDER + row_btn_dwnld = C.PLACEHOLDER if fig_tput: row_fig_tput = [ @@ -853,7 +795,7 @@ class Layout: class_name="me-1", children=[ dbc.InputGroupText( - style=self.URL_STYLE, + style=C.URL_STYLE, children=self._show_tooltip( "help-url", "URL", "input-url") ), @@ -861,7 +803,7 @@ class Layout: id="input-url", readonly=True, type="url", - style=self.URL_STYLE, + style=C.URL_STYLE, value=url ) ] @@ -1019,15 +961,15 @@ class Layout: "cl-core-options": list(), "cl-core-value": list(), "cl-core-all-value": list(), - "cl-core-all-options": self.CL_ALL_DISABLED, + "cl-core-all-options": C.CL_ALL_DISABLED, "cl-framesize-options": list(), "cl-framesize-value": list(), "cl-framesize-all-value": list(), - "cl-framesize-all-options": self.CL_ALL_DISABLED, + "cl-framesize-all-options": C.CL_ALL_DISABLED, "cl-testtype-options": list(), "cl-testtype-value": list(), "cl-testtype-all-value": list(), - "cl-testtype-all-options": self.CL_ALL_DISABLED + "cl-testtype-all-options": C.CL_ALL_DISABLED }) elif trigger_id == "dd-ctrl-dut": try: @@ -1058,15 +1000,15 @@ class Layout: "cl-core-options": list(), "cl-core-value": list(), "cl-core-all-value": list(), - "cl-core-all-options": self.CL_ALL_DISABLED, + "cl-core-all-options": C.CL_ALL_DISABLED, "cl-framesize-options": list(), "cl-framesize-value": list(), "cl-framesize-all-value": list(), - "cl-framesize-all-options": self.CL_ALL_DISABLED, + "cl-framesize-all-options": C.CL_ALL_DISABLED, "cl-testtype-options": list(), "cl-testtype-value": list(), "cl-testtype-all-value": list(), - "cl-testtype-all-options": self.CL_ALL_DISABLED + "cl-testtype-all-options": C.CL_ALL_DISABLED }) elif trigger_id == "dd-ctrl-dutver": try: @@ -1095,15 +1037,15 @@ class Layout: "cl-core-options": list(), "cl-core-value": list(), "cl-core-all-value": list(), - "cl-core-all-options": self.CL_ALL_DISABLED, + "cl-core-all-options": C.CL_ALL_DISABLED, "cl-framesize-options": list(), "cl-framesize-value": list(), "cl-framesize-all-value": list(), - "cl-framesize-all-options": self.CL_ALL_DISABLED, + "cl-framesize-all-options": C.CL_ALL_DISABLED, "cl-testtype-options": list(), "cl-testtype-value": list(), "cl-testtype-all-value": list(), - "cl-testtype-all-options": self.CL_ALL_DISABLED + "cl-testtype-all-options": C.CL_ALL_DISABLED }) elif trigger_id == "dd-ctrl-phy": try: @@ -1131,15 +1073,15 @@ class Layout: "cl-core-options": list(), "cl-core-value": list(), "cl-core-all-value": list(), - "cl-core-all-options": self.CL_ALL_DISABLED, + "cl-core-all-options": C.CL_ALL_DISABLED, "cl-framesize-options": list(), "cl-framesize-value": list(), "cl-framesize-all-value": list(), - "cl-framesize-all-options": self.CL_ALL_DISABLED, + "cl-framesize-all-options": C.CL_ALL_DISABLED, "cl-testtype-options": list(), "cl-testtype-value": list(), "cl-testtype-all-value": list(), - "cl-testtype-all-options": self.CL_ALL_DISABLED + "cl-testtype-all-options": C.CL_ALL_DISABLED }) elif trigger_id == "dd-ctrl-area": try: @@ -1164,15 +1106,15 @@ class Layout: "cl-core-options": list(), "cl-core-value": list(), "cl-core-all-value": list(), - "cl-core-all-options": self.CL_ALL_DISABLED, + "cl-core-all-options": C.CL_ALL_DISABLED, "cl-framesize-options": list(), "cl-framesize-value": list(), "cl-framesize-all-value": list(), - "cl-framesize-all-options": self.CL_ALL_DISABLED, + "cl-framesize-all-options": C.CL_ALL_DISABLED, "cl-testtype-options": list(), "cl-testtype-value": list(), "cl-testtype-all-value": list(), - "cl-testtype-all-options": self.CL_ALL_DISABLED + "cl-testtype-all-options": C.CL_ALL_DISABLED }) elif trigger_id == "dd-ctrl-test": rls = ctrl_panel.get("dd-rls-value") @@ -1188,17 +1130,17 @@ class Layout: for v in sorted(test["core"])], "cl-core-value": list(), "cl-core-all-value": list(), - "cl-core-all-options": self.CL_ALL_ENABLED, + "cl-core-all-options": C.CL_ALL_ENABLED, "cl-framesize-options": [{"label": v, "value": v} for v in sorted(test["frame-size"])], "cl-framesize-value": list(), "cl-framesize-all-value": list(), - "cl-framesize-all-options": self.CL_ALL_ENABLED, + "cl-framesize-all-options": C.CL_ALL_ENABLED, "cl-testtype-options": [{"label": v, "value": v} for v in sorted(test["test-type"])], "cl-testtype-value": list(), "cl-testtype-all-value": list(), - "cl-testtype-all-options": self.CL_ALL_ENABLED, + "cl-testtype-all-options": C.CL_ALL_ENABLED, }) elif trigger_id == "cl-ctrl-core": val_sel, val_all = self._sync_checklists( @@ -1305,21 +1247,21 @@ class Layout: "testtype": ttype.lower() }) store_sel = sorted(store_sel, key=lambda d: d["id"]) - row_card_sel_tests = self.STYLE_ENABLED - row_btns_sel_tests = self.STYLE_ENABLED - if self.CLEAR_ALL_INPUTS: + row_card_sel_tests = C.STYLE_ENABLED + row_btns_sel_tests = C.STYLE_ENABLED + if C.CLEAR_ALL_INPUTS: ctrl_panel.set(ctrl_panel.defaults) ctrl_panel.set({ "cl-selected-options": self._list_tests(store_sel) }) elif trigger_id == "btn-sel-remove-all": _ = btn_remove_all - row_fig_tput = self.PLACEHOLDER - row_fig_lat = self.PLACEHOLDER - row_table = self.PLACEHOLDER - row_btn_dwnld = self.PLACEHOLDER - row_card_sel_tests = self.STYLE_DISABLED - row_btns_sel_tests = self.STYLE_DISABLED + row_fig_tput = C.PLACEHOLDER + row_fig_lat = C.PLACEHOLDER + row_table = C.PLACEHOLDER + row_btn_dwnld = C.PLACEHOLDER + row_card_sel_tests = C.STYLE_DISABLED + row_btns_sel_tests = C.STYLE_DISABLED store_sel = list() ctrl_panel.set({"cl-selected-options": list()}) elif trigger_id == "btn-sel-remove": @@ -1337,8 +1279,8 @@ class Layout: store_sel = literal_eval( url_params.get("store_sel", list())[0]) if store_sel: - row_card_sel_tests = self.STYLE_ENABLED - row_btns_sel_tests = self.STYLE_ENABLED + row_card_sel_tests = C.STYLE_ENABLED + row_btns_sel_tests = C.STYLE_ENABLED if trigger_id in ("btn-ctrl-add", "url", "btn-sel-remove", "cl-ctrl-normalize"): @@ -1358,12 +1300,12 @@ class Layout: "cl-selected-options": self._list_tests(store_sel) }) else: - row_fig_tput = self.PLACEHOLDER - row_fig_lat = self.PLACEHOLDER - row_table = self.PLACEHOLDER - row_btn_dwnld = self.PLACEHOLDER - row_card_sel_tests = self.STYLE_DISABLED - row_btns_sel_tests = self.STYLE_DISABLED + row_fig_tput = C.PLACEHOLDER + row_fig_lat = C.PLACEHOLDER + row_table = C.PLACEHOLDER + row_btn_dwnld = C.PLACEHOLDER + row_card_sel_tests = C.STYLE_DISABLED + row_btns_sel_tests = C.STYLE_DISABLED store_sel = list() ctrl_panel.set({"cl-selected-options": list()}) diff --git a/resources/tools/dash/app/pal/report/report.py b/resources/tools/dash/app/pal/report/report.py index c02b409973..c6008ca595 100644 --- a/resources/tools/dash/app/pal/report/report.py +++ b/resources/tools/dash/app/pal/report/report.py @@ -14,8 +14,8 @@ """Instantiate the Report Dash applocation. """ import dash -import dash_bootstrap_components as dbc +from ..utils.constants import Constants as C from .layout import Layout @@ -30,17 +30,17 @@ def init_report(server, releases): dash_app = dash.Dash( server=server, - routes_pathname_prefix=u"/report/", - external_stylesheets=[dbc.themes.LUX], + routes_pathname_prefix=C.REPORT_ROUTES_PATHNAME_PREFIX, + external_stylesheets=C.EXTERNAL_STYLESHEETS ) layout = Layout( app=dash_app, releases=releases, - html_layout_file="pal/templates/report_layout.jinja2", - graph_layout_file="pal/report/layout.yaml", - data_spec_file="pal/data/data.yaml", - tooltip_file="pal/data/tooltips.yaml" + html_layout_file=C.REPORT_HTML_LAYOUT_FILE, + graph_layout_file=C.REPORT_GRAPH_LAYOUT_FILE, + data_spec_file=C.DATA_SPEC_FILE, + tooltip_file=C.TOOLTIP_FILE, ) dash_app.index_string = layout.html_layout dash_app.layout = layout.add_content() |