C-Dash: Change the order of items in control panel 59/39659/6
authorTibor Frank <tifrank@cisco.com>
Wed, 11 Oct 2023 13:21:25 +0000 (13:21 +0000)
committerTibor Frank <tifrank@cisco.com>
Mon, 16 Oct 2023 08:01:57 +0000 (08:01 +0000)
The new order is:
- DUT
- Area
- Test
- Infra
- The rest is not changed

Change-Id: Ic8484af582b1016666b765e9bad3562352385b91
Signed-off-by: Tibor Frank <tifrank@cisco.com>
csit.infra.dash/app/cdash/coverage/layout.py
csit.infra.dash/app/cdash/report/layout.py
csit.infra.dash/app/cdash/trending/layout.py

index 8c11523..a2d51d4 100644 (file)
@@ -113,10 +113,10 @@ class Layout:
                 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] = list()
-            if area not in tbs[rls][dut][d_ver][infra]:
-                tbs[rls][dut][d_ver][infra].append(area)
+            if tbs[rls][dut][d_ver].get(area, None) is None:
+                tbs[rls][dut][d_ver][area] = list()
+            if infra not in tbs[rls][dut][d_ver][area]:
+                tbs[rls][dut][d_ver][area].append(infra)
 
         self._spec_tbs = tbs
 
@@ -342,11 +342,10 @@ class Layout:
                 children=[
                     dbc.InputGroup(
                         [
-                            dbc.InputGroupText("Infra"),
+                            dbc.InputGroupText("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"
@@ -358,10 +357,11 @@ class Layout:
                 children=[
                     dbc.InputGroup(
                         [
-                            dbc.InputGroupText("Area"),
+                            dbc.InputGroupText("Infra"),
                             dbc.Select(
-                                id={"type": "ctrl-dd", "index": "area"},
-                                placeholder="Select an Area..."
+                                id={"type": "ctrl-dd", "index": "phy"},
+                                placeholder=\
+                                    "Select a Physical Test Bed Topology..."
                             )
                         ],
                         size="sm"
@@ -552,21 +552,20 @@ class Layout:
                                 [selected["dut"]].keys()
                         ),
                         "dutver-dis": False,
+                        "area-val": selected["area"],
+                        "area-opt": [
+                            {"label": label(v), "value": v} \
+                                for v in sorted(self._spec_tbs[selected["rls"]]\
+                                    [selected["dut"]]\
+                                        [selected["dutver"]].keys())
+                        ],
+                        "area-dis": False,
                         "phy-val": selected["phy"],
                         "phy-opt": generate_options(
                             self._spec_tbs[selected["rls"]][selected["dut"]]\
-                                [selected["dutver"]].keys()
+                                [selected["dutver"]][selected["area"]]
                         ),
                         "phy-dis": False,
-                        "area-val": selected["area"],
-                        "area-opt": [
-                            {"label": label(v), "value": v} for v in sorted(
-                                self._spec_tbs[selected["rls"]]\
-                                    [selected["dut"]][selected["dutver"]]\
-                                        [selected["phy"]]
-                            )
-                        ],
-                        "area-dis": False,
                         "show-latency": show_latency
                     })
                     on_draw = True
@@ -623,42 +622,42 @@ class Layout:
                     try:
                         rls = ctrl_panel.get("rls-val")
                         dut = ctrl_panel.get("dut-val")
-                        dutver = self._spec_tbs[rls][dut][trigger.value]
-                        options = generate_options(dutver.keys())
+                        ver = self._spec_tbs[rls][dut][trigger.value]
+                        options = [
+                            {"label": label(v), "value": v} for v in sorted(ver)
+                        ]
                         disabled = False
                     except KeyError:
                         options = list()
                         disabled = True
                     ctrl_panel.set({
                         "dutver-val": trigger.value,
-                        "phy-val": str(),
-                        "phy-opt": options,
-                        "phy-dis": disabled,
                         "area-val": str(),
-                        "area-opt": list(),
-                        "area-dis": True
+                        "area-opt": options,
+                        "area-dis": disabled,
+                        "phy-val": str(),
+                        "phy-opt": list(),
+                        "phy-dis": True
                     })
-                elif trigger.idx == "phy":
+                elif trigger.idx == "area":
                     try:
                         rls = ctrl_panel.get("rls-val")
                         dut = ctrl_panel.get("dut-val")
-                        dutver = ctrl_panel.get("dutver-val")
-                        phy = self._spec_tbs[rls][dut][dutver][trigger.value]
-                        options = [
-                            {"label": label(v), "value": v} for v in sorted(phy)
-                        ]
+                        ver = ctrl_panel.get("dutver-val")
+                        options = generate_options(
+                            self._spec_tbs[rls][dut][ver][trigger.value])
                         disabled = False
                     except KeyError:
                         options = list()
                         disabled = True
                     ctrl_panel.set({
-                        "phy-val": trigger.value,
-                        "area-val": str(),
-                        "area-opt": options,
-                        "area-dis": disabled
+                        "area-val": trigger.value,
+                        "phy-val": str(),
+                        "phy-opt": options,
+                        "phy-dis": disabled
                     })
-                elif trigger.idx == "area":
-                    ctrl_panel.set({"area-val": trigger.value})
+                elif trigger.idx == "phy":
+                    ctrl_panel.set({"phy-val": trigger.value})
                     selected = {
                         "rls": ctrl_panel.get("rls-val"),
                         "dut": ctrl_panel.get("dut-val"),
index fcea2ab..765af4e 100644 (file)
@@ -149,50 +149,34 @@ class Layout:
                 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:
@@ -481,14 +465,13 @@ class Layout:
                             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"
@@ -503,13 +486,13 @@ class Layout:
                             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"
@@ -524,13 +507,14 @@ class Layout:
                             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"
@@ -950,8 +934,8 @@ class Layout:
                     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"],
@@ -965,27 +949,27 @@ class Layout:
                                 [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(),
@@ -1088,22 +1072,23 @@ class Layout:
                         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(),
@@ -1118,26 +1103,25 @@ class Layout:
                         "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(),
@@ -1152,24 +1136,24 @@ class Layout:
                         "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(),
@@ -1184,28 +1168,28 @@ class Layout:
                         "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,
index d08f911..66aa1d1 100644 (file)
@@ -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:
@@ -373,11 +368,11 @@ class Layout:
                 dbc.InputGroup(
                     [
                         dbc.InputGroupText(
-                            show_tooltip(self._tooltips, "help-infra", "Infra")
+                            show_tooltip(self._tooltips, "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"
@@ -388,11 +383,11 @@ class Layout:
                 dbc.InputGroup(
                     [
                         dbc.InputGroupText(
-                            show_tooltip(self._tooltips, "help-area", "Area")
+                            show_tooltip(self._tooltips, "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"
@@ -403,11 +398,11 @@ class Layout:
                 dbc.InputGroup(
                     [
                         dbc.InputGroupText(
-                            show_tooltip(self._tooltips, "help-test", "Test")
+                            show_tooltip(self._tooltips, "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"
@@ -1111,29 +1106,28 @@ class Layout:
                     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(),
@@ -1166,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(),
@@ -1198,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(),
@@ -1229,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(),
@@ -1259,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,
@@ -1311,7 +1304,6 @@ class Layout:
                 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")