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