From 7fdabd90a5189a54cb2d3c17faa7025be39ce713 Mon Sep 17 00:00:00 2001 From: jialin Date: Wed, 10 Dec 2025 15:37:05 +0800 Subject: [PATCH] fix: update add worker command --- src/layouts/index.tsx | 3 +-- src/locales/en-US/clusters.ts | 2 +- src/locales/ja-JP/clusters.ts | 4 ++-- src/locales/ru-RU/clusters.ts | 4 ++-- .../add-worker/add-worker-context.ts | 1 + .../components/add-worker/add-worker-step.tsx | 3 +++ .../components/add-worker/index.tsx | 14 +++-------- .../components/add-worker/select-cluster.tsx | 18 ++++++++------ .../components/footer-buttons.tsx | 2 +- .../hooks/use-add-worker.tsx | 4 +++- src/pages/llmodels/apis/index.ts | 4 ++-- src/pages/resources/apis/index.ts | 4 ++-- src/pages/resources/components/workers.tsx | 15 +++++++----- src/pages/resources/config/gpu-driver.ts | 24 +++++++++++-------- src/pages/users/apis/index.ts | 2 +- 15 files changed, 56 insertions(+), 48 deletions(-) diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx index e91667b5..75b124a9 100644 --- a/src/layouts/index.tsx +++ b/src/layouts/index.tsx @@ -45,8 +45,7 @@ const NO_CONTAINER_PAGES = [ 'image', 'text2images', 'clusterDetail', - 'clusterCreate', - 'workers' + 'clusterCreate' ]; const loginPath = DEFAULT_ENTER_PAGE.login; diff --git a/src/locales/en-US/clusters.ts b/src/locales/en-US/clusters.ts index 70fb83ed..95c7184d 100644 --- a/src/locales/en-US/clusters.ts +++ b/src/locales/en-US/clusters.ts @@ -75,7 +75,7 @@ Same applies to the /opt/dtk directory.`, 'clusters.addworker.extraVolume': 'Additional Volume Mount', 'clusters.addworker.cacheVolume': 'Model Cache Volume Mount', 'clusters.addworker.cacheVolume.tips': - 'If you want to custom the model cache directory, you can specify the path to mount it.', + 'If you want to customize the model cache directory, you can specify the path to mount it.', 'clusters.addworker.configSummary': 'Configuration Summary', 'clusters.addworker.gpuVendor': 'GPU Vendor', 'clusters.addworker.workerIP': 'Worker IP', diff --git a/src/locales/ja-JP/clusters.ts b/src/locales/ja-JP/clusters.ts index 0a695984..540396b7 100644 --- a/src/locales/ja-JP/clusters.ts +++ b/src/locales/ja-JP/clusters.ts @@ -75,7 +75,7 @@ Same applies to the /opt/dtk directory.`, 'clusters.addworker.extraVolume': 'Additional Volume Mount', 'clusters.addworker.cacheVolume': 'Model Cache Volume Mount', 'clusters.addworker.cacheVolume.tips': - 'If you want to custom the model cache directory, you can specify the path to mount it.', + 'If you want to customize the model cache directory, you can specify the path to mount it.', 'clusters.addworker.configSummary': 'Configuration Summary', 'clusters.addworker.gpuVendor': 'GPU Vendor', 'clusters.addworker.workerIP': 'Worker IP', @@ -163,6 +163,6 @@ Same applies to the /opt/dtk directory.`, // 69. 'clusters.button.genToken': 'Need to create a new token? Click here.', // 70. 'clusters.addworker.amdNotes-01': `If the /opt/rocm directory does not exist, please create a symbolic link pointing to the ROCm installed path: ln -s /path/to/rocm /opt/rocm.`, // 71. 'clusters.addworker.cacheVolume': 'Model Cache Volume Mount', -// 72. 'clusters.addworker.cacheVolume.tips': 'If you want to custom the model cache directory, you can specify the path to mount it.', +// 72. 'clusters.addworker.cacheVolume.tips': 'If you want to customize the model cache directory, you can specify the path to mount it.', // 73. 'clusters.addworker.cacheVolume.holder': 'e.g. /data/cache (path must start with /)', // ========== End of To-Do List ========== diff --git a/src/locales/ru-RU/clusters.ts b/src/locales/ru-RU/clusters.ts index 7d859247..f36868cd 100644 --- a/src/locales/ru-RU/clusters.ts +++ b/src/locales/ru-RU/clusters.ts @@ -75,7 +75,7 @@ export default { 'clusters.addworker.extraVolume': 'Дополнительное монтирование тома', 'clusters.addworker.cacheVolume': 'Model Cache Volume Mount', 'clusters.addworker.cacheVolume.tips': - 'If you want to custom the model cache directory, you can specify the path to mount it.', + 'If you want to customize the model cache directory, you can specify the path to mount it.', 'clusters.addworker.configSummary': 'Сводка конфигурации', 'clusters.addworker.gpuVendor': 'Производитель GPU', 'clusters.addworker.workerIP': 'IP воркера', @@ -95,5 +95,5 @@ export default { // 1. 'clusters.addworker.amdNotes-01': `If the /opt/rocm directory does not exist, please create a symbolic link pointing to the ROCm installed path: ln -s /path/to/rocm /opt/rocm.`, // 2. 'clusters.button.genToken': 'Need to create a new token? Click here.', // 3. 'clusters.addworker.cacheVolume': 'Model Cache Volume Mount', -// 4. 'clusters.addworker.cacheVolume.tips': 'If you want to custom the model cache directory, you can specify the path to mount it.', +// 4. 'clusters.addworker.cacheVolume.tips': 'If you want to customize the model cache directory, you can specify the path to mount it.', // ================================================================ diff --git a/src/pages/cluster-management/components/add-worker/add-worker-context.ts b/src/pages/cluster-management/components/add-worker/add-worker-context.ts index 5d3d08f0..5d96e9de 100644 --- a/src/pages/cluster-management/components/add-worker/add-worker-context.ts +++ b/src/pages/cluster-management/components/add-worker/add-worker-context.ts @@ -5,6 +5,7 @@ import { SummaryDataKey } from './config'; interface AddWorkerContextProps { clusterList?: Global.BaseOption[]; + clusterLoading?: boolean; provider: ProviderType; stepList: string[]; onClusterChange?: (value: number, row?: any) => void; diff --git a/src/pages/cluster-management/components/add-worker/add-worker-step.tsx b/src/pages/cluster-management/components/add-worker/add-worker-step.tsx index 431f3971..792eb704 100644 --- a/src/pages/cluster-management/components/add-worker/add-worker-step.tsx +++ b/src/pages/cluster-management/components/add-worker/add-worker-step.tsx @@ -30,6 +30,7 @@ const Container = styled.div` type AddWorkerProps = { provider: ProviderType; clusterList?: Global.BaseOption[]; + clusterLoading?: boolean; stepList: StepName[]; onClusterChange?: (value: number, row?: any) => void; registrationInfo: { @@ -50,6 +51,7 @@ const AddWorkerSteps: React.FC = (props) => { registrationInfo, provider, clusterList, + clusterLoading, stepList = [], onClusterChange } = props || {}; @@ -77,6 +79,7 @@ const AddWorkerSteps: React.FC = (props) => { []; + clusterLoading?: boolean; stepList: StepName[]; onClusterChange?: (value: number, row?: any) => void; onCancel: () => void; @@ -47,6 +37,7 @@ const AddWorker: React.FC = (props) => { cluster_id, title, clusterList, + clusterLoading, stepList = [] } = props || {}; const firstLoad = React.useRef(true); @@ -103,6 +94,7 @@ const AddWorker: React.FC = (props) => { stepList={stepList} provider={provider} clusterList={clusterList} + clusterLoading={clusterLoading} onClusterChange={handleOnClusterChange} registrationInfo={registrationInfo} > diff --git a/src/pages/cluster-management/components/add-worker/select-cluster.tsx b/src/pages/cluster-management/components/add-worker/select-cluster.tsx index 4a7d552b..c09f6cca 100644 --- a/src/pages/cluster-management/components/add-worker/select-cluster.tsx +++ b/src/pages/cluster-management/components/add-worker/select-cluster.tsx @@ -1,5 +1,6 @@ import BaseSelect from '@/components/seal-form/base/select'; import { useIntl } from '@umijs/max'; +import { Spin } from 'antd'; import { useEffect } from 'react'; import { useAddWorkerContext } from './add-worker-context'; import { StepNamesMap } from './config'; @@ -9,6 +10,7 @@ import StepCollapse from './step-collapse'; const SelectCluster = () => { const { clusterList, + clusterLoading, registrationInfo, stepList, summary, @@ -55,13 +57,15 @@ const SelectCluster = () => { } > - + + + ); }; diff --git a/src/pages/cluster-management/components/footer-buttons.tsx b/src/pages/cluster-management/components/footer-buttons.tsx index 2c5716aa..57678009 100644 --- a/src/pages/cluster-management/components/footer-buttons.tsx +++ b/src/pages/cluster-management/components/footer-buttons.tsx @@ -43,7 +43,7 @@ const FooterButtons: React.FC = (props) => { )} {showButtons.skip && ( )} {showButtons.save && ( diff --git a/src/pages/cluster-management/hooks/use-add-worker.tsx b/src/pages/cluster-management/hooks/use-add-worker.tsx index 798ffddc..7edc1a4f 100644 --- a/src/pages/cluster-management/hooks/use-add-worker.tsx +++ b/src/pages/cluster-management/hooks/use-add-worker.tsx @@ -11,10 +11,11 @@ import { import { ClusterListItem } from '../config/types'; const useAddWorker = (props: { + clusterLoading?: boolean; clusterList?: Global.BaseOption[]; }) => { const intl = useIntl(); - const { clusterList } = props || {}; + const { clusterList, clusterLoading } = props || {}; const [stepList, setStepList] = useState([]); const [openAddWorker, setOpenAddWorker] = useState<{ open: boolean; @@ -73,6 +74,7 @@ const useAddWorker = (props: { open={openAddWorker.open} provider={openAddWorker.provider} clusterList={clusterDataList} + clusterLoading={clusterLoading} cluster_id={openAddWorker.cluster_id} onClusterChange={handleClusterChange} onCancel={() => diff --git a/src/pages/llmodels/apis/index.ts b/src/pages/llmodels/apis/index.ts index c25b4824..24b7ad9a 100644 --- a/src/pages/llmodels/apis/index.ts +++ b/src/pages/llmodels/apis/index.ts @@ -56,7 +56,7 @@ export async function queryModelsList( return request>( `${MODELS_API}?${qs.stringify(params)}`, { - methos: 'GET', + method: 'GET', ...options } ); @@ -360,7 +360,7 @@ export async function queryCatalogList( return request>( `/model-sets?${qs.stringify(params)}`, { - methos: 'GET', + method: 'GET', ...options } ); diff --git a/src/pages/resources/apis/index.ts b/src/pages/resources/apis/index.ts index 69dd9298..daa0c10a 100644 --- a/src/pages/resources/apis/index.ts +++ b/src/pages/resources/apis/index.ts @@ -52,14 +52,14 @@ export async function queryWorkersList>( export async function queryGpuDevicesList(params: Global.SearchParams) { return request>(`${GPU_DEVICES_API}`, { - methos: 'GET', + method: 'GET', params }); } export async function queryGPUDeviceItem(id: string) { return request(`${GPU_DEVICES_API}/${id}`, { - methos: 'GET' + method: 'GET' }); } diff --git a/src/pages/resources/components/workers.tsx b/src/pages/resources/components/workers.tsx index d1463605..ade364ca 100644 --- a/src/pages/resources/components/workers.tsx +++ b/src/pages/resources/components/workers.tsx @@ -1,7 +1,7 @@ import DeleteModal from '@/components/delete-modal'; import { FilterBar } from '@/components/page-tools'; import useTableFetch from '@/hooks/use-table-fetch'; -import { PageContainerInner } from '@/pages/_components/page-box'; +import PageBox from '@/pages/_components/page-box'; import { queryClusterList } from '@/pages/cluster-management/apis'; import { DockerStepsFromWorker } from '@/pages/cluster-management/components/add-worker/config'; import { @@ -65,9 +65,11 @@ const Workers: React.FC = () => { }); const [clusterData, setClusterData] = useState<{ list: Global.BaseOption[]; + loading: boolean; data: Record; }>({ list: [], + loading: false, data: {} }); const [workerDetailStatus, setWorkerDetailStatus] = useState<{ @@ -78,7 +80,8 @@ const Workers: React.FC = () => { currentData: null }); const { handleAddWorker, AddWorkerModal, setStepList } = useAddWorker({ - clusterList: clusterData.list + clusterList: clusterData.list, + clusterLoading: clusterData.loading }); const getClusterList = async () => { @@ -103,11 +106,13 @@ const Workers: React.FC = () => { })); setClusterData({ list, + loading: false, data: clusterMap }); } catch (error) { setClusterData({ list: [], + loading: false, data: {} }); } @@ -243,9 +248,7 @@ const Workers: React.FC = () => { return ( <> - + { /> {MaintenanceModal} {AddWorkerModal} - + ); }; diff --git a/src/pages/resources/config/gpu-driver.ts b/src/pages/resources/config/gpu-driver.ts index d542e757..adc07e15 100644 --- a/src/pages/resources/config/gpu-driver.ts +++ b/src/pages/resources/config/gpu-driver.ts @@ -81,7 +81,10 @@ const generateNvidiaDockerEnvCommand = (config: { runtime: string; driver: string; }) => { - return `${config.driver} >/dev/null 2>&1 && echo "${config.label} driver OK" || (echo "${config.label} driver issue"; exit 1) && sudo docker info 2>/dev/null | grep -q "${config.runtime}" && echo "${config.label} Container Toolkit OK" || (echo "${config.label} Container Toolkit not configured"; exit 1)`; + const runtimeCheck = + config.runtime === 'nvidia' ? 'Runtime.*nvidia' : config.runtime; + + return `${config.driver} >/dev/null 2>&1 && echo "${config.label} driver OK" || (echo "${config.label} driver issue"; exit 1) && sudo docker info 2>/dev/null | grep -q "${runtimeCheck}" && echo "${config.label} Container Toolkit OK" || (echo "${config.label} Container Toolkit not configured"; exit 1)`; }; // avaliable for Hygon、Iluvatar、MetaX 、Cambricon @@ -127,15 +130,16 @@ export const dockerEnvCommandMap = { ) }; const setNormalArgs = (params: any) => { - console.log('params++++++++++++++', params); - return `sudo docker run -d --name gpustack-worker \\ - --restart=unless-stopped \\ - --privileged \\ - --network=host \\ - --volume /var/run/docker.sock:/var/run/docker.sock \\ - --volume gpustack-data:/var/lib/gpustack \\ - ${params.modelDir ? `--volume ${params.modelDir}:${params.modelDir} \\` : ''} - ${params.cacheDir ? `--volume ${params.cacheDir}:/var/lib/gpustack/cache \\` : ''}`; + return `CONTAINER_NAME="gpustack-worker" \\ +sudo docker run -d --name \${CONTAINER_NAME} \\ + -e GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${CONTAINER_NAME} \\ + --restart=unless-stopped \\ + --privileged \\ + --network=host \\ + --volume /var/run/docker.sock:/var/run/docker.sock \\ + --volume gpustack-data:/var/lib/gpustack \\ + ${params.modelDir ? `--volume ${params.modelDir}:${params.modelDir} \\` : ''} + ${params.cacheDir ? `--volume ${params.cacheDir}:/var/lib/gpustack/cache \\` : ''}`; }; const setImageArgs = (params: any) => { diff --git a/src/pages/users/apis/index.ts b/src/pages/users/apis/index.ts index ce7d26d1..65030d05 100644 --- a/src/pages/users/apis/index.ts +++ b/src/pages/users/apis/index.ts @@ -5,7 +5,7 @@ export const USERS_API = '/users'; export async function queryUsersList(params: Global.SearchParams) { return request>(`${USERS_API}`, { - methos: 'GET', + method: 'GET', params }); }