diff --git a/src/containers/Nodes/Nodes.tsx b/src/containers/Nodes/Nodes.tsx index b12fd2e699..dcdf259b17 100644 --- a/src/containers/Nodes/Nodes.tsx +++ b/src/containers/Nodes/Nodes.tsx @@ -8,7 +8,7 @@ import { } from '../../components/nodesColumns/constants'; import type {NodesColumnId} from '../../components/nodesColumns/constants'; import {useBridgeModeEnabled} from '../../store/reducers/capabilities/hooks'; -import type {NodesPreparedEntity} from '../../store/reducers/nodes/types'; +import type {PreparedStorageNode} from '../../store/reducers/storage/types'; import type {AdditionalNodesProps} from '../../types/additionalProps'; import type {NodesGroupByField} from '../../types/api/nodes'; import { @@ -33,7 +33,7 @@ export interface NodesProps { scrollContainerRef: React.RefObject; additionalNodesProps?: AdditionalNodesProps; withPeerRoleFilter?: boolean; - columns?: Column[]; + columns?: Column[]; defaultColumnsIds?: NodesColumnId[]; requiredColumnsIds?: NodesColumnId[]; selectedColumnsKey?: string; diff --git a/src/containers/Nodes/NodesTable.tsx b/src/containers/Nodes/NodesTable.tsx index 96c71f0f7f..4f7c4c9d1a 100644 --- a/src/containers/Nodes/NodesTable.tsx +++ b/src/containers/Nodes/NodesTable.tsx @@ -3,7 +3,7 @@ import React from 'react'; import {Illustration} from '../../components/Illustration'; import {ResizeablePaginatedTable} from '../../components/PaginatedTable'; import {NODES_COLUMNS_WIDTH_LS_KEY} from '../../components/nodesColumns/constants'; -import type {NodesFilters, NodesPreparedEntity} from '../../store/reducers/nodes/types'; +import type {PreparedStorageNode} from '../../store/reducers/storage/types'; import type {ProblemFilterValue} from '../../store/reducers/settings/types'; import type {NodesGroupByField, NodesPeerRole} from '../../types/api/nodes'; import {NodesUptimeFilterValues} from '../../utils/nodes'; @@ -14,6 +14,18 @@ import {getNodes} from './getNodes'; import i18n from './i18n'; import {getRowClassName} from './shared'; +// Define filters type for consistency with storage nodes +interface NodesFilters { + searchValue?: string; + problemFilter?: ProblemFilterValue; + uptimeFilter?: NodesUptimeFilterValues; + peerRoleFilter?: NodesPeerRole; + path?: string; + database?: string; + filterGroup?: string; + filterGroupBy?: NodesGroupByField; +} + interface NodesTableProps { path?: string; database?: string; @@ -26,7 +38,7 @@ interface NodesTableProps { filterGroup?: string; filterGroupBy?: NodesGroupByField; - columns: Column[]; + columns: Column[]; scrollContainerRef: React.RefObject; initialEntitiesCount?: number; diff --git a/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx b/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx index c65f263bcd..765a4dff93 100644 --- a/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +++ b/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx @@ -6,7 +6,7 @@ import {PaginatedTableWithLayout} from '../../../components/PaginatedTable/Pagin import {NODES_COLUMNS_TITLES} from '../../../components/nodesColumns/constants'; import type {NodesColumnId} from '../../../components/nodesColumns/constants'; import {nodesApi} from '../../../store/reducers/nodes/nodes'; -import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types'; +import type {PreparedStorageNode} from '../../../store/reducers/storage/types'; import type {NodesGroupByField, NodesPeerRole} from '../../../types/api/nodes'; import {useAutoRefreshInterval} from '../../../utils/hooks'; import {useSelectedColumns} from '../../../utils/hooks/useSelectedColumns'; @@ -28,7 +28,7 @@ interface NodeGroupProps { searchValue: string; peerRoleFilter?: NodesPeerRole; groupByParam?: NodesGroupByField; - columns: Column[]; + columns: Column[]; scrollContainerRef: React.RefObject; onIsExpandedChange: (name: string, isExpanded: boolean) => void; } @@ -85,7 +85,7 @@ interface GroupedNodesComponentProps { database?: string; scrollContainerRef: React.RefObject; withPeerRoleFilter?: boolean; - columns: Column[]; + columns: Column[]; defaultColumnsIds: NodesColumnId[]; requiredColumnsIds: NodesColumnId[]; selectedColumnsKey: string; diff --git a/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx b/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx index 7f05e879c2..c717ddabcd 100644 --- a/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx +++ b/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx @@ -5,7 +5,7 @@ import {PaginatedTableWithLayout} from '../../../components/PaginatedTable/Pagin import {NODES_COLUMNS_TITLES} from '../../../components/nodesColumns/constants'; import type {NodesColumnId} from '../../../components/nodesColumns/constants'; import {useViewerNodesHandlerHasGrouping} from '../../../store/reducers/capabilities/hooks'; -import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types'; +import type {PreparedStorageNode} from '../../../store/reducers/storage/types'; import {useProblemFilter} from '../../../store/reducers/settings/hooks'; import type {NodesGroupByField} from '../../../types/api/nodes'; import {useSelectedColumns} from '../../../utils/hooks/useSelectedColumns'; @@ -19,7 +19,7 @@ interface NodesComponentProps { database?: string; scrollContainerRef: React.RefObject; withPeerRoleFilter?: boolean; - columns: Column[]; + columns: Column[]; defaultColumnsIds: NodesColumnId[]; requiredColumnsIds: NodesColumnId[]; selectedColumnsKey: string; diff --git a/src/containers/Nodes/PaginatedNodes/PaginatedNodes.tsx b/src/containers/Nodes/PaginatedNodes/PaginatedNodes.tsx index 2e50366497..668ed158d2 100644 --- a/src/containers/Nodes/PaginatedNodes/PaginatedNodes.tsx +++ b/src/containers/Nodes/PaginatedNodes/PaginatedNodes.tsx @@ -7,7 +7,7 @@ import { useCapabilitiesLoaded, useViewerNodesHandlerHasGrouping, } from '../../../store/reducers/capabilities/hooks'; -import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types'; +import type {PreparedStorageNode} from '../../../store/reducers/storage/types'; import {useProblemFilter} from '../../../store/reducers/settings/hooks'; import type {NodesGroupByField} from '../../../types/api/nodes'; import {NodesUptimeFilterValues} from '../../../utils/nodes'; @@ -23,7 +23,7 @@ export interface PaginatedNodesProps { database?: string; scrollContainerRef: React.RefObject; withPeerRoleFilter?: boolean; - columns: Column[]; + columns: Column[]; defaultColumnsIds: NodesColumnId[]; requiredColumnsIds: NodesColumnId[]; selectedColumnsKey: string; diff --git a/src/containers/Nodes/columns/columns.tsx b/src/containers/Nodes/columns/columns.tsx index 3f2d67ee3d..b5bd967652 100644 --- a/src/containers/Nodes/columns/columns.tsx +++ b/src/containers/Nodes/columns/columns.tsx @@ -16,25 +16,27 @@ import { } from '../../../components/nodesColumns/columns'; import {isSortableNodesColumn} from '../../../components/nodesColumns/constants'; import type {GetNodesColumnsParams} from '../../../components/nodesColumns/types'; -import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types'; +import type {PreparedStorageNode} from '../../../store/reducers/storage/types'; import type {Column} from '../../../utils/tableUtils/types'; +import {getPDisksColumn} from '../../Storage/PaginatedStorageNodesTable/columns/columns'; -export function getNodesColumns(params: GetNodesColumnsParams): Column[] { +export function getNodesColumns(params: GetNodesColumnsParams): Column[] { const columns = [ - getNodeIdColumn(), - getHostColumn(params), - getNodeNameColumn(), - getDataCenterColumn(), - getPileNameColumn(), - getRackColumn(), - getUptimeColumn(), - getCpuColumn(), - getPoolsColumn(), - getRAMColumn(), - getMemoryColumn(), - getLoadAverageColumn(), - getVersionColumn(), - getTabletsColumn(params), + getNodeIdColumn(), + getHostColumn(params), + getNodeNameColumn(), + getDataCenterColumn(), + getPileNameColumn(), + getRackColumn(), + getUptimeColumn(), + getCpuColumn(), + getPoolsColumn(), + getRAMColumn(), + getMemoryColumn(), + getLoadAverageColumn(), + getVersionColumn(), + getPDisksColumn({viewContext: {}, columnsSettings: undefined}), + getTabletsColumn(params), ]; return columns.map((column) => { diff --git a/src/containers/Nodes/columns/constants.ts b/src/containers/Nodes/columns/constants.ts index 4a7746e2d3..e8d0cbf0a0 100644 --- a/src/containers/Nodes/columns/constants.ts +++ b/src/containers/Nodes/columns/constants.ts @@ -13,7 +13,6 @@ export const DEFAULT_NODES_COLUMNS: NodesColumnId[] = [ 'CPU', 'RAM', 'Version', - 'Tablets', ]; export const REQUIRED_NODES_COLUMNS: NodesColumnId[] = ['NodeId']; diff --git a/src/containers/Nodes/getNodes.ts b/src/containers/Nodes/getNodes.ts index 55c6b50bd5..c1429c093a 100644 --- a/src/containers/Nodes/getNodes.ts +++ b/src/containers/Nodes/getNodes.ts @@ -3,15 +3,16 @@ import { NODES_COLUMNS_TO_DATA_FIELDS, getNodesColumnSortField, } from '../../components/nodesColumns/constants'; -import type {NodesFilters, NodesPreparedEntity} from '../../store/reducers/nodes/types'; -import {prepareNodesData} from '../../store/reducers/nodes/utils'; +import type {NodesFilters} from '../../store/reducers/nodes/types'; +import type {PreparedStorageNode} from '../../store/reducers/storage/types'; +import {prepareStorageNodesResponse} from '../../store/reducers/storage/utils'; import type {NodesRequestParams} from '../../types/api/nodes'; import {prepareSortValue} from '../../utils/filters'; import {getProblemParamValue, getUptimeParamValue} from '../../utils/nodes'; import {getRequiredDataFields} from '../../utils/tableUtils/getRequiredDataFields'; export const getNodes: FetchData< - NodesPreparedEntity, + PreparedStorageNode, NodesFilters, Pick > = async (params) => { @@ -50,11 +51,11 @@ export const getNodes: FetchData< filter_group_by: filterGroupBy, fieldsRequired: dataFieldsRequired, }); - const preparedResponse = prepareNodesData(response); + const preparedResponse = prepareStorageNodesResponse(response); return { - data: preparedResponse.Nodes || [], - found: preparedResponse.FoundNodes || 0, - total: preparedResponse.TotalNodes || 0, + data: preparedResponse.nodes || [], + found: preparedResponse.found || 0, + total: preparedResponse.total || 0, }; }; diff --git a/src/containers/Storage/PaginatedStorageNodesTable/columns/columns.tsx b/src/containers/Storage/PaginatedStorageNodesTable/columns/columns.tsx index 12fef84e9d..ff645ec933 100644 --- a/src/containers/Storage/PaginatedStorageNodesTable/columns/columns.tsx +++ b/src/containers/Storage/PaginatedStorageNodesTable/columns/columns.tsx @@ -13,6 +13,7 @@ import { getPoolsColumn, getRAMColumn, getRackColumn, + getTabletsColumn, getUptimeColumn, getVersionColumn, } from '../../../../components/nodesColumns/columns'; @@ -35,7 +36,7 @@ import './StorageNodesColumns.scss'; const b = cn('ydb-storage-nodes-columns'); -const getPDisksColumn = ({ +export const getPDisksColumn = ({ viewContext, columnsSettings, }: GetStorageNodesColumnsParams & { @@ -98,6 +99,7 @@ export const getStorageNodesColumns = ({ getVersionColumn(), getMissingDisksColumn(), getPDisksColumn({viewContext, columnsSettings}), + getTabletsColumn({database}), ]; const sortableColumns = columns.map((column) => ({ diff --git a/src/containers/Storage/PaginatedStorageNodesTable/columns/constants.ts b/src/containers/Storage/PaginatedStorageNodesTable/columns/constants.ts index 4bcfb19c5e..5c5e674591 100644 --- a/src/containers/Storage/PaginatedStorageNodesTable/columns/constants.ts +++ b/src/containers/Storage/PaginatedStorageNodesTable/columns/constants.ts @@ -14,7 +14,6 @@ export const DEFAULT_STORAGE_NODES_COLUMNS: NodesColumnId[] = [ 'Uptime', 'CPU', 'RAM', - 'PDisks', ]; export const REQUIRED_STORAGE_NODES_COLUMNS: NodesColumnId[] = ['NodeId']; diff --git a/src/store/reducers/storage/types.ts b/src/store/reducers/storage/types.ts index dcdd033e96..37f68a2754 100644 --- a/src/store/reducers/storage/types.ts +++ b/src/store/reducers/storage/types.ts @@ -3,6 +3,7 @@ import {z} from 'zod'; import type {EFlag} from '../../../types/api/enums'; import type {NodesGroupByField} from '../../../types/api/nodes'; import type {Erasure, GroupsGroupByField} from '../../../types/api/storage'; +import type {TTabletStateInfo} from '../../../types/api/tablet'; import type {PreparedPDisk, PreparedVDisk} from '../../../utils/disks/types'; import type {NodesUptimeFilterValues, PreparedNodeSystemState} from '../../../utils/nodes'; @@ -33,6 +34,7 @@ export interface PreparedStorageNode extends PreparedNodeSystemState { PDisks?: PreparedPDisk[]; VDisks?: PreparedVDisk[]; + Tablets?: TTabletStateInfo[]; Missing: number; MaximumSlotsPerDisk: number; diff --git a/src/store/reducers/storage/utils.ts b/src/store/reducers/storage/utils.ts index 6cda694057..3e847ce7bd 100644 --- a/src/store/reducers/storage/utils.ts +++ b/src/store/reducers/storage/utils.ts @@ -222,6 +222,7 @@ const prepareStorageNodeData = ( PileName: node.PileName, PDisks: pDisks, VDisks: vDisks, + Tablets: node.Tablets, Missing: missing, MaximumSlotsPerDisk: maximumSlotsPerDisk, MaximumDisksPerNode: maximumDisksPerNode,