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.

resource_queue.go 9.2 kB

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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. package models
  2. import (
  3. "code.gitea.io/gitea/modules/timeutil"
  4. "errors"
  5. "strconv"
  6. "strings"
  7. "xorm.io/builder"
  8. )
  9. type ResourceQueue struct {
  10. ID int64 `xorm:"pk autoincr"`
  11. QueueCode string
  12. Cluster string `xorm:"notnull"`
  13. AiCenterCode string
  14. AiCenterName string
  15. ComputeResource string
  16. AccCardType string
  17. CardsTotalNum int
  18. IsAutomaticSync bool
  19. Remark string
  20. DeletedTime timeutil.TimeStamp `xorm:"deleted"`
  21. CreatedTime timeutil.TimeStamp `xorm:"created"`
  22. CreatedBy int64
  23. UpdatedTime timeutil.TimeStamp `xorm:"updated"`
  24. UpdatedBy int64
  25. }
  26. func (r ResourceQueue) ConvertToRes() *ResourceQueueRes {
  27. return &ResourceQueueRes{
  28. ID: r.ID,
  29. QueueCode: r.QueueCode,
  30. Cluster: r.Cluster,
  31. AiCenterCode: r.AiCenterCode,
  32. AiCenterName: r.AiCenterName,
  33. ComputeResource: r.ComputeResource,
  34. AccCardType: r.AccCardType,
  35. CardsTotalNum: r.CardsTotalNum,
  36. UpdatedTime: r.UpdatedTime,
  37. Remark: r.Remark,
  38. }
  39. }
  40. type ResourceQueueReq struct {
  41. QueueCode string
  42. Cluster string `binding:"Required"`
  43. AiCenterCode string
  44. ComputeResource string `binding:"Required"`
  45. AccCardType string `binding:"Required"`
  46. CardsTotalNum int
  47. CreatorId int64
  48. IsAutomaticSync bool
  49. Remark string
  50. }
  51. func (r ResourceQueueReq) ToDTO() ResourceQueue {
  52. q := ResourceQueue{
  53. QueueCode: r.QueueCode,
  54. Cluster: r.Cluster,
  55. AiCenterCode: r.AiCenterCode,
  56. ComputeResource: strings.ToUpper(r.ComputeResource),
  57. AccCardType: strings.ToUpper(r.AccCardType),
  58. CardsTotalNum: r.CardsTotalNum,
  59. IsAutomaticSync: r.IsAutomaticSync,
  60. Remark: r.Remark,
  61. CreatedBy: r.CreatorId,
  62. UpdatedBy: r.CreatorId,
  63. }
  64. if r.Cluster == OpenICluster {
  65. if r.AiCenterCode == AICenterOfCloudBrainOne {
  66. q.AiCenterName = "云脑一"
  67. } else if r.AiCenterCode == AICenterOfCloudBrainTwo {
  68. q.AiCenterName = "云脑二"
  69. } else if r.AiCenterCode == AICenterOfChengdu {
  70. q.AiCenterName = "启智成都智算"
  71. }
  72. }
  73. return q
  74. }
  75. type SearchResourceQueueOptions struct {
  76. ListOptions
  77. Cluster string
  78. AiCenterCode string
  79. ComputeResource string
  80. AccCardType string
  81. }
  82. type ResourceQueueListRes struct {
  83. TotalSize int64
  84. List []*ResourceQueueRes
  85. }
  86. type ResourceQueueCodesRes struct {
  87. ID int64
  88. QueueCode string
  89. Cluster string
  90. AiCenterCode string
  91. AiCenterName string
  92. }
  93. func (ResourceQueueCodesRes) TableName() string {
  94. return "resource_queue"
  95. }
  96. type ResourceAiCenterRes struct {
  97. AiCenterCode string
  98. AiCenterName string
  99. }
  100. type GetQueueCodesOptions struct {
  101. Cluster string
  102. }
  103. func NewResourceQueueListRes(totalSize int64, list []ResourceQueue) *ResourceQueueListRes {
  104. resList := make([]*ResourceQueueRes, len(list))
  105. for i, v := range list {
  106. resList[i] = v.ConvertToRes()
  107. }
  108. return &ResourceQueueListRes{
  109. TotalSize: totalSize,
  110. List: resList,
  111. }
  112. }
  113. type ResourceQueueRes struct {
  114. ID int64
  115. QueueCode string
  116. Cluster string
  117. AiCenterCode string
  118. AiCenterName string
  119. ComputeResource string
  120. AccCardType string
  121. CardsTotalNum int
  122. UpdatedTime timeutil.TimeStamp
  123. Remark string
  124. }
  125. func InsertResourceQueue(queue ResourceQueue) (int64, error) {
  126. return x.Insert(&queue)
  127. }
  128. func UpdateResourceQueueById(queueId int64, queue ResourceQueue) (int64, error) {
  129. return x.ID(queueId).Update(&queue)
  130. }
  131. func UpdateResourceCardsTotalNum(queueId int64, queue ResourceQueue) (int64, error) {
  132. return x.ID(queueId).Cols("cards_total_num", "remark").Update(&queue)
  133. }
  134. func SearchResourceQueue(opts SearchResourceQueueOptions) (int64, []ResourceQueue, error) {
  135. var cond = builder.NewCond()
  136. if opts.Page <= 0 {
  137. opts.Page = 1
  138. }
  139. if opts.Cluster != "" {
  140. cond = cond.And(builder.Eq{"cluster": opts.Cluster})
  141. }
  142. if opts.AiCenterCode != "" {
  143. cond = cond.And(builder.Eq{"ai_center_code": opts.AiCenterCode})
  144. }
  145. if opts.ComputeResource != "" {
  146. cond = cond.And(builder.Eq{"compute_resource": opts.ComputeResource})
  147. }
  148. if opts.AccCardType != "" {
  149. cond = cond.And(builder.Eq{"acc_card_type": opts.AccCardType})
  150. }
  151. n, err := x.Where(cond).Unscoped().Count(&ResourceQueue{})
  152. if err != nil {
  153. return 0, nil, err
  154. }
  155. r := make([]ResourceQueue, 0)
  156. err = x.Where(cond).Desc("id").Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Unscoped().Find(&r)
  157. if err != nil {
  158. return 0, nil, err
  159. }
  160. return n, r, nil
  161. }
  162. func GetResourceQueueCodes(opts GetQueueCodesOptions) ([]*ResourceQueueCodesRes, error) {
  163. cond := builder.NewCond()
  164. if opts.Cluster != "" {
  165. cond = cond.And(builder.Eq{"cluster": opts.Cluster})
  166. }
  167. cond = cond.And(builder.Or(builder.IsNull{"deleted_time"}, builder.Eq{"deleted_time": 0}))
  168. r := make([]*ResourceQueueCodesRes, 0)
  169. err := x.Where(cond).OrderBy("cluster desc,ai_center_code asc").Find(&r)
  170. if err != nil {
  171. return nil, err
  172. }
  173. return r, nil
  174. }
  175. func GetResourceQueue(r *ResourceQueue) (*ResourceQueue, error) {
  176. has, err := x.Get(r)
  177. if err != nil {
  178. return nil, err
  179. } else if !has {
  180. return nil, nil
  181. }
  182. return r, nil
  183. }
  184. func ParseComputeResourceFormGrampus(grampusDeviceKind string) string {
  185. t := strings.Split(grampusDeviceKind, "/")
  186. if len(t) < 2 {
  187. return ""
  188. }
  189. return strings.ToUpper(t[1])
  190. }
  191. type MemSize struct {
  192. Sizes []string
  193. Hex int
  194. }
  195. var memSize = MemSize{Sizes: []string{"K", "M", "G", "T", "P", "E"}, Hex: 1000}
  196. var iMemSize = MemSize{Sizes: []string{"Ki", "Mi", "Gi", "Ti", "Pi", "Ei"}, Hex: 1024}
  197. func MatchMemSize(memSize MemSize, val string) (int, float32, error) {
  198. for i, v := range memSize.Sizes {
  199. if strings.HasSuffix(val, v) {
  200. s := strings.TrimSuffix(val, v)
  201. f, err := strconv.ParseFloat(s, 32)
  202. if err != nil {
  203. return 0, 0, err
  204. }
  205. return i, float32(f), nil
  206. }
  207. }
  208. return -1, 0, nil
  209. }
  210. //TransferMemSize transfer oldValue format from old index to new index
  211. //eg: memSize.Sizes = []string{"M", "G", "T", "P", "E"}, oldValue = 10 , oldIndex = 1 , newIndex = 0. it means transfer 10G to 10000M
  212. //so it returns 10000
  213. func TransferMemSize(memSize MemSize, oldValue float32, oldIndex int, newIndex int) float32 {
  214. diff := oldIndex - newIndex
  215. r := oldValue
  216. if diff > 0 {
  217. r = oldValue * float32(diff) * float32(memSize.Hex)
  218. } else if diff < 0 {
  219. r = oldValue / float32(-1*diff) / float32(memSize.Hex)
  220. }
  221. return r
  222. }
  223. //ParseMemSize find the memSize which matches value's format,and parse the number from value
  224. func ParseMemSize(value string, memSize MemSize, newIndex int) (bool, float32, error) {
  225. index, r, err := MatchMemSize(memSize, value)
  226. if err != nil {
  227. return false, 0, err
  228. }
  229. if index < 0 {
  230. return false, 0, nil
  231. }
  232. return true, TransferMemSize(memSize, r, index, newIndex), nil
  233. }
  234. func ParseMemSizeFromGrampus(grampusMemSize string) (float32, error) {
  235. if grampusMemSize == "" {
  236. return 0, nil
  237. }
  238. memflag, memResult, err := ParseMemSize(grampusMemSize, memSize, 2)
  239. if err != nil {
  240. return 0, err
  241. }
  242. if memflag {
  243. return memResult, nil
  244. }
  245. iMemFlag, imemResult, err := ParseMemSize(grampusMemSize, iMemSize, 2)
  246. if err != nil {
  247. return 0, err
  248. }
  249. if iMemFlag {
  250. return imemResult, nil
  251. }
  252. return 0, errors.New("grampus memSize format error")
  253. }
  254. func SyncGrampusQueues(updateList []ResourceQueue, insertList []ResourceQueue, existIds []int64) error {
  255. sess := x.NewSession()
  256. var err error
  257. defer func() {
  258. if err != nil {
  259. sess.Rollback()
  260. }
  261. sess.Close()
  262. }()
  263. //delete queues that no longer exists
  264. deleteQueueIds := make([]int64, 0)
  265. queueCond := builder.NewCond()
  266. queueCond = queueCond.And(builder.NotIn("resource_queue.id", existIds)).And(builder.Eq{"resource_queue.cluster": C2NetCluster})
  267. if err := sess.Cols("resource_queue.id").Table("resource_queue").
  268. Where(queueCond).Find(&deleteQueueIds); err != nil {
  269. return err
  270. }
  271. if len(deleteQueueIds) > 0 {
  272. if _, err = sess.In("id", deleteQueueIds).Update(&ResourceQueue{Remark: "自动同步时被下架"}); err != nil {
  273. return err
  274. }
  275. if _, err = sess.In("id", deleteQueueIds).Delete(&ResourceQueue{}); err != nil {
  276. return err
  277. }
  278. //delete specs and scene that no longer exists
  279. deleteSpcIds := make([]int64, 0)
  280. if err := sess.Cols("resource_specification.id").Table("resource_specification").
  281. In("queue_id", deleteQueueIds).Find(&deleteSpcIds); err != nil {
  282. return err
  283. }
  284. if len(deleteSpcIds) > 0 {
  285. if _, err = sess.In("id", deleteSpcIds).Update(&ResourceSpecification{Status: SpecOffShelf}); err != nil {
  286. return err
  287. }
  288. }
  289. }
  290. //update exists specs
  291. if len(updateList) > 0 {
  292. for _, v := range updateList {
  293. if _, err = sess.ID(v.ID).Update(&v); err != nil {
  294. return err
  295. }
  296. }
  297. }
  298. //insert new specs
  299. if len(insertList) > 0 {
  300. if _, err = sess.Insert(insertList); err != nil {
  301. return err
  302. }
  303. }
  304. return sess.Commit()
  305. }
  306. func GetResourceAiCenters() ([]ResourceAiCenterRes, error) {
  307. r := make([]ResourceAiCenterRes, 0)
  308. err := x.SQL("SELECT t.ai_center_code, t.ai_center_name FROM (SELECT DISTINCT ai_center_code, ai_center_name,cluster FROM resource_queue WHERE (deleted_time IS NULL OR deleted_time=0)) t ORDER BY cluster desc,ai_center_code asc").Find(&r)
  309. if err != nil {
  310. return nil, err
  311. }
  312. return r, nil
  313. }