ydb-embedded-ui 4.5.1 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/components/FullNodeViewer/FullNodeViewer.js +1 -1
  3. package/dist/components/NodeHostWrapper/NodeHostWrapper.tsx +1 -1
  4. package/dist/components/PoolUsage/PoolUsage.scss +1 -1
  5. package/dist/components/PoolUsage/PoolUsage.tsx +50 -0
  6. package/dist/containers/App/Content.js +3 -2
  7. package/dist/containers/AsideNavigation/AsideNavigation.tsx +4 -50
  8. package/dist/containers/Cluster/Cluster.scss +7 -48
  9. package/dist/containers/Cluster/Cluster.tsx +136 -20
  10. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.scss +34 -17
  11. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.tsx +57 -91
  12. package/dist/containers/Cluster/ClusterInfoSkeleton/ClusterInfoSkeleton.scss +48 -0
  13. package/dist/containers/Cluster/ClusterInfoSkeleton/ClusterInfoSkeleton.tsx +34 -0
  14. package/dist/containers/Cluster/utils.ts +34 -0
  15. package/dist/containers/Header/Header.scss +0 -24
  16. package/dist/containers/Header/Header.tsx +14 -44
  17. package/dist/containers/Node/Node.tsx +23 -21
  18. package/dist/containers/Node/NodeStructure/NodeStructure.tsx +19 -17
  19. package/dist/containers/Nodes/Nodes.tsx +0 -16
  20. package/dist/containers/Nodes/getNodesColumns.tsx +1 -1
  21. package/dist/containers/Storage/Storage.js +1 -11
  22. package/dist/containers/Tablet/Tablet.tsx +28 -0
  23. package/dist/containers/TabletsFilters/TabletsFilters.js +16 -1
  24. package/dist/containers/Tenant/Diagnostics/Describe/Describe.tsx +1 -1
  25. package/dist/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss +3 -0
  26. package/dist/containers/Tenant/Diagnostics/Diagnostics.tsx +3 -3
  27. package/dist/containers/Tenant/Diagnostics/Network/Network.js +2 -2
  28. package/dist/containers/Tenant/Diagnostics/Overview/ChangefeedInfo/ChangefeedInfo.tsx +4 -6
  29. package/dist/containers/Tenant/Diagnostics/Overview/Overview.tsx +56 -53
  30. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +1 -1
  31. package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.tsx +1 -1
  32. package/dist/containers/Tenant/ObjectSummary/ObjectSummary.tsx +1 -1
  33. package/dist/containers/Tenant/Preview/Preview.js +1 -1
  34. package/dist/containers/Tenant/QueryEditor/QueryEditor.js +26 -22
  35. package/dist/containers/Tenant/QueryEditor/QueryEditorControls/OldQueryEditorControls.tsx +10 -3
  36. package/dist/containers/Tenant/QueryEditor/QueryEditorControls/QueryEditorControls.tsx +8 -1
  37. package/dist/containers/Tenant/QueryEditor/QueryEditorControls/shared.ts +1 -6
  38. package/dist/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx +1 -1
  39. package/dist/containers/Tenant/Tenant.tsx +8 -13
  40. package/dist/containers/Tenant/utils/schemaActions.ts +1 -1
  41. package/dist/containers/Tenants/Tenants.js +18 -28
  42. package/dist/containers/Tenants/Tenants.scss +2 -4
  43. package/dist/containers/UserSettings/i18n/en.json +2 -2
  44. package/dist/containers/UserSettings/i18n/ru.json +2 -2
  45. package/dist/containers/UserSettings/settings.ts +4 -4
  46. package/dist/containers/Versions/GroupedNodesTree/GroupedNodesTree.scss +1 -0
  47. package/dist/containers/Versions/NodesTable/NodesTable.tsx +2 -3
  48. package/dist/containers/Versions/Versions.scss +0 -4
  49. package/dist/containers/Versions/Versions.tsx +74 -66
  50. package/dist/routes.ts +0 -7
  51. package/dist/services/api.ts +8 -4
  52. package/dist/store/reducers/clusterNodes/clusterNodes.tsx +4 -0
  53. package/dist/store/reducers/index.ts +6 -4
  54. package/dist/store/reducers/{network.js → network/network.ts} +11 -8
  55. package/dist/store/reducers/network/types.ts +16 -0
  56. package/dist/store/reducers/node/node.ts +102 -0
  57. package/dist/store/reducers/node/selectors.ts +59 -0
  58. package/dist/store/reducers/node/types.ts +44 -0
  59. package/dist/store/reducers/overview/overview.ts +109 -0
  60. package/dist/store/reducers/overview/types.ts +24 -0
  61. package/dist/store/reducers/{schema.ts → schema/schema.ts} +24 -50
  62. package/dist/{types/store/schema.ts → store/reducers/schema/types.ts} +16 -15
  63. package/dist/store/reducers/{schemaAcl.js → schemaAcl/schemaAcl.ts} +20 -9
  64. package/dist/store/reducers/schemaAcl/types.ts +15 -0
  65. package/dist/store/reducers/settings/settings.ts +5 -3
  66. package/dist/types/api/acl.ts +1 -1
  67. package/dist/types/api/query.ts +78 -44
  68. package/dist/types/store/explainQuery.ts +2 -2
  69. package/dist/types/store/query.ts +4 -2
  70. package/dist/utils/constants.ts +3 -1
  71. package/dist/utils/nodes.ts +1 -1
  72. package/dist/utils/query.ts +3 -3
  73. package/package.json +1 -1
  74. package/dist/components/PoolUsage/PoolUsage.js +0 -54
  75. package/dist/store/reducers/node.js +0 -141
