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

118 lines
3.3 KiB
Go

package http
import (
"github.com/gin-gonic/gin"
"gitlink.org.cn/cloudream/common/consts/errorcode"
"gitlink.org.cn/cloudream/common/pkgs/logger"
"gitlink.org.cn/cloudream/common/utils/reflect2"
"gitlink.org.cn/cloudream/common/utils/serder"
execmq "gitlink.org.cn/cloudream/scheduler/common/pkgs/mq/executor"
mgrmq "gitlink.org.cn/cloudream/scheduler/common/pkgs/mq/manager"
myglbs "gitlink.org.cn/cloudream/scheduler/executor/internal/globals"
"io"
"net/http"
)
type TaskService struct {
*Server
}
func (s *Server) TaskSvc() *TaskService {
return &TaskService{Server: s}
}
func (s *TaskService) SubmitTask(ctx *gin.Context) {
log := logger.WithField("HTTP", "SubmitTask")
bodyData, err := io.ReadAll(ctx.Request.Body)
if err != nil {
log.Warnf("reading request body: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "read request body failed"))
return
}
req, err := serder.JSONToObjectEx[execmq.StartTask](bodyData)
if err != nil {
log.Warnf("parsing request body: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "parse request body failed"))
return
}
tsk, err := s.svc.SubmitTask(&req)
if err != nil {
logger.WithField("Info", reflect2.TypeOfValue(req.Info).Name()).
Warnf("starting task by info: %s", err.Error())
ctx.JSON(http.StatusInternalServerError, Failed("500", "internal error"))
return
}
ctx.JSON(http.StatusOK, OK(execmq.NewStartTaskResp(myglbs.ExecutorID, string(tsk.ID()))))
}
func (s *TaskService) GetReportInfo(ctx *gin.Context) {
ctx.Header("Content-Type", "text/event-stream")
ctx.Header("Cache-Control", "no-cache")
ctx.Header("Connection", "keep-alive")
taskChan := s.svc.TaskManager.GetTaskChan()
defer taskChan.Chan.Close()
status := mgrmq.ExecutorTaskStatus{
ExecutorID: myglbs.ExecutorID,
}
bytes, err := serder.ObjectToJSONEx(status)
_, err = ctx.Writer.Write([]byte("data: " + string(bytes) + "\n\n"))
if err != nil {
logger.Errorf("write data: %s", err.Error())
return
}
ctx.Writer.Flush()
for {
receive, err := taskChan.Chan.Receive()
if err != nil {
continue
}
data, err := serder.ObjectToJSONEx(receive)
if err != nil {
logger.Errorf("marshal task: %s", err.Error())
continue
}
logger.Info("send task status: %s", string(data))
_, err = ctx.Writer.Write([]byte("data: " + string(data) + "\n\n"))
if err != nil {
logger.Errorf("write data: %s", err.Error())
continue
}
ctx.Writer.Flush() // 确保数据立即发送到客户端
}
}
func (s *TaskService) OperateTask(ctx *gin.Context) {
log := logger.WithField("HTTP", "TaskOperate")
bodyData, err := io.ReadAll(ctx.Request.Body)
if err != nil {
log.Warnf("reading request body: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "read request body failed"))
return
}
req, err := serder.JSONToObjectEx[execmq.TaskOperateInfo](bodyData)
if err != nil {
log.Warnf("parsing request body: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "parse request body failed"))
return
}
task, ok := s.svc.TaskManager.Tasks[req.TaskID]
if !ok {
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "task not found"))
return
}
task.SendTaskOperate(req)
ctx.JSON(http.StatusOK, OK(execmq.NewTaskOperateResp(nil)))
}