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