export function ClusterDeploy()

in frontend/src/routes/space/new-cluster/steps/cluster-deploy/cluster-deploy.tsx [43:162]


export function ClusterDeploy(props: any) {
    const { reqInfo, step } = useContext(NewSpaceInfoContext);
    const [activeKey, setActiveKey] = useState(DorisNodeTypeEnum.FE);
    const [instances, setInstances] = useState<any[]>([]);
    const [stepDisabled, setStepDisabled] = useRecoilState(stepDisabledState);
    const [readyLoading, setReadyLoading] = useState(true);
    const getJDBCReady = useRequest<IResult<any>, any>(
        (clusterId: string) => {
            return SpaceAPI.getJDBCReady<any>({ clusterId });
        },
        {
            manual: true,
            pollingInterval: 1000,
            onSuccess: (res: any) => {
                if (isSuccess(res)) {
                    const data: boolean = res.data;
                    if (data) {
                        getJDBCReady.cancel();
                        setReadyLoading(false);
                        setStepDisabled({ ...stepDisabled, next: false });
                    }
                }
            },
            onError: () => {
                if (reqInfo.cluster_id) {
                    message.error('请求出错');
                }
            },
        },
    );
    const getClusterInstances = useRequest<IResult<any>, any>(
        (clusterId: string) => {
            return SpaceAPI.getClusterInstance<any>({ clusterId });
        },
        {
            manual: true,
            pollingInterval: 2000,
            onSuccess: (res: any) => {
                if (isSuccess(res)) {
                    const data: any[] = res.data;
                    setInstances(data);
                    const failedInstance = data.find(item => ERROR_STATUS.includes(item.operateStatus));
                    if (failedInstance) {
                        message.error(failedInstance.operateResult);
                        getClusterInstances.cancel();
                    }
                    if (
                        data.every(item => item.operateStatus === OperateStatusEnum.SUCCESS && item.operateStage === 3)
                    ) {
                        getClusterInstances.cancel();
                        getJDBCReady.run(reqInfo.cluster_id);
                    }
                }
            },
            onError: () => {
                if (reqInfo.cluster_id) {
                    message.error('请求出错');
                }
            },
        },
    );

    useEffect(() => {
        if (reqInfo.cluster_id && step === 6) {
            getClusterInstances.run(reqInfo.cluster_id);
        }
        return () => {
            getClusterInstances.cancel();
            getClusterInstances.cancel();
        };
    }, [reqInfo.cluster_id, step]);

    const getStepStatus = (record: any) => {
        const currentStepStatus = OperateStatusEnum.getStepStatus(record.operateStatus);
        if (currentStepStatus === 'error') return 'error';
        return readyLoading ? 'process' : 'finish';
    };

    const columns = [
        {
            title: '序号',
            dataIndex: 'instanceId',
        },
        {
            title: '节点IP',
            dataIndex: 'nodeHost',
        },
        {
            title: '安装进度',
            dataIndex: 'operateStage',
            render: (operateStage: number, record: any) => (
                <Steps
                    progressDot={(iconDot, { status }) => {
                        if (status === 'process') return <LoadingOutlined style={{ color: '#1890ff' }} />;
                        return iconDot;
                    }}
                    status={getStepStatus(record)}
                    current={record.operateStage - 1}
                    size="small"
                    style={{ marginLeft: -50 }}
                >
                    {Object.keys(STEP_MAP).map((stepKey, index) => (
                        <Step key={index} style={{ width: 80 }} title={STEP_MAP[stepKey]} />
                    ))}
                </Steps>
            ),
        },
    ];

    const getTableDataSource = (activeKey: string) => {
        return instances.filter(item => item.moduleName === activeKey.toLowerCase());
    };

    return (
        <PageContainer
            header={{
                title: <h2>部署集群</h2>,
            }}
        >
            <Tabs activeKey={activeKey} onChange={(key: any) => setActiveKey(key)} type="card">