@@ -24,17 +24,17 @@ interface TKqpStatsCompile {}
24
24
  interface TDqTableStats {
25
25
  TablePath?: string;
26
26
  /** uint64 */
27
- ReadRows?: string;
27
+ ReadRows?: string | number;
28
28
  /** uint64 */
29
- ReadBytes?: string;
29
+ ReadBytes?: string | number;
30
30
  /** uint64 */
31
- WriteRows?: string;
31
+ WriteRows?: string | number;
32
32
  /** uint64 */
33
- WriteBytes?: string;
33
+ WriteBytes?: string | number;
34
34
  /** uint64 */
35
- EraseRows?: string;
35
+ EraseRows?: string | number;
36
36
  /** uint64 */
37
- EraseBytes?: string;
37
+ EraseBytes?: string | number;
38
38
  AffectedPartitions?: number;
39
39
  Extra?: unknown;
40
40
  }
@@ -42,24 +42,24 @@ interface TDqTableStats {
42
42
  /** source: https://github.com/ydb-platform/ydb/blob/main/ydb/library/yql/dq/actors/protos/dq_stats.proto */
43
43
  interface TDqExecutionStats {
44
44
  /** uint64 */
45
- CpuTimeUs?: string;
45
+ CpuTimeUs?: string | number;
46
46
  /** uint64 */
47
- DurationUs?: string;
47
+ DurationUs?: string | number;
48
48
  /** uint64 */
49
- ResultRows?: string;
49
+ ResultRows?: string | number;
50
50
  /** uint64 */
51
- ResultBytes?: string;
51
+ ResultBytes?: string | number;
52
52
 
53
53
  Tables?: TDqTableStats[];
54
54
 
55
55
  /** uint64 */
56
- ExecuterCpuTimeUs?: string;
56
+ ExecuterCpuTimeUs?: string | number;
57
57
  /** uint64 */
58
- StartTimeMs?: string;
58
+ StartTimeMs?: string | number;
59
59
  /** uint64 */
60
- FinishTimeMs?: string;
60
+ FinishTimeMs?: string | number;
61
61
  /** uint64 */
62
- FirstRowTimeMs?: string;
62
+ FirstRowTimeMs?: string | number;
63
63
 
64
64
  Stages?: TDqStageStats[];
65
65
  TxPlansWithStats?: string[];
@@ -70,17 +70,17 @@ interface TDqExecutionStats {
70
70
  /** source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/protos/kqp_stats.proto */
71
71
  export interface TKqpStatsQuery {
72
72
  /** uint64 */
73
- DurationUs?: string;
73
+ DurationUs?: string | number;
74
74
  Compilation?: TKqpStatsCompile;
75
75
 
76
76
  /** uint64 */
77
- WorkerCpuTimeUs?: string;
77
+ WorkerCpuTimeUs?: string | number;
78
78
  /** uint64 */
79
- ReadSetsCount?: string;
79
+ ReadSetsCount?: string | number;
80
80
  /** uint64 */
81
- MaxShardProgramSize?: string;
81
+ MaxShardProgramSize?: string | number;
82
82
  /** uint64 */
83
- MaxShardReplySize?: string;
83
+ MaxShardReplySize?: string | number;
84
84
 
85
85
  Executions?: TDqExecutionStats[];
86
86
  }
@@ -120,6 +120,10 @@ interface PlanNodeStats {
120
120
  TotalOutputBytes?: number;
121
121
  TotalDurationMs?: number;
122
122
  TotalOutputRows?: number;
123
+
124
+ ComputeNodes?: unknown[];
125
+ NodesScanShards?: unknown[];
126
+ UseLlvm?: unknown;
123
127
  }
124
128
 
125
129
  interface PlanNodeOperator {
@@ -128,6 +132,7 @@ interface PlanNodeOperator {
128
132
  ReadLimit?: string;
129
133
  ReadColumns?: string[];
130
134
  ReadRanges?: string[];
135
+ ReadRange?: string[];
131
136
  Table?: string;
132
137
  Iterator?: string;
133
138
  }
@@ -153,7 +158,7 @@ export interface ScriptPlan {
153
158
  meta: PlanMeta;
154
159
  }
155
160
 
156
- export interface ScanPlan {
161
+ export interface QueryPlan {
157
162
  Plan?: PlanNode;
158
163
  tables?: PlanTable[];
159
164
  meta: PlanMeta;
@@ -177,15 +182,22 @@ export interface ColumnType {
177
182
  /** undefined = 'classic' */
178
183
  export type Schemas = 'classic' | 'modern' | 'ydb' | undefined;
179
184
 
180
- /**
181
- * undefined = 'execute'
182
- *
183
- * execute and execute-script have similar responses
184
- */
185
- export type ExecuteActions = 'execute' | 'execute-scan' | 'execute-script' | undefined;
186
-
187
- /** explain, explain-scan and explain-ast have similar responses */
188
- export type ExplainActions = 'explain' | 'explain-scan' | 'explain-script' | 'explain-ast';
185
+ /** undefined = 'execute' */
186
+ export type ExecuteActions =
187
+ | 'execute'
188
+ | 'execute-scan'
189
+ | 'execute-script'
190
+ | 'execute-data'
191
+ | 'execute-query'
192
+ | undefined;
193
+
194
+ export type ExplainActions =
195
+ | 'explain'
196
+ | 'explain-scan'
197
+ | 'explain-script'
198
+ | 'explain-data'
199
+ | 'explain-query'
200
+ | 'explain-ast';
189
201
 
190
202
  export type Actions = ExecuteActions | ExplainActions;
191
203
 
@@ -197,19 +209,27 @@ export interface ErrorResponse {
197
209
  }
198
210
 
199
211
  // ==== Explain Responses ====
200
-
212
+ /**
213
+ * meta.type = 'script'
214
+ *
215
+ * explain-script
216
+ */
201
217
  export interface ExplainScriptResponse {
202
218
  plan?: ScriptPlan;
203
219
  }
204
-
205
- export interface ExplainScanResponse {
220
+ /**
221
+ * meta.type = 'query'
222
+ *
223
+ * explain, explain-scan, explain-data, explain-query, explain-ast
224
+ */
225
+ export interface ExplainQueryResponse {
206
226
  ast?: string;
207
- plan?: ScanPlan;
227
+ plan?: QueryPlan;
208
228
  }
209
229
 
210
230
  export type ExplainResponse<Action extends ExplainActions> = Action extends 'explain-script'
211
231
  ? ExplainScriptResponse
212
- : ExplainScanResponse;
232
+ : ExplainQueryResponse;
213
233
 
214
234
  // ==== Execute Responses ====
215
235
 
@@ -222,22 +242,34 @@ type ResultFields<Schema extends Schemas> = Schema extends 'modern'
222
242
  result?: KeyValueRow[];
223
243
  };
224
244
 
225
- export type ExecuteScanResponse<Schema extends Schemas> = {
226
- plan?: ScanPlan;
245
+ /**
246
+ * meta.type = 'query'
247
+ *
248
+ * execute-scan, execute-data, execute-query
249
+ */
250
+ export type ExecuteQueryResponse<Schema extends Schemas> = {
251
+ plan?: QueryPlan;
227
252
  ast?: string;
228
253
  stats?: TKqpStatsQuery;
229
254
  } & ResultFields<Schema>;
230
255
 
256
+ /**
257
+ * meta.type = 'script'
258
+ *
259
+ * execute, execute-script
260
+ */
231
261
  export type ExecuteScriptResponse<Schema extends Schemas> = {
232
262
  plan?: ScriptPlan;
233
263
  ast?: string;
234
264
  stats?: TKqpStatsQuery;
235
265
  } & ResultFields<Schema>;
236
266
 
237
- export type ExecuteResponse<
238
- Action extends ExecuteActions,
239
- Schema extends Schemas,
240
- > = Action extends 'execute-scan' ? ExecuteScanResponse<Schema> : ExecuteScriptResponse<Schema>;
267
+ export type ExecuteResponse<Action extends ExecuteActions, Schema extends Schemas> = Action extends
268
+ | 'execute-scan'
269
+ | 'execute-data'
270
+ | 'execute-query'
271
+ ? ExecuteQueryResponse<Schema>
272
+ : ExecuteScriptResponse<Schema>;
241
273
 
242
274
  // ==== Combined API response ====
243
275
  export type QueryAPIResponse<
@@ -250,13 +282,15 @@ export type QueryAPIResponse<
250
282
  : unknown;
251
283
 
252
284
  // ==== types to use in query result preparation ====
253
- export type AnyExplainResponse = ExplainScanResponse | ExplainScriptResponse;
285
+ export type AnyExplainResponse = ExplainQueryResponse | ExplainScriptResponse;
254
286
 
255
- export type ExecuteModernResponse = ExecuteScanResponse<'modern'> | ExecuteScriptResponse<'modern'>;
287
+ export type ExecuteModernResponse =
288
+ | ExecuteQueryResponse<'modern'>
289
+ | ExecuteScriptResponse<'modern'>;
256
290
  export type ExecuteClassicResponse =
257
- | ExecuteScanResponse<'classic'>
291
+ | ExecuteQueryResponse<'classic'>
258
292
  | ExecuteScriptResponse<'classic'>;
259
- export type ExecuteYdbResponse = ExecuteScanResponse<'ydb'> | ExecuteScriptResponse<'ydb'>;
293
+ export type ExecuteYdbResponse = ExecuteQueryResponse<'ydb'> | ExecuteScriptResponse<'ydb'>;
260
294
 
261
295
  export type AnyExecuteResponse =
262
296
  | ExecuteModernResponse
@@ -2,7 +2,7 @@ import type {ExplainPlanNodeData, GraphNode, Link} from '@gravity-ui/paranoid';
2
2
 
3
3
  import {GET_EXPLAIN_QUERY, GET_EXPLAIN_QUERY_AST} from '../../store/reducers/explainQuery';
4
4
  import type {ApiRequestAction} from '../../store/utils';
5
- import type {PlanTable, ErrorResponse, ScanPlan, ScriptPlan} from '../api/query';
5
+ import type {PlanTable, ErrorResponse, QueryPlan, ScriptPlan} from '../api/query';
6
6
  import type {IQueryResult, QueryError} from './query';
7
7
 
8
8
  export interface PreparedExplainResponse {
@@ -11,7 +11,7 @@ export interface PreparedExplainResponse {
11
11
  nodes?: GraphNode<ExplainPlanNodeData>[];
12
12
  tables?: PlanTable[];
13
13
  version?: string;
14
- pristine?: ScanPlan | ScriptPlan;
14
+ pristine?: QueryPlan | ScriptPlan;
15
15
  };
16
16
  ast?: string;
17
17
  }
@@ -4,7 +4,7 @@ import type {
4
4
  ColumnType,
5
5
  ErrorResponse,
6
6
  ScriptPlan,
7
- ScanPlan,
7
+ QueryPlan,
8
8
  TKqpStatsQuery,
9
9
  } from '../api/query';
10
10
 
@@ -12,7 +12,7 @@ export interface IQueryResult {
12
12
  result?: KeyValueRow[];
13
13
  columns?: ColumnType[];
14
14
  stats?: TKqpStatsQuery;
15
- plan?: ScriptPlan | ScanPlan;
15
+ plan?: ScriptPlan | QueryPlan;
16
16
  ast?: string;
17
17
  }
18
18
 
@@ -26,4 +26,6 @@ export type QueryError = NetworkError | ErrorResponse;
26
26
  export enum QueryModes {
27
27
  scan = 'scan',
28
28
  script = 'script',
29
+ data = 'data',
30
+ query = 'query',
29
31
  }
@@ -78,7 +78,7 @@ export const COLORS_PRIORITY = {
78
78
  export const THEME_KEY = 'theme';
79
79
  export const INVERTED_DISKS_KEY = 'invertedDisks';
80
80
  export const USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY = 'useNodesEndpointInDiagnostics';
81
- export const ENABLE_QUERY_MODES_FOR_EXPLAIN = 'enableQueryModesForExplain';
81
+ export const ENABLE_ADDITIONAL_QUERY_MODES = 'enableAdditionalQueryModes';
82
82
  export const SAVED_QUERIES_KEY = 'saved_queries';
83
83
  export const ASIDE_HEADER_COMPACT_KEY = 'asideHeaderCompact';
84
84
  export const QUERIES_HISTORY_KEY = 'queries_history';
@@ -106,3 +106,5 @@ export const TENANT_INITIAL_TAB_KEY = 'saved_tenant_initial_tab';
106
106
  export const QUERY_INITIAL_MODE_KEY = 'query_initial_mode';
107
107
 
108
108
  export const PARTITIONS_HIDDEN_COLUMNS_KEY = 'partitionsHiddenColumns';
109
+
110
+ export const CLUSTER_INFO_HIDDEN_KEY = 'clusterInfoHidden';
@@ -20,7 +20,7 @@ export const isUnavailableNode = (node: INodesPreparedEntity | TSystemStateInfo)
20
20
  export type NodeAddress = Pick<TSystemStateInfo, 'Host' | 'Endpoints'>;
21
21
 
22
22
  export interface AdditionalNodesInfo extends Record<string, unknown> {
23
- getNodeRef?: (node?: NodeAddress) => string;
23
+ getNodeRef?: (node?: NodeAddress) => string | null;
24
24
  }
25
25
 
26
26
  export const prepareNodesMap = (nodesList?: TNodeInfo[]) => {
@@ -4,7 +4,7 @@ import type {
4
4
  AnyExplainResponse,
5
5
  ExecuteModernResponse,
6
6
  KeyValueRow,
7
- ScanPlan,
7
+ QueryPlan,
8
8
  ScriptPlan,
9
9
  } from '../types/api/query';
10
10
  import type {IQueryResult} from '../types/store/query';
@@ -115,10 +115,10 @@ export const parseQueryAPIExplainResponse = (
115
115
  return data;
116
116
  };
117
117
 
118
- const isExplainScriptPlan = (plan: ScriptPlan | ScanPlan): plan is ScriptPlan =>
118
+ const isExplainScriptPlan = (plan: ScriptPlan | QueryPlan): plan is ScriptPlan =>
119
119
  Boolean(plan && 'queries' in plan);
120
120
 
121
- export const parseQueryExplainPlan = (plan: ScriptPlan | ScanPlan): ScanPlan => {
121
+ export const parseQueryExplainPlan = (plan: ScriptPlan | QueryPlan): QueryPlan => {
122
122
  if (isExplainScriptPlan(plan)) {
123
123
  if (!plan.queries || !plan.queries.length) {
124
124
  return {meta: plan.meta};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ydb-embedded-ui",
3
- "version": "4.5.1",
3
+ "version": "4.6.0",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -1,54 +0,0 @@
1
- import React from 'react';
2
- import cn from 'bem-cn-lite';
3
- import './PoolUsage.scss';
4
- import PropTypes from 'prop-types';
5
- const b = cn('pool-usage');
6
-
7
- const formatUsage = (usage) => (typeof usage === 'undefined' ? '' : Math.floor(usage * 100));
8
- const getLineType = (fillWidth) => {
9
- let fillColor = 'green';
10
- if (fillWidth > 60 && fillWidth <= 80) {
11
- fillColor = 'yellow';
12
- } else if (fillWidth > 80) {
13
- fillColor = 'red';
14
- }
15
-
16
- return fillColor;
17
- };
18
- export class PoolUsage extends React.Component {
19
- static propTypes = {
20
- data: PropTypes.object.isRequired,
21
- };
22
-
23
- render() {
24
- const {data: pool = {}} = this.props;
25
-
26
- const {Threads, Name = 'Unknown', Usage} = pool;
27
- const dataExist = Usage && Threads;
28
-
29
- const value = formatUsage(pool.Usage);
30
- const fillWidth = value > 100 ? 100 : value;
31
-
32
- return (
33
- <div className={b()}>
34
- <div className={b('info')}>
35
- <div className={b('pool-name')}>{Name}</div>
36
- {dataExist && (
37
- <div className={b('value')}>
38
- <div className={b('percents')}>{value < 1 ? '<1' : value}%</div>
39
- <div className={b('threads')}>(×{Threads})</div>
40
- </div>
41
- )}
42
- </div>
43
- <div className={b('visual')}>
44
- <div
45
- className={b('usage-line', {type: getLineType(fillWidth)})}
46
- style={{width: `${fillWidth}%`}}
47
- />
48
- </div>
49
- </div>
50
- );
51
- }
52
- }
53
-
54
- export default PoolUsage;
@@ -1,141 +0,0 @@
1
- import {createRequestActionTypes, createApiRequest} from '../utils';
2
- import '../../services/api';
3
- import {stringifyVdiskId} from '../../utils';
4
- import {createSelector} from 'reselect';
5
-
6
- const FETCH_NODE = createRequestActionTypes('node', 'FETCH_NODE');
7
- const FETCH_NODE_STRUCTURE = createRequestActionTypes('node', 'FETCH_NODE_STRUCTURE');
8
- const RESET_NODE = 'node/RESET_NODE';
9
-
10
- const node = (
11
- state = {
12
- data: {},
13
- loading: true,
14
- wasLoaded: false,
15
- nodeStructure: {},
16
- loadingStructure: true,
17
- wasLoadedStructure: false,
18
- },
19
- action,
20
- ) => {
21
- switch (action.type) {
22
- case FETCH_NODE.REQUEST: {
23
- return {
24
- ...state,
25
- loading: true,
26
- };
27
- }
28
- case FETCH_NODE.SUCCESS: {
29
- return {
30
- ...state,
31
- data: action.data,
32
- loading: false,
33
- wasLoaded: true,
34
- error: undefined,
35
- };
36
- }
37
- case FETCH_NODE.FAILURE: {
38
- return {
39
- ...state,
40
- error: action.error,
41
- loading: false,
42
- };
43
- }
44
- case FETCH_NODE_STRUCTURE.REQUEST: {
45
- return {
46
- ...state,
47
- loadingStructure: true,
48
- };
49
- }
50
- case FETCH_NODE_STRUCTURE.SUCCESS: {
51
- return {
52
- ...state,
53
- nodeStructure: action.data,
54
- loadingStructure: false,
55
- wasLoadedStructure: true,
56
- errorStructure: undefined,
57
- };
58
- }
59
- case FETCH_NODE_STRUCTURE.FAILURE: {
60
- return {
61
- ...state,
62
- errorStructure: action.error,
63
- loadingStructure: false,
64
- };
65
- }
66
- case RESET_NODE: {
67
- return {
68
- ...state,
69
- data: {},
70
- wasLoaded: false,
71
- nodeStructure: {},
72
- wasLoadedStructure: false,
73
- };
74
- }
75
- default:
76
- return state;
77
- }
78
- };
79
-
80
- export const getNodeInfo = (id) => {
81
- return createApiRequest({
82
- request: window.api.getNodeInfo(id),
83
- actions: FETCH_NODE,
84
- });
85
- };
86
-
87
- export const getNodeStructure = (nodeId) => {
88
- return createApiRequest({
89
- request: window.api.getStorageInfo({nodeId}, {concurrentId: 'getNodeStructure'}),
90
- actions: FETCH_NODE_STRUCTURE,
91
- });
92
- };
93
-
94
- export function resetNode() {
95
- return {
96
- type: RESET_NODE,
97
- };
98
- }
99
-
100
- const getNodeId = (state) => state.node?.data?.SystemStateInfo?.[0].NodeId;
101
-
102
- const getRawNodeStructure = (state) => state.node?.nodeStructure;
103
-
104
- export const selectNodeStructure = createSelector(
105
- [getNodeId, getRawNodeStructure],
106
- (nodeId, rawNodeStructure) => {
107
- const pools = rawNodeStructure?.StoragePools;
108
- const structure = {};
109
- pools?.forEach((pool) => {
110
- const groups = pool.Groups;
111
- groups?.forEach((group) => {
112
- const vDisks = group.VDisks?.filter((el) => el.NodeId === nodeId);
113
- vDisks?.forEach((vd) => {
114
- const vDiskId = stringifyVdiskId(vd.VDiskId);
115
- const pDiskId = vd.PDisk?.PDiskId;
116
- if (!structure[String(pDiskId)]) {
117
- structure[String(pDiskId)] = {vDisks: {}, ...vd.PDisk};
118
- }
119
- structure[String(pDiskId)].vDisks[vDiskId] = {
120
- ...vd,
121
- // VDisk doesn't have its own StoragePoolName when located inside StoragePool data
122
- StoragePoolName: pool.Name,
123
- };
124
- });
125
- });
126
- });
127
-
128
- const structureWithVdisksArray = Object.keys(structure).reduce((acc, el) => {
129
- const vDisks = structure[el].vDisks;
130
- const vDisksArray = Object.keys(vDisks).reduce((acc, key, index) => {
131
- acc.push({...vDisks[key], id: key, order: index});
132
- return acc;
133
- }, []);
134
- acc[el] = {...structure[el], vDisks: vDisksArray};
135
- return acc;
136
- }, {});
137
- return structureWithVdisksArray;
138
- },
139
- );
140
-
141
- export default node;