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.

cloudbrains.go 6.1 kB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package admin
  2. import (
  3. "net/http"
  4. "net/url"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "github.com/360EntSecGroup-Skylar/excelize/v2"
  9. "code.gitea.io/gitea/modules/modelarts"
  10. "code.gitea.io/gitea/models"
  11. "code.gitea.io/gitea/modules/base"
  12. "code.gitea.io/gitea/modules/context"
  13. "code.gitea.io/gitea/modules/log"
  14. "code.gitea.io/gitea/modules/setting"
  15. )
  16. const (
  17. tplCloudBrains base.TplName = "admin/cloudbrain/list"
  18. EXCEL_DATE_FORMAT = "20060102150405"
  19. CREATE_TIME_FORMAT = "2006/01/02 15:04:05.00"
  20. )
  21. func CloudBrains(ctx *context.Context) {
  22. ctx.Data["Title"] = ctx.Tr("admin.cloudBrains")
  23. ctx.Data["PageIsAdmin"] = true
  24. ctx.Data["PageIsAdminCloudBrains"] = true
  25. listType := ctx.Query("listType")
  26. jobType := ctx.Query("jobType")
  27. jobStatus := ctx.Query("jobStatus")
  28. ctx.Data["ListType"] = listType
  29. ctx.Data["JobType"] = jobType
  30. ctx.Data["JobStatus"] = jobStatus
  31. page := ctx.QueryInt("page")
  32. if page <= 0 {
  33. page = 1
  34. }
  35. debugType := modelarts.DebugType
  36. if listType == models.GPUResource {
  37. debugType = models.TypeCloudBrainOne
  38. } else if listType == models.NPUResource {
  39. debugType = models.TypeCloudBrainTwo
  40. }
  41. var jobTypes []string
  42. jobTypeNot := false
  43. if jobType == string(models.JobTypeDebug) {
  44. jobTypes = append(jobTypes, string(models.JobTypeSnn4imagenet), string(models.JobTypeBrainScore), string(models.JobTypeDebug))
  45. } else if jobType != "all" && jobType != "" {
  46. jobTypes = append(jobTypes, jobType)
  47. }
  48. var jobStatuses []string
  49. jobStatusNot := false
  50. if jobStatus == "other" {
  51. jobStatusNot = true
  52. jobStatuses = append(jobStatuses, string(models.ModelArtsTrainJobWaiting), string(models.ModelArtsTrainJobFailed), string(models.ModelArtsRunning), string(models.ModelArtsTrainJobCompleted),
  53. string(models.ModelArtsStarting), string(models.ModelArtsRestarting), string(models.ModelArtsStartFailed),
  54. string(models.ModelArtsStopping), string(models.ModelArtsStopped))
  55. } else if jobStatus != "all" && jobStatus != "" {
  56. jobStatuses = append(jobStatuses, jobStatus)
  57. }
  58. keyword := strings.Trim(ctx.Query("q"), " ")
  59. ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{
  60. ListOptions: models.ListOptions{
  61. Page: page,
  62. PageSize: setting.UI.IssuePagingNum,
  63. },
  64. Keyword: keyword,
  65. Type: debugType,
  66. JobTypeNot: jobTypeNot,
  67. JobStatusNot: jobStatusNot,
  68. JobStatus: jobStatuses,
  69. JobTypes: jobTypes,
  70. NeedRepoInfo: true,
  71. })
  72. if err != nil {
  73. ctx.ServerError("Get job failed:", err)
  74. return
  75. }
  76. for i, task := range ciTasks {
  77. ciTasks[i].CanDebug = true
  78. ciTasks[i].CanDel = true
  79. ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
  80. }
  81. pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum))
  82. pager.SetDefaultParams(ctx)
  83. pager.AddParam(ctx, "listType", "ListType")
  84. ctx.Data["Page"] = pager
  85. ctx.Data["PageIsCloudBrain"] = true
  86. ctx.Data["Tasks"] = ciTasks
  87. ctx.Data["CanCreate"] = true
  88. ctx.Data["Keyword"] = keyword
  89. ctx.HTML(200, tplCloudBrains)
  90. }
  91. func DownloadCloudBrains(ctx *context.Context) {
  92. page := 1
  93. pageSize := 300
  94. var cloudBrain = ctx.Tr("repo.cloudbrain")
  95. fileName := getFileName(cloudBrain)
  96. _, total, err := models.Cloudbrains(&models.CloudbrainsOptions{
  97. ListOptions: models.ListOptions{
  98. Page: page,
  99. PageSize: 1,
  100. },
  101. Type: modelarts.DebugType,
  102. NeedRepoInfo: false,
  103. })
  104. if err != nil {
  105. log.Warn("Can not get cloud brain info", err)
  106. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.cloudbrain_query_fail"))
  107. return
  108. }
  109. totalPage := getTotalPage(total, pageSize)
  110. f := excelize.NewFile()
  111. index := f.NewSheet(cloudBrain)
  112. f.DeleteSheet("Sheet1")
  113. for k, v := range allHeader(ctx) {
  114. f.SetCellValue(cloudBrain, k, v)
  115. }
  116. var row = 2
  117. for i := 0; i < totalPage; i++ {
  118. pageRecords, _, err := models.Cloudbrains(&models.CloudbrainsOptions{
  119. ListOptions: models.ListOptions{
  120. Page: page,
  121. PageSize: pageSize,
  122. },
  123. Type: modelarts.DebugType,
  124. NeedRepoInfo: true,
  125. })
  126. if err != nil {
  127. log.Warn("Can not get cloud brain info", err)
  128. continue
  129. }
  130. for _, record := range pageRecords {
  131. for k, v := range allValues(row, record, ctx) {
  132. f.SetCellValue(cloudBrain, k, v)
  133. }
  134. row++
  135. }
  136. page++
  137. }
  138. f.SetActiveSheet(index)
  139. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName))
  140. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  141. f.WriteTo(ctx.Resp)
  142. }
  143. func allValues(row int, rs *models.CloudbrainInfo, ctx *context.Context) map[string]string {
  144. return map[string]string{getCellName("A", row): rs.JobName, getCellName("B", row): rs.Status, getCellName("C", row): rs.JobType, getCellName("D", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT), getCellName("E", row): getDurationTime(rs),
  145. getCellName("F", row): rs.ComputeResource, getCellName("G", row): rs.Name, getCellName("H", row): rs.Repo.OwnerName + "/" + rs.Repo.Alias, getCellName("I", row): rs.JobName,
  146. }
  147. }
  148. func getDurationTime(rs *models.CloudbrainInfo) string {
  149. if rs.JobType == "TRAIN" || rs.JobType == "INFERENCE" {
  150. return rs.TrainJobDuration
  151. } else {
  152. return "-"
  153. }
  154. }
  155. func getFileName(baseName string) string {
  156. return baseName + "_" + time.Now().Format(EXCEL_DATE_FORMAT) + ".xlsx"
  157. }
  158. func getTotalPage(total int64, pageSize int) int {
  159. another := 0
  160. if int(total)%pageSize != 0 {
  161. another = 1
  162. }
  163. return int(total)/pageSize + another
  164. }
  165. func allHeader(ctx *context.Context) map[string]string {
  166. return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.modelarts.status"), "C1": ctx.Tr("repo.cloudbrain_task_type"), "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")}
  167. }
  168. func getCellName(col string, row int) string {
  169. return col + strconv.Itoa(row)
  170. }