aboutsummaryrefslogtreecommitdiffstats
path: root/csit.infra.dash/app/cdash/utils
diff options
context:
space:
mode:
Diffstat (limited to 'csit.infra.dash/app/cdash/utils')
-rw-r--r--csit.infra.dash/app/cdash/utils/constants.py15
-rw-r--r--csit.infra.dash/app/cdash/utils/control_panel.py87
-rw-r--r--csit.infra.dash/app/cdash/utils/trigger.py63
-rw-r--r--csit.infra.dash/app/cdash/utils/utils.py32
4 files changed, 189 insertions, 8 deletions
diff --git a/csit.infra.dash/app/cdash/utils/constants.py b/csit.infra.dash/app/cdash/utils/constants.py
index 6e973b81a8..cf16491d6b 100644
--- a/csit.infra.dash/app/cdash/utils/constants.py
+++ b/csit.infra.dash/app/cdash/utils/constants.py
@@ -39,7 +39,7 @@ class Constants:
BRAND = "CSIT-Dash"
# The application description.
- DESCRIPTION = 'Performance Dashboard "CSIT-Dash"'
+ DESCRIPTION = "Performance Dashboard"
# External stylesheets.
EXTERNAL_STYLESHEETS = ["/static/dist/css/bootstrap.css", ]
@@ -101,7 +101,7 @@ class Constants:
}
]
- # Checklist "All" is enable, visible and unchecked.
+ # Checklist "All" is enabled, visible and unchecked.
CL_ALL_ENABLED = [
{
"label": "All",
@@ -158,7 +158,8 @@ class Constants:
"3n-dnv": 2.000,
"3n-icx": 2.600,
"3n-skx": 2.500,
- "3n-tsh": 2.200
+ "3n-tsh": 2.200,
+ "3n-snr": 2.200
}
############################################################################
@@ -253,7 +254,7 @@ class Constants:
# News.
# The title.
- NEWS_TITLE = "CI TEST FAILURE AND ANOMALY STATISTICS"
+ NEWS_TITLE = "Failures and Anomalies"
# The pathname prefix for the application.
NEWS_ROUTES_PATHNAME_PREFIX = "/news/"
@@ -270,7 +271,7 @@ class Constants:
# Report.
# The title.
- REPORT_TITLE = "PER RELEASE PERFORMANCE RESULTS"
+ REPORT_TITLE = "Per Release Performance"
# The pathname prefix for the application.
REPORT_ROUTES_PATHNAME_PREFIX = "/report/"
@@ -285,7 +286,7 @@ class Constants:
# Statistics.
# The title.
- STATS_TITLE = "CI JOB EXECUTION STATISTICS"
+ STATS_TITLE = "Test Job Statistics"
# The pathname prefix for the application.
STATS_ROUTES_PATHNAME_PREFIX = "/stats/"
@@ -303,7 +304,7 @@ class Constants:
# Trending.
# The title.
- TREND_TITLE = "PERFORMANCE TRENDING (DAILY, WEEKLY)"
+ TREND_TITLE = "Performance Trending"
# The pathname prefix for the application.
TREND_ROUTES_PATHNAME_PREFIX = "/trending/"
diff --git a/csit.infra.dash/app/cdash/utils/control_panel.py b/csit.infra.dash/app/cdash/utils/control_panel.py
new file mode 100644
index 0000000000..d892dfa4c1
--- /dev/null
+++ b/csit.infra.dash/app/cdash/utils/control_panel.py
@@ -0,0 +1,87 @@
+# Copyright (c) 2022 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""A module implementing the control panel data structure.
+"""
+
+from copy import deepcopy
+
+
+class ControlPanel:
+ """A class representing the control panel.
+ """
+
+ def __init__(self, params: dict, panel: dict) -> None:
+ """Initialisation of the control pannel by default values. If
+ particular values are provided (parameter "panel") they are set
+ afterwards.
+
+ :param params: Default values to be set to the control panel. This
+ dictionary also defines the full set of the control panel's
+ parameters and their order.
+ :param panel: Custom values to be set to the control panel.
+ :type params: dict
+ :type panel: dict
+ """
+
+ if not params:
+ raise ValueError("The params must be defined.")
+ self._panel = deepcopy(params)
+ if panel:
+ for key in panel:
+ if key in self._panel:
+ self._panel[key] = panel[key]
+ else:
+ raise AttributeError(
+ f"The parameter {key} is not defined in the list of "
+ f"parameters."
+ )
+
+ @property
+ def panel(self) -> dict:
+ return self._panel
+
+ @property
+ def values(self) -> tuple:
+ """Returns the values from the Control panel as a tuple.
+
+ :returns: The values from the Control panel.
+ :rtype: tuple
+ """
+ return tuple(self._panel.values())
+
+ def set(self, kwargs: dict=dict()) -> None:
+ """Set the values of the Control panel.
+
+ :param kwargs: key - value pairs to be set.
+ :type kwargs: dict
+ :raises KeyError: If the key in kwargs is not present in the Control
+ panel.
+ """
+ for key, val in kwargs.items():
+ if key in self._panel:
+ self._panel[key] = val
+ else:
+ raise KeyError(f"The key {key} is not defined.")
+
+ def get(self, key: str) -> any:
+ """Returns the value of a key from the Control panel.
+
+ :param key: The key which value should be returned.
+ :type key: str
+ :returns: The value of the key.
+ :rtype: any
+ :raises KeyError: If the key in kwargs is not present in the Control
+ panel.
+ """
+ return self._panel[key]
diff --git a/csit.infra.dash/app/cdash/utils/trigger.py b/csit.infra.dash/app/cdash/utils/trigger.py
new file mode 100644
index 0000000000..53f7a2076a
--- /dev/null
+++ b/csit.infra.dash/app/cdash/utils/trigger.py
@@ -0,0 +1,63 @@
+# Copyright (c) 2022 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""A module implementing the processing of a trigger.
+"""
+
+from json import loads, JSONDecodeError
+
+
+class Trigger:
+ """
+ """
+ def __init__(self, trigger) -> None:
+ """
+ """
+ self._id = trigger[0]["prop_id"].split(".")
+ self._param = self._id[1]
+ try:
+ self._id = loads(self._id[0])
+ except (JSONDecodeError, TypeError):
+ # It is a string
+ self._id = {"type": self._id[0], "index": None}
+ self._val = trigger[0]["value"]
+
+ def __str__(self) -> str:
+ return (
+ f"\nTrigger:\n"
+ f" ID: {self._id}\n"
+ f" Type: {self._id['type']}\n"
+ f" Index: {self._id['index']}\n"
+ f" Parameter: {self._param}\n"
+ f" Value: {self._val}\n"
+ )
+
+ @property
+ def id(self) -> dict:
+ return self._id
+
+ @property
+ def type(self) -> str:
+ return self._id["type"]
+
+ @property
+ def idx(self) -> any:
+ return self._id["index"]
+
+ @property
+ def parameter(self) -> str:
+ return self._param
+
+ @property
+ def value(self) -> any:
+ return self._val
diff --git a/csit.infra.dash/app/cdash/utils/utils.py b/csit.infra.dash/app/cdash/utils/utils.py
index 9e4eeeb892..461821d28b 100644
--- a/csit.infra.dash/app/cdash/utils/utils.py
+++ b/csit.infra.dash/app/cdash/utils/utils.py
@@ -303,7 +303,7 @@ def get_job(df: pd.DataFrame, dut, ttype, cadence, testbed):
)]["job"].item()
-def generate_options(opts: list) -> list:
+def generate_options(opts: list, sort: bool=True) -> list:
"""Return list of options for radio items in control panel. The items in
the list are dictionaries with keys "label" and "value".
@@ -312,6 +312,8 @@ def generate_options(opts: list) -> list:
:returns: List of options (dict).
:rtype: list
"""
+ if sort:
+ opts = sorted(opts)
return [{"label": i, "value": i} for i in opts]
@@ -342,3 +344,31 @@ def set_job_params(df: pd.DataFrame, job: str) -> dict:
"tbeds": generate_options(
get_test_beds(df, l_job[1], l_job[3], l_job[4]))
}
+
+
+def get_list_group_items(tests: list) -> list:
+ """Generate list of ListGroupItems with checkboxes with selected tests.
+
+ :param tests: List of tests to be displayed in the ListGroup.
+ :type tests: list
+ :returns: List of ListGroupItems with checkboxes with selected tests.
+ :rtype: list
+ """
+ return [
+ dbc.ListGroupItem(
+ children=[
+ dbc.Checkbox(
+ id={"type": "sel-cl", "index": i},
+ label=l["id"],
+ value=False,
+ label_class_name="m-0 p-0",
+ label_style={
+ "font-size": ".875em",
+ "color": get_color(i)
+ },
+ input_class_name="border-danger bg-danger"
+ )
+ ],
+ class_name="p-0"
+ ) for i, l in enumerate(tests)
+ ]