ydb-embedded-ui 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/assets/icons/question.svg +1 -0
  3. package/dist/components/ClusterInfo/ClusterInfo.tsx +8 -4
  4. package/dist/components/FullNodeViewer/FullNodeViewer.scss +4 -9
  5. package/dist/components/InfoViewer/InfoViewer.scss +3 -2
  6. package/dist/components/InternalLink/InternalLink.js +8 -0
  7. package/dist/components/Loader/Loader.scss +5 -0
  8. package/dist/components/Loader/Loader.tsx +16 -0
  9. package/dist/components/PDiskViewer/PDiskViewer.js +3 -4
  10. package/dist/containers/App/App.scss +4 -0
  11. package/dist/containers/App/Content.js +0 -2
  12. package/dist/containers/AppIcons/AppIcons.js +4 -0
  13. package/dist/containers/Authentication/Authentication.tsx +1 -1
  14. package/dist/containers/Cluster/Cluster.tsx +1 -1
  15. package/dist/containers/Header/Header.tsx +6 -1
  16. package/dist/containers/Heatmap/Heatmap.js +0 -1
  17. package/dist/containers/Node/Node.scss +12 -1
  18. package/dist/containers/Node/Node.tsx +187 -0
  19. package/dist/containers/Node/NodeOverview/NodeOverview.scss +0 -0
  20. package/dist/containers/Node/NodeOverview/NodeOverview.tsx +23 -0
  21. package/dist/containers/Node/NodePages.js +16 -0
  22. package/dist/containers/Node/NodeStructure/NodeStructure.scss +148 -0
  23. package/dist/containers/Node/NodeStructure/NodeStructure.tsx +153 -0
  24. package/dist/containers/Node/NodeStructure/Pdisk.tsx +299 -0
  25. package/dist/containers/Node/NodeStructure/Vdisk.tsx +153 -0
  26. package/dist/containers/Pdisk/Pdisk.js +2 -5
  27. package/dist/containers/Storage/DiskStateProgressBar/DiskStateProgressBar.scss +10 -3
  28. package/dist/containers/Storage/DiskStateProgressBar/DiskStateProgressBar.tsx +20 -15
  29. package/dist/containers/Storage/Pdisk/Pdisk.scss +1 -0
  30. package/dist/containers/Storage/Pdisk/Pdisk.tsx +7 -5
  31. package/dist/containers/Storage/Storage.js +12 -9
  32. package/dist/containers/Storage/StorageGroups/StorageGroups.scss +2 -1
  33. package/dist/containers/Storage/StorageGroups/StorageGroups.tsx +5 -2
  34. package/dist/containers/Storage/StorageNodes/StorageNodes.scss +3 -2
  35. package/dist/containers/Storage/StorageNodes/StorageNodes.tsx +7 -2
  36. package/dist/containers/Storage/Vdisk/Vdisk.js +7 -6
  37. package/dist/containers/Storage/Vdisk/Vdisk.scss +1 -0
  38. package/dist/containers/Tablet/Tablet.js +2 -7
  39. package/dist/containers/Tablets/Tablets.js +4 -12
  40. package/dist/containers/Tenant/Acl/Acl.js +0 -3
  41. package/dist/containers/Tenant/Diagnostics/Compute/Compute.js +1 -3
  42. package/dist/containers/Tenant/Diagnostics/Network/Network.js +3 -6
  43. package/dist/containers/Tenant/ObjectSummary/ObjectSummary.scss +1 -0
  44. package/dist/containers/Tenant/ObjectSummary/ObjectSummary.tsx +1 -1
  45. package/dist/containers/Tenant/QueryEditor/QueryEditor.js +26 -33
  46. package/dist/containers/Tenant/QueryEditor/QueryEditor.scss +4 -0
  47. package/dist/containers/Tenant/QueryEditor/QueryExplain/QueryExplain.js +29 -22
  48. package/dist/containers/Tenant/QueryEditor/QueryExplain/QueryExplain.scss +1 -0
  49. package/dist/containers/Tenant/QueryEditor/QueryResult/QueryResult.scss +2 -0
  50. package/dist/containers/Vdisk/Vdisk.js +2 -4
  51. package/dist/containers/VdiskPdiskNode/VdiskPdiskNode.js +4 -6
  52. package/dist/services/api.js +0 -1
  53. package/dist/store/reducers/executeQuery.js +5 -2
  54. package/dist/store/reducers/header.ts +1 -1
  55. package/dist/store/reducers/node.js +98 -3
  56. package/dist/store/reducers/nodes.js +0 -3
  57. package/dist/store/reducers/storage.js +6 -0
  58. package/dist/store/reducers/tablets.js +0 -3
  59. package/dist/utils/constants.js +0 -6
  60. package/dist/utils/getNodesColumns.js +2 -9
  61. package/dist/utils/utils.js +10 -1
  62. package/package.json +44 -33
  63. package/dist/containers/Node/Node.js +0 -184
@@ -5,8 +5,7 @@ import cn from 'bem-cn-lite';
5
5
  import _ from 'lodash';
6
6
  import MonacoEditor from 'react-monaco-editor';
7
7
  import DataTable from '@yandex-cloud/react-data-table';
8
- import {Button} from '@yandex-cloud/uikit';
9
- import {Select} from '@yandex-cloud/uikit/build/esm/components/unstable/Select';
8
+ import {Button, DropdownMenu} from '@yandex-cloud/uikit';
10
9
  import SplitPane from '../../../components/SplitPane';
11
10
 
12
11
  import SaveQuery from './SaveQuery/SaveQuery';
@@ -154,7 +153,7 @@ function QueryEditor(props) {
154
153
  useEffect(() => {
155
154
  const {monacoHotKey, setMonacoHotKey} = props;
156
155
  if (monacoHotKey === null) {
157
- return
156
+ return;
158
157
  }
159
158
  setMonacoHotKey(null);
160
159
  switch (monacoHotKey) {
@@ -340,6 +339,7 @@ function QueryEditor(props) {
340
339
  data={preparedData}
341
340
  settings={TABLE_SETTINGS}
342
341
  theme="yandex-cloud"
342
+ rowKey={(_, index) => index}
343
343
  />
344
344
  ) : (
345
345
  <div>{result}</div>
@@ -464,19 +464,12 @@ function QueryEditor(props) {
464
464
  };
465
465
 
466
466
  const getExecuteResult = () => {
467
- const {
468
- data = [],
469
- error,
470
- loading,
471
- history: {queries},
472
- } = props.executeQuery;
467
+ const {data = [], error} = props.executeQuery;
473
468
 
474
469
  if (error) {
475
470
  return error.data || error;
476
471
  } else if (data.length > 0) {
477
472
  return data;
478
- } else if (!loading && queries.length) {
479
- return 'The request was successful';
480
473
  } else {
481
474
  return '';
482
475
  }
@@ -559,10 +552,18 @@ function QueryEditor(props) {
559
552
  };
560
553
 
561
554
  const renderControls = () => {
562
- const {executeQuery, explainQuery, savedQueries} = props;
555
+ const {executeQuery, explainQuery, savedQueries, selectRunAction} = props;
563
556
  const {runAction} = executeQuery;
564
557
  const runIsDisabled = !executeQuery.input || executeQuery.loading;
565
558
  const runText = _.find(RUN_ACTIONS, {value: runAction}).content;
559
+
560
+ const menuItems = RUN_ACTIONS.map((action) => {
561
+ return {
562
+ text: action.content,
563
+ action: () => selectRunAction(action.value),
564
+ };
565
+ });
566
+
566
567
  return (
567
568
  <div className={b('controls')}>
568
569
  <div className={b('control-run')}>
@@ -576,27 +577,19 @@ function QueryEditor(props) {
576
577
  <Icon name="startPlay" viewBox="0 0 16 16" width={16} height={16} />
577
578
  {runText}
578
579
  </Button>
579
- <Select
580
- view="action"
581
- options={RUN_ACTIONS}
582
- value={undefined}
583
- disabled={runIsDisabled}
584
- pin="brick-round"
585
- // renderSwitcher={() => (
586
- // <div className={b('run-switcher')}>
587
- // <Button
588
- // view="action"
589
- // pin="brick-round"
590
- // disabled={runIsDisabled}
591
- // loading={executeQuery.loading}
592
- // >
593
- // <Icon name="chevron-down" width={16} height={16} />
594
- // </Button>
595
- // </div>
596
- // )}
597
- onUpdate={(value) => {
598
- props.selectRunAction(value[0]);
599
- }}
580
+ <DropdownMenu
581
+ items={menuItems}
582
+ switcher={
583
+ <Button
584
+ view="action"
585
+ pin="brick-round"
586
+ disabled={runIsDisabled}
587
+ loading={executeQuery.loading}
588
+ className={b('select-query-action')}
589
+ >
590
+ <Icon name="chevron-down" width={16} height={16} />
591
+ </Button>
592
+ }
600
593
  />
601
594
  </div>
602
595
  <Button
@@ -97,4 +97,8 @@
97
97
  &__cell {
98
98
  @include cell-container;
99
99
  }
100
+
101
+ &__select-query-action {
102
+ margin-left: 2px;
103
+ }
100
104
  }
@@ -72,6 +72,9 @@ function GraphRoot(props) {
72
72
  paranoid = getCompactTopology('graphRoot', data, opts);
73
73
  paranoid.renderCompactTopology();
74
74
  }
75
+ return () => {
76
+ paranoid = undefined;
77
+ };
75
78
  }, []);
76
79
 
77
80
  useEffect(() => {
@@ -89,7 +92,7 @@ function GraphRoot(props) {
89
92
  }, [props.opts.colors]);
90
93
 
91
94
  useEffect(() => {
92
- paranoid.updateData(props.data);
95
+ paranoid?.updateData(props.data);
93
96
  }, [props.data]);
94
97
 
95
98
  return <div id="graphRoot" style={{height: '100vh'}} />;
@@ -252,28 +255,32 @@ function QueryExplain(props) {
252
255
  return (
253
256
  <React.Fragment>
254
257
  <div className={b('controls')}>
255
- <div className={b('controls-right')}>
256
- <QueryExecutionStatus hasError={Boolean(props.error)} />
257
- {!props.error && (
258
- <React.Fragment>
259
- <Divider />
260
- <RadioButton
261
- options={explainOptions}
262
- value={activeOption}
263
- onUpdate={onSelectOption}
258
+ {!props.loading && (
259
+ <React.Fragment>
260
+ <div className={b('controls-right')}>
261
+ <QueryExecutionStatus hasError={Boolean(props.error)} />
262
+ {!props.error && (
263
+ <React.Fragment>
264
+ <Divider />
265
+ <RadioButton
266
+ options={explainOptions}
267
+ value={activeOption}
268
+ onUpdate={onSelectOption}
269
+ />
270
+ </React.Fragment>
271
+ )}
272
+ </div>
273
+ <div className={b('controls-left')}>
274
+ <EnableFullscreenButton disabled={Boolean(props.error)} />
275
+ <PaneVisibilityToggleButtons
276
+ onCollapse={props.onCollapseResults}
277
+ onExpand={props.onExpandResults}
278
+ isCollapsed={props.isResultsCollapsed}
279
+ initialDirection="bottom"
264
280
  />
265
- </React.Fragment>
266
- )}
267
- </div>
268
- <div className={b('controls-left')}>
269
- <EnableFullscreenButton disabled={Boolean(props.error)} />
270
- <PaneVisibilityToggleButtons
271
- onCollapse={props.onCollapseResults}
272
- onExpand={props.onExpandResults}
273
- isCollapsed={props.isResultsCollapsed}
274
- initialDirection="bottom"
275
- />
276
- </div>
281
+ </div>
282
+ </React.Fragment>
283
+ )}
277
284
  </div>
278
285
  <div className={b('result')}>{renderContent()}</div>
279
286
  </React.Fragment>
@@ -19,6 +19,7 @@
19
19
  justify-content: space-between;
20
20
  align-items: center;
21
21
 
22
+ height: 53px;
22
23
  padding: 12px 20px;
23
24
 
24
25
  border-bottom: 1px solid var(--yc-color-line-generic);
@@ -15,6 +15,7 @@
15
15
  }
16
16
  &_fullscreen {
17
17
  width: 100%;
18
+ margin-top: 0;
18
19
  padding: 10px;
19
20
  }
20
21
  }
@@ -28,6 +29,7 @@
28
29
  justify-content: space-between;
29
30
  align-items: center;
30
31
 
32
+ height: 53px;
31
33
  padding: 12px 20px;
32
34
 
33
35
  border-bottom: 1px solid var(--yc-color-line-generic);
@@ -13,6 +13,7 @@ import {getVdiskInfo, clearStore} from '../../store/reducers/vdisk';
13
13
  import {VDISK_AUTO_RELOAD_INTERVAL} from '../../utils/constants';
14
14
  import {formatBytes, calcUptime, stringifyVdiskId} from '../../utils';
15
15
  import routes, {createHref} from '../../routes';
16
+ import {getDefaultNodePath} from '../Node/NodePages';
16
17
 
17
18
  import './Vdisk.scss';
18
19
 
@@ -80,10 +81,7 @@ class Vdisk extends React.Component {
80
81
  {
81
82
  label: 'NodeId',
82
83
  value: (
83
- <Link
84
- className={b('link')}
85
- to={createHref(routes.node, {id: NodeId, activeTab: 'storage'})}
86
- >
84
+ <Link className={b('link')} to={getDefaultNodePath(NodeId)}>
87
85
  {NodeId}
88
86
  </Link>
89
87
  ),
@@ -20,6 +20,7 @@ import {getNodeInfo} from '../../store/reducers/node';
20
20
  import {calcUptime, stringifyVdiskId, formatStorageValuesToGb} from '../../utils';
21
21
  import routes, {createHref} from '../../routes';
22
22
  import {bytesToSpeed, bytesToGB} from '../../utils/utils';
23
+ import {getDefaultNodePath} from '../Node/NodePages';
23
24
 
24
25
  import './VdiskPdiskNode.scss';
25
26
 
@@ -29,7 +30,7 @@ function valueIsDefined(value) {
29
30
  return value !== null && value !== undefined;
30
31
  }
31
32
 
32
- function Vdisk({
33
+ export function Vdisk({
33
34
  AllocatedSize,
34
35
  DiskSpace,
35
36
  FrontQueues,
@@ -83,7 +84,7 @@ function Vdisk({
83
84
  value: <EntityStatus status={SatisfactionRank.LevelRank.Flag} />,
84
85
  });
85
86
  }
86
- vdiskInfo.push({label: 'Replicated', value: Replicated ? '' : ''});
87
+ vdiskInfo.push({label: 'Replicated', value: Replicated ? 'Yes' : 'No'});
87
88
  vdiskInfo.push({label: 'Allocated Size', value: bytesToGB(AllocatedSize)});
88
89
  vdiskInfo.push({label: 'Available Size', value: bytesToGB(AvailableSize)});
89
90
  if (Number(AllocatedSize) >= 0 && Number(AvailableSize) >= 0) {
@@ -329,10 +330,7 @@ class VdiskPdiskNode extends React.Component {
329
330
  {
330
331
  label: 'Node Id',
331
332
  value: (
332
- <Link
333
- className={b('link')}
334
- to={createHref(routes.node, {id: NodeId, activeTab: 'storage'})}
335
- >
333
+ <Link className={b('link')} to={getDefaultNodePath(NodeId)}>
336
334
  {NodeId}
337
335
  </Link>
338
336
  ),
@@ -26,7 +26,6 @@ export class YdbEmbeddedAPI extends AxiosWrapper {
26
26
  return this.get(this.getPath('/viewer/json/tenantinfo'), {
27
27
  tablets: 1,
28
28
  storage: 1,
29
- nodes: 1,
30
29
  });
31
30
  }
32
31
  getTenantInfo({path}) {
@@ -13,7 +13,7 @@ const GO_TO_NEXT_QUERY = 'query/GO_TO_NEXT_QUERY';
13
13
  const SELECT_RUN_ACTION = 'query/SELECT_RUN_ACTION';
14
14
  const MONACO_HOT_KEY = 'query/MONACO_HOT_KEY';
15
15
 
16
- const queriesHistoryInitial = parseJson(getValueFromLS(QUERIES_HISTORY_KEY, []));
16
+ const queriesHistoryInitial = parseJson(getValueFromLS(QUERIES_HISTORY_KEY, '[]'));
17
17
 
18
18
  const sliceLimit = queriesHistoryInitial.length - MAXIMUM_QUERIES_IN_HISTORY;
19
19
 
@@ -34,7 +34,10 @@ const initialState = {
34
34
  input: '',
35
35
  history: {
36
36
  queries: queriesHistoryInitial.slice(sliceLimit < 0 ? 0 : sliceLimit),
37
- currentIndex: -1,
37
+ currentIndex:
38
+ queriesHistoryInitial.length > MAXIMUM_QUERIES_IN_HISTORY
39
+ ? MAXIMUM_QUERIES_IN_HISTORY - 1
40
+ : queriesHistoryInitial.length - 1,
38
41
  },
39
42
  runAction: RUN_ACTIONS_VALUES.script,
40
43
  monacoHotKey: null,
@@ -1,6 +1,6 @@
1
1
  const SET_HEADER = 'SET_HEADER';
2
2
 
3
- export type HeaderItemType = {text: string; link: string};
3
+ export type HeaderItemType = {text: string; link?: string};
4
4
 
5
5
  const initialState: HeaderItemType[] = [];
6
6
 
@@ -1,9 +1,23 @@
1
1
  import {createRequestActionTypes, createApiRequest} from '../utils';
2
2
  import '../../services/api';
3
+ import {stringifyVdiskId} from '../../utils';
4
+ import {createSelector} from 'reselect';
3
5
 
4
- const FETCH_NODE = createRequestActionTypes('NODE', 'FETCH_NODE');
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';
5
9
 
6
- const NODE = (state = {data: {}, loading: true, wasLoaded: false}, action) => {
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
+ ) => {
7
21
  switch (action.type) {
8
22
  case FETCH_NODE.REQUEST: {
9
23
  return {
@@ -27,6 +41,37 @@ const NODE = (state = {data: {}, loading: true, wasLoaded: false}, action) => {
27
41
  loading: false,
28
42
  };
29
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
+ }
30
75
  default:
31
76
  return state;
32
77
  }
@@ -39,4 +84,54 @@ export const getNodeInfo = (id) => {
39
84
  });
40
85
  };
41
86
 
42
- export default NODE;
87
+ export const getNodeStructure = (nodeId) => {
88
+ return createApiRequest({
89
+ request: window.api.getStorageInfo({nodeId}),
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] = vd;
120
+ });
121
+ });
122
+ });
123
+
124
+ const structureWithVdisksArray = Object.keys(structure).reduce((acc, el) => {
125
+ const vDisks = structure[el].vDisks;
126
+ const vDisksArray = Object.keys(vDisks).reduce((acc, key, index) => {
127
+ acc.push({...vDisks[key], id: key, order: index});
128
+ return acc;
129
+ }, []);
130
+ acc[el] = {...structure[el], vDisks: vDisksArray};
131
+ return acc;
132
+ }, {});
133
+ return structureWithVdisksArray;
134
+ },
135
+ );
136
+
137
+ export default node;
@@ -1,6 +1,5 @@
1
1
  import {createRequestActionTypes, createApiRequest} from '../utils';
2
2
  import '../../services/api';
3
- import {AUTO_RELOAD_INTERVAL} from '../../utils/constants';
4
3
 
5
4
  const FETCH_NODES = createRequestActionTypes('nodes', 'FETCH_NODES');
6
5
 
@@ -14,13 +13,11 @@ const nodes = function z(state = {loading: true, wasLoaded: false}, action) {
14
13
  };
15
14
  }
16
15
  case FETCH_NODES.SUCCESS: {
17
- const timeout = new Date().getTime() - state.requestTime;
18
16
  return {
19
17
  ...state,
20
18
  data: action.data,
21
19
  loading: false,
22
20
  wasLoaded: true,
23
- timeoutForRequest: timeout > AUTO_RELOAD_INTERVAL ? timeout : AUTO_RELOAD_INTERVAL,
24
21
  error: undefined,
25
22
  };
26
23
  }
@@ -10,6 +10,12 @@ export const VisibleEntities = {
10
10
  Space: 'Space',
11
11
  };
12
12
 
13
+ export const VisibleEntitiesTitles = {
14
+ [VisibleEntities.All]: 'All',
15
+ [VisibleEntities.Missing]: 'Degraded',
16
+ [VisibleEntities.Space]: 'Out of Space',
17
+ };
18
+
13
19
  export const StorageTypes = {
14
20
  groups: 'Groups',
15
21
  nodes: 'Nodes',
@@ -1,6 +1,5 @@
1
1
  import {createRequestActionTypes, createApiRequest} from '../utils';
2
2
  import '../../services/api';
3
- import {AUTO_RELOAD_INTERVAL} from '../../utils/constants';
4
3
 
5
4
  const FETCH_TABLETS = createRequestActionTypes('tablets', 'FETCH_TABLETS');
6
5
 
@@ -21,12 +20,10 @@ const tablets = function z(state = initialState, action) {
21
20
  };
22
21
  }
23
22
  case FETCH_TABLETS.SUCCESS: {
24
- const timeout = new Date().getTime() - state.requestTime;
25
23
  return {
26
24
  ...state,
27
25
  data: action.data,
28
26
  loading: false,
29
- timeoutForRequest: timeout > AUTO_RELOAD_INTERVAL ? timeout : AUTO_RELOAD_INTERVAL,
30
27
  error: undefined,
31
28
  wasLoaded: true,
32
29
  };
@@ -2,16 +2,10 @@ import DataTable from '@yandex-cloud/react-data-table';
2
2
 
3
3
  const SECOND = 1000;
4
4
 
5
- export const CLUSTER_AUTO_RELOAD_INTERVAL = 10 * SECOND;
6
- export const TENANT_AUTO_RELOAD_INTERVAL = 10 * SECOND;
7
- export const TENANTS_AUTO_RELOAD_INTERVAL = 10 * SECOND;
8
- export const STORAGE_AUTO_RELOAD_INTERVAL = 10 * SECOND;
9
5
  export const GROUP_AUTO_RELOAD_INTERVAL = 10 * SECOND;
10
- export const NODE_AUTO_RELOAD_INTERVAL = 10 * SECOND;
11
6
  export const PDISK_AUTO_RELOAD_INTERVAL = 10 * SECOND;
12
7
  export const VDISK_AUTO_RELOAD_INTERVAL = 10 * SECOND;
13
8
  export const AUTO_RELOAD_INTERVAL = 10 * SECOND;
14
- export const HEALTHCHECK_RELOAD_INTERVAL = 10 * SECOND;
15
9
  export const MEGABYTE = 1_000_000;
16
10
  export const GIGABYTE = 1_000_000_000;
17
11
  export const TERABYTE = 1_000_000_000_000;
@@ -1,18 +1,15 @@
1
1
  import React from 'react';
2
2
  import cn from 'bem-cn-lite';
3
- import _ from 'lodash';
4
3
  import DataTable from '@yandex-cloud/react-data-table';
5
4
  import {Button, Tooltip} from '@yandex-cloud/uikit';
6
5
 
7
6
  import Icon from '../components/Icon/Icon';
8
7
  import EntityStatus from '../components/EntityStatus/EntityStatus';
9
- import {STORAGE_ROLE} from '../containers/Node/Node';
10
8
  import PoolsGraph from '../components/PoolsGraph/PoolsGraph';
11
9
  import ProgressViewer from '../components/ProgressViewer/ProgressViewer';
12
10
  import TabletsStatistic from '../components/TabletsStatistic/TabletsStatistic';
13
11
 
14
- import routes, {createHref} from '../routes';
15
- import {STORAGE, TABLETS} from '../containers/Node/NodePages';
12
+ import {getDefaultNodePath} from '../containers/Node/NodePages';
16
13
  import {formatBytes} from './index';
17
14
 
18
15
  const b = cn('kv-nodes');
@@ -28,7 +25,6 @@ export function getNodesColumns({showTooltip, hideTooltip, tabletsPath, getNodeR
28
25
  {
29
26
  name: 'Host',
30
27
  render: ({row, value}) => {
31
- const hasStorage = _.find(row?.Roles, (el) => el === STORAGE_ROLE);
32
28
  const nodeRef = getNodeRef ? getNodeRef(row) : undefined;
33
29
 
34
30
  if (typeof value === 'undefined') {
@@ -39,10 +35,7 @@ export function getNodesColumns({showTooltip, hideTooltip, tabletsPath, getNodeR
39
35
  <EntityStatus
40
36
  name={row.Host}
41
37
  status={row.Overall}
42
- path={createHref(routes.node, {
43
- id: row.NodeId,
44
- activeTab: hasStorage ? STORAGE : TABLETS,
45
- })}
38
+ path={getDefaultNodePath(row.NodeId)}
46
39
  hasClipboardButton
47
40
  className={b('host-name')}
48
41
  />
@@ -19,7 +19,7 @@ export function getValueFromLS(key, defaultValue) {
19
19
  return;
20
20
  }
21
21
 
22
- const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB'];
22
+ const sizes = [' B', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB'];
23
23
  const base = 1000;
24
24
 
25
25
  export function bytesToSize(bytes) {
@@ -73,3 +73,12 @@ export function bytesToGB(bytes, shouldRound) {
73
73
  return val.toFixed() + sizes[3];
74
74
  }
75
75
  }
76
+
77
+ export function pad9(val) {
78
+ const len = String(val).length;
79
+ let result = val
80
+ for (let i = len; i < 9; i++) {
81
+ result = "0" + result;
82
+ }
83
+ return result;
84
+ }