|
- package wechat
-
- import (
- "fmt"
- "time"
-
- "code.gitea.io/gitea/models"
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/setting"
- )
-
- type JobOperateType string
-
- const (
- JobOperateTypeStart JobOperateType = "start"
- JobOperateTypeStop JobOperateType = "stop"
- JobOperateTypeLongRunning JobOperateType = "long_running"
- )
-
- type CloudbrainStartMsg struct {
- }
-
- func (CloudbrainStartMsg) Data(ctx *TemplateContext) interface{} {
- 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) interface{} {
- 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{}
- var ComingStopMsg = &CloudbrainComingToStopMsg{}
- var LongRunningMsg = &CloudbrainLongRunningMsg{}
-
- 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.ID)
- } else if cloudbrain.Type == models.TypeCloudBrainTwo {
- url += "/modelarts/train-job/" + fmt.Sprint(cloudbrain.ID)
- } else if cloudbrain.Type == models.TypeC2Net {
- url += "/grampus/train-job/" + fmt.Sprint(cloudbrain.ID)
- }
- case string(models.JobTypeInference):
- url += "/modelarts/inference-job/" + fmt.Sprint(cloudbrain.JobID)
- case string(models.JobTypeGeneral):
- if cloudbrain.Type == models.TypeCloudBrainOne {
- url += "/cloudbrain/general/" + fmt.Sprint(cloudbrain.ID)
- } else if cloudbrain.Type == models.TypeCloudBrainTwo {
- url += "/modelarts/general/" + fmt.Sprint(cloudbrain.ID)
- } else if cloudbrain.Type == models.TypeC2Net {
- url += "/grampus/general/" + fmt.Sprint(cloudbrain.ID)
- }
- }
- return url
- }
-
- func getJobTypeDisplayName(jobType string) string {
- switch jobType {
- case string(models.JobTypeDebug):
- return "调试任务"
- case string(models.JobTypeOnlineInference):
- return "在线推理"
- case string(models.JobTypeBenchmark):
- return "评测任务"
- case string(models.JobTypeTrain):
- return "训练任务"
- case string(models.JobTypeInference),
- string(models.JobTypeModelSafety),
- string(models.JobTypeSnn4imagenet),
- string(models.JobTypeBrainScore),
- string(models.JobTypeSnn4Ecoset):
- return "推理任务"
- case string(models.JobTypeGeneral):
- return "通用任务"
- }
- return ""
- }
-
- type CloudbrainLongRunningMsg struct {
- }
-
- func (CloudbrainLongRunningMsg) Data(ctx *TemplateContext) interface{} {
- formattedDuration := formatDuration(ctx.Duration)
- formattedRemark := ""
- if formattedDuration == "" {
- formattedRemark = "任务运行中"
- } else {
- formattedRemark = fmt.Sprintf("任务运行时间超过%s", formattedDuration)
- }
- d := int64(ctx.Duration.Seconds())
- t := int64(ctx.Cloudbrain.StartTime) + d
- return &WechatDurationWechatTemplate{
- Keyword1: TemplateValue{Value: ctx.Cloudbrain.DisplayJobName},
- Keyword2: TemplateValue{Value: time.Unix(t, 0).Format("2006-01-02 15:04:05")},
- Keyword3: TemplateValue{Value: formattedRemark},
- }
- }
-
- func formatDuration(duration time.Duration) string {
- switch {
- case duration >= time.Second && duration < time.Minute:
- return fmt.Sprintf("%d秒", int(duration.Seconds()))
- case duration >= time.Minute && duration < time.Hour:
- return fmt.Sprintf("%d分钟", int(duration.Minutes()))
- case duration >= time.Hour && duration < 24*time.Hour:
- return fmt.Sprintf("%d小时", int(duration.Hours()))
- case duration >= 24*time.Hour:
- days := duration / (24 * time.Hour)
- return fmt.Sprintf("%d天", days)
- default:
- return ""
- }
- }
-
- func (CloudbrainLongRunningMsg) ShouldSend(ctx *TemplateContext) bool {
- if len(setting.CloudbrainLongRunningNotifyList) == 0 {
- return false
- }
- for _, v := range setting.CloudbrainStartedNotifyList {
- if v == ctx.Cloudbrain.JobType {
- return true
- }
- }
- return false
- }
-
- func (CloudbrainLongRunningMsg) MsgId(ctx *TemplateContext) string {
- return string(JobOperateTypeLongRunning) + "_" + fmt.Sprint(ctx.Cloudbrain.ID) + "_" + ctx.Duration.String()
- }
-
- func (CloudbrainLongRunningMsg) 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 (CloudbrainLongRunningMsg) TemplateId(ctx *TemplateContext) string {
- return setting.CloudbrainLongRunningTemplateId
- }
|