Skip to content

Commit 696d43a

Browse files
fix(Nodes): support v2 compute (#476)
1 parent 28b6c55 commit 696d43a

File tree

10 files changed

+113
-72
lines changed

10 files changed

+113
-72
lines changed

src/containers/Nodes/Nodes.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export const Nodes = ({path, type, additionalNodesInfo = {}}: NodesProps) => {
7171
// For not DB entities we always use /compute endpoint instead of /nodes
7272
// since /nodes can return data only for tenants
7373
if (path && (!useNodesEndpoint || !isDatabaseEntityType(type))) {
74-
dispatch(getComputeNodes(path));
74+
dispatch(getComputeNodes({path}));
7575
} else {
7676
dispatch(getNodes({tenant: path}));
7777
}

src/services/api.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import type {DescribeTopicResult} from '../types/api/topic';
2828
import type {TEvPDiskStateResponse} from '../types/api/pdisk';
2929
import type {TEvVDiskStateResponse} from '../types/api/vdisk';
3030
import type {TUserToken} from '../types/api/whoami';
31-
import type {NodesApiRequestParams} from '../store/reducers/nodes/types';
31+
import type {ComputeApiRequestParams, NodesApiRequestParams} from '../store/reducers/nodes/types';
3232
import type {StorageApiRequestParams} from '../store/reducers/storage/types';
3333

3434
import {backend as BACKEND} from '../store';
@@ -82,25 +82,24 @@ export class YdbEmbeddedAPI extends AxiosWrapper {
8282
});
8383
}
8484
getNodes(
85-
{tenant, visibleEntities, storage, type = 'any', tablets = true}: NodesApiRequestParams,
85+
{visibleEntities, type = 'any', tablets = true, ...params}: NodesApiRequestParams,
8686
{concurrentId}: AxiosOptions = {},
8787
) {
8888
return this.get<TNodesInfo>(
8989
this.getPath('/viewer/json/nodes?enums=true'),
9090
{
91-
tenant,
9291
with: visibleEntities,
93-
storage,
9492
type,
9593
tablets,
94+
...params,
9695
},
9796
{
9897
concurrentId,
9998
},
10099
);
101100
}
102-
getCompute(path: string) {
103-
return this.get<TComputeInfo>(this.getPath('/viewer/json/compute?enums=true'), {path});
101+
getCompute(params: ComputeApiRequestParams) {
102+
return this.get<TComputeInfo>(this.getPath('/viewer/json/compute?enums=true'), params);
104103
}
105104
getStorageInfo(
106105
{tenant, visibleEntities, nodeId}: StorageApiRequestParams,

src/store/reducers/nodes/nodes.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@ import type {Reducer} from 'redux';
22

33
import '../../../services/api';
44
import {NodesUptimeFilterValues} from '../../../utils/nodes';
5+
import {EVersion} from '../../../types/api/compute';
56

67
import {createRequestActionTypes, createApiRequest} from '../../utils';
78

8-
import type {NodesAction, NodesApiRequestParams, NodesState} from './types';
9+
import type {
10+
ComputeApiRequestParams,
11+
NodesAction,
12+
NodesApiRequestParams,
13+
NodesState,
14+
} from './types';
915
import {prepareComputeNodesData, prepareNodesData} from './utils';
1016

1117
export const FETCH_NODES = createRequestActionTypes('nodes', 'FETCH_NODES');
@@ -80,17 +86,20 @@ const nodes: Reducer<NodesState, NodesAction> = (state = initialState, action) =
8086
}
8187
};
8288

83-
export function getNodes({tenant, visibleEntities, type = 'any'}: NodesApiRequestParams) {
89+
export function getNodes({type = 'any', ...params}: NodesApiRequestParams) {
8490
return createApiRequest({
85-
request: window.api.getNodes({tenant, visibleEntities, type}),
91+
request: window.api.getNodes({
92+
type,
93+
...params,
94+
}),
8695
actions: FETCH_NODES,
8796
dataHandler: prepareNodesData,
8897
});
8998
}
9099

91-
export function getComputeNodes(path: string) {
100+
export function getComputeNodes({version = EVersion.v2, ...params}: ComputeApiRequestParams) {
92101
return createApiRequest({
93-
request: window.api.getCompute(path),
102+
request: window.api.getCompute({version, ...params}),
94103
actions: FETCH_NODES,
95104
dataHandler: prepareComputeNodesData,
96105
});

src/store/reducers/nodes/types.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import type {IResponseError} from '../../../types/api/error';
22
import type {TEndpoint, TPoolStats} from '../../../types/api/nodes';
3-
import type {TTabletStateInfo as TComputeTabletStateInfo} from '../../../types/api/compute';
3+
import type {
4+
EVersion,
5+
TTabletStateInfo as TComputeTabletStateInfo,
6+
} from '../../../types/api/compute';
47
import type {TTabletStateInfo as TFullTabletStateInfo} from '../../../types/api/tablet';
58
import type {EFlag} from '../../../types/api/enums';
69
import type {ApiRequestAction} from '../../utils';
@@ -46,17 +49,33 @@ export interface NodesState {
4649

4750
export type NodeType = 'static' | 'dynamic' | 'any';
4851

49-
export interface NodesApiRequestParams {
52+
interface RequestParams {
53+
filter?: string; // NodeId or Host
54+
uptime?: number; // return nodes with less uptime in seconds
55+
problems_only?: boolean; // return nodes with SystemState !== EFlag.Green
56+
sort?: string; // Sort by one of ESort params (may differ for /nodes and /compute)
57+
58+
offser?: number;
59+
limit?: number;
60+
}
61+
62+
export interface NodesApiRequestParams extends RequestParams {
5063
tenant?: string;
5164
type?: NodeType;
52-
visibleEntities?: VisibleEntities;
65+
visibleEntities?: VisibleEntities; // "with" param
5366
storage?: boolean;
5467
tablets?: boolean;
5568
}
5669

70+
export interface ComputeApiRequestParams extends RequestParams {
71+
path: string;
72+
version?: EVersion; // only v2 works with filters
73+
}
74+
5775
export interface NodesHandledResponse {
5876
Nodes?: NodesPreparedEntity[];
5977
TotalNodes: number;
78+
FoundNodes?: number;
6079
}
6180

6281
type NodesApiRequestAction = ApiRequestAction<

src/store/reducers/nodes/utils.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,40 @@
1-
import type {TComputeInfo} from '../../../types/api/compute';
1+
import type {TComputeInfo, TComputeNodeInfo} from '../../../types/api/compute';
22
import type {TNodesInfo} from '../../../types/api/nodes';
33
import {calcUptime} from '../../../utils';
44

55
import type {NodesHandledResponse, NodesPreparedEntity} from './types';
66

7+
const prepareComputeNode = (node: TComputeNodeInfo, tenantName?: string) => {
8+
return {
9+
...node,
10+
// v2 response has tenant name, v1 - doesn't
11+
TenantName: node.Tenant ?? tenantName,
12+
SystemState: node?.Overall,
13+
Uptime: calcUptime(node?.StartTime),
14+
};
15+
};
16+
717
export const prepareComputeNodesData = (data: TComputeInfo): NodesHandledResponse => {
818
const preparedNodes: NodesPreparedEntity[] = [];
919

10-
if (data.Tenants) {
20+
// First try to parse v2 response in case backend supports it
21+
// Else parse v1 response
22+
if (data.Nodes) {
23+
data.Nodes.forEach((node) => {
24+
preparedNodes.push(prepareComputeNode(node));
25+
});
26+
} else if (data.Tenants) {
1127
for (const tenant of data.Tenants) {
1228
tenant.Nodes?.forEach((node) => {
13-
preparedNodes.push({
14-
...node,
15-
TenantName: tenant.Name,
16-
SystemState: node?.Overall,
17-
Uptime: calcUptime(node?.StartTime),
18-
});
29+
preparedNodes.push(prepareComputeNode(node, tenant.Name));
1930
});
2031
}
2132
}
2233

2334
return {
2435
Nodes: preparedNodes,
25-
TotalNodes: preparedNodes.length,
36+
TotalNodes: Number(data.TotalNodes) || preparedNodes.length,
37+
FoundNodes: Number(data.FoundNodes),
2638
};
2739
};
2840

@@ -41,6 +53,7 @@ export const prepareNodesData = (data: TNodesInfo): NodesHandledResponse => {
4153

4254
return {
4355
Nodes: preparedNodes,
44-
TotalNodes: Number(data.TotalNodes) ?? preparedNodes.length,
56+
TotalNodes: Number(data.TotalNodes) || preparedNodes.length,
57+
FoundNodes: Number(data.FoundNodes),
4558
};
4659
};

src/types/api/compute.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,18 @@ export interface TTabletStateInfo {
6262
}
6363

6464
export enum EVersion {
65-
v1,
66-
v2, // only this versions works with sorting
65+
v1 = 'v1',
66+
v2 = 'v2', // only this versions works with sorting
6767
}
6868

6969
export enum ESort {
70-
NodeId,
71-
Host,
72-
DC,
73-
Rack,
74-
Version,
75-
Uptime,
76-
Memory,
77-
CPU,
78-
LoadAverage,
70+
NodeId = 'NodeId',
71+
Host = 'Host',
72+
DC = 'DC',
73+
Rack = 'Rack',
74+
Version = 'Version',
75+
Uptime = 'Uptime',
76+
Memory = 'Memory',
77+
CPU = 'CPU',
78+
LoadAverage = 'LoadAverage',
7979
}

src/types/api/netInfo.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ interface TNetNodePeerInfo {
4242
}
4343

4444
enum ENodeType {
45-
UnknownNodeType,
46-
Static,
47-
Dynamic,
45+
UnknownNodeType = 'UnknownNodeType',
46+
Static = 'Static',
47+
Dynamic = 'Dynamic',
4848
}

src/types/api/nodes.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,13 @@ enum EConfigState {
103103
}
104104

105105
export enum ESort {
106-
NodeId,
107-
Host,
108-
DC,
109-
Version,
110-
Uptime,
111-
Memory,
112-
CPU,
113-
LoadAverage,
106+
NodeId = 'NodeId',
107+
Host = 'Host',
108+
DC = 'DC',
109+
Rack = 'Rack',
110+
Version = 'Version',
111+
Uptime = 'Uptime',
112+
Memory = 'Memory',
113+
CPU = 'CPU',
114+
LoadAverage = 'LoadAverage',
114115
}

src/types/api/schema/shared.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ export interface TColumnDescription {
2828
}
2929

3030
export enum EColumnCodec {
31-
ColumnCodecPlain,
32-
ColumnCodecLZ4,
33-
ColumnCodecZSTD,
31+
ColumnCodecPlain = 'ColumnCodecPlain',
32+
ColumnCodecLZ4 = 'ColumnCodecLZ4',
33+
ColumnCodecZSTD = 'ColumnCodecZSTD',
3434
}
3535

3636
export enum EUnit {

src/types/api/schema/table.ts

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -579,38 +579,38 @@ interface TBackgroundPolicy {
579579
}
580580

581581
enum EPurpose {
582-
SysLog,
583-
Log,
584-
Data,
585-
External,
582+
SysLog = 'SysLog',
583+
Log = 'Log',
584+
Data = 'Data',
585+
External = 'External',
586586
}
587587

588588
enum EFreezeState {
589-
Unspecified,
590-
Freeze,
591-
Unfreeze,
589+
Unspecified = 'Unspecified',
590+
Freeze = 'Freeze',
591+
Unfreeze = 'Unfreeze',
592592
}
593593

594594
enum EColumnCache {
595-
ColumnCacheNone,
596-
ColumnCacheOnce,
597-
ColumnCacheEver,
595+
ColumnCacheNone = 'ColumnCacheNone',
596+
ColumnCacheOnce = 'ColumnCacheOnce',
597+
ColumnCacheEver = 'ColumnCacheEver',
598598
}
599599

600600
enum EColumnStorage {
601-
ColumnStorage1,
602-
ColumnStorage2,
603-
ColumnStorage1Ext1,
604-
ColumnStorage1Ext2,
605-
ColumnStorage2Ext1,
606-
ColumnStorage2Ext2,
607-
ColumnStorage1Med2Ext2,
608-
ColumnStorage2Med2Ext2,
609-
ColumnStorageTest_1_2_1k,
601+
ColumnStorage1 = 'ColumnStorage1',
602+
ColumnStorage2 = 'ColumnStorage2',
603+
ColumnStorage1Ext1 = 'ColumnStorage1Ext1',
604+
ColumnStorage1Ext2 = 'ColumnStorage1Ext2',
605+
ColumnStorage2Ext1 = 'ColumnStorage2Ext1',
606+
ColumnStorage2Ext2 = 'ColumnStorage2Ext2',
607+
ColumnStorage1Med2Ext2 = 'ColumnStorage1Med2Ext2',
608+
ColumnStorage2Med2Ext2 = 'ColumnStorage2Med2Ext2',
609+
ColumnStorageTest_1_2_1k = 'ColumnStorageTest_1_2_1k',
610610
}
611611

612612
enum ECompactionStrategy {
613-
CompactionStrategyUnset,
614-
CompactionStrategyGenerational,
615-
CompactionStrategySharded,
613+
CompactionStrategyUnset = 'CompactionStrategyUnset',
614+
CompactionStrategyGenerational = 'CompactionStrategyGenerational',
615+
CompactionStrategySharded = 'CompactionStrategySharded',
616616
}

0 commit comments

Comments
 (0)