From aa4953921092d924f5cd50df7791d4eedd86cf0e Mon Sep 17 00:00:00 2001 From: jialin Date: Wed, 17 Jun 2026 12:11:28 +0800 Subject: [PATCH] fix: select gpu stype when creating cluster from gpu service --- src/atoms/clusters.ts | 1 + .../cluster-management/cluster-create.tsx | 10 ++++++++- .../cluster-management/cluster-modal.tsx | 13 ++++++----- src/pages/cluster-management/clusters.tsx | 22 ++++++++++++++----- .../components/k8s-pod-spec.tsx | 8 +++++++ .../config/steps-context.tsx | 4 +++- src/pages/gpu-service/instances/index.tsx | 1 + 7 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/atoms/clusters.ts b/src/atoms/clusters.ts index 9f438421..31ba3fd5 100644 --- a/src/atoms/clusters.ts +++ b/src/atoms/clusters.ts @@ -63,6 +63,7 @@ export const fromClusterCreationAtom = atom(false); export const clusterSessionAtom = atom<{ firstAddWorker: boolean; firstAddCluster: boolean; + presetClusterType?: 'model' | 'gpu'; // Provider to preselect when the create flow opens — set by the // empty-state CTA on feature pages that need a specific provider // (e.g. GPU Service can only schedule on Kubernetes, so its diff --git a/src/pages/cluster-management/cluster-create.tsx b/src/pages/cluster-management/cluster-create.tsx index c634ea13..5f0b9825 100644 --- a/src/pages/cluster-management/cluster-create.tsx +++ b/src/pages/cluster-management/cluster-create.tsx @@ -59,9 +59,16 @@ const ClusterCreate: React.FC<{ // empty-state CTAs that already know which kind of cluster the user // is heading for (e.g. GPU Service's "Add a Kubernetes Cluster"). providerHint?: string; + presetClusterType?: 'model' | 'gpu'; setCurrentTitle?: (title: string) => void; onClose?: () => void; -}> = ({ onClose, action, providerHint, setCurrentTitle }) => { +}> = ({ + onClose, + action, + providerHint, + presetClusterType, + setCurrentTitle +}) => { const stepList = useStepList(); const [systemConfigState] = useAtom(systemConfigAtom); const intl = useIntl(); @@ -377,6 +384,7 @@ const ClusterCreate: React.FC<{ )} void; } @@ -17,7 +17,7 @@ const ClusterModal: React.FC = ({ open, onClose, title, - providerHint + pendingProviderHint }) => { const [currentTitle, setCurrentTitle] = React.useState(title); const handleCancel = () => { @@ -46,7 +46,8 @@ const ClusterModal: React.FC = ({ diff --git a/src/pages/cluster-management/clusters.tsx b/src/pages/cluster-management/clusters.tsx index 4e1d1df7..c3fd638e 100644 --- a/src/pages/cluster-management/clusters.tsx +++ b/src/pages/cluster-management/clusters.tsx @@ -321,13 +321,20 @@ const Clusters: React.FC = () => { // the session atom is cleared right after we open the modal, but // ClusterCreate mounts a tick later and needs the value to skip the // provider-catalog step. Cache it locally and clear on close. - const [pendingProviderHint, setPendingProviderHint] = useState< - string | undefined - >(undefined); + const [pendingProviderHint, setPendingProviderHint] = useState<{ + providerHint?: string; + presetClusterType?: 'model' | 'gpu'; + }>({ + providerHint: '', + presetClusterType: undefined + }); useEffect(() => { if (clusterSession?.firstAddCluster && dataSource.loadend) { - setPendingProviderHint(clusterSession.providerHint); + setPendingProviderHint({ + providerHint: clusterSession.providerHint, + presetClusterType: clusterSession.presetClusterType + }); openClusterModal(); // reset session setClusterSession(null); @@ -335,7 +342,10 @@ const Clusters: React.FC = () => { }, [clusterSession, dataSource.loadend]); const handleClusterModalClose = () => { - setPendingProviderHint(undefined); + setPendingProviderHint({ + providerHint: '', + presetClusterType: undefined + }); closeClusterModal(); }; @@ -464,7 +474,7 @@ const Clusters: React.FC = () => { id: 'menu.resources.clusterCreate' })} open={clusterModalStatus.open} - providerHint={pendingProviderHint} + pendingProviderHint={pendingProviderHint} onClose={handleClusterModalClose} > {AddWorkerModal} diff --git a/src/pages/cluster-management/components/k8s-pod-spec.tsx b/src/pages/cluster-management/components/k8s-pod-spec.tsx index 289a0d69..6e41e10b 100644 --- a/src/pages/cluster-management/components/k8s-pod-spec.tsx +++ b/src/pages/cluster-management/components/k8s-pod-spec.tsx @@ -6,6 +6,7 @@ import { Form } from 'antd'; import _ from 'lodash'; import React, { useEffect, useId, useMemo } from 'react'; import styled from 'styled-components'; +import { useStepsContext } from '../config/steps-context'; import { ClusterListItem as ListItem } from '../config/types'; import ImageCredential from './image-credential'; import K8SVolumeMount from './k8s-volume-mount'; @@ -175,6 +176,7 @@ const RadioDot = styled.span<{ $active: boolean }>` export const ClusterTypeSelector: React.FC = () => { const intl = useIntl(); const form = Form.useFormInstance(); + const { presetClusterType } = useStepsContext(); const labelId = useId(); const gpuInstanceOptions = Form.useWatch(GPU_INSTANCE_OPTIONS_PATH, { form, @@ -211,6 +213,12 @@ export const ClusterTypeSelector: React.FC = () => { } ]; + useEffect(() => { + if (presetClusterType) { + handleSelect(presetClusterType); + } + }, [presetClusterType]); + return ( diff --git a/src/pages/cluster-management/config/steps-context.tsx b/src/pages/cluster-management/config/steps-context.tsx index af6f2b3d..09b32d07 100644 --- a/src/pages/cluster-management/config/steps-context.tsx +++ b/src/pages/cluster-management/config/steps-context.tsx @@ -1,13 +1,15 @@ import { createContext, useContext } from 'react'; export interface StepsContextProps { + presetClusterType?: 'model' | 'gpu'; formValues: Record; systemConfig?: Record; } export const StepsContext = createContext({ formValues: {}, - systemConfig: {} + systemConfig: {}, + presetClusterType: undefined }); export const useStepsContext = () => useContext(StepsContext); diff --git a/src/pages/gpu-service/instances/index.tsx b/src/pages/gpu-service/instances/index.tsx index 69ec89c0..75688189 100644 --- a/src/pages/gpu-service/instances/index.tsx +++ b/src/pages/gpu-service/instances/index.tsx @@ -51,6 +51,7 @@ const GPUService: React.FC = () => { setClusterSession({ firstAddWorker: false, firstAddCluster: true, + presetClusterType: 'gpu', providerHint: ProviderValueMap.Kubernetes }); navigate('/resources/clusters/list');