"""Plotly Dash HTML layout override.
"""
+
import logging
import pandas as pd
import dash_bootstrap_components as dbc
tbs[rls][dut] = dict()
if tbs[rls][dut].get(d_ver, None) is None:
tbs[rls][dut][d_ver] = dict()
- if tbs[rls][dut][d_ver].get(infra, None) is None:
- tbs[rls][dut][d_ver][infra] = dict()
- if tbs[rls][dut][d_ver][infra].get(area, None) is None:
- tbs[rls][dut][d_ver][infra][area] = dict()
- if tbs[rls][dut][d_ver][infra][area].get(test, None) is None:
- tbs[rls][dut][d_ver][infra][area][test] = dict()
- tbs[rls][dut][d_ver][infra][area][test]["core"] = list()
- tbs[rls][dut][d_ver][infra][area][test]["frame-size"] = list()
- tbs[rls][dut][d_ver][infra][area][test]["test-type"] = list()
- if core.upper() not in \
- tbs[rls][dut][d_ver][infra][area][test]["core"]:
- tbs[rls][dut][d_ver][infra][area][test]["core"].append(
- core.upper()
- )
- if framesize.upper() not in \
- tbs[rls][dut][d_ver][infra][area][test]["frame-size"]:
- tbs[rls][dut][d_ver][infra][area][test]["frame-size"].append(
- framesize.upper()
- )
+ if tbs[rls][dut][d_ver].get(area, None) is None:
+ tbs[rls][dut][d_ver][area] = dict()
+ if tbs[rls][dut][d_ver][area].get(test, None) is None:
+ tbs[rls][dut][d_ver][area][test] = dict()
+ if tbs[rls][dut][d_ver][area][test].get(infra, None) is None:
+ tbs[rls][dut][d_ver][area][test][infra] = {
+ "core": list(),
+ "frame-size": list(),
+ "test-type": list()
+ }
+ tst_params = tbs[rls][dut][d_ver][area][test][infra]
+ if core.upper() not in tst_params["core"]:
+ tst_params["core"].append(core.upper())
+ if framesize.upper() not in tst_params["frame-size"]:
+ tst_params["frame-size"].append(framesize.upper())
if row["test_type"] == "mrr":
- if "MRR" not in \
- tbs[rls][dut][d_ver][infra][area][test]["test-type"]:
- tbs[rls][dut][d_ver][infra][area][test]["test-type"].append(
- "MRR"
- )
+ if "MRR" not in tst_params["test-type"]:
+ tst_params["test-type"].append("MRR")
elif row["test_type"] == "ndrpdr":
- if "NDR" not in \
- tbs[rls][dut][d_ver][infra][area][test]["test-type"]:
- tbs[rls][dut][d_ver][infra][area][test]["test-type"].extend(
- ("NDR", "PDR", )
- )
+ if "NDR" not in tst_params["test-type"]:
+ tst_params["test-type"].extend(("NDR", "PDR", ))
elif row["test_type"] == "hoststack" and \
row["tg_type"] in ("iperf", "vpp"):
- if "BPS" not in \
- tbs[rls][dut][d_ver][infra][area][test]["test-type"]:
- tbs[rls][dut][d_ver][infra][area][test]["test-type"].append(
- "BPS"
- )
+ if "BPS" not in tst_params["test-type"]:
+ tst_params["test-type"].append("BPS")
elif row["test_type"] == "hoststack" and row["tg_type"] == "ab":
- if "CPS" not in \
- tbs[rls][dut][d_ver][infra][area][test]["test-type"]:
- tbs[rls][dut][d_ver][infra][area][test]["test-type"].extend(
- ("CPS", "RPS")
- )
+ if "CPS" not in tst_params["test-type"]:
+ tst_params["test-type"].extend(("CPS", "RPS"))
self._spec_tbs = tbs
# Read from files:
]
),
delay_show=C.SPINNER_DELAY
+ ),
+ dbc.Offcanvas(
+ class_name="w-75",
+ id="offcanvas-documentation",
+ title="Documentation",
+ placement="end",
+ is_open=False,
+ children=html.Iframe(
+ src=C.URL_DOC_REL_NOTES,
+ width="100%",
+ height="100%"
+ )
)
]
)
return dbc.NavbarSimple(
id="navbarsimple-main",
children=[
- dbc.NavItem(
- dbc.NavLink(
- C.REPORT_TITLE,
- disabled=True,
- external_link=True,
- href="#"
- )
- )
+ dbc.NavItem(dbc.NavLink(
+ C.REPORT_TITLE,
+ active=True,
+ external_link=True,
+ href="/report"
+ )),
+ dbc.NavItem(dbc.NavLink(
+ "Comparisons",
+ external_link=True,
+ href="/comparisons"
+ )),
+ dbc.NavItem(dbc.NavLink(
+ "Coverage Data",
+ external_link=True,
+ href="/coverage"
+ )),
+ dbc.NavItem(dbc.NavLink(
+ "Documentation",
+ id="btn-documentation",
+ ))
],
brand=C.BRAND,
brand_href="/",
dbc.InputGroupText(
children=show_tooltip(
self._tooltips,
- "help-infra",
- "Infra"
+ "help-area",
+ "Area"
)
),
dbc.Select(
- id={"type": "ctrl-dd", "index": "phy"},
- placeholder=\
- "Select a Physical Test Bed Topology..."
+ id={"type": "ctrl-dd", "index": "area"},
+ placeholder="Select an Area..."
)
],
size="sm"
dbc.InputGroupText(
children=show_tooltip(
self._tooltips,
- "help-area",
- "Area"
+ "help-test",
+ "Test"
)
),
dbc.Select(
- id={"type": "ctrl-dd", "index": "area"},
- placeholder="Select an Area..."
+ id={"type": "ctrl-dd", "index": "test"},
+ placeholder="Select a Test..."
)
],
size="sm"
dbc.InputGroupText(
children=show_tooltip(
self._tooltips,
- "help-test",
- "Test"
+ "help-infra",
+ "Infra"
)
),
dbc.Select(
- id={"type": "ctrl-dd", "index": "test"},
- placeholder="Select a Test..."
+ id={"type": "ctrl-dd", "index": "phy"},
+ placeholder=\
+ "Select a Physical Test Bed Topology..."
)
],
size="sm"
if not tests:
return C.PLACEHOLDER
- figs = graph_iterative(self._data, tests, self._graph_layout, normalize)
+ graphs = \
+ graph_iterative(self._data, tests, self._graph_layout, normalize)
- if not figs[0]:
+ if not graphs[0]:
return C.PLACEHOLDER
-
- row_items = [
- dbc.Col(
+
+ tab_items = [
+ dbc.Tab(
children=dcc.Graph(
id={"type": "graph", "index": "tput"},
- figure=figs[0]
+ figure=graphs[0]
),
- class_name="g-0 p-1",
- width=6
+ label="Throughput",
+ tab_id="tab-tput"
)
]
- if figs[1]:
- row_items.append(
- dbc.Col(
+ if graphs[1]:
+ tab_items.append(
+ dbc.Tab(
+ children=dcc.Graph(
+ id={"type": "graph", "index": "bandwidth"},
+ figure=graphs[1]
+ ),
+ label="Bandwidth",
+ tab_id="tab-bandwidth"
+ )
+ )
+
+ if graphs[2]:
+ tab_items.append(
+ dbc.Tab(
children=dcc.Graph(
id={"type": "graph", "index": "lat"},
- figure=figs[1]
+ figure=graphs[2]
),
- class_name="g-0 p-1",
- width=6
+ label="Latency",
+ tab_id="tab-lat"
)
)
return [
dbc.Row(
- children=row_items,
- class_name="g-0 p-0",
+ dbc.Tabs(
+ children=tab_items,
+ id="tabs",
+ active_tab="tab-tput",
+ ),
+ class_name="g-0 p-0"
),
dbc.Row(
[
row_btns_sel_tests = C.STYLE_ENABLED
last_test = store_sel[-1]
test = self._spec_tbs[last_test["rls"]][last_test["dut"]]\
- [last_test["dutver"]][last_test["phy"]]\
- [last_test["area"]][last_test["test"]]
+ [last_test["dutver"]][last_test["area"]]\
+ [last_test["test"]][last_test["phy"]]
ctrl_panel.set({
"dd-rls-val": last_test["rls"],
"dd-dut-val": last_test["dut"],
[last_test["dut"]].keys()
),
"dd-dutver-dis": False,
- "dd-phy-val": last_test["phy"],
- "dd-phy-opt": generate_options(
- self._spec_tbs[last_test["rls"]][last_test["dut"]]\
- [last_test["dutver"]].keys()
- ),
- "dd-phy-dis": False,
"dd-area-val": last_test["area"],
"dd-area-opt": [
{"label": label(v), "value": v} for v in \
sorted(self._spec_tbs[last_test["rls"]]\
- [last_test["dut"]][last_test["dutver"]]\
- [last_test["phy"]].keys())
+ [last_test["dut"]]\
+ [last_test["dutver"]].keys())
],
"dd-area-dis": False,
"dd-test-val": last_test["test"],
"dd-test-opt": generate_options(
self._spec_tbs[last_test["rls"]][last_test["dut"]]\
- [last_test["dutver"]][last_test["phy"]]\
- [last_test["area"]].keys()
+ [last_test["dutver"]][last_test["area"]].keys()
),
"dd-test-dis": False,
+ "dd-phy-val": last_test["phy"],
+ "dd-phy-opt": generate_options(
+ self._spec_tbs[last_test["rls"]][last_test["dut"]]\
+ [last_test["dutver"]][last_test["area"]]\
+ [last_test["test"]].keys()
+ ),
+ "dd-phy-dis": False,
"cl-core-opt": generate_options(test["core"]),
"cl-core-val": [last_test["core"].upper(), ],
"cl-core-all-val": list(),
rls = ctrl_panel.get("dd-rls-val")
dut = ctrl_panel.get("dd-dut-val")
dutver = self._spec_tbs[rls][dut][trigger.value]
- options = generate_options(dutver.keys())
+ options = [{"label": label(v), "value": v} \
+ for v in sorted(dutver.keys())]
disabled = False
except KeyError:
options = list()
disabled = True
ctrl_panel.set({
"dd-dutver-val": trigger.value,
- "dd-phy-val": str(),
- "dd-phy-opt": options,
- "dd-phy-dis": disabled,
"dd-area-val": str(),
- "dd-area-opt": list(),
- "dd-area-dis": True,
+ "dd-area-opt": options,
+ "dd-area-dis": disabled,
"dd-test-val": str(),
"dd-test-opt": list(),
"dd-test-dis": True,
+ "dd-phy-val": str(),
+ "dd-phy-opt": list(),
+ "dd-phy-dis": True,
"cl-core-opt": list(),
"cl-core-val": list(),
"cl-core-all-val": list(),
"cl-tsttype-all-opt": C.CL_ALL_DISABLED,
"btn-add-dis": True
})
- elif trigger.idx == "phy":
+ elif trigger.idx == "area":
try:
rls = ctrl_panel.get("dd-rls-val")
dut = ctrl_panel.get("dd-dut-val")
dutver = ctrl_panel.get("dd-dutver-val")
- phy = self._spec_tbs[rls][dut][dutver][trigger.value]
- options = [{"label": label(v), "value": v} \
- for v in sorted(phy.keys())]
+ area = self._spec_tbs[rls][dut][dutver][trigger.value]
+ options = generate_options(area.keys())
disabled = False
except KeyError:
options = list()
disabled = True
ctrl_panel.set({
- "dd-phy-val": trigger.value,
- "dd-area-val": str(),
- "dd-area-opt": options,
- "dd-area-dis": disabled,
+ "dd-area-val": trigger.value,
"dd-test-val": str(),
- "dd-test-opt": list(),
- "dd-test-dis": True,
+ "dd-test-opt": options,
+ "dd-test-dis": disabled,
+ "dd-phy-val": str(),
+ "dd-phy-opt": list(),
+ "dd-phy-dis": True,
"cl-core-opt": list(),
"cl-core-val": list(),
"cl-core-all-val": list(),
"cl-tsttype-all-opt": C.CL_ALL_DISABLED,
"btn-add-dis": True
})
- elif trigger.idx == "area":
+ elif trigger.idx == "test":
try:
rls = ctrl_panel.get("dd-rls-val")
dut = ctrl_panel.get("dd-dut-val")
dutver = ctrl_panel.get("dd-dutver-val")
- phy = ctrl_panel.get("dd-phy-val")
- area = \
- self._spec_tbs[rls][dut][dutver][phy][trigger.value]
- options = generate_options(area.keys())
+ area = ctrl_panel.get("dd-area-val")
+ test = self._spec_tbs[rls][dut][dutver][area]\
+ [trigger.value]
+ options = generate_options(test.keys())
disabled = False
except KeyError:
options = list()
disabled = True
ctrl_panel.set({
- "dd-area-val": trigger.value,
- "dd-test-val": str(),
- "dd-test-opt": options,
- "dd-test-dis": disabled,
+ "dd-test-val": trigger.value,
+ "dd-phy-val": str(),
+ "dd-phy-opt": options,
+ "dd-phy-dis": disabled,
"cl-core-opt": list(),
"cl-core-val": list(),
"cl-core-all-val": list(),
"cl-tsttype-all-opt": C.CL_ALL_DISABLED,
"btn-add-dis": True
})
- elif trigger.idx == "test":
+ elif trigger.idx == "phy":
rls = ctrl_panel.get("dd-rls-val")
dut = ctrl_panel.get("dd-dut-val")
dutver = ctrl_panel.get("dd-dutver-val")
- phy = ctrl_panel.get("dd-phy-val")
area = ctrl_panel.get("dd-area-val")
- if all((rls, dut, dutver, phy, area, trigger.value, )):
- test = self._spec_tbs[rls][dut][dutver][phy][area]\
+ test = ctrl_panel.get("dd-test-val")
+ if all((rls, dut, dutver, area, test, trigger.value, )):
+ phy = self._spec_tbs[rls][dut][dutver][area][test]\
[trigger.value]
ctrl_panel.set({
- "dd-test-val": trigger.value,
- "cl-core-opt": generate_options(test["core"]),
+ "dd-phy-val": trigger.value,
+ "cl-core-opt": generate_options(phy["core"]),
"cl-core-val": list(),
"cl-core-all-val": list(),
"cl-core-all-opt": C.CL_ALL_ENABLED,
"cl-frmsize-opt": \
- generate_options(test["frame-size"]),
+ generate_options(phy["frame-size"]),
"cl-frmsize-val": list(),
"cl-frmsize-all-val": list(),
"cl-frmsize-all-opt": C.CL_ALL_ENABLED,
"cl-tsttype-opt": \
- generate_options(test["test-type"]),
+ generate_options(phy["test-type"]),
"cl-tsttype-val": list(),
"cl-tsttype-all-val": list(),
"cl-tsttype-all-opt": C.CL_ALL_ENABLED,
trigger = Trigger(callback_context.triggered)
+ if trigger.idx == "tput":
+ idx = 0
+ elif trigger.idx == "bandwidth":
+ idx = 1
+ elif trigger.idx == "lat":
+ idx = len(graph_data) - 1
+ else:
+ return list(), list(), False
+
try:
- idx = 0 if trigger.idx == "tput" else 1
graph_data = graph_data[idx]["points"]
except (IndexError, KeyError, ValueError, TypeError):
raise PreventUpdate
"q1", "lower fence", "min", "outlier")
elif len(data) == 1:
if param == "lat":
- stats = ("Average Latency at 50% PDR", )
+ stats = ("average latency at 50% PDR", )
+ elif param == "bandwidth":
+ stats = ("bandwidth", )
else:
- stats = ("Throughput", )
+ stats = ("throughput", )
else:
return list()
unit = " [us]" if param == "lat" else str()
return [(f"{stat}{unit}", f"{value['y']:,.0f}")
for stat, value in zip(stats, data)]
+ customdata = graph_data[0].get("customdata", dict())
+ datapoint = customdata.get("metadata", dict())
+ hdrh_data = customdata.get("hdrh", dict())
+
+ list_group_items = list()
+ for k, v in datapoint.items():
+ if k == "csit-ref":
+ if len(graph_data) > 1:
+ continue
+ list_group_item = dbc.ListGroupItem([
+ dbc.Badge(k),
+ html.A(v, href=f"{C.URL_JENKINS}{v}", target="_blank")
+ ])
+ else:
+ list_group_item = dbc.ListGroupItem([dbc.Badge(k), v])
+ list_group_items.append(list_group_item)
+
graph = list()
if trigger.idx == "tput":
title = "Throughput"
+ elif trigger.idx == "bandwidth":
+ title = "Bandwidth"
elif trigger.idx == "lat":
title = "Latency"
if len(graph_data) == 1:
- hdrh_data = graph_data[0].get("customdata", None)
if hdrh_data:
graph = [dbc.Card(
class_name="gy-2 p-0",
children=[
dbc.CardHeader(hdrh_data.pop("name")),
- dbc.CardBody(children=[
- dcc.Graph(
- id="hdrh-latency-graph",
- figure=graph_hdrh_latency(
- hdrh_data, self._graph_layout
- )
+ dbc.CardBody(dcc.Graph(
+ id="hdrh-latency-graph",
+ figure=graph_hdrh_latency(
+ hdrh_data, self._graph_layout
)
- ])
+ ))
])
]
else:
raise PreventUpdate
+
+ for k, v in _process_stats(graph_data, trigger.idx):
+ list_group_items.append(dbc.ListGroupItem([dbc.Badge(k), v]))
+
metadata = [
dbc.Card(
class_name="gy-2 p-0",
title
]),
dbc.CardBody(
+ dbc.ListGroup(list_group_items, flush=True),
id="tput-lat-metadata",
- class_name="p-0",
- children=[dbc.ListGroup(
- [
- dbc.ListGroupItem([dbc.Badge(k), v])
- for k, v in _process_stats(
- graph_data, trigger.idx)
- ],
- flush=True)
- ]
+ class_name="p-0"
)
]
)
]
return metadata, graph, True
+
+ @app.callback(
+ Output("offcanvas-documentation", "is_open"),
+ Input("btn-documentation", "n_clicks"),
+ State("offcanvas-documentation", "is_open")
+ )
+ def toggle_offcanvas_documentation(n_clicks, is_open):
+ if n_clicks:
+ return not is_open
+ return is_open