From 39339a29e6a7791062d208c70a43d6eece269ffc Mon Sep 17 00:00:00 2001 From: chenyifan01 Date: Thu, 30 Jun 2022 16:08:59 +0800 Subject: [PATCH] #2225 update --- models/action.go | 61 +++-- models/action_list.go | 65 ++++++ models/cloudbrain.go | 211 +++++++++++------- models/helper.go | 8 + models/reward_admin_log.go | 8 +- models/reward_operate_record.go | 29 +-- modules/auth/modelarts.go | 3 - modules/modelarts/modelarts.go | 5 +- routers/repo/cloudbrain.go | 8 +- routers/repo/modelarts.go | 19 +- services/reward/cloubrain_deduct.go | 8 +- .../reward/point/account/point_account.go | 14 +- services/task/task.go | 8 +- 13 files changed, 295 insertions(+), 152 deletions(-) diff --git a/models/action.go b/models/action.go index 69ad797d6..33322a921 100755 --- a/models/action.go +++ b/models/action.go @@ -92,20 +92,14 @@ type Action struct { } type ActionShow struct { - UserID int64 - OpType ActionType - ActUserID int64 - ActUser *UserShow - RepoID int64 - Repo *RepositoryShow - CommentID int64 - Comment *Comment `xorm:"-"` - IsDeleted bool `xorm:"INDEX NOT NULL DEFAULT false"` - RefName string - IsPrivate bool `xorm:"INDEX NOT NULL DEFAULT false"` - IsTransformed bool `xorm:"INDEX NOT NULL DEFAULT false"` - Content string `xorm:"TEXT"` - CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` + OpType ActionType + RepoLink string + ShortRepoFullDisplayName string + Content string + RefName string + IssueInfos []string + CommentLink string + IssueTitle string } // GetOpType gets the ActionType of this action. @@ -243,6 +237,43 @@ func (a *Action) GetRepoLink() string { return "/" + a.GetRepoPath() } +func (a *Action) ToShow() *ActionShow { + actionShow := &ActionShow{} + actionShow.OpType = GetTaskOptType(*a) + actionShow.Content = a.Content + actionShow.RefName = a.RefName + + if strings.Contains(a.Content, "|") { + actionShow.IssueInfos = a.GetIssueInfos() + actionShow.IssueTitle = a.GetIssueTitle() + } + + if a.Repo != nil { + actionShow.RepoLink = a.GetRepoLink() + actionShow.ShortRepoFullDisplayName = a.ShortRepoFullDisplayName() + } + if a.Comment != nil { + actionShow.CommentLink = a.GetCommentLink() + } + + return actionShow +} + +func GetTaskOptType(action Action) ActionType { + switch action.OpType { + case ActionCreateDebugGPUTask, + ActionCreateDebugNPUTask, + ActionCreateTrainTask, + ActionCreateInferenceTask, + ActionCreateBenchMarkTask, + ActionCreateGPUTrainTask: + return ActionCreateCloudbrainTask + default: + return action.OpType + } + +} + // GetRepositoryFromMatch returns a *Repository from a username and repo strings func GetRepositoryFromMatch(ownerName string, repoName string) (*Repository, error) { var err error @@ -439,7 +470,7 @@ func GetActionByIds(ids []int64) ([]*Action, error) { if err != nil { return nil, err } - if err := ActionList(actions).LoadAttributes(); err != nil { + if err := ActionList(actions).LoadAllAttributes(); err != nil { return nil, fmt.Errorf("ActionList loadAttributes: %v", err) } return actions, nil diff --git a/models/action_list.go b/models/action_list.go index 6f726f4b3..a0987c20d 100644 --- a/models/action_list.go +++ b/models/action_list.go @@ -79,6 +79,48 @@ func (actions ActionList) LoadRepositories() ([]*Repository, error) { return actions.loadRepositories(x) } +func (actions ActionList) getCommentIDs() []int64 { + commentIDs := make(map[int64]struct{}, len(actions)) + for _, action := range actions { + if action.CommentID == 0 { + continue + } + if _, ok := commentIDs[action.CommentID]; !ok { + commentIDs[action.CommentID] = struct{}{} + } + } + return keysInt64(commentIDs) +} + +func (actions ActionList) loadComments(e Engine) ([]*Comment, error) { + if len(actions) == 0 { + return nil, nil + } + + commentIDs := actions.getCommentIDs() + + commentMaps := make(map[int64]*Comment, len(commentIDs)) + if len(commentIDs) == 0 { + return make([]*Comment, 0), nil + } + err := e. + In("id", commentIDs). + Find(&commentMaps) + if err != nil { + return nil, fmt.Errorf("find comment: %v", err) + } + + for _, action := range actions { + action.Comment = commentMaps[action.CommentID] + } + return valuesComment(commentMaps), nil +} + +// LoadComments loads actions' all comments +func (actions ActionList) LoadComments() ([]*Comment, error) { + return actions.loadComments(x) +} + // loadAttributes loads all attributes func (actions ActionList) loadAttributes(e Engine) (err error) { if _, err = actions.loadUsers(e); err != nil { @@ -96,3 +138,26 @@ func (actions ActionList) loadAttributes(e Engine) (err error) { func (actions ActionList) LoadAttributes() error { return actions.loadAttributes(x) } + +// LoadAllAttributes loads all attributes of the actions +// compare with LoadAttributes() ,LoadAllAttributes() loads Comment attribute +func (actions ActionList) LoadAllAttributes() error { + return actions.loadAllAttributes(x) +} + +// loadAllAttributes +func (actions ActionList) loadAllAttributes(e Engine) (err error) { + if _, err = actions.loadUsers(e); err != nil { + return + } + + if _, err = actions.loadRepositories(e); err != nil { + return + } + + if _, err = actions.loadComments(e); err != nil { + return + } + + return nil +} diff --git a/models/cloudbrain.go b/models/cloudbrain.go index 06cd42258..2f82640b7 100755 --- a/models/cloudbrain.go +++ b/models/cloudbrain.go @@ -169,69 +169,23 @@ type Cloudbrain struct { } type CloudbrainShow struct { - JobID string `xorm:"INDEX NOT NULL"` - JobType string `xorm:"INDEX NOT NULL DEFAULT 'DEBUG'"` - JobName string - DisplayJobName string - Status string - UserID int64 `xorm:"INDEX NOT NULL"` - RepoID int64 `xorm:"INDEX NOT NULL"` - SubTaskName string - ContainerID string - ContainerIp string - CreatedUnix timeutil.TimeStamp `xorm:"INDEX"` - UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` - Duration int64 `xorm:"DEFAULT 0"` //运行时长 单位秒 - TrainJobDuration string `xorm:"DEFAULT '00:00:00'"` - Image string //镜像名称 - GpuQueue string //GPU类型即GPU队列 - ResourceSpecId int //GPU规格id - DeletedAt time.Time `xorm:"deleted"` - CanDebug bool `xorm:"-"` - CanDel bool `xorm:"-"` - CanModify bool `xorm:"-"` - Type int - BenchmarkTypeID int - BenchmarkChildTypeID int - - VersionID int64 //版本id - VersionName string `xorm:"INDEX"` //当前版本 - Uuid string //数据集id - DatasetName string - VersionCount int //任务的当前版本数量,不包括删除的 - IsLatestVersion string //是否是最新版本,1是,0否 - CommitID string //提交的仓库代码id - PreVersionName string //父版本名称 - ComputeResource string //计算资源,例如npu - EngineID int64 //引擎id - - TrainUrl string //输出模型的obs路径 - BranchName string //分支名称 - Parameters string //传给modelarts的param参数 - BootFile string //启动文件 - DataUrl string //数据集的obs路径 - LogUrl string //日志输出的obs路径 - PreVersionId int64 //父版本的版本id - FlavorCode string //modelarts上的规格id - Description string `xorm:"varchar(256)"` //描述 - WorkServerNumber int //节点数 - FlavorName string //规格名称 - EngineName string //引擎名称 - TotalVersionCount int //任务的所有版本数量,包括删除的 - - LabelName string //标签名称 - ModelName string //模型名称 - ModelVersion string //模型版本 - CkptName string //权重文件名称 - ResultUrl string //推理结果的obs路径 + ID int64 + JobType string + DisplayJobName string + Duration string + ResourceSpec *ResourceAndFlavor + ComputeResource string +} - User *User `xorm:"-"` - Repo *Repository `xorm:"-"` - BenchmarkType string `xorm:"-"` //算法评测,模型评测 - BenchmarkTypeName string `xorm:"-"` - BenchmarkTypeRankLink string `xorm:"-"` - StartTime timeutil.TimeStamp - EndTime timeutil.TimeStamp +func (task *Cloudbrain) ToShow() *CloudbrainShow { + return &CloudbrainShow{ + ID: task.ID, + JobType: task.JobType, + DisplayJobName: task.DisplayJobName, + Duration: task.TrainJobDuration, + ResourceSpec: GetCloudbrainResourceSpec(task.JobType, task.Type, task.ResourceSpecId, task.FlavorCode), + ComputeResource: task.ComputeResource, + } } func (task *Cloudbrain) ComputeAndSetDuration() { @@ -1917,11 +1871,11 @@ func GetStartedCloudbrainTaskByUpdatedUnix(startTime, endTime time.Time) ([]Clou return r, nil } -func GetCloudbrainByIds(ids []int64) ([]Cloudbrain, error) { +func GetCloudbrainByIds(ids []int64) ([]*Cloudbrain, error) { if len(ids) == 0 { return nil, nil } - cloudbrains := make([]Cloudbrain, 0) + cloudbrains := make([]*Cloudbrain, 0) err := x.In("id", ids).Unscoped().Find(&cloudbrains) if err != nil { return nil, err @@ -1930,31 +1884,128 @@ func GetCloudbrainByIds(ids []int64) ([]Cloudbrain, error) { } var ( - DebugResourceSpecs *ResourceSpecs - TrainResourceSpecs *ResourceSpecs + SpecsMapInitFlag = false + CloudbrainDebugResourceSpecsMap map[int]*ResourceSpec + CloudbrainTrainResourceSpecsMap map[int]*ResourceSpec + CloudbrainBenchmarkResourceSpecsMap map[int]*ResourceSpec + ModelArtsDebugResourceSpecsMap map[string]*FlavorInfo + ModelArtsTrainResourceSpecsMap map[string]*FlavorInfo ) -func GetResourceSpec(jobType string, resourceSpecId int) *ResourceSpec { - if jobType == string(JobTypeTrain) { - if TrainResourceSpecs == nil { - json.Unmarshal([]byte(setting.TrainResourceSpecs), &TrainResourceSpecs) +type ModelArtsFlavor struct { + Info []struct { + Code string `json:"code"` + Value string `json:"value"` + UnitPrice int64 `json:"unitPrice"` + } `json:"flavor"` +} + +func InitResourceSpecMap() { + if CloudbrainDebugResourceSpecsMap == nil || len(CloudbrainDebugResourceSpecsMap) == 0 { + t := ResourceSpecs{} + json.Unmarshal([]byte(setting.ResourceSpecs), &t) + CloudbrainDebugResourceSpecsMap = make(map[int]*ResourceSpec, len(t.ResourceSpec)) + for _, spec := range t.ResourceSpec { + CloudbrainDebugResourceSpecsMap[spec.Id] = spec } - for _, spec := range TrainResourceSpecs.ResourceSpec { - if resourceSpecId == spec.Id { - return spec - } + } + if CloudbrainTrainResourceSpecsMap == nil || len(CloudbrainTrainResourceSpecsMap) == 0 { + t := ResourceSpecs{} + json.Unmarshal([]byte(setting.TrainResourceSpecs), &t) + CloudbrainTrainResourceSpecsMap = make(map[int]*ResourceSpec, len(t.ResourceSpec)) + for _, spec := range t.ResourceSpec { + CloudbrainTrainResourceSpecsMap[spec.Id] = spec } - } else { - if DebugResourceSpecs == nil { - json.Unmarshal([]byte(setting.ResourceSpecs), &DebugResourceSpecs) + } + if CloudbrainBenchmarkResourceSpecsMap == nil || len(CloudbrainBenchmarkResourceSpecsMap) == 0 { + t := ResourceSpecs{} + json.Unmarshal([]byte(setting.BenchmarkResourceSpecs), &t) + CloudbrainBenchmarkResourceSpecsMap = make(map[int]*ResourceSpec, len(t.ResourceSpec)) + for _, spec := range t.ResourceSpec { + CloudbrainBenchmarkResourceSpecsMap[spec.Id] = spec + } + } + if ModelArtsDebugResourceSpecsMap == nil || len(ModelArtsDebugResourceSpecsMap) == 0 { + t := FlavorInfos{} + json.Unmarshal([]byte(setting.FlavorInfos), &t) + ModelArtsDebugResourceSpecsMap = make(map[string]*FlavorInfo, len(t.FlavorInfo)) + for _, spec := range t.FlavorInfo { + ModelArtsDebugResourceSpecsMap[spec.Value] = spec } - for _, spec := range DebugResourceSpecs.ResourceSpec { - if resourceSpecId == spec.Id { - return spec + } + if ModelArtsTrainResourceSpecsMap == nil || len(ModelArtsTrainResourceSpecsMap) == 0 { + t := ModelArtsFlavor{} + json.Unmarshal([]byte(setting.TrainJobFLAVORINFOS), &t) + ModelArtsTrainResourceSpecsMap = make(map[string]*FlavorInfo, len(t.Info)) + for _, spec := range t.Info { + f := &FlavorInfo{ + Value: spec.Code, + Desc: spec.Value, + UnitPrice: spec.UnitPrice, } + ModelArtsTrainResourceSpecsMap[spec.Value] = f } + } + SpecsMapInitFlag = true +} +type ResourceAndFlavor struct { + ResourceSpec *ResourceSpec + FlavorInfo *FlavorInfo +} + +func NewResourceAndFlavor(resourceSpec *ResourceSpec, flavorInfo *FlavorInfo) *ResourceAndFlavor { + return &ResourceAndFlavor{ + ResourceSpec: resourceSpec, + FlavorInfo: flavorInfo, + } +} + +func GetCloudbrainResourceSpec(jobType string, clusterType int, resourceSpecId int, flavorCode string) *ResourceAndFlavor { + if !SpecsMapInitFlag { + InitResourceSpecMap() } + if clusterType == TypeCloudBrainOne { + switch jobType { + case string(JobTypeDebug): + return NewResourceAndFlavor(CloudbrainDebugResourceSpecsMap[resourceSpecId], nil) + case string(JobTypeTrain): + return NewResourceAndFlavor(CloudbrainTrainResourceSpecsMap[resourceSpecId], nil) + case string(JobTypeBenchmark): + return NewResourceAndFlavor(CloudbrainBenchmarkResourceSpecsMap[resourceSpecId], nil) + + } + } else if clusterType == TypeCloudBrainTwo { + switch jobType { + case string(JobTypeDebug): + return NewResourceAndFlavor(nil, ModelArtsDebugResourceSpecsMap[flavorCode]) + case string(JobTypeTrain): + return NewResourceAndFlavor(nil, ModelArtsTrainResourceSpecsMap[flavorCode]) + case string(JobTypeInference): + return NewResourceAndFlavor(nil, ModelArtsTrainResourceSpecsMap[flavorCode]) + + } + } + return nil } + +func GetCloudbrainTaskUnitPrice(task Cloudbrain) int64 { + spec := GetCloudbrainResourceSpec(task.JobType, task.Type, task.ResourceSpecId, task.FlavorCode) + if spec == nil { + return 0 + } + if task.Type == TypeCloudBrainOne { + if spec.ResourceSpec == nil { + return 0 + } + return spec.ResourceSpec.UnitPrice + } else if task.Type == TypeCloudBrainTwo { + if spec.FlavorInfo == nil { + return 0 + } + return spec.FlavorInfo.UnitPrice + } + return 0 +} diff --git a/models/helper.go b/models/helper.go index a284424bb..55d4cac31 100644 --- a/models/helper.go +++ b/models/helper.go @@ -27,3 +27,11 @@ func valuesUser(m map[int64]*User) []*User { } return values } + +func valuesComment(m map[int64]*Comment) []*Comment { + var values = make([]*Comment, 0, len(m)) + for _, v := range m { + values = append(values, v) + } + return values +} diff --git a/models/reward_admin_log.go b/models/reward_admin_log.go index 24e3b8c47..fd79c3ed9 100644 --- a/models/reward_admin_log.go +++ b/models/reward_admin_log.go @@ -50,18 +50,18 @@ func UpdateRewardAdminLogStatus(logId string, oldStatus, newStatus int) error { return nil } -func GetRewardAdminLogByLogIds(logIds []string) ([]RewardAdminLog, error) { +func GetRewardAdminLogByLogIds(logIds []string) ([]*RewardAdminLog, error) { if len(logIds) == 0 { return nil, nil } - adminLogs := make([]AdminLogAndUser, 0) + adminLogs := make([]*AdminLogAndUser, 0) err := x.Table("reward_admin_log").Join("LEFT", "user", "reward_admin_log.creator_id = public.user.id").In("reward_admin_log.log_id", logIds).Find(&adminLogs) if err != nil { return nil, err } - r := make([]RewardAdminLog, len(adminLogs)) + r := make([]*RewardAdminLog, len(adminLogs)) for i, v := range adminLogs { - temp := v.AdminRewardAdminLog + temp := &v.AdminRewardAdminLog temp.CreatorName = v.User.Name r[i] = temp } diff --git a/models/reward_operate_record.go b/models/reward_operate_record.go index 444e477b6..6e4b15e9d 100644 --- a/models/reward_operate_record.go +++ b/models/reward_operate_record.go @@ -119,7 +119,6 @@ type RewardRecordShowList []*RewardOperateRecordShow func (l *RewardRecordList) ToShow() (RewardRecordShowList, error) { actionMap, err := l.GetRewardRecordAction() - adminLogMap, err := l.GetRewardRecordAdminLog() CloudbrainMap, err := l.GetRewardRecordCloudbrainTask() if err != nil { return nil, err @@ -129,11 +128,9 @@ func (l *RewardRecordList) ToShow() (RewardRecordShowList, error) { temp := v.ToShow() switch v.SourceType { case SourceTypeAccomplishTask.Name(): - temp.Action = actionMap[v.SourceId] - case SourceTypeAdminOperate.Name(): - temp.AdminLog = adminLogMap[v.SourceId] + temp.Action = actionMap[v.SourceId].ToShow() case SourceTypeRunCloudbrainTask.Name(): - temp.Cloudbrain = CloudbrainMap[v.SourceId] + temp.Cloudbrain = CloudbrainMap[v.SourceId].ToShow() } result = append(result, &temp) } @@ -141,7 +138,7 @@ func (l *RewardRecordList) ToShow() (RewardRecordShowList, error) { return result, nil } -func (l *RewardRecordList) GetRewardRecordAction() (map[string]Action, error) { +func (l *RewardRecordList) GetRewardRecordAction() (map[string]*Action, error) { if len(*l) == 0 { return nil, nil } @@ -157,15 +154,15 @@ func (l *RewardRecordList) GetRewardRecordAction() (map[string]Action, error) { if err != nil { return nil, err } - result := make(map[string]Action, 0) + result := make(map[string]*Action, 0) for _, v := range actions { - result[fmt.Sprint(v.ID)] = *v + result[fmt.Sprint(v.ID)] = v } return result, nil } -func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]RewardAdminLog, error) { +func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]*RewardAdminLog, error) { if len(*l) == 0 { return nil, nil } @@ -180,7 +177,7 @@ func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]RewardAdminLog, if err != nil { return nil, err } - result := make(map[string]RewardAdminLog, 0) + result := make(map[string]*RewardAdminLog, 0) for _, v := range logs { result[fmt.Sprint(v.LogId)] = v } @@ -188,7 +185,7 @@ func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]RewardAdminLog, } -func (l *RewardRecordList) GetRewardRecordCloudbrainTask() (map[string]Cloudbrain, error) { +func (l *RewardRecordList) GetRewardRecordCloudbrainTask() (map[string]*Cloudbrain, error) { if len(*l) == 0 { return nil, nil } @@ -204,7 +201,7 @@ func (l *RewardRecordList) GetRewardRecordCloudbrainTask() (map[string]Cloudbrai if err != nil { return nil, err } - result := make(map[string]Cloudbrain, 0) + result := make(map[string]*Cloudbrain, 0) for _, v := range cloudbrains { result[fmt.Sprint(v.ID)] = v } @@ -242,7 +239,6 @@ type AdminRewardOperateReq struct { func (r RewardOperateRecord) ToShow() RewardOperateRecordShow { return RewardOperateRecordShow{ SerialNo: r.SerialNo, - CreateDate: r.CreatedUnix, OperateType: r.OperateType, Amount: r.Amount, Remark: r.Remark, @@ -255,7 +251,6 @@ func (r RewardOperateRecord) ToShow() RewardOperateRecordShow { type RewardOperateRecordShow struct { SerialNo string - CreateDate timeutil.TimeStamp Status string OperateType string Amount int64 @@ -263,9 +258,9 @@ type RewardOperateRecordShow struct { Remark string SourceType string LastOperateDate timeutil.TimeStamp - Action Action - Cloudbrain Cloudbrain - AdminLog RewardAdminLog + Action *ActionShow + Cloudbrain *CloudbrainShow + AdminLog *RewardAdminLog } func getPointOperateRecord(tl *RewardOperateRecord) (*RewardOperateRecord, error) { diff --git a/modules/auth/modelarts.go b/modules/auth/modelarts.go index 0cbed45a6..ce41f5d1e 100755 --- a/modules/auth/modelarts.go +++ b/modules/auth/modelarts.go @@ -22,7 +22,6 @@ type CreateModelArtsNotebookForm struct { Description string `form:"description"` Flavor string `form:"flavor" binding:"Required"` ImageId string `form:"image_id" binding:"Required"` - ResourceSpecId int `form:"resource_spec_id"` } func (f *CreateModelArtsNotebookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { @@ -47,7 +46,6 @@ type CreateModelArtsTrainJobForm struct { VersionName string `form:"version_name" binding:"Required"` FlavorName string `form:"flaver_names" binding:"Required"` EngineName string `form:"engine_names" binding:"Required"` - ResourceSpecId int `form:"resource_spec_id"` } type CreateModelArtsInferenceJobForm struct { @@ -73,7 +71,6 @@ type CreateModelArtsInferenceJobForm struct { ModelName string `form:"model_name" binding:"Required"` ModelVersion string `form:"model_version" binding:"Required"` CkptName string `form:"ckpt_name" binding:"Required"` - ResourceSpecId int `form:"resource_spec_id"` } func (f *CreateModelArtsTrainJobForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { diff --git a/modules/modelarts/modelarts.go b/modules/modelarts/modelarts.go index de5c392cd..9cc8c46c6 100755 --- a/modules/modelarts/modelarts.go +++ b/modules/modelarts/modelarts.go @@ -140,8 +140,9 @@ type VersionInfo struct { type Flavor struct { Info []struct { - Code string `json:"code"` - Value string `json:"value"` + Code string `json:"code"` + Value string `json:"value"` + UnitPrice int64 `json:"unitPrice"` } `json:"flavor"` } diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go index 29c8b97bb..a075f3b70 100755 --- a/routers/repo/cloudbrain.go +++ b/routers/repo/cloudbrain.go @@ -230,7 +230,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { command = commandTrain } - if !account.IsPointBalanceEnough(ctx.User.ID, jobType, resourceSpecId) { + if !account.IsPointBalanceEnough(ctx.User.ID, jobType, models.TypeCloudBrainOne, resourceSpecId, "") { log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, jobType, resourceSpecId) cloudBrainNewDataPrepare(ctx) ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tpl, &form) @@ -318,7 +318,7 @@ func CloudBrainRestart(ctx *context.Context) { var status = string(models.JobWaiting) task := ctx.Cloudbrain for { - if !account.IsPointBalanceEnough(ctx.User.ID, task.JobType, task.ResourceSpecId) { + if !account.IsPointBalanceEnough(ctx.User.ID, task.JobType, models.TypeCloudBrainOne, task.ResourceSpecId, "") { log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, task.JobType, task.ResourceSpecId) resultCode = "-1" errorMsg = models.ErrInsufficientPointsBalance{}.Error() @@ -1870,7 +1870,7 @@ func BenchMarkAlgorithmCreate(ctx *context.Context, form auth.CreateCloudBrainFo repo := ctx.Repo.Repository - if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) { + if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeBenchmark), models.TypeCloudBrainOne, cloudbrain.BenchMarkResourceID, "") { log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) cloudBrainNewDataPrepare(ctx) ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tplCloudBrainBenchmarkNew, &form) @@ -2032,7 +2032,7 @@ func ModelBenchmarkCreate(ctx *context.Context, form auth.CreateCloudBrainForm) tpl := tplCloudBrainBenchmarkNew command := cloudbrain.Command - if !account.IsPointBalanceEnough(ctx.User.ID, jobType, resourceSpecId) { + if !account.IsPointBalanceEnough(ctx.User.ID, jobType, models.TypeCloudBrainOne, resourceSpecId, "") { log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, jobType, resourceSpecId) cloudBrainNewDataPrepare(ctx) ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tpl, &form) diff --git a/routers/repo/modelarts.go b/routers/repo/modelarts.go index bff9ec525..0b33a6dd7 100755 --- a/routers/repo/modelarts.go +++ b/routers/repo/modelarts.go @@ -205,10 +205,9 @@ func Notebook2Create(ctx *context.Context, form auth.CreateModelArtsNotebookForm flavor := form.Flavor imageId := form.ImageId repo := ctx.Repo.Repository - resourceSpecId := form.ResourceSpecId - if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeDebug), resourceSpecId) { - log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) + if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeDebug), models.TypeCloudBrainTwo, 0, flavor) { + log.Error("point balance is not enough,userId=%d jobType=%s ", ctx.User.ID, string(models.JobTypeBenchmark)) cloudBrainNewDataPrepare(ctx) ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tplModelArtsNotebookNew, &form) return @@ -426,7 +425,7 @@ func NotebookManage(ctx *context.Context) { errorMsg = "you have no right to restart the job" break } - if !account.IsPointBalanceEnough(ctx.User.ID, task.JobType, task.ResourceSpecId) { + if !account.IsPointBalanceEnough(ctx.User.ID, task.JobType, task.Type, task.ResourceSpecId, task.FlavorCode) { log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, task.JobType, task.ResourceSpecId) resultCode = "-1" errorMsg = models.ErrInsufficientPointsBalance{}.Error() @@ -1000,10 +999,9 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) FlavorName := form.FlavorName VersionCount := modelarts.VersionCount EngineName := form.EngineName - resourceSpecId := form.ResourceSpecId - if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeTrain), resourceSpecId) { - log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) + if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeTrain), models.TypeCloudBrainTwo, 0, flavorCode) { + log.Error("point balance is not enough,userId=%d jobType=%s", ctx.User.ID, string(models.JobTypeBenchmark)) cloudBrainNewDataPrepare(ctx) ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tplModelArtsTrainJobNew, &form) return @@ -1183,7 +1181,6 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) EngineName: EngineName, VersionCount: VersionCount, TotalVersionCount: modelarts.TotalVersionCount, - ResourceSpecId: resourceSpecId, } //将params转换Parameters.Parameter,出错时返回给前端 @@ -1847,12 +1844,11 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference modelName := form.ModelName modelVersion := form.ModelVersion ckptName := form.CkptName - resourceSpecId := form.ResourceSpecId ckptUrl := form.TrainUrl + form.CkptName - if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeInference), resourceSpecId) { - log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) + if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeInference), models.TypeCloudBrainTwo, 0, flavorCode) { + log.Error("point balance is not enough,userId=%d jobType=%s ", ctx.User.ID, string(models.JobTypeBenchmark)) inferenceJobErrorNewDataPrepare(ctx, form) ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tplModelArtsInferenceJobNew, &form) return @@ -2002,7 +1998,6 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference ModelVersion: modelVersion, CkptName: ckptName, ResultUrl: resultObsPath, - ResourceSpecId: resourceSpecId, } err = modelarts.GenerateInferenceJob(ctx, req) diff --git a/services/reward/cloubrain_deduct.go b/services/reward/cloubrain_deduct.go index 7d0c39028..fdec1c0c1 100644 --- a/services/reward/cloubrain_deduct.go +++ b/services/reward/cloubrain_deduct.go @@ -20,9 +20,9 @@ func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.Rewar return nil, nil } - spec := models.GetResourceSpec(task.JobType, task.ResourceSpecId) - if spec == nil || spec.UnitPrice == 0 { - log.Debug("GetResourceSpec failed,spec is nil or UnitPrice = 0") + unitPrice := models.GetCloudbrainTaskUnitPrice(task) + if unitPrice == 0 { + log.Debug("finish StartAndGetCloudBrainPointDeductTask, UnitPrice = 0 task.ID=%d", task.ID) return nil, nil } @@ -34,7 +34,7 @@ func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.Rewar OperateType: models.OperateTypeDecrease, Delay: setting.CloudBrainPayDelay, Interval: setting.CloudBrainPayInterval, - UnitAmount: spec.UnitPrice, + UnitAmount: unitPrice, RewardType: models.RewardTypePoint, StartTime: time.Unix(int64(task.StartTime), 0), Tittle: RUN_CLOUDBRAIN_TASK_TITTLE, diff --git a/services/reward/point/account/point_account.go b/services/reward/point/account/point_account.go index c1d5722c4..79e98f2b2 100644 --- a/services/reward/point/account/point_account.go +++ b/services/reward/point/account/point_account.go @@ -67,12 +67,18 @@ func InitAccount(userId int64) (*models.PointAccount, error) { } //IsPointBalanceEnough check whether the user's point balance is bigger than task unit price -func IsPointBalanceEnough(targetUserId int64, jobType string, resourceSpecId int) bool { +func IsPointBalanceEnough(targetUserId int64, jobType string, clusterType int, resourceSpecId int, flavorCode string) bool { if !setting.CloudBrainPaySwitch { return true } - spec := models.GetResourceSpec(jobType, resourceSpecId) - if spec == nil { + t := models.Cloudbrain{ + Type: clusterType, + JobType: jobType, + ResourceSpecId: resourceSpecId, + FlavorCode: flavorCode, + } + uniPrice := models.GetCloudbrainTaskUnitPrice(t) + if uniPrice == 0 { return true } a, err := GetAccount(targetUserId) @@ -80,6 +86,6 @@ func IsPointBalanceEnough(targetUserId int64, jobType string, resourceSpecId int log.Error("IsPointBalanceEnough GetAccount error,err=%v", err) return false } - return a.Balance >= spec.UnitPrice + return a.Balance >= uniPrice } diff --git a/services/task/task.go b/services/task/task.go index dcf7007c6..b53adb1f9 100644 --- a/services/task/task.go +++ b/services/task/task.go @@ -9,19 +9,13 @@ import ( ) func Accomplish(action models.Action) { + action.OpType = models.GetTaskOptType(action) switch action.OpType { case models.ActionCreateRepo, models.ActionCreateImage: if action.Repo.IsPrivate { return } - case models.ActionCreateDebugGPUTask, - models.ActionCreateDebugNPUTask, - models.ActionCreateTrainTask, - models.ActionCreateInferenceTask, - models.ActionCreateBenchMarkTask, - models.ActionCreateGPUTrainTask: - action.OpType = models.ActionCreateCloudbrainTask } go accomplish(action) }