{icons[status] ?? status.toUpperCase()}
{config.benchmark}
-
{`(${formatTime(config?.jobDuration)})`}
-
+
+ {status !== "upstream_failed"
+ ? `(${formatTime(config?.jobDuration)})`
+ : "Skipped"}
+
+ {props.type === "ocp" && (
+
+ )}
+ {props.type === "telco" && (
+
+ )}
{
};
TasksInfo.propTypes = {
config: Proptypes.object,
+ type: Proptypes.string,
};
export default TasksInfo;
diff --git a/frontend/src/components/molecules/TasksInfo/index.less b/frontend/src/components/molecules/TasksInfo/index.less
index dd088b46..e51880b8 100644
--- a/frontend/src/components/molecules/TasksInfo/index.less
+++ b/frontend/src/components/molecules/TasksInfo/index.less
@@ -1,5 +1,5 @@
.info-wrapper {
display: flex;
- justify-content: space-between;
- width: 50%;
+ justify-content: space-evenly;
+ width: 35%;
}
\ No newline at end of file
diff --git a/frontend/src/components/organisms/MetricsTab/index.jsx b/frontend/src/components/organisms/MetricsTab/index.jsx
index abe7bc44..83e10839 100644
--- a/frontend/src/components/organisms/MetricsTab/index.jsx
+++ b/frontend/src/components/organisms/MetricsTab/index.jsx
@@ -6,6 +6,11 @@ import {
AccordionItem,
AccordionToggle,
} from "@patternfly/react-core";
+import {
+ removeAppliedFilters,
+ setAppliedFilters,
+ setOtherSummaryFilter,
+} from "@/actions/filterActions";
import MetricCard from "@/components/molecules/MetricCard";
import PropTypes from "prop-types";
@@ -21,6 +26,30 @@ const MetricsTab = (props) => {
setExpanded(id);
}
};
+ const removeStatusFilter = () => {
+ if (
+ Array.isArray(props.appliedFilters["jobStatus"]) &&
+ props.appliedFilters["jobStatus"].length > 0
+ ) {
+ props.appliedFilters["jobStatus"].forEach((element) => {
+ props.updateSelectedFilter("jobStatus", element, true);
+ removeAppliedFilters(
+ "jobStatus",
+ element,
+ props.navigation,
+ props.type
+ );
+ });
+ }
+ };
+ const applyStatusFilter = (value) => {
+ props.updateSelectedFilter("jobStatus", value, true);
+ setAppliedFilters(props.navigation, props.type);
+ };
+ const applyOtherFilter = () => {
+ removeStatusFilter();
+ setOtherSummaryFilter(props.type);
+ };
return (
@@ -39,23 +68,23 @@ const MetricsTab = (props) => {
>
@@ -65,8 +94,9 @@ const MetricsTab = (props) => {
MetricsTab.propTypes = {
totalItems: PropTypes.number,
summary: PropTypes.object,
- removeStatusFilter: PropTypes.func,
- applyStatusFilter: PropTypes.func,
- applyOtherFilter: PropTypes.func,
+ type: PropTypes.string,
+ updateSelectedFilter: PropTypes.func,
+ navigation: PropTypes.func,
+ appliedFilters: PropTypes.object,
};
export default MetricsTab;
diff --git a/frontend/src/components/organisms/Pagination/index.jsx b/frontend/src/components/organisms/Pagination/index.jsx
index 490a801d..7b316a21 100644
--- a/frontend/src/components/organisms/Pagination/index.jsx
+++ b/frontend/src/components/organisms/Pagination/index.jsx
@@ -1,12 +1,38 @@
import { Pagination, PaginationVariant } from "@patternfly/react-core";
+import {
+ setPage,
+ setPageOptions,
+ sliceTableRows,
+} from "@/actions/paginationActions";
+
+import PropTypes from "prop-types";
+import { useCallback } from "react";
+import { useDispatch } from "react-redux";
const RenderPagination = (props) => {
+ const dispatch = useDispatch();
+
const perPageOptions = [
{ title: "25", value: 25 },
{ title: "50", value: 50 },
{ title: "100", value: 100 },
];
+ const onSetPage = useCallback(
+ (_evt, newPage, _perPage, startIdx, endIdx) => {
+ dispatch(setPage(newPage, props.type));
+ dispatch(sliceTableRows(startIdx, endIdx, props.type));
+ },
+ [dispatch, props.type]
+ );
+ const onPerPageSelect = useCallback(
+ (_evt, newPerPage, newPage, startIdx, endIdx) => {
+ dispatch(setPageOptions(newPage, newPerPage, props.type));
+ dispatch(sliceTableRows(startIdx, endIdx, props.type));
+ },
+ [dispatch, props.type]
+ );
+
return (
{
page={props.page}
variant={PaginationVariant.bottom}
perPageOptions={perPageOptions}
- onSetPage={props.onSetPage}
- onPerPageSelect={props.onPerPageSelect}
+ onSetPage={onSetPage}
+ onPerPageSelect={onPerPageSelect}
/>
);
};
+RenderPagination.propTypes = {
+ page: PropTypes.number,
+ perPage: PropTypes.number,
+ type: PropTypes.string,
+ items: PropTypes.number,
+};
export default RenderPagination;
diff --git a/frontend/src/components/organisms/TableFilters/index.jsx b/frontend/src/components/organisms/TableFilters/index.jsx
index ddd44368..c5f5ae62 100644
--- a/frontend/src/components/organisms/TableFilters/index.jsx
+++ b/frontend/src/components/organisms/TableFilters/index.jsx
@@ -9,6 +9,12 @@ import {
ToolbarContent,
ToolbarItem,
} from "@patternfly/react-core";
+import {
+ removeAppliedFilters,
+ setAppliedFilters,
+ setCatFilters,
+ setDateFilter,
+} from "@/actions/filterActions.js";
import ColumnMenuFilter from "@/components/molecules/ColumnMenuFilter";
import DatePicker from "react-date-picker";
@@ -27,11 +33,7 @@ const TableFilter = (props) => {
appliedFilters,
start_date,
end_date,
- onCategoryChange,
- onOptionsChange,
- deleteItem,
- startDateChangeHandler,
- endDateChangeHandler,
+ navigation,
type,
showColumnMenu,
setColumns,
@@ -50,6 +52,23 @@ const TableFilter = (props) => {
return filter.name;
};
+ const onCategoryChange = (_event, value) => {
+ setCatFilters(value, type);
+ };
+ const onOptionsChange = () => {
+ setAppliedFilters(navigation, type);
+ };
+ const deleteItem = (key, value) => {
+ removeAppliedFilters(key, value, navigation, type);
+ updateSelectedFilter(key, value, false);
+ };
+ const startDateChangeHandler = (date, key) => {
+ setDateFilter(date, key, navigation, type);
+ };
+ const endDateChangeHandler = (date, key) => {
+ setDateFilter(key, date, navigation, type);
+ };
+
return (
<>
@@ -128,15 +147,11 @@ TableFilter.propTypes = {
appliedFilters: PropTypes.object,
start_date: PropTypes.string,
end_date: PropTypes.string,
- onCategoryChange: PropTypes.func,
- onOptionsChange: PropTypes.func,
- deleteItem: PropTypes.func,
- startDateChangeHandler: PropTypes.func,
- endDateChangeHandler: PropTypes.func,
type: PropTypes.string,
showColumnMenu: PropTypes.bool,
setColumns: PropTypes.func,
selectedFilters: PropTypes.array,
updateSelectedFilter: PropTypes.func,
+ navigation: PropTypes.func,
};
export default TableFilter;
diff --git a/frontend/src/components/organisms/TableLayout/index.jsx b/frontend/src/components/organisms/TableLayout/index.jsx
index 57ee8062..500c1bc9 100644
--- a/frontend/src/components/organisms/TableLayout/index.jsx
+++ b/frontend/src/components/organisms/TableLayout/index.jsx
@@ -1,4 +1,9 @@
import { Table, Tbody, Th, Thead, Tr } from "@patternfly/react-table";
+import {
+ handleOnSort,
+ setActiveSortDir,
+ setActiveSortIndex,
+} from "@/actions/sortingActions";
import PropTypes from "prop-types";
import RenderPagination from "@/components/organisms/Pagination";
@@ -11,17 +16,11 @@ const TableLayout = (props) => {
tableColumns,
activeSortIndex,
activeSortDir,
- setActiveSortIndex,
- setActiveSortDir,
- handleOnSort,
page,
perPage,
- setPage,
- setPerPage,
- onSetPage,
- onPerPageSelect,
totalItems,
addExpansion,
+ type,
} = props;
const getSortParams = (columnIndex) => ({
@@ -31,9 +30,9 @@ const TableLayout = (props) => {
defaultDirection: "asc",
},
onSort: (_event, index, direction) => {
- setActiveSortIndex(index);
- setActiveSortDir(direction);
- handleOnSort();
+ setActiveSortIndex(index, type);
+ setActiveSortDir(direction, type);
+ handleOnSort(type);
},
columnIndex,
});
@@ -43,7 +42,7 @@ const TableLayout = (props) => {
- {addExpansion && | }
+ {addExpansion && | }
{tableColumns?.length > 0 &&
tableColumns.map((col, idx) => (
@@ -53,7 +52,19 @@ const TableLayout = (props) => {
))}
-
+ {!addExpansion ? (
+
+
+
+ ) : (
{
graphData={props?.graphData}
type={props.type}
/>
-
+ )}
>
);
@@ -83,16 +91,9 @@ TableLayout.propTypes = {
tableColumns: PropTypes.array,
activeSortIndex: PropTypes.number || PropTypes.object,
activeSortDir: PropTypes.string || PropTypes.object,
- setActiveSortIndex: PropTypes.func,
- setActiveSortDir: PropTypes.func,
- handleOnSort: PropTypes.func,
totalItems: PropTypes.number,
page: PropTypes.number,
perPage: PropTypes.number,
- onPerPageSelect: PropTypes.func,
- onSetPage: PropTypes.func,
- setPage: PropTypes.func,
- setPerPage: PropTypes.func,
addExpansion: PropTypes.bool,
graphData: PropTypes.array,
type: PropTypes.string,
diff --git a/frontend/src/components/templates/Home/index.jsx b/frontend/src/components/templates/Home/index.jsx
index 8e6d8254..02d8b2a9 100644
--- a/frontend/src/components/templates/Home/index.jsx
+++ b/frontend/src/components/templates/Home/index.jsx
@@ -1,27 +1,17 @@
import {
fetchOCPJobsData,
- removeAppliedFilters,
- setAppliedFilters,
- setCPTSortDir,
- setCPTSortIndex,
- setCatFilters,
- setDateFilter,
+ setCPTDateFilter,
setFilterFromURL,
- setOtherSummaryFilter,
- setPage,
- setPageOptions,
setSelectedFilter,
setSelectedFilterFromUrl,
- sliceTableRows,
} from "@/actions/homeActions.js";
-import { useCallback, useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import { useNavigate, useSearchParams } from "react-router-dom";
import MetricsTab from "@//components/organisms/MetricsTab";
import TableFilter from "@/components/organisms/TableFilters";
import TableLayout from "@/components/organisms/TableLayout";
-import { sortTable } from "@/actions/commonActions";
+import { useEffect } from "react";
const Home = () => {
const dispatch = useDispatch();
@@ -62,78 +52,14 @@ const Home = () => {
}
dispatch(setFilterFromURL(obj));
dispatch(setSelectedFilterFromUrl(params));
- dispatch(setDateFilter(startDate, endDate, navigate));
+ dispatch(setCPTDateFilter(startDate, endDate, navigate));
}
}, []);
useEffect(() => {
dispatch(fetchOCPJobsData());
}, [dispatch]);
- //Sorting
- const setActiveSortDir = (dir) => {
- dispatch(setCPTSortDir(dir));
- };
- const setActiveSortIndex = (index) => {
- dispatch(setCPTSortIndex(index));
- };
- const handleOnSort = () => {
- dispatch(sortTable("cpt"));
- };
- // Sorting
-
- // Pagination Helper
- const onSetPage = useCallback(
- (_evt, newPage, _perPage, startIdx, endIdx) => {
- dispatch(setPage(newPage));
- dispatch(sliceTableRows(startIdx, endIdx));
- },
- [dispatch]
- );
- const onPerPageSelect = useCallback(
- (_evt, newPerPage, newPage, startIdx, endIdx) => {
- dispatch(setPageOptions(newPage, newPerPage));
- dispatch(sliceTableRows(startIdx, endIdx));
- },
- [dispatch]
- );
- // Pagination helper
-
// Filter Helper
- const onCategoryChange = (_event, value) => {
- dispatch(setCatFilters(value));
- };
- const onOptionsChange = () => {
- dispatch(setAppliedFilters(navigate));
- };
- const deleteItem = (key, value) => {
- dispatch(removeAppliedFilters(key, value, navigate));
- updateSelectedFilter(key, value, false);
- };
- const startDateChangeHandler = (date, key) => {
- dispatch(setDateFilter(date, key, navigate));
- };
- const endDateChangeHandler = (date, key) => {
- dispatch(setDateFilter(key, date, navigate));
- };
- const removeStatusFilter = () => {
- if (
- Array.isArray(appliedFilters["jobStatus"]) &&
- appliedFilters["jobStatus"].length > 0
- ) {
- appliedFilters["jobStatus"].forEach((element) => {
- updateSelectedFilter("jobStatus", element, true);
- dispatch(removeAppliedFilters("jobStatus", element, navigate));
- });
- }
- };
- const applyStatusFilter = (value) => {
- updateSelectedFilter("jobStatus", value, true);
- dispatch(setAppliedFilters(navigate));
- };
- const applyOtherFilter = () => {
- removeStatusFilter();
- dispatch(setOtherSummaryFilter());
- };
const updateSelectedFilter = (category, value, isFromMetrics) => {
dispatch(setSelectedFilter(category, value, isFromMetrics));
};
@@ -143,9 +69,10 @@ const Home = () => {
{
appliedFilters={appliedFilters}
start_date={start_date}
end_date={end_date}
- onCategoryChange={onCategoryChange}
- onOptionsChange={onOptionsChange}
- deleteItem={deleteItem}
- startDateChangeHandler={startDateChangeHandler}
- endDateChangeHandler={endDateChangeHandler}
type={"cpt"}
selectedFilters={selectedFilters}
updateSelectedFilter={updateSelectedFilter}
showColumnMenu={false}
+ navigation={navigate}
/>
{
tableColumns={tableColumns}
activeSortIndex={activeSortIndex}
activeSortDir={activeSortDir}
- setActiveSortDir={setActiveSortDir}
- setActiveSortIndex={setActiveSortIndex}
- handleOnSort={handleOnSort}
- onPerPageSelect={onPerPageSelect}
- onSetPage={onSetPage}
page={page}
perPage={perPage}
totalItems={filteredResults.length}
addExpansion={false}
- state={"cpt"}
+ type={"cpt"}
/>
>
);
diff --git a/frontend/src/components/templates/OCP/index.jsx b/frontend/src/components/templates/OCP/index.jsx
index 623df07f..3d5932ba 100644
--- a/frontend/src/components/templates/OCP/index.jsx
+++ b/frontend/src/components/templates/OCP/index.jsx
@@ -1,20 +1,11 @@
import {
fetchGraphData,
fetchOCPJobs,
- removeAppliedFilters,
- setAppliedFilters,
- setDateFilter,
setFilterFromURL,
- setOCPCatFilters,
- setOCPSortDir,
- setOCPSortIndex,
- setOtherSummaryFilter,
- setPage,
- setPageOptions,
+ setOCPDateFilter,
setSelectedFilter,
setSelectedFilterFromUrl,
setTableColumns,
- sliceOCPTableRows,
} from "@/actions/ocpActions";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
@@ -23,7 +14,6 @@ import { useNavigate, useSearchParams } from "react-router-dom";
import MetricsTab from "@/components/organisms/MetricsTab";
import TableFilter from "@/components/organisms/TableFilters";
import TableLayout from "@/components/organisms/TableLayout";
-import { sortTable } from "@/actions/commonActions.js";
const OCP = () => {
const dispatch = useDispatch();
@@ -49,13 +39,6 @@ const OCP = () => {
selectedFilters,
} = useSelector((state) => state.ocp);
- const modifidedTableFilters = useMemo(
- () =>
- tableFilters.filter(
- (item) => item.value !== "endDate" && item.value !== "startDate"
- ),
- [tableFilters]
- );
useEffect(() => {
if (searchParams.size > 0) {
// date filter is set apart
@@ -71,7 +54,7 @@ const OCP = () => {
}
dispatch(setFilterFromURL(obj));
dispatch(setSelectedFilterFromUrl(params));
- dispatch(setDateFilter(startDate, endDate, navigate));
+ dispatch(setOCPDateFilter(startDate, endDate, navigate));
}
}, []);
@@ -79,76 +62,18 @@ const OCP = () => {
dispatch(fetchOCPJobs());
}, [dispatch]);
- //Sorting
- const setActiveSortDir = (dir) => {
- dispatch(setOCPSortDir(dir));
- };
- const setActiveSortIndex = (index) => {
- dispatch(setOCPSortIndex(index));
- };
- const handleOnSort = () => {
- dispatch(sortTable("ocp"));
- };
- // Sorting
-
- // Pagination Helper
- const onSetPage = useCallback(
- (_evt, newPage, _perPage, startIdx, endIdx) => {
- dispatch(setPage(newPage));
- dispatch(sliceOCPTableRows(startIdx, endIdx));
- },
- [dispatch]
- );
- const onPerPageSelect = useCallback(
- (_evt, newPerPage, newPage, startIdx, endIdx) => {
- dispatch(setPageOptions(newPage, newPerPage));
- dispatch(sliceOCPTableRows(startIdx, endIdx));
- },
- [dispatch]
+ //Filter Helper
+ const modifidedTableFilters = useMemo(
+ () =>
+ tableFilters.filter(
+ (item) => item.value !== "endDate" && item.value !== "startDate"
+ ),
+ [tableFilters]
);
- // Pagination helper
- /* Summary Tab Filter*/
- const removeStatusFilter = () => {
- if (
- Array.isArray(appliedFilters["jobStatus"]) &&
- appliedFilters["jobStatus"].length > 0
- ) {
- appliedFilters["jobStatus"].forEach((element) => {
- updateSelectedFilter("jobStatus", element, true);
- dispatch(removeAppliedFilters("jobStatus", element, navigate));
- });
- }
- };
- const applyStatusFilter = (value) => {
- updateSelectedFilter("jobStatus", value, true);
- dispatch(setAppliedFilters(navigate));
- };
- const applyOtherFilter = () => {
- removeStatusFilter();
- dispatch(setOtherSummaryFilter());
- };
const updateSelectedFilter = (category, value, isFromMetrics = false) => {
dispatch(setSelectedFilter(category, value, isFromMetrics));
};
- /* Filter helper */
-
- const onCategoryChange = (_event, value) => {
- dispatch(setOCPCatFilters(value));
- };
- const onOptionsChange = () => {
- dispatch(setAppliedFilters(navigate));
- };
- const deleteItem = (key, value) => {
- dispatch(removeAppliedFilters(key, value, navigate));
- updateSelectedFilter(key, value);
- };
- const startDateChangeHandler = (date, key) => {
- dispatch(setDateFilter(date, key, navigate));
- };
- const endDateChangeHandler = (date, key) => {
- dispatch(setDateFilter(key, date, navigate));
- };
//Row expansion
const [expandedRunNames, setExpandedRunNames] = useState([]);
const setRunExpanded = (run, isExpanding = true) => {
@@ -159,7 +84,7 @@ const OCP = () => {
: otherExpandedRunNames;
});
if (isExpanding) {
- dispatch(fetchGraphData(run.uuid));
+ dispatch(fetchGraphData(run.uuid, run.benchmark));
}
};
@@ -175,9 +100,10 @@ const OCP = () => {
{
appliedFilters={appliedFilters}
start_date={start_date}
end_date={end_date}
- onCategoryChange={onCategoryChange}
- onOptionsChange={onOptionsChange}
- deleteItem={deleteItem}
- startDateChangeHandler={startDateChangeHandler}
- endDateChangeHandler={endDateChangeHandler}
type={"ocp"}
showColumnMenu={true}
setColumns={setColumns}
selectedFilters={selectedFilters}
updateSelectedFilter={updateSelectedFilter}
+ navigation={navigate}
/>
{
tableColumns={tableColumns}
activeSortIndex={activeSortIndex}
activeSortDir={activeSortDir}
- setActiveSortDir={setActiveSortDir}
- setActiveSortIndex={setActiveSortIndex}
- handleOnSort={handleOnSort}
- onPerPageSelect={onPerPageSelect}
- onSetPage={onSetPage}
page={page}
perPage={perPage}
totalItems={filteredResults.length}
diff --git a/frontend/src/components/templates/Quay/index.jsx b/frontend/src/components/templates/Quay/index.jsx
index d4b55e15..2f193fdf 100644
--- a/frontend/src/components/templates/Quay/index.jsx
+++ b/frontend/src/components/templates/Quay/index.jsx
@@ -1,5 +1,142 @@
+import {
+ fetchGraphData,
+ fetchQuayJobsData,
+ setFilterFromURL,
+ setQuayDateFilter,
+ setSelectedFilter,
+ setSelectedFilterFromUrl,
+ setTableColumns,
+} from "@/actions/quayActions.js";
+import { useCallback, useEffect, useMemo, useState } from "react";
+import { useDispatch, useSelector } from "react-redux";
+import { useNavigate, useSearchParams } from "react-router-dom";
+
+import MetricsTab from "@/components/organisms/MetricsTab";
+import TableFilter from "@/components/organisms/TableFilters";
+import TableLayout from "@/components/organisms/TableLayout";
+
const Quay = () => {
- return <>Quay>;
+ const dispatch = useDispatch();
+ const navigate = useNavigate();
+ const [searchParams] = useSearchParams();
+
+ const {
+ tableData,
+ tableColumns,
+ activeSortIndex,
+ activeSortDir,
+ page,
+ perPage,
+ filteredResults,
+ tableFilters,
+ filterOptions,
+ categoryFilterValue,
+ filterData,
+ appliedFilters,
+ start_date,
+ end_date,
+ selectedFilters,
+ graphData,
+ summary,
+ } = useSelector((state) => state.quay);
+
+ useEffect(() => {
+ dispatch(fetchQuayJobsData());
+ }, [dispatch]);
+
+ useEffect(() => {
+ if (searchParams.size > 0) {
+ // date filter is set apart
+ const startDate = searchParams.get("start_date");
+ const endDate = searchParams.get("end_date");
+
+ searchParams.delete("start_date");
+ searchParams.delete("end_date");
+ const params = Object.fromEntries(searchParams);
+ const obj = {};
+ for (const key in params) {
+ obj[key] = params[key].split(",");
+ }
+ dispatch(setFilterFromURL(obj));
+ dispatch(setSelectedFilterFromUrl(params));
+ dispatch(setQuayDateFilter(startDate, endDate, navigate));
+ }
+ }, []);
+
+ //Filter Helper
+ const modifidedTableFilters = useMemo(
+ () =>
+ tableFilters.filter(
+ (item) => item.value !== "endDate" && item.value !== "startDate"
+ ),
+ [tableFilters]
+ );
+ const updateSelectedFilter = (category, value, isFromMetrics) => {
+ dispatch(setSelectedFilter(category, value, isFromMetrics));
+ };
+ //Filter Helper
+ //Row expansion
+ const [expandedRunNames, setExpandedRunNames] = useState([]);
+ const setRunExpanded = (run, isExpanding = true) => {
+ setExpandedRunNames((prevExpanded) => {
+ const otherExpandedRunNames = prevExpanded.filter((r) => r !== run.uuid);
+ return isExpanding
+ ? [...otherExpandedRunNames, run.uuid]
+ : otherExpandedRunNames;
+ });
+ if (isExpanding) {
+ dispatch(fetchGraphData(run.uuid));
+ }
+ };
+
+ const isRunExpanded = useCallback(
+ (run) => expandedRunNames.includes(run.uuid),
+ [expandedRunNames]
+ );
+ const setColumns = (value, isAdding) => {
+ dispatch(setTableColumns(value, isAdding));
+ };
+ return (
+ <>
+
+
+
+ >
+ );
};
export default Quay;
diff --git a/frontend/src/components/templates/Telco/index.jsx b/frontend/src/components/templates/Telco/index.jsx
index 8b9b5741..66c2defa 100644
--- a/frontend/src/components/templates/Telco/index.jsx
+++ b/frontend/src/components/templates/Telco/index.jsx
@@ -1,5 +1,141 @@
+import {
+ fetchGraphData,
+ fetchTelcoJobsData,
+ setFilterFromURL,
+ setSelectedFilter,
+ setSelectedFilterFromUrl,
+ setTableColumns,
+ setTelcoDateFilter,
+} from "@/actions/telcoActions.js";
+import { useCallback, useEffect, useMemo, useState } from "react";
+import { useDispatch, useSelector } from "react-redux";
+import { useNavigate, useSearchParams } from "react-router-dom";
+
+import MetricsTab from "@/components/organisms/MetricsTab";
+import TableFilter from "@/components/organisms/TableFilters";
+import TableLayout from "@/components/organisms/TableLayout";
+
const Telco = () => {
- return <>Telco>;
+ const dispatch = useDispatch();
+ const navigate = useNavigate();
+ const [searchParams] = useSearchParams();
+ const {
+ tableData,
+ tableColumns,
+ activeSortIndex,
+ activeSortDir,
+ page,
+ perPage,
+ filteredResults,
+ tableFilters,
+ filterOptions,
+ categoryFilterValue,
+ filterData,
+ appliedFilters,
+ start_date,
+ end_date,
+ selectedFilters,
+ summary,
+ graphData,
+ } = useSelector((state) => state.telco);
+
+ useEffect(() => {
+ dispatch(fetchTelcoJobsData());
+ }, [dispatch]);
+
+ useEffect(() => {
+ if (searchParams.size > 0) {
+ // date filter is set apart
+ const startDate = searchParams.get("start_date");
+ const endDate = searchParams.get("end_date");
+
+ searchParams.delete("start_date");
+ searchParams.delete("end_date");
+ const params = Object.fromEntries(searchParams);
+ const obj = {};
+ for (const key in params) {
+ obj[key] = params[key].split(",");
+ }
+ dispatch(setFilterFromURL(obj));
+ dispatch(setSelectedFilterFromUrl(params));
+ dispatch(setTelcoDateFilter(startDate, endDate, navigate));
+ }
+ }, []);
+
+ //Filter Helper
+ const modifidedTableFilters = useMemo(
+ () =>
+ tableFilters.filter(
+ (item) => item.value !== "endDate" && item.value !== "startDate"
+ ),
+ [tableFilters]
+ );
+ const updateSelectedFilter = (category, value, isFromMetrics) => {
+ dispatch(setSelectedFilter(category, value, isFromMetrics));
+ };
+ //Filter Helper
+ //Row expansion
+ const [expandedRunNames, setExpandedRunNames] = useState([]);
+ const setRunExpanded = (run, isExpanding = true) => {
+ setExpandedRunNames((prevExpanded) => {
+ const otherExpandedRunNames = prevExpanded.filter((r) => r !== run.uuid);
+ return isExpanding
+ ? [...otherExpandedRunNames, run.uuid]
+ : otherExpandedRunNames;
+ });
+ if (isExpanding) {
+ dispatch(fetchGraphData(run.benchmark, run.uuid, run.encryptedData));
+ }
+ };
+
+ const isRunExpanded = useCallback(
+ (run) => expandedRunNames.includes(run.uuid),
+ [expandedRunNames]
+ );
+ const setColumns = (value, isAdding) => {
+ dispatch(setTableColumns(value, isAdding));
+ };
+ return (
+ <>
+
+
+
+ >
+ );
};
export default Telco;
diff --git a/frontend/src/reducers/index.js b/frontend/src/reducers/index.js
index caaa3874..1fb4c555 100644
--- a/frontend/src/reducers/index.js
+++ b/frontend/src/reducers/index.js
@@ -1,7 +1,9 @@
import HomeReducer from "./homeReducer";
import LoadingReducer from "./loadingReducer";
import OCPReducer from "./ocpReducer";
+import QuayReducer from "./quayReducer";
import SideMenuReducer from "./sideMenuReducer";
+import TelcoReducer from "./telcoReducer";
import ToastReducer from "./toastReducer";
import { combineReducers } from "redux";
@@ -11,4 +13,6 @@ export default combineReducers({
sidemenu: SideMenuReducer,
cpt: HomeReducer,
ocp: OCPReducer,
+ quay: QuayReducer,
+ telco: TelcoReducer,
});
diff --git a/frontend/src/reducers/ocpReducer.js b/frontend/src/reducers/ocpReducer.js
index 99b4d160..c422ff5e 100644
--- a/frontend/src/reducers/ocpReducer.js
+++ b/frontend/src/reducers/ocpReducer.js
@@ -68,7 +68,7 @@ const initialState = {
{ name: "Control Plane Architecture", value: "controlPlaneArch" },
],
nodeKeys: [
- { name: "Master", value: "masterNodesCount" },
+ { name: "Master", value: "masterNodesType" },
{ name: "Worker", value: "workerNodesType" },
{ name: "Infra", value: "infraNodesType" },
{ name: "Workload", value: "benchmark" },
diff --git a/frontend/src/reducers/quayReducer.js b/frontend/src/reducers/quayReducer.js
new file mode 100644
index 00000000..bc3ff723
--- /dev/null
+++ b/frontend/src/reducers/quayReducer.js
@@ -0,0 +1,118 @@
+import * as TYPES from "@/actions/types";
+
+import {
+ DEFAULT_PER_PAGE,
+ START_PAGE,
+} from "@/assets/constants/paginationConstants";
+
+const initialState = {
+ results: [],
+ start_date: "",
+ end_date: "",
+ tableColumns: [
+ { name: "Benchmark", value: "benchmark" },
+ { name: "Release Stream", value: "releaseStream" },
+ { name: "Platform", value: "platform" },
+ { name: "Worker Count", value: "workerNodesCount" },
+ { name: "Start Date", value: "startDate" },
+ { name: "End Date", value: "endDate" },
+ { name: "Status", value: "jobStatus" },
+ ],
+ tableFilters: [
+ { name: "Benchmark", value: "benchmark" },
+ { name: "Release Stream", value: "releaseStream" },
+ { name: "Platform", value: "platform" },
+ { name: "Worker Count", value: "workerNodesCount" },
+ { name: "Status", value: "jobStatus" },
+ ],
+ selectedFilters: [
+ { name: "benchmark", value: [] },
+ { name: "releaseStream", value: [] },
+ { name: "platform", value: [] },
+ { name: "workerNodesCount", value: [] },
+ { name: "jobStatus", value: [] },
+ ],
+ clusterMetaData: [
+ { name: "Release Binary", value: "releaseStream" },
+ { name: "Cluster Name", value: "clusterName" },
+ { name: "Cluster Type", value: "clusterType" },
+ { name: "Network Type", value: "networkType" },
+ { name: "Benchmark Status", value: "jobStatus" },
+ { name: "Duration", value: "jobDuration" },
+ { name: "Test ID", value: "uuid" },
+ ],
+ nodeKeys: [
+ { name: "Master", value: "masterNodesType" },
+ { name: "Worker", value: "workerNodesType" },
+ { name: "Infra", value: "infraNodesType" },
+ { name: "Workload", value: "benchmark" },
+ ],
+ nodeCount: [
+ { name: "Master", value: "masterNodesCount" },
+ { name: "Worker", value: "workerNodesCount" },
+ { name: "Infra", value: "infraNodesCount" },
+ { name: "Total", value: "totalNodesCount" },
+ ],
+ filterData: [],
+ filteredResults: [],
+ filterOptions: [],
+ categoryFilterValue: "Benchmark",
+ appliedFilters: {},
+ activeSortDir: null,
+ activeSortIndex: null,
+ tableData: [],
+ graphData: [],
+ page: START_PAGE,
+ perPage: DEFAULT_PER_PAGE,
+ summary: {},
+};
+
+const QuayReducer = (state = initialState, action = {}) => {
+ const { type, payload } = action;
+
+ switch (type) {
+ case TYPES.SET_QUAY_JOBS_DATA:
+ return {
+ ...state,
+ results: payload,
+ };
+ case TYPES.SET_QUAY_DATE_FILTER:
+ return {
+ ...state,
+ start_date: payload.start_date,
+ end_date: payload.end_date,
+ };
+ case TYPES.SET_QUAY_SORT_INDEX:
+ return { ...state, activeSortIndex: payload };
+ case TYPES.SET_QUAY_SORT_DIR:
+ return { ...state, activeSortDir: payload };
+ case TYPES.SET_QUAY_PAGE:
+ return { ...state, page: payload };
+ case TYPES.SET_QUAY_PAGE_OPTIONS:
+ return { ...state, page: payload.page, perPage: payload.perPage };
+ case TYPES.SET_QUAY_INIT_JOBS:
+ return { ...state, tableData: payload };
+ case TYPES.SET_QUAY_FILTERED_DATA:
+ return { ...state, filteredResults: payload };
+ case TYPES.SET_QUAY_FILTER_OPTIONS:
+ return { ...state, filterOptions: payload };
+ case TYPES.SET_QUAY_CATEGORY_FILTER:
+ return { ...state, categoryFilterValue: payload };
+ case TYPES.SET_QUAY_FILTER_DATA:
+ return { ...state, filterData: payload };
+ case TYPES.SET_QUAY_APPLIED_FILTERS:
+ return { ...state, appliedFilters: payload };
+ case TYPES.SET_QUAY_SELECTED_FILTERS:
+ return { ...state, selectedFilters: payload };
+ case TYPES.SET_QUAY_SUMMARY:
+ return { ...state, summary: payload };
+ case TYPES.SET_QUAY_COLUMNS:
+ return { ...state, tableColumns: payload };
+ case TYPES.SET_QUAY_GRAPH_DATA:
+ return { ...state, graphData: [...state.graphData, payload] };
+ default:
+ return state;
+ }
+};
+
+export default QuayReducer;
diff --git a/frontend/src/reducers/telcoReducer.js b/frontend/src/reducers/telcoReducer.js
new file mode 100644
index 00000000..15ab045f
--- /dev/null
+++ b/frontend/src/reducers/telcoReducer.js
@@ -0,0 +1,115 @@
+import * as TYPES from "@/actions/types";
+
+import {
+ DEFAULT_PER_PAGE,
+ START_PAGE,
+} from "@/assets/constants/paginationConstants";
+
+const initialState = {
+ results: [],
+ start_date: "",
+ end_date: "",
+ tableColumns: [
+ { name: "Benchmark", value: "benchmark" },
+ { name: "Release Stream", value: "releaseStream" },
+ { name: "CPU", value: "cpu" },
+ { name: "Node Name", value: "nodeName" },
+ { name: "Start Date", value: "startDate" },
+ { name: "End Date", value: "endDate" },
+ { name: "Status", value: "jobStatus" },
+ ],
+ tableFilters: [
+ { name: "Benchmark", value: "benchmark" },
+ { name: "Release Stream", value: "releaseStream" },
+ { name: "Build", value: "ocpVersion" },
+ { name: "CPU", value: "cpu" },
+ { name: "Node Name", value: "nodeName" },
+ { name: "Status", value: "jobStatus" },
+ ],
+ selectedFilters: [
+ { name: "benchmark", value: [] },
+ { name: "releaseStream", value: [] },
+ { name: "ocpVersion", value: [] },
+ { name: "cpu", value: [] },
+ { name: "nodeName", value: [] },
+ { name: "jobStatus", value: [] },
+ ],
+ clusterMetaData: [
+ { name: "Release Binary", value: "releaseStream" },
+ { name: "Cluster Name", value: "nodeName" },
+ { name: "Cluster Type", value: "clusterType" },
+ { name: "Network Type", value: "networkType" },
+ { name: "Benchmark Status", value: "jobStatus" },
+ { name: "Duration", value: "jobDuration" },
+ ],
+ nodeKeys: [
+ { name: "Master", value: "master_type" },
+ { name: "Workload", value: "benchmark" },
+ ],
+ nodeCount: [
+ { name: "Master", value: "masterNodesCount" },
+ { name: "Total", value: "totalNodesCount" },
+ ],
+ filterData: [],
+ filteredResults: [],
+ categoryFilterValue: "Benchmark",
+ filterOptions: [],
+ appliedFilters: {},
+ activeSortDir: null,
+ activeSortIndex: null,
+ tableData: [],
+ graphData: [],
+ page: START_PAGE,
+ perPage: DEFAULT_PER_PAGE,
+ summary: {},
+};
+
+const TelcoReducer = (state = initialState, action = {}) => {
+ const { type, payload } = action;
+
+ switch (type) {
+ case TYPES.SET_TELCO_JOBS_DATA:
+ return {
+ ...state,
+ results: payload,
+ };
+ case TYPES.SET_TELCO_DATE_FILTER:
+ return {
+ ...state,
+ start_date: payload.start_date,
+ end_date: payload.end_date,
+ };
+ case TYPES.SET_TELCO_SORT_INDEX:
+ return { ...state, activeSortIndex: payload };
+ case TYPES.SET_TELCO_SORT_DIR:
+ return { ...state, activeSortDir: payload };
+ case TYPES.SET_TELCO_PAGE:
+ return { ...state, page: payload };
+ case TYPES.SET_TELCO_PAGE_OPTIONS:
+ return { ...state, page: payload.page, perPage: payload.perPage };
+ case TYPES.SET_TELCO_INIT_JOBS:
+ return { ...state, tableData: payload };
+ case TYPES.SET_TELCO_FILTERED_DATA:
+ return { ...state, filteredResults: payload };
+ case TYPES.SET_TELCO_CATEGORY_FILTER:
+ return { ...state, categoryFilterValue: payload };
+ case TYPES.SET_TELCO_FILTER_OPTIONS:
+ return { ...state, filterOptions: payload };
+ case TYPES.SET_TELCO_FILTER_DATA:
+ return { ...state, filterData: payload };
+ case TYPES.SET_TELCO_APPLIED_FILTERS:
+ return { ...state, appliedFilters: payload };
+ case TYPES.SET_TELCO_SELECTED_FILTERS:
+ return { ...state, selectedFilters: payload };
+ case TYPES.SET_TELCO_SUMMARY:
+ return { ...state, summary: payload };
+ case TYPES.SET_TELCO_COLUMNS:
+ return { ...state, tableColumns: payload };
+ case TYPES.SET_TELCO_GRAPH_DATA:
+ return { ...state, graphData: [...state.graphData, payload] };
+ default:
+ return state;
+ }
+};
+
+export default TelcoReducer;
diff --git a/frontend/src/utils/apiConstants.js b/frontend/src/utils/apiConstants.js
index e6d68406..52576b4a 100644
--- a/frontend/src/utils/apiConstants.js
+++ b/frontend/src/utils/apiConstants.js
@@ -14,3 +14,6 @@ export const CPT_JOBS_API_V1 = "/api/v1/cpt/jobs";
export const QUAY_JOBS_API_V1 = "/api/v1/quay/jobs";
export const QUAY_GRAPH_API_V1 = "/api/v1/quay/graph";
+
+export const TELCO_JOBS_API_V1 = "/api/v1/telco/jobs";
+export const TELCO_GRAPH_API_V1 = "/api/v1/telco/graph";