118 lines
3.3 KiB
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)))
|
|
}
|