package client import ( "github.com/zeromicro/go-zero/core/logx" "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants" "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models" "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils" "gorm.io/gorm" "log" "strings" "sync" ) type task struct { sync.RWMutex client *client options *TaskOptions log log.Logger } func newTask(client *client, options *TaskOptions) (*task, error) { task := &task{ RWMutex: sync.RWMutex{}, client: client, options: options, log: log.Logger{}, } return task, nil } func (t task) PullTaskInfo(pullTaskInfoReq PullTaskInfoReq) (*PullTaskInfoResp, error) { result := PullTaskInfoResp{} // 查询p端类型 var kind int32 t.client.DbEngin.Raw("select type as kind from `t_adapter` where id = ?", pullTaskInfoReq.AdapterId).Scan(&kind) // 查询云智超中的数据列表 switch kind { case 2: var hpcModelList []models.TaskHpc findModelList(pullTaskInfoReq.AdapterId, t.client.DbEngin, &hpcModelList) utils.Convert(hpcModelList, &result.HpcInfoList) case 0: var cloudModelList []models.Cloud findModelList(pullTaskInfoReq.AdapterId, t.client.DbEngin, &cloudModelList) utils.Convert(cloudModelList, &result.CloudInfoList) case 1: var aiModelList []models.Ai findModelList(pullTaskInfoReq.AdapterId, t.client.DbEngin, &aiModelList) utils.Convert(aiModelList, &result.AiInfoList) } return &result, nil } func (t task) PushTaskInfo(pushTaskInfoReq PushTaskInfoReq) (*PushTaskInfoResp, error) { // 查询p端类型 var kind int32 t.client.DbEngin.Raw("select type as kind from t_adapter where id = ?", pushTaskInfoReq.AdapterId).Scan(&kind) switch kind { case 0: for _, cloudInfo := range pushTaskInfoReq.CloudInfoList { t.client.DbEngin.Exec("update cloud set status = ?,start_time = ?,result = ? where participant_id = ? and id = ?", cloudInfo.Status, cloudInfo.StartTime, cloudInfo.Result, pushTaskInfoReq.AdapterId, cloudInfo.Id) syncTask(t.client.DbEngin, cloudInfo.TaskId) } case 2: for _, hpcInfo := range pushTaskInfoReq.HpcInfoList { t.client.DbEngin.Exec("update task_hpc set status = ?,start_time = ?,job_id = ? where cluster_id = ? and task_id = ? and name = ?", hpcInfo.Status, hpcInfo.StartTime, hpcInfo.RunningTime, hpcInfo.JobId, pushTaskInfoReq.AdapterId, hpcInfo.TaskId, hpcInfo.Name) syncTask(t.client.DbEngin, hpcInfo.TaskId) } case 1: for _, aiInfo := range pushTaskInfoReq.AiInfoList { t.client.DbEngin.Exec("update ai set status = ?,start_time = ?,project_id = ?,job_id = ? where participant_id = ? and task_id = ? and name = ?", aiInfo.Status, aiInfo.StartTime, aiInfo.ProjectId, aiInfo.JobId, pushTaskInfoReq.AdapterId, aiInfo.TaskId, aiInfo.Name) syncTask(t.client.DbEngin, aiInfo.TaskId) } } return &PushTaskInfoResp{}, nil } func (t task) PushResourceInfo(pushResourceInfoReq PushResourceInfoReq) { //TODO implement me panic("implement me") } func findModelList(participantId int64, dbEngin *gorm.DB, data interface{}) error { tx := dbEngin.Where("cluster_id = (select id from t_cluster where adapter_id = ?) AND status NOT IN ?", participantId, []string{"Deleted", "Succeeded", "Completed", "Failed"}).Find(data) if tx.Error != nil { return tx.Error } return nil } func syncTask(gorm *gorm.DB, taskId int64) { var allStatus string tx := gorm.Raw("SELECT CONCAT_WS(',',GROUP_CONCAT(DISTINCT h.status) ,GROUP_CONCAT(DISTINCT a.status) ,GROUP_CONCAT(DISTINCT c.status))as status from task t left join hpc h on t.id = h.task_id left join cloud c on t.id = c.task_id left join ai a on t.id = a.task_id where t.id = ?", taskId).Scan(&allStatus) if tx.Error != nil { logx.Error(tx.Error) } // 子状态统一则修改主任务状态 statusArray := strings.Split(allStatus, ",") if len(removeRepeatedElement(statusArray)) == 1 { updateTask(gorm, taskId, statusArray[0]) } // 子任务包含失败状态 主任务则失败 if strings.Contains(allStatus, constants.Failed) { updateTask(gorm, taskId, constants.Failed) } if strings.Contains(allStatus, constants.Running) { updateTask(gorm, taskId, constants.Running) } } func updateTask(gorm *gorm.DB, taskId int64, status string) { var task models.Task gorm.Where("id = ? ", taskId).Find(&task) if task.Status != status { task.Status = status gorm.Updates(&task) } } func removeRepeatedElement(arr []string) (newArr []string) { newArr = make([]string, 0) for i := 0; i < len(arr); i++ { repeat := false for j := i + 1; j < len(arr); j++ { if arr[i] == arr[j] { repeat = true break } } if !repeat { newArr = append(newArr, arr[i]) } } return }