package repo import ( "net/http" "net/url" "time" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/log" "github.com/360EntSecGroup-Skylar/excelize/v2" ) type CloudbrainsStatusAnalysis struct { JobWaitingCount int64 `json:"jobWaitingCount"` JobRunningCount int64 `json:"jobRunningCount"` JobStoppedCount int64 `json:"jobStoppedCount"` JobCompletedCount int64 `json:"jobCompletedCount"` JobFailedCount int64 `json:"jobFailedCount"` JobKilledCount int64 `json:"jobKilledCount"` JobInitCount int64 `json:"jobInitCount"` } func DownloadCloudBrainBoard(ctx *context.Context) { page := 1 pageSize := 300 var cloudBrain = ctx.Tr("repo.cloudbrain") fileName := getCloudbrainFileName(cloudBrain) _, total, err := models.CloudbrainAll(&models.CloudbrainsOptions{ ListOptions: models.ListOptions{ Page: page, PageSize: pageSize, }, Type: models.TypeCloudBrainAll, NeedRepoInfo: false, }) if err != nil { log.Warn("Can not get cloud brain info", err) ctx.Error(http.StatusBadRequest, ctx.Tr("repo.cloudbrain_query_fail")) return } totalPage := getTotalPage(total, pageSize) f := excelize.NewFile() index := f.NewSheet(cloudBrain) f.DeleteSheet("Sheet1") for k, v := range allCloudbrainHeader(ctx) { f.SetCellValue(cloudBrain, k, v) } var row = 2 for i := 0; i < totalPage; i++ { pageRecords, _, err := models.CloudbrainAll(&models.CloudbrainsOptions{ ListOptions: models.ListOptions{ Page: page, PageSize: pageSize, }, Type: models.TypeCloudBrainAll, NeedRepoInfo: true, }) if err != nil { log.Warn("Can not get cloud brain info", err) continue } for _, record := range pageRecords { for k, v := range allCloudbrainValues(row, record, ctx) { f.SetCellValue(cloudBrain, k, v) } row++ } page++ } f.SetActiveSheet(index) ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName)) ctx.Resp.Header().Set("Content-Type", "application/octet-stream") f.WriteTo(ctx.Resp) } func getCloudbrainFileName(baseName string) string { return baseName + "_" + time.Now().Format(EXCEL_DATE_FORMAT) + ".xlsx" } func allCloudbrainHeader(ctx *context.Context) map[string]string { return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.cloudbrain_task_type"), "C1": ctx.Tr("repo.modelarts.status"), "D1": ctx.Tr("repo.modelarts.createtime"), "E1": ctx.Tr("repo.modelarts.train_job.wait_time"), "F1": ctx.Tr("repo.modelarts.train_job.dura_time"), "G1": ctx.Tr("repo.modelarts.train_job.start_time"), "H1": ctx.Tr("repo.modelarts.train_job.end_time"), "I1": ctx.Tr("repo.modelarts.computing_resources"), "J1": ctx.Tr("repo.cloudbrain_creator"), "K1": ctx.Tr("repo.repo_name"), "L1": ctx.Tr("repo.cloudbrain_task_name")} } func allCloudbrainValues(row int, rs *models.CloudbrainInfo, ctx *context.Context) map[string]string { return map[string]string{getCellName("A", row): rs.DisplayJobName, getCellName("B", row): rs.JobType, getCellName("C", row): rs.Status, getCellName("D", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT), getCellName("E", row): getBrainWaitTime(rs), getCellName("F", row): rs.TrainJobDuration, getCellName("G", row): getBrainStartTime(rs), getCellName("H", row): getBrainEndTime(rs), getCellName("I", row): rs.ComputeResource, getCellName("J", row): rs.Name, getCellName("K", row): getBrainRepo(rs), getCellName("L", row): rs.JobName, } } func getBrainRepo(rs *models.CloudbrainInfo) string { if rs.Repo != nil { return rs.Repo.OwnerName + "/" + rs.Repo.Alias } return "" } func getBrainStartTime(rs *models.CloudbrainInfo) string { timeString := time.Unix(int64(rs.Cloudbrain.StartTime), 0).Format(CREATE_TIME_FORMAT) if timeString != "1970/01/01 08:00:00" { return timeString } else { return "0" } } func getBrainEndTime(rs *models.CloudbrainInfo) string { timeString := time.Unix(int64(rs.Cloudbrain.EndTime), 0).Format(CREATE_TIME_FORMAT) if timeString != "1970/01/01 08:00:00" { return timeString } else { return "0" } } func getBrainWaitTime(rs *models.CloudbrainInfo) string { waitTime := rs.Cloudbrain.StartTime - rs.Cloudbrain.CreatedUnix if waitTime <= 0 { return "0" } else { return models.ConvertDurationToStr(int64(waitTime)) } } func GetCloudbrainsStatusAnalysis(ctx *context.Context) { cloudBrainStatusResult := models.GetAllStatusCloudBrain() ctx.JSON(http.StatusOK, map[string]interface{}{ "cloudBrainStatusResult": cloudBrainStatusResult, }) }