diff --git a/src/services/api/pdisk.ts b/src/services/api/pdisk.ts index 7736e45eba..97e29e75f9 100644 --- a/src/services/api/pdisk.ts +++ b/src/services/api/pdisk.ts @@ -74,7 +74,6 @@ export class PDiskAPI extends BaseYdbAPI { const pDiskPath = createPDiskDeveloperUILink({ nodeId, pDiskId, - host: this.getPath(''), }); return this.post( diff --git a/src/utils/developerUI/__test__/developerUI.test.ts b/src/utils/developerUI/__test__/developerUI.test.ts index 59487c9622..cbfea4b0a4 100644 --- a/src/utils/developerUI/__test__/developerUI.test.ts +++ b/src/utils/developerUI/__test__/developerUI.test.ts @@ -1,3 +1,4 @@ +import type {YdbEmbeddedAPI} from '../../../services/api'; import { createDeveloperUIInternalPageHref, createDeveloperUILinkWithNodeId, @@ -6,6 +7,15 @@ import { } from '../developerUI'; describe('Developer UI links generators', () => { + beforeAll(() => { + const api = { + viewer: { + getPath: () => '', + }, + }; + window.api = api as unknown as YdbEmbeddedAPI; + }); + describe('createDeveloperUIInternalPageHref', () => { test('should create correct link for embedded UI', () => { expect(createDeveloperUIInternalPageHref('')).toBe('/internal'); diff --git a/src/utils/developerUI/developerUI.ts b/src/utils/developerUI/developerUI.ts index 62607a0006..ceed474541 100644 --- a/src/utils/developerUI/developerUI.ts +++ b/src/utils/developerUI/developerUI.ts @@ -1,16 +1,23 @@ -import {backend} from '../../store'; import {pad9} from '../utils'; -export function createDeveloperUIInternalPageHref(host = backend) { +function getCurrentHost() { + // It always has correct backend + return window.api.viewer.getPath(''); +} + +export function createDeveloperUIInternalPageHref(host = getCurrentHost()) { return host + '/internal'; } -export function createDeveloperUIMonitoringPageHref(host = backend) { +export function createDeveloperUIMonitoringPageHref(host = getCurrentHost()) { return host + '/monitoring'; } // Current node connects with target node by itself using nodeId -export const createDeveloperUILinkWithNodeId = (nodeId: number | string, host = backend) => { +export const createDeveloperUILinkWithNodeId = ( + nodeId: number | string, + host = getCurrentHost(), +) => { const nodePathRegexp = /\/node\/\d+\/?$/g; // In case current backend is already relative node path ({host}/node/{nodeId}) @@ -25,13 +32,12 @@ export const createDeveloperUILinkWithNodeId = (nodeId: number | string, host = interface PDiskDeveloperUILinkParams { nodeId: number | string; pDiskId: number | string; - host?: string; } -export const createPDiskDeveloperUILink = ({nodeId, pDiskId, host}: PDiskDeveloperUILinkParams) => { +export const createPDiskDeveloperUILink = ({nodeId, pDiskId}: PDiskDeveloperUILinkParams) => { const pdiskPath = '/actors/pdisks/pdisk' + pad9(pDiskId); - return createDeveloperUILinkWithNodeId(nodeId, host) + pdiskPath; + return createDeveloperUILinkWithNodeId(nodeId) + pdiskPath; }; interface VDiskDeveloperUILinkParams extends PDiskDeveloperUILinkParams { @@ -42,18 +48,17 @@ export const createVDiskDeveloperUILink = ({ nodeId, pDiskId, vDiskSlotId, - host, }: VDiskDeveloperUILinkParams) => { const vdiskPath = '/actors/vdisks/vdisk' + pad9(pDiskId) + '_' + pad9(vDiskSlotId); - return createDeveloperUILinkWithNodeId(nodeId, host) + vdiskPath; + return createDeveloperUILinkWithNodeId(nodeId) + vdiskPath; }; export function createTabletDeveloperUIHref( tabletId: number | string, tabletPage?: string, searchParam = 'TabletID', - host = backend, + host = getCurrentHost(), ) { const subPage = tabletPage ? `/${tabletPage}` : ''; return `${host}/tablets${subPage}?${searchParam}=${tabletId}`; diff --git a/src/utils/hooks/useNodeDeveloperUIHref.ts b/src/utils/hooks/useNodeDeveloperUIHref.ts index 21ee40f767..de09d81dc9 100644 --- a/src/utils/hooks/useNodeDeveloperUIHref.ts +++ b/src/utils/hooks/useNodeDeveloperUIHref.ts @@ -13,16 +13,22 @@ import {useTypedSelector} from './useTypedSelector'; export function useNodeDeveloperUIHref(node?: NodeAddress) { const singleClusterMode = useTypedSelector((state) => state.singleClusterMode); - const {balancer = backend} = useClusterBaseInfo(); + const {balancer = backend, settings} = useClusterBaseInfo(); const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges(); + const useMetaProxy = settings?.use_meta_proxy; + if (!isUserAllowedToMakeChanges) { return undefined; } // Only for multi-cluster version since there is no balancer in single-cluster mode if (!singleClusterMode) { - const developerUIHref = getBackendFromBalancerAndNodeId(node?.NodeId, balancer ?? ''); + const developerUIHref = getBackendFromBalancerAndNodeId( + node?.NodeId, + balancer, + useMetaProxy, + ); return developerUIHref ? createDeveloperUIInternalPageHref(developerUIHref) : undefined; } diff --git a/src/utils/prepareBackend.ts b/src/utils/prepareBackend.ts index d288b1f7a5..183c609eb5 100644 --- a/src/utils/prepareBackend.ts +++ b/src/utils/prepareBackend.ts @@ -1,3 +1,4 @@ +import {createDeveloperUILinkWithNodeId} from './developerUI/developerUI'; import {prepareBackendFromBalancer} from './parseBalancer'; import {valueIsDefined} from '.'; @@ -8,10 +9,15 @@ export const prepareHost = (host?: string) => { }; /** For multi-cluster version */ -export const getBackendFromBalancerAndNodeId = (nodeId?: string | number, balancer?: string) => { +export const getBackendFromBalancerAndNodeId = ( + nodeId?: string | number, + balancer?: string, + useMetaProxy?: boolean, +) => { if (valueIsDefined(nodeId) && valueIsDefined(balancer)) { - const preparedBalancer = prepareBackendFromBalancer(balancer); - return `${preparedBalancer}/node/${nodeId}`; + // Use default value instead of balancer if meta proxy is enabled + const preparedBalancer = useMetaProxy ? undefined : prepareBackendFromBalancer(balancer); + return createDeveloperUILinkWithNodeId(nodeId, preparedBalancer); } return undefined;