Browse Source

#2624

add resource specification
tags/v1.22.8.2^2
chenyifan01 3 years ago
parent
commit
ba4f9b0e8f
6 changed files with 250 additions and 23 deletions
  1. +1
    -0
      models/models.go
  2. +154
    -14
      models/resource_specification.go
  3. +54
    -6
      routers/admin/resources.go
  4. +4
    -1
      routers/routes/routes.go
  5. +6
    -2
      services/cloudbrain/resource/resource_queue.go
  6. +31
    -0
      services/cloudbrain/resource/resource_specification.go

+ 1
- 0
models/models.go View File

@@ -146,6 +146,7 @@ func init() {
new(SearchRecord),
new(AiModelConvert),
new(ResourceQueue),
new(ResourceSpecification),
)

tablesStatistic = append(tablesStatistic,


+ 154
- 14
models/resource_specification.go View File

@@ -1,19 +1,159 @@
package models

import "code.gitea.io/gitea/modules/timeutil"
import (
"code.gitea.io/gitea/modules/timeutil"
"xorm.io/builder"
)

const (
SpecNotVerified int = iota + 1
SpecEffective
SpecNotEffective
)

type ResourceSpecification struct {
ID int64 `xorm:"pk autoincr"`
QueueId int64 `xorm:"INDEX"`
AccCardsNum int
CpuNum int
MemMiB int
ShareMemMiB int
UnitPrice int
Status int
CreatedFrom string
CreatedTime timeutil.TimeStamp `xorm:"INDEX created"`
CreatedBy int64
UpdatedTime timeutil.TimeStamp `xorm:"INDEX updated"`
UpdatedBy int64
ID int64 `xorm:"pk autoincr"`
QueueId int64 `xorm:"INDEX"`
SourceSpecId string `xorm:"INDEX"`
AccCardsNum int
CpuNum int
MemMiB int
ShareMemMiB int
UnitPrice int
Status int
IsAutomaticSync bool
CreatedTime timeutil.TimeStamp `xorm:"created"`
CreatedBy int64
UpdatedTime timeutil.TimeStamp `xorm:"updated"`
UpdatedBy int64
}

func (r ResourceSpecification) ConvertToRes() *ResourceSpecificationRes {
return &ResourceSpecificationRes{
ID: r.ID,
SourceSpecId: r.SourceSpecId,
AccCardsNum: r.AccCardsNum,
CpuNum: r.CpuNum,
MemMiB: r.MemMiB,
ShareMemMiB: r.ShareMemMiB,
UnitPrice: r.UnitPrice,
Status: r.Status,
}
}

type ResourceSpecificationReq struct {
QueueId int64 `binding:"Required"`
AccCardsNum int
CpuNum int
MemGiB int
ShareMemGiB int
UnitPrice int
Status int
IsAutomaticSync bool
CreatorId int64
}

func (r ResourceSpecificationReq) ToDTO() ResourceSpecification {
return ResourceSpecification{
QueueId: r.QueueId,
AccCardsNum: r.AccCardsNum,
CpuNum: r.CpuNum,
MemMiB: r.MemGiB * 1024,
ShareMemMiB: r.ShareMemGiB * 1024,
UnitPrice: r.UnitPrice,
Status: r.Status,
IsAutomaticSync: r.IsAutomaticSync,
CreatedBy: r.CreatorId,
UpdatedBy: r.CreatorId,
}
}

type SearchResourceSpecificationOptions struct {
ListOptions
QueueId int64
Status int
}

type ResourceSpecAndQueueListRes struct {
TotalSize int64
List []*ResourceSpecAndQueueRes
}

func NewResourceSpecAndQueueListRes(totalSize int64, list []ResourceSpecAndQueue) *ResourceSpecAndQueueListRes {
resList := make([]*ResourceSpecAndQueueRes, len(list))
for i, v := range list {
resList[i] = v.ConvertToRes()
}
return &ResourceSpecAndQueueListRes{
TotalSize: totalSize,
List: resList,
}
}

type ResourceSpecificationRes struct {
ID int64
SourceSpecId string
AccCardsNum int
CpuNum int
MemMiB int
ShareMemMiB int
UnitPrice int
Status int
}

type ResourceSpecAndQueueRes struct {
Spec *ResourceSpecificationRes
Queue *ResourceQueueRes
}

type ResourceSpecAndQueue struct {
ResourceSpecification `xorm:"extends"`
ResourceQueue `xorm:"extends"`
}

func (*ResourceSpecAndQueue) TableName() string {
return "resource_specification"
}

func (r ResourceSpecAndQueue) ConvertToRes() *ResourceSpecAndQueueRes {
return &ResourceSpecAndQueueRes{
Spec: r.ResourceSpecification.ConvertToRes(),
Queue: r.ResourceQueue.ConvertToRes(),
}
}

func InsertResourceSpecification(queue ResourceSpecification) (int64, error) {
return x.Insert(&queue)
}

func UpdateResourceSpecificationById(queueId int64, queue ResourceSpecification) (int64, error) {
return x.ID(queueId).Update(&queue)
}

func SearchResourceSpecification(opts SearchResourceSpecificationOptions) (int64, []ResourceSpecAndQueue, error) {
var cond = builder.NewCond()
if opts.Page <= 0 {
opts.Page = 1
}
if opts.QueueId > 0 {
cond = cond.And(builder.Eq{"resource_specification.queue_id": opts.QueueId})
}
if opts.Status > 0 {
cond = cond.And(builder.Eq{"resource_specification.status": opts.Status})
}
n, err := x.Where(cond).Count(&ResourceSpecAndQueue{})
if err != nil {
return 0, nil, err
}

r := make([]ResourceSpecAndQueue, 0)
err = x.Where(cond).
Join("LEFT", "resource_queue", "resource_queue.ID = resource_specification.queue_id").
Desc("resource_specification.id").
Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
Find(&r)
if err != nil {
return 0, nil, err
}
return n, r, nil
}

+ 54
- 6
routers/admin/resources.go View File

@@ -58,7 +58,7 @@ func GetResourceQueueList(ctx *context.Context) {
ctx.JSON(http.StatusOK, response.SuccessWithData(list))
}

func AddResourceNewQueue(ctx *context.Context, req models.ResourceQueueReq) {
func AddResourceQueue(ctx *context.Context, req models.ResourceQueueReq) {
req.IsAutomaticSync = false
req.CreatorId = ctx.User.ID
err := resource.AddResourceQueue(req)
@@ -72,14 +72,62 @@ func AddResourceNewQueue(ctx *context.Context, req models.ResourceQueueReq) {

func UpdateResourceQueue(ctx *context.Context, req models.ResourceQueueReq) {
queueId := ctx.ParamsInt64(":id")
if req.CardsTotalNum < 0 {
ctx.JSON(http.StatusOK, response.ServerError("param error"))
//only CardsTotalNum permitted to change
err := resource.UpdateResourceQueue(queueId, req.CardsTotalNum)
if err != nil {
log.Error("UpdateResourceQueue error. %v", err)
ctx.JSON(http.StatusOK, response.ServerError(err.Error()))
return
}
//only CardsTotalNum permitted to change
err := resource.UpdateCardsTotalNum(queueId, req.CardsTotalNum)
ctx.JSON(http.StatusOK, response.Success())
}

func GetResourceSpecificationList(ctx *context.Context) {
page := ctx.QueryInt("page")
queue := ctx.QueryInt64("queue")
status := ctx.QueryInt("status")
list, err := resource.GetResourceSpecificationList(models.SearchResourceSpecificationOptions{
ListOptions: models.ListOptions{Page: page, PageSize: 20},
QueueId: queue,
Status: status,
})
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 AddResourceSpecification(ctx *context.Context, req models.ResourceSpecificationReq) {
req.IsAutomaticSync = false
req.CreatorId = ctx.User.ID
err := resource.AddResourceSpecification(req)
if err != nil {
log.Error("AddResourceQueue error. %v", err)
ctx.JSON(http.StatusOK, response.ServerError(err.Error()))
return
}
ctx.JSON(http.StatusOK, response.Success())
}

func UpdateResourceSpecification(ctx *context.Context, req models.ResourceSpecificationReq) {
id := ctx.ParamsInt64(":id")
action := ctx.Query("action")

var err error
switch action {
case "edit":
if req.UnitPrice < 0 {
ctx.JSON(http.StatusOK, response.ServerError("param error"))
return
}
//only UnitPrice permitted to change
err = resource.UpdateUnitPrice(id, req.UnitPrice)
}

if err != nil {
log.Error("UpdateCardsTotalNum error. %v", err)
log.Error("UpdateResourceSpecification error. %v", err)
ctx.JSON(http.StatusOK, response.ServerError(err.Error()))
return
}


+ 4
- 1
routers/routes/routes.go View File

@@ -610,11 +610,14 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/queue", func() {
m.Get("", admin.GetQueuePage)
m.Get("/list", admin.GetResourceQueueList)
m.Post("/add", binding.Bind(models.ResourceQueueReq{}), admin.AddResourceNewQueue)
m.Post("/add", binding.Bind(models.ResourceQueueReq{}), admin.AddResourceQueue)
m.Post("/update/:id", binding.BindIgnErr(models.ResourceQueueReq{}), admin.UpdateResourceQueue)
})
m.Group("/specification", func() {
m.Get("", admin.GetSpecificationPage)
m.Get("/list", admin.GetResourceSpecificationList)
m.Post("/add", binding.Bind(models.ResourceSpecificationReq{}), admin.AddResourceSpecification)
m.Post("/update/:id", binding.BindIgnErr(models.ResourceSpecificationReq{}), admin.UpdateResourceSpecification)
})
m.Group("/scene", func() {
m.Get("", admin.GetScenePage)


+ 6
- 2
services/cloudbrain/resource/resource_queue.go View File

@@ -10,8 +10,12 @@ func AddResourceQueue(req models.ResourceQueueReq) error {
}
return nil
}
func UpdateCardsTotalNum(queueId int64, cardsTotalNum int) error {
if _, err := models.UpdateResourceQueueById(queueId, models.ResourceQueue{CardsTotalNum: cardsTotalNum}); err != nil {

func UpdateResourceQueue(queueId int64, req models.ResourceQueueReq) error {
if _, err := models.UpdateResourceQueueById(queueId, models.ResourceQueue{
CardsTotalNum: req.CardsTotalNum,
Remark: req.Remark,
}); err != nil {
return err
}
return nil


+ 31
- 0
services/cloudbrain/resource/resource_specification.go View File

@@ -0,0 +1,31 @@
package resource

import (
"code.gitea.io/gitea/models"
)

func AddResourceSpecification(req models.ResourceSpecificationReq) error {
if req.Status == 0 {
req.Status = models.SpecNotVerified
}
if _, err := models.InsertResourceSpecification(req.ToDTO()); err != nil {
return err
}
return nil
}

func UpdateUnitPrice(specId int64, unitPrice int) error {
if _, err := models.UpdateResourceSpecificationById(specId, models.ResourceSpecification{UnitPrice: unitPrice}); err != nil {
return err
}
return nil
}

func GetResourceSpecificationList(opts models.SearchResourceSpecificationOptions) (*models.ResourceSpecAndQueueListRes, error) {
n, r, err := models.SearchResourceSpecification(opts)
if err != nil {
return nil, err
}

return models.NewResourceSpecAndQueueListRes(n, r), nil
}

Loading…
Cancel
Save