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
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 SearchResourceQueue(opts SearchResourceQueueOptions) (int64, []ResourceQueue, error) {
  132. var cond = builder.NewCond()
  133. if opts.Page <= 0 {
  134. opts.Page = 1
  135. }
  136. if opts.Cluster != "" {
  137. cond = cond.And(builder.Eq{"cluster": opts.Cluster})
  138. }
  139. if opts.AiCenterCode != "" {
  140. cond = cond.And(builder.Eq{"ai_center_code": opts.AiCenterCode})
  141. }
  142. if opts.ComputeResource != "" {
  143. cond = cond.And(builder.Eq{"compute_resource": opts.ComputeResource})
  144. }
  145. if opts.AccCardType != "" {
  146. cond = cond.And(builder.Eq{"acc_card_type": opts.AccCardType})
  147. }
  148. n, err := x.Where(cond).Unscoped().Count(&ResourceQueue{})
  149. if err != nil {
  150. return 0, nil, err
  151. }
  152. r := make([]ResourceQueue, 0)
  153. err = x.Where(cond).Desc("id").Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Unscoped().Find(&r)
  154. if err != nil {
  155. return 0, nil, err
  156. }
  157. return n, r, nil
  158. }
  159. func GetResourceQueueCodes(opts GetQueueCodesOptions) ([]*ResourceQueueCodesRes, error) {
  160. cond := builder.NewCond()
  161. if opts.Cluster != "" {
  162. cond = cond.And(builder.Eq{"cluster": opts.Cluster})
  163. }
  164. cond = cond.And(builder.Or(builder.IsNull{"deleted_time"}, builder.Eq{"deleted_time": 0}))
  165. r := make([]*ResourceQueueCodesRes, 0)
  166. err := x.Where(cond).OrderBy("cluster desc,ai_center_code asc").Find(&r)
  167. if err != nil {
  168. return nil, err
  169. }
  170. return r, nil
  171. }
  172. func GetResourceQueue(r *ResourceQueue) (*ResourceQueue, error) {
  173. has, err := x.Get(r)
  174. if err != nil {
  175. return nil, err
  176. } else if !has {
  177. return nil, nil
  178. }
  179. return r, nil
  180. }
  181. func ParseComputeResourceFormGrampus(grampusDeviceKind string) string {
  182. t := strings.Split(grampusDeviceKind, "/")
  183. if len(t) < 2 {
  184. return ""
  185. }
  186. return strings.ToUpper(t[1])
  187. }
  188. type MemSize struct {
  189. Sizes []string
  190. Hex int
  191. }
  192. var memSize = MemSize{Sizes: []string{"K", "M", "G", "T", "P", "E"}, Hex: 1000}
  193. var iMemSize = MemSize{Sizes: []string{"Ki", "Mi", "Gi", "Ti", "Pi", "Ei"}, Hex: 1024}
  194. func MatchMemSize(memSize MemSize, val string) (int, float32, error) {
  195. for i, v := range memSize.Sizes {
  196. if strings.HasSuffix(val, v) {
  197. s := strings.TrimSuffix(val, v)
  198. f, err := strconv.ParseFloat(s, 32)
  199. if err != nil {
  200. return 0, 0, err
  201. }
  202. return i, float32(f), nil
  203. }
  204. }
  205. return -1, 0, nil
  206. }
  207. //TransferMemSize transfer oldValue format from old index to new index
  208. //eg: memSize.Sizes = []string{"M", "G", "T", "P", "E"}, oldValue = 10 , oldIndex = 1 , newIndex = 0. it means transfer 10G to 10000M
  209. //so it returns 10000
  210. func TransferMemSize(memSize MemSize, oldValue float32, oldIndex int, newIndex int) float32 {
  211. diff := oldIndex - newIndex
  212. r := oldValue
  213. if diff > 0 {
  214. r = oldValue * float32(diff) * float32(memSize.Hex)
  215. } else if diff < 0 {
  216. r = oldValue / float32(-1*diff) / float32(memSize.Hex)
  217. }
  218. return r
  219. }
  220. //ParseMemSize find the memSize which matches value's format,and parse the number from value
  221. func ParseMemSize(value string, memSize MemSize, newIndex int) (bool, float32, error) {
  222. index, r, err := MatchMemSize(memSize, value)
  223. if err != nil {
  224. return false, 0, err
  225. }
  226. if index < 0 {
  227. return false, 0, nil
  228. }
  229. return true, TransferMemSize(memSize, r, index, newIndex), nil
  230. }
  231. func ParseMemSizeFromGrampus(grampusMemSize string) (float32, error) {
  232. if grampusMemSize == "" {
  233. return 0, nil
  234. }
  235. memflag, memResult, err := ParseMemSize(grampusMemSize, memSize, 2)
  236. if err != nil {
  237. return 0, err
  238. }
  239. if memflag {
  240. return memResult, nil
  241. }
  242. iMemFlag, imemResult, err := ParseMemSize(grampusMemSize, iMemSize, 2)
  243. if err != nil {
  244. return 0, err
  245. }
  246. if iMemFlag {
  247. return imemResult, nil
  248. }
  249. return 0, errors.New("grampus memSize format error")
  250. }
  251. func SyncGrampusQueues(updateList []ResourceQueue, insertList []ResourceQueue, existIds []int64) error {
  252. sess := x.NewSession()
  253. var err error
  254. defer func() {
  255. if err != nil {
  256. sess.Rollback()
  257. }
  258. sess.Close()
  259. }()
  260. //delete queues that no longer exists
  261. deleteQueueIds := make([]int64, 0)
  262. queueCond := builder.NewCond()
  263. queueCond = queueCond.And(builder.NotIn("resource_queue.id", existIds)).And(builder.Eq{"resource_queue.cluster": C2NetCluster})
  264. if err := sess.Cols("resource_queue.id").Table("resource_queue").
  265. Where(queueCond).Find(&deleteQueueIds); err != nil {
  266. return err
  267. }
  268. if len(deleteQueueIds) > 0 {
  269. if _, err = sess.In("id", deleteQueueIds).Update(&ResourceQueue{Remark: "自动同步时被下架"}); err != nil {
  270. return err
  271. }
  272. if _, err = sess.In("id", deleteQueueIds).Delete(&ResourceQueue{}); err != nil {
  273. return err
  274. }
  275. //delete specs and scene that no longer exists
  276. deleteSpcIds := make([]int64, 0)
  277. if err := sess.Cols("resource_specification.id").Table("resource_specification").
  278. In("queue_id", deleteQueueIds).Find(&deleteSpcIds); err != nil {
  279. return err
  280. }
  281. if len(deleteSpcIds) > 0 {
  282. if _, err = sess.In("id", deleteSpcIds).Update(&ResourceSpecification{Status: SpecOffShelf}); err != nil {
  283. return err
  284. }
  285. if _, err = sess.In("spec_id", deleteSpcIds).Delete(&ResourceSceneSpec{}); 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. }