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