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 52 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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399
  1. package repo
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/url"
  6. "strings"
  7. "time"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/log"
  11. "github.com/360EntSecGroup-Skylar/excelize/v2"
  12. )
  13. type DateCloudbrainNum struct {
  14. Date string `json:"date"`
  15. CloudOneJobTypeRes map[string]int `json:"cloudOneJobTypeRes"`
  16. CloudTwoJobTypeRes map[string]int `json:"cloudTwoJobTypeRes"`
  17. IntelligentNetJobTypeRes map[string]int `json:"intelligentNetJobTypeRes"`
  18. CloudBrainPeriodNum map[int]int `json:"cloudBrainPeriodNum"`
  19. CloudBrainComputeResource map[string]int `json:"cloudBrainComputeResource"`
  20. }
  21. type DateCloudbrainInfo struct {
  22. Date string `json:"date"`
  23. CloudBrainPeriodNum map[int]int `json:"cloudBrainPeriodNum"`
  24. CloudBrainComputeResource map[string]int `json:"cloudBrainComputeResource"`
  25. }
  26. type CloudbrainsStatusAnalysis struct {
  27. JobWaitingCount int64 `json:"jobWaitingCount"`
  28. JobRunningCount int64 `json:"jobRunningCount"`
  29. JobStoppedCount int64 `json:"jobStoppedCount"`
  30. JobCompletedCount int64 `json:"jobCompletedCount"`
  31. JobFailedCount int64 `json:"jobFailedCount"`
  32. JobKilledCount int64 `json:"jobKilledCount"`
  33. JobInitCount int64 `json:"jobInitCount"`
  34. }
  35. func GetAllCloudbrainsOverview(ctx *context.Context) {
  36. recordCloudbrain, err := models.GetRecordBeginTime()
  37. if err != nil {
  38. log.Error("Can not get recordCloudbrain", err)
  39. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  40. return
  41. }
  42. recordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix
  43. now := time.Now()
  44. beginTime := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  45. endTime := now
  46. todayCreatorCount, err := models.GetTodayCreatorCount(beginTime, endTime)
  47. if err != nil {
  48. log.Error("Can not query todayCreatorCount.", err)
  49. return
  50. }
  51. creatorCount, err := models.GetCreatorCount()
  52. if err != nil {
  53. log.Error("Can not query creatorCount.", err)
  54. return
  55. }
  56. todayStatusResult := make(map[string]int)
  57. cloudBrainNum := make(map[int]int)
  58. cloudBrainOneDuration := int64(0)
  59. cloudBrainTwoDuration := int64(0)
  60. intelligentNetDuration := int64(0)
  61. todayNewJobCount := 0
  62. page := 1
  63. pagesize := 1000
  64. count := pagesize
  65. for count == pagesize && count != 0 {
  66. cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
  67. ListOptions: models.ListOptions{
  68. Page: page,
  69. PageSize: pagesize,
  70. },
  71. Type: models.TypeCloudBrainAll,
  72. BeginTimeUnix: int64(recordBeginTime),
  73. EndTimeUnix: endTime.Unix(),
  74. })
  75. if err != nil {
  76. ctx.ServerError("Get cloudbrains failed:", err)
  77. return
  78. }
  79. for _, cloudbrain := range cloudbrains {
  80. if int64(cloudbrain.Cloudbrain.CreatedUnix) >= beginTime.Unix() && int64(cloudbrain.Cloudbrain.CreatedUnix) < endTime.Unix() {
  81. todayNewJobCount += 1
  82. if _, ok := todayStatusResult[cloudbrain.Status]; !ok {
  83. todayStatusResult[cloudbrain.Status] = 1
  84. } else {
  85. todayStatusResult[cloudbrain.Status] += 1
  86. }
  87. }
  88. if _, ok := cloudBrainNum[cloudbrain.Cloudbrain.Type]; !ok {
  89. cloudBrainNum[cloudbrain.Cloudbrain.Type] = 1
  90. } else {
  91. cloudBrainNum[cloudbrain.Cloudbrain.Type] += 1
  92. }
  93. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
  94. cloudBrainOneDuration = cloudBrainOneDuration + cloudbrain.Cloudbrain.Duration
  95. }
  96. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
  97. cloudBrainTwoDuration = cloudBrainTwoDuration + cloudbrain.Cloudbrain.Duration
  98. }
  99. if cloudbrain.Cloudbrain.Type == models.TypeC2Net {
  100. intelligentNetDuration = intelligentNetDuration + cloudbrain.Cloudbrain.Duration
  101. }
  102. }
  103. count = len(cloudbrains)
  104. page += 1
  105. }
  106. statusNameList := []string{string(models.ModelArtsTrainJobCompleted), string(models.JobFailed), string(models.ModelArtsTrainJobInit),
  107. string(models.JobRunning), string(models.ModelArtsStartFailed), string(models.JobStopped), string(models.JobSucceeded),
  108. string(models.JobWaiting), string(models.ModelArtsTrainJobKilled)}
  109. for _, v := range statusNameList {
  110. if _, ok := todayStatusResult[v]; !ok {
  111. todayStatusResult[v] = 0
  112. }
  113. }
  114. cloudBrainTypeList := []int{0, 1, 2}
  115. for _, v := range cloudBrainTypeList {
  116. if _, ok := cloudBrainNum[v]; !ok {
  117. cloudBrainNum[v] = 0
  118. }
  119. }
  120. todayRunningCount := todayStatusResult[string(models.JobRunning)]
  121. todayCompletedCount := todayStatusResult[string(models.ModelArtsTrainJobCompleted)] + todayStatusResult[string(models.JobFailed)] +
  122. todayStatusResult[string(models.ModelArtsStartFailed)] + todayStatusResult[string(models.JobStopped)] + todayStatusResult[string(models.JobSucceeded)] + todayStatusResult[string(models.ModelArtsTrainJobKilled)]
  123. todayWaitingCount := todayStatusResult[string(models.ModelArtsTrainJobInit)] + todayStatusResult[string(models.JobWaiting)]
  124. ctx.JSON(http.StatusOK, map[string]interface{}{
  125. "recordBeginTime": recordBeginTime,
  126. "updateTime": now.Unix(),
  127. "cloudBrainNum": cloudBrainNum,
  128. "cloudBrainOneDuration": cloudBrainOneDuration,
  129. "cloudBrainTwoDuration": cloudBrainTwoDuration,
  130. "intelligentNetDuration": intelligentNetDuration,
  131. "todayCreatorCount": todayCreatorCount,
  132. "creatorCount": creatorCount,
  133. "todayRunningCount": todayRunningCount,
  134. "todayCompletedCount": todayCompletedCount,
  135. "todayWaitingCount": todayWaitingCount,
  136. "todayNewJobCount": todayNewJobCount,
  137. })
  138. }
  139. func GetAllCloudbrainsTrend(ctx *context.Context) {
  140. queryType := ctx.QueryTrim("type")
  141. now := time.Now()
  142. beginTimeStr := ctx.QueryTrim("beginTime")
  143. endTimeStr := ctx.QueryTrim("endTime")
  144. var beginTime time.Time
  145. var endTime time.Time
  146. dateCloudbrainNum := make([]DateCloudbrainNum, 0)
  147. var err error
  148. if queryType != "" {
  149. if queryType == "all" {
  150. recordCloudbrain, err := models.GetRecordBeginTime()
  151. if err != nil {
  152. log.Error("Can not get recordCloudbrain", err)
  153. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  154. return
  155. }
  156. brainRecordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix.AsTime()
  157. beginTime = brainRecordBeginTime
  158. endTime = now
  159. dateCloudbrainNum, err = getMonthCloudbrainNum(beginTime, endTime)
  160. if err != nil {
  161. log.Error("Can not query getMonthCloudbrainNum.", err)
  162. ctx.Error(http.StatusBadRequest, ctx.Tr("getMonthCloudbrainNum_get_error"))
  163. return
  164. }
  165. } else if queryType == "today" {
  166. beginTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  167. // endTimeTemp = now
  168. endTime = beginTime.AddDate(0, 0, 1)
  169. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
  170. if err != nil {
  171. log.Error("Can not query getDayCloudbrainNum.", err)
  172. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  173. return
  174. }
  175. } else if queryType == "yesterday" {
  176. beginTime = now.AddDate(0, 0, -1)
  177. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  178. endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  179. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
  180. if err != nil {
  181. log.Error("Can not query getDayCloudbrainNum.", err)
  182. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  183. return
  184. }
  185. } else if queryType == "last_7day" {
  186. beginTime = now.AddDate(0, 0, -6)
  187. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  188. endTime = now
  189. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
  190. if err != nil {
  191. log.Error("Can not query getDayCloudbrainNum.", err)
  192. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  193. return
  194. }
  195. } else if queryType == "last_30day" {
  196. beginTime = now.AddDate(0, 0, -29)
  197. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  198. endTime = now
  199. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
  200. if err != nil {
  201. log.Error("Can not query getDayCloudbrainNum.", err)
  202. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  203. return
  204. }
  205. } else if queryType == "current_month" {
  206. endTime = now
  207. beginTime = time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
  208. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
  209. if err != nil {
  210. log.Error("Can not query getDayCloudbrainNum.", err)
  211. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  212. return
  213. }
  214. } else if queryType == "current_year" {
  215. endTime = now
  216. beginTime = time.Date(endTime.Year(), 1, 1, 0, 0, 0, 0, now.Location())
  217. // endTimeTemp = beginTime.AddDate(0, 1, 0)
  218. dateCloudbrainNum, err = getMonthCloudbrainNum(beginTime, endTime)
  219. if err != nil {
  220. log.Error("Can not query getMonthCloudbrainNum.", err)
  221. ctx.Error(http.StatusBadRequest, ctx.Tr("getMonthCloudbrainNum_get_error"))
  222. return
  223. }
  224. } else if queryType == "last_month" {
  225. lastMonthTime := now.AddDate(0, -1, 0)
  226. beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
  227. endTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
  228. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
  229. if err != nil {
  230. log.Error("Can not query getDayCloudbrainNum.", err)
  231. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  232. return
  233. }
  234. }
  235. } else {
  236. if beginTimeStr == "" || endTimeStr == "" {
  237. //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
  238. recordCloudbrain, err := models.GetRecordBeginTime()
  239. if err != nil {
  240. log.Error("Can not get recordCloudbrain", err)
  241. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  242. return
  243. }
  244. brainRecordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix.AsTime()
  245. beginTime = brainRecordBeginTime
  246. endTime = now
  247. dateCloudbrainNum, err = getMonthCloudbrainNum(beginTime, endTime)
  248. if err != nil {
  249. log.Error("Can not query getMonthCloudbrainNum.", err)
  250. ctx.Error(http.StatusBadRequest, ctx.Tr("getMonthCloudbrainNum_get_error"))
  251. return
  252. }
  253. } else {
  254. beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
  255. if err != nil {
  256. log.Error("Can not ParseInLocation.", err)
  257. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  258. return
  259. }
  260. endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
  261. if err != nil {
  262. log.Error("Can not ParseInLocation.", err)
  263. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  264. return
  265. }
  266. if endTime.After(time.Now()) {
  267. endTime = time.Now()
  268. }
  269. dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
  270. if err != nil {
  271. log.Error("Can not query getDayCloudbrainNum.", err)
  272. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
  273. return
  274. }
  275. }
  276. }
  277. ctx.JSON(http.StatusOK, map[string]interface{}{
  278. "timeCloudbrainNum": dateCloudbrainNum,
  279. })
  280. }
  281. func GetAllCloudbrainsTrendDetail(ctx *context.Context) {
  282. queryType := ctx.QueryTrim("type")
  283. now := time.Now()
  284. beginTimeStr := ctx.QueryTrim("beginTime")
  285. endTimeStr := ctx.QueryTrim("endTime")
  286. var beginTime time.Time
  287. var endTime time.Time
  288. var endTimeTemp time.Time
  289. dayCloudbrainInfo := make([]DateCloudbrainInfo, 0)
  290. var err error
  291. var count int
  292. if queryType != "" {
  293. if queryType == "all" {
  294. recordCloudbrain, err := models.GetRecordBeginTime()
  295. if err != nil {
  296. log.Error("Can not get recordCloudbrain", err)
  297. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  298. return
  299. }
  300. brainRecordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix.AsTime()
  301. beginTime = brainRecordBeginTime
  302. endTime = now
  303. dayCloudbrainInfo, count, err = getMonthCloudbrainInfo(beginTime, endTime)
  304. if err != nil {
  305. log.Error("Can not query getDayCloudbrainInfo.", err)
  306. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  307. return
  308. }
  309. } else if queryType == "today" {
  310. beginTime = now.AddDate(0, 0, 0)
  311. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  312. endTime = now
  313. dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
  314. if err != nil {
  315. log.Error("Can not query getDayCloudbrainInfo.", err)
  316. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  317. return
  318. }
  319. } else if queryType == "yesterday" {
  320. beginTime = now.AddDate(0, 0, -1)
  321. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  322. endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  323. dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
  324. if err != nil {
  325. log.Error("Can not query getDayCloudbrainInfo.", err)
  326. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  327. return
  328. }
  329. } else if queryType == "last_7day" {
  330. beginTime = now.AddDate(0, 0, -6)
  331. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  332. endTime = now
  333. endTimeTemp = time.Date(endTimeTemp.Year(), endTimeTemp.Month(), endTimeTemp.Day(), 0, 0, 0, 0, now.Location())
  334. dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
  335. if err != nil {
  336. log.Error("Can not query getDayCloudbrainInfo.", err)
  337. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  338. return
  339. }
  340. } else if queryType == "last_30day" {
  341. beginTime = now.AddDate(0, 0, -29)
  342. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  343. endTime = now
  344. dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
  345. if err != nil {
  346. log.Error("Can not query getDayCloudbrainInfo.", err)
  347. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  348. return
  349. }
  350. } else if queryType == "current_month" {
  351. endTime = now
  352. beginTime = time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
  353. dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
  354. if err != nil {
  355. log.Error("Can not query getDayCloudbrainInfo.", err)
  356. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  357. return
  358. }
  359. } else if queryType == "current_year" {
  360. endTime = now
  361. beginTime = time.Date(endTime.Year(), 1, 1, 0, 0, 0, 0, now.Location())
  362. dayCloudbrainInfo, count, err = getMonthCloudbrainInfo(beginTime, endTime)
  363. if err != nil {
  364. log.Error("Can not query getDayCloudbrainInfo.", err)
  365. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  366. return
  367. }
  368. } else if queryType == "last_month" {
  369. lastMonthTime := now.AddDate(0, -1, 0)
  370. beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
  371. endTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
  372. dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
  373. if err != nil {
  374. log.Error("Can not query getDayCloudbrainInfo.", err)
  375. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  376. return
  377. }
  378. }
  379. } else {
  380. if beginTimeStr == "" || endTimeStr == "" {
  381. //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
  382. recordCloudbrain, err := models.GetRecordBeginTime()
  383. if err != nil {
  384. log.Error("Can not get recordCloudbrain", err)
  385. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  386. return
  387. }
  388. brainRecordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix.AsTime()
  389. beginTime = brainRecordBeginTime
  390. endTime = now
  391. dayCloudbrainInfo, count, err = getMonthCloudbrainInfo(beginTime, endTime)
  392. if err != nil {
  393. log.Error("Can not query getDayCloudbrainInfo.", err)
  394. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  395. return
  396. }
  397. } else {
  398. beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
  399. if err != nil {
  400. log.Error("Can not ParseInLocation.", err)
  401. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  402. return
  403. }
  404. endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
  405. if err != nil {
  406. log.Error("Can not ParseInLocation.", err)
  407. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  408. return
  409. }
  410. if endTime.After(time.Now()) {
  411. endTime = time.Now()
  412. }
  413. endTimeTemp = beginTime.AddDate(0, 0, 1)
  414. dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
  415. if err != nil {
  416. log.Error("Can not query getDayCloudbrainInfo.", err)
  417. ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
  418. return
  419. }
  420. }
  421. }
  422. page := ctx.QueryInt("page")
  423. if page <= 0 {
  424. page = 1
  425. }
  426. pagesize := ctx.QueryInt("pagesize")
  427. if pagesize <= 0 {
  428. pagesize = 5
  429. }
  430. pageDateCloudbrainInfo := getPageDateCloudbrainInfo(dayCloudbrainInfo, page, pagesize)
  431. ctx.JSON(http.StatusOK, map[string]interface{}{
  432. "totalCount": count,
  433. "timeCloudbrainInfo": pageDateCloudbrainInfo,
  434. })
  435. }
  436. func getPageDateCloudbrainInfo(dateCloudbrainInfo []DateCloudbrainInfo, page int, pagesize int) []DateCloudbrainInfo {
  437. begin := (page - 1) * pagesize
  438. end := (page) * pagesize
  439. if begin > len(dateCloudbrainInfo)-1 {
  440. return nil
  441. }
  442. if end > len(dateCloudbrainInfo)-1 {
  443. return dateCloudbrainInfo[begin:]
  444. } else {
  445. return dateCloudbrainInfo[begin:end]
  446. }
  447. }
  448. func GetAllCloudbrainsPeriodDistribution(ctx *context.Context) {
  449. queryType := ctx.QueryTrim("type")
  450. beginTimeStr := ctx.QueryTrim("beginTime")
  451. endTimeStr := ctx.QueryTrim("endTime")
  452. recordCloudbrain, err := models.GetRecordBeginTime()
  453. if err != nil {
  454. log.Error("Can not get record begin time", err)
  455. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  456. return
  457. }
  458. recordBeginTime := time.Unix(int64(recordCloudbrain[0].Cloudbrain.CreatedUnix), 0)
  459. beginTime, endTime, err := getCloudbrainTimePeroid(ctx, recordBeginTime)
  460. if err != nil {
  461. log.Error("Parameter is wrong", err)
  462. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.parameter_is_wrong"))
  463. return
  464. }
  465. cloudOneJobTypeRes := make(map[string]int)
  466. cloudTwoJobTypeRes := make(map[string]int)
  467. intelligentNetJobTypeRes := make(map[string]int)
  468. cloudBrainPeriodNum := make(map[int]int)
  469. cloudBrainComputeResource := make(map[string]int)
  470. beginTimeTemp := beginTime.Unix()
  471. if queryType == "all" || (queryType == "" && (beginTimeStr == "" || endTimeStr == "")) {
  472. beginTimeTemp = int64(recordCloudbrain[0].Cloudbrain.CreatedUnix)
  473. }
  474. page := 1
  475. pagesize := 1000
  476. count := pagesize
  477. //Each time a maximum of 1000 pieces of data are detected to the memory, batch processing
  478. for count == pagesize && count != 0 {
  479. cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
  480. ListOptions: models.ListOptions{
  481. Page: page,
  482. PageSize: pagesize,
  483. },
  484. Type: models.TypeCloudBrainAll,
  485. BeginTimeUnix: beginTimeTemp,
  486. EndTimeUnix: endTime.Unix(),
  487. })
  488. if err != nil {
  489. ctx.ServerError("Get cloudbrains failed:", err)
  490. return
  491. }
  492. for _, cloudbrain := range cloudbrains {
  493. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
  494. if _, ok := cloudOneJobTypeRes[cloudbrain.JobType]; !ok {
  495. cloudOneJobTypeRes[cloudbrain.JobType] = 1
  496. } else {
  497. cloudOneJobTypeRes[cloudbrain.JobType] += 1
  498. }
  499. }
  500. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
  501. if _, ok := cloudTwoJobTypeRes[cloudbrain.JobType]; !ok {
  502. cloudTwoJobTypeRes[cloudbrain.JobType] = 1
  503. } else {
  504. cloudTwoJobTypeRes[cloudbrain.JobType] += 1
  505. }
  506. }
  507. if cloudbrain.Cloudbrain.Type == models.TypeC2Net {
  508. if _, ok := intelligentNetJobTypeRes[cloudbrain.JobType]; !ok {
  509. intelligentNetJobTypeRes[cloudbrain.JobType] = 1
  510. } else {
  511. intelligentNetJobTypeRes[cloudbrain.JobType] += 1
  512. }
  513. }
  514. if _, ok := cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type]; !ok {
  515. cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] = 1
  516. } else {
  517. cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] += 1
  518. }
  519. if _, ok := cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource]; !ok {
  520. cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] = 1
  521. } else {
  522. cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] += 1
  523. }
  524. }
  525. count = len(cloudbrains)
  526. page += 1
  527. }
  528. jobTypeList := []string{string(models.JobTypeDebug), string(models.JobTypeTrain), string(models.JobTypeInference), string(models.JobTypeBenchmark),
  529. string(models.JobTypeBrainScore), string(models.JobTypeSnn4imagenet)}
  530. for _, v := range jobTypeList {
  531. if _, ok := cloudOneJobTypeRes[v]; !ok {
  532. cloudOneJobTypeRes[v] = 0
  533. }
  534. if _, ok := cloudTwoJobTypeRes[v]; !ok {
  535. cloudTwoJobTypeRes[v] = 0
  536. }
  537. if _, ok := intelligentNetJobTypeRes[v]; !ok {
  538. intelligentNetJobTypeRes[v] = 0
  539. }
  540. }
  541. cloudBrainTypeList := []int{0, 1, 2}
  542. for _, v := range cloudBrainTypeList {
  543. if _, ok := cloudBrainPeriodNum[v]; !ok {
  544. cloudBrainPeriodNum[v] = 0
  545. }
  546. }
  547. ComputeResourceList := []string{"CPU/GPU", "NPU"}
  548. for _, v := range ComputeResourceList {
  549. if _, ok := cloudBrainComputeResource[v]; !ok {
  550. cloudBrainComputeResource[v] = 0
  551. }
  552. }
  553. cloudOneJobTypeRes["EVALUATION"] = cloudOneJobTypeRes[string(models.JobTypeBenchmark)] + cloudOneJobTypeRes[string(models.JobTypeSnn4imagenet)] + cloudOneJobTypeRes[string(models.JobTypeBrainScore)]
  554. cloudTwoJobTypeRes["EVALUATION"] = cloudTwoJobTypeRes[string(models.JobTypeBenchmark)] + cloudTwoJobTypeRes[string(models.JobTypeSnn4imagenet)] + cloudTwoJobTypeRes[string(models.JobTypeBrainScore)]
  555. intelligentNetJobTypeRes["EVALUATION"] = intelligentNetJobTypeRes[string(models.JobTypeBenchmark)] + intelligentNetJobTypeRes[string(models.JobTypeSnn4imagenet)] + intelligentNetJobTypeRes[string(models.JobTypeBrainScore)]
  556. ctx.JSON(http.StatusOK, map[string]interface{}{
  557. "cloudOneJobTypeRes": cloudOneJobTypeRes,
  558. "cloudTwoJobTypeRes": cloudTwoJobTypeRes,
  559. "intelligentNetJobTypeRes": intelligentNetJobTypeRes,
  560. "cloudBrainPeriodNum": cloudBrainPeriodNum,
  561. "cloudBrainComputeResource": cloudBrainComputeResource,
  562. })
  563. }
  564. func GetCloudbrainsStatusAnalysis(ctx *context.Context) {
  565. recordCloudbrain, err := models.GetRecordBeginTime()
  566. if err != nil {
  567. log.Error("Can not get recordCloudbrain", err)
  568. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  569. return
  570. }
  571. recordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix
  572. endTime := time.Now()
  573. cloudBrainStatusResult := make(map[string]int)
  574. cloudBrainStatusAnalysis := make(map[string]int)
  575. totalCount := 0
  576. page := 1
  577. pagesize := 1000
  578. count := pagesize
  579. for count == pagesize && count != 0 {
  580. cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
  581. ListOptions: models.ListOptions{
  582. Page: page,
  583. PageSize: pagesize,
  584. },
  585. Type: models.TypeCloudBrainAll,
  586. BeginTimeUnix: int64(recordBeginTime),
  587. EndTimeUnix: endTime.Unix(),
  588. })
  589. if err != nil {
  590. ctx.ServerError("Get cloudbrains failed:", err)
  591. return
  592. }
  593. for _, cloudbrain := range cloudbrains {
  594. if _, ok := cloudBrainStatusResult[cloudbrain.Status]; !ok {
  595. cloudBrainStatusResult[cloudbrain.Status] = 1
  596. } else {
  597. cloudBrainStatusResult[cloudbrain.Status] += 1
  598. }
  599. }
  600. count = len(cloudbrains)
  601. totalCount = totalCount + count
  602. page += 1
  603. }
  604. var jobStatuses []string
  605. jobStatuses = append(jobStatuses, string(models.ModelArtsTrainJobWaiting), string(models.ModelArtsTrainJobFailed), string(models.ModelArtsRunning), string(models.ModelArtsTrainJobCompleted),
  606. string(models.ModelArtsStarting), string(models.ModelArtsRestarting), string(models.ModelArtsStartFailed),
  607. string(models.ModelArtsStopping), string(models.ModelArtsStopped), string(models.JobSucceeded))
  608. jobStatusesCount := 0
  609. for _, v := range jobStatuses {
  610. if _, ok := cloudBrainStatusResult[v]; !ok {
  611. cloudBrainStatusAnalysis[v] = 0
  612. } else {
  613. cloudBrainStatusAnalysis[v] = cloudBrainStatusResult[v]
  614. }
  615. jobStatusesCount = jobStatusesCount + cloudBrainStatusResult[v]
  616. }
  617. cloudBrainStatusAnalysis["OTHER"] = totalCount - jobStatusesCount
  618. ctx.JSON(http.StatusOK, map[string]interface{}{
  619. "cloudBrainStatusResult": cloudBrainStatusAnalysis,
  620. })
  621. }
  622. func GetCloudbrainsDetailData(ctx *context.Context) {
  623. recordCloudbrain, err := models.GetRecordBeginTime()
  624. if err != nil {
  625. log.Error("Can not get recordCloudbrain", err)
  626. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  627. return
  628. }
  629. recordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix
  630. endTime := time.Now()
  631. listType := ctx.Query("listType")
  632. jobType := ctx.Query("jobType")
  633. jobStatus := ctx.Query("jobStatus")
  634. cloudBrainType := ctx.QueryInt("Type")
  635. page := ctx.QueryInt("page")
  636. pageSize := ctx.QueryInt("pagesize")
  637. if page <= 0 {
  638. page = 1
  639. }
  640. if pageSize <= 0 {
  641. pageSize = 10
  642. }
  643. var jobTypes []string
  644. jobTypeNot := false
  645. if jobType == string(models.JobTypeBenchmark) {
  646. jobTypes = append(jobTypes, string(models.JobTypeBenchmark), string(models.JobTypeBrainScore), string(models.JobTypeSnn4imagenet))
  647. } else if jobType != "all" && jobType != "" {
  648. jobTypes = append(jobTypes, jobType)
  649. }
  650. var jobStatuses []string
  651. jobStatusNot := false
  652. if jobStatus == "other" {
  653. jobStatusNot = true
  654. jobStatuses = append(jobStatuses, string(models.ModelArtsTrainJobWaiting), string(models.ModelArtsTrainJobFailed), string(models.ModelArtsRunning), string(models.ModelArtsTrainJobCompleted),
  655. string(models.ModelArtsStarting), string(models.ModelArtsRestarting), string(models.ModelArtsStartFailed),
  656. string(models.ModelArtsStopping), string(models.ModelArtsStopped), string(models.JobSucceeded))
  657. } else if jobStatus != "all" && jobStatus != "" {
  658. jobStatuses = append(jobStatuses, jobStatus)
  659. }
  660. keyword := strings.Trim(ctx.Query("q"), " ")
  661. ciTasks, count, err := models.CloudbrainAll(&models.CloudbrainsOptions{
  662. ListOptions: models.ListOptions{
  663. Page: page,
  664. PageSize: pageSize,
  665. },
  666. Keyword: keyword,
  667. Type: cloudBrainType,
  668. ComputeResource: listType,
  669. JobTypeNot: jobTypeNot,
  670. JobStatusNot: jobStatusNot,
  671. JobStatus: jobStatuses,
  672. JobTypes: jobTypes,
  673. NeedRepoInfo: true,
  674. BeginTimeUnix: int64(recordBeginTime),
  675. EndTimeUnix: endTime.Unix(),
  676. })
  677. if err != nil {
  678. ctx.ServerError("Get job failed:", err)
  679. return
  680. }
  681. nilTime := time.Time{}
  682. tasks := []models.TaskDetail{}
  683. for i, task := range ciTasks {
  684. ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
  685. var taskDetail models.TaskDetail
  686. taskDetail.ID = ciTasks[i].Cloudbrain.ID
  687. taskDetail.JobName = ciTasks[i].JobName
  688. taskDetail.DisplayJobName = ciTasks[i].DisplayJobName
  689. taskDetail.Status = ciTasks[i].Status
  690. taskDetail.JobType = ciTasks[i].JobType
  691. taskDetail.CreatedUnix = ciTasks[i].Cloudbrain.CreatedUnix
  692. taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration
  693. taskDetail.StartTime = ciTasks[i].StartTime
  694. taskDetail.EndTime = ciTasks[i].EndTime
  695. taskDetail.ComputeResource = ciTasks[i].ComputeResource
  696. taskDetail.Type = ciTasks[i].Cloudbrain.Type
  697. taskDetail.UserName = ciTasks[i].User.Name
  698. taskDetail.RepoID = ciTasks[i].RepoID
  699. if ciTasks[i].Repo != nil {
  700. taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name
  701. taskDetail.RepoAlias = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Alias
  702. }
  703. if ciTasks[i].Cloudbrain.Status == string(models.JobWaiting) {
  704. if ciTasks[i].Cloudbrain.DeletedAt != nilTime {
  705. WaitTimeInt := ciTasks[i].Cloudbrain.UpdatedUnix.AsTime().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
  706. taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
  707. if WaitTimeInt < 0 {
  708. taskDetail.WaitTime = "00:00:00"
  709. }
  710. } else {
  711. if ciTasks[i].Cloudbrain.StartTime.AsTime().Unix() == 0 {
  712. WaitTimeInt := time.Now().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
  713. taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
  714. if WaitTimeInt < 0 {
  715. taskDetail.WaitTime = "00:00:00"
  716. }
  717. } else {
  718. WaitTimeInt := ciTasks[i].Cloudbrain.StartTime.AsTime().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
  719. taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
  720. if WaitTimeInt < 0 {
  721. taskDetail.WaitTime = "00:00:00"
  722. }
  723. }
  724. }
  725. } else if ciTasks[i].Cloudbrain.Status == string(models.JobStopped) && ciTasks[i].Cloudbrain.StartTime.AsTime().Unix() == 0 {
  726. WaitTimeInt := ciTasks[i].Cloudbrain.EndTime.AsTime().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
  727. taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
  728. if WaitTimeInt < 0 {
  729. taskDetail.WaitTime = "00:00:00"
  730. }
  731. } else {
  732. WaitTimeInt := ciTasks[i].Cloudbrain.StartTime.AsTime().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
  733. taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
  734. if WaitTimeInt < 0 {
  735. taskDetail.WaitTime = "00:00:00"
  736. }
  737. }
  738. if ciTasks[i].Cloudbrain.Type == models.TypeCloudBrainTwo || (ciTasks[i].Cloudbrain.Type == models.TypeCloudBrainOne && ciTasks[i].Cloudbrain.JobType == "TRAIN") {
  739. taskDetail.JobID = ciTasks[i].Cloudbrain.JobID
  740. }
  741. if ciTasks[i].Cloudbrain.DeletedAt != nilTime {
  742. taskDetail.IsDelete = true
  743. } else {
  744. taskDetail.IsDelete = false
  745. }
  746. tasks = append(tasks, taskDetail)
  747. }
  748. pager := context.NewPagination(int(count), pageSize, page, getTotalPage(count, pageSize))
  749. pager.SetDefaultParams(ctx)
  750. pager.AddParam(ctx, "listType", "ListType")
  751. ctx.JSON(http.StatusOK, map[string]interface{}{
  752. "Title": ctx.Tr("kanban.cloudBrains"),
  753. "Tasks": tasks,
  754. "Keyword": keyword,
  755. "pager": pager,
  756. "count": count,
  757. })
  758. }
  759. func GetCloudbrainsCreateHoursData(ctx *context.Context) {
  760. recordCloudbrain, err := models.GetRecordBeginTime()
  761. if err != nil {
  762. log.Error("Can not get record begin time", err)
  763. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  764. return
  765. }
  766. recordBeginTime := time.Unix(int64(recordCloudbrain[0].Cloudbrain.CreatedUnix), 0)
  767. // recordBeginTime, _ := time.Parse("2006-01-02 15:04:05", recordTime)
  768. now := time.Now()
  769. queryType := ctx.QueryTrim("type")
  770. beginTimeStr := ctx.QueryTrim("beginTime")
  771. endTimeStr := ctx.QueryTrim("endTime")
  772. var beginTime time.Time
  773. var endTime time.Time
  774. createHourPeriodCount := make(map[string]interface{})
  775. if queryType != "" {
  776. if queryType == "all" {
  777. beginTime = recordBeginTime
  778. endTime = now.AddDate(0, 0, 1)
  779. endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  780. } else if queryType == "today" {
  781. beginTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  782. endTime = now.AddDate(0, 0, 1)
  783. } else if queryType == "yesterday" {
  784. beginTime = now.AddDate(0, 0, -1)
  785. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  786. endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  787. } else if queryType == "current_week" {
  788. beginTime = now.AddDate(0, 0, -int(time.Now().Weekday())+1) //begin from monday
  789. endTime = now
  790. } else if queryType == "current_month" {
  791. beginTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
  792. endTime = now.AddDate(0, 0, 1)
  793. endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  794. } else if queryType == "monthly" {
  795. endTime = now
  796. beginTime = now.AddDate(0, -1, 0)
  797. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  798. } else if queryType == "current_year" {
  799. beginTime = time.Date(now.Year(), 1, 1, 0, 0, 0, 0, now.Location())
  800. endTime = now.AddDate(0, 0, 1)
  801. endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  802. } else if queryType == "last_month" {
  803. lastMonthTime := now.AddDate(0, -1, 0)
  804. beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
  805. endTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
  806. } else if queryType == "last_7day" {
  807. beginTime = now.AddDate(0, 0, -6)
  808. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  809. endTime = now.AddDate(0, 0, 1)
  810. endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  811. } else if queryType == "last_30day" {
  812. beginTime = now.AddDate(0, 0, -29)
  813. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  814. endTime = now.AddDate(0, 0, 1)
  815. endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  816. }
  817. } else {
  818. if beginTimeStr == "" || endTimeStr == "" {
  819. //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
  820. beginTime = recordBeginTime
  821. endTime = now.AddDate(0, 0, 1)
  822. endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  823. } else {
  824. beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
  825. if err != nil {
  826. log.Error("Can not ParseInLocation.", err)
  827. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  828. return
  829. }
  830. endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
  831. if err != nil {
  832. log.Error("Can not ParseInLocation.", err)
  833. ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
  834. return
  835. }
  836. endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  837. }
  838. }
  839. dateBeginTime := beginTime.Format("2006-01-02")
  840. dateEndTime := endTime.Format("2006-01-02")
  841. createHourPeriodCount, err = models.GetCreateHourPeriodCount(dateBeginTime, dateEndTime)
  842. if err != nil {
  843. log.Error("Can not query hourPeriodCount.", err)
  844. ctx.Error(http.StatusBadRequest, ctx.Tr("hourPeriodCount_get_error"))
  845. return
  846. }
  847. runHourPeriodCount, err := models.GetRunHourPeriodCount(dateBeginTime, dateEndTime)
  848. if err != nil {
  849. log.Error("Can not query runHourPeriodCount.", err)
  850. ctx.Error(http.StatusBadRequest, ctx.Tr("runHourPeriodCount_get_error"))
  851. return
  852. }
  853. ctx.JSON(http.StatusOK, map[string]interface{}{
  854. "recordBeginTime": recordCloudbrain[0].Cloudbrain.CreatedUnix,
  855. "updateTime": now.Unix(),
  856. "createHourPeriodCount": createHourPeriodCount,
  857. "runHourPeriodCount": runHourPeriodCount,
  858. })
  859. }
  860. func GetWaittingTop(ctx *context.Context) {
  861. ciTasks, err := models.GetWaittingTop()
  862. if err != nil {
  863. log.Error("Can not get record begin time", err)
  864. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  865. return
  866. }
  867. tasks := []models.TaskDetail{}
  868. for i, task := range ciTasks {
  869. ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
  870. var taskDetail models.TaskDetail
  871. taskDetail.DisplayJobName = ciTasks[i].DisplayJobName
  872. taskDetail.UserName = ciTasks[i].User.Name
  873. taskDetail.RepoID = ciTasks[i].RepoID
  874. if ciTasks[i].Repo != nil {
  875. taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name
  876. }
  877. WaitTimeInt := time.Now().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
  878. taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
  879. if WaitTimeInt < 0 {
  880. taskDetail.WaitTime = "00:00:00"
  881. }
  882. tasks = append(tasks, taskDetail)
  883. }
  884. ctx.JSON(http.StatusOK, map[string]interface{}{
  885. "tasks": tasks,
  886. })
  887. }
  888. func GetRunningTop(ctx *context.Context) {
  889. ciTasks, err := models.GetRunningTop()
  890. if err != nil {
  891. log.Error("Can not get record begin time", err)
  892. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
  893. return
  894. }
  895. tasks := []models.TaskDetail{}
  896. for i, task := range ciTasks {
  897. ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
  898. var taskDetail models.TaskDetail
  899. taskDetail.DisplayJobName = ciTasks[i].DisplayJobName
  900. taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration
  901. taskDetail.UserName = ciTasks[i].User.Name
  902. taskDetail.RepoID = ciTasks[i].RepoID
  903. if ciTasks[i].Repo != nil {
  904. taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name
  905. }
  906. tasks = append(tasks, taskDetail)
  907. }
  908. ctx.JSON(http.StatusOK, map[string]interface{}{
  909. "tasks": tasks,
  910. })
  911. }
  912. 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) {
  913. cloudOneJobTypeRes := make(map[string]int)
  914. cloudTwoJobTypeRes := make(map[string]int)
  915. intelligentNetJobTypeRes := make(map[string]int)
  916. cloudBrainPeriodNum := make(map[int]int)
  917. cloudBrainComputeResource := make(map[string]int)
  918. for _, cloudbrain := range cloudbrains {
  919. if int64(cloudbrain.Cloudbrain.CreatedUnix) >= beginTime.Unix() && int64(cloudbrain.Cloudbrain.CreatedUnix) < endTime.Unix() {
  920. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
  921. if _, ok := cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType]; !ok {
  922. cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType] = 1
  923. } else {
  924. cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType] += 1
  925. }
  926. }
  927. if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
  928. if _, ok := cloudTwoJobTypeRes[cloudbrain.JobType]; !ok {
  929. cloudTwoJobTypeRes[cloudbrain.Cloudbrain.JobType] = 1
  930. } else {
  931. cloudTwoJobTypeRes[cloudbrain.Cloudbrain.JobType] += 1
  932. }
  933. }
  934. if _, ok := cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type]; !ok {
  935. cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] = 1
  936. } else {
  937. cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] += 1
  938. }
  939. if _, ok := cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource]; !ok {
  940. cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] = 1
  941. } else {
  942. cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] += 1
  943. }
  944. }
  945. }
  946. ComputeResourceList := []string{"CPU/GPU", "NPU"}
  947. for _, v := range ComputeResourceList {
  948. if _, ok := cloudBrainComputeResource[v]; !ok {
  949. cloudBrainComputeResource[v] = 0
  950. }
  951. }
  952. jobTypeList := []string{"DEBUG", "BENCHMARK", "INFERENCE", "TRAIN", "SNN4IMAGENET", "BRAINSCORE"}
  953. cloudBrainTypeList := []int{0, 1, 2}
  954. for _, v := range jobTypeList {
  955. if _, ok := cloudOneJobTypeRes[v]; !ok {
  956. cloudOneJobTypeRes[v] = 0
  957. }
  958. if _, ok := cloudTwoJobTypeRes[v]; !ok {
  959. cloudTwoJobTypeRes[v] = 0
  960. }
  961. if _, ok := intelligentNetJobTypeRes[v]; !ok {
  962. intelligentNetJobTypeRes[v] = 0
  963. }
  964. }
  965. for _, v := range cloudBrainTypeList {
  966. if _, ok := cloudBrainPeriodNum[v]; !ok {
  967. cloudBrainPeriodNum[v] = 0
  968. }
  969. }
  970. cloudBrainPeriodNum[-1] = cloudBrainPeriodNum[0] + cloudBrainPeriodNum[1] + cloudBrainPeriodNum[2]
  971. return cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource
  972. }
  973. func getDayCloudbrainNum(beginTime time.Time, endTime time.Time) ([]DateCloudbrainNum, error) {
  974. var endTimeTemp time.Time
  975. endTimeTemp = beginTime.AddDate(0, 0, 1)
  976. cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
  977. Type: models.TypeCloudBrainAll,
  978. BeginTimeUnix: beginTime.Unix(),
  979. EndTimeUnix: endTime.Unix(),
  980. })
  981. if err != nil {
  982. log.Error("Get cloudbrains failed:", err)
  983. return nil, err
  984. }
  985. dayCloudbrainNum := make([]DateCloudbrainNum, 0)
  986. for endTimeTemp.Before(endTime) || endTimeTemp.Equal(endTime) {
  987. cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource := getCloudbrainCount(beginTime, endTimeTemp, cloudbrains)
  988. dayCloudbrainNum = append(dayCloudbrainNum, DateCloudbrainNum{
  989. Date: beginTime.Format("2006/01/02"),
  990. CloudOneJobTypeRes: cloudOneJobTypeRes,
  991. CloudTwoJobTypeRes: cloudTwoJobTypeRes,
  992. IntelligentNetJobTypeRes: intelligentNetJobTypeRes,
  993. CloudBrainPeriodNum: cloudBrainPeriodNum,
  994. CloudBrainComputeResource: cloudBrainComputeResource,
  995. })
  996. if endTime.Before(endTimeTemp.AddDate(0, 0, 1)) && endTimeTemp.Before(endTime) {
  997. beginTime = endTimeTemp
  998. endTimeTemp = endTime
  999. } else {
  1000. beginTime = endTimeTemp
  1001. endTimeTemp = beginTime.AddDate(0, 0, 1)
  1002. }
  1003. }
  1004. return dayCloudbrainNum, nil
  1005. }
  1006. func getMonthCloudbrainNum(beginTime time.Time, endTime time.Time) ([]DateCloudbrainNum, error) {
  1007. var endTimeTemp time.Time
  1008. now := time.Now()
  1009. endTimeTemp = beginTime.AddDate(0, 1, 0)
  1010. endTimeTemp = time.Date(endTimeTemp.Year(), endTimeTemp.Month(), 1, 0, 0, 0, 0, now.Location())
  1011. monthCloudbrainNum := make([]DateCloudbrainNum, 0)
  1012. cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
  1013. Type: models.TypeCloudBrainAll,
  1014. BeginTimeUnix: beginTime.Unix(),
  1015. EndTimeUnix: endTime.Unix(),
  1016. })
  1017. if err != nil {
  1018. log.Error("Getcloudbrains failed:%v", err)
  1019. return nil, err
  1020. }
  1021. for endTimeTemp.Before(endTime) || endTimeTemp.Equal(endTime) {
  1022. cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource := getCloudbrainCount(beginTime, endTimeTemp, cloudbrains)
  1023. monthCloudbrainNum = append(monthCloudbrainNum, DateCloudbrainNum{
  1024. Date: beginTime.Format("2006/01"),
  1025. CloudOneJobTypeRes: cloudOneJobTypeRes,
  1026. CloudTwoJobTypeRes: cloudTwoJobTypeRes,
  1027. IntelligentNetJobTypeRes: intelligentNetJobTypeRes,
  1028. CloudBrainPeriodNum: cloudBrainPeriodNum,
  1029. CloudBrainComputeResource: cloudBrainComputeResource,
  1030. })
  1031. if endTime.Before(endTimeTemp.AddDate(0, 1, 0)) && endTimeTemp.Before(endTime) {
  1032. beginTime = endTimeTemp
  1033. endTimeTemp = endTime
  1034. } else {
  1035. beginTime = endTimeTemp
  1036. endTimeTemp = beginTime.AddDate(0, 1, 0)
  1037. }
  1038. }
  1039. return monthCloudbrainNum, nil
  1040. }
  1041. func getDayCloudbrainInfo(beginTime time.Time, endTime time.Time) ([]DateCloudbrainInfo, int, error) {
  1042. now := time.Now()
  1043. endTimeTemp := time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  1044. if endTimeTemp.Equal(endTime) {
  1045. endTimeTemp = endTimeTemp.AddDate(0, 0, -1)
  1046. }
  1047. cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
  1048. Type: models.TypeCloudBrainAll,
  1049. BeginTimeUnix: beginTime.Unix(),
  1050. EndTimeUnix: endTime.Unix(),
  1051. })
  1052. if err != nil {
  1053. log.Error("Getcloudbrains failed:%v", err)
  1054. return nil, 0, err
  1055. }
  1056. dayCloudbrainInfo := make([]DateCloudbrainInfo, 0)
  1057. count := 0
  1058. for beginTime.Before(endTimeTemp) || beginTime.Equal(endTimeTemp) {
  1059. _, _, _, cloudBrainPeriodNum, cloudBrainComputeResource := getCloudbrainCount(endTimeTemp, endTime, cloudbrains)
  1060. dayCloudbrainInfo = append(dayCloudbrainInfo, DateCloudbrainInfo{
  1061. Date: endTimeTemp.Format("2006/01/02"),
  1062. CloudBrainPeriodNum: cloudBrainPeriodNum,
  1063. CloudBrainComputeResource: cloudBrainComputeResource,
  1064. })
  1065. endTime = endTimeTemp
  1066. endTimeTemp = endTimeTemp.AddDate(0, 0, -1)
  1067. count += 1
  1068. }
  1069. return dayCloudbrainInfo, count, nil
  1070. }
  1071. func getMonthCloudbrainInfo(beginTime time.Time, endTime time.Time) ([]DateCloudbrainInfo, int, error) {
  1072. now := time.Now()
  1073. endTimeTemp := time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
  1074. if endTimeTemp.Equal(endTime) {
  1075. endTimeTemp = endTimeTemp.AddDate(0, -1, 0)
  1076. }
  1077. cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
  1078. Type: models.TypeCloudBrainAll,
  1079. BeginTimeUnix: beginTime.Unix(),
  1080. EndTimeUnix: endTime.Unix(),
  1081. })
  1082. if err != nil {
  1083. log.Error("Getcloudbrains failed:%v", err)
  1084. return nil, 0, err
  1085. }
  1086. dayCloudbrainInfo := make([]DateCloudbrainInfo, 0)
  1087. count := 0
  1088. for beginTime.Before(endTimeTemp) || beginTime.Equal(endTimeTemp) || (endTimeTemp.Before(beginTime) && beginTime.Before(endTime)) {
  1089. _, _, _, cloudBrainPeriodNum, cloudBrainComputeResource := getCloudbrainCount(endTimeTemp, endTime, cloudbrains)
  1090. dayCloudbrainInfo = append(dayCloudbrainInfo, DateCloudbrainInfo{
  1091. Date: endTimeTemp.Format("2006/01"),
  1092. CloudBrainPeriodNum: cloudBrainPeriodNum,
  1093. CloudBrainComputeResource: cloudBrainComputeResource,
  1094. })
  1095. endTime = endTimeTemp
  1096. endTimeTemp = endTimeTemp.AddDate(0, -1, 0)
  1097. count += 1
  1098. }
  1099. return dayCloudbrainInfo, count, nil
  1100. }
  1101. func DownloadCloudBrainBoard(ctx *context.Context) {
  1102. page := 1
  1103. pageSize := 300
  1104. var cloudBrain = ctx.Tr("repo.cloudbrain")
  1105. fileName := getCloudbrainFileName(cloudBrain)
  1106. _, total, err := models.CloudbrainAll(&models.CloudbrainsOptions{
  1107. ListOptions: models.ListOptions{
  1108. Page: page,
  1109. PageSize: pageSize,
  1110. },
  1111. Type: models.TypeCloudBrainAll,
  1112. NeedRepoInfo: false,
  1113. })
  1114. if err != nil {
  1115. log.Warn("Can not get cloud brain info", err)
  1116. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.cloudbrain_query_fail"))
  1117. return
  1118. }
  1119. totalPage := getTotalPage(total, pageSize)
  1120. f := excelize.NewFile()
  1121. index := f.NewSheet(cloudBrain)
  1122. f.DeleteSheet("Sheet1")
  1123. for k, v := range allCloudbrainHeader(ctx) {
  1124. f.SetCellValue(cloudBrain, k, v)
  1125. }
  1126. var row = 2
  1127. for i := 0; i < totalPage; i++ {
  1128. pageRecords, _, err := models.CloudbrainAll(&models.CloudbrainsOptions{
  1129. ListOptions: models.ListOptions{
  1130. Page: page,
  1131. PageSize: pageSize,
  1132. },
  1133. Type: models.TypeCloudBrainAll,
  1134. NeedRepoInfo: true,
  1135. })
  1136. if err != nil {
  1137. log.Warn("Can not get cloud brain info", err)
  1138. continue
  1139. }
  1140. for _, record := range pageRecords {
  1141. for k, v := range allCloudbrainValues(row, record, ctx) {
  1142. f.SetCellValue(cloudBrain, k, v)
  1143. }
  1144. row++
  1145. }
  1146. page++
  1147. }
  1148. f.SetActiveSheet(index)
  1149. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName))
  1150. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  1151. f.WriteTo(ctx.Resp)
  1152. }
  1153. func getCloudbrainFileName(baseName string) string {
  1154. return baseName + "_" + time.Now().Format(EXCEL_DATE_FORMAT) + ".xlsx"
  1155. }
  1156. func allCloudbrainHeader(ctx *context.Context) map[string]string {
  1157. return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.cloudbrain_type"), "C1": ctx.Tr("repo.modelarts.status"), "D1": ctx.Tr("repo.cloudbrain_task_type"),
  1158. "E1": ctx.Tr("repo.modelarts.createtime"), "F1": ctx.Tr("repo.modelarts.train_job.wait_time"), "G1": ctx.Tr("repo.modelarts.train_job.dura_time"),
  1159. "H1": ctx.Tr("repo.modelarts.train_job.start_time"),
  1160. "I1": ctx.Tr("repo.modelarts.train_job.end_time"), "J1": ctx.Tr("repo.modelarts.computing_resources"),
  1161. "K1": ctx.Tr("repo.cloudbrain_creator"), "L1": ctx.Tr("repo.repo_name"), "M1": ctx.Tr("repo.cloudbrain_task_name"), "N1": ctx.Tr("repo.modelarts.deletetime")}
  1162. }
  1163. func allCloudbrainValues(row int, rs *models.CloudbrainInfo, ctx *context.Context) map[string]string {
  1164. return map[string]string{getCellName("A", row): rs.DisplayJobName, getCellName("B", row): getCloudbrainType(rs, ctx), getCellName("C", row): rs.Status, getCellName("D", row): rs.JobType,
  1165. getCellName("E", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT), getCellName("F", row): getBrainWaitTime(rs),
  1166. getCellName("G", row): rs.TrainJobDuration, getCellName("H", row): getBrainStartTime(rs),
  1167. getCellName("I", row): getBrainEndTime(rs),
  1168. getCellName("J", row): rs.ComputeResource, getCellName("K", row): rs.Name, getCellName("L", row): getBrainRepo(rs),
  1169. getCellName("M", row): rs.JobName, getCellName("N", row): getBrainDeleteTime(rs),
  1170. }
  1171. }
  1172. func getBrainRepo(rs *models.CloudbrainInfo) string {
  1173. if rs.Repo != nil {
  1174. return rs.Repo.OwnerName + "/" + rs.Repo.Alias
  1175. }
  1176. return ""
  1177. }
  1178. func getBrainStartTime(rs *models.CloudbrainInfo) string {
  1179. timeString := time.Unix(int64(rs.Cloudbrain.StartTime), 0).Format(CREATE_TIME_FORMAT)
  1180. if timeString != "1970/01/01 08:00:00" {
  1181. return timeString
  1182. } else {
  1183. return "0"
  1184. }
  1185. }
  1186. func getBrainEndTime(rs *models.CloudbrainInfo) string {
  1187. timeString := time.Unix(int64(rs.Cloudbrain.EndTime), 0).Format(CREATE_TIME_FORMAT)
  1188. if timeString != "1970/01/01 08:00:00" {
  1189. return timeString
  1190. } else {
  1191. return "0"
  1192. }
  1193. }
  1194. func getBrainWaitTime(rs *models.CloudbrainInfo) string {
  1195. var waitTime int64
  1196. if rs.Cloudbrain.Status == string(models.JobWaiting) {
  1197. waitTime = time.Now().Unix() - rs.Cloudbrain.CreatedUnix.AsTime().Unix()
  1198. } else {
  1199. waitTime = int64(rs.Cloudbrain.StartTime - rs.Cloudbrain.CreatedUnix)
  1200. }
  1201. if waitTime <= 0 {
  1202. return "00:00:00"
  1203. } else {
  1204. return models.ConvertDurationToStr(waitTime)
  1205. }
  1206. }
  1207. func getCloudbrainType(rs *models.CloudbrainInfo, ctx *context.Context) string {
  1208. if rs.Cloudbrain.Type == models.TypeCloudBrainOne {
  1209. return ctx.Tr("repo.cloudbrain1")
  1210. } else if rs.Cloudbrain.Type == models.TypeCloudBrainTwo {
  1211. return ctx.Tr("repo.cloudbrain2")
  1212. } else if rs.Cloudbrain.Type == models.TypeC2Net {
  1213. return ctx.Tr("repo.intelligent_net")
  1214. } else {
  1215. return ctx.Tr("repo.cloudbrain_untype")
  1216. }
  1217. }
  1218. func getBrainDeleteTime(rs *models.CloudbrainInfo) string {
  1219. nilTime := time.Time{}
  1220. if rs.Cloudbrain.DeletedAt != nilTime {
  1221. return rs.Cloudbrain.DeletedAt.Format("2006-01-02 15:04:05")
  1222. } else {
  1223. return ""
  1224. }
  1225. }
  1226. func getCloudbrainTimePeroid(ctx *context.Context, recordBeginTime time.Time) (time.Time, time.Time, error) {
  1227. queryType := ctx.QueryTrim("type")
  1228. beginTimeStr := ctx.QueryTrim("beginTime")
  1229. endTimeStr := ctx.QueryTrim("endTime")
  1230. now := time.Now()
  1231. var beginTime time.Time
  1232. var endTime time.Time
  1233. var err error
  1234. if queryType != "" {
  1235. if queryType == "all" {
  1236. beginTime = recordBeginTime
  1237. endTime = now
  1238. } else if queryType == "today" {
  1239. endTime = now
  1240. beginTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
  1241. } else if queryType == "yesterday" {
  1242. endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
  1243. beginTime = endTime.AddDate(0, 0, -1)
  1244. } else if queryType == "last_7day" {
  1245. beginTime = now.AddDate(0, 0, -6)
  1246. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  1247. endTime = now
  1248. } else if queryType == "last_30day" {
  1249. beginTime = now.AddDate(0, 0, -29)
  1250. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  1251. endTime = now
  1252. } else if queryType == "current_month" {
  1253. endTime = now
  1254. beginTime = time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
  1255. } else if queryType == "monthly" {
  1256. endTime = now
  1257. beginTime = now.AddDate(0, -1, 1)
  1258. beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
  1259. } else if queryType == "current_year" {
  1260. endTime = now
  1261. beginTime = time.Date(endTime.Year(), 1, 1, 0, 0, 0, 0, now.Location())
  1262. } else if queryType == "last_month" {
  1263. lastMonthTime := now.AddDate(0, -1, 0)
  1264. beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
  1265. endTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
  1266. } else {
  1267. return now, now, fmt.Errorf("The value of type parameter is wrong.")
  1268. }
  1269. } else {
  1270. if beginTimeStr == "" || endTimeStr == "" {
  1271. //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
  1272. beginTime = recordBeginTime
  1273. endTime = now
  1274. } else {
  1275. beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
  1276. if err != nil {
  1277. return now, now, err
  1278. }
  1279. endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
  1280. if err != nil {
  1281. return now, now, err
  1282. }
  1283. }
  1284. }
  1285. if beginTime.Before(recordBeginTime) {
  1286. beginTime = recordBeginTime
  1287. }
  1288. return beginTime, endTime, nil
  1289. }