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