package wechat import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "fmt" "time" ) type JobOperateType string const ( JobOperateTypeStart JobOperateType = "start" JobOperateTypeStop JobOperateType = "stop" ) type CloudbrainStartMsg struct { } func (CloudbrainStartMsg) Data(ctx *TemplateContext) *DefaultWechatTemplate { return &DefaultWechatTemplate{ First: TemplateValue{Value: setting.CloudbrainStartedTitle}, Keyword1: TemplateValue{Value: ctx.Cloudbrain.DisplayJobName}, Keyword2: TemplateValue{Value: getJobTypeDisplayName(ctx.Cloudbrain.JobType)}, Keyword3: TemplateValue{Value: time.Unix(int64(ctx.Cloudbrain.CreatedUnix), 0).Format("2006-01-02 15:04:05")}, Remark: TemplateValue{Value: setting.CloudbrainStartedRemark}, } } func (CloudbrainStartMsg) ShouldSend(ctx *TemplateContext) bool { if len(setting.CloudbrainStartedNotifyList) == 0 { return false } for _, v := range setting.CloudbrainStartedNotifyList { if v == ctx.Cloudbrain.JobType { return true } } return false } func (CloudbrainStartMsg) MsgId(ctx *TemplateContext) string { return string(JobOperateTypeStart) + "_" + fmt.Sprint(ctx.Cloudbrain.ID) } func (CloudbrainStartMsg) Url(ctx *TemplateContext) string { repo, err := models.GetRepositoryByID(ctx.Cloudbrain.RepoID) if err != nil { log.Error("CloudbrainStartMsg GetRepositoryByID error,%v", err) return "" } return getCloudbrainTemplateUrl(*ctx.Cloudbrain, repo) } func (CloudbrainStartMsg) TemplateId(ctx *TemplateContext) string { return setting.CloudbrainStartedTemplateId } type CloudbrainStopMsg struct { } func (CloudbrainStopMsg) Data(ctx *TemplateContext) *DefaultWechatTemplate { return &DefaultWechatTemplate{ First: TemplateValue{Value: fmt.Sprintf(setting.CloudbrainStoppedTitle, ctx.Cloudbrain.Status)}, Keyword1: TemplateValue{Value: ctx.Cloudbrain.DisplayJobName}, Keyword2: TemplateValue{Value: getJobTypeDisplayName(ctx.Cloudbrain.JobType)}, Keyword3: TemplateValue{Value: time.Unix(int64(ctx.Cloudbrain.CreatedUnix), 0).Format("2006-01-02 15:04:05")}, Keyword4: TemplateValue{Value: time.Unix(int64(ctx.Cloudbrain.EndTime), 0).Format("2006-01-02 15:04:05")}, Remark: TemplateValue{Value: setting.CloudbrainStoppedRemark}, } } func (CloudbrainStopMsg) ShouldSend(ctx *TemplateContext) bool { if len(setting.CloudbrainStoppedNotifyList) == 0 { return false } for _, v := range setting.CloudbrainStoppedNotifyList { if v == ctx.Cloudbrain.JobType { if ctx.Cloudbrain.Duration > 0 && ctx.Cloudbrain.EndTime > 0 { return true } break } } return false } func (CloudbrainStopMsg) MsgId(ctx *TemplateContext) string { return string(JobOperateTypeStop) + "_" + fmt.Sprint(ctx.Cloudbrain.ID) } func (CloudbrainStopMsg) Url(ctx *TemplateContext) string { repo, err := models.GetRepositoryByID(ctx.Cloudbrain.RepoID) if err != nil { log.Error("CloudbrainStopMsg GetRepositoryByID error,%v", err) return "" } return getCloudbrainTemplateUrl(*ctx.Cloudbrain, repo) } func (CloudbrainStopMsg) TemplateId(ctx *TemplateContext) string { return setting.CloudbrainStoppedTemplateId } var startMsg = &CloudbrainStartMsg{} var stopMsg = &CloudbrainStopMsg{} func GetTemplateFromOperateType(operate JobOperateType) Template { switch operate { case JobOperateTypeStart: return startMsg case JobOperateTypeStop: return stopMsg } return nil } func GetJobOperateTypeFromCloudbrainStatus(cloudbrain *models.Cloudbrain) JobOperateType { if cloudbrain.IsTerminal() { return JobOperateTypeStop } if cloudbrain.IsRunning() { return JobOperateTypeStart } return "" } func getCloudbrainTemplateUrl(cloudbrain models.Cloudbrain, repo *models.Repository) string { url := setting.AppURL + repo.FullName() switch cloudbrain.JobType { case string(models.JobTypeDebug): if cloudbrain.ComputeResource == "CPU/GPU" { url += "/cloudbrain/" + fmt.Sprint(cloudbrain.ID) } else { url += "/modelarts/notebook/" + fmt.Sprint(cloudbrain.ID) } case string(models.JobTypeBenchmark): url += "/cloudbrain/benchmark/" + fmt.Sprint(cloudbrain.ID) case string(models.JobTypeTrain): if cloudbrain.Type == models.TypeCloudBrainOne { url += "/cloudbrain/train-job/" + fmt.Sprint(cloudbrain.JobID) } else if cloudbrain.Type == models.TypeCloudBrainTwo { url += "/modelarts/train-job/" + fmt.Sprint(cloudbrain.JobID) } else if cloudbrain.Type == models.TypeC2Net { url += "/grampus/train-job/" + fmt.Sprint(cloudbrain.JobID) } case string(models.JobTypeInference): url += "/modelarts/inference-job/" + fmt.Sprint(cloudbrain.JobID) } return url } func getJobTypeDisplayName(jobType string) string { switch jobType { case string(models.JobTypeDebug): return "调试任务" case string(models.JobTypeBenchmark): return "评测任务" case string(models.JobTypeTrain): return "训练任务" case string(models.JobTypeInference): return "推理任务" } return "" }