JCC-CSScheduler/executor/internal/task/pcm_schedule_task.go

95 lines
2.2 KiB
Go
Raw Normal View History

2023-09-04 09:51:20 +08:00
package task
import (
"fmt"
"gitlink.org.cn/cloudream/common/pkgs/logger"
pcmsdk "gitlink.org.cn/cloudream/common/sdks/pcm"
2023-09-21 10:44:26 +08:00
schglb "gitlink.org.cn/cloudream/scheduler/common/globals"
2023-09-04 09:51:20 +08:00
exectsk "gitlink.org.cn/cloudream/scheduler/common/pkgs/mq/executor/task"
)
2023-11-03 11:18:01 +08:00
type PCMSubmitTask struct {
*exectsk.SubmitTask
2023-09-04 09:51:20 +08:00
}
2023-11-03 11:18:01 +08:00
func NewPCMSubmitTask(info *exectsk.SubmitTask) *PCMSubmitTask {
return &PCMSubmitTask{
SubmitTask: info,
2023-09-04 09:51:20 +08:00
}
}
func (t *PCMSubmitTask) Execute(task *Task, ctx TaskContext) {
2023-11-03 11:18:01 +08:00
log := logger.WithType[PCMSubmitTask]("Task")
log.Debugf("begin with %v", logger.FormatStruct(t.SubmitTask))
2023-09-04 09:51:20 +08:00
defer log.Debugf("end")
2024-09-03 16:51:24 +08:00
err := t.do(task, ctx)
2023-09-04 16:48:46 +08:00
if err != nil {
//TODO 若任务失败上报的状态failed字段根据情况修改
task.SendStatus(exectsk.NewSubmitTaskStatus("failed", err.Error()))
} else {
task.SendStatus(exectsk.NewSubmitTaskStatus("succeeded", ""))
2023-09-04 16:48:46 +08:00
}
2023-09-04 09:51:20 +08:00
}
func (t *PCMSubmitTask) do(task *Task, ctx TaskContext) error {
2024-06-07 16:18:07 +08:00
log := logger.WithType[PCMSubmitTask]("Task")
2023-09-21 10:44:26 +08:00
pcmCli, err := schglb.PCMPool.Acquire()
2023-09-04 09:51:20 +08:00
if err != nil {
return fmt.Errorf("new pcm client: %w", err)
}
2023-09-26 09:59:01 +08:00
defer schglb.PCMPool.Release(pcmCli)
2023-09-04 09:51:20 +08:00
2023-11-02 11:22:13 +08:00
resp, err := pcmCli.SubmitTask(pcmsdk.SubmitTaskReq{
PartID: t.PCMParticipantID,
ImageID: t.PCMImageID,
ResourceID: t.PCMResourceID,
2023-11-03 11:18:01 +08:00
CMD: t.CMD,
Envs: t.Envs,
2024-06-05 15:43:17 +08:00
Params: t.Params,
2023-09-04 09:51:20 +08:00
})
if err != nil {
return err
}
2024-06-07 16:18:07 +08:00
log.Infof("pcm submit task success, task id: %v", resp.TaskID)
2023-11-03 11:18:01 +08:00
var prevStatus pcmsdk.TaskStatus
2024-06-07 16:18:07 +08:00
retryCount := 0
2023-09-04 09:51:20 +08:00
for {
2023-11-02 11:22:13 +08:00
tsResp, err := pcmCli.GetTask(pcmsdk.GetTaskReq{
PartID: t.PCMParticipantID,
2023-11-02 11:22:13 +08:00
TaskID: resp.TaskID,
2023-09-04 09:51:20 +08:00
})
if err != nil {
2024-06-07 16:18:07 +08:00
retryCount++
if retryCount > 3 {
return err
}
continue
2023-09-04 09:51:20 +08:00
}
2023-11-02 11:22:13 +08:00
if tsResp.TaskStatus != prevStatus {
task.SendStatus(exectsk.NewSubmitTaskStatus(tsResp.TaskStatus, ""))
2023-09-04 11:25:33 +08:00
}
2023-11-02 11:22:13 +08:00
prevStatus = tsResp.TaskStatus
2023-09-04 11:25:33 +08:00
// 根据返回的result判定任务是否完成若完成 跳出循环,结束任务
2024-06-06 14:26:19 +08:00
if tsResp.TaskStatus == "succeeded" || tsResp.TaskStatus == "Completed" {
2023-09-04 11:25:33 +08:00
return nil
}
2023-11-03 11:18:01 +08:00
2024-04-26 09:27:10 +08:00
if tsResp.TaskStatus == pcmsdk.TaskStatusFailed {
2023-11-03 11:18:01 +08:00
// TODO 返回更详细的信息
return fmt.Errorf("task failed")
}
2023-09-04 09:51:20 +08:00
}
}
func init() {
2023-11-03 11:18:01 +08:00
Register(NewPCMSubmitTask)
}