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