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_static.go 15 kB

4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. package models
  2. import (
  3. "fmt"
  4. "strconv"
  5. "time"
  6. "code.gitea.io/gitea/modules/log"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. "code.gitea.io/gitea/modules/util"
  9. "xorm.io/builder"
  10. )
  11. type TaskDetail struct {
  12. ID int64 `json:"ID"`
  13. JobID string `json:"JobID"`
  14. JobName string `json:"JobName"`
  15. DisplayJobName string `json:"DisplayJobName"`
  16. Status string `json:"Status"`
  17. JobType string `json:"JobType"`
  18. CreatedUnix timeutil.TimeStamp `json:"CreatedUnix"`
  19. WaitTime string `json:"WaitTime"`
  20. RunTime string `json:"RunTime"`
  21. StartTime timeutil.TimeStamp `json:"StartTime"`
  22. EndTime timeutil.TimeStamp `json:"EndTime"`
  23. ComputeResource string `json:"ComputeResource"`
  24. Type int `json:"Type"`
  25. UserName string `json:"UserName"`
  26. RepoName string `json:"RepoName"`
  27. RepoAlias string `json:"RepoAlias"`
  28. RepoID int64 `json:"RepoID"`
  29. IsDelete bool `json:"IsDelete"`
  30. CardNum int `json:"CardNum"`
  31. CardType string `json:"CardType"`
  32. CardDuration string `json:"CardDuration"`
  33. AiCenter string `json:"AiCenter"`
  34. FlavorName string `json:"FlavorName"`
  35. WorkServerNum int64 `json:"WorkServerNum"`
  36. Spec *Specification `json:"Spec"`
  37. }
  38. type CardTypeAndNum struct {
  39. CardType string `json:"CardType"`
  40. Num int `json:"Num"`
  41. ComputeResource string `json:"computeResource"`
  42. }
  43. type ResourceOverview struct {
  44. Cluster string `json:"cluster"`
  45. AiCenterName string `json:"aiCenterName"`
  46. AiCenterCode string `json:"aiCenterCode"`
  47. CardTypeAndNum []CardTypeAndNum `json:"cardTypeAndNum"`
  48. }
  49. type CloudbrainDurationStatistic struct {
  50. ID int64 `xorm:"pk autoincr"`
  51. Cluster string
  52. AiCenterCode string
  53. AiCenterName string
  54. ComputeResource string
  55. AccCardType string
  56. TotalCanUse bool
  57. DateTime string
  58. DayTime string
  59. HourTime int
  60. CardsTotalDuration int
  61. CardsTotalNum int
  62. DeletedUnix timeutil.TimeStamp `xorm:"deleted"`
  63. CreatedUnix timeutil.TimeStamp `xorm:"created"`
  64. UpdatedUnix timeutil.TimeStamp `xorm:"updated"`
  65. }
  66. type DurationStatisticOptions struct {
  67. BeginTime time.Time
  68. EndTime time.Time
  69. AiCenterCode string
  70. }
  71. type DurationRateStatistic struct {
  72. AiCenterTotalDurationStat map[string]int `json:"aiCenterTotalDurationStat"`
  73. AiCenterUsageDurationStat map[string]int `json:"aiCenterUsageDurationStat"`
  74. UsageRate map[string]float32 `json:"UsageRate"`
  75. }
  76. type ResourceDetail struct {
  77. QueueCode string
  78. Cluster string `xorm:"notnull"`
  79. AiCenterCode string
  80. AiCenterName string
  81. ComputeResource string
  82. AccCardType string
  83. CardsTotalNum int
  84. IsAutomaticSync bool
  85. // CardTypeAndNum []CardTypeAndNum `json:"cardTypeAndNum"`
  86. }
  87. // type DateCloudbrainStatistic struct {
  88. // Date string `json:"date"`
  89. // AiCenterUsageDuration map[string]int `json:"aiCenterUsageDuration"`
  90. // AiCenterTotalDuration map[string]int `json:"aiCenterTotalDuration"`
  91. // AiCenterUsageRate map[string]float64 `json:"aiCenterUsageRate"`
  92. // }
  93. type DateUsageStatistic struct {
  94. Date string `json:"date"`
  95. UsageDuration int `json:"usageDuration"`
  96. TotalDuration int `json:"totalDuration"`
  97. UsageRate float64 `json:"usageRate"`
  98. }
  99. type HourTimeStatistic struct {
  100. HourTimeUsageDuration map[string]int `json:"hourTimeUsageDuration"`
  101. HourTimeTotalDuration map[string]int `json:"hourTimeTotalDuration"`
  102. HourTimeUsageRate map[string]float64 `json:"hourTimeUsageRate"`
  103. }
  104. func GetTodayCreatorCount(beginTime time.Time, endTime time.Time) (int64, error) {
  105. countSql := "SELECT count(distinct user_id) FROM " +
  106. "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
  107. " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10)
  108. return x.SQL(countSql).Count()
  109. }
  110. func GetTodayCloudbrainCount(beginTime time.Time, endTime time.Time) (int64, error) {
  111. countSql := "SELECT count(*) FROM " +
  112. "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
  113. " and created_unix<=" + strconv.FormatInt(endTime.Unix(), 10)
  114. return x.SQL(countSql).Count()
  115. }
  116. func GetTodayRunningCount(beginTime time.Time, endTime time.Time) (int64, error) {
  117. countSql := "SELECT count(*) FROM " +
  118. "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
  119. " and created_unix<=" + strconv.FormatInt(endTime.Unix(), 10) + " and (status='" + string(JobRunning) + "'" +
  120. " or status='" + string(ModelArtsTrainJobInit) + "')"
  121. return x.SQL(countSql).Count()
  122. }
  123. func GetTodayWaitingCount(beginTime time.Time, endTime time.Time) (int64, error) {
  124. countSql := "SELECT count(*) FROM " +
  125. "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
  126. " and created_unix<=" + strconv.FormatInt(endTime.Unix(), 10) + " and status='" + string(JobWaiting) + "'"
  127. return x.SQL(countSql).Count()
  128. }
  129. func GetCreatorCount() (int64, error) {
  130. countSql := "SELECT count(distinct user_id) FROM public.cloudbrain"
  131. return x.SQL(countSql).Count()
  132. }
  133. func GetCloudbrainTypeCount() ([]map[string]string, error) {
  134. countSql := "SELECT type,count(*) num FROM public.cloudbrain group by type order by num desc"
  135. return x.QueryString(countSql)
  136. }
  137. func GetCloudbrainStatusCount() ([]map[string]string, error) {
  138. countSql := "SELECT status,count(*) num FROM public.cloudbrain group by status order by num desc"
  139. return x.QueryString(countSql)
  140. }
  141. func GetCloudbrainTpyeDurationSum() ([]map[string]string, error) {
  142. countSql := "SELECT type,sum(duration) FROM public.cloudbrain group by type order by sum(duration) desc"
  143. return x.QueryString(countSql)
  144. }
  145. func GetRecordBeginTime() ([]*CloudbrainInfo, error) {
  146. sess := x.NewSession()
  147. defer sess.Close()
  148. sess.OrderBy("cloudbrain.id ASC limit 1")
  149. cloudbrains := make([]*CloudbrainInfo, 0)
  150. if err := sess.Table(&Cloudbrain{}).Unscoped().
  151. Find(&cloudbrains); err != nil {
  152. log.Info("find error.")
  153. }
  154. return cloudbrains, nil
  155. }
  156. func GetAllStatusCloudBrain() map[string]int {
  157. sess := x.NewSession()
  158. defer sess.Close()
  159. cloudbrains := make([]*CloudbrainInfo, 0)
  160. if err := sess.Table(&Cloudbrain{}).Unscoped().
  161. Find(&cloudbrains); err != nil {
  162. log.Info("find error.")
  163. }
  164. cloudBrainStatusResult := make(map[string]int)
  165. for _, cloudbrain := range cloudbrains {
  166. if _, ok := cloudBrainStatusResult[cloudbrain.Status]; !ok {
  167. cloudBrainStatusResult[cloudbrain.Status] = 1
  168. } else {
  169. cloudBrainStatusResult[cloudbrain.Status] += 1
  170. }
  171. }
  172. return cloudBrainStatusResult
  173. }
  174. func GetWaittingTop() ([]*CloudbrainInfo, error) {
  175. sess := x.NewSession()
  176. defer sess.Close()
  177. var cond = builder.NewCond()
  178. cond = cond.And(
  179. builder.Eq{"cloudbrain.status": string(JobWaiting)},
  180. )
  181. sess.OrderBy("cloudbrain.created_unix ASC limit 10")
  182. cloudbrains := make([]*CloudbrainInfo, 0, 10)
  183. if err := sess.Table(&Cloudbrain{}).Where(cond).
  184. Find(&cloudbrains); err != nil {
  185. log.Info("find error.")
  186. }
  187. return cloudbrains, nil
  188. }
  189. func GetRunningTop() ([]*CloudbrainInfo, error) {
  190. sess := x.NewSession()
  191. defer sess.Close()
  192. var cond = builder.NewCond()
  193. cond = cond.And(
  194. builder.Eq{"cloudbrain.status": string(JobRunning)},
  195. )
  196. sess.OrderBy("cloudbrain.duration DESC limit 10")
  197. cloudbrains := make([]*CloudbrainInfo, 0, 10)
  198. if err := sess.Table(&Cloudbrain{}).Where(cond).
  199. Find(&cloudbrains); err != nil {
  200. log.Info("find error.")
  201. }
  202. return cloudbrains, nil
  203. }
  204. func getCreatePeriodCount(dateBeginTime string, dateEndTime string, hourBeginTime string, hourEndTime string) (int64, error) {
  205. countSql := "SELECT count(*) FROM " +
  206. "public.cloudbrain where to_char(to_timestamp(created_unix), 'YYYY-MM-DD') >= '" + dateBeginTime +
  207. "' and to_char(to_timestamp(created_unix), 'YYYY-MM-DD') < '" + dateEndTime +
  208. "' and to_char(to_timestamp(created_unix), 'HH24:MI:SS') >= '" + hourBeginTime +
  209. "' and to_char(to_timestamp(created_unix), 'HH24:MI:SS') < '" + hourEndTime + "'"
  210. return x.SQL(countSql).Count()
  211. }
  212. //SELECT * FROM xxx WHERE NOT ((endTime < hourBeginTime) OR (startTime > hourEndTime))
  213. func getRunPeriodCount(dateBeginTime string, dateEndTime string, hourBeginTime string, hourEndTime string) (int64, error) {
  214. countSql := "SELECT count(*) FROM " +
  215. "public.cloudbrain where not ((to_char(to_timestamp(start_time), ' HH24:MI:SS') > '" + hourEndTime +
  216. "') or (to_char(to_timestamp(end_time), 'HH24:MI:SS') < '" + hourBeginTime + "'))" +
  217. " and (to_char(to_timestamp(start_time), 'YYYY-MM-DD') >= '" + dateBeginTime +
  218. "' and to_char(to_timestamp(start_time), 'YYYY-MM-DD') < '" + dateEndTime + "')"
  219. return x.SQL(countSql).Count()
  220. }
  221. func GetCreateHourPeriodCount(dateBeginTime string, dateEndTime string) (map[string]interface{}, error) {
  222. //0 to 23 for each hour,
  223. dateHourMap := make(map[string]interface{})
  224. var slice = []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
  225. for key, value := range slice {
  226. hourBeginHour := util.AddZero(value) + ":00:00"
  227. hourEndHour := util.AddZero(value+1) + ":00:00"
  228. cout, err := getCreatePeriodCount(dateBeginTime, dateEndTime, hourBeginHour, hourEndHour)
  229. if err != nil {
  230. log.Error("Can not query getCreatePeriodCount.", err)
  231. return nil, nil
  232. }
  233. dateHourMap[strconv.Itoa(key)] = cout
  234. }
  235. return dateHourMap, nil
  236. }
  237. func GetRunHourPeriodCount(dateBeginTime string, dateEndTime string) (map[string]interface{}, error) {
  238. dateHourMap := make(map[string]interface{})
  239. var slice = []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
  240. for key, value := range slice {
  241. hourBeginHour := util.AddZero(value) + ":00:00"
  242. hourEndHour := util.AddZero(value+1) + ":00:00"
  243. cout, err := getRunPeriodCount(dateBeginTime, dateEndTime, hourBeginHour, hourEndHour)
  244. if err != nil {
  245. log.Error("Can not query getRunPeriodCount.", err)
  246. return nil, nil
  247. }
  248. dateHourMap[strconv.Itoa(key)] = cout
  249. }
  250. return dateHourMap, nil
  251. }
  252. func GetCloudbrainRunning() ([]*CloudbrainInfo, error) {
  253. sess := x.NewSession()
  254. defer sess.Close()
  255. var cond = builder.NewCond()
  256. cond = cond.And(
  257. builder.Eq{"cloudbrain.status": string(JobRunning)},
  258. )
  259. sess.OrderBy("cloudbrain.created_unix ASC")
  260. cloudbrains := make([]*CloudbrainInfo, 0, 10)
  261. if err := sess.Table(&Cloudbrain{}).Where(cond).
  262. Find(&cloudbrains); err != nil {
  263. log.Info("find error.")
  264. }
  265. return cloudbrains, nil
  266. }
  267. func GetCloudbrainCompleteByTime(beginTime int64, endTime int64) ([]*CloudbrainInfo, error) {
  268. sess := x.NewSession()
  269. defer sess.Close()
  270. var cond = builder.NewCond()
  271. cond = cond.And(
  272. builder.And(builder.Gte{"cloudbrain.end_time": beginTime}, builder.Lte{"cloudbrain.end_time": endTime}),
  273. )
  274. sess.OrderBy("cloudbrain.created_unix ASC")
  275. cloudbrains := make([]*CloudbrainInfo, 0, 10)
  276. if err := sess.Table(&Cloudbrain{}).Unscoped().Where(cond).
  277. Find(&cloudbrains); err != nil {
  278. log.Info("find error.")
  279. }
  280. return cloudbrains, nil
  281. }
  282. func GetSpecByAiCenterCodeAndType(aiCenterCode string, accCardType string) ([]*CloudbrainSpec, error) {
  283. sess := x.NewSession()
  284. defer sess.Close()
  285. var cond = builder.NewCond()
  286. cond = cond.And(
  287. builder.And(builder.Eq{"cloudbrain_spec.ai_center_code": aiCenterCode}, builder.Eq{"cloudbrain_spec.acc_card_type": accCardType}),
  288. )
  289. cloudbrainSpecs := make([]*CloudbrainSpec, 0, 10)
  290. if err := sess.Table(&CloudbrainSpec{}).Where(cond).
  291. Find(&cloudbrainSpecs); err != nil {
  292. log.Info("find error.")
  293. }
  294. return cloudbrainSpecs, nil
  295. }
  296. func InsertCloudbrainDurationStatistic(cloudbrainDurationStatistic *CloudbrainDurationStatistic) (int64, error) {
  297. return xStatistic.Insert(cloudbrainDurationStatistic)
  298. }
  299. func DeleteCloudbrainDurationStatisticHour(date string, hour int, aiCenterCode string, accCardType string, totalCanUse bool) error {
  300. sess := xStatistic.NewSession()
  301. defer sess.Close()
  302. if err := sess.Begin(); err != nil {
  303. return fmt.Errorf("Begin: %v", err)
  304. }
  305. if _, err := sess.Where("day_time = ? AND hour_time = ? AND ai_center_code = ? AND acc_card_type = ? And total_can_use = ?", date, hour, aiCenterCode, accCardType, totalCanUse).Delete(&CloudbrainDurationStatistic{}); err != nil {
  306. return fmt.Errorf("Delete: %v", err)
  307. }
  308. if err := sess.Commit(); err != nil {
  309. sess.Close()
  310. return fmt.Errorf("Commit: %v", err)
  311. }
  312. sess.Close()
  313. return nil
  314. }
  315. func GetCanUseCardInfo() ([]*ResourceQueue, error) {
  316. sess := x.NewSession()
  317. defer sess.Close()
  318. // var cond = builder.NewCond()
  319. // cond = cond.And(
  320. // builder.And(builder.Eq{"resource_queue.is_automatic_sync": false}),
  321. // )
  322. sess.OrderBy("resource_queue.id ASC")
  323. ResourceQueues := make([]*ResourceQueue, 0, 10)
  324. if err := sess.Table(&ResourceQueue{}).Find(&ResourceQueues); err != nil {
  325. log.Info("find error.")
  326. }
  327. return ResourceQueues, nil
  328. // Cols("queue_code", "cluster", "ai_center_name", "ai_center_code", "compute_resource", "acc_card_type", "cards_total_num")
  329. // sess := x.NewSession()
  330. // defer sess.Close()
  331. // sess.OrderBy("resource_queue.id ASC limit 1")
  332. // cloudbrains := make([]*CloudbrainInfo, 0)
  333. // if err := sess.Table(&Cloudbrain{}).Unscoped().
  334. // Find(&cloudbrains); err != nil {
  335. // log.Info("find error.")
  336. // }
  337. // return cloudbrains, nil
  338. }
  339. func GetCardDurationStatistics(opts *DurationStatisticOptions) ([]*CloudbrainDurationStatistic, error) {
  340. sess := xStatistic.NewSession()
  341. defer sess.Close()
  342. var cond = builder.NewCond()
  343. if opts.BeginTime.Unix() > 0 && opts.EndTime.Unix() > 0 {
  344. cond = cond.And(
  345. builder.And(builder.Gte{"cloudbrain_duration_statistic.created_unix": opts.BeginTime.Unix()}, builder.Lte{"cloudbrain_duration_statistic.created_unix": opts.EndTime.Unix()}),
  346. )
  347. }
  348. if opts.AiCenterCode != "" {
  349. cond = cond.And(
  350. builder.Eq{"cloudbrain_duration_statistic.ai_center_code": opts.AiCenterCode},
  351. )
  352. }
  353. CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0, 10)
  354. if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).
  355. Find(&CloudbrainDurationStatistics); err != nil {
  356. log.Info("find error.")
  357. }
  358. return CloudbrainDurationStatistics, nil
  359. }
  360. func GetDurationRecordBeginTime() ([]*CloudbrainDurationStatistic, error) {
  361. sess := xStatistic.NewSession()
  362. defer sess.Close()
  363. sess.OrderBy("cloudbrain_duration_statistic.id ASC limit 1")
  364. CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0)
  365. if err := sess.Table(&CloudbrainDurationStatistic{}).Find(&CloudbrainDurationStatistics); err != nil {
  366. log.Info("find error.")
  367. }
  368. return CloudbrainDurationStatistics, nil
  369. }