JCC-CSScheduler/common/models/job/job.go

100 lines
2.9 KiB
Go

package jobmod
import (
"github.com/samber/lo"
"gitlink.org.cn/cloudream/common/pkgs/mq"
"gitlink.org.cn/cloudream/common/pkgs/types"
schsdk "gitlink.org.cn/cloudream/common/sdks/scheduler"
)
type FileScheduleAction string
// 文件调度方案
const (
ActionNo FileScheduleAction = "No" // 不需要操作
ActionMove FileScheduleAction = "Move" // 需要在指定节点上建立缓存
ActionLoad FileScheduleAction = "Load" // 需要加载到Storage
ActionImportImage FileScheduleAction = "ImportImage" // 需要导入镜像
)
type FileScheduleScheme struct {
Action FileScheduleAction `json:"action"`
}
// 任务调度方案
type JobScheduleScheme struct {
TargetCCID schsdk.CCID `json:"targetCCID"`
Dataset FileScheduleScheme `json:"dataset"`
Code FileScheduleScheme `json:"code"`
Image FileScheduleScheme `json:"image"`
}
// 任务集的预调度方案
type JobSetPreScheduleScheme struct {
JobSchemes map[string]JobScheduleScheme `json:"jobSchemes"` // 任务的预调度方案。Key为LocalJobID
}
// 任务集
type JobSet struct {
JobSetID schsdk.JobSetID `json:"jobSetID"` // 全局唯一的任务集ID
JobRefs []JobSetJobRef `json:"jobRefs"` // 任务集中包含的任务,只是一个引用
PreScheduleScheme JobSetPreScheduleScheme `json:"preScheduleScheme"`
}
type JobSetJobRef struct {
JobID schsdk.JobID `json:"jobID"` // 任务ID
LocalJobID string `json:"localJobID"` // 在当前任务集内的任务ID
}
func NewJobSet(jobSetID schsdk.JobSetID, jobRefs []JobSetJobRef, preScheduleScheme JobSetPreScheduleScheme) *JobSet {
return &JobSet{
JobSetID: jobSetID,
JobRefs: jobRefs,
PreScheduleScheme: preScheduleScheme,
}
}
func (j *JobSet) FindRefByLocalJobID(localJobID string) *JobSetJobRef {
ref, ok := lo.Find(j.JobRefs, func(item JobSetJobRef) bool { return item.LocalJobID == localJobID })
if !ok {
return nil
}
return &ref
}
// 任务
type Job interface {
GetJobSetID() schsdk.JobSetID
GetJobID() schsdk.JobID
GetState() JobState
SetState(state JobState)
Clone() Job
}
var JobTypeUnion = types.NewTypeUnion[Job](
(*NormalJob)(nil),
(*ResourceJob)(nil),
)
var _ = mq.RegisterUnionType(JobTypeUnion)
// TODO var _ = serder.RegisterNewTaggedTypeUnion(JobTypeUnion, "Type", "type")
type JobBase struct {
JobSetID schsdk.JobSetID `json:"jobSetID"` // 任务集ID
JobID schsdk.JobID `json:"jobID"` // 全局唯一任务ID
State JobState `json:"state"` // 任务当前的状态。包含当前在状态下执行操作所需的数据
}
func (j *JobBase) GetJobSetID() schsdk.JobSetID {
return j.JobSetID
}
func (j *JobBase) GetJobID() schsdk.JobID {
return j.JobID
}
func (j *JobBase) GetState() JobState {
return j.State
}
func (j *JobBase) SetState(state JobState) {
j.State = state
}