Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions src/components/NodeHostWrapper/NodeHostWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type {PreparedStorageNode} from '../../store/reducers/storage/types';
import type {NodeAddress} from '../../types/additionalProps';
import type {TNodeInfo, TSystemStateInfo} from '../../types/api/nodes';
import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
import {isUnavailableNode} from '../../utils/nodes';
import {checkIsStorageNode, isUnavailableNode} from '../../utils/nodes';
import {EntityStatus} from '../EntityStatus/EntityStatus';
import {NodeEndpointsTooltipContent} from '../TooltipsContent';

Expand Down Expand Up @@ -33,12 +33,17 @@ export const NodeHostWrapper = ({

const isNodeAvailable = !isUnavailableNode(node);

// Storage nodes do not belong to any specific database.
// Including a database in the path would filter data on the node page by that database,
// but for storage nodes this would result in no data being shown.
// Database from node data cannot be used, because we use database ids when uiFactory.useDatabaseId
// https://github.com/ydb-platform/ydb-embedded-ui/issues/3006
const databaseInPath = checkIsStorageNode(node) ? undefined : (database ?? node.TenantName);

const nodePath = isNodeAvailable
? getDefaultNodePath(
{id: node.NodeId, activeTab: node.TenantName ? 'tablets' : 'storage'},
{
database: database ?? node.TenantName,
},
{database: databaseInPath},
)
: undefined;

Expand Down
5 changes: 2 additions & 3 deletions src/containers/Node/Node.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import type {PreparedNode} from '../../store/reducers/node/types';
import {cn} from '../../utils/cn';
import {useAutoRefreshInterval, useTypedDispatch} from '../../utils/hooks';
import {useIsViewerUser} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
import {checkIsStorageNode} from '../../utils/nodes';
import {useAppTitle} from '../App/AppTitleContext';
import {Configs} from '../Configs/Configs';
import {PaginatedStorage} from '../Storage/PaginatedStorage';
Expand All @@ -39,8 +40,6 @@ import './Node.scss';

const b = cn('node');

const STORAGE_ROLE = 'Storage';

export function Node() {
const container = React.useRef<HTMLDivElement>(null);
const isViewerUser = useIsViewerUser();
Expand Down Expand Up @@ -73,7 +72,7 @@ export function Node() {

const pageLoading = isLoading || !capabilitiesLoaded;

const isStorageNode = node?.Roles?.find((el) => el === STORAGE_ROLE);
const isStorageNode = checkIsStorageNode(node);

const threadsQuantity = node?.Threads?.length;

Expand Down
17 changes: 5 additions & 12 deletions src/containers/Versions/groupNodes.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import groupBy from 'lodash/groupBy';

import type {PreparedStorageNode} from '../../store/reducers/storage/types';
import {checkIsStorageNode, checkIsTenantNode} from '../../utils/nodes';
import {getColorFromVersionsData, parseNodesToPreparedVersions} from '../../utils/versions';
import type {VersionsDataMap} from '../../utils/versions/types';

Expand All @@ -24,7 +25,7 @@ export const getGroupedTenantNodes = (

return Object.keys(dividedByVersion)
.map<GroupedNodesItem | null>((version) => {
const filteredNodes = dividedByVersion[version].filter(isTenantNode);
const filteredNodes = dividedByVersion[version].filter(checkIsTenantNode);
const dividedByTenant = groupBy(filteredNodes, 'Tenants');

const items = Object.keys(dividedByTenant)
Expand All @@ -49,7 +50,7 @@ export const getGroupedTenantNodes = (
})
.filter((item): item is GroupedNodesItem => Boolean(item));
} else {
const filteredNodes = nodes.filter(isTenantNode);
const filteredNodes = nodes.filter(checkIsTenantNode);
const dividedByTenant = groupBy(filteredNodes, 'Tenants');

return Object.keys(dividedByTenant)
Expand Down Expand Up @@ -92,7 +93,7 @@ export const getGroupedStorageNodes = (
return undefined;
}

const storageNodes = nodes.filter(isStorageNode);
const storageNodes = nodes.filter(checkIsStorageNode);
const storageNodesDividedByVersion = groupBy(storageNodes, 'Version');

return Object.keys(storageNodesDividedByVersion).map((version) => {
Expand All @@ -114,7 +115,7 @@ export const getOtherNodes = (

// Nodes that are not included in other groups
const otherNodes = nodes.filter(
(node) => !isStorageNode(node) && !isTenantNode(node) && node.Version,
(node) => !checkIsStorageNode(node) && !checkIsTenantNode(node) && node.Version,
);
const otherNodesDividedByVersion = groupBy(otherNodes, 'Version');

Expand All @@ -126,11 +127,3 @@ export const getOtherNodes = (
};
});
};

function isStorageNode(node: PreparedStorageNode) {
return Boolean(node.Roles?.includes('Storage'));
}

function isTenantNode(node: PreparedStorageNode) {
return Boolean(node.Tenants);
}
8 changes: 8 additions & 0 deletions src/utils/nodes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,11 @@ export const getProblemParamValue = (problemFilter: ProblemFilterValue | undefin
export const getUptimeParamValue = (nodesUptimeFilter: NodesUptimeFilterValues | undefined) => {
return nodesUptimeFilter === NodesUptimeFilterValues.SmallUptime ? HOUR_IN_SECONDS : undefined;
};

export function checkIsStorageNode<T extends PreparedNodeSystemState>(node?: T) {
return Boolean(node?.Roles?.includes('Storage'));
}

export function checkIsTenantNode<T extends PreparedNodeSystemState>(node?: T) {
return Boolean(node?.Tenants);
}
Loading