ydb-embedded-ui 4.5.1 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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;