|
1 | 1 | import type {Reducer} from 'redux'; |
2 | | -import {createSelector, Selector} from 'reselect'; |
3 | | -import {escapeRegExp} from 'lodash/fp'; |
4 | 2 |
|
5 | 3 | import '../../../services/api'; |
6 | | -import {HOUR_IN_SECONDS} from '../../../utils/constants'; |
7 | | -import {calcUptime, calcUptimeInSeconds} from '../../../utils'; |
8 | 4 | import {NodesUptimeFilterValues} from '../../../utils/nodes'; |
9 | | -import {EFlag} from '../../../types/api/enums'; |
10 | 5 |
|
11 | | -import type {ProblemFilterValue} from '../settings/types'; |
12 | 6 | import {createRequestActionTypes, createApiRequest} from '../../utils'; |
13 | | -import {ProblemFilterValues} from '../settings/settings'; |
14 | 7 |
|
15 | | -import type { |
16 | | - NodesAction, |
17 | | - NodesApiRequestParams, |
18 | | - NodesHandledResponse, |
19 | | - NodesPreparedEntity, |
20 | | - NodesStateSlice, |
21 | | - NodesState, |
22 | | -} from './types'; |
| 8 | +import type {NodesAction, NodesApiRequestParams, NodesState} from './types'; |
| 9 | +import {prepareComputeNodesData, prepareNodesData} from './utils'; |
23 | 10 |
|
24 | 11 | export const FETCH_NODES = createRequestActionTypes('nodes', 'FETCH_NODES'); |
25 | 12 |
|
@@ -97,56 +84,15 @@ export function getNodes({tenant, visibleEntities, type = 'any'}: NodesApiReques |
97 | 84 | return createApiRequest({ |
98 | 85 | request: window.api.getNodes({tenant, visibleEntities, type}), |
99 | 86 | actions: FETCH_NODES, |
100 | | - dataHandler: (data): NodesHandledResponse => { |
101 | | - const rawNodes = data.Nodes || []; |
102 | | - |
103 | | - const preparedNodes = rawNodes.map((node) => { |
104 | | - return { |
105 | | - ...node?.SystemState, |
106 | | - Tablets: node?.Tablets, |
107 | | - NodeId: node?.NodeId, |
108 | | - Uptime: calcUptime(node?.SystemState?.StartTime), |
109 | | - TenantName: node?.SystemState?.Tenants?.[0], |
110 | | - }; |
111 | | - }); |
112 | | - |
113 | | - return { |
114 | | - Nodes: preparedNodes, |
115 | | - TotalNodes: Number(data.TotalNodes) || preparedNodes.length, |
116 | | - }; |
117 | | - }, |
| 87 | + dataHandler: prepareNodesData, |
118 | 88 | }); |
119 | 89 | } |
120 | 90 |
|
121 | 91 | export function getComputeNodes(path: string) { |
122 | 92 | return createApiRequest({ |
123 | 93 | request: window.api.getCompute(path), |
124 | 94 | actions: FETCH_NODES, |
125 | | - dataHandler: (data): NodesHandledResponse => { |
126 | | - const preparedNodes: NodesPreparedEntity[] = []; |
127 | | - |
128 | | - if (data.Tenants) { |
129 | | - for (const tenant of data.Tenants) { |
130 | | - if (tenant && tenant.Nodes) { |
131 | | - const tenantNodes = tenant.Nodes.map((node) => { |
132 | | - return { |
133 | | - ...node, |
134 | | - TenantName: tenant.Name, |
135 | | - SystemState: node?.Overall, |
136 | | - Uptime: calcUptime(node?.StartTime), |
137 | | - }; |
138 | | - }); |
139 | | - |
140 | | - preparedNodes.push(...tenantNodes); |
141 | | - } |
142 | | - } |
143 | | - } |
144 | | - |
145 | | - return { |
146 | | - Nodes: preparedNodes, |
147 | | - TotalNodes: preparedNodes.length, |
148 | | - }; |
149 | | - }, |
| 95 | + dataHandler: prepareComputeNodesData, |
150 | 96 | }); |
151 | 97 | } |
152 | 98 |
|
@@ -175,58 +121,4 @@ export const setSearchValue = (value: string) => { |
175 | 121 | } as const; |
176 | 122 | }; |
177 | 123 |
|
178 | | -const getNodesUptimeFilter = (state: NodesStateSlice) => state.nodes.nodesUptimeFilter; |
179 | | -const getSearchValue = (state: NodesStateSlice) => state.nodes.searchValue; |
180 | | -const getNodesList = (state: NodesStateSlice) => state.nodes.data; |
181 | | - |
182 | | -const filterNodesByProblemsStatus = ( |
183 | | - nodesList: NodesPreparedEntity[] = [], |
184 | | - problemFilter: ProblemFilterValue, |
185 | | -) => { |
186 | | - if (problemFilter === ProblemFilterValues.ALL) { |
187 | | - return nodesList; |
188 | | - } |
189 | | - |
190 | | - return nodesList.filter(({SystemState}) => { |
191 | | - return SystemState && SystemState !== EFlag.Green; |
192 | | - }); |
193 | | -}; |
194 | | - |
195 | | -export const filterNodesByUptime = <T extends {StartTime?: string}>( |
196 | | - nodesList: T[] = [], |
197 | | - nodesUptimeFilter: NodesUptimeFilterValues, |
198 | | -) => { |
199 | | - if (nodesUptimeFilter === NodesUptimeFilterValues.All) { |
200 | | - return nodesList; |
201 | | - } |
202 | | - return nodesList.filter(({StartTime}) => { |
203 | | - return !StartTime || calcUptimeInSeconds(StartTime) < HOUR_IN_SECONDS; |
204 | | - }); |
205 | | -}; |
206 | | - |
207 | | -const filterNodesBySearchValue = (nodesList: NodesPreparedEntity[] = [], searchValue: string) => { |
208 | | - if (!searchValue) { |
209 | | - return nodesList; |
210 | | - } |
211 | | - const re = new RegExp(escapeRegExp(searchValue), 'i'); |
212 | | - |
213 | | - return nodesList.filter((node) => { |
214 | | - return node.Host ? re.test(node.Host) || re.test(String(node.NodeId)) : true; |
215 | | - }); |
216 | | -}; |
217 | | - |
218 | | -export const getFilteredPreparedNodesList: Selector< |
219 | | - NodesStateSlice, |
220 | | - NodesPreparedEntity[] | undefined |
221 | | -> = createSelector( |
222 | | - [getNodesList, getNodesUptimeFilter, getSearchValue, (state) => state.settings.problemFilter], |
223 | | - (nodesList, uptimeFilter, searchValue, problemFilter) => { |
224 | | - let result = filterNodesByUptime(nodesList, uptimeFilter); |
225 | | - result = filterNodesByProblemsStatus(result, problemFilter); |
226 | | - result = filterNodesBySearchValue(result, searchValue); |
227 | | - |
228 | | - return result; |
229 | | - }, |
230 | | -); |
231 | | - |
232 | 124 | export default nodes; |
0 commit comments