Cluster pickers listed every visible cluster, which includes clusters shared with all authenticated users (e.g. the default org's "shared with everyone" clusters). A member of a custom org could then pick another org's cluster for a model deployment or a new worker. Request only the current org's own clusters (mine=true) for: - the model deploy picker (models page), - the deploy-from-model-file picker (model files page), and - the add-worker picker. These resources are owner-scoped on the backend, so the model list and the worker table (including its cluster-name column) only reference own-org clusters. The add-model-file worker cascader is already own-org via the owner-scoped worker list. Platform admin in the "All" view bypasses mine and is scoped instead by the org picker.
76 lines
1.8 KiB
TypeScript
76 lines
1.8 KiB
TypeScript
import { createAxiosToken } from '@/hooks/use-chunk-request';
|
|
import { useRequest } from 'ahooks';
|
|
import { message } from 'antd';
|
|
import { CancelTokenSource } from 'axios';
|
|
import { useEffect, useRef, useState } from 'react';
|
|
import { queryClusterList } from '../apis';
|
|
import { ClusterListItem } from '../config/types';
|
|
|
|
/**
|
|
*
|
|
* @returns loading, fetch, dataList
|
|
*/
|
|
export const useQueryClusterList = (options?: { useStateData?: boolean }) => {
|
|
const { useStateData = true } = options || {};
|
|
const axiosTokenRef = useRef<CancelTokenSource | null>(null);
|
|
const [dataList, setDataList] = useState<
|
|
Array<ClusterListItem & { label: string; value: number }>
|
|
>([]);
|
|
|
|
const {
|
|
runAsync: fetchData,
|
|
loading,
|
|
cancel
|
|
} = useRequest(
|
|
async (params: {
|
|
page: number;
|
|
perPage?: number;
|
|
mine?: boolean;
|
|
gpu_instance_enabled?: boolean;
|
|
}) => {
|
|
axiosTokenRef.current?.cancel();
|
|
axiosTokenRef.current = createAxiosToken();
|
|
const res = await queryClusterList(params, {
|
|
token: axiosTokenRef.current.token
|
|
});
|
|
if (useStateData) {
|
|
setDataList(
|
|
res.items?.map((item: ClusterListItem) => ({
|
|
...item,
|
|
label: item.name,
|
|
value: item.id
|
|
})) || []
|
|
);
|
|
}
|
|
return res.items || [];
|
|
},
|
|
{
|
|
manual: true,
|
|
onSuccess: (response) => {},
|
|
onError: (error) => {
|
|
message.error(error?.message || 'Failed to fetch cluster list');
|
|
setDataList([]);
|
|
}
|
|
}
|
|
);
|
|
|
|
const cancelRequest = () => {
|
|
cancel();
|
|
axiosTokenRef.current?.cancel();
|
|
};
|
|
|
|
useEffect(() => {
|
|
return () => {
|
|
cancel();
|
|
axiosTokenRef.current?.cancel();
|
|
};
|
|
}, []);
|
|
|
|
return {
|
|
loading,
|
|
clusterList: dataList,
|
|
cancelRequest,
|
|
fetchClusterList: fetchData
|
|
};
|
|
};
|