You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cloudbrain_dashboard.go 4.6 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package repo
  2. import (
  3. "net/http"
  4. "net/url"
  5. "time"
  6. "code.gitea.io/gitea/models"
  7. "code.gitea.io/gitea/modules/context"
  8. "code.gitea.io/gitea/modules/log"
  9. "github.com/360EntSecGroup-Skylar/excelize/v2"
  10. )
  11. type CloudbrainsStatusAnalysis struct {
  12. JobWaitingCount int64 `json:"jobWaitingCount"`
  13. JobRunningCount int64 `json:"jobRunningCount"`
  14. JobStoppedCount int64 `json:"jobStoppedCount"`
  15. JobCompletedCount int64 `json:"jobCompletedCount"`
  16. JobFailedCount int64 `json:"jobFailedCount"`
  17. JobKilledCount int64 `json:"jobKilledCount"`
  18. JobInitCount int64 `json:"jobInitCount"`
  19. }
  20. func DownloadCloudBrainBoard(ctx *context.Context) {
  21. page := 1
  22. pageSize := 300
  23. var cloudBrain = ctx.Tr("repo.cloudbrain")
  24. fileName := getCloudbrainFileName(cloudBrain)
  25. _, total, err := models.CloudbrainAll(&models.CloudbrainsOptions{
  26. ListOptions: models.ListOptions{
  27. Page: page,
  28. PageSize: pageSize,
  29. },
  30. Type: models.TypeCloudBrainAll,
  31. NeedRepoInfo: false,
  32. })
  33. if err != nil {
  34. log.Warn("Can not get cloud brain info", err)
  35. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.cloudbrain_query_fail"))
  36. return
  37. }
  38. totalPage := getTotalPage(total, pageSize)
  39. f := excelize.NewFile()
  40. index := f.NewSheet(cloudBrain)
  41. f.DeleteSheet("Sheet1")
  42. for k, v := range allCloudbrainHeader(ctx) {
  43. f.SetCellValue(cloudBrain, k, v)
  44. }
  45. var row = 2
  46. for i := 0; i < totalPage; i++ {
  47. pageRecords, _, err := models.CloudbrainAll(&models.CloudbrainsOptions{
  48. ListOptions: models.ListOptions{
  49. Page: page,
  50. PageSize: pageSize,
  51. },
  52. Type: models.TypeCloudBrainAll,
  53. NeedRepoInfo: true,
  54. })
  55. if err != nil {
  56. log.Warn("Can not get cloud brain info", err)
  57. continue
  58. }
  59. for _, record := range pageRecords {
  60. for k, v := range allCloudbrainValues(row, record, ctx) {
  61. f.SetCellValue(cloudBrain, k, v)
  62. }
  63. row++
  64. }
  65. page++
  66. }
  67. f.SetActiveSheet(index)
  68. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName))
  69. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  70. f.WriteTo(ctx.Resp)
  71. }
  72. func getCloudbrainFileName(baseName string) string {
  73. return baseName + "_" + time.Now().Format(EXCEL_DATE_FORMAT) + ".xlsx"
  74. }
  75. func allCloudbrainHeader(ctx *context.Context) map[string]string {
  76. return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.cloudbrain_task_type"), "C1": ctx.Tr("repo.modelarts.status"),
  77. "D1": ctx.Tr("repo.modelarts.createtime"), "E1": ctx.Tr("repo.modelarts.train_job.wait_time"), "F1": ctx.Tr("repo.modelarts.train_job.dura_time"),
  78. "G1": ctx.Tr("repo.modelarts.train_job.start_time"),
  79. "H1": ctx.Tr("repo.modelarts.train_job.end_time"), "I1": ctx.Tr("repo.modelarts.computing_resources"),
  80. "J1": ctx.Tr("repo.cloudbrain_creator"), "K1": ctx.Tr("repo.repo_name"), "L1": ctx.Tr("repo.cloudbrain_task_name")}
  81. }
  82. func allCloudbrainValues(row int, rs *models.CloudbrainInfo, ctx *context.Context) map[string]string {
  83. return map[string]string{getCellName("A", row): rs.DisplayJobName, getCellName("B", row): rs.JobType, getCellName("C", row): rs.Status,
  84. getCellName("D", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT), getCellName("E", row): getBrainWaitTime(rs),
  85. getCellName("F", row): rs.TrainJobDuration, getCellName("G", row): getBrainStartTime(rs),
  86. getCellName("H", row): getBrainEndTime(rs),
  87. getCellName("I", row): rs.ComputeResource, getCellName("J", row): rs.Name, getCellName("K", row): getBrainRepo(rs),
  88. getCellName("L", row): rs.JobName,
  89. }
  90. }
  91. func getBrainRepo(rs *models.CloudbrainInfo) string {
  92. if rs.Repo != nil {
  93. return rs.Repo.OwnerName + "/" + rs.Repo.Alias
  94. }
  95. return ""
  96. }
  97. func getBrainStartTime(rs *models.CloudbrainInfo) string {
  98. timeString := time.Unix(int64(rs.Cloudbrain.StartTime), 0).Format(CREATE_TIME_FORMAT)
  99. if timeString != "1970/01/01 08:00:00" {
  100. return timeString
  101. } else {
  102. return "0"
  103. }
  104. }
  105. func getBrainEndTime(rs *models.CloudbrainInfo) string {
  106. timeString := time.Unix(int64(rs.Cloudbrain.EndTime), 0).Format(CREATE_TIME_FORMAT)
  107. if timeString != "1970/01/01 08:00:00" {
  108. return timeString
  109. } else {
  110. return "0"
  111. }
  112. }
  113. func getBrainWaitTime(rs *models.CloudbrainInfo) string {
  114. waitTime := rs.Cloudbrain.StartTime - rs.Cloudbrain.CreatedUnix
  115. if waitTime <= 0 {
  116. return "0"
  117. } else {
  118. return models.ConvertDurationToStr(int64(waitTime))
  119. }
  120. }
  121. func GetCloudbrainsStatusAnalysis(ctx *context.Context) {
  122. cloudBrainStatusResult := models.GetAllStatusCloudBrain()
  123. ctx.JSON(http.StatusOK, map[string]interface{}{
  124. "cloudBrainStatusResult": cloudBrainStatusResult,
  125. })
  126. }