| @@ -46,7 +46,8 @@ type CloudbrainDurationStatistic struct { | |||
| ComputeResource string | |||
| AccCardType string `xorm:"INDEX"` | |||
| DateTime timeutil.TimeStamp `xorm:"INDEX"` | |||
| DateTime timeutil.TimeStamp `xorm:"INDEX DEFAULT 0"` | |||
| DateTimeUnix timeutil.TimeStamp `xorm:"INDEX DEFAULT 0"` | |||
| DayTime string `xorm:"INDEX"` | |||
| HourTime int `xorm:"INDEX"` | |||
| CardsUseDuration int | |||
| @@ -274,7 +275,6 @@ func GetCloudbrainByTime(beginTime int64, endTime int64) ([]*CloudbrainInfo, err | |||
| sess := x.NewSession() | |||
| defer sess.Close() | |||
| var cond = builder.NewCond() | |||
| sess.Exec("if ") | |||
| cond = cond.Or( | |||
| builder.And(builder.Gte{"cloudbrain.end_time": beginTime}, builder.Lte{"cloudbrain.start_time": beginTime}, builder.Gt{"cloudbrain.start_time": 0}), | |||
| ) | |||
| @@ -284,11 +284,12 @@ func GetCloudbrainByTime(beginTime int64, endTime int64) ([]*CloudbrainInfo, err | |||
| cond = cond.Or( | |||
| builder.And(builder.Eq{"cloudbrain.status": string(JobRunning)}), | |||
| ) | |||
| sess.OrderBy("cloudbrain.created_unix ASC") | |||
| sess.OrderBy("cloudbrain.id ASC") | |||
| cloudbrains := make([]*CloudbrainInfo, 0, 10) | |||
| if err := sess.Table(&Cloudbrain{}).Unscoped().Where(cond). | |||
| Find(&cloudbrains); err != nil { | |||
| log.Info("find error.") | |||
| log.Error("find error.") | |||
| return nil, err | |||
| } | |||
| return cloudbrains, nil | |||
| } | |||
| @@ -303,7 +304,8 @@ func GetSpecByAiCenterCodeAndType(aiCenterCode string, accCardType string) ([]*C | |||
| cloudbrainSpecs := make([]*CloudbrainSpec, 0, 10) | |||
| if err := sess.Table(&CloudbrainSpec{}).Where(cond). | |||
| Find(&cloudbrainSpecs); err != nil { | |||
| log.Info("find error.") | |||
| log.Error("find error.") | |||
| return nil, err | |||
| } | |||
| return cloudbrainSpecs, nil | |||
| } | |||
| @@ -328,7 +330,8 @@ func GetCanUseCardInfo() ([]*ResourceQueue, error) { | |||
| sess.OrderBy("resource_queue.cluster DESC, resource_queue.ai_center_code ASC") | |||
| ResourceQueues := make([]*ResourceQueue, 0, 10) | |||
| if err := sess.Table(&ResourceQueue{}).Find(&ResourceQueues); err != nil { | |||
| log.Info("find error.") | |||
| log.Error("find error.") | |||
| return nil, err | |||
| } | |||
| return ResourceQueues, nil | |||
| } | |||
| @@ -339,7 +342,7 @@ func GetCardDurationStatistics(opts *DurationStatisticOptions) ([]*CloudbrainDur | |||
| var cond = builder.NewCond() | |||
| if opts.BeginTime.Unix() > 0 && opts.EndTime.Unix() > 0 { | |||
| cond = cond.And( | |||
| builder.And(builder.Gte{"cloudbrain_duration_statistic.date_time": opts.BeginTime.Unix()}, builder.Lt{"cloudbrain_duration_statistic.date_time": opts.EndTime.Unix()}), | |||
| builder.And(builder.Gte{"cloudbrain_duration_statistic.date_time_unix": opts.BeginTime.Unix()}, builder.Lt{"cloudbrain_duration_statistic.date_time_unix": opts.EndTime.Unix()}), | |||
| ) | |||
| } | |||
| if opts.AiCenterCode != "" { | |||
| @@ -350,7 +353,8 @@ func GetCardDurationStatistics(opts *DurationStatisticOptions) ([]*CloudbrainDur | |||
| CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0, 10) | |||
| if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond). | |||
| Find(&CloudbrainDurationStatistics); err != nil { | |||
| log.Info("find error.") | |||
| log.Error("find error.") | |||
| return nil, err | |||
| } | |||
| return CloudbrainDurationStatistics, nil | |||
| } | |||
| @@ -358,10 +362,18 @@ func GetCardDurationStatistics(opts *DurationStatisticOptions) ([]*CloudbrainDur | |||
| func GetDurationRecordBeginTime() ([]*CloudbrainDurationStatistic, error) { | |||
| sess := xStatistic.NewSession() | |||
| defer sess.Close() | |||
| sess.OrderBy("cloudbrain_duration_statistic.date_time ASC limit 1") | |||
| var cond = builder.NewCond() | |||
| cond = cond.And( | |||
| builder.Gt{"cloudbrain_duration_statistic.date_time_unix": 0}, | |||
| ) | |||
| sess.OrderBy("cloudbrain_duration_statistic.date_time_unix ASC limit 1") | |||
| CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0) | |||
| if err := sess.Table(&CloudbrainDurationStatistic{}).Find(&CloudbrainDurationStatistics); err != nil { | |||
| log.Info("find error.") | |||
| if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).Find(&CloudbrainDurationStatistics); err != nil { | |||
| log.Error("find error.") | |||
| return nil, err | |||
| } | |||
| return CloudbrainDurationStatistics, nil | |||
| } | |||
| @@ -369,10 +381,16 @@ func GetDurationRecordBeginTime() ([]*CloudbrainDurationStatistic, error) { | |||
| func GetDurationRecordUpdateTime() ([]*CloudbrainDurationStatistic, error) { | |||
| sess := xStatistic.NewSession() | |||
| defer sess.Close() | |||
| sess.OrderBy("cloudbrain_duration_statistic.date_time DESC limit 1") | |||
| var cond = builder.NewCond() | |||
| cond = cond.And( | |||
| builder.Gt{"cloudbrain_duration_statistic.date_time_unix": 1577808000}, | |||
| ) | |||
| sess.OrderBy("cloudbrain_duration_statistic.date_time_unix DESC limit 1") | |||
| CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0) | |||
| if err := sess.Table(&CloudbrainDurationStatistic{}).Find(&CloudbrainDurationStatistics); err != nil { | |||
| log.Info("find error.") | |||
| if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).Find(&CloudbrainDurationStatistics); err != nil { | |||
| log.Error("find error.") | |||
| return nil, err | |||
| } | |||
| return CloudbrainDurationStatistics, nil | |||
| } | |||
| @@ -380,8 +398,8 @@ func GetDurationRecordUpdateTime() ([]*CloudbrainDurationStatistic, error) { | |||
| func DeleteCloudbrainDurationStatistic(beginTime timeutil.TimeStamp, endTime timeutil.TimeStamp) error { | |||
| sess := xStatistic.NewSession() | |||
| defer sess.Close() | |||
| if _, err := sess.Exec("DELETE FROM cloudbrain_duration_statistic WHERE cloudbrain_duration_statistic.date_time BETWEEN ? AND ?", beginTime, endTime); err != nil { | |||
| log.Info("DELETE cloudbrain_duration_statistic data error.") | |||
| if _, err := sess.Exec("DELETE FROM cloudbrain_duration_statistic WHERE cloudbrain_duration_statistic.date_time_unix BETWEEN ? AND ?", beginTime, endTime); err != nil { | |||
| log.Error("DELETE cloudbrain_duration_statistic data error.") | |||
| return err | |||
| } | |||
| return nil | |||
| @@ -584,6 +584,8 @@ var ( | |||
| TrainJobFLAVORINFOS string | |||
| ModelArtsSpecialPools string | |||
| ModelArtsMultiNode string | |||
| //kanban | |||
| IsCloudbrainTimingEnabled bool | |||
| // modelarts-cd config | |||
| ModelartsCD = struct { | |||
| @@ -1580,6 +1582,9 @@ func NewContext() { | |||
| Course.OrgName = sec.Key("org_name").MustString("") | |||
| Course.TeamName = sec.Key("team_name").MustString("") | |||
| sec = Cfg.Section("kanban") | |||
| IsCloudbrainTimingEnabled = sec.Key("ENABLED").MustBool(false) | |||
| getGrampusConfig() | |||
| getModelartsCDConfig() | |||
| getModelConvertConfig() | |||
| @@ -11,6 +11,7 @@ import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/timeutil" | |||
| "code.gitea.io/gitea/routers/repo" | |||
| cloudbrainService "code.gitea.io/gitea/services/cloudbrain" | |||
| "code.gitea.io/gitea/services/cloudbrain/resource" | |||
| @@ -1464,12 +1465,17 @@ func getCloudbrainTimePeroid(ctx *context.Context, recordBeginTime time.Time) (t | |||
| } | |||
| func GetCloudbrainResourceOverview(ctx *context.Context) { | |||
| var recordBeginTime timeutil.TimeStamp | |||
| recordCloudbrainDuration, err := models.GetDurationRecordBeginTime() | |||
| if err != nil { | |||
| log.Error("Can not get GetDurationRecordBeginTime", err) | |||
| return | |||
| } | |||
| recordBeginTime := recordCloudbrainDuration[0].DateTime | |||
| if len(recordCloudbrainDuration) > 0 && err == nil { | |||
| recordBeginTime = recordCloudbrainDuration[0].DateTimeUnix | |||
| } else { | |||
| recordBeginTime = timeutil.TimeStamp(time.Now().Unix()) | |||
| } | |||
| recordUpdateTime := time.Now().Unix() | |||
| resourceQueues, err := models.GetCanUseCardInfo() | |||
| if err != nil { | |||
| @@ -1596,6 +1602,7 @@ func getBeginAndEndTime(ctx *context.Context) (time.Time, time.Time) { | |||
| now := time.Now() | |||
| beginTimeStr := ctx.QueryTrim("beginTime") | |||
| endTimeStr := ctx.QueryTrim("endTime") | |||
| var brainRecordBeginTime time.Time | |||
| var beginTime time.Time | |||
| var endTime time.Time | |||
| @@ -1608,7 +1615,12 @@ func getBeginAndEndTime(ctx *context.Context) (time.Time, time.Time) { | |||
| ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err")) | |||
| return beginTime, endTime | |||
| } | |||
| brainRecordBeginTime := recordCloudbrainDuration[0].DateTime.AsTime() | |||
| if len(recordCloudbrainDuration) > 0 && err == nil { | |||
| brainRecordBeginTime = recordCloudbrainDuration[0].DateTimeUnix.AsTime() | |||
| } else { | |||
| brainRecordBeginTime = now | |||
| } | |||
| beginTime = brainRecordBeginTime | |||
| endTime = now | |||
| } else if queryType == "today" { | |||
| @@ -1650,7 +1662,11 @@ func getBeginAndEndTime(ctx *context.Context) (time.Time, time.Time) { | |||
| ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err")) | |||
| return beginTime, endTime | |||
| } | |||
| brainRecordBeginTime := recordCloudbrainDuration[0].DateTime.AsTime() | |||
| if len(recordCloudbrainDuration) > 0 && err == nil { | |||
| brainRecordBeginTime = recordCloudbrainDuration[0].DateTimeUnix.AsTime() | |||
| } else { | |||
| brainRecordBeginTime = now | |||
| } | |||
| beginTime = brainRecordBeginTime | |||
| endTime = now | |||
| } else { | |||
| @@ -1681,7 +1697,7 @@ func getAiCenterUsageDuration(beginTime time.Time, endTime time.Time, cloudbrain | |||
| usageRate := float64(0) | |||
| for _, cloudbrainStatistic := range cloudbrainStatistics { | |||
| if int64(cloudbrainStatistic.DateTime) >= beginTime.Unix() && int64(cloudbrainStatistic.DateTime) < endTime.Unix() { | |||
| if int64(cloudbrainStatistic.DateTimeUnix) >= beginTime.Unix() && int64(cloudbrainStatistic.DateTimeUnix) < endTime.Unix() { | |||
| totalDuration += cloudbrainStatistic.CardsTotalDuration | |||
| usageDuration += cloudbrainStatistic.CardsUseDuration | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| package repo | |||
| import ( | |||
| "fmt" | |||
| "net/http" | |||
| "strings" | |||
| "time" | |||
| @@ -8,36 +9,39 @@ import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/timeutil" | |||
| cloudbrainService "code.gitea.io/gitea/services/cloudbrain" | |||
| ) | |||
| func CloudbrainDurationStatisticHour() { | |||
| var statisticTime time.Time | |||
| var count int64 | |||
| recordDurationUpdateTime, err := models.GetDurationRecordUpdateTime() | |||
| if err != nil { | |||
| log.Error("Can not get GetDurationRecordBeginTime", err) | |||
| } | |||
| now := time.Now() | |||
| currentTime := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) | |||
| if err == nil && len(recordDurationUpdateTime) > 0 { | |||
| statisticTime = time.Unix(int64(recordDurationUpdateTime[0].DateTime), 0).Add(+1 * time.Hour) | |||
| } else { | |||
| statisticTime = currentTime | |||
| } | |||
| if setting.IsCloudbrainTimingEnabled { | |||
| var statisticTime time.Time | |||
| var count int64 | |||
| recordDurationUpdateTime, err := models.GetDurationRecordUpdateTime() | |||
| if err != nil { | |||
| log.Error("Can not get GetDurationRecordBeginTime", err) | |||
| } | |||
| now := time.Now() | |||
| currentTime := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) | |||
| if err == nil && len(recordDurationUpdateTime) > 0 { | |||
| statisticTime = time.Unix(int64(recordDurationUpdateTime[0].DateTimeUnix), 0).Add(+1 * time.Hour) | |||
| } else { | |||
| statisticTime = currentTime | |||
| } | |||
| err = models.DeleteCloudbrainDurationStatistic(timeutil.TimeStamp(statisticTime.Unix()), timeutil.TimeStamp(currentTime.Unix())) | |||
| if err != nil { | |||
| log.Error("DeleteCloudbrainDurationStatistic failed", err) | |||
| } | |||
| err = models.DeleteCloudbrainDurationStatistic(timeutil.TimeStamp(statisticTime.Unix()), timeutil.TimeStamp(currentTime.Unix())) | |||
| if err != nil { | |||
| log.Error("DeleteCloudbrainDurationStatistic failed", err) | |||
| } | |||
| for statisticTime.Before(currentTime) || statisticTime.Equal(currentTime) { | |||
| countEach := summaryDurationStat(statisticTime) | |||
| count += countEach | |||
| statisticTime = statisticTime.Add(+1 * time.Hour) | |||
| for statisticTime.Before(currentTime) || statisticTime.Equal(currentTime) { | |||
| countEach := summaryDurationStat(statisticTime) | |||
| count += countEach | |||
| statisticTime = statisticTime.Add(+1 * time.Hour) | |||
| } | |||
| log.Info("summaryDurationStat count: %v", count) | |||
| } | |||
| log.Info("summaryDurationStat count: %v", count) | |||
| } | |||
| func UpdateDurationStatisticHistoryData(beginTime time.Time, endTime time.Time) int64 { | |||
| var count int64 | |||
| @@ -54,7 +58,7 @@ func UpdateDurationStatisticHistoryData(beginTime time.Time, endTime time.Time) | |||
| //statisticTime是当前的时辰,比如当前是2019-01-01 12:01:01,那么statisticTime就是2019-01-01 12:00:00 | |||
| func summaryDurationStat(statisticTime time.Time) int64 { | |||
| var count int64 | |||
| dateTime := timeutil.TimeStamp(statisticTime.Add(-1 * time.Hour).Unix()) | |||
| dateTimeUnix := timeutil.TimeStamp(statisticTime.Add(-1 * time.Hour).Unix()) | |||
| beginTime := statisticTime.Add(-1 * time.Hour).Unix() | |||
| dayTime := statisticTime.Add(-1 * time.Hour).Format("2006-01-02") | |||
| hourTime := statisticTime.Add(-1 * time.Hour).Hour() | |||
| @@ -65,27 +69,9 @@ func summaryDurationStat(statisticTime time.Time) int64 { | |||
| log.Info("GetCloudbrainByTime err: %v", err) | |||
| return 0 | |||
| } | |||
| cloudbrainMap := make(map[string]*models.Cloudbrain) | |||
| fmt.Printf("ciTasks:", ciTasks[0].Cloudbrain.JobName) | |||
| models.LoadSpecs4CloudbrainInfo(ciTasks) | |||
| for _, cloudbrain := range ciTasks { | |||
| if cloudbrain.Cloudbrain.StartTime == 0 { | |||
| cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix | |||
| } | |||
| if cloudbrain.Cloudbrain.EndTime == 0 { | |||
| cloudbrain.Cloudbrain.EndTime = cloudbrain.Cloudbrain.UpdatedUnix | |||
| } | |||
| cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain) | |||
| if cloudbrain.Cloudbrain.Spec != nil { | |||
| if _, ok := cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType]; !ok { | |||
| if cloudbrain.Cloudbrain.Spec != nil { | |||
| cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType] = &cloudbrain.Cloudbrain | |||
| } | |||
| } | |||
| } | |||
| } | |||
| cloudBrainCenterCodeAndCardTypeInfo := getcloudBrainCenterCodeAndCardTypeInfo(ciTasks, beginTime, endTime) | |||
| cloudBrainCenterCodeAndCardTypeInfo, cloudbrainMap := getcloudBrainCenterCodeAndCardTypeInfo(ciTasks, beginTime, endTime) | |||
| resourceQueues, err := models.GetCanUseCardInfo() | |||
| if err != nil { | |||
| @@ -110,7 +96,7 @@ func summaryDurationStat(statisticTime time.Time) int64 { | |||
| cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType] = 0 | |||
| } | |||
| cloudbrainDurationStat := models.CloudbrainDurationStatistic{ | |||
| DateTime: dateTime, | |||
| DateTimeUnix: dateTimeUnix, | |||
| DayTime: dayTime, | |||
| HourTime: hourTime, | |||
| Cluster: cloudbrainTable.Cluster, | |||
| @@ -132,7 +118,7 @@ func summaryDurationStat(statisticTime time.Time) int64 { | |||
| for key, cardsTotalDuration := range cardsTotalDurationMap { | |||
| cloudbrainDurationStat := models.CloudbrainDurationStatistic{ | |||
| DateTime: dateTime, | |||
| DateTimeUnix: dateTimeUnix, | |||
| DayTime: dayTime, | |||
| HourTime: hourTime, | |||
| Cluster: strings.Split(key, "/")[0], | |||
| @@ -169,11 +155,27 @@ func GetAiCenterNameByCode(centerCode string, language string) string { | |||
| return aiCenterName | |||
| } | |||
| func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, beginTime int64, endTime int64) map[string]map[string]int { | |||
| func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, beginTime int64, endTime int64) (map[string]map[string]int, map[string]*models.Cloudbrain) { | |||
| var WorkServerNumber int | |||
| var AccCardsNum int | |||
| cloudbrainMap := make(map[string]*models.Cloudbrain) | |||
| cloudBrainCenterCodeAndCardType := make(map[string]map[string]int) | |||
| for _, cloudbrain := range ciTasks { | |||
| if cloudbrain.Cloudbrain.StartTime == 0 { | |||
| cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix | |||
| } | |||
| if cloudbrain.Cloudbrain.EndTime == 0 { | |||
| cloudbrain.Cloudbrain.EndTime = timeutil.TimeStamp(time.Now().Unix()) | |||
| } | |||
| cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain) | |||
| if cloudbrain.Cloudbrain.Spec != nil { | |||
| if _, ok := cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType]; !ok { | |||
| if cloudbrain.Cloudbrain.Spec != nil { | |||
| cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType] = &cloudbrain.Cloudbrain | |||
| } | |||
| } | |||
| } | |||
| cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain) | |||
| if cloudbrain.Cloudbrain.StartTime == 0 { | |||
| cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix | |||
| @@ -195,7 +197,7 @@ func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, be | |||
| cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter] = make(map[string]int) | |||
| } | |||
| if cloudbrain.Cloudbrain.Spec != nil { | |||
| if cloudbrain.Cloudbrain.Status == string(models.ModelArtsRunning) { | |||
| if cloudbrain.Cloudbrain.Status == string(models.ModelArtsRunning) && cloudbrain.Cloudbrain.DeletedAt.IsZero() { | |||
| if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType]; !ok { | |||
| if int64(cloudbrain.Cloudbrain.StartTime) < beginTime { | |||
| cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime)) | |||
| @@ -239,7 +241,7 @@ func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, be | |||
| } | |||
| } | |||
| return cloudBrainCenterCodeAndCardType | |||
| return cloudBrainCenterCodeAndCardType, cloudbrainMap | |||
| } | |||
| func CloudbrainUpdateHistoryData(ctx *context.Context) { | |||
| @@ -257,7 +259,7 @@ func CloudbrainUpdateHistoryData(ctx *context.Context) { | |||
| endTimeUnix := timeutil.TimeStamp(endTime.Unix()) | |||
| err = models.DeleteCloudbrainDurationStatistic(beginTimeUnix, endTimeUnix) | |||
| count = UpdateDurationStatisticHistoryData(beginTime.Add(+1*time.Hour), endTime) | |||
| count = UpdateDurationStatisticHistoryData(beginTime.Add(+1*time.Hour), endTime.Add(+1*time.Hour)) | |||
| } | |||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
| "message": 0, | |||