|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- package models
-
- import (
- "code.gitea.io/gitea/modules/timeutil"
- "xorm.io/builder"
- )
-
- const (
- SpecNotVerified int = iota + 1
- SpecOnShelf
- SpecOffShelf
- )
-
- type ResourceSpecification struct {
- ID int64 `xorm:"pk autoincr"`
- QueueId int64 `xorm:"INDEX"`
- SourceSpecId string `xorm:"INDEX"`
- AccCardsNum int
- CpuCores int
- MemGiB float32
- GPUMemGiB float32
- ShareMemGiB float32
- 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,
- CpuCores: r.CpuCores,
- MemGiB: r.MemGiB,
- ShareMemGiB: r.ShareMemGiB,
- GPUMemGiB: r.GPUMemGiB,
- UnitPrice: r.UnitPrice,
- Status: r.Status,
- UpdatedTime: r.UpdatedTime,
- }
- }
-
- type ResourceSpecificationReq struct {
- QueueId int64 `binding:"Required"`
- SourceSpecId string
- AccCardsNum int
- CpuCores int
- MemGiB float32
- GPUMemGiB float32
- ShareMemGiB float32
- UnitPrice int
- Status int
- IsAutomaticSync bool
- CreatorId int64
- }
-
- func (r ResourceSpecificationReq) ToDTO() ResourceSpecification {
- return ResourceSpecification{
- QueueId: r.QueueId,
- SourceSpecId: r.SourceSpecId,
- AccCardsNum: r.AccCardsNum,
- CpuCores: r.CpuCores,
- MemGiB: r.MemGiB,
- GPUMemGiB: r.GPUMemGiB,
- ShareMemGiB: r.ShareMemGiB,
- UnitPrice: r.UnitPrice,
- Status: r.Status,
- IsAutomaticSync: r.IsAutomaticSync,
- CreatedBy: r.CreatorId,
- UpdatedBy: r.CreatorId,
- }
- }
-
- type SearchResourceSpecificationOptions struct {
- ListOptions
- QueueId int64
- Status int
- Cluster string
- }
-
- type SearchResourceBriefSpecificationOptions struct {
- QueueId int64
- Cluster string
- }
-
- 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
- CpuCores int
- MemGiB float32
- GPUMemGiB float32
- ShareMemGiB float32
- UnitPrice int
- Status int
- UpdatedTime timeutil.TimeStamp
- }
-
- func (ResourceSpecificationRes) TableName() string {
- return "resource_specification"
- }
-
- 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(r ResourceSpecification) (int64, error) {
- return x.Insert(&r)
- }
-
- func UpdateResourceSpecificationById(queueId int64, spec ResourceSpecification) (int64, error) {
- return x.ID(queueId).Update(&spec)
- }
- func UpdateSpecUnitPriceById(id int64, unitPrice int) error {
- _, err := x.Exec("update resource_specification set unit_price = ? ,updated_time = ? where id = ?", unitPrice, timeutil.TimeStampNow(), id)
- return err
- }
-
- 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})
- }
- if opts.Cluster != "" {
- cond = cond.And(builder.Eq{"resource_queue.cluster": opts.Cluster})
- }
- //cond = cond.And(builder.Or(builder.Eq{"resource_queue.deleted_time": 0}).Or(builder.IsNull{"resource_queue.deleted_time"}))
- n, err := x.Where(cond).Join("INNER", "resource_queue", "resource_queue.ID = resource_specification.queue_id").
- Unscoped().Count(&ResourceSpecAndQueue{})
- if err != nil {
- return 0, nil, err
- }
-
- r := make([]ResourceSpecAndQueue, 0)
- err = x.Where(cond).
- Join("INNER", "resource_queue", "resource_queue.ID = resource_specification.queue_id").
- Desc("resource_specification.id").
- Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
- Unscoped().Find(&r)
- if err != nil {
- return 0, nil, err
- }
- return n, r, nil
- }
-
- func GetSpecScenes(specId int64) ([]ResourceSceneBriefRes, error) {
- r := make([]ResourceSceneBriefRes, 0)
- err := x.Where("resource_scene_spec.spec_id = ?", specId).
- Join("INNER", "resource_scene_spec", "resource_scene_spec.scene_id = resource_scene.id").
- Find(&r)
- if err != nil {
- return nil, err
- }
- return r, nil
- }
-
- func ResourceSpecOnShelf(id int64, unitPrice int) error {
- _, err := x.Exec("update resource_specification set unit_price = ?,updated_time = ?,status = ? where id = ?", unitPrice, timeutil.TimeStampNow(), SpecOnShelf, id)
- return err
- }
-
- func ResourceSpecOffShelf(id int64) (int64, error) {
- sess := x.NewSession()
- var err error
- defer func() {
- if err != nil {
- sess.Rollback()
- }
- sess.Close()
- }()
- //delete scene spec relation
- if _, err = sess.Where("spec_id = ?", id).Delete(&ResourceSceneSpec{}); err != nil {
- return 0, err
- }
-
- param := ResourceSpecification{
- Status: SpecOffShelf,
- }
- n, err := sess.Where("id = ? and status = ?", id, SpecOnShelf).Update(¶m)
- if err != nil {
- return 0, err
- }
- sess.Commit()
- return n, err
- }
-
- func GetResourceSpecification(r *ResourceSpecification) (*ResourceSpecification, error) {
- has, err := x.Get(r)
- if err != nil {
- return nil, err
- } else if !has {
- return nil, nil
- }
- return r, nil
- }
-
- func SyncGrampusSpecs(updateList []ResourceSpecification, insertList []ResourceSpecification, existIds []int64) error {
- sess := x.NewSession()
- var err error
- defer func() {
- if err != nil {
- sess.Rollback()
- }
- sess.Close()
- }()
- //delete specs and scene that no longer exists
- deleteIds := make([]int64, 0)
- cond := builder.NewCond()
- cond = cond.And(builder.NotIn("resource_specification.id", existIds)).And(builder.Eq{"resource_queue.cluster": C2NetCluster})
- if err := sess.Cols("resource_specification.id").Table("resource_specification").
- Where(cond).Join("INNER", "resource_queue", "resource_queue.id = resource_specification.queue_id").
- Find(&deleteIds); err != nil {
- return err
- }
- if len(deleteIds) > 0 {
- if _, err = sess.In("id", deleteIds).Update(&ResourceSpecification{Status: SpecOffShelf}); err != nil {
- return err
- }
- if _, err = sess.In("spec_id", deleteIds).Delete(&ResourceSceneSpec{}); err != nil {
- return err
- }
- }
-
- //update exists specs
- if len(updateList) > 0 {
- for _, v := range updateList {
- if _, err = sess.ID(v.ID).Update(&v); err != nil {
- return err
- }
- }
-
- }
-
- //insert new specs
- if len(insertList) > 0 {
- if _, err = sess.Insert(insertList); err != nil {
- return err
- }
- }
-
- return sess.Commit()
- }
|