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 35 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961
  1. package repo
  2. import (
  3. "net/http"
  4. "net/url"
  5. "strings"
  6. "time"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/modelarts"
  11. "github.com/360EntSecGroup-Skylar/excelize/v2"
  12. "code.gitea.io/gitea/modules/setting"
  13. )
  14. type TimeCloudbrainsNum struct {
  15. TimeCloudbrainNum []DateCloudbrainNum `json:"dateCloudbrainNum"`
  16. TotalCount int `json:"totalCount"`
  17. }
  18. type DateCloudbrainNum struct {
  19. Date string `json:"date"`
  20. CloudOneJobTypeRes map[string]int `json:"cloudOneJobTypeRes"`
  21. CloudTwoJobTypeRes map[string]int `json:"cloudTwoJobTypeRes"`
  22. IntelligentNetJobTypeRes map[string]int `json:"intelligentNetJobTypeRes"`
  23. CloudBrainPeriodNum map[int]int `json:"cloudBrainPeriodNum"`
  24. CloudBrainComputeResource map[string]int `json:"cloudBrainComputeResource"`
  25. }
  26. func GetAllCloudbrainsOverview(ctx *context.Context) {
  27. recordBeginTime, err := getBrainRecordBeginTime()
  28. if err != nil {
  29. log.Error("Can not get record begin time", err)
  30. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  31. return
  32. }
  33. now := time.Now()
  34. //today overview
  35. beginTime := now.AddDate(0, 0, 0)
  36. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  37. endTime := now
  38. todayCreatorCount, err := models.GetTodayCreatorCount(beginTime, endTime)
  39. if err != nil {
  40. log.Error("Can not query todayCreatorCount.", err)
  41. return
  42. }
  43. creatorCount, err := models.GetCreatorCount()
  44. if err != nil {
  45. log.Error("Can not query creatorCount.", err)
  46. return
  47. }
  48. cloudbrains, err := models.GetAllCloudBrain()
  49. if err != nil {
  50. log.Error("Getcloudbrains failed:%v", err)
  51. return
  52. }
  53. todayStatusResult := make(map[string]int)
  54. cloudBrainNum := make(map[int]int)
  55. cloudBrainOneDuration := int64(0)
  56. cloudBrainTwoDuration := int64(0)
  57. for _, cloudbrain := range cloudbrains {
  58. if int64(cloudbrain.Cloudbrain.CreatedUnix) >= beginTime.Unix() && int64(cloudbrain.Cloudbrain.CreatedUnix) < endTime.Unix() {
  59. if _, ok := todayStatusResult[cloudbrain.Status]; !ok {
  60. todayStatusResult[cloudbrain.Status] = 1
  61. } else {
  62. todayStatusResult[cloudbrain.Status] += 1
  63. }
  64. }
  65. if _, ok := cloudBrainNum[cloudbrain.Cloudbrain.Type]; !ok {
  66. cloudBrainNum[cloudbrain.Cloudbrain.Type] = 1
  67. } else {
  68. cloudBrainNum[cloudbrain.Cloudbrain.Type] += 1
  69. }
  70. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
  71. cloudBrainOneDuration = cloudBrainOneDuration + cloudbrain.Cloudbrain.Duration
  72. }
  73. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
  74. cloudBrainTwoDuration = cloudBrainTwoDuration + cloudbrain.Cloudbrain.Duration
  75. }
  76. }
  77. statusNameList := []string{"COMPLETED", "FAILED", "INIT", "RUNNING", "START_FAILED", "STOPPED", "SUCCEEDED", "WAITING", "KILLED"}
  78. for _, v := range statusNameList {
  79. if _, ok := todayStatusResult[v]; !ok {
  80. todayStatusResult[v] = 0
  81. }
  82. }
  83. todayRunningCount := todayStatusResult["RUNNING"]
  84. todayCompletedCount := todayStatusResult["COMPLETED"] + todayStatusResult["FAILED"] + todayStatusResult["START_FAILED"] + todayStatusResult["STOPPED"] + todayStatusResult["SUCCEEDED"] + todayStatusResult["KILLED"]
  85. todayWaitingCount := todayStatusResult["INIT"] + todayStatusResult["WAITING"]
  86. ctx.JSON(http.StatusOK, map[string]interface{}{
  87. // "todayStatusResult": todayStatusResult,
  88. "recordBeginTime": recordBeginTime,
  89. "updateTime": now,
  90. "cloudBrainNum": cloudBrainNum,
  91. "cloudBrainOneDuration": cloudBrainOneDuration,
  92. "cloudBrainTwoDuration": cloudBrainTwoDuration,
  93. "intelligentNetDuration": 0,
  94. "todayCreatorCount": todayCreatorCount,
  95. "creatorCount": creatorCount,
  96. "todayRunningCount": todayRunningCount,
  97. "todayCompletedCount": todayCompletedCount,
  98. "todayWaitingCount": todayWaitingCount,
  99. })
  100. }
  101. func GetAllCloudbrainsTrend(ctx *context.Context) {
  102. brainRecordBeginTime, err := getBrainRecordBeginTime()
  103. if err != nil {
  104. log.Error("Can not get brain record begin time", err)
  105. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.brain_record_begintime_get_err"))
  106. return
  107. }
  108. queryType := ctx.QueryTrim("type")
  109. now := time.Now()
  110. beginTimeStr := ctx.QueryTrim("beginTime")
  111. endTimeStr := ctx.QueryTrim("endTime")
  112. var beginTime time.Time
  113. var endTime time.Time
  114. var endTimeTemp time.Time
  115. dateCloudbrainNum := make([]DateCloudbrainNum, 0)
  116. if queryType != "" {
  117. if queryType == "all" {
  118. beginTime = brainRecordBeginTime
  119. endTime = now
  120. endTimeTemp = beginTime.AddDate(0, 1, 0)
  121. dateCloudbrainNum, err = getYearCloudbrainNum(beginTime, endTimeTemp, endTime)
  122. if err != nil {
  123. log.Error("Can not query getYearCloudbrainNum.", err)
  124. ctx.Error(http.StatusBadRequest, ctx.Tr("getYearCloudbrainNum_get_error"))
  125. return
  126. }
  127. } else if queryType == "yesterday" {
  128. beginTime = now.AddDate(0, 0, -1)
  129. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  130. endTimeTemp = beginTime.Add(time.Hour)
  131. endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  132. dateCloudbrainNum, err = getHourCloudbrainNum(beginTime, endTimeTemp, endTime)
  133. if err != nil {
  134. log.Error("Can not query getHourCloudbrainNum.", err)
  135. ctx.Error(http.StatusBadRequest, ctx.Tr("getYearCloudbrainNum_get_error"))
  136. return
  137. }
  138. } else if queryType == "last_7day" {
  139. beginTime = now.AddDate(0, 0, -7) //begin from monday
  140. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  141. endTime = now
  142. endTimeTemp = beginTime.AddDate(0, 0, 1)
  143. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTimeTemp, endTime)
  144. if err != nil {
  145. log.Error("Can not query getDayCloudbrainNum.", err)
  146. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  147. return
  148. }
  149. } else if queryType == "last_30day" {
  150. beginTime = now.AddDate(0, 0, -30) //begin from monday
  151. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  152. endTime = now
  153. endTimeTemp = beginTime.AddDate(0, 0, 1)
  154. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTimeTemp, endTime)
  155. if err != nil {
  156. log.Error("Can not query getDayCloudbrainNum.", err)
  157. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  158. return
  159. }
  160. } else if queryType == "current_month" {
  161. endTime = now
  162. beginTime = time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
  163. endTimeTemp = beginTime.AddDate(0, 0, 1)
  164. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTimeTemp, endTime)
  165. if err != nil {
  166. log.Error("Can not query getDayCloudbrainNum.", err)
  167. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  168. return
  169. }
  170. } else if queryType == "monthly" {
  171. endTime = now
  172. beginTime = now.AddDate(0, -1, 0)
  173. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  174. endTimeTemp = beginTime.AddDate(0, 0, 1)
  175. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTimeTemp, endTime)
  176. if err != nil {
  177. log.Error("Can not query getDayCloudbrainNum.", err)
  178. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  179. return
  180. }
  181. } else if queryType == "current_year" {
  182. endTime = now
  183. beginTime = time.Date(endTime.Year(), 1, 1, 0, 0, 0, 0, now.Location())
  184. endTimeTemp = beginTime.AddDate(0, 1, 0)
  185. dateCloudbrainNum, err = getYearCloudbrainNum(beginTime, endTimeTemp, endTime)
  186. if err != nil {
  187. log.Error("Can not query getDayCloudbrainNum.", err)
  188. ctx.Error(http.StatusBadRequest, ctx.Tr("getYearCloudbrainNum_get_error"))
  189. return
  190. }
  191. } else if queryType == "last_month" {
  192. lastMonthTime := now.AddDate(0, -1, 0)
  193. beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
  194. endTime = time.Date(now.Year(), now.Month(), 2, 0, 0, 0, 0, now.Location())
  195. endTimeTemp = beginTime.AddDate(0, 0, 1)
  196. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTimeTemp, endTime)
  197. if err != nil {
  198. log.Error("Can not query getDayCloudbrainNum.", err)
  199. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  200. return
  201. }
  202. }
  203. } else {
  204. if beginTimeStr == "" || endTimeStr == "" {
  205. //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
  206. beginTime = brainRecordBeginTime
  207. endTime = now
  208. endTimeTemp = beginTime.AddDate(0, 1, 0)
  209. dateCloudbrainNum, err = getYearCloudbrainNum(beginTime, endTimeTemp, endTime)
  210. if err != nil {
  211. log.Error("Can not query getDayCloudbrainNum.", err)
  212. ctx.Error(http.StatusBadRequest, ctx.Tr("getYearCloudbrainNum_get_error"))
  213. return
  214. }
  215. } else {
  216. beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
  217. if err != nil {
  218. log.Error("Can not ParseInLocation.", err)
  219. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  220. return
  221. }
  222. endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
  223. if err != nil {
  224. log.Error("Can not ParseInLocation.", err)
  225. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  226. return
  227. }
  228. days := (endTime.Unix() - beginTime.Unix()) / 3600 / 24
  229. if 1 < days {
  230. endTimeTemp = beginTime.AddDate(0, 0, 1)
  231. endTime = endTime.AddDate(0, 0, 2)
  232. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTimeTemp, endTime)
  233. if err != nil {
  234. log.Error("Can not query getDayCloudbrainNum.", err)
  235. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  236. return
  237. }
  238. } else if 0 < days || days <= 1 {
  239. endTimeTemp = beginTime.Add(time.Hour)
  240. dateCloudbrainNum, err = getHourCloudbrainNum(beginTime, endTimeTemp, endTime)
  241. if err != nil {
  242. log.Error("Can not query getHourCloudbrainNum.", err)
  243. ctx.Error(http.StatusBadRequest, ctx.Tr("getHourCloudbrainNum_get_error"))
  244. return
  245. }
  246. } else {
  247. return
  248. }
  249. }
  250. }
  251. cloudbrainsPeriodData := TimeCloudbrainsNum{
  252. TimeCloudbrainNum: dateCloudbrainNum,
  253. }
  254. ctx.JSON(http.StatusOK, cloudbrainsPeriodData)
  255. }
  256. func GetAllCloudbrainsTrendDetail(ctx *context.Context) {
  257. // brainRecordBeginTime, err := getBrainRecordBeginTime()
  258. // if err != nil {
  259. // log.Error("Can not get brain record begin time", err)
  260. // ctx.Error(http.StatusBadRequest, ctx.Tr("repo.brain_record_begintime_get_err"))
  261. // return
  262. // }
  263. // queryType := ctx.QueryTrim("type")
  264. now := time.Now()
  265. var beginTime time.Time
  266. var endTime time.Time
  267. var endTimeTemp time.Time
  268. // dateCloudbrainNum := make([]DateCloudbrainNum, 0)
  269. beginTime = now.AddDate(0, 0, -30) //
  270. // beginTime = brainRecordBeginTime
  271. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  272. endTime = now
  273. endTimeTemp = endTime.AddDate(0, 0, -1)
  274. dayCloudbrainInfo, err := getDayCloudbrainInfo(beginTime, endTimeTemp, endTime)
  275. if err != nil {
  276. log.Error("Can not query getDayCloudbrainInfo.", err)
  277. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  278. return
  279. }
  280. page := ctx.QueryInt("page")
  281. if page <= 0 {
  282. page = 1
  283. }
  284. pagesize := ctx.QueryInt("pagesize")
  285. if pagesize <= 0 {
  286. pagesize = 5
  287. }
  288. // pager := context.NewPagination(len(dateCloudbrainNum), pagesize, page, 5)
  289. pageDateCloudbrainNum := getPageDateCloudbrainNum(dayCloudbrainInfo, page, pagesize)
  290. //load attachment creator
  291. // for _, attachment := range pageAttachments {
  292. // uploader, _ := models.GetUserByID(attachment.UploaderID)
  293. // attachment.Uploader = uploader
  294. // }
  295. cloudbrainsPeriodData := TimeCloudbrainsNum{
  296. TotalCount: 30,
  297. TimeCloudbrainNum: pageDateCloudbrainNum,
  298. }
  299. ctx.JSON(http.StatusOK, cloudbrainsPeriodData)
  300. }
  301. func getPageDateCloudbrainNum(dateCloudbrainNums []DateCloudbrainNum, page int, pagesize int) []DateCloudbrainNum {
  302. begin := (page - 1) * pagesize
  303. end := (page) * pagesize
  304. if begin > len(dateCloudbrainNums)-1 {
  305. return nil
  306. }
  307. if end > len(dateCloudbrainNums)-1 {
  308. return dateCloudbrainNums[begin:]
  309. } else {
  310. return dateCloudbrainNums[begin:end]
  311. }
  312. }
  313. func GetAllCloudbrainsPeriodDistribution(ctx *context.Context) {
  314. recordBeginTime, err := getBrainRecordBeginTime()
  315. if err != nil {
  316. log.Error("Can not get record begin time", err)
  317. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  318. return
  319. }
  320. beginTime, endTime, err := getTimePeroid(ctx, recordBeginTime)
  321. if err != nil {
  322. log.Error("Parameter is wrong", err)
  323. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.parameter_is_wrong"))
  324. return
  325. }
  326. cloudbrains, err := models.GetAllCloudBrain()
  327. if err != nil {
  328. log.Error("Getcloudbrains failed:%v", err)
  329. return
  330. }
  331. cloudOneJobTypeRes := make(map[string]int)
  332. cloudTwoJobTypeRes := make(map[string]int)
  333. intelligentNetJobTypeRes := make(map[string]int)
  334. cloudBrainPeriodNum := make(map[int]int)
  335. cloudBrainComputeResource := make(map[string]int)
  336. for _, cloudbrain := range cloudbrains {
  337. if int64(cloudbrain.Cloudbrain.CreatedUnix) >= beginTime.Unix() && int64(cloudbrain.Cloudbrain.CreatedUnix) < endTime.Unix() {
  338. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
  339. if _, ok := cloudOneJobTypeRes[cloudbrain.JobType]; !ok {
  340. cloudOneJobTypeRes[cloudbrain.JobType] = 1
  341. } else {
  342. cloudOneJobTypeRes[cloudbrain.JobType] += 1
  343. }
  344. }
  345. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
  346. if _, ok := cloudTwoJobTypeRes[cloudbrain.JobType]; !ok {
  347. cloudTwoJobTypeRes[cloudbrain.JobType] = 1
  348. } else {
  349. cloudTwoJobTypeRes[cloudbrain.JobType] += 1
  350. }
  351. }
  352. if _, ok := cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type]; !ok {
  353. cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] = 1
  354. } else {
  355. cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] += 1
  356. }
  357. if _, ok := cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource]; !ok {
  358. cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] = 1
  359. } else {
  360. cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] += 1
  361. }
  362. }
  363. }
  364. jobTypeList := []string{"DEBUG", "BENCHMARK", "INFERENCE", "TRAIN", "SNN4IMAGENET", "BRAINSCORE"}
  365. for _, v := range jobTypeList {
  366. if _, ok := cloudOneJobTypeRes[v]; !ok {
  367. cloudOneJobTypeRes[v] = 0
  368. }
  369. if _, ok := cloudTwoJobTypeRes[v]; !ok {
  370. cloudTwoJobTypeRes[v] = 0
  371. }
  372. if _, ok := intelligentNetJobTypeRes[v]; !ok {
  373. intelligentNetJobTypeRes[v] = 0
  374. }
  375. }
  376. cloudBrainTypeList := []int{0, 1, 2}
  377. for _, v := range cloudBrainTypeList {
  378. if _, ok := cloudBrainPeriodNum[v]; !ok {
  379. cloudBrainPeriodNum[v] = 0
  380. }
  381. }
  382. ComputeResourceList := []string{"CPU/GPU", "NPU"}
  383. for _, v := range ComputeResourceList {
  384. if _, ok := cloudBrainComputeResource[v]; !ok {
  385. cloudBrainComputeResource[v] = 0
  386. }
  387. }
  388. cloudOneJobTypeRes["EVALUATION"] = cloudOneJobTypeRes["BENCHMARK"] + cloudOneJobTypeRes["SNN4IMAGENET"] + cloudOneJobTypeRes["BRAINSCORE"]
  389. cloudTwoJobTypeRes["EVALUATION"] = cloudTwoJobTypeRes["BENCHMARK"] + cloudTwoJobTypeRes["SNN4IMAGENET"] + cloudTwoJobTypeRes["BRAINSCORE"]
  390. intelligentNetJobTypeRes["EVALUATION"] = intelligentNetJobTypeRes["BENCHMARK"] + intelligentNetJobTypeRes["SNN4IMAGENET"] + intelligentNetJobTypeRes["BRAINSCORE"]
  391. ctx.JSON(http.StatusOK, map[string]interface{}{
  392. "cloudOneJobTypeRes": cloudOneJobTypeRes,
  393. "cloudTwoJobTypeRes": cloudTwoJobTypeRes,
  394. "intelligentNetJobTypeRes": intelligentNetJobTypeRes,
  395. "cloudBrainPeriodNum": cloudBrainPeriodNum,
  396. "cloudBrainComputeResource": cloudBrainComputeResource,
  397. })
  398. }
  399. func GetCloudbrainsStatusAnalysis(ctx *context.Context) {
  400. cloudbrains, err := models.GetAllCloudBrain()
  401. if err != nil {
  402. log.Error("Getcloudbrains failed:%v", err)
  403. return
  404. }
  405. cloudBrainStatusResult := make(map[string]int)
  406. for _, cloudbrain := range cloudbrains {
  407. if _, ok := cloudBrainStatusResult[cloudbrain.Status]; !ok {
  408. cloudBrainStatusResult[cloudbrain.Status] = 1
  409. } else {
  410. cloudBrainStatusResult[cloudbrain.Status] += 1
  411. }
  412. }
  413. ctx.JSON(http.StatusOK, map[string]interface{}{
  414. "cloudBrainStatusResult": cloudBrainStatusResult,
  415. })
  416. }
  417. func GetCloudbrainsDetailData(ctx *context.Context) {
  418. listType := ctx.Query("listType")
  419. jobType := ctx.Query("jobType")
  420. jobStatus := ctx.Query("jobStatus")
  421. page := ctx.QueryInt("page")
  422. if page <= 0 {
  423. page = 1
  424. }
  425. debugType := models.TypeCloudBrainAll
  426. if listType == models.GPUResource {
  427. debugType = models.TypeCloudBrainOne
  428. } else if listType == models.NPUResource {
  429. debugType = models.TypeCloudBrainTwo
  430. }
  431. var jobTypes []string
  432. jobTypeNot := false
  433. if jobType == string(models.JobTypeDebug) {
  434. jobTypes = append(jobTypes, string(models.JobTypeSnn4imagenet), string(models.JobTypeBrainScore), string(models.JobTypeDebug))
  435. } else if jobType != "all" && jobType != "" {
  436. jobTypes = append(jobTypes, jobType)
  437. }
  438. var jobStatuses []string
  439. jobStatusNot := false
  440. if jobStatus == "other" {
  441. jobStatusNot = true
  442. jobStatuses = append(jobStatuses, string(models.ModelArtsTrainJobWaiting), string(models.ModelArtsTrainJobFailed), string(models.ModelArtsRunning), string(models.ModelArtsTrainJobCompleted),
  443. string(models.ModelArtsStarting), string(models.ModelArtsRestarting), string(models.ModelArtsStartFailed),
  444. string(models.ModelArtsStopping), string(models.ModelArtsStopped), string(models.JobSucceeded))
  445. } else if jobStatus != "all" && jobStatus != "" {
  446. jobStatuses = append(jobStatuses, jobStatus)
  447. }
  448. keyword := strings.Trim(ctx.Query("q"), " ")
  449. ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{
  450. ListOptions: models.ListOptions{
  451. Page: page,
  452. PageSize: setting.UI.IssuePagingNum,
  453. },
  454. Keyword: keyword,
  455. Type: debugType,
  456. JobTypeNot: jobTypeNot,
  457. JobStatusNot: jobStatusNot,
  458. JobStatus: jobStatuses,
  459. JobTypes: jobTypes,
  460. NeedRepoInfo: true,
  461. IsLatestVersion: modelarts.IsLatestVersion,
  462. })
  463. if err != nil {
  464. ctx.ServerError("Get job failed:", err)
  465. return
  466. }
  467. // res := &models.AllTask{}
  468. tasks := []models.TaskDetail{}
  469. for i, task := range ciTasks {
  470. ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
  471. var taskDetail models.TaskDetail
  472. taskDetail.ID = ciTasks[i].Cloudbrain.ID
  473. taskDetail.JobName = ciTasks[i].JobName
  474. taskDetail.DisplayJobName = ciTasks[i].DisplayJobName
  475. taskDetail.Status = ciTasks[i].Status
  476. taskDetail.JobType = ciTasks[i].JobType
  477. taskDetail.CreatedUnix = ciTasks[i].Cloudbrain.CreatedUnix
  478. taskDetail.RunTime = ciTasks[i].EndTime - ciTasks[i].StartTime
  479. taskDetail.StartTime = ciTasks[i].StartTime
  480. taskDetail.EndTime = ciTasks[i].EndTime
  481. taskDetail.ComputeResource = ciTasks[i].ComputeResource
  482. taskDetail.Type = ciTasks[i].Cloudbrain.Type
  483. taskDetail.UserName = ciTasks[i].User.Name
  484. taskDetail.RepoID = ciTasks[i].RepoID
  485. if ciTasks[i].Repo != nil {
  486. taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name
  487. }
  488. taskDetail.WaitTime = ciTasks[i].StartTime - ciTasks[i].Cloudbrain.CreatedUnix
  489. if taskDetail.WaitTime < 0 {
  490. taskDetail.WaitTime = 0
  491. }
  492. tasks = append(tasks, taskDetail)
  493. }
  494. pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum))
  495. pager.SetDefaultParams(ctx)
  496. pager.AddParam(ctx, "listType", "ListType")
  497. ctx.JSON(http.StatusOK, map[string]interface{}{
  498. "Title": ctx.Tr("kanban.cloudBrains"),
  499. "Tasks": tasks,
  500. "Keyword": keyword,
  501. "pager": pager,
  502. "count": count,
  503. })
  504. }
  505. func GetCloudbrainsCreateHoursData(ctx *context.Context) {
  506. createHourPeriodCount := make(map[string]interface{})
  507. recordBeginTime, err := getBrainRecordBeginTime()
  508. if err != nil {
  509. log.Error("Can not get brain record begin time", err)
  510. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.brain_record_begintime_get_err"))
  511. return
  512. }
  513. now := time.Now()
  514. queryType := ctx.QueryTrim("type")
  515. beginTimeStr := ctx.QueryTrim("beginTime")
  516. endTimeStr := ctx.QueryTrim("endTime")
  517. var beginTime time.Time
  518. var endTime time.Time
  519. if queryType != "" {
  520. if queryType == "all" {
  521. beginTime = recordBeginTime
  522. endTime = now
  523. } else if queryType == "today" {
  524. beginTime = now.AddDate(0, 0, 0)
  525. endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  526. } else if queryType == "yesterday" {
  527. beginTime = now.AddDate(0, 0, -1)
  528. endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  529. } else if queryType == "current_week" {
  530. beginTime = now.AddDate(0, 0, -int(time.Now().Weekday())+1) //begin from monday
  531. endTime = now
  532. } else if queryType == "current_month" {
  533. endTime = now
  534. beginTime = time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
  535. } else if queryType == "monthly" {
  536. endTime = now
  537. beginTime = now.AddDate(0, -1, 0)
  538. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  539. } else if queryType == "current_year" {
  540. endTime = now
  541. beginTime = time.Date(endTime.Year(), 1, 1, 0, 0, 0, 0, now.Location())
  542. } else if queryType == "last_month" {
  543. lastMonthTime := now.AddDate(0, -1, 0)
  544. beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
  545. endTime = time.Date(now.Year(), now.Month(), 2, 0, 0, 0, 0, now.Location())
  546. } else if queryType == "last_7day" {
  547. lastMonthTime := now.AddDate(0, 0, -7)
  548. beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
  549. endTime = time.Date(now.Year(), now.Month(), 2, 0, 0, 0, 0, now.Location())
  550. } else if queryType == "last_30day" {
  551. lastMonthTime := now.AddDate(0, 0, -30)
  552. beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
  553. endTime = time.Date(now.Year(), now.Month(), 2, 0, 0, 0, 0, now.Location())
  554. }
  555. } else {
  556. if beginTimeStr == "" || endTimeStr == "" {
  557. //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
  558. beginTime = recordBeginTime
  559. endTime = now
  560. } else {
  561. beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
  562. if err != nil {
  563. log.Error("Can not ParseInLocation.", err)
  564. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  565. return
  566. }
  567. endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
  568. if err != nil {
  569. log.Error("Can not ParseInLocation.", err)
  570. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  571. return
  572. }
  573. }
  574. }
  575. dateBeginTime := beginTime.Format("2006-01-02")
  576. dateEndTime := endTime.Format("2006-01-02")
  577. createHourPeriodCount, err = models.GetCreateHourPeriodCount(dateBeginTime, dateEndTime)
  578. if err != nil {
  579. log.Error("Can not query hourPeriodCount.", err)
  580. ctx.Error(http.StatusBadRequest, ctx.Tr("hourPeriodCount_get_error"))
  581. return
  582. }
  583. runHourPeriodCount, err := models.GetRunHourPeriodCount(dateBeginTime, dateEndTime)
  584. if err != nil {
  585. log.Error("Can not query runHourPeriodCount.", err)
  586. ctx.Error(http.StatusBadRequest, ctx.Tr("runHourPeriodCount_get_error"))
  587. return
  588. }
  589. ctx.JSON(http.StatusOK, map[string]interface{}{
  590. "recordBeginTime": recordBeginTime,
  591. "updateTime": now,
  592. "createHourPeriodCount": createHourPeriodCount,
  593. "runHourPeriodCount": runHourPeriodCount,
  594. })
  595. }
  596. func GetWaitTimeTop(ctx *context.Context) {
  597. cloudbrains, err := models.GetAllCloudBrain()
  598. if err != nil {
  599. log.Error("Getcloudbrains failed:%v", err)
  600. return
  601. }
  602. cloudBrainStatusResult := make(map[string]int)
  603. for _, cloudbrain := range cloudbrains {
  604. if _, ok := cloudBrainStatusResult[cloudbrain.Status]; !ok {
  605. cloudBrainStatusResult[cloudbrain.Status] = 1
  606. } else {
  607. cloudBrainStatusResult[cloudbrain.Status] += 1
  608. }
  609. }
  610. ctx.JSON(http.StatusOK, map[string]interface{}{
  611. "cloudBrainStatusResult": cloudBrainStatusResult,
  612. })
  613. }
  614. func getCloudbrainCount(beginTime time.Time, endTime time.Time) (map[string]int, map[string]int, map[string]int, map[int]int, map[string]int, error) {
  615. cloudbrains, err := models.GetAllCloudBrain()
  616. if err != nil {
  617. log.Error("Getcloudbrains failed:%v", err)
  618. return nil, nil, nil, nil, nil, err
  619. }
  620. cloudOneJobTypeRes := make(map[string]int)
  621. cloudTwoJobTypeRes := make(map[string]int)
  622. intelligentNetJobTypeRes := make(map[string]int)
  623. cloudBrainPeriodNum := make(map[int]int)
  624. cloudBrainComputeResource := make(map[string]int)
  625. for _, cloudbrain := range cloudbrains {
  626. if int64(cloudbrain.Cloudbrain.CreatedUnix) >= beginTime.Unix() && int64(cloudbrain.Cloudbrain.CreatedUnix) < endTime.Unix() {
  627. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
  628. if _, ok := cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType]; !ok {
  629. cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType] = 1
  630. } else {
  631. cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType] += 1
  632. }
  633. }
  634. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
  635. if _, ok := cloudTwoJobTypeRes[cloudbrain.JobType]; !ok {
  636. cloudTwoJobTypeRes[cloudbrain.Cloudbrain.JobType] = 1
  637. } else {
  638. cloudTwoJobTypeRes[cloudbrain.Cloudbrain.JobType] += 1
  639. }
  640. }
  641. if _, ok := cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type]; !ok {
  642. cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] = 1
  643. } else {
  644. cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] += 1
  645. }
  646. if _, ok := cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource]; !ok {
  647. cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] = 1
  648. } else {
  649. cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] += 1
  650. }
  651. }
  652. }
  653. ComputeResourceList := []string{"CPU/GPU", "NPU"}
  654. for _, v := range ComputeResourceList {
  655. if _, ok := cloudBrainComputeResource[v]; !ok {
  656. cloudBrainComputeResource[v] = 0
  657. }
  658. }
  659. jobTypeList := []string{"DEBUG", "BENCHMARK", "INFERENCE", "TRAIN", "SNN4IMAGENET", "BRAINSCORE"}
  660. cloudBrainTypeList := []int{0, 1, 2}
  661. for _, v := range jobTypeList {
  662. if _, ok := cloudOneJobTypeRes[v]; !ok {
  663. cloudOneJobTypeRes[v] = 0
  664. }
  665. if _, ok := cloudTwoJobTypeRes[v]; !ok {
  666. cloudTwoJobTypeRes[v] = 0
  667. }
  668. if _, ok := intelligentNetJobTypeRes[v]; !ok {
  669. intelligentNetJobTypeRes[v] = 0
  670. }
  671. }
  672. for _, v := range cloudBrainTypeList {
  673. if _, ok := cloudBrainPeriodNum[v]; !ok {
  674. cloudBrainPeriodNum[v] = 0
  675. }
  676. }
  677. cloudBrainPeriodNum[-1] = cloudBrainPeriodNum[0] + cloudBrainPeriodNum[1] + cloudBrainPeriodNum[2]
  678. return cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource, err
  679. }
  680. func getHourCloudbrainNum(beginTime time.Time, endTimeTemp time.Time, endTime time.Time) ([]DateCloudbrainNum, error) {
  681. dayCloudbrainNum := make([]DateCloudbrainNum, 0)
  682. for endTimeTemp.Before(endTime) || endTimeTemp.Equal(endTime) {
  683. cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource, err := getCloudbrainCount(beginTime, endTimeTemp)
  684. if err != nil {
  685. log.Error("Can not query getCloudbrainCount.", err)
  686. return nil, err
  687. }
  688. dayCloudbrainNum = append(dayCloudbrainNum, DateCloudbrainNum{
  689. Date: beginTime.Format(time.RFC3339),
  690. CloudOneJobTypeRes: cloudOneJobTypeRes,
  691. CloudTwoJobTypeRes: cloudTwoJobTypeRes,
  692. IntelligentNetJobTypeRes: intelligentNetJobTypeRes,
  693. CloudBrainPeriodNum: cloudBrainPeriodNum,
  694. CloudBrainComputeResource: cloudBrainComputeResource,
  695. })
  696. beginTime = endTimeTemp
  697. endTimeTemp = beginTime.Add(time.Hour)
  698. }
  699. return dayCloudbrainNum, nil
  700. }
  701. func getDayCloudbrainNum(beginTime time.Time, endTimeTemp time.Time, endTime time.Time) ([]DateCloudbrainNum, error) {
  702. dayCloudbrainNum := make([]DateCloudbrainNum, 0)
  703. for endTimeTemp.Before(endTime) {
  704. cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource, err := getCloudbrainCount(beginTime, endTimeTemp)
  705. if err != nil {
  706. log.Error("Can not query getCloudbrainCount.", err)
  707. return nil, err
  708. }
  709. dayCloudbrainNum = append(dayCloudbrainNum, DateCloudbrainNum{
  710. Date: beginTime.Format("2006/01/02"),
  711. CloudOneJobTypeRes: cloudOneJobTypeRes,
  712. CloudTwoJobTypeRes: cloudTwoJobTypeRes,
  713. IntelligentNetJobTypeRes: intelligentNetJobTypeRes,
  714. CloudBrainPeriodNum: cloudBrainPeriodNum,
  715. CloudBrainComputeResource: cloudBrainComputeResource,
  716. })
  717. beginTime = endTimeTemp
  718. endTimeTemp = beginTime.AddDate(0, 0, 1)
  719. }
  720. return dayCloudbrainNum, nil
  721. }
  722. func getYearCloudbrainNum(beginTime time.Time, endTimeTemp time.Time, endTime time.Time) ([]DateCloudbrainNum, error) {
  723. yearCloudbrainNum := make([]DateCloudbrainNum, 0)
  724. for endTimeTemp.Before(endTime) {
  725. cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource, err := getCloudbrainCount(beginTime, endTimeTemp)
  726. if err != nil {
  727. log.Error("Can not query getCloudbrainCount.", err)
  728. return nil, err
  729. }
  730. yearCloudbrainNum = append(yearCloudbrainNum, DateCloudbrainNum{
  731. Date: beginTime.Format("2006/01"),
  732. CloudOneJobTypeRes: cloudOneJobTypeRes,
  733. CloudTwoJobTypeRes: cloudTwoJobTypeRes,
  734. IntelligentNetJobTypeRes: intelligentNetJobTypeRes,
  735. CloudBrainPeriodNum: cloudBrainPeriodNum,
  736. CloudBrainComputeResource: cloudBrainComputeResource,
  737. })
  738. beginTime = endTimeTemp
  739. endTimeTemp = beginTime.AddDate(0, 1, 0)
  740. }
  741. return yearCloudbrainNum, nil
  742. }
  743. func getDayCloudbrainInfo(beginTime time.Time, endTimeTemp time.Time, endTime time.Time) ([]DateCloudbrainNum, error) {
  744. dayCloudbrainNum := make([]DateCloudbrainNum, 0)
  745. for beginTime.Before(endTimeTemp) {
  746. cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource, err := getCloudbrainCount(endTimeTemp, endTime)
  747. if err != nil {
  748. log.Error("Can not query getCloudbrainCount.", err)
  749. return nil, err
  750. }
  751. dayCloudbrainNum = append(dayCloudbrainNum, DateCloudbrainNum{
  752. Date: endTime.Format("2006/01/02"),
  753. CloudOneJobTypeRes: cloudOneJobTypeRes,
  754. CloudTwoJobTypeRes: cloudTwoJobTypeRes,
  755. IntelligentNetJobTypeRes: intelligentNetJobTypeRes,
  756. CloudBrainPeriodNum: cloudBrainPeriodNum,
  757. CloudBrainComputeResource: cloudBrainComputeResource,
  758. })
  759. if beginTime.Before(endTimeTemp) {
  760. endTime = endTimeTemp
  761. endTimeTemp = endTimeTemp.AddDate(0, 0, -1)
  762. }
  763. }
  764. return dayCloudbrainNum, nil
  765. }
  766. func getBrainRecordBeginTime() (time.Time, error) {
  767. return time.ParseInLocation(DATE_FORMAT, setting.BrainRecordBeginTime, time.Local)
  768. }
  769. func DownloadCloudBrainBoard(ctx *context.Context) {
  770. page := 1
  771. pageSize := 300
  772. var cloudBrain = ctx.Tr("repo.cloudbrain")
  773. fileName := getCloudbrainFileName(cloudBrain)
  774. _, total, err := models.CloudbrainAll(&models.CloudbrainsOptions{
  775. ListOptions: models.ListOptions{
  776. Page: page,
  777. PageSize: pageSize,
  778. },
  779. Type: models.TypeCloudBrainAll,
  780. NeedRepoInfo: false,
  781. })
  782. if err != nil {
  783. log.Warn("Can not get cloud brain info", err)
  784. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.cloudbrain_query_fail"))
  785. return
  786. }
  787. totalPage := getTotalPage(total, pageSize)
  788. f := excelize.NewFile()
  789. index := f.NewSheet(cloudBrain)
  790. f.DeleteSheet("Sheet1")
  791. for k, v := range allCloudbrainHeader(ctx) {
  792. f.SetCellValue(cloudBrain, k, v)
  793. }
  794. var row = 2
  795. for i := 0; i < totalPage; i++ {
  796. pageRecords, _, err := models.CloudbrainAll(&models.CloudbrainsOptions{
  797. ListOptions: models.ListOptions{
  798. Page: page,
  799. PageSize: pageSize,
  800. },
  801. Type: models.TypeCloudBrainAll,
  802. NeedRepoInfo: true,
  803. })
  804. if err != nil {
  805. log.Warn("Can not get cloud brain info", err)
  806. continue
  807. }
  808. for _, record := range pageRecords {
  809. for k, v := range allCloudbrainValues(row, record, ctx) {
  810. f.SetCellValue(cloudBrain, k, v)
  811. }
  812. row++
  813. }
  814. page++
  815. }
  816. f.SetActiveSheet(index)
  817. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName))
  818. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  819. f.WriteTo(ctx.Resp)
  820. }
  821. func getCloudbrainFileName(baseName string) string {
  822. return baseName + "_" + time.Now().Format(EXCEL_DATE_FORMAT) + ".xlsx"
  823. }
  824. func allCloudbrainHeader(ctx *context.Context) map[string]string {
  825. return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.cloudbrain_task_type"), "C1": ctx.Tr("repo.modelarts.status"),
  826. "D1": ctx.Tr("repo.modelarts.createtime"), "E1": ctx.Tr("repo.modelarts.train_job.wait_time"), "F1": ctx.Tr("repo.modelarts.train_job.dura_time"),
  827. "G1": ctx.Tr("repo.modelarts.train_job.start_time"),
  828. "H1": ctx.Tr("repo.modelarts.train_job.end_time"), "I1": ctx.Tr("repo.modelarts.computing_resources"),
  829. "J1": ctx.Tr("repo.cloudbrain_creator"), "K1": ctx.Tr("repo.repo_name"), "L1": ctx.Tr("repo.cloudbrain_task_name")}
  830. }
  831. func allCloudbrainValues(row int, rs *models.CloudbrainInfo, ctx *context.Context) map[string]string {
  832. return map[string]string{getCellName("A", row): rs.DisplayJobName, getCellName("B", row): rs.JobType, getCellName("C", row): rs.Status,
  833. getCellName("D", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT), getCellName("E", row): getBrainWaitTime(rs),
  834. getCellName("F", row): rs.TrainJobDuration, getCellName("G", row): getBrainStartTime(rs),
  835. getCellName("H", row): getBrainEndTime(rs),
  836. getCellName("I", row): rs.ComputeResource, getCellName("J", row): rs.Name, getCellName("K", row): getBrainRepo(rs),
  837. getCellName("L", row): rs.JobName,
  838. }
  839. }
  840. func getBrainRepo(rs *models.CloudbrainInfo) string {
  841. if rs.Repo != nil {
  842. return rs.Repo.OwnerName + "/" + rs.Repo.Alias
  843. }
  844. return ""
  845. }
  846. func getBrainStartTime(rs *models.CloudbrainInfo) string {
  847. timeString := time.Unix(int64(rs.Cloudbrain.StartTime), 0).Format(CREATE_TIME_FORMAT)
  848. if timeString != "1970/01/01 08:00:00" {
  849. return timeString
  850. } else {
  851. return "0"
  852. }
  853. }
  854. func getBrainEndTime(rs *models.CloudbrainInfo) string {
  855. timeString := time.Unix(int64(rs.Cloudbrain.EndTime), 0).Format(CREATE_TIME_FORMAT)
  856. if timeString != "1970/01/01 08:00:00" {
  857. return timeString
  858. } else {
  859. return "0"
  860. }
  861. }
  862. func getBrainWaitTime(rs *models.CloudbrainInfo) string {
  863. waitTime := rs.Cloudbrain.StartTime - rs.Cloudbrain.CreatedUnix
  864. if waitTime <= 0 {
  865. return "0"
  866. } else {
  867. return models.ConvertDurationToStr(int64(waitTime))
  868. }
  869. }