Browse Source

update

fix-2906
liuzx 2 years ago
parent
commit
a8341fcb42
5 changed files with 208 additions and 73 deletions
  1. +2
    -2
      models/cloudbrain_spec.go
  2. +60
    -9
      models/cloudbrain_static.go
  3. +4
    -0
      routers/api/v1/api.go
  4. +80
    -1
      routers/api/v1/repo/cloudbrain_dashboard.go
  5. +62
    -61
      routers/repo/cloudbrain_statistic.go

+ 2
- 2
models/cloudbrain_spec.go View File

@@ -9,7 +9,7 @@ type CloudbrainSpec struct {
SpecId int64 `xorm:"index"`
SourceSpecId string
AccCardsNum int
AccCardType string
AccCardType string `xorm:"index"`
CpuCores int
MemGiB float32
GPUMemGiB float32
@@ -19,7 +19,7 @@ type CloudbrainSpec struct {
QueueId int64
QueueCode string
Cluster string
AiCenterCode string
AiCenterCode string `xorm:"index"`
AiCenterName string
IsExclusive bool
ExclusiveOrg string


+ 60
- 9
models/cloudbrain_static.go View File

@@ -1,6 +1,7 @@
package models

import (
"fmt"
"strconv"
"time"

@@ -39,18 +40,20 @@ type TaskDetail struct {
}

type CloudbrainDurationStatistic struct {
ID int64 `xorm:"pk autoincr"`
Cluster string `xorm:"notnull"`
ID int64 `xorm:"pk autoincr"`
Cluster string
AiCenterCode string
AiCenterName string
ComputeResource string
AccCardType string
QueueCode string
CardsTotalNum int
TotalUse bool
TotalCanUse bool

DateTime string
DayTime string
HourTime int
CardsTotalDuration int
CardsTotalNum int

DeletedTime timeutil.TimeStamp `xorm:"deleted"`
CreatedTime timeutil.TimeStamp `xorm:"created"`
@@ -256,12 +259,8 @@ func GetSpecByAiCenterCodeAndType(aiCenterCode string, accCardType string) ([]*C
defer sess.Close()
var cond = builder.NewCond()
cond = cond.And(
builder.Eq{"cloudbrain_spec.ai_center_code": aiCenterCode},
builder.And(builder.Eq{"cloudbrain_spec.ai_center_code": aiCenterCode}, builder.Eq{"cloudbrain_spec.acc_card_type": accCardType}),
)
cond = cond.And(
builder.Eq{"cloudbrain_spec.acc_card_type": accCardType},
)
sess.OrderBy("cloudbrain_spec.created_unix ASC limit 1")
cloudbrainSpecs := make([]*CloudbrainSpec, 0, 10)
if err := sess.Table(&CloudbrainSpec{}).Where(cond).
Find(&cloudbrainSpecs); err != nil {
@@ -273,3 +272,55 @@ func GetSpecByAiCenterCodeAndType(aiCenterCode string, accCardType string) ([]*C
func InsertCloudbrainDurationStatistic(cloudbrainDurationStatistic *CloudbrainDurationStatistic) (int64, error) {
return xStatistic.Insert(cloudbrainDurationStatistic)
}

func DeleteCloudbrainDurationStatisticHour(date string, hour int, aiCenterCode string, accCardType string, tatalUse bool, totalCanUse bool) error {
sess := xStatistic.NewSession()
defer sess.Close()
if err := sess.Begin(); err != nil {
return fmt.Errorf("Begin: %v", err)
}

if _, err := sess.Where("day_time = ? AND hour_time = ? AND ai_center_code = ? AND acc_card_type = ? And total_use = ? And total_can_use = ?", date, hour, aiCenterCode, accCardType, tatalUse, totalCanUse).Delete(&CloudbrainDurationStatistic{}); err != nil {
return fmt.Errorf("Delete: %v", err)
}

if err := sess.Commit(); err != nil {
sess.Close()
return fmt.Errorf("Commit: %v", err)
}

sess.Close()
return nil
}

func GetCanUseCardInfo() ([]*ResourceQueue, error) {
sess := x.NewSession()
defer sess.Close()
var cond = builder.NewCond()
cond = cond.And(
builder.And(builder.Eq{"resource_queue.is_automatic_sync": false}),
)
ResourceQueues := make([]*ResourceQueue, 0, 10)
if err := sess.Table(&ResourceQueue{}).Where(cond).
Find(&ResourceQueues); err != nil {
log.Info("find error.")
}
return ResourceQueues, nil
}
func GetCardDurationStatistics(beginTime time.Time, endTime time.Time, totalUse bool, totalCanUse bool) ([]*CloudbrainDurationStatistic, error) {
sess := xStatistic.NewSession()
defer sess.Close()
var cond = builder.NewCond()
cond = cond.And(
builder.And(builder.Gte{"cloudbrain_duration_statistic.created_time": beginTime.Unix()}, builder.Lte{"cloudbrain_duration_statistic.created_time": endTime.Unix()}),
)
cond = cond.And(
builder.And(builder.Eq{"cloudbrain_duration_statistic.total_use": totalUse}, builder.Eq{"cloudbrain_duration_statistic.total_can_use": totalCanUse}),
)
CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0, 10)
if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).
Find(&CloudbrainDurationStatistics); err != nil {
log.Info("find error.")
}
return CloudbrainDurationStatistics, nil
}

+ 4
- 0
routers/api/v1/api.go View File

@@ -599,6 +599,10 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("/hours_data", repo.GetCloudbrainsCreateHoursData)
m.Get("/waitting_top_data", repo.GetWaittingTop)
m.Get("/running_top_data", repo.GetRunningTop)

m.Get("/overview_resource", repo.GetCloudbrainResourceOverview)
m.Get("/resource_usage", repo.GetCloudbrainResourceUsage)
m.Get("/resource_usage_detail", repo.GetCloudbrainResourceUsageDetail)
})
}, operationReq)



+ 80
- 1
routers/api/v1/repo/cloudbrain_dashboard.go View File

@@ -545,7 +545,7 @@ func GetAllCloudbrainsPeriodDistribution(ctx *context.Context) {
recordBeginTime := time.Unix(int64(recordCloudbrain[0].Cloudbrain.CreatedUnix), 0)
beginTime, endTime, err := getCloudbrainTimePeroid(ctx, recordBeginTime)
if err != nil {
log.Error("Parameter is wrong", err)
log.Error("getCloudbrainTimePeroid error:", err)
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.parameter_is_wrong"))
return
}
@@ -1403,3 +1403,82 @@ func getCloudbrainTimePeroid(ctx *context.Context, recordBeginTime time.Time) (t

return beginTime, endTime, nil
}

func GetCloudbrainResourceOverview(ctx *context.Context) {
resourceQueues, err := models.GetCanUseCardInfo()
if err != nil {
log.Info("GetCanUseCardInfo err: %v", err)
return
}

ctx.JSON(http.StatusOK, map[string]interface{}{
"resourceQueues": resourceQueues,
})

}

func GetCloudbrainResourceUsage(ctx *context.Context) {
recordBeginTime := time.Now().AddDate(0, 0, -6)
beginTime, endTime, err := getCloudbrainTimePeroid(ctx, recordBeginTime)
if err != nil {
log.Error("getCloudbrainTimePeroid error:", err)
return
}
cardUsageRes := make(map[string]int)
cardCanUsageRes := make(map[string]int)
cardUseInfo, err := models.GetCardDurationStatistics(beginTime, endTime, true, false)
if err != nil {
log.Error("GetCardDurationStatistics error:", err)
return
}
cardCanUseInfo, err := models.GetCardDurationStatistics(beginTime, endTime, false, true)
if err != nil {
log.Error("GetCardDurationStatistics error:", err)
return
}

for _, cloudbrainStat := range cardUseInfo {
if _, ok := cardUsageRes[cloudbrainStat.AiCenterCode]; !ok {
cardUsageRes[cloudbrainStat.AiCenterCode] = cloudbrainStat.CardsTotalDuration
} else {
cardUsageRes[cloudbrainStat.AiCenterCode] += cloudbrainStat.CardsTotalDuration
}
}

for _, cloudbrainStat := range cardCanUseInfo {
if _, ok := cardCanUsageRes[cloudbrainStat.AiCenterCode]; !ok {
cardCanUsageRes[cloudbrainStat.AiCenterCode] = cloudbrainStat.CardsTotalDuration
} else {
cardCanUsageRes[cloudbrainStat.AiCenterCode] += cloudbrainStat.CardsTotalDuration
}
}

ctx.JSON(http.StatusOK, map[string]interface{}{
"cardUseInfo": cardUseInfo,
"cardCanUseInfo": cardCanUseInfo,
"cardUsageRes": cardUsageRes,
"cardCanUsageRes": cardCanUsageRes,
})

}
func GetCloudbrainResourceUsageDetail(ctx *context.Context) {
recordBeginTime := time.Now().AddDate(0, 0, -6)
beginTime, endTime, err := getCloudbrainTimePeroid(ctx, recordBeginTime)
if err != nil {
log.Error("getCloudbrainTimePeroid error:", err)
return
}
totalUse := true
totalCanUse := false
cardDurationStatisticsInfo, err := models.GetCardDurationStatistics(beginTime, endTime, totalUse, totalCanUse)
if err != nil {
log.Error("GetCardDurationStatistics error:", err)
return
}
ctx.JSON(http.StatusOK, map[string]interface{}{
"cardDurationStatisticsInfo": cardDurationStatisticsInfo,
"beginTime": beginTime,
"endTime": endTime,
})

}

+ 62
- 61
routers/repo/cloudbrain_statistic.go View File

@@ -6,6 +6,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"
)

func CloudbrainDurationStatistic() {
@@ -16,28 +17,9 @@ func CloudbrainDurationStatistic() {
}

func CloudbrainDurationStatisticHour(ctx *context.Context) {
//获取规定时间段的云脑任务列表
// page := ctx.QueryInt("page")
// pageSize := ctx.QueryInt("pagesize")
// if page <= 0 {
// page = 1
// }
// if pageSize <= 0 {
// pageSize = 10
// }

// cloudBrainDurationRes := make(map[string]map[string]int)
// cloudBrainOneCardRes := make(map[string]int)
// cloudBrainTwoCardRes := make(map[string]int)
// c2NetCardRes := make(map[string]int)
// cDNetCenterCardRes := make(map[string]int)
// var WorkServerNumber int
// var AccCardsNum int
// endTime := time.Now().Unix()
// beginTime := time.Now().AddDate(0, 0, -1).Unix()

// hour := time.Now().Hour()
// tStr := time.Now().Format("2006-01-02 15:04:05")
hourTime := time.Now().Hour()
dateTime := time.Now().Format("2006-01-02 15:04:05")
dayTime := time.Now().Format("2006-01-02")

currentTime := time.Now()
m, _ := time.ParseDuration("-1h")
@@ -71,50 +53,69 @@ func CloudbrainDurationStatisticHour(ctx *context.Context) {
log.Info("GetSpecByAiCenterCodeAndType err: %v", err)
return
}
cloudbrainDurationStat := models.CloudbrainDurationStatistic{
DateTime: date,
HourTime: userNumber,
Cluster: cloudbrain[0].Cluster,
AiCenterName: cloudbrain[0].AiCenterName,
AiCenterCode: centerCode,
ComputeResource: cloudbrain[0].ComputeResource,
AccCardType: cardType,
CardsTotalNum: mirrorRepositoryNumber,
CardsTotalDuration: cardDuration,
QueueCode: cloudbrain[0].QueueCode,
CreatedTime: privateRepositoryNumer,
UpdatedTime: publicRepositoryNumer,
log.Info("cloudbrain: %s", cloudbrain)
if cloudbrain != nil {
totalUse := true
totalCanUse := false
if err := models.DeleteCloudbrainDurationStatisticHour(dayTime, hourTime, centerCode, cardType, totalUse, totalCanUse); err != nil {
log.Error("DeleteCloudbrainDurationStatisticHour failed: %v", err.Error())
return
}
cloudbrainDurationStat := models.CloudbrainDurationStatistic{
DateTime: dateTime,
DayTime: dayTime,
HourTime: hourTime,
Cluster: cloudbrain[0].Cluster,
AiCenterName: cloudbrain[0].AiCenterName,
AiCenterCode: centerCode,
ComputeResource: cloudbrain[0].ComputeResource,
AccCardType: cardType,
CardsTotalDuration: cardDuration,
CreatedTime: timeutil.TimeStampNow(),
TotalUse: true,
TotalCanUse: false,
}
if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
}
}
}

}

//根据云脑任务列表获取云脑任务已使用的卡时,并区分是哪个智算中心,哪个卡类型的卡时,将这些信息存入新表

// cloudbrainDurationStat := models.CloudbrainDurationStatistic{
// DateTime: date,
// HourTime: userNumber,
// Cluster: repositorySize,
// AiCenterName: allDatasetSize,
// AiCenterCode: organizationNumber,
// ComputeResource: repositoryNumer,
// AccCardType: forkRepositoryNumber,
// CardsTotalNum: mirrorRepositoryNumber,
// CardsTotalDuration: privateRepositoryNumer,
// QueueCode: publicRepositoryNumer,
// CreatedTime: privateRepositoryNumer,
// UpdatedTime: publicRepositoryNumer,
// }

// if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
// log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
// }
// log.Info("cloudBrainDurationRes2: %s", cloudBrainDurationRes)
// cloudBrainDurationRes = append(cloudBrainDurationRes, cloudBrainOneCardRes)
// log.Info("cloudBrainDurationRes: %s", cloudBrainDurationRes)
// log.Info("cloudBrainOneCardRes: %s", cloudBrainOneCardRes)
// log.Info("cloudBrainCardRes: %s", cloudBrainCardRes)
// log.Info("c2NetCardRes: %s", c2NetCardRes)
resourceQueues, err := models.GetCanUseCardInfo()
if err != nil {
log.Info("GetCanUseCardInfo err: %v", err)
return
}
log.Info("resourceQueues here: %s", resourceQueues)
for _, resourceQueue := range resourceQueues {
totalUse := false
totalCanUse := true
if err := models.DeleteCloudbrainDurationStatisticHour(dayTime, hourTime, resourceQueue.AiCenterCode, resourceQueue.AccCardType, totalUse, totalCanUse); err != nil {
log.Error("DeleteCloudbrainDurationStatisticHour failed: %v", err.Error())
return
}
cardsTotalDuration := resourceQueue.CardsTotalNum * 1 * 60 * 60
cloudbrainDurationStat := models.CloudbrainDurationStatistic{
DateTime: dateTime,
DayTime: dayTime,
HourTime: hourTime,
Cluster: resourceQueue.Cluster,
AiCenterName: resourceQueue.AiCenterName,
AiCenterCode: resourceQueue.AiCenterCode,
ComputeResource: resourceQueue.ComputeResource,
AccCardType: resourceQueue.AccCardType,
CardsTotalDuration: cardsTotalDuration,
CardsTotalNum: resourceQueue.CardsTotalNum,
CreatedTime: timeutil.TimeStampNow(),
TotalUse: false,
TotalCanUse: true,
}
if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
}
}
log.Info("finish summary cloudbrainDurationStat")
}



Loading…
Cancel
Save