Skip to content

Commit ab99d1b

Browse files
authored
feat: support meta/databases handler (#2782)
1 parent 642ea8a commit ab99d1b

File tree

12 files changed

+113
-31
lines changed

12 files changed

+113
-31
lines changed

src/components/ConnectToDB/ConnectToDBDialog.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import NiceModal from '@ebay/nice-modal-react';
44
import {Dialog, Tab, TabList, TabProvider} from '@gravity-ui/uikit';
55
import {skipToken} from '@reduxjs/toolkit/query';
66

7+
import {useDatabasesAvailable} from '../../store/reducers/capabilities/hooks';
78
import {tenantApi} from '../../store/reducers/tenant/tenant';
89
import {cn} from '../../utils/cn';
910
import {useTypedSelector} from '../../utils/hooks';
@@ -48,11 +49,15 @@ function ConnectToDBDialog({
4849
const clusterName = useClusterNameFromQuery();
4950
const singleClusterMode = useTypedSelector((state) => state.singleClusterMode);
5051

52+
const isMetaDatabasesAvailable = useDatabasesAvailable();
53+
5154
// If there is endpoint from props, we don't need to request tenant data
5255
// Also we should not request tenant data if we are in single cluster mode
5356
// Since there is no ControlPlane data in this case
5457
const shouldRequestTenantData = database && !endpointFromProps && !singleClusterMode;
55-
const params = shouldRequestTenantData ? {path: database, clusterName} : skipToken;
58+
const params = shouldRequestTenantData
59+
? {path: database, clusterName, isMetaDatabasesAvailable}
60+
: skipToken;
5661
const {currentData: tenantData, isLoading: isTenantDataLoading} =
5762
tenantApi.useGetTenantInfoQuery(params);
5863
const endpoint = endpointFromProps ?? tenantData?.ControlPlane?.endpoint;

src/containers/Header/Header.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {getConnectToDBDialog} from '../../components/ConnectToDB/ConnectToDBDial
1717
import {InternalLink} from '../../components/InternalLink';
1818
import {
1919
useAddClusterFeatureAvailable,
20+
useDatabasesAvailable,
2021
useDeleteDatabaseFeatureAvailable,
2122
useEditDatabaseFeatureAvailable,
2223
} from '../../store/reducers/capabilities/hooks';
@@ -50,6 +51,8 @@ function Header() {
5051
const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
5152
const isViewerUser = useIsViewerUser();
5253

54+
const isMetaDatabasesAvailable = useDatabasesAvailable();
55+
5356
const {title: clusterTitle} = useClusterBaseInfo();
5457

5558
const database = useDatabaseFromQuery();
@@ -71,7 +74,9 @@ function Header() {
7174
const shouldRequestTenantData =
7275
database && isDatabasePage && (isEditDBAvailable || isDeleteDBAvailable);
7376

74-
const params = shouldRequestTenantData ? {path: database, clusterName} : skipToken;
77+
const params = shouldRequestTenantData
78+
? {path: database, clusterName, isMetaDatabasesAvailable}
79+
: skipToken;
7580

7681
const {currentData: databaseData, isLoading: isDatabaseDataLoading} =
7782
tenantApi.useGetTenantInfoQuery(params);

src/containers/Tenant/Diagnostics/Diagnostics.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ const b = cn('kv-tenant-diagnostics');
5050

5151
function Diagnostics(props: DiagnosticsProps) {
5252
const {path, database, type, subType} = useCurrentSchema();
53-
const {controlPlane} = useTenantBaseInfo(path);
5453
const containerRef = React.useRef<HTMLDivElement>(null);
5554
const dispatch = useTypedDispatch();
5655
const {diagnosticsTab = TENANT_DIAGNOSTICS_TABS_IDS.overview} = useTypedSelector(
@@ -61,6 +60,8 @@ function Diagnostics(props: DiagnosticsProps) {
6160

6261
const tenantName = isDatabaseEntityType(type) ? path : database;
6362

63+
const {controlPlane} = useTenantBaseInfo(isDatabaseEntityType(type) ? path : '');
64+
6465
const hasFeatureFlags = useFeatureFlagsAvailable();
6566
const hasTopicData = useTopicDataAvailable();
6667
const isViewerUser = useIsViewerUser();

src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {Button, Flex, Icon} from '@gravity-ui/uikit';
33
import {EntityStatus} from '../../../../components/EntityStatus/EntityStatus';
44
import {LoaderWrapper} from '../../../../components/LoaderWrapper/LoaderWrapper';
55
import {QueriesActivityBar} from '../../../../components/QueriesActivityBar/QueriesActivityBar';
6+
import {useDatabasesAvailable} from '../../../../store/reducers/capabilities/hooks';
67
import {overviewApi} from '../../../../store/reducers/overview/overview';
78
import {TENANT_METRICS_TABS_IDS} from '../../../../store/reducers/tenant/constants';
89
import {tenantApi} from '../../../../store/reducers/tenant/tenant';
@@ -39,8 +40,10 @@ export function TenantOverview({
3940
const [autoRefreshInterval] = useAutoRefreshInterval();
4041
const clusterName = useClusterNameFromQuery();
4142

43+
const isMetaDatabasesAvailable = useDatabasesAvailable();
44+
4245
const {currentData: tenant, isFetching} = tenantApi.useGetTenantInfoQuery(
43-
{path: tenantName, clusterName},
46+
{path: tenantName, clusterName, isMetaDatabasesAvailable},
4447
{pollingInterval: autoRefreshInterval},
4548
);
4649
const tenantLoading = isFetching && tenant === undefined;

src/containers/Tenant/Tenant.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import SplitPane from '../../components/SplitPane';
88
import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
99
import {overviewApi} from '../../store/reducers/overview/overview';
1010
import {selectSchemaObjectData} from '../../store/reducers/schema/schema';
11+
import {useTenantBaseInfo} from '../../store/reducers/tenant/tenant';
1112
import type {AdditionalNodesProps, AdditionalTenantsProps} from '../../types/additionalProps';
1213
import {cn} from '../../utils/cn';
1314
import {DEFAULT_IS_TENANT_SUMMARY_COLLAPSED, DEFAULT_SIZE_TENANT_KEY} from '../../utils/constants';
@@ -55,6 +56,8 @@ export function Tenant(props: TenantProps) {
5556

5657
const {database, schema} = useTenantQueryParams();
5758

59+
const {controlPlane, name} = useTenantBaseInfo(database ?? '');
60+
5861
if (!database) {
5962
throw new Error('Tenant name is not defined');
6063
}
@@ -73,11 +76,6 @@ export function Tenant(props: TenantProps) {
7376
}
7477
}, [database]);
7578

76-
const dispatch = useTypedDispatch();
77-
React.useEffect(() => {
78-
dispatch(setHeaderBreadcrumbs('tenant', {tenantName: database}));
79-
}, [database, dispatch]);
80-
8179
const path = schema ?? database;
8280

8381
const {
@@ -86,6 +84,13 @@ export function Tenant(props: TenantProps) {
8684
isLoading,
8785
} = overviewApi.useGetOverviewQuery({path, database: database});
8886

87+
const databaseName = name ?? controlPlane?.name ?? database;
88+
89+
const dispatch = useTypedDispatch();
90+
React.useEffect(() => {
91+
dispatch(setHeaderBreadcrumbs('tenant', {tenantName: databaseName}));
92+
}, [databaseName, dispatch]);
93+
8994
const preloadedData = useTypedSelector((state) =>
9095
selectSchemaObjectData(state, path, database),
9196
);

src/containers/Tenant/useTenantQueryParams.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export function useTenantQueryParams() {
1818
});
1919
const handleShowHealthcheckChange = React.useCallback(
2020
(value?: boolean) => {
21-
setQueryParams({showHealthcheck: value}, 'replaceIn');
21+
setQueryParams({showHealthcheck: value || undefined}, 'replaceIn');
2222
},
2323
[setQueryParams],
2424
);
@@ -56,7 +56,7 @@ export function useTenantQueryParams() {
5656
);
5757
const handleHealthcheckViewChange = React.useCallback(
5858
(value?: string) => {
59-
setQueryParams({view: value || undefined}, 'replaceIn');
59+
setQueryParams({view: value}, 'replaceIn');
6060
},
6161
[setQueryParams],
6262
);

src/containers/Tenants/Tenants.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {TableWithControlsLayout} from '../../components/TableWithControlsLayout/
1717
import {TenantNameWrapper} from '../../components/TenantNameWrapper/TenantNameWrapper';
1818
import {
1919
useCreateDatabaseFeatureAvailable,
20+
useDatabasesAvailable,
2021
useDeleteDatabaseFeatureAvailable,
2122
useEditDatabaseFeatureAvailable,
2223
} from '../../store/reducers/capabilities/hooks';
@@ -73,10 +74,10 @@ export const Tenants = ({additionalTenantsProps, scrollContainerRef}: TenantsPro
7374
const dispatch = useTypedDispatch();
7475

7576
const clusterName = useClusterNameFromQuery();
76-
77+
const isMetaDatabasesAvailable = useDatabasesAvailable();
7778
const [autoRefreshInterval] = useAutoRefreshInterval();
7879
const {currentData, isFetching, error} = tenantsApi.useGetTenantsInfoQuery(
79-
{clusterName},
80+
{clusterName, isMetaDatabasesAvailable},
8081
{pollingInterval: autoRefreshInterval},
8182
);
8283
const loading = isFetching && currentData === undefined;

src/services/api/meta.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type {AxiosOptions} from './base';
1212
import {BaseYdbAPI} from './base';
1313

1414
export class MetaAPI extends BaseYdbAPI {
15-
getPath(path: string) {
15+
getPath(path: string, _clusterName?: string) {
1616
return `${META_BACKEND ?? ''}${path}`;
1717
}
1818

@@ -31,14 +31,29 @@ export class MetaAPI extends BaseYdbAPI {
3131
}
3232

3333
getTenants(
34-
{clusterName, databaseName}: {clusterName?: string; databaseName?: string},
34+
{clusterName, path}: {clusterName?: string; path?: string},
3535
{signal}: AxiosOptions = {},
3636
) {
3737
return this.get<MetaTenants>(
38-
this.getPath('/meta/cp_databases'),
38+
this.getPath('/meta/cp_databases', clusterName),
3939
{
4040
cluster_name: clusterName,
41-
database_name: databaseName,
41+
database_name: path,
42+
database: path,
43+
},
44+
{requestConfig: {signal}},
45+
).then(parseMetaTenants);
46+
}
47+
48+
getTenantsV2(
49+
{path, clusterName}: {clusterName?: string; path?: string},
50+
{signal}: AxiosOptions = {},
51+
) {
52+
return this.get<MetaTenants>(
53+
this.getPath('/meta/databases', clusterName),
54+
{
55+
cluster_name: clusterName,
56+
database: path,
4257
},
4358
{requestConfig: {signal}},
4459
).then(parseMetaTenants);
@@ -49,7 +64,7 @@ export class MetaAPI extends BaseYdbAPI {
4964
{concurrentId, signal}: AxiosOptions = {},
5065
): Promise<MetaBaseClusterInfo> {
5166
return this.get<MetaBaseClusters>(
52-
this.getPath('/meta/db_clusters'),
67+
this.getPath('/meta/db_clusters', clusterName),
5368
{
5469
name: clusterName,
5570
},

src/store/reducers/capabilities/hooks.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,7 @@ export const useDeleteClusterFeatureAvailable = () => {
161161
export const useClusterEventsAvailable = () => {
162162
return useGetMetaFeatureVersion('/meta/events') >= 1;
163163
};
164+
165+
export const useDatabasesAvailable = () => {
166+
return useGetMetaFeatureVersion('/meta/databases') >= 1;
167+
};

src/store/reducers/tenant/tenant.ts

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {TTenantInfo} from '../../../types/api/tenant';
66
import {TENANT_INITIAL_PAGE_KEY} from '../../../utils/constants';
77
import {useClusterNameFromQuery} from '../../../utils/hooks/useDatabaseFromQuery';
88
import {api} from '../api';
9+
import {useDatabasesAvailable} from '../capabilities/hooks';
910
import {prepareTenants} from '../tenants/utils';
1011

1112
import {TENANT_DIAGNOSTICS_TABS_IDS, TENANT_METRICS_TABS_IDS} from './constants';
@@ -62,14 +63,27 @@ export const tenantApi = api.injectEndpoints({
6263
endpoints: (builder) => ({
6364
getTenantInfo: builder.query({
6465
queryFn: async (
65-
{path, clusterName}: {path: string; clusterName?: string},
66+
{
67+
path,
68+
clusterName,
69+
isMetaDatabasesAvailable,
70+
}: {
71+
path: string;
72+
clusterName?: string;
73+
isMetaDatabasesAvailable: boolean;
74+
},
6675
{signal},
6776
) => {
6877
try {
6978
let tenantData: TTenantInfo;
70-
if (window.api.meta && clusterName) {
79+
if (window.api.meta && clusterName && isMetaDatabasesAvailable) {
80+
tenantData = await window.api.meta.getTenantsV2(
81+
{path, clusterName},
82+
{signal},
83+
);
84+
} else if (window.api.meta && clusterName) {
7185
tenantData = await window.api.meta.getTenants(
72-
{databaseName: path, clusterName},
86+
{path, clusterName},
7387
{signal},
7488
);
7589
} else {
@@ -85,7 +99,12 @@ export const tenantApi = api.injectEndpoints({
8599
}
86100
},
87101
providesTags: ['All'],
102+
serializeQueryArgs: ({queryArgs}) => {
103+
const {clusterName, path} = queryArgs;
104+
return {clusterName, path};
105+
},
88106
}),
107+
89108
getClusterConfig: builder.query({
90109
queryFn: async ({database}: {database: string}, {signal}) => {
91110
try {
@@ -105,15 +124,21 @@ export const tenantApi = api.injectEndpoints({
105124

106125
export function useTenantBaseInfo(path: string) {
107126
const clusterNameFromQuery = useClusterNameFromQuery();
127+
const isMetaDatabasesAvailable = useDatabasesAvailable();
108128

109-
const {currentData} = tenantApi.useGetTenantInfoQuery({
110-
path,
111-
clusterName: clusterNameFromQuery,
112-
});
129+
const {currentData} = tenantApi.useGetTenantInfoQuery(
130+
{
131+
path,
132+
clusterName: clusterNameFromQuery,
133+
isMetaDatabasesAvailable,
134+
},
135+
{skip: !path},
136+
);
113137

114-
const {ControlPlane} = currentData || {};
138+
const {ControlPlane, Name} = currentData || {};
115139

116140
return {
117141
controlPlane: ControlPlane,
142+
name: Name,
118143
};
119144
}

0 commit comments

Comments
 (0)