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.1 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  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. }
  70. }
  71. return q
  72. }
  73. type SearchResourceQueueOptions struct {
  74. ListOptions
  75. Cluster string
  76. AiCenterCode string
  77. ComputeResource string
  78. AccCardType string
  79. }
  80. type ResourceQueueListRes struct {
  81. TotalSize int64
  82. List []*ResourceQueueRes
  83. }
  84. type ResourceQueueCodesRes struct {
  85. ID int64
  86. QueueCode string
  87. Cluster string
  88. AiCenterCode string
  89. AiCenterName string
  90. }
  91. func (ResourceQueueCodesRes) TableName() string {
  92. return "resource_queue"
  93. }
  94. type ResourceAiCenterRes struct {
  95. AiCenterCode string
  96. AiCenterName string
  97. }
  98. type GetQueueCodesOptions struct {
  99. Cluster string
  100. }
  101. func NewResourceQueueListRes(totalSize int64, list []ResourceQueue) *ResourceQueueListRes {
  102. resList := make([]*ResourceQueueRes, len(list))
  103. for i, v := range list {
  104. resList[i] = v.ConvertToRes()
  105. }
  106. return &ResourceQueueListRes{
  107. TotalSize: totalSize,
  108. List: resList,
  109. }
  110. }
  111. type ResourceQueueRes struct {
  112. ID int64
  113. QueueCode string
  114. Cluster string
  115. AiCenterCode string
  116. AiCenterName string
  117. ComputeResource string
  118. AccCardType string
  119. CardsTotalNum int
  120. UpdatedTime timeutil.TimeStamp
  121. Remark string
  122. }
  123. func InsertResourceQueue(queue ResourceQueue) (int64, error) {
  124. return x.Insert(&queue)
  125. }
  126. func UpdateResourceQueueById(queueId int64, queue ResourceQueue) (int64, error) {
  127. return x.ID(queueId).Update(&queue)
  128. }
  129. func SearchResourceQueue(opts SearchResourceQueueOptions) (int64, []ResourceQueue, error) {
  130. var cond = builder.NewCond()
  131. if opts.Page <= 0 {
  132. opts.Page = 1
  133. }
  134. if opts.Cluster != "" {
  135. cond = cond.And(builder.Eq{"cluster": opts.Cluster})
  136. }
  137. if opts.AiCenterCode != "" {
  138. cond = cond.And(builder.Eq{"ai_center_code": opts.AiCenterCode})
  139. }
  140. if opts.ComputeResource != "" {
  141. cond = cond.And(builder.Eq{"compute_resource": opts.ComputeResource})
  142. }
  143. if opts.AccCardType != "" {
  144. cond = cond.And(builder.Eq{"acc_card_type": opts.AccCardType})
  145. }
  146. n, err := x.Where(cond).Unscoped().Count(&ResourceQueue{})
  147. if err != nil {
  148. return 0, nil, err
  149. }
  150. r := make([]ResourceQueue, 0)
  151. err = x.Where(cond).Desc("id").Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Unscoped().Find(&r)
  152. if err != nil {
  153. return 0, nil, err
  154. }
  155. return n, r, nil
  156. }
  157. func GetResourceQueueCodes(opts GetQueueCodesOptions) ([]*ResourceQueueCodesRes, error) {
  158. cond := builder.NewCond()
  159. if opts.Cluster != "" {
  160. cond = cond.And(builder.Eq{"cluster": opts.Cluster})
  161. }
  162. cond = cond.And(builder.Or(builder.IsNull{"deleted_time"}, builder.Eq{"deleted_time": 0}))
  163. r := make([]*ResourceQueueCodesRes, 0)
  164. err := x.Where(cond).OrderBy("cluster desc,ai_center_code asc").Find(&r)
  165. if err != nil {
  166. return nil, err
  167. }
  168. return r, nil
  169. }
  170. func GetResourceQueue(r *ResourceQueue) (*ResourceQueue, error) {
  171. has, err := x.Get(r)
  172. if err != nil {
  173. return nil, err
  174. } else if !has {
  175. return nil, nil
  176. }
  177. return r, nil
  178. }
  179. func ParseComputeResourceFormGrampus(grampusDeviceKind string) string {
  180. t := strings.Split(grampusDeviceKind, "/")
  181. if len(t) < 2 {
  182. return ""
  183. }
  184. return strings.ToUpper(t[1])
  185. }
  186. type MemSize struct {
  187. Sizes []string
  188. Hex int
  189. }
  190. var memSize = MemSize{Sizes: []string{"K", "M", "G", "T", "P", "E"}, Hex: 1000}
  191. var iMemSize = MemSize{Sizes: []string{"Ki", "Mi", "Gi", "Ti", "Pi", "Ei"}, Hex: 1024}
  192. func MatchMemSize(memSize MemSize, val string) (int, float32, error) {
  193. for i, v := range memSize.Sizes {
  194. if strings.HasSuffix(val, v) {
  195. s := strings.TrimSuffix(val, v)
  196. f, err := strconv.ParseFloat(s, 32)
  197. if err != nil {
  198. return 0, 0, err
  199. }
  200. return i, float32(f), nil
  201. }
  202. }
  203. return -1, 0, nil
  204. }
  205. //TransferMemSize transfer oldValue format from old index to new index
  206. //eg: memSize.Sizes = []string{"M", "G", "T", "P", "E"}, oldValue = 10 , oldIndex = 1 , newIndex = 0. it means transfer 10G to 10000M
  207. //so it returns 10000
  208. func TransferMemSize(memSize MemSize, oldValue float32, oldIndex int, newIndex int) float32 {
  209. diff := oldIndex - newIndex
  210. r := oldValue
  211. if diff > 0 {
  212. r = oldValue * float32(diff) * float32(memSize.Hex)
  213. } else if diff < 0 {
  214. r = oldValue / float32(-1*diff) / float32(memSize.Hex)
  215. }
  216. return r
  217. }
  218. //ParseMemSize find the memSize which matches value's format,and parse the number from value
  219. func ParseMemSize(value string, memSize MemSize, newIndex int) (bool, float32, error) {
  220. index, r, err := MatchMemSize(memSize, value)
  221. if err != nil {
  222. return false, 0, err
  223. }
  224. if index < 0 {
  225. return false, 0, nil
  226. }
  227. return true, TransferMemSize(memSize, r, index, newIndex), nil
  228. }
  229. func ParseMemSizeFromGrampus(grampusMemSize string) (float32, error) {
  230. if grampusMemSize == "" {
  231. return 0, nil
  232. }
  233. memflag, memResult, err := ParseMemSize(grampusMemSize, memSize, 2)
  234. if err != nil {
  235. return 0, err
  236. }
  237. if memflag {
  238. return memResult, nil
  239. }
  240. iMemFlag, imemResult, err := ParseMemSize(grampusMemSize, iMemSize, 2)
  241. if err != nil {
  242. return 0, err
  243. }
  244. if iMemFlag {
  245. return imemResult, nil
  246. }
  247. return 0, errors.New("grampus memSize format error")
  248. }
  249. func SyncGrampusQueues(updateList []ResourceQueue, insertList []ResourceQueue, existIds []int64) error {
  250. sess := x.NewSession()
  251. var err error
  252. defer func() {
  253. if err != nil {
  254. sess.Rollback()
  255. }
  256. sess.Close()
  257. }()
  258. //delete queues that no longer exists
  259. deleteQueueIds := make([]int64, 0)
  260. queueCond := builder.NewCond()
  261. queueCond = queueCond.And(builder.NotIn("resource_queue.id", existIds)).And(builder.Eq{"resource_queue.cluster": C2NetCluster})
  262. if err := sess.Cols("resource_queue.id").Table("resource_queue").
  263. Where(queueCond).Find(&deleteQueueIds); err != nil {
  264. return err
  265. }
  266. if len(deleteQueueIds) > 0 {
  267. if _, err = sess.In("id", deleteQueueIds).Update(&ResourceQueue{Remark: "自动同步时被下架"}); err != nil {
  268. return err
  269. }
  270. if _, err = sess.In("id", deleteQueueIds).Delete(&ResourceQueue{}); err != nil {
  271. return err
  272. }
  273. //delete specs and scene that no longer exists
  274. deleteSpcIds := make([]int64, 0)
  275. if err := sess.Cols("resource_specification.id").Table("resource_specification").
  276. In("queue_id", deleteQueueIds).Find(&deleteSpcIds); err != nil {
  277. return err
  278. }
  279. if len(deleteSpcIds) > 0 {
  280. if _, err = sess.In("id", deleteSpcIds).Update(&ResourceSpecification{Status: SpecOffShelf}); err != nil {
  281. return err
  282. }
  283. if _, err = sess.In("spec_id", deleteSpcIds).Delete(&ResourceSceneSpec{}); err != nil {
  284. return err
  285. }
  286. }
  287. }
  288. //update exists specs
  289. if len(updateList) > 0 {
  290. for _, v := range updateList {
  291. if _, err = sess.ID(v.ID).Update(&v); err != nil {
  292. return err
  293. }
  294. }
  295. }
  296. //insert new specs
  297. if len(insertList) > 0 {
  298. if _, err = sess.Insert(insertList); err != nil {
  299. return err
  300. }
  301. }
  302. return sess.Commit()
  303. }
  304. func GetResourceAiCenters() ([]ResourceAiCenterRes, error) {
  305. r := make([]ResourceAiCenterRes, 0)
  306. 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)
  307. if err != nil {
  308. return nil, err
  309. }
  310. return r, nil
  311. }