X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Ftools%2Fdash%2Fapp%2Fpal%2Fnews%2Ftables.py;h=7c0cc66eda72acd3c29fb57f4e15a625df2edda8;hb=8d85a976dc8bd2c960044b32e830eb97f63f5ffe;hp=62728141655bc082c602e8f9ba9200aabee1a6a5;hpb=ae1fe880286d7b0414664bce2b2c7c91c3f543f3;p=csit.git diff --git a/resources/tools/dash/app/pal/news/tables.py b/resources/tools/dash/app/pal/news/tables.py index 6272814165..7c0cc66eda 100644 --- a/resources/tools/dash/app/pal/news/tables.py +++ b/resources/tools/dash/app/pal/news/tables.py @@ -11,66 +11,166 @@ # See the License for the specific language governing permissions and # limitations under the License. -""" +"""The tables with news. """ import pandas as pd import dash_bootstrap_components as dbc -from ..utils.constants import Constants as C +from datetime import datetime, timedelta + + +def _table_info(job_data: pd.DataFrame) -> dbc.Table: + """Generates table with info about the job. + + :param job_data: Dataframe with information about the job. + :type job_data: pandas.DataFrame + :returns: Table with job info. + :rtype: dbc.Table + """ + return dbc.Table.from_dataframe( + pd.DataFrame.from_dict( + { + "Job": job_data["job"], + "Last Build": job_data["build"], + "Date": job_data["start"], + "DUT": job_data["dut_type"], + "DUT Version": job_data["dut_version"], + "Hosts": ", ".join(job_data["hosts"].to_list()[0]) + } + ), + bordered=True, + striped=True, + hover=True, + size="sm", + color="info" + ) + +def _table_failed(job_data: pd.DataFrame, failed: list) -> dbc.Table: + """Generates table with failed tests from the last run of the job. -def table_news(data: pd.DataFrame, job: str) -> list: + :param job_data: Dataframe with information about the job. + :param failed: List of failed tests. + :type job_data: pandas.DataFrame + :type failed: list + :returns: Table with fialed tests. + :rtype: dbc.Table """ + return dbc.Table.from_dataframe( + pd.DataFrame.from_dict( + { + ( + f"Last Failed Tests on " + f"{job_data['start'].values[0]} ({len(failed)})" + ): failed + } + ), + bordered=True, + striped=True, + hover=True, + size="sm", + color="danger" + ) + + +def _table_gressions(itms: dict, color: str) -> dbc.Table: + """Generates table with regressions. + + :param itms: Dictionary with items (regressions or progressions) and their + last occurence. + :param color: Color of the table. + :type regressions: dict + :type color: str + :returns: The table with regressions. + :rtype: dbc.Table + """ + return dbc.Table.from_dataframe( + pd.DataFrame.from_dict(itms), + bordered=True, + striped=True, + hover=True, + size="sm", + color=color + ) + + +def table_news(data: pd.DataFrame, job: str, period: int) -> list: + """Generates the tables with news: + 1. Falied tests from the last run + 2. Regressions and progressions calculated from the last C.NEWS_TIME_PERIOD + days. + + :param data: Trending data with calculated annomalies to be displayed in the + tables. + :param job: The job name. + :param period: The time period (nr of days from now) taken into account. + :type data: pandas.DataFrame + :type job: str + :type period: int + :returns: List of tables. + :rtype: list """ + last_day = datetime.utcnow() - timedelta(days=period) + r_list = list() job_data = data.loc[(data["job"] == job)] + r_list.append(_table_info(job_data)) + failed = job_data["failed"].to_list()[0] - regressions = {"Test Name": list(), "Last Regression": list()} + if failed: + r_list.append(_table_failed(job_data, failed)) + + title = f"Regressions in the last {period} days" + regressions = {title: list(), "Last Regression": list()} for itm in job_data["regressions"].to_list()[0]: - regressions["Test Name"].append(itm[0]) - regressions["Last Regression"].append(itm[1].strftime('%Y-%m-%d %H:%M')) - progressions = {"Test Name": list(), "Last Progression": list()} + if itm[1] < last_day: + break + regressions[title].append(itm[0]) + regressions["Last Regression"].append( + itm[1].strftime('%Y-%m-%d %H:%M')) + if regressions["Last Regression"]: + r_list.append(_table_gressions(regressions, "warning")) + + title = f"Progressions in the last {period} days" + progressions = {title: list(), "Last Progression": list()} for itm in job_data["progressions"].to_list()[0]: - progressions["Test Name"].append(itm[0]) + if itm[1] < last_day: + break + progressions[title].append(itm[0]) progressions["Last Progression"].append( itm[1].strftime('%Y-%m-%d %H:%M')) + if progressions["Last Progression"]: + r_list.append(_table_gressions(progressions, "success")) + + return r_list + + +def table_summary(data: pd.DataFrame, jobs: list, period: int) -> list: + """Generates summary (failed tests, regressions and progressions) from the + last week. + + :param data: Trending data with calculated annomalies to be displayed in the + tables. + :param jobs: List of jobs. + :params period: The time period for the summary table. + :type data: pandas.DataFrame + :type job: str + :type period: int + :returns: List of tables. + :rtype: list + """ return [ - dbc.Table.from_dataframe(pd.DataFrame.from_dict({ - "Job": job_data["job"], - "Last Build": job_data["build"], - "Date": job_data["start"], - "DUT": job_data["dut_type"], - "DUT Version": job_data["dut_version"], - "Hosts": ", ".join(job_data["hosts"].to_list()[0]) - }), bordered=True, striped=True, hover=True, size="sm", color="light"), - dbc.Table.from_dataframe(pd.DataFrame.from_dict({ - ( - f"Last Failed Tests on " - f"{job_data['start'].values[0]} ({len(failed)})" - ): failed - }), bordered=True, striped=True, hover=True, size="sm", color="light"), - dbc.Label( - class_name="p-0", - size="lg", - children=( - f"Regressions during the last {C.NEWS_TIME_PERIOD} days " - f"({len(regressions['Test Name'])})" - ) - ), - dbc.Table.from_dataframe( - pd.DataFrame.from_dict(regressions), - bordered=True, striped=True, hover=True, size="sm", color="light"), - dbc.Label( - class_name="p-0", - size="lg", - children=( - f"Progressions during the last {C.NEWS_TIME_PERIOD} days " - f"({len(progressions['Test Name'])})" - ) - ), - dbc.Table.from_dataframe( - pd.DataFrame.from_dict(progressions), - bordered=True, striped=True, hover=True, size="sm", color="light") + dbc.Accordion( + children=[ + dbc.AccordionItem( + title=job, + children=table_news(data, job, period) + ) for job in jobs + ], + class_name="gy-2 p-0", + start_collapsed=True, + always_open=True + ) ]