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_scene.go 8.0 kB

3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package models
  2. import (
  3. "code.gitea.io/gitea/modules/timeutil"
  4. "errors"
  5. "xorm.io/builder"
  6. )
  7. const (
  8. Exclusive = iota + 1
  9. NotExclusive
  10. )
  11. type ResourceScene struct {
  12. ID int64 `xorm:"pk autoincr"`
  13. SceneName string
  14. JobType string
  15. IsExclusive bool
  16. ExclusiveOrg string
  17. QueueId int64
  18. CreatedTime timeutil.TimeStamp `xorm:"created"`
  19. CreatedBy int64
  20. UpdatedTime timeutil.TimeStamp `xorm:"updated"`
  21. UpdatedBy int64
  22. DeleteTime timeutil.TimeStamp `xorm:"deleted"`
  23. DeletedBy int64
  24. }
  25. type ResourceSceneSpec struct {
  26. ID int64 `xorm:"pk autoincr"`
  27. SceneId int64 `xorm:"unique(idx_scene_spec)"`
  28. SpecId int64 `xorm:"unique(idx_scene_spec)"`
  29. CreatedTime timeutil.TimeStamp `xorm:"created"`
  30. }
  31. type ResourceSceneReq struct {
  32. ID int64
  33. SceneName string
  34. JobType string
  35. IsExclusive bool
  36. ExclusiveOrg string
  37. QueueId int64
  38. CreatorId int64
  39. SpecIds []int64
  40. }
  41. type SearchResourceSceneOptions struct {
  42. ListOptions
  43. JobType string
  44. IsExclusive int
  45. AiCenterCode string
  46. QueueId int64
  47. }
  48. type ResourceSceneListRes struct {
  49. TotalSize int64
  50. List []ResourceSceneRes
  51. }
  52. func NewResourceSceneListRes(totalSize int64, list []ResourceSceneRes) *ResourceSceneListRes {
  53. return &ResourceSceneListRes{
  54. TotalSize: totalSize,
  55. List: list,
  56. }
  57. }
  58. type ResourceSceneRes struct {
  59. ID int64
  60. SceneName string
  61. JobType JobType
  62. IsExclusive bool
  63. ExclusiveOrg string
  64. Cluster string
  65. AiCenterCode string
  66. QueueCode string
  67. QueueId int64
  68. ComputeResource string
  69. AccCardType string
  70. Specs []ResourceSpecWithSceneId
  71. }
  72. func (ResourceSceneRes) TableName() string {
  73. return "resource_scene"
  74. }
  75. type ResourceSceneBriefRes struct {
  76. ID int64
  77. SceneName string
  78. }
  79. func (ResourceSceneBriefRes) TableName() string {
  80. return "resource_scene"
  81. }
  82. type ResourceSpecWithSceneId struct {
  83. ID int64
  84. SourceSpecId string
  85. AccCardsNum int
  86. CpuCores int
  87. MemGiB float32
  88. GPUMemGiB float32
  89. ShareMemGiB float32
  90. UnitPrice int
  91. Status int
  92. UpdatedTime timeutil.TimeStamp
  93. SceneId int64
  94. }
  95. func (ResourceSpecWithSceneId) TableName() string {
  96. return "resource_specification"
  97. }
  98. func InsertResourceScene(r ResourceSceneReq) error {
  99. sess := x.NewSession()
  100. defer sess.Close()
  101. //check
  102. specs := make([]ResourceSpecification, 0)
  103. cond := builder.In("id", r.SpecIds).And(builder.Eq{"queue_id": r.QueueId}).And(builder.Eq{"status": SpecOnShelf})
  104. if err := sess.Where(cond).Find(&specs); err != nil {
  105. return err
  106. }
  107. if len(specs) < len(r.SpecIds) {
  108. return errors.New("specIds not correct")
  109. }
  110. rs := ResourceScene{
  111. SceneName: r.SceneName,
  112. JobType: r.JobType,
  113. IsExclusive: r.IsExclusive,
  114. ExclusiveOrg: r.ExclusiveOrg,
  115. QueueId: r.QueueId,
  116. CreatedBy: r.CreatorId,
  117. UpdatedBy: r.CreatorId,
  118. }
  119. _, err := sess.InsertOne(&rs)
  120. if err != nil {
  121. sess.Rollback()
  122. return err
  123. }
  124. if len(r.SpecIds) == 0 {
  125. return sess.Commit()
  126. }
  127. rss := make([]ResourceSceneSpec, len(r.SpecIds))
  128. for i, v := range r.SpecIds {
  129. rss[i] = ResourceSceneSpec{
  130. SceneId: rs.ID,
  131. SpecId: v,
  132. }
  133. }
  134. _, err = sess.Insert(&rss)
  135. if err != nil {
  136. sess.Rollback()
  137. return err
  138. }
  139. return sess.Commit()
  140. }
  141. func UpdateResourceScene(r ResourceSceneReq) error {
  142. sess := x.NewSession()
  143. var err error
  144. defer func() {
  145. if err != nil {
  146. sess.Rollback()
  147. }
  148. sess.Close()
  149. }()
  150. // find old scene
  151. old := ResourceScene{}
  152. if has, _ := sess.ID(r.ID).Get(&old); !has {
  153. return errors.New("ResourceScene not exist")
  154. }
  155. //check specification
  156. specs := make([]ResourceSpecification, 0)
  157. cond := builder.In("id", r.SpecIds).And(builder.Eq{"queue_id": old.QueueId}).And(builder.Eq{"status": SpecOnShelf})
  158. if err := sess.Where(cond).Find(&specs); err != nil {
  159. return err
  160. }
  161. if len(specs) < len(r.SpecIds) {
  162. return errors.New("specIds not correct")
  163. }
  164. //update scene
  165. rs := ResourceScene{
  166. SceneName: r.SceneName,
  167. IsExclusive: r.IsExclusive,
  168. ExclusiveOrg: r.ExclusiveOrg,
  169. }
  170. if _, err = sess.ID(r.ID).UseBool("is_exclusive").Update(&rs); err != nil {
  171. return err
  172. }
  173. //delete scene spec relation
  174. if _, err = sess.Where("scene_id = ? ", r.ID).Delete(&ResourceSceneSpec{}); err != nil {
  175. sess.Rollback()
  176. return err
  177. }
  178. if len(r.SpecIds) == 0 {
  179. return sess.Commit()
  180. }
  181. //build new scene spec relation
  182. rss := make([]ResourceSceneSpec, len(r.SpecIds))
  183. for i, v := range r.SpecIds {
  184. rss[i] = ResourceSceneSpec{
  185. SceneId: r.ID,
  186. SpecId: v,
  187. }
  188. }
  189. if _, err = sess.Insert(&rss); err != nil {
  190. sess.Rollback()
  191. return err
  192. }
  193. return sess.Commit()
  194. }
  195. func DeleteResourceScene(sceneId int64) error {
  196. sess := x.NewSession()
  197. var err error
  198. defer func() {
  199. if err != nil {
  200. sess.Rollback()
  201. }
  202. sess.Close()
  203. }()
  204. if _, err = sess.ID(sceneId).Delete(&ResourceScene{}); err != nil {
  205. return err
  206. }
  207. if _, err = sess.Where("scene_id = ? ", sceneId).Delete(&ResourceSceneSpec{}); err != nil {
  208. return err
  209. }
  210. return sess.Commit()
  211. }
  212. func SearchResourceScene(opts SearchResourceSceneOptions) (int64, []ResourceSceneRes, error) {
  213. var cond = builder.NewCond()
  214. if opts.Page <= 0 {
  215. opts.Page = 1
  216. }
  217. if opts.JobType != "" {
  218. cond = cond.And(builder.Eq{"resource_scene.job_type": opts.JobType})
  219. }
  220. if opts.IsExclusive == Exclusive {
  221. cond = cond.And(builder.Eq{"resource_scene.is_exclusive": 1})
  222. } else if opts.IsExclusive == NotExclusive {
  223. cond = cond.And(builder.Eq{"resource_scene.is_exclusive": 0})
  224. }
  225. if opts.AiCenterCode != "" {
  226. cond = cond.And(builder.Eq{"resource_queue.ai_center_code": opts.AiCenterCode})
  227. }
  228. if opts.QueueId > 0 {
  229. cond = cond.And(builder.Eq{"resource_scene.queue_id": opts.QueueId})
  230. }
  231. cond = cond.And(builder.NewCond().Or(builder.Eq{"resource_scene.delete_time": 0}).Or(builder.IsNull{"resource_scene.delete_time"}))
  232. count, err := x.Where(cond).Join("INNER", "resource_queue", "resource_queue.id = resource_scene.queue_id").Count(&ResourceSceneRes{})
  233. if err != nil {
  234. return 0, nil, err
  235. }
  236. cols := []string{"resource_scene.id", "resource_scene.scene_name", "resource_scene.job_type", "resource_scene.is_exclusive",
  237. "resource_scene.exclusive_org", "resource_queue.cluster", "resource_queue.ai_center_code", "resource_queue.acc_card_type",
  238. "resource_queue.id as queue_id", "resource_queue.compute_resource", "resource_queue.queue_code"}
  239. r := make([]ResourceSceneRes, 0)
  240. if err = x.Where(cond).Cols(cols...).
  241. Join("INNER", "resource_queue", "resource_queue.id = resource_scene.queue_id").
  242. Desc("resource_scene.id").
  243. Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
  244. Find(&r); err != nil {
  245. return 0, nil, err
  246. }
  247. if len(r) == 0 {
  248. return 0, r, err
  249. }
  250. //find related specs
  251. sceneIds := make([]int64, 0, len(r))
  252. for _, v := range r {
  253. sceneIds = append(sceneIds, v.ID)
  254. }
  255. specs := make([]ResourceSpecWithSceneId, 0)
  256. if err := x.Cols("resource_specification.id",
  257. "resource_specification.source_spec_id",
  258. "resource_specification.acc_cards_num",
  259. "resource_specification.cpu_cores",
  260. "resource_specification.mem_gi_b",
  261. "resource_specification.gpu_mem_gi_b",
  262. "resource_specification.share_mem_gi_b",
  263. "resource_specification.unit_price",
  264. "resource_specification.status",
  265. "resource_specification.updated_time",
  266. "resource_scene_spec.scene_id",
  267. ).In("resource_scene_spec.scene_id", sceneIds).
  268. Join("INNER", "resource_scene_spec", "resource_scene_spec.spec_id = resource_specification.id").
  269. OrderBy("resource_specification.acc_cards_num").
  270. Find(&specs); err != nil {
  271. return 0, nil, err
  272. }
  273. specsMap := make(map[int64][]ResourceSpecWithSceneId, 0)
  274. for _, v := range specs {
  275. if _, ok := specsMap[v.SceneId]; !ok {
  276. specsMap[v.SceneId] = []ResourceSpecWithSceneId{v}
  277. } else {
  278. specsMap[v.SceneId] = append(specsMap[v.SceneId], v)
  279. }
  280. }
  281. for i, v := range r {
  282. s := specsMap[v.ID]
  283. if s == nil {
  284. s = make([]ResourceSpecWithSceneId, 0)
  285. }
  286. r[i].Specs = s
  287. }
  288. return count, r, nil
  289. }