Skip to content

Commit bff31a0

Browse files
authored
feat: support cluster_domain in settings (#3158)
1 parent 01159fe commit bff31a0

File tree

8 files changed

+55
-36
lines changed

8 files changed

+55
-36
lines changed

src/containers/Clusters/columns.tsx

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,18 @@ import {
1414

1515
import {EntityStatus} from '../../components/EntityStatusNew/EntityStatus';
1616
import {VersionsBar} from '../../components/VersionsBar/VersionsBar';
17-
import {getClusterPath} from '../../routes';
1817
import type {PreparedCluster} from '../../store/reducers/clusters/types';
1918
import {EFlag} from '../../types/api/enums';
2019
import {uiFactory} from '../../uiFactory/uiFactory';
2120
import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
2221
import {formatNumber, formatStorageValuesToTb} from '../../utils/dataFormatters/dataFormatters';
23-
import {createDeveloperUIMonitoringPageHref} from '../../utils/developerUI/developerUI';
2422
import {getCleanBalancerValue} from '../../utils/parseBalancer';
2523
import {clusterTabsIds} from '../Cluster/utils';
2624

2725
import {COLUMNS_NAMES, COLUMNS_TITLES} from './constants';
2826
import i18n from './i18n';
2927
import {b} from './shared';
28+
import {calculateClusterPath} from './utils';
3029
export const CLUSTERS_COLUMNS_WIDTH_LS_KEY = 'clustersTableColumnsWidth';
3130

3231
const EMPTY_CELL = <span className={b('empty-cell')}>{EMPTY_DATA_PLACEHOLDER}</span>;
@@ -144,23 +143,13 @@ interface ClusterNameProps {
144143
}
145144

146145
function ClusterName({row}: ClusterNameProps) {
147-
const {
148-
name: clusterName,
149-
use_embedded_ui: useEmbeddedUi,
150-
preparedBackend: backend,
151-
settings,
152-
} = row;
153-
const clusterPath =
154-
useEmbeddedUi && backend
155-
? createDeveloperUIMonitoringPageHref(backend)
156-
: getClusterPath(
157-
{environment: settings?.auth_service},
158-
{backend, clusterName},
159-
{withBasename: true},
160-
);
146+
const clusterPath = calculateClusterPath(row);
147+
161148
return (
162149
<div className={b('cluster-name')}>
163-
<ExternalLink href={clusterPath}>{row.title || row.name}</ExternalLink>
150+
<ExternalLink href={clusterPath} target={row.clusterDomain ? '_blank' : undefined}>
151+
{row.title || row.name}
152+
</ExternalLink>
164153
</div>
165154
);
166155
}
@@ -358,26 +347,17 @@ interface VersionsProps {
358347
}
359348

360349
function Versions({row}: VersionsProps) {
361-
const {
362-
preparedVersions,
363-
name: clusterName,
364-
preparedBackend: backend,
365-
settings,
366-
use_embedded_ui: useEmbeddedUi,
367-
} = row;
350+
const {preparedVersions} = row;
368351
if (!preparedVersions.length) {
369352
return null;
370353
}
371-
const clusterPath =
372-
useEmbeddedUi && backend
373-
? createDeveloperUIMonitoringPageHref(backend)
374-
: getClusterPath(
375-
{activeTab: clusterTabsIds.versions, environment: settings?.auth_service},
376-
{backend, clusterName},
377-
{withBasename: true},
378-
);
354+
const clusterPath = calculateClusterPath(row, clusterTabsIds.versions);
379355
return (
380-
<ExternalLink className={b('cluster-versions')} href={clusterPath}>
356+
<ExternalLink
357+
className={b('cluster-versions')}
358+
href={clusterPath}
359+
target={row.clusterDomain ? '_blank' : undefined}
360+
>
381361
<VersionsBar preparedVersions={preparedVersions} />
382362
</ExternalLink>
383363
);

src/containers/Clusters/utils.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import {getClusterPath} from '../../routes';
2+
import type {PreparedCluster} from '../../store/reducers/clusters/types';
3+
import {createDeveloperUIMonitoringPageHref} from '../../utils/developerUI/developerUI';
4+
import type {ClusterTab} from '../Cluster/utils';
5+
6+
export function calculateClusterPath(row: PreparedCluster, activeTab?: ClusterTab): string {
7+
const {
8+
use_embedded_ui: useEmbeddedUi,
9+
preparedBackend: backend,
10+
name: clusterName,
11+
clusterDomain,
12+
settings,
13+
} = row;
14+
15+
if (useEmbeddedUi && backend) {
16+
return createDeveloperUIMonitoringPageHref(backend);
17+
}
18+
19+
return getClusterPath(
20+
{
21+
activeTab,
22+
environment: settings?.auth_service,
23+
},
24+
{backend, clusterName},
25+
{withBasename: true},
26+
clusterDomain,
27+
);
28+
}

src/routes.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export function createHref(
7171
params?: Record<string, string | number | undefined>,
7272
query: Query = {},
7373
options: CreateHrefOptions = {},
74+
domain = '',
7475
) {
7576
let extendedQuery = query;
7677
let extendedParams = params ?? {};
@@ -103,9 +104,10 @@ export function createHref(
103104
if (options.withBasename && basename) {
104105
// For SPA links react-router adds basename itself
105106
// It is needed for external links - <a> or uikit <Link>
106-
return normalizePathSlashes(`${basename}/${compiledRoute}`);
107+
return normalizePathSlashes(`${domain}${basename}/${compiledRoute}`);
107108
}
108-
return compiledRoute;
109+
110+
return `${domain}${compiledRoute}`;
109111
}
110112

111113
// embedded version could be located in some folder (e.g. host/some_folder/app_router_path)
@@ -150,8 +152,9 @@ export const getClusterPath = (
150152
params?: {activeTab?: ClusterTab; environment?: string},
151153
query = {},
152154
options?: CreateHrefOptions,
155+
domain?: string,
153156
) => {
154-
return createHref(routes.cluster, params, query, options);
157+
return createHref(routes.cluster, params, query, options, domain);
155158
};
156159

157160
export const getTenantPath = (query: TenantQuery, options?: CreateHrefOptions) => {

src/store/reducers/cluster/parseFields.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export function parseLoggingUrls(
6969

7070
const settingsSchema = z.object({
7171
use_meta_proxy: z.boolean().optional(),
72+
cluster_domain: z.string().optional(),
7273
});
7374

7475
export function parseSettingsField(

src/store/reducers/clusters/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface PreparedCluster extends Omit<MetaExtendedClusterInfo, 'settings
55
preparedVersions: PreparedVersion[];
66
preparedBackend?: string;
77
settings?: MetaClusterSettings;
8+
clusterDomain?: string;
89
}
910

1011
export interface ClustersFilters {

src/store/reducers/clusters/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ export const prepareClustersData = (data: MetaClusters): PreparedCluster[] => {
2828
const parsedSettings = parseSettingsField(cluster.settings);
2929
// If no backend is provided, it will be automatically generated by API instance
3030
const useMetaProxy = uiFactory.useMetaProxy && parsedSettings?.use_meta_proxy !== false;
31+
const clusterDomain = uiFactory.useClusterDomain
32+
? parsedSettings?.cluster_domain
33+
: undefined;
3134
const preparedBackend =
3235
cluster.balancer && !useMetaProxy
3336
? prepareBackendFromBalancer(cluster.balancer)
@@ -38,6 +41,7 @@ export const prepareClustersData = (data: MetaClusters): PreparedCluster[] => {
3841
preparedVersions: prepareClusterVersions(cluster.versions, versionsData),
3942
preparedBackend,
4043
settings: parsedSettings,
44+
clusterDomain,
4145
};
4246
});
4347
};

src/types/api/meta.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,5 @@ export interface MetaClusterTraceCheck {
9898
export interface MetaClusterSettings {
9999
use_meta_proxy?: boolean;
100100
auth_service?: string;
101+
cluster_domain?: string;
101102
}

src/uiFactory/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export interface UIFactory<H extends string = CommonIssueType, T extends string
5050
useDatabaseId?: boolean;
5151

5252
useMetaProxy?: boolean;
53+
useClusterDomain?: boolean;
5354
useMetaSettings?: boolean;
5455

5556
yaMetricaConfig?: {

0 commit comments

Comments
 (0)