Skip to content

Commit 4783a37

Browse files
fix(Header): fix developer ui link for embedded UI with proxy
1 parent a3a3978 commit 4783a37

File tree

5 files changed

+60
-22
lines changed

5 files changed

+60
-22
lines changed

src/components/BasicNodeViewer/BasicNodeViewer.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import {Icon} from '@gravity-ui/uikit';
66
import type {PreparedNode} from '../../store/reducers/node/types';
77
import type {AdditionalNodesProps} from '../../types/additionalProps';
88
import {cn} from '../../utils/cn';
9-
import {createDeveloperUILinkWithNodeId} from '../../utils/developerUI/developerUI';
9+
import {
10+
createDeveloperUIInternalHref,
11+
createDeveloperUILinkWithNodeId,
12+
} from '../../utils/developerUI/developerUI';
1013
import {EntityStatus} from '../EntityStatus/EntityStatus';
1114
import {Tags} from '../Tags';
1215

@@ -21,12 +24,16 @@ interface BasicNodeViewerProps {
2124
}
2225

2326
export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNodeViewerProps) => {
24-
let nodeHref: string | undefined;
27+
let developerUIInternalHref: string | undefined;
2528

2629
if (additionalNodesProps?.getNodeRef) {
27-
nodeHref = additionalNodesProps.getNodeRef(node) + '/internal';
30+
const developerUIHref = additionalNodesProps.getNodeRef(node);
31+
developerUIInternalHref = developerUIHref
32+
? createDeveloperUIInternalHref(developerUIHref)
33+
: undefined;
2834
} else if (node.NodeId) {
29-
nodeHref = createDeveloperUILinkWithNodeId(node.NodeId) + '/internal';
35+
const developerUIHref = createDeveloperUILinkWithNodeId(node.NodeId);
36+
developerUIInternalHref = createDeveloperUIInternalHref(developerUIHref);
3037
}
3138

3239
return (
@@ -35,11 +42,11 @@ export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNo
3542
<React.Fragment>
3643
<div className={b('title')}>Node</div>
3744
<EntityStatus status={node.SystemState} name={node.Host} />
38-
{nodeHref && (
45+
{developerUIInternalHref && (
3946
<a
4047
rel="noopener noreferrer"
4148
className={b('link', {external: true})}
42-
href={nodeHref}
49+
href={developerUIInternalHref}
4350
target="_blank"
4451
>
4552
<Icon data={ArrowUpRightFromSquare} />

src/components/NodeHostWrapper/NodeHostWrapper.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import {PopoverBehavior} from '@gravity-ui/uikit';
33
import {getDefaultNodePath} from '../../containers/Node/NodePages';
44
import type {NodeAddress} from '../../types/additionalProps';
55
import type {TSystemStateInfo} from '../../types/api/nodes';
6-
import {createDeveloperUILinkWithNodeId} from '../../utils/developerUI/developerUI';
6+
import {
7+
createDeveloperUIInternalHref,
8+
createDeveloperUILinkWithNodeId,
9+
} from '../../utils/developerUI/developerUI';
710
import {isUnavailableNode} from '../../utils/nodes';
811
import {CellWithPopover} from '../CellWithPopover/CellWithPopover';
912
import {EntityStatus} from '../EntityStatus/EntityStatus';
@@ -28,11 +31,15 @@ export const NodeHostWrapper = ({node, getNodeRef, database}: NodeHostWrapperPro
2831

2932
const isNodeAvailable = !isUnavailableNode(node);
3033

31-
let nodeHref: string | undefined;
34+
let developerUIInternalHref: string | undefined;
3235
if (getNodeRef) {
33-
nodeHref = getNodeRef(node) + '/internal';
36+
const developerUIHref = getNodeRef(node);
37+
developerUIInternalHref = developerUIHref
38+
? createDeveloperUIInternalHref(developerUIHref)
39+
: undefined;
3440
} else if (node.NodeId) {
35-
nodeHref = createDeveloperUILinkWithNodeId(node.NodeId) + '/internal';
41+
const developerUIHref = createDeveloperUILinkWithNodeId(node.NodeId);
42+
developerUIInternalHref = createDeveloperUIInternalHref(developerUIHref);
3643
}
3744

3845
const nodePath = isNodeAvailable
@@ -44,7 +51,7 @@ export const NodeHostWrapper = ({node, getNodeRef, database}: NodeHostWrapperPro
4451
return (
4552
<CellWithPopover
4653
disabled={!isNodeAvailable}
47-
content={<NodeEndpointsTooltipContent data={node} nodeHref={nodeHref} />}
54+
content={<NodeEndpointsTooltipContent data={node} nodeHref={developerUIInternalHref} />}
4855
placement={['top', 'bottom']}
4956
behavior={PopoverBehavior.Immediate}
5057
>

src/containers/Header/Header.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import {Breadcrumbs} from '@gravity-ui/uikit';
44

55
import {InternalLink} from '../../components/InternalLink';
66
import {LinkWithIcon} from '../../components/LinkWithIcon/LinkWithIcon';
7-
import {backend, customBackend} from '../../store';
87
import {useClusterBaseInfo} from '../../store/reducers/cluster/cluster';
98
import {cn} from '../../utils/cn';
109
import {DEVELOPER_UI_TITLE} from '../../utils/constants';
10+
import {createDeveloperUIInternalHref} from '../../utils/developerUI/developerUI';
1111
import {useTypedSelector} from '../../utils/hooks';
1212

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

1818
const b = cn('header');
1919

20-
const getInternalLink = (singleClusterMode: boolean) => {
21-
if (singleClusterMode && !customBackend) {
22-
return `/internal`;
23-
}
24-
25-
return backend + '/internal';
26-
};
27-
2820
interface HeaderProps {
2921
mainPage?: RawBreadcrumbItem;
3022
}
3123

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

3627
const clusterInfo = useClusterBaseInfo();
@@ -87,7 +78,7 @@ function Header({mainPage}: HeaderProps) {
8778
}}
8879
/>
8980

90-
<LinkWithIcon title={DEVELOPER_UI_TITLE} url={getInternalLink(singleClusterMode)} />
81+
<LinkWithIcon title={DEVELOPER_UI_TITLE} url={createDeveloperUIInternalHref()} />
9182
</header>
9283
);
9384
};

src/utils/developerUI/__test__/developerUI.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,39 @@
11
import {
2+
createDeveloperUIInternalHref,
23
createDeveloperUILinkWithNodeId,
34
createPDiskDeveloperUILink,
45
createVDiskDeveloperUILink,
56
} from '../developerUI';
67

78
describe('Developer UI links generators', () => {
9+
describe('createDeveloperUILinkForCurrentHost', () => {
10+
it('should create correct link for embedded UI', () => {
11+
expect(createDeveloperUIInternalHref('')).toBe('/internal');
12+
});
13+
it('should create correct link for embedded UI with node', () => {
14+
expect(createDeveloperUIInternalHref('/node/5')).toBe('/node/5/internal');
15+
});
16+
it('should create correct link for embedded UI with proxy', () => {
17+
expect(createDeveloperUIInternalHref('/my-ydb-host.net:8765')).toBe(
18+
'/my-ydb-host.net:8765/internal',
19+
);
20+
});
21+
it('should create correct link for UI with custom host', () => {
22+
expect(createDeveloperUIInternalHref('http://my-ydb-host.net:8765')).toBe(
23+
'http://my-ydb-host.net:8765/internal',
24+
);
25+
});
26+
it('should create correct link for UI with custom host and node', () => {
27+
expect(createDeveloperUIInternalHref('http://my-ydb-host.net:8765/node/5')).toBe(
28+
'http://my-ydb-host.net:8765/node/5/internal',
29+
);
30+
});
31+
it('should create correct link for UI with custom host and proxy', () => {
32+
expect(createDeveloperUIInternalHref('https://my-ydb-proxy/my-ydb-host.net:8765')).toBe(
33+
'https://my-ydb-proxy/my-ydb-host.net:8765/internal',
34+
);
35+
});
36+
});
837
describe('createDeveloperUILinkWithNodeId', () => {
938
it('should create relative link with no host', () => {
1039
expect(createDeveloperUILinkWithNodeId(1)).toBe('/node/1');

src/utils/developerUI/developerUI.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import {backend} from '../../store';
22
import {pad9} from '../utils';
33

4+
export function createDeveloperUIInternalHref(host = backend) {
5+
return host + '/internal';
6+
}
7+
48
// Current node connects with target node by itself using nodeId
59
export const createDeveloperUILinkWithNodeId = (nodeId: number | string, host = backend) => {
610
const nodePathRegexp = /\/node\/\d+\/?$/g;

0 commit comments

Comments
 (0)