|
|
|
@@ -3,7 +3,6 @@ import { ExperimentStatus } from '@/enums'; |
|
|
|
import { useStateRef } from '@/hooks/useStateRef'; |
|
|
|
import { useVisible } from '@/hooks/useVisible'; |
|
|
|
import { getExperimentIns } from '@/services/experiment/index.js'; |
|
|
|
import { getWorkflowById } from '@/services/pipeline/index.js'; |
|
|
|
import themes from '@/styles/theme.less'; |
|
|
|
import { fittingString, parseJsonText } from '@/utils'; |
|
|
|
import { formatDate } from '@/utils/date'; |
|
|
|
@@ -40,7 +39,7 @@ function ExperimentText() { |
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
initGraph(); |
|
|
|
getWorkflow(); |
|
|
|
getExperimentInstance(); |
|
|
|
|
|
|
|
return () => { |
|
|
|
if (evtSourceRef.current) { |
|
|
|
@@ -66,38 +65,54 @@ function ExperimentText() { |
|
|
|
}, []); |
|
|
|
|
|
|
|
// 获取流水线模版 |
|
|
|
const getWorkflow = async () => { |
|
|
|
const [res] = await to(getWorkflowById(locationParams.workflowId)); |
|
|
|
if (res && res.data && res.data.dag) { |
|
|
|
try { |
|
|
|
const dag = JSON.parse(res.data.dag); |
|
|
|
dag.nodes.forEach((item) => { |
|
|
|
item.in_parameters = JSON.parse(item.in_parameters); |
|
|
|
item.out_parameters = JSON.parse(item.out_parameters); |
|
|
|
item.control_strategy = JSON.parse(item.control_strategy); |
|
|
|
item.imgName = item.img.slice(0, item.img.length - 4); |
|
|
|
}); |
|
|
|
workflowRef.current = dag; |
|
|
|
getExperimentInstance(); |
|
|
|
} catch (error) { |
|
|
|
// JSON.parse 错误 |
|
|
|
console.error('JSON.parse error: ', error); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
// const getWorkflow = async () => { |
|
|
|
// const [res] = await to(getWorkflowById(locationParams.workflowId)); |
|
|
|
// if (res && res.data && res.data.dag) { |
|
|
|
// try { |
|
|
|
// const dag = JSON.parse(res.data.dag); |
|
|
|
// dag.nodes.forEach((item) => { |
|
|
|
// item.in_parameters = JSON.parse(item.in_parameters); |
|
|
|
// item.out_parameters = JSON.parse(item.out_parameters); |
|
|
|
// item.control_strategy = JSON.parse(item.control_strategy); |
|
|
|
// item.imgName = item.img.slice(0, item.img.length - 4); |
|
|
|
// }); |
|
|
|
// workflowRef.current = dag; |
|
|
|
// getExperimentInstance(); |
|
|
|
// } catch (error) { |
|
|
|
// // JSON.parse 错误 |
|
|
|
// console.error('JSON.parse error: ', error); |
|
|
|
// } |
|
|
|
// } |
|
|
|
// }; |
|
|
|
|
|
|
|
// 获取实验实例 |
|
|
|
const getExperimentInstance = async () => { |
|
|
|
const [res] = await to(getExperimentIns(locationParams.id)); |
|
|
|
if (res && res.data && workflowRef.current) { |
|
|
|
if (res && res.data) { |
|
|
|
setExperimentIns(res.data); |
|
|
|
const { status, nodes_status, argo_ins_ns, argo_ins_name, finish_time } = res.data; |
|
|
|
const workflowData = workflowRef.current; |
|
|
|
const { status, nodes_status, argo_ins_ns, argo_ins_name, finish_time, dag } = res.data; |
|
|
|
if (!dag) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const workflow = parseJsonText(dag); |
|
|
|
const experimentStatusObjs = parseJsonText(nodes_status); |
|
|
|
if (!workflow || !workflow.nodes) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
workflow.nodes.forEach((item) => { |
|
|
|
item.in_parameters = parseJsonText(item.in_parameters); |
|
|
|
item.out_parameters = parseJsonText(item.out_parameters); |
|
|
|
item.control_strategy = parseJsonText(item.control_strategy); |
|
|
|
item.imgName = item.img.slice(0, item.img.length - 4); |
|
|
|
}); |
|
|
|
workflowRef.current = workflow; |
|
|
|
|
|
|
|
if (experimentStatusObjs) { |
|
|
|
// 更新各个节点 |
|
|
|
workflowData.nodes.forEach((item) => { |
|
|
|
const experimentNode = experimentStatusObjs?.[item.id]; |
|
|
|
workflow.nodes.forEach((item) => { |
|
|
|
const experimentNode = experimentStatusObjs[item.id]; |
|
|
|
updateWorkflowNode(item, experimentNode); |
|
|
|
}); |
|
|
|
|
|
|
|
@@ -113,11 +128,11 @@ function ExperimentText() { |
|
|
|
} |
|
|
|
|
|
|
|
// 绘制图 |
|
|
|
getGraphData(workflowData, true); |
|
|
|
getGraphData(workflow, true); |
|
|
|
|
|
|
|
if (status === ExperimentStatus.Pending) { |
|
|
|
// 如果状态是 Pending, 打开第一个节点 |
|
|
|
const node = workflowData.nodes[0]; |
|
|
|
const node = workflow.nodes[0]; |
|
|
|
if (node) { |
|
|
|
setExperimentNodeData(node); |
|
|
|
openPropsDrawer(); |
|
|
|
@@ -125,8 +140,8 @@ function ExperimentText() { |
|
|
|
} else if (status === ExperimentStatus.Running) { |
|
|
|
// 如果状态是 Running,打开第一个运行中的节点,如果没有运行中的节点,则打开第一个节点 |
|
|
|
const node = |
|
|
|
workflowData.nodes.find((item) => item.experimentStatus === ExperimentStatus.Running) ?? |
|
|
|
workflowData.nodes[0]; |
|
|
|
workflow.nodes.find((item) => item.experimentStatus === ExperimentStatus.Running) ?? |
|
|
|
workflow.nodes[0]; |
|
|
|
if (node) { |
|
|
|
setExperimentNodeData(node); |
|
|
|
openPropsDrawer(); |
|
|
|
@@ -153,13 +168,13 @@ function ExperimentText() { |
|
|
|
return; |
|
|
|
} |
|
|
|
try { |
|
|
|
const dataJson = JSON.parse(data); |
|
|
|
const dataJson = parseJsonText(data); |
|
|
|
const statusData = dataJson?.result?.object?.status; |
|
|
|
if (!statusData) { |
|
|
|
return; |
|
|
|
} |
|
|
|
const { finishedAt, phase, nodes = {} } = statusData; |
|
|
|
|
|
|
|
|
|
|
|
// 更新实验实例状态和结束时间 |
|
|
|
// setExperimentIns((prev) => ({ |
|
|
|
// ...prev, |
|
|
|
|