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