| @@ -1,13 +1,14 @@ | |||||
| package models | package models | ||||
| import ( | import ( | ||||
| "code.gitea.io/gitea/modules/util" | |||||
| "encoding/json" | "encoding/json" | ||||
| "fmt" | "fmt" | ||||
| "strconv" | "strconv" | ||||
| "strings" | "strings" | ||||
| "time" | "time" | ||||
| "code.gitea.io/gitea/modules/util" | |||||
| "xorm.io/builder" | "xorm.io/builder" | ||||
| "xorm.io/xorm" | "xorm.io/xorm" | ||||
| @@ -1564,3 +1565,65 @@ func RestartCloudbrain(old *Cloudbrain, new *Cloudbrain) (err error) { | |||||
| return nil | return nil | ||||
| } | } | ||||
| func CloudbrainAll(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) { | |||||
| sess := x.NewSession() | |||||
| defer sess.Close() | |||||
| var cond = builder.NewCond() | |||||
| if (opts.Type) >= 0 { | |||||
| cond = cond.And( | |||||
| builder.Eq{"cloudbrain.type": opts.Type}, | |||||
| ) | |||||
| } | |||||
| var count int64 | |||||
| var err error | |||||
| condition := "cloudbrain.user_id = `user`.id" | |||||
| if len(opts.Keyword) == 0 { | |||||
| count, err = sess.Where(cond).Count(new(Cloudbrain)) | |||||
| } else { | |||||
| lowerKeyWord := strings.ToLower(opts.Keyword) | |||||
| cond = cond.And(builder.Or(builder.Like{"LOWER(cloudbrain.job_name)", lowerKeyWord}, builder.Like{"LOWER(cloudbrain.display_job_name)", lowerKeyWord}, builder.Like{"`user`.lower_name", lowerKeyWord})) | |||||
| count, err = sess.Table(&Cloudbrain{}).Where(cond). | |||||
| Join("left", "`user`", condition).Count(new(CloudbrainInfo)) | |||||
| } | |||||
| if err != nil { | |||||
| return nil, 0, fmt.Errorf("Count: %v", err) | |||||
| } | |||||
| if opts.Page >= 0 && opts.PageSize > 0 { | |||||
| var start int | |||||
| if opts.Page == 0 { | |||||
| start = 0 | |||||
| } else { | |||||
| start = (opts.Page - 1) * opts.PageSize | |||||
| } | |||||
| sess.Limit(opts.PageSize, start) | |||||
| } | |||||
| sess.OrderBy("cloudbrain.created_unix DESC") | |||||
| cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum) | |||||
| if err := sess.Table(&Cloudbrain{}).Unscoped().Where(cond). | |||||
| Join("left", "`user`", condition). | |||||
| Find(&cloudbrains); err != nil { | |||||
| return nil, 0, fmt.Errorf("Find: %v", err) | |||||
| } | |||||
| if opts.NeedRepoInfo { | |||||
| var ids []int64 | |||||
| for _, task := range cloudbrains { | |||||
| ids = append(ids, task.RepoID) | |||||
| } | |||||
| repositoryMap, err := GetRepositoriesMapByIDs(ids) | |||||
| if err == nil { | |||||
| for _, task := range cloudbrains { | |||||
| task.Repo = repositoryMap[task.RepoID] | |||||
| } | |||||
| } | |||||
| } | |||||
| return cloudbrains, count, nil | |||||
| } | |||||
| @@ -1005,6 +1005,8 @@ modelarts.train_job.job_status=任务状态 | |||||
| modelarts.train_job.job_name=任务名称 | modelarts.train_job.job_name=任务名称 | ||||
| modelarts.train_job.version=任务版本 | modelarts.train_job.version=任务版本 | ||||
| modelarts.train_job.start_time=开始时间 | modelarts.train_job.start_time=开始时间 | ||||
| modelarts.train_job.end_time=结束时间 | |||||
| modelarts.train_job.wait_time=等待时间 | |||||
| modelarts.train_job.dura_time=运行时长 | modelarts.train_job.dura_time=运行时长 | ||||
| modelarts.train_job.description=任务描述 | modelarts.train_job.description=任务描述 | ||||
| modelarts.train_job.parameter_setting=参数设置 | modelarts.train_job.parameter_setting=参数设置 | ||||
| @@ -557,10 +557,11 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| m.Get("/query_user_all", operationReq, repo_ext.QueryUserStaticAll) | m.Get("/query_user_all", operationReq, repo_ext.QueryUserStaticAll) | ||||
| //cloudbrain board | //cloudbrain board | ||||
| m.Group("/cloudbrainboard", func() { | m.Group("/cloudbrainboard", func() { | ||||
| m.Get("/downloadtable", repo.ServeCloudbrainPeriodStatisticsFile) | |||||
| m.Get("/downloadStatistics", repo.ServeCloudbrainPeriodStatisticsFile) | |||||
| m.Get("/downloadAll", repo.DownloadCloudBrainBoard) | |||||
| m.Group("/cloudbrain", func() { | m.Group("/cloudbrain", func() { | ||||
| m.Get("/trend", repo.GetAllCloudbrainsTrend) | m.Get("/trend", repo.GetAllCloudbrainsTrend) | ||||
| m.Get("", repo.GetAllCloudbrainsPeriodStatistics) | |||||
| m.Get("/statistics", repo.GetAllCloudbrainsPeriodStatistics) | |||||
| }) | }) | ||||
| }, operationReq) | }, operationReq) | ||||
| @@ -537,3 +537,126 @@ func ServeCloudbrainPeriodStatisticsFile(ctx *context.Context) { | |||||
| f.WriteTo(ctx.Resp) | f.WriteTo(ctx.Resp) | ||||
| } | } | ||||
| 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: 1, | |||||
| }, | |||||
| 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) | |||||
| fmt.Printf("total:%v", total) | |||||
| fmt.Printf("totalPage:%v", totalPage) | |||||
| f := excelize.NewFile() | |||||
| index := f.NewSheet(cloudBrain) | |||||
| f.DeleteSheet("Sheet1") | |||||
| for k, v := range allHeader(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 allValues(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 allHeader(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.dura_time"), "F1": ctx.Tr("repo.modelarts.computing_resources"), | |||||
| "G1": ctx.Tr("repo.cloudbrain_creator"), "H1": ctx.Tr("repo.repo_name"), "I1": ctx.Tr("repo.cloudbrain_task_name"), "J1": ctx.Tr("repo.modelarts.train_job.start_time"), | |||||
| "K1": ctx.Tr("repo.modelarts.train_job.end_time"), "L1": ctx.Tr("repo.modelarts.train_job.wait_time")} | |||||
| } | |||||
| func allValues(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): rs.TrainJobDuration, | |||||
| getCellName("F", row): rs.ComputeResource, getCellName("G", row): rs.Name, getCellName("H", row): getRepoPathName(rs), | |||||
| getCellName("I", row): rs.JobName, getCellName("J", row): getBrainStartTime(rs), | |||||
| getCellName("K", row): getBrainEndTime(rs), getCellName("L", row): getBrainWaitTime(rs), | |||||
| } | |||||
| } | |||||
| func getRepoPathName(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)) | |||||
| } | |||||
| } | |||||
| @@ -26,6 +26,14 @@ | |||||
| </span> | </span> | ||||
| <UserAnalysis ref='UserAnalysis' v-if="isRouterAlive1" id ="usr"></UserAnalysis> | <UserAnalysis ref='UserAnalysis' v-if="isRouterAlive1" id ="usr"></UserAnalysis> | ||||
| </el-tab-pane> | </el-tab-pane> | ||||
| <el-tab-pane name="four" id='four' > | |||||
| <BrainAnalysis ref='BrainAnalysis'id="brain" v-if="isRouterAlive"></BrainAnalysis> | |||||
| <span slot="label"> | |||||
| <el-image style="width: 13px; height: 13px" src="/img/pro_rgb.svg"> | |||||
| </el-image> | |||||
| 云脑分析 | |||||
| </span> | |||||
| </el-tab-pane> | |||||
| </el-tabs> | </el-tabs> | ||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| @@ -33,12 +41,14 @@ | |||||
| <script> | <script> | ||||
| import ProAnalysis from './ProAnalysis.vue' | import ProAnalysis from './ProAnalysis.vue' | ||||
| import UserAnalysis from './UserAnalysis.vue' | import UserAnalysis from './UserAnalysis.vue' | ||||
| import BrainAnalysis from './BrainAnalysis.vue' | |||||
| export default { | export default { | ||||
| components:{ | components:{ | ||||
| 'ProAnalysis':ProAnalysis, | 'ProAnalysis':ProAnalysis, | ||||
| 'UserAnalysis':UserAnalysis, | 'UserAnalysis':UserAnalysis, | ||||
| 'BrainAnalysis':BrainAnalysis | |||||
| }, | }, | ||||
| data() { | data() { | ||||
| return { | return { | ||||