diff --git a/models/resource_queue.go b/models/resource_queue.go index fc0dd8cb5..f54be572e 100644 --- a/models/resource_queue.go +++ b/models/resource_queue.go @@ -143,6 +143,9 @@ func InsertResourceQueue(queue ResourceQueue) (int64, error) { func UpdateResourceQueueById(queueId int64, queue ResourceQueue) (int64, error) { return x.ID(queueId).Update(&queue) } +func UpdateResourceCardsTotalNum(queueId int64, queue ResourceQueue) (int64, error) { + return x.ID(queueId).Cols("cards_total_num", "remark").Update(&queue) +} func SearchResourceQueue(opts SearchResourceQueueOptions) (int64, []ResourceQueue, error) { var cond = builder.NewCond() @@ -313,9 +316,6 @@ func SyncGrampusQueues(updateList []ResourceQueue, insertList []ResourceQueue, e if _, err = sess.In("id", deleteSpcIds).Update(&ResourceSpecification{Status: SpecOffShelf}); err != nil { return err } - if _, err = sess.In("spec_id", deleteSpcIds).Delete(&ResourceSceneSpec{}); err != nil { - return err - } } } diff --git a/models/resource_scene.go b/models/resource_scene.go index 0c921b578..0117535ea 100644 --- a/models/resource_scene.go +++ b/models/resource_scene.go @@ -116,7 +116,7 @@ func InsertResourceScene(r ResourceSceneReq) error { //check specs := make([]ResourceSpecification, 0) - cond := builder.In("id", r.SpecIds).And(builder.Eq{"status": SpecOnShelf}) + cond := builder.In("id", r.SpecIds) if err := sess.Where(cond).Find(&specs); err != nil { return err } @@ -175,7 +175,7 @@ func UpdateResourceScene(r ResourceSceneReq) error { } //check specification specs := make([]ResourceSpecification, 0) - cond := builder.In("id", r.SpecIds).And(builder.Eq{"status": SpecOnShelf}) + cond := builder.In("id", r.SpecIds) if err := sess.Where(cond).Find(&specs); err != nil { return err } diff --git a/models/resource_specification.go b/models/resource_specification.go index 2da8d015d..a6f5f1f82 100644 --- a/models/resource_specification.go +++ b/models/resource_specification.go @@ -168,6 +168,7 @@ type FindSpecsOptions struct { UseShareMemGiB bool //if true,find specs no matter used or not used in scene. if false,only find specs used in scene RequestAll bool + SpecStatus int } type Specification struct { @@ -269,10 +270,6 @@ func ResourceSpecOffShelf(id int64) (int64, error) { } sess.Close() }() - //delete scene spec relation - if _, err = sess.Where("spec_id = ?", id).Delete(&ResourceSceneSpec{}); err != nil { - return 0, err - } param := ResourceSpecification{ Status: SpecOffShelf, @@ -317,9 +314,6 @@ func SyncGrampusSpecs(updateList []ResourceSpecification, insertList []ResourceS if _, err = sess.Cols("status", "is_available").In("id", deleteIds).Update(&ResourceSpecification{Status: SpecOffShelf, IsAvailable: false}); err != nil { return err } - if _, err = sess.In("spec_id", deleteIds).Delete(&ResourceSceneSpec{}); err != nil { - return err - } } //update exists specs @@ -384,6 +378,9 @@ func FindSpecs(opts FindSpecsOptions) ([]*Specification, error) { if opts.UseShareMemGiB { cond = cond.And(builder.Eq{"resource_specification.share_mem_gi_b": opts.ShareMemGiB}) } + if opts.SpecStatus > 0 { + cond = cond.And(builder.Eq{"resource_specification.status": opts.SpecStatus}) + } r := make([]*Specification, 0) s := x.Where(cond). Join("INNER", "resource_queue", "resource_queue.id = resource_specification.queue_id") diff --git a/routers/admin/resources.go b/routers/admin/resources.go index 20638553b..026c37e52 100644 --- a/routers/admin/resources.go +++ b/routers/admin/resources.go @@ -136,6 +136,26 @@ func GetResourceSpecificationList(ctx *context.Context) { ctx.JSON(http.StatusOK, response.SuccessWithData(list)) } +func GetAllResourceSpecificationList(ctx *context.Context) { + queue := ctx.QueryInt64("queue") + status := ctx.QueryInt("status") + cluster := ctx.Query("cluster") + available := ctx.QueryInt("available") + list, err := resource.GetAllDistinctResourceSpecification(models.SearchResourceSpecificationOptions{ + QueueId: queue, + Status: status, + Cluster: cluster, + AvailableCode: available, + }) + if err != nil { + log.Error("GetResourceSpecificationList error.%v", err) + ctx.JSON(http.StatusOK, response.ServerError(err.Error())) + return + } + + ctx.JSON(http.StatusOK, response.SuccessWithData(list)) +} + func GetResourceSpecificationScenes(ctx *context.Context) { specId := ctx.ParamsInt64(":id") list, err := resource.GetResourceSpecificationScenes(specId) diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 322f746f4..9d19d6c5e 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -645,6 +645,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/specification", func() { m.Get("", admin.GetSpecificationPage) m.Get("/list", admin.GetResourceSpecificationList) + m.Get("/list/all", admin.GetAllResourceSpecificationList) m.Get("/scenes/:id", admin.GetResourceSpecificationScenes) m.Post("/grampus/sync", admin.SyncGrampusSpecs) m.Post("/add", binding.Bind(models.ResourceSpecificationReq{}), admin.AddResourceSpecification) @@ -1487,6 +1488,12 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/record/list", point.GetPointRecordList) }, reqSignIn) + m.Group("/resources", func() { + m.Group("/queue", func() { + m.Get("/centers", admin.GetResourceAiCenters) + }) + }) + if setting.API.EnableSwagger { m.Get("/swagger.v1.json", templates.JSONRenderer(), routers.SwaggerV1Json) } diff --git a/services/cloudbrain/resource/resource_queue.go b/services/cloudbrain/resource/resource_queue.go index 2798a2b11..4e2dac8de 100644 --- a/services/cloudbrain/resource/resource_queue.go +++ b/services/cloudbrain/resource/resource_queue.go @@ -16,7 +16,7 @@ func AddResourceQueue(req models.ResourceQueueReq) error { } func UpdateResourceQueue(queueId int64, req models.ResourceQueueReq) error { - if _, err := models.UpdateResourceQueueById(queueId, models.ResourceQueue{ + if _, err := models.UpdateResourceCardsTotalNum(queueId, models.ResourceQueue{ CardsTotalNum: req.CardsTotalNum, Remark: req.Remark, }); err != nil { diff --git a/services/cloudbrain/resource/resource_specification.go b/services/cloudbrain/resource/resource_specification.go index 93abb2923..d23fd3aad 100644 --- a/services/cloudbrain/resource/resource_specification.go +++ b/services/cloudbrain/resource/resource_specification.go @@ -130,10 +130,48 @@ func GetResourceSpecificationList(opts models.SearchResourceSpecificationOptions if err != nil { return nil, err } - return models.NewResourceSpecAndQueueListRes(n, r), nil } +//GetAllDistinctResourceSpecification returns specification and queue after distinct +//totalSize is always 0 here +func GetAllDistinctResourceSpecification(opts models.SearchResourceSpecificationOptions) (*models.ResourceSpecAndQueueListRes, error) { + opts.Page = 0 + opts.PageSize = 1000 + _, r, err := models.SearchResourceSpecification(opts) + if err != nil { + return nil, err + } + nr := distinctResourceSpecAndQueue(r) + return models.NewResourceSpecAndQueueListRes(0, nr), nil +} + +func distinctResourceSpecAndQueue(r []models.ResourceSpecAndQueue) []models.ResourceSpecAndQueue { + specs := make([]models.ResourceSpecAndQueue, 0, len(r)) + sourceSpecIdMap := make(map[string]models.ResourceSpecAndQueue, 0) + for i := 0; i < len(r); i++ { + spec := r[i] + if spec.SourceSpecId == "" { + specs = append(specs, spec) + continue + } + if _, has := sourceSpecIdMap[spec.SourceSpecId]; has { + //prefer to use on-shelf spec + if sourceSpecIdMap[spec.SourceSpecId].Status != spec.Status && spec.Status == models.SpecOnShelf { + for k, v := range specs { + if v.ResourceSpecification.ID == sourceSpecIdMap[spec.SourceSpecId].ResourceSpecification.ID { + specs[k] = spec + } + } + } + continue + } + specs = append(specs, spec) + sourceSpecIdMap[spec.SourceSpecId] = spec + } + return specs +} + func GetResourceSpecificationScenes(specId int64) ([]models.ResourceSceneBriefRes, error) { r, err := models.GetSpecScenes(specId) if err != nil { @@ -200,6 +238,7 @@ func AddSpecOperateLog(doerId int64, operateType string, newValue, oldValue *mod } func FindAvailableSpecs(userId int64, opts models.FindSpecsOptions) ([]*models.Specification, error) { + opts.SpecStatus = models.SpecOnShelf r, err := models.FindSpecs(opts) if err != nil { log.Error("FindAvailableSpecs error.%v", err) diff --git a/web_src/vuepages/apis/modules/resources.js b/web_src/vuepages/apis/modules/resources.js index 32a87c53f..965d5ae04 100644 --- a/web_src/vuepages/apis/modules/resources.js +++ b/web_src/vuepages/apis/modules/resources.js @@ -110,6 +110,19 @@ export const getResSpecificationList = (params) => { }); } +// 查询资源规格列表(所有) +// cluster 所属集群 :OpenI 启智集群,C2Net 智算集群 +// queue 所属队列id +// status 状态 : 1 待审核 2已上架 3已下架 +export const getResSpecificationListAll = (params) => { + return service({ + url: '/admin/resources/specification/list/all', + method: 'get', + params, + data: {}, + }); +} + // 同步智算网络资源池(队列) export const syncResSpecification = () => { return service({ diff --git a/web_src/vuepages/pages/resources/components/SceneDialog.vue b/web_src/vuepages/pages/resources/components/SceneDialog.vue index 3b77be6e2..fed3f8db0 100644 --- a/web_src/vuepages/pages/resources/components/SceneDialog.vue +++ b/web_src/vuepages/pages/resources/components/SceneDialog.vue @@ -69,7 +69,9 @@
- + + +
@@ -87,7 +89,7 @@