X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=csit.infra.dash%2Fapp%2Fcdash%2Ftrending%2Flayout.py;h=66aa1d199a8165cecb4aab27114862827c9f5e01;hb=0575edd2af7b4f70d319230858001c998baba24b;hp=38381459b860ad5c2691fe1ce17c6c546a8bacd4;hpb=018660080bb9419dc658d6996be855e7219cf602;p=csit.git diff --git a/csit.infra.dash/app/cdash/trending/layout.py b/csit.infra.dash/app/cdash/trending/layout.py index 38381459b8..66aa1d199a 100644 --- a/csit.infra.dash/app/cdash/trending/layout.py +++ b/csit.infra.dash/app/cdash/trending/layout.py @@ -142,39 +142,34 @@ class Layout: if tbs.get(dut, None) is None: tbs[dut] = dict() - if tbs[dut].get(infra, None) is None: - tbs[dut][infra] = dict() - if tbs[dut][infra].get(area, None) is None: - tbs[dut][infra][area] = dict() - if tbs[dut][infra][area].get(test, None) is None: - tbs[dut][infra][area][test] = dict() - tbs[dut][infra][area][test]["core"] = list() - tbs[dut][infra][area][test]["frame-size"] = list() - tbs[dut][infra][area][test]["test-type"] = list() - if core.upper() not in tbs[dut][infra][area][test]["core"]: - tbs[dut][infra][area][test]["core"].append(core.upper()) - if framesize.upper() not in \ - tbs[dut][infra][area][test]["frame-size"]: - tbs[dut][infra][area][test]["frame-size"].append( - framesize.upper() - ) + if tbs[dut].get(area, None) is None: + tbs[dut][area] = dict() + if tbs[dut][area].get(test, None) is None: + tbs[dut][area][test] = dict() + if tbs[dut][area][test].get(infra, None) is None: + tbs[dut][area][test][infra] = { + "core": list(), + "frame-size": list(), + "test-type": list() + } + tst_params = tbs[dut][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[dut][infra][area][test]["test-type"]: - tbs[dut][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[dut][infra][area][test]["test-type"]: - tbs[dut][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": if row["tg_type"] in ("iperf", "vpp"): - if "BPS" not in tbs[dut][infra][area][test]["test-type"]: - tbs[dut][infra][area][test]["test-type"].append("BPS") + if "BPS" not in tst_params["test-type"]: + tst_params["test-type"].append("BPS") elif row["tg_type"] == "ab": - if "CPS" not in tbs[dut][infra][area][test]["test-type"]: - tbs[dut][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: @@ -265,7 +260,7 @@ class Layout: dbc.Offcanvas( class_name="w-50", id="offcanvas-metadata", - title="Throughput And Latency", + title="Detailed Information", placement="end", is_open=False, children=[ @@ -274,20 +269,25 @@ class Layout: ] ), 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_TRENDING, + width="100%", + height="100%" + ) ) ] ) else: return html.Div( - id="div-main-error", - children=[ - dbc.Alert( - [ - "An Error Occured" - ], - color="danger" - ) - ] + dbc.Alert("An Error Occured", color="danger"), + id="div-main-error" ) def _add_navbar(self): @@ -297,17 +297,29 @@ class Layout: :rtype: dbc.NavbarSimple """ return dbc.NavbarSimple( - id="navbarsimple-main", children=[ - dbc.NavItem( - dbc.NavLink( - C.TREND_TITLE, - disabled=True, - external_link=True, - href="#" - ) - ) + dbc.NavItem(dbc.NavLink( + C.TREND_TITLE, + active=True, + external_link=True, + href="/trending" + )), + dbc.NavItem(dbc.NavLink( + C.NEWS_TITLE, + external_link=True, + href="/news" + )), + dbc.NavItem(dbc.NavLink( + C.STATS_TITLE, + external_link=True, + href="/stats" + )), + dbc.NavItem(dbc.NavLink( + "Documentation", + id="btn-documentation", + )) ], + id="navbarsimple-main", brand=C.BRAND, brand_href="/", brand_external_link=True, @@ -321,12 +333,7 @@ class Layout: :returns: Column with the control panel. :rtype: dbc.Col """ - return dbc.Col([ - html.Div( - children=self._add_ctrl_panel(), - className="sticky-top" - ) - ]) + return dbc.Col(html.Div(self._add_ctrl_panel(), className="sticky-top")) def _add_ctrl_panel(self) -> list: """Add control panel. @@ -336,316 +343,226 @@ class Layout: """ return [ dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.InputGroup( - [ - dbc.InputGroupText( - children=show_tooltip( - self._tooltips, - "help-dut", - "DUT" - ) - ), - dbc.Select( - id={"type": "ctrl-dd", "index": "dut"}, - placeholder="Select a Device under Test...", - options=sorted( - [ - {"label": k, "value": k} \ - for k in self._spec_tbs.keys() - ], - key=lambda d: d["label"] - ) + dbc.InputGroup( + [ + dbc.InputGroupText( + show_tooltip(self._tooltips, "help-dut", "DUT") + ), + dbc.Select( + id={"type": "ctrl-dd", "index": "dut"}, + placeholder="Select a Device under Test...", + options=sorted( + [ + {"label": k, "value": k} \ + for k in self._spec_tbs.keys() + ], + key=lambda d: d["label"] ) - ], - size="sm" - ) - ] + ) + ], + size="sm" + ), + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.InputGroup( - [ - dbc.InputGroupText( - children=show_tooltip( - self._tooltips, - "help-infra", - "Infra" - ) - ), - dbc.Select( - id={"type": "ctrl-dd", "index": "phy"}, - placeholder=\ - "Select a Physical Test Bed Topology..." - ) - ], - size="sm" - ) - ] + dbc.InputGroup( + [ + dbc.InputGroupText( + show_tooltip(self._tooltips, "help-area", "Area") + ), + dbc.Select( + id={"type": "ctrl-dd", "index": "area"}, + placeholder="Select an Area..." + ) + ], + size="sm" + ), + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.InputGroup( - [ - dbc.InputGroupText( - children=show_tooltip( - self._tooltips, - "help-area", - "Area" - ) - ), - dbc.Select( - id={"type": "ctrl-dd", "index": "area"}, - placeholder="Select an Area..." - ) - ], - size="sm" - ) - ] + dbc.InputGroup( + [ + dbc.InputGroupText( + show_tooltip(self._tooltips, "help-test", "Test") + ), + dbc.Select( + id={"type": "ctrl-dd", "index": "test"}, + placeholder="Select a Test..." + ) + ], + size="sm" + ), + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.InputGroup( - [ - dbc.InputGroupText( - children=show_tooltip( - self._tooltips, - "help-test", - "Test" - ) - ), - dbc.Select( - id={"type": "ctrl-dd", "index": "test"}, - placeholder="Select a Test..." - ) - ], - size="sm" - ) - ] + dbc.InputGroup( + [ + dbc.InputGroupText( + show_tooltip(self._tooltips, "help-infra", "Infra") + ), + dbc.Select( + id={"type": "ctrl-dd", "index": "phy"}, + placeholder="Select a Physical Test Bed Topology..." + ) + ], + size="sm" + ), + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.InputGroup( - [ - dbc.InputGroupText( - children=show_tooltip( - self._tooltips, - "help-framesize", - "Frame Size" - ) - ), - dbc.Col( - children=[ - dbc.Checklist( - id={ - "type": "ctrl-cl", - "index": "frmsize-all" - }, - options=C.CL_ALL_DISABLED, - inline=True, - class_name="ms-2" - ) - ], - width=2 + dbc.InputGroup( + [ + dbc.InputGroupText(show_tooltip( + self._tooltips, + "help-framesize", + "Frame Size" + )), + dbc.Col( + dbc.Checklist( + id={"type": "ctrl-cl", "index": "frmsize-all"}, + options=C.CL_ALL_DISABLED, + inline=True, + class_name="ms-2" ), - dbc.Col( - children=[ - dbc.Checklist( - id={ - "type": "ctrl-cl", - "index": "frmsize" - }, - inline=True - ) - ] + width=2 + ), + dbc.Col( + dbc.Checklist( + id={"type": "ctrl-cl", "index": "frmsize"}, + inline=True ) - ], - style={"align-items": "center"}, - size="sm" - ) - ] + ) + ], + style={"align-items": "center"}, + size="sm" + ), + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.InputGroup( - [ - dbc.InputGroupText( - children=show_tooltip( - self._tooltips, - "help-cores", - "Number of Cores" - ) - ), - dbc.Col( - children=[ - dbc.Checklist( - id={ - "type": "ctrl-cl", - "index": "core-all" - }, - options=C.CL_ALL_DISABLED, - inline=True, - class_name="ms-2" - ) - ], - width=2 + dbc.InputGroup( + [ + dbc.InputGroupText(show_tooltip( + self._tooltips, + "help-cores", + "Number of Cores" + )), + dbc.Col( + dbc.Checklist( + id={"type": "ctrl-cl", "index": "core-all"}, + options=C.CL_ALL_DISABLED, + inline=True, + class_name="ms-2" ), - dbc.Col( - children=[ - dbc.Checklist( - id={ - "type": "ctrl-cl", - "index": "core" - }, - inline=True - ) - ] + width=2 + ), + dbc.Col( + dbc.Checklist( + id={"type": "ctrl-cl", "index": "core"}, + inline=True ) - ], - style={"align-items": "center"}, - size="sm" - ) - ] + ) + ], + style={"align-items": "center"}, + size="sm" + ), + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.InputGroup( - [ - dbc.InputGroupText( - children=show_tooltip( - self._tooltips, - "help-ttype", - "Test Type" - ) - ), - dbc.Col( - children=[ - dbc.Checklist( - id={ - "type": "ctrl-cl", - "index": "tsttype-all" - }, - options=C.CL_ALL_DISABLED, - inline=True, - class_name="ms-2" - ) - ], - width=2 + dbc.InputGroup( + [ + dbc.InputGroupText(show_tooltip( + self._tooltips, + "help-ttype", + "Test Type" + )), + dbc.Col( + dbc.Checklist( + id={"type": "ctrl-cl", "index": "tsttype-all"}, + options=C.CL_ALL_DISABLED, + inline=True, + class_name="ms-2" ), - dbc.Col( - children=[ - dbc.Checklist( - id={ - "type": "ctrl-cl", - "index": "tsttype" - }, - inline=True - ) - ] + width=2 + ), + dbc.Col( + dbc.Checklist( + id={"type": "ctrl-cl", "index": "tsttype"}, + inline=True ) - ], - style={"align-items": "center"}, - size="sm" - ) - ] + ) + ], + style={"align-items": "center"}, + size="sm" + ), + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.InputGroup( - [ - dbc.InputGroupText( - children=show_tooltip( - self._tooltips, - "help-normalize", - "Normalization" - ) - ), - dbc.Col( - children=[ - dbc.Checklist( - id="normalize", - options=[{ - "value": "normalize", - "label": ( - "Normalize to CPU frequency " - "2GHz" - ) - }], - value=[], - inline=True, - class_name="ms-2" - ) - ] - ) - ], - style={"align-items": "center"}, - size="sm" - ) - ] + dbc.InputGroup( + [ + dbc.InputGroupText(show_tooltip( + self._tooltips, + "help-normalize", + "Normalization" + )), + dbc.Col(dbc.Checklist( + id="normalize", + options=[{ + "value": "normalize", + "label": "Normalize to CPU frequency 2GHz" + }], + value=[], + inline=True, + class_name="ms-2" + )) + ], + style={"align-items": "center"}, + size="sm" + ), + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.Button( - id={"type": "ctrl-btn", "index": "add-test"}, - children="Add Selected", - color="info" - ) - ] + dbc.Button( + id={"type": "ctrl-btn", "index": "add-test"}, + children="Add Selected", + color="info" + ), + class_name="g-0 p-1" ), dbc.Row( + dbc.ListGroup( + class_name="overflow-auto p-0", + id="lg-selected", + children=[], + style={"max-height": "20em"}, + flush=True + ), id="row-card-sel-tests", class_name="g-0 p-1", style=C.STYLE_DISABLED, - children=[ - dbc.ListGroup( - class_name="overflow-auto p-0", - id="lg-selected", - children=[], - style={"max-height": "20em"}, - flush=True - ) - ] ), dbc.Row( + dbc.ButtonGroup([ + dbc.Button( + "Remove Selected", + id={"type": "ctrl-btn", "index": "rm-test"}, + class_name="w-100", + color="info", + disabled=False + ), + dbc.Button( + "Remove All", + id={"type": "ctrl-btn", "index": "rm-test-all"}, + class_name="w-100", + color="info", + disabled=False + ) + ]), id="row-btns-sel-tests", class_name="g-0 p-1", style=C.STYLE_DISABLED, - children=[ - dbc.ButtonGroup( - children=[ - dbc.Button( - id={"type": "ctrl-btn", "index": "rm-test"}, - children="Remove Selected", - class_name="w-100", - color="info", - disabled=False - ), - dbc.Button( - id={"type": "ctrl-btn", "index": "rm-test-all"}, - children="Remove All", - class_name="w-100", - color="info", - disabled=False - ) - ] - ) - ] ), dbc.Stack( - id="row-btns-add-tm", - class_name="g-0 p-1", - style=C.STYLE_DISABLED, - gap=2, - children=[ + [ dbc.Button( "Add Telemetry Panel", id={"type": "telemetry-btn", "index": "open"}, @@ -662,7 +579,11 @@ class Layout: is_open=False, scrollable=True ) - ] + ], + id="row-btns-add-tm", + class_name="g-0 p-1", + style=C.STYLE_DISABLED, + gap=2 ) ] @@ -675,13 +596,10 @@ class Layout: return dbc.Col( id="col-plotting-area", children=[ - dbc.Spinner( - dbc.Row( - id="plotting-area-trending", - class_name="g-0 p-0", - children=C.PLACEHOLDER - ), - delay_show=C.SPINNER_DELAY + dbc.Row( + id="plotting-area-trending", + class_name="g-0 p-0", + children=C.PLACEHOLDER ), dbc.Row( id="plotting-area-telemetry", @@ -723,9 +641,21 @@ class Layout: tab_items.append( dbc.Tab( children=dcc.Graph( - id={"type": "graph", "index": "lat"}, + 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=graphs[2] + ), label="Latency", tab_id="tab-lat" ) @@ -980,30 +910,38 @@ class Layout: """ return [ dbc.Row( + "Add content here.", id={"type": "tm-container", "index": 0}, - class_name="g-0 p-1", - children=["Add content here."] + class_name="g-0 p-1" ), dbc.Row( - class_name="g-0 p-2", - children=[ - dbc.Checkbox( - id={"type": "cb-all-in-one", "index": 0}, - label="All Metrics in one Graph" + [ + dbc.Col( + dbc.Checkbox( + id={"type": "cb-all-in-one", "index": 0}, + label="All Metrics in one Graph" + ), + width=6 ), - ] + dbc.Col( + dbc.Checkbox( + id={"type": "cb-ignore-host", "index": 0}, + label="Ignore Host" + ), + width=6 + ) + ], + class_name="g-0 p-2" ), dbc.Row( - class_name="g-0 p-1", - children=[ - dbc.Textarea( - id={"type": "tm-list-metrics", "index": 0}, - rows=20, - size="sm", - wrap="off", - readonly=True - ) - ] + dbc.Textarea( + id={"type": "tm-list-metrics", "index": 0}, + rows=20, + size="sm", + wrap="off", + readonly=True + ), + class_name="g-0 p-1" ) ] @@ -1056,6 +994,7 @@ class Layout: State("store", "data"), State({"type": "sel-cl", "index": ALL}, "value"), State({"type": "cb-all-in-one", "index": ALL}, "value"), + State({"type": "cb-ignore-host", "index": ALL}, "value"), State({"type": "telemetry-search-out", "index": ALL}, "children"), State({"type": "plot-mod-telemetry", "index": ALL}, "is_open"), State({"type": "telemetry-btn", "index": ALL}, "disabled"), @@ -1080,6 +1019,7 @@ class Layout: store: dict, lst_sel: list, all_in_one: list, + ignore_host: list, search_out: list, is_open: list, tm_btns_disabled: list, @@ -1102,6 +1042,7 @@ class Layout: "selected-metrics": dict(), "telemetry-panels": list(), "telemetry-all-in-one": list(), + "telemetry-ignore-host": list(), "telemetry-graphs": list(), "url": str() } @@ -1115,6 +1056,7 @@ class Layout: tm_user = store["selected-metrics"] tm_panels = store["telemetry-panels"] tm_all_in_one = store["telemetry-all-in-one"] + tm_ignore_host = store["telemetry-ignore-host"] plotting_area_telemetry = no_update on_draw = [False, False] # 0 --> trending, 1 --> telemetry @@ -1154,37 +1096,38 @@ class Layout: store_sel = literal_eval(url_params["store_sel"][0]) normalize = literal_eval(url_params["norm"][0]) telemetry = literal_eval(url_params["telemetry"][0]) - tm_all_in_one = literal_eval(url_params["all-in-one"][0]) + url_p = url_params.get("all-in-one", ["[[None]]"]) + tm_all_in_one = literal_eval(url_p[0]) + url_p = url_params.get("ignore-host", ["[[None]]"]) + tm_ignore_host = literal_eval(url_p[0]) if not isinstance(telemetry, list): telemetry = [telemetry, ] - tm_all_in_one = [tm_all_in_one, ] except (KeyError, IndexError, AttributeError, ValueError): pass if store_sel: last_test = store_sel[-1] - test = self._spec_tbs[last_test["dut"]][last_test["phy"]]\ - [last_test["area"]][last_test["test"]] + test = self._spec_tbs[last_test["dut"]]\ + [last_test["area"]][last_test["test"]][last_test["phy"]] ctrl_panel.set({ "dd-dut-val": last_test["dut"], - "dd-phy-val": last_test["phy"], - "dd-phy-opt": generate_options( - self._spec_tbs[last_test["dut"]].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["dut"]]\ - [last_test["phy"]].keys() - ) + self._spec_tbs[last_test["dut"]].keys()) ], "dd-area-dis": False, "dd-test-val": last_test["test"], "dd-test-opt": generate_options( - self._spec_tbs[last_test["dut"]][last_test["phy"]]\ + self._spec_tbs[last_test["dut"]]\ [last_test["area"]].keys() ), "dd-test-dis": False, + "dd-phy-val": last_test["phy"], + "dd-phy-opt": generate_options( + self._spec_tbs[last_test["dut"]][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(), @@ -1217,24 +1160,24 @@ class Layout: elif trigger.type == "ctrl-dd": if trigger.idx == "dut": try: - options = generate_options( - self._spec_tbs[trigger.value].keys() - ) + dut = self._spec_tbs[trigger.value] + options = [{"label": label(v), "value": v} \ + for v in sorted(dut.keys())] disabled = False except KeyError: options = list() disabled = True ctrl_panel.set({ "dd-dut-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(), @@ -1249,24 +1192,23 @@ class Layout: "cl-tsttype-all-opt": C.CL_ALL_DISABLED, "btn-add-dis": True }) - elif trigger.idx == "phy": + if trigger.idx == "area": try: dut = ctrl_panel.get("dd-dut-val") - phy = self._spec_tbs[dut][trigger.value] - options = [{"label": label(v), "value": v} \ - for v in sorted(phy.keys())] + area = self._spec_tbs[dut][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(), @@ -1280,22 +1222,22 @@ class Layout: "cl-tsttype-all-val": list(), "cl-tsttype-all-opt": C.CL_ALL_DISABLED, "btn-add-dis": True - }) - elif trigger.idx == "area": + }) + if trigger.idx == "test": try: dut = ctrl_panel.get("dd-dut-val") - phy = ctrl_panel.get("dd-phy-val") - area = self._spec_tbs[dut][phy][trigger.value] - options = generate_options(area.keys()) + area = ctrl_panel.get("dd-area-val") + test = self._spec_tbs[dut][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(), @@ -1310,25 +1252,25 @@ class Layout: "cl-tsttype-all-opt": C.CL_ALL_DISABLED, "btn-add-dis": True }) - elif trigger.idx == "test": + if trigger.idx == "phy": dut = ctrl_panel.get("dd-dut-val") - phy = ctrl_panel.get("dd-phy-val") area = ctrl_panel.get("dd-area-val") - if all((dut, phy, area, trigger.value, )): - test = self._spec_tbs[dut][phy][area][trigger.value] + test = ctrl_panel.get("dd-test-val") + if all((dut, area, test, trigger.value, )): + phy = self._spec_tbs[dut][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, @@ -1359,9 +1301,9 @@ class Layout: elif trigger.type == "ctrl-btn": tm_panels = list() tm_all_in_one = list() + tm_ignore_host = list() store["trending-graphs"] = None store["telemetry-graphs"] = list() - # on_draw[0] = True on_draw = [True, True] if trigger.idx == "add-test": dut = ctrl_panel.get("dd-dut-val") @@ -1446,6 +1388,7 @@ class Layout: tm.from_json(tm_data) tm_panels.append(tm_user["selected_metrics_with_labels"]) tm_all_in_one.append(all_in_one) + tm_ignore_host.append(ignore_host) is_open = (False, False) tm_btns_disabled[1], tm_btns_disabled[5] = True, True on_draw = [True, True] @@ -1455,6 +1398,7 @@ class Layout: elif trigger.idx == "rm-all": tm_panels = list() tm_all_in_one = list() + tm_ignore_host = list() tm_user = None is_open = (False, False) tm_btns_disabled[1], tm_btns_disabled[5] = True, True @@ -1501,6 +1445,7 @@ class Layout: elif trigger.type == "tm-btn-remove": del tm_panels[trigger.idx] del tm_all_in_one[trigger.idx] + del tm_ignore_host[trigger.idx] del store["telemetry-graphs"][trigger.idx] tm.from_json(tm_data) on_draw = [True, True] @@ -1512,6 +1457,7 @@ class Layout: if tm_panels: new_url_params["telemetry"] = tm_panels new_url_params["all-in-one"] = tm_all_in_one + new_url_params["ignore-host"] = tm_ignore_host if on_draw[0]: # Trending if store_sel: @@ -1536,9 +1482,16 @@ class Layout: if not end_idx: plotting_area_telemetry = C.PLACEHOLDER elif on_draw[1] and (end_idx >= start_idx): + if len(tm_all_in_one) != end_idx: + tm_all_in_one = [[None], ] * end_idx + if len(tm_ignore_host) != end_idx: + tm_ignore_host = [[None], ] * end_idx for idx in range(start_idx, end_idx): store["telemetry-graphs"].append(graph_tm_trending( - tm.select_tm_trending_data(tm_panels[idx]), + tm.select_tm_trending_data( + tm_panels[idx], + ignore_host=bool(tm_ignore_host[idx][0]) + ), self._graph_layout, bool(tm_all_in_one[idx][0]) )) @@ -1561,6 +1514,7 @@ class Layout: store_sel = list() tm_panels = list() tm_all_in_one = list() + tm_ignore_host = list() tm_user = None else: plotting_area_trending = no_update @@ -1577,6 +1531,7 @@ class Layout: store["selected-metrics"] = tm_user store["telemetry-panels"] = tm_panels store["telemetry-all-in-one"] = tm_all_in_one + store["telemetry-ignore-host"] = tm_ignore_host ret_val = [ store, plotting_area_trending, @@ -1739,7 +1694,14 @@ class Layout: trigger = Trigger(callback_context.triggered) try: - idx = 0 if trigger.idx == "tput" else 1 + if trigger.idx == "tput": + idx = 0 + elif trigger.idx == "bandwidth": + idx = 1 + elif trigger.idx == "lat": + idx = 2 + else: + raise PreventUpdate graph_data = graph_data[idx]["points"][0] except (IndexError, KeyError, ValueError, TypeError): raise PreventUpdate @@ -1747,13 +1709,31 @@ class Layout: metadata = no_update graph = list() - children = [ - dbc.ListGroupItem( - [dbc.Badge(x.split(":")[0]), x.split(": ")[1]] - ) for x in graph_data.get("text", "").split("
") - ] + list_group_items = list() + for itm in graph_data.get("text", None).split("
"): + if not itm: + continue + lst_itm = itm.split(": ") + if lst_itm[0] == "csit-ref": + list_group_item = dbc.ListGroupItem([ + dbc.Badge(lst_itm[0]), + html.A( + lst_itm[1], + href=f"{C.URL_JENKINS}{lst_itm[1]}", + target="_blank" + ) + ]) + else: + list_group_item = dbc.ListGroupItem([ + dbc.Badge(lst_itm[0]), + lst_itm[1] + ]) + list_group_items.append(list_group_item) + if trigger.idx == "tput": title = "Throughput" + elif trigger.idx == "bandwidth": + title = "Bandwidth" elif trigger.idx == "lat": title = "Latency" hdrh_data = graph_data.get("customdata", None) @@ -1762,14 +1742,14 @@ class Layout: class_name="gy-2 p-0", children=[ dbc.CardHeader(hdrh_data.pop("name")), - dbc.CardBody(children=[ + dbc.CardBody( dcc.Graph( id="hdrh-latency-graph", figure=graph_hdrh_latency( hdrh_data, self._graph_layout ) ) - ]) + ) ]) ] else: @@ -1788,9 +1768,9 @@ class Layout: title ]), dbc.CardBody( + dbc.ListGroup(list_group_items, flush=True), id="tput-lat-metadata", class_name="p-0", - children=[dbc.ListGroup(children, flush=True), ] ) ] ) @@ -1847,3 +1827,13 @@ class Layout: raise PreventUpdate return dcc.send_data_frame(df.to_csv, file_name) + + @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