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_specification.go 7.5 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
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. package models
  2. import (
  3. "code.gitea.io/gitea/modules/timeutil"
  4. "xorm.io/builder"
  5. )
  6. const (
  7. SpecNotVerified int = iota + 1
  8. SpecOnShelf
  9. SpecOffShelf
  10. )
  11. type ResourceSpecification struct {
  12. ID int64 `xorm:"pk autoincr"`
  13. QueueId int64 `xorm:"INDEX"`
  14. SourceSpecId string `xorm:"INDEX"`
  15. AccCardsNum int
  16. CpuCores int
  17. MemGiB float32
  18. GPUMemGiB float32
  19. ShareMemGiB float32
  20. UnitPrice int
  21. Status int
  22. IsAutomaticSync bool
  23. CreatedTime timeutil.TimeStamp `xorm:"created"`
  24. CreatedBy int64
  25. UpdatedTime timeutil.TimeStamp `xorm:"updated"`
  26. UpdatedBy int64
  27. }
  28. func (r ResourceSpecification) ConvertToRes() *ResourceSpecificationRes {
  29. return &ResourceSpecificationRes{
  30. ID: r.ID,
  31. SourceSpecId: r.SourceSpecId,
  32. AccCardsNum: r.AccCardsNum,
  33. CpuCores: r.CpuCores,
  34. MemGiB: r.MemGiB,
  35. ShareMemGiB: r.ShareMemGiB,
  36. GPUMemGiB: r.GPUMemGiB,
  37. UnitPrice: r.UnitPrice,
  38. Status: r.Status,
  39. UpdatedTime: r.UpdatedTime,
  40. }
  41. }
  42. type ResourceSpecificationReq struct {
  43. QueueId int64 `binding:"Required"`
  44. SourceSpecId string
  45. AccCardsNum int
  46. CpuCores int
  47. MemGiB float32
  48. GPUMemGiB float32
  49. ShareMemGiB float32
  50. UnitPrice int
  51. Status int
  52. IsAutomaticSync bool
  53. CreatorId int64
  54. }
  55. func (r ResourceSpecificationReq) ToDTO() ResourceSpecification {
  56. return ResourceSpecification{
  57. QueueId: r.QueueId,
  58. SourceSpecId: r.SourceSpecId,
  59. AccCardsNum: r.AccCardsNum,
  60. CpuCores: r.CpuCores,
  61. MemGiB: r.MemGiB,
  62. GPUMemGiB: r.GPUMemGiB,
  63. ShareMemGiB: r.ShareMemGiB,
  64. UnitPrice: r.UnitPrice,
  65. Status: r.Status,
  66. IsAutomaticSync: r.IsAutomaticSync,
  67. CreatedBy: r.CreatorId,
  68. UpdatedBy: r.CreatorId,
  69. }
  70. }
  71. type SearchResourceSpecificationOptions struct {
  72. ListOptions
  73. QueueId int64
  74. Status int
  75. Cluster string
  76. }
  77. type SearchResourceBriefSpecificationOptions struct {
  78. QueueId int64
  79. Cluster string
  80. }
  81. type ResourceSpecAndQueueListRes struct {
  82. TotalSize int64
  83. List []*ResourceSpecAndQueueRes
  84. }
  85. func NewResourceSpecAndQueueListRes(totalSize int64, list []ResourceSpecAndQueue) *ResourceSpecAndQueueListRes {
  86. resList := make([]*ResourceSpecAndQueueRes, len(list))
  87. for i, v := range list {
  88. resList[i] = v.ConvertToRes()
  89. }
  90. return &ResourceSpecAndQueueListRes{
  91. TotalSize: totalSize,
  92. List: resList,
  93. }
  94. }
  95. type ResourceSpecificationRes struct {
  96. ID int64
  97. SourceSpecId string
  98. AccCardsNum int
  99. CpuCores int
  100. MemGiB float32
  101. GPUMemGiB float32
  102. ShareMemGiB float32
  103. UnitPrice int
  104. Status int
  105. UpdatedTime timeutil.TimeStamp
  106. }
  107. func (ResourceSpecificationRes) TableName() string {
  108. return "resource_specification"
  109. }
  110. type ResourceSpecAndQueueRes struct {
  111. Spec *ResourceSpecificationRes
  112. Queue *ResourceQueueRes
  113. }
  114. type ResourceSpecAndQueue struct {
  115. ResourceSpecification `xorm:"extends"`
  116. ResourceQueue `xorm:"extends"`
  117. }
  118. func (*ResourceSpecAndQueue) TableName() string {
  119. return "resource_specification"
  120. }
  121. func (r ResourceSpecAndQueue) ConvertToRes() *ResourceSpecAndQueueRes {
  122. return &ResourceSpecAndQueueRes{
  123. Spec: r.ResourceSpecification.ConvertToRes(),
  124. Queue: r.ResourceQueue.ConvertToRes(),
  125. }
  126. }
  127. func InsertResourceSpecification(r ResourceSpecification) (int64, error) {
  128. return x.Insert(&r)
  129. }
  130. func UpdateResourceSpecificationById(queueId int64, spec ResourceSpecification) (int64, error) {
  131. return x.ID(queueId).Update(&spec)
  132. }
  133. func UpdateSpecUnitPriceById(id int64, unitPrice int) error {
  134. _, err := x.Exec("update resource_specification set unit_price = ? ,updated_time = ? where id = ?", unitPrice, timeutil.TimeStampNow(), id)
  135. return err
  136. }
  137. func SearchResourceSpecification(opts SearchResourceSpecificationOptions) (int64, []ResourceSpecAndQueue, error) {
  138. var cond = builder.NewCond()
  139. if opts.Page <= 0 {
  140. opts.Page = 1
  141. }
  142. if opts.QueueId > 0 {
  143. cond = cond.And(builder.Eq{"resource_specification.queue_id": opts.QueueId})
  144. }
  145. if opts.Status > 0 {
  146. cond = cond.And(builder.Eq{"resource_specification.status": opts.Status})
  147. }
  148. if opts.Cluster != "" {
  149. cond = cond.And(builder.Eq{"resource_queue.cluster": opts.Cluster})
  150. }
  151. //cond = cond.And(builder.Or(builder.Eq{"resource_queue.deleted_time": 0}).Or(builder.IsNull{"resource_queue.deleted_time"}))
  152. n, err := x.Where(cond).Join("INNER", "resource_queue", "resource_queue.ID = resource_specification.queue_id").
  153. Unscoped().Count(&ResourceSpecAndQueue{})
  154. if err != nil {
  155. return 0, nil, err
  156. }
  157. r := make([]ResourceSpecAndQueue, 0)
  158. err = x.Where(cond).
  159. Join("INNER", "resource_queue", "resource_queue.ID = resource_specification.queue_id").
  160. Desc("resource_specification.id").
  161. Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
  162. Unscoped().Find(&r)
  163. if err != nil {
  164. return 0, nil, err
  165. }
  166. return n, r, nil
  167. }
  168. func GetSpecScenes(specId int64) ([]ResourceSceneBriefRes, error) {
  169. r := make([]ResourceSceneBriefRes, 0)
  170. err := x.Where("resource_scene_spec.spec_id = ?", specId).
  171. Join("INNER", "resource_scene_spec", "resource_scene_spec.scene_id = resource_scene.id").
  172. Find(&r)
  173. if err != nil {
  174. return nil, err
  175. }
  176. return r, nil
  177. }
  178. func ResourceSpecOnShelf(id int64, unitPrice int) error {
  179. _, err := x.Exec("update resource_specification set unit_price = ?,updated_time = ?,status = ? where id = ?", unitPrice, timeutil.TimeStampNow(), SpecOnShelf, id)
  180. return err
  181. }
  182. func ResourceSpecOffShelf(id int64) (int64, error) {
  183. sess := x.NewSession()
  184. var err error
  185. defer func() {
  186. if err != nil {
  187. sess.Rollback()
  188. }
  189. sess.Close()
  190. }()
  191. //delete scene spec relation
  192. if _, err = sess.Where("spec_id = ?", id).Delete(&ResourceSceneSpec{}); err != nil {
  193. return 0, err
  194. }
  195. param := ResourceSpecification{
  196. Status: SpecOffShelf,
  197. }
  198. n, err := sess.Where("id = ? and status = ?", id, SpecOnShelf).Update(&param)
  199. if err != nil {
  200. return 0, err
  201. }
  202. sess.Commit()
  203. return n, err
  204. }
  205. func GetResourceSpecification(r *ResourceSpecification) (*ResourceSpecification, error) {
  206. has, err := x.Get(r)
  207. if err != nil {
  208. return nil, err
  209. } else if !has {
  210. return nil, nil
  211. }
  212. return r, nil
  213. }
  214. func SyncGrampusSpecs(updateList []ResourceSpecification, insertList []ResourceSpecification, existIds []int64) error {
  215. sess := x.NewSession()
  216. var err error
  217. defer func() {
  218. if err != nil {
  219. sess.Rollback()
  220. }
  221. sess.Close()
  222. }()
  223. //delete specs and scene that no longer exists
  224. deleteIds := make([]int64, 0)
  225. cond := builder.NewCond()
  226. cond = cond.And(builder.NotIn("resource_specification.id", existIds)).And(builder.Eq{"resource_queue.cluster": C2NetCluster})
  227. if err := sess.Cols("resource_specification.id").Table("resource_specification").
  228. Where(cond).Join("INNER", "resource_queue", "resource_queue.id = resource_specification.queue_id").
  229. Find(&deleteIds); err != nil {
  230. return err
  231. }
  232. if len(deleteIds) > 0 {
  233. if _, err = sess.In("id", deleteIds).Update(&ResourceSpecification{Status: SpecOffShelf}); err != nil {
  234. return err
  235. }
  236. if _, err = sess.In("spec_id", deleteIds).Delete(&ResourceSceneSpec{}); err != nil {
  237. return err
  238. }
  239. }
  240. //update exists specs
  241. if len(updateList) > 0 {
  242. for _, v := range updateList {
  243. if _, err = sess.ID(v.ID).Update(&v); err != nil {
  244. return err
  245. }
  246. }
  247. }
  248. //insert new specs
  249. if len(insertList) > 0 {
  250. if _, err = sess.Insert(insertList); err != nil {
  251. return err
  252. }
  253. }
  254. return sess.Commit()
  255. }