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
19 changes: 13 additions & 6 deletions src/components/BasicNodeViewer/BasicNodeViewer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ import {Icon} from '@gravity-ui/uikit';
import type {PreparedNode} from '../../store/reducers/node/types';
import type {AdditionalNodesProps} from '../../types/additionalProps';
import {cn} from '../../utils/cn';
import {createDeveloperUILinkWithNodeId} from '../../utils/developerUI/developerUI';
import {
createDeveloperUIInternalPageHref,
createDeveloperUILinkWithNodeId,
} from '../../utils/developerUI/developerUI';
import {EntityStatus} from '../EntityStatus/EntityStatus';
import {Tags} from '../Tags';

Expand All @@ -21,12 +24,16 @@ interface BasicNodeViewerProps {
}

export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNodeViewerProps) => {
let nodeHref: string | undefined;
let developerUIInternalHref: string | undefined;

if (additionalNodesProps?.getNodeRef) {
nodeHref = additionalNodesProps.getNodeRef(node) + '/internal';
const developerUIHref = additionalNodesProps.getNodeRef(node);
developerUIInternalHref = developerUIHref
? createDeveloperUIInternalPageHref(developerUIHref)
: undefined;
} else if (node.NodeId) {
nodeHref = createDeveloperUILinkWithNodeId(node.NodeId) + '/internal';
const developerUIHref = createDeveloperUILinkWithNodeId(node.NodeId);
developerUIInternalHref = createDeveloperUIInternalPageHref(developerUIHref);
}

return (
Expand All @@ -35,11 +42,11 @@ export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNo
<React.Fragment>
<div className={b('title')}>Node</div>
<EntityStatus status={node.SystemState} name={node.Host} />
{nodeHref && (
{developerUIInternalHref && (
<a
rel="noopener noreferrer"
className={b('link', {external: true})}
href={nodeHref}
href={developerUIInternalHref}
target="_blank"
>
<Icon data={ArrowUpRightFromSquare} />
Expand Down
17 changes: 12 additions & 5 deletions src/components/NodeHostWrapper/NodeHostWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import {PopoverBehavior} from '@gravity-ui/uikit';
import {getDefaultNodePath} from '../../containers/Node/NodePages';
import type {NodeAddress} from '../../types/additionalProps';
import type {TSystemStateInfo} from '../../types/api/nodes';
import {createDeveloperUILinkWithNodeId} from '../../utils/developerUI/developerUI';
import {
createDeveloperUIInternalPageHref,
createDeveloperUILinkWithNodeId,
} from '../../utils/developerUI/developerUI';
import {isUnavailableNode} from '../../utils/nodes';
import {CellWithPopover} from '../CellWithPopover/CellWithPopover';
import {EntityStatus} from '../EntityStatus/EntityStatus';
Expand All @@ -28,11 +31,15 @@ export const NodeHostWrapper = ({node, getNodeRef, database}: NodeHostWrapperPro

const isNodeAvailable = !isUnavailableNode(node);

let nodeHref: string | undefined;
let developerUIInternalHref: string | undefined;
if (getNodeRef) {
nodeHref = getNodeRef(node) + '/internal';
const developerUIHref = getNodeRef(node);
developerUIInternalHref = developerUIHref
? createDeveloperUIInternalPageHref(developerUIHref)
: undefined;
} else if (node.NodeId) {
nodeHref = createDeveloperUILinkWithNodeId(node.NodeId) + '/internal';
const developerUIHref = createDeveloperUILinkWithNodeId(node.NodeId);
developerUIInternalHref = createDeveloperUIInternalPageHref(developerUIHref);
}

const nodePath = isNodeAvailable
Expand All @@ -44,7 +51,7 @@ export const NodeHostWrapper = ({node, getNodeRef, database}: NodeHostWrapperPro
return (
<CellWithPopover
disabled={!isNodeAvailable}
content={<NodeEndpointsTooltipContent data={node} nodeHref={nodeHref} />}
content={<NodeEndpointsTooltipContent data={node} nodeHref={developerUIInternalHref} />}
placement={['top', 'bottom']}
behavior={PopoverBehavior.Immediate}
>
Expand Down
16 changes: 5 additions & 11 deletions src/containers/Header/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import {Breadcrumbs} from '@gravity-ui/uikit';

import {InternalLink} from '../../components/InternalLink';
import {LinkWithIcon} from '../../components/LinkWithIcon/LinkWithIcon';
import {backend, customBackend} from '../../store';
import {useClusterBaseInfo} from '../../store/reducers/cluster/cluster';
import {cn} from '../../utils/cn';
import {DEVELOPER_UI_TITLE} from '../../utils/constants';
import {createDeveloperUIInternalPageHref} from '../../utils/developerUI/developerUI';
import {useTypedSelector} from '../../utils/hooks';

import type {RawBreadcrumbItem} from './breadcrumbs';
Expand All @@ -17,20 +17,11 @@ import './Header.scss';

const b = cn('header');

const getInternalLink = (singleClusterMode: boolean) => {
if (singleClusterMode && !customBackend) {
return `/internal`;
}

return backend + '/internal';
};

interface HeaderProps {
mainPage?: RawBreadcrumbItem;
}

function Header({mainPage}: HeaderProps) {
const singleClusterMode = useTypedSelector((state) => state.singleClusterMode);
const {page, pageBreadcrumbsOptions} = useTypedSelector((state) => state.header);

const clusterInfo = useClusterBaseInfo();
Expand Down Expand Up @@ -87,7 +78,10 @@ function Header({mainPage}: HeaderProps) {
}}
/>

<LinkWithIcon title={DEVELOPER_UI_TITLE} url={getInternalLink(singleClusterMode)} />
<LinkWithIcon
title={DEVELOPER_UI_TITLE}
url={createDeveloperUIInternalPageHref()}
/>
</header>
);
};
Expand Down
29 changes: 29 additions & 0 deletions src/utils/developerUI/__test__/developerUI.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,39 @@
import {
createDeveloperUIInternalPageHref,
createDeveloperUILinkWithNodeId,
createPDiskDeveloperUILink,
createVDiskDeveloperUILink,
} from '../developerUI';

describe('Developer UI links generators', () => {
describe('createDeveloperUIInternalPageHref', () => {
it('should create correct link for embedded UI', () => {
expect(createDeveloperUIInternalPageHref('')).toBe('/internal');
});
it('should create correct link for embedded UI with node', () => {
expect(createDeveloperUIInternalPageHref('/node/5')).toBe('/node/5/internal');
});
it('should create correct link for embedded UI with proxy', () => {
expect(createDeveloperUIInternalPageHref('/my-ydb-host.net:8765')).toBe(
'/my-ydb-host.net:8765/internal',
);
});
it('should create correct link for UI with custom host', () => {
expect(createDeveloperUIInternalPageHref('http://my-ydb-host.net:8765')).toBe(
'http://my-ydb-host.net:8765/internal',
);
});
it('should create correct link for UI with custom host and node', () => {
expect(createDeveloperUIInternalPageHref('http://my-ydb-host.net:8765/node/5')).toBe(
'http://my-ydb-host.net:8765/node/5/internal',
);
});
it('should create correct link for UI with custom host and proxy', () => {
expect(
createDeveloperUIInternalPageHref('https://my-ydb-proxy/my-ydb-host.net:8765'),
).toBe('https://my-ydb-proxy/my-ydb-host.net:8765/internal');
});
});
describe('createDeveloperUILinkWithNodeId', () => {
it('should create relative link with no host', () => {
expect(createDeveloperUILinkWithNodeId(1)).toBe('/node/1');
Expand Down
4 changes: 4 additions & 0 deletions src/utils/developerUI/developerUI.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import {backend} from '../../store';
import {pad9} from '../utils';

export function createDeveloperUIInternalPageHref(host = backend) {
return host + '/internal';
}

// Current node connects with target node by itself using nodeId
export const createDeveloperUILinkWithNodeId = (nodeId: number | string, host = backend) => {
const nodePathRegexp = /\/node\/\d+\/?$/g;
Expand Down
Loading