|
- package repo
-
- import (
- "net/http"
- "strings"
- "time"
-
- "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() {
- 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.Add(-1*time.Hour).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)
- }
- log.Info("summaryDurationStat count: %v", count)
- }
- }
- func UpdateDurationStatisticHistoryData(beginTime time.Time, endTime time.Time) int64 {
- var count int64
- statisticTime := beginTime
- currentTime := endTime
- for statisticTime.Before(currentTime) || statisticTime.Equal(currentTime) {
- countEach := summaryDurationStat(statisticTime)
- count += countEach
- statisticTime = statisticTime.Add(+1 * time.Hour)
- }
- return count
- }
-
- //statisticTime是当前的时辰,比如当前是2019-01-01 12:01:01,那么statisticTime就是2019-01-01 12:00:00
- func summaryDurationStat(statisticTime time.Time) int64 {
- var count int64
- 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()
- endTime := statisticTime.Unix()
-
- ciTasks, err := models.GetCloudbrainByTime(beginTime, endTime)
- if err != nil {
- log.Info("GetCloudbrainByTime err: %v", err)
- return 0
- }
- models.LoadSpecs4CloudbrainInfo(ciTasks)
- cloudBrainCenterCodeAndCardTypeInfo, cloudbrainMap := getcloudBrainCenterCodeAndCardTypeInfo(ciTasks, beginTime, endTime)
-
- resourceQueues, err := models.GetCanUseCardInfo()
- if err != nil {
- log.Info("GetCanUseCardInfo err: %v", err)
- return 0
- }
-
- cardsTotalDurationMap := make(map[string]int)
- for _, resourceQueue := range resourceQueues {
- if _, ok := cardsTotalDurationMap[resourceQueue.Cluster+"/"+resourceQueue.AiCenterCode+"/"+resourceQueue.AccCardType]; !ok {
- cardsTotalDurationMap[resourceQueue.Cluster+"/"+resourceQueue.AiCenterCode+"/"+resourceQueue.AccCardType] = resourceQueue.CardsTotalNum * 1 * 60 * 60
- } else {
- cardsTotalDurationMap[resourceQueue.Cluster+"/"+resourceQueue.AiCenterCode+"/"+resourceQueue.AccCardType] += resourceQueue.CardsTotalNum * 1 * 60 * 60
- }
- }
-
- for centerCode, CardTypes := range cloudBrainCenterCodeAndCardTypeInfo {
- for cardType, cardDuration := range CardTypes {
- cloudbrainTable := cloudbrainMap[centerCode+"/"+cardType]
- if cloudbrainTable != nil {
- if _, ok := cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType]; !ok {
- cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType] = 0
- }
- cloudbrainDurationStat := models.CloudbrainDurationStatistic{
- DateTimeUnix: dateTimeUnix,
- DayTime: dayTime,
- HourTime: hourTime,
- Cluster: cloudbrainTable.Cluster,
- AiCenterName: GetAiCenterNameByCode(centerCode, "zh-CN"),
- AiCenterCode: centerCode,
- AccCardType: cardType,
- CardsUseDuration: cardDuration,
- CardsTotalDuration: cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType],
- CreatedUnix: timeutil.TimeStampNow(),
- }
- if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
- log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
- }
- count++
- delete(cardsTotalDurationMap, cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType)
- }
- }
- }
-
- for key, cardsTotalDuration := range cardsTotalDurationMap {
- cloudbrainDurationStat := models.CloudbrainDurationStatistic{
- DateTimeUnix: dateTimeUnix,
- DayTime: dayTime,
- HourTime: hourTime,
- Cluster: strings.Split(key, "/")[0],
- AiCenterName: GetAiCenterNameByCode(strings.Split(key, "/")[1], "zh-CN"),
- AiCenterCode: strings.Split(key, "/")[1],
- AccCardType: strings.Split(key, "/")[2],
- CardsUseDuration: 0,
- CardsTotalDuration: cardsTotalDuration,
- CardsTotalNum: cardsTotalDuration / 1 / 60 / 60,
- CreatedUnix: timeutil.TimeStampNow(),
- }
- if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
- log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
- }
- count++
- }
-
- log.Info("finish summary cloudbrainDurationStat")
- return count
- }
-
- func GetAiCenterNameByCode(centerCode string, language string) string {
- var aiCenterName string
- aiCenterInfo := cloudbrainService.GetAiCenterInfoByCenterCode(centerCode)
- if aiCenterInfo != nil {
- if language == "zh-CN" {
- aiCenterName = aiCenterInfo.Content
- } else {
- aiCenterName = aiCenterInfo.ContentEN
- }
- } else {
- aiCenterName = centerCode
- }
- return aiCenterName
- }
-
- 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
- }
- if cloudbrain.Cloudbrain.EndTime == 0 {
- cloudbrain.Cloudbrain.EndTime = cloudbrain.Cloudbrain.UpdatedUnix
- }
- if cloudbrain.Cloudbrain.WorkServerNumber >= 1 {
- WorkServerNumber = cloudbrain.Cloudbrain.WorkServerNumber
- } else {
- WorkServerNumber = 1
- }
- if cloudbrain.Cloudbrain.Spec == nil {
- AccCardsNum = 1
- } else {
- AccCardsNum = cloudbrain.Cloudbrain.Spec.AccCardsNum
- }
- if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter]; !ok {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter] = make(map[string]int)
- }
- if cloudbrain.Cloudbrain.Spec != nil {
- 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))
- } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) < endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
- } else if int64(cloudbrain.Cloudbrain.StartTime) >= endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = 0
- }
- } else {
- if int64(cloudbrain.Cloudbrain.StartTime) < beginTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
- } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) < endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
- } else if int64(cloudbrain.Cloudbrain.StartTime) >= endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += 0
- }
- }
- } else {
- if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType]; !ok {
- if int64(cloudbrain.Cloudbrain.StartTime) <= beginTime && int64(cloudbrain.Cloudbrain.EndTime) <= endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(beginTime))
- } else if int64(cloudbrain.Cloudbrain.StartTime) <= beginTime && int64(cloudbrain.Cloudbrain.EndTime) > endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
- } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) <= endTime && int64(cloudbrain.Cloudbrain.EndTime) <= endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(cloudbrain.Cloudbrain.StartTime))
- } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) <= endTime && int64(cloudbrain.Cloudbrain.EndTime) > endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
- }
- } else {
- if int64(cloudbrain.Cloudbrain.StartTime) <= beginTime && int64(cloudbrain.Cloudbrain.EndTime) <= endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(beginTime))
- } else if int64(cloudbrain.Cloudbrain.StartTime) <= beginTime && int64(cloudbrain.Cloudbrain.EndTime) > endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
- } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) <= endTime && int64(cloudbrain.Cloudbrain.EndTime) <= endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(cloudbrain.Cloudbrain.StartTime))
- } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) <= endTime && int64(cloudbrain.Cloudbrain.EndTime) > endTime {
- cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
- }
- }
- }
- }
- }
-
- return cloudBrainCenterCodeAndCardType, cloudbrainMap
- }
-
- func CloudbrainUpdateHistoryData(ctx *context.Context) {
- beginTimeStr := ctx.QueryTrim("beginTime")
- endTimeStr := ctx.QueryTrim("endTime")
- var count int64
- var err error
- if beginTimeStr != "" && endTimeStr != "" {
- beginTime, _ := time.ParseInLocation("2006-01-02 15:04:05", beginTimeStr, time.Local)
- endTime, _ := time.ParseInLocation("2006-01-02 15:04:05", endTimeStr, time.Local)
- if time.Now().Before(endTime) {
- endTime = time.Now()
- }
- beginTimeUnix := timeutil.TimeStamp(beginTime.Unix())
- endTimeUnix := timeutil.TimeStamp(endTime.Unix())
-
- err = models.DeleteCloudbrainDurationStatistic(beginTimeUnix, endTimeUnix)
- count = UpdateDurationStatisticHistoryData(beginTime.Add(+1*time.Hour), endTime.Add(+1*time.Hour))
- }
- ctx.JSON(http.StatusOK, map[string]interface{}{
- "message": 0,
- "count": count,
- "err": err,
- })
- }
|