@@ -204,7 +204,7 @@ type CloudbrainShow struct { | |||||
JobType string | JobType string | ||||
DisplayJobName string | DisplayJobName string | ||||
Duration string | Duration string | ||||
ResourceSpec *ResourceAndFlavor | |||||
ResourceSpec *Specification | |||||
ComputeResource string | ComputeResource string | ||||
AiCenter string | AiCenter string | ||||
} | } | ||||
@@ -226,7 +226,7 @@ func (task *Cloudbrain) ToShow() *CloudbrainShow { | |||||
Type: task.Type, | Type: task.Type, | ||||
DisplayJobName: task.DisplayJobName, | DisplayJobName: task.DisplayJobName, | ||||
Duration: task.TrainJobDuration, | Duration: task.TrainJobDuration, | ||||
ResourceSpec: GetCloudbrainResourceSpec(task.JobType, task.Type, task.ResourceSpecId, task.FlavorCode), | |||||
ResourceSpec: task.Spec, | |||||
ComputeResource: task.ComputeResource, | ComputeResource: task.ComputeResource, | ||||
} | } | ||||
if task.Repo != nil { | if task.Repo != nil { | ||||
@@ -2292,133 +2292,6 @@ func GetCloudbrainByIds(ids []int64) ([]*Cloudbrain, error) { | |||||
return cloudbrains, nil | return cloudbrains, nil | ||||
} | } | ||||
var ( | |||||
SpecsMapInitFlag = false | |||||
CloudbrainDebugResourceSpecsMap map[int]*ResourceSpec | |||||
CloudbrainTrainResourceSpecsMap map[int]*ResourceSpec | |||||
CloudbrainBenchmarkResourceSpecsMap map[int]*ResourceSpec | |||||
ModelArtsDebugResourceSpecsMap map[string]*FlavorInfo | |||||
ModelArtsTrainResourceSpecsMap map[string]*FlavorInfo | |||||
) | |||||
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 | |||||
} | |||||
} | |||||
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 | |||||
} | |||||
} | |||||
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 | |||||
} | |||||
} | |||||
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 | |||||
} | |||||
type DatasetInfo struct { | type DatasetInfo struct { | ||||
DataLocalPath string | DataLocalPath string | ||||
Name string | Name string | ||||
@@ -107,3 +107,24 @@ func CountNoSpecHistoricTask() (int64, error) { | |||||
} | } | ||||
return n, nil | return n, nil | ||||
} | } | ||||
// GetResourceSpecMapByCloudbrainIDs | |||||
func GetResourceSpecMapByCloudbrainIDs(ids []int64) (map[int64]*Specification, error) { | |||||
specs := make([]*CloudbrainSpec, 0) | |||||
if err := x.In("cloudbrain_id", ids).Find(&specs); err != nil { | |||||
return nil, err | |||||
} | |||||
r := make(map[int64]*Specification, len(ids)) | |||||
for _, s := range specs { | |||||
r[s.CloudbrainID] = s.ConvertToSpecification() | |||||
} | |||||
return r, nil | |||||
} | |||||
func GetCloudbrainTaskUnitPrice(cloudbrainId int64) (int, error) { | |||||
s, err := GetCloudbrainSpecByID(cloudbrainId) | |||||
if err != nil { | |||||
return 0, err | |||||
} | |||||
return s.UnitPrice, nil | |||||
} |
@@ -167,16 +167,20 @@ func (l RewardRecordShowList) loadCloudbrain() error { | |||||
if err != nil { | if err != nil { | ||||
return err | return err | ||||
} | } | ||||
var ids []int64 | |||||
var repoIds []int64 | |||||
var taskIds []int64 | |||||
for _, task := range cloudbrains { | for _, task := range cloudbrains { | ||||
ids = append(ids, task.RepoID) | |||||
repoIds = append(repoIds, task.RepoID) | |||||
taskIds = append(taskIds, task.ID) | |||||
} | } | ||||
repositoryMap, err := GetRepositoriesMapByIDs(ids) | |||||
repositoryMap, err := GetRepositoriesMapByIDs(repoIds) | |||||
specMap, err := GetResourceSpecMapByCloudbrainIDs(taskIds) | |||||
if err != nil { | if err != nil { | ||||
return err | return err | ||||
} | } | ||||
for _, v := range cloudbrains { | for _, v := range cloudbrains { | ||||
v.Repo = repositoryMap[v.RepoID] | v.Repo = repositoryMap[v.RepoID] | ||||
v.Spec = specMap[v.ID] | |||||
cloudbrainMap[v.ID].Cloudbrain = v.ToShow() | cloudbrainMap[v.ID].Cloudbrain = v.ToShow() | ||||
} | } | ||||
@@ -51,7 +51,7 @@ type StartPeriodicTaskOpts struct { | |||||
OperateType RewardOperateType | OperateType RewardOperateType | ||||
Delay time.Duration | Delay time.Duration | ||||
Interval time.Duration | Interval time.Duration | ||||
UnitAmount int64 | |||||
UnitAmount int | |||||
RewardType RewardType | RewardType RewardType | ||||
StartTime time.Time | StartTime time.Time | ||||
} | } | ||||
@@ -1,9 +1,9 @@ | |||||
package authentication | package authentication | ||||
import ( | import ( | ||||
"code.gitea.io/gitea/modules/auth/wechat" | |||||
"code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
"code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
wechat "code.gitea.io/gitea/services/wechat" | |||||
"encoding/xml" | "encoding/xml" | ||||
"io/ioutil" | "io/ioutil" | ||||
"time" | "time" | ||||
@@ -2,8 +2,8 @@ package repo | |||||
import ( | import ( | ||||
"bufio" | "bufio" | ||||
"code.gitea.io/gitea/services/reward/point/account" | |||||
"code.gitea.io/gitea/services/cloudbrain/resource" | "code.gitea.io/gitea/services/cloudbrain/resource" | ||||
"code.gitea.io/gitea/services/reward/point/account" | |||||
"encoding/json" | "encoding/json" | ||||
"errors" | "errors" | ||||
"fmt" | "fmt" | ||||
@@ -198,13 +198,6 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
repo := ctx.Repo.Repository | repo := ctx.Repo.Repository | ||||
tpl := tplCloudBrainNew | tpl := tplCloudBrainNew | ||||
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(ctx.Tr("points.insufficient_points_balance"), tpl, &form) | |||||
return | |||||
} | |||||
if jobType == string(models.JobTypeTrain) { | if jobType == string(models.JobTypeTrain) { | ||||
tpl = tplCloudBrainTrainJobNew | tpl = tplCloudBrainTrainJobNew | ||||
} | } | ||||
@@ -310,6 +303,13 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
return | return | ||||
} | } | ||||
if !account.IsPointBalanceEnough(ctx.User.ID, spec.UnitPrice) { | |||||
log.Error("point balance is not enough,userId=%d specId=%d", ctx.User.ID, spec.ID) | |||||
cloudBrainNewDataPrepare(ctx) | |||||
ctx.RenderWithErr(ctx.Tr("points.insufficient_points_balance"), tpl, &form) | |||||
return | |||||
} | |||||
req := cloudbrain.GenerateCloudBrainTaskReq{ | req := cloudbrain.GenerateCloudBrainTaskReq{ | ||||
Ctx: ctx, | Ctx: ctx, | ||||
DisplayJobName: displayJobName, | DisplayJobName: displayJobName, | ||||
@@ -556,13 +556,6 @@ func CloudBrainRestart(ctx *context.Context) { | |||||
var status = string(models.JobWaiting) | var status = string(models.JobWaiting) | ||||
task := ctx.Cloudbrain | task := ctx.Cloudbrain | ||||
for { | for { | ||||
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 = ctx.Tr("points.insufficient_points_balance") | |||||
break | |||||
} | |||||
if task.Status != string(models.JobStopped) && task.Status != string(models.JobSucceeded) && task.Status != string(models.JobFailed) { | if task.Status != string(models.JobStopped) && task.Status != string(models.JobSucceeded) && task.Status != string(models.JobFailed) { | ||||
log.Error("the job(%s) is not stopped", task.JobName, ctx.Data["MsgID"]) | log.Error("the job(%s) is not stopped", task.JobName, ctx.Data["MsgID"]) | ||||
resultCode = "-1" | resultCode = "-1" | ||||
@@ -604,6 +597,13 @@ func CloudBrainRestart(ctx *context.Context) { | |||||
} | } | ||||
task.Spec = spec | task.Spec = spec | ||||
if !account.IsPointBalanceEnough(ctx.User.ID, spec.UnitPrice) { | |||||
log.Error("point balance is not enough,userId=%d specId=%d", ctx.User.ID, spec.ID) | |||||
resultCode = "-1" | |||||
errorMsg = ctx.Tr("points.insufficient_points_balance") | |||||
break | |||||
} | |||||
count, err := models.GetCloudbrainCountByUserID(ctx.User.ID, string(models.JobTypeDebug)) | count, err := models.GetCloudbrainCountByUserID(ctx.User.ID, string(models.JobTypeDebug)) | ||||
if err != nil { | if err != nil { | ||||
log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
@@ -2227,13 +2227,6 @@ func BenchMarkAlgorithmCreate(ctx *context.Context, form auth.CreateCloudBrainFo | |||||
repo := ctx.Repo.Repository | repo := ctx.Repo.Repository | ||||
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(ctx.Tr("points.insufficient_points_balance"), tplCloudBrainBenchmarkNew, &form) | |||||
return | |||||
} | |||||
tasks, err := models.GetCloudbrainsByDisplayJobName(repo.ID, string(models.JobTypeBenchmark), displayJobName) | tasks, err := models.GetCloudbrainsByDisplayJobName(repo.ID, string(models.JobTypeBenchmark), displayJobName) | ||||
if err == nil { | if err == nil { | ||||
if len(tasks) != 0 { | if len(tasks) != 0 { | ||||
@@ -2275,6 +2268,12 @@ func BenchMarkAlgorithmCreate(ctx *context.Context, form auth.CreateCloudBrainFo | |||||
ctx.RenderWithErr("Resource specification not available", tplCloudBrainBenchmarkNew, &form) | ctx.RenderWithErr("Resource specification not available", tplCloudBrainBenchmarkNew, &form) | ||||
return | return | ||||
} | } | ||||
if !account.IsPointBalanceEnough(ctx.User.ID, spec.UnitPrice) { | |||||
log.Error("point balance is not enough,userId=%d specId=%d", ctx.User.ID, spec.ID) | |||||
cloudBrainNewDataPrepare(ctx) | |||||
ctx.RenderWithErr(ctx.Tr("points.insufficient_points_balance"), tplCloudBrainBenchmarkNew, &form) | |||||
return | |||||
} | |||||
count, err := models.GetBenchmarkCountByUserID(ctx.User.ID) | count, err := models.GetBenchmarkCountByUserID(ctx.User.ID) | ||||
if err != nil { | if err != nil { | ||||
@@ -2407,13 +2406,6 @@ func ModelBenchmarkCreate(ctx *context.Context, form auth.CreateCloudBrainForm) | |||||
tpl := tplCloudBrainBenchmarkNew | tpl := tplCloudBrainBenchmarkNew | ||||
command := cloudbrain.GetCloudbrainDebugCommand() | command := cloudbrain.GetCloudbrainDebugCommand() | ||||
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(ctx.Tr("points.insufficient_points_balance"), tpl, &form) | |||||
return | |||||
} | |||||
tasks, err := models.GetCloudbrainsByDisplayJobName(repo.ID, jobType, displayJobName) | tasks, err := models.GetCloudbrainsByDisplayJobName(repo.ID, jobType, displayJobName) | ||||
if err == nil { | if err == nil { | ||||
if len(tasks) != 0 { | if len(tasks) != 0 { | ||||
@@ -2499,6 +2491,13 @@ func ModelBenchmarkCreate(ctx *context.Context, form auth.CreateCloudBrainForm) | |||||
ctx.RenderWithErr("Resource specification not available", tpl, &form) | ctx.RenderWithErr("Resource specification not available", tpl, &form) | ||||
return | return | ||||
} | } | ||||
if !account.IsPointBalanceEnough(ctx.User.ID, spec.UnitPrice) { | |||||
log.Error("point balance is not enough,userId=%d specId=%d", ctx.User.ID, spec.ID) | |||||
cloudBrainNewDataPrepare(ctx) | |||||
ctx.RenderWithErr(ctx.Tr("points.insufficient_points_balance"), tpl, &form) | |||||
return | |||||
} | |||||
req := cloudbrain.GenerateCloudBrainTaskReq{ | req := cloudbrain.GenerateCloudBrainTaskReq{ | ||||
Ctx: ctx, | Ctx: ctx, | ||||
DisplayJobName: displayJobName, | DisplayJobName: displayJobName, | ||||
@@ -2,8 +2,8 @@ package repo | |||||
import ( | import ( | ||||
"archive/zip" | "archive/zip" | ||||
"code.gitea.io/gitea/services/reward/point/account" | |||||
"code.gitea.io/gitea/services/cloudbrain/resource" | "code.gitea.io/gitea/services/cloudbrain/resource" | ||||
"code.gitea.io/gitea/services/reward/point/account" | |||||
"encoding/json" | "encoding/json" | ||||
"errors" | "errors" | ||||
"io" | "io" | ||||
@@ -214,12 +214,6 @@ func Notebook2Create(ctx *context.Context, form auth.CreateModelArtsNotebookForm | |||||
imageId := form.ImageId | imageId := form.ImageId | ||||
repo := ctx.Repo.Repository | repo := ctx.Repo.Repository | ||||
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(ctx.Tr("points.insufficient_points_balance"), tplModelArtsNotebookNew, &form) | |||||
return | |||||
} | |||||
count, err := models.GetCloudbrainNotebookCountByUserID(ctx.User.ID) | count, err := models.GetCloudbrainNotebookCountByUserID(ctx.User.ID) | ||||
if err != nil { | if err != nil { | ||||
log.Error("GetCloudbrainNotebookCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetCloudbrainNotebookCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
@@ -262,6 +256,13 @@ func Notebook2Create(ctx *context.Context, form auth.CreateModelArtsNotebookForm | |||||
ctx.RenderWithErr("Resource specification not available", tplModelArtsNotebookNew, &form) | ctx.RenderWithErr("Resource specification not available", tplModelArtsNotebookNew, &form) | ||||
return | return | ||||
} | } | ||||
if !account.IsPointBalanceEnough(ctx.User.ID, spec.UnitPrice) { | |||||
log.Error("point balance is not enough,userId=%d specId=%d ", ctx.User.ID, spec.ID) | |||||
cloudBrainNewDataPrepare(ctx) | |||||
ctx.RenderWithErr(ctx.Tr("points.insufficient_points_balance"), tplModelArtsNotebookNew, &form) | |||||
return | |||||
} | |||||
err = modelarts.GenerateNotebook2(ctx, displayJobName, jobName, uuid, description, imageId, spec) | err = modelarts.GenerateNotebook2(ctx, displayJobName, jobName, uuid, description, imageId, spec) | ||||
if err != nil { | if err != nil { | ||||
log.Error("GenerateNotebook2 failed, %v", err, ctx.Data["MsgID"]) | log.Error("GenerateNotebook2 failed, %v", err, ctx.Data["MsgID"]) | ||||
@@ -434,8 +435,8 @@ func NotebookRestart(ctx *context.Context) { | |||||
break | break | ||||
} | } | ||||
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) | |||||
if !account.IsPointBalanceEnough(ctx.User.ID, spec.UnitPrice) { | |||||
log.Error("point balance is not enough,userId=%d specId=%d", ctx.User.ID, spec.ID) | |||||
resultCode = "-1" | resultCode = "-1" | ||||
errorMsg = ctx.Tr("points.insufficient_points_balance") | errorMsg = ctx.Tr("points.insufficient_points_balance") | ||||
break | break | ||||
@@ -1102,12 +1103,6 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||||
VersionCount := modelarts.VersionCountOne | VersionCount := modelarts.VersionCountOne | ||||
EngineName := form.EngineName | EngineName := form.EngineName | ||||
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(ctx.Tr("points.insufficient_points_balance"), tplModelArtsTrainJobNew, &form) | |||||
return | |||||
} | |||||
count, err := models.GetCloudbrainTrainJobCountByUserID(ctx.User.ID) | count, err := models.GetCloudbrainTrainJobCountByUserID(ctx.User.ID) | ||||
if err != nil { | if err != nil { | ||||
log.Error("GetCloudbrainTrainJobCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetCloudbrainTrainJobCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
@@ -1148,6 +1143,13 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||||
ctx.RenderWithErr("Resource specification not available", tplModelArtsTrainJobNew, &form) | ctx.RenderWithErr("Resource specification not available", tplModelArtsTrainJobNew, &form) | ||||
return | return | ||||
} | } | ||||
if !account.IsPointBalanceEnough(ctx.User.ID, spec.UnitPrice) { | |||||
log.Error("point balance is not enough,userId=%d specId=%d", ctx.User.ID, spec.ID) | |||||
cloudBrainNewDataPrepare(ctx) | |||||
ctx.RenderWithErr(ctx.Tr("points.insufficient_points_balance"), tplModelArtsTrainJobNew, &form) | |||||
return | |||||
} | |||||
//Determine whether the task name of the task in the project is duplicated | //Determine whether the task name of the task in the project is duplicated | ||||
tasks, err := models.GetCloudbrainsByDisplayJobName(repo.ID, string(models.JobTypeTrain), displayJobName) | tasks, err := models.GetCloudbrainsByDisplayJobName(repo.ID, string(models.JobTypeTrain), displayJobName) | ||||
if err == nil { | if err == nil { | ||||
@@ -2026,12 +2028,6 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||||
ckptUrl := "/" + form.TrainUrl + form.CkptName | ckptUrl := "/" + form.TrainUrl + form.CkptName | ||||
log.Info("ckpt url:" + ckptUrl) | log.Info("ckpt url:" + ckptUrl) | ||||
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(ctx.Tr("points.insufficient_points_balance"), tplModelArtsInferenceJobNew, &form) | |||||
return | |||||
} | |||||
count, err := models.GetCloudbrainInferenceJobCountByUserID(ctx.User.ID) | count, err := models.GetCloudbrainInferenceJobCountByUserID(ctx.User.ID) | ||||
if err != nil { | if err != nil { | ||||
log.Error("GetCloudbrainInferenceJobCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetCloudbrainInferenceJobCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
@@ -2090,6 +2086,13 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||||
ctx.RenderWithErr("Resource specification not available", tplModelArtsInferenceJobNew, &form) | ctx.RenderWithErr("Resource specification not available", tplModelArtsInferenceJobNew, &form) | ||||
return | return | ||||
} | } | ||||
if !account.IsPointBalanceEnough(ctx.User.ID, spec.UnitPrice) { | |||||
log.Error("point balance is not enough,userId=%d specId=%d ", ctx.User.ID, spec.ID) | |||||
inferenceJobErrorNewDataPrepare(ctx, form) | |||||
ctx.RenderWithErr(ctx.Tr("points.insufficient_points_balance"), tplModelArtsInferenceJobNew, &form) | |||||
return | |||||
} | |||||
//todo: del the codeLocalPath | //todo: del the codeLocalPath | ||||
_, err = ioutil.ReadDir(codeLocalPath) | _, err = ioutil.ReadDir(codeLocalPath) | ||||
if err == nil { | if err == nil { | ||||
@@ -20,7 +20,10 @@ func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.Rewar | |||||
return nil, nil | return nil, nil | ||||
} | } | ||||
unitPrice := models.GetCloudbrainTaskUnitPrice(task) | |||||
unitPrice, err := models.GetCloudbrainTaskUnitPrice(task.ID) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
if unitPrice == 0 { | if unitPrice == 0 { | ||||
log.Debug("finish StartAndGetCloudBrainPointDeductTask, UnitPrice = 0 task.ID=%d", task.ID) | log.Debug("finish StartAndGetCloudBrainPointDeductTask, UnitPrice = 0 task.ID=%d", task.ID) | ||||
return nil, nil | return nil, nil | ||||
@@ -16,7 +16,7 @@ func NewRewardPeriodicTask(operateRecordId string, opts *models.StartPeriodicTas | |||||
task := &models.RewardPeriodicTask{} | task := &models.RewardPeriodicTask{} | ||||
task.DelaySeconds = int64(opts.Delay.Seconds()) | task.DelaySeconds = int64(opts.Delay.Seconds()) | ||||
task.IntervalSeconds = int64(opts.Interval.Seconds()) | task.IntervalSeconds = int64(opts.Interval.Seconds()) | ||||
task.Amount = opts.UnitAmount | |||||
task.Amount = int64(opts.UnitAmount) | |||||
task.OperateSerialNo = operateRecordId | task.OperateSerialNo = operateRecordId | ||||
task.Status = models.PeriodicTaskStatusRunning | task.Status = models.PeriodicTaskStatusRunning | ||||
task.NextExecuteTime = timeutil.TimeStamp(opts.StartTime.Add(opts.Delay).Unix()) | task.NextExecuteTime = timeutil.TimeStamp(opts.StartTime.Add(opts.Delay).Unix()) | ||||
@@ -69,18 +69,11 @@ func InitAccount(userId int64) (*models.PointAccount, error) { | |||||
} | } | ||||
//IsPointBalanceEnough check whether the user's point balance is bigger than task unit price | //IsPointBalanceEnough check whether the user's point balance is bigger than task unit price | ||||
func IsPointBalanceEnough(targetUserId int64, jobType string, clusterType int, resourceSpecId int, flavorCode string) bool { | |||||
func IsPointBalanceEnough(targetUserId int64, unitPrice int) bool { | |||||
if !setting.CloudBrainPaySwitch { | if !setting.CloudBrainPaySwitch { | ||||
return true | return true | ||||
} | } | ||||
t := models.Cloudbrain{ | |||||
Type: clusterType, | |||||
JobType: jobType, | |||||
ResourceSpecId: resourceSpecId, | |||||
FlavorCode: flavorCode, | |||||
} | |||||
uniPrice := models.GetCloudbrainTaskUnitPrice(t) | |||||
if uniPrice == 0 { | |||||
if unitPrice == 0 { | |||||
return true | return true | ||||
} | } | ||||
a, err := GetAccount(targetUserId) | a, err := GetAccount(targetUserId) | ||||
@@ -88,8 +81,7 @@ func IsPointBalanceEnough(targetUserId int64, jobType string, clusterType int, r | |||||
log.Error("IsPointBalanceEnough GetAccount error,err=%v", err) | log.Error("IsPointBalanceEnough GetAccount error,err=%v", err) | ||||
return false | return false | ||||
} | } | ||||
return a.Balance >= uniPrice | |||||
return a.Balance >= int64(unitPrice) | |||||
} | } | ||||
func SearchPointAccount(opt models.SearchPointAccountOpts) (*models.SearchPointAccountResponse, error) { | func SearchPointAccount(opt models.SearchPointAccountOpts) (*models.SearchPointAccountResponse, error) { | ||||
@@ -2,6 +2,7 @@ package wechat | |||||
import ( | import ( | ||||
"code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
"code.gitea.io/gitea/modules/auth/wechat" | |||||
"code.gitea.io/gitea/modules/notification" | "code.gitea.io/gitea/modules/notification" | ||||
"code.gitea.io/gitea/modules/redis/redis_client" | "code.gitea.io/gitea/modules/redis/redis_client" | ||||
"code.gitea.io/gitea/modules/redis/redis_key" | "code.gitea.io/gitea/modules/redis/redis_key" | ||||
@@ -144,17 +145,17 @@ func HandleScanEvent(we WechatMsg) string { | |||||
if val == "" { | if val == "" { | ||||
return "" | return "" | ||||
} | } | ||||
qrCache := new(QRCode4BindCache) | |||||
qrCache := new(wechat.QRCode4BindCache) | |||||
json.Unmarshal([]byte(val), qrCache) | json.Unmarshal([]byte(val), qrCache) | ||||
if qrCache.Status == BIND_STATUS_UNBIND { | |||||
err := BindWechat(qrCache.UserId, we.FromUserName) | |||||
if qrCache.Status == wechat.BIND_STATUS_UNBIND { | |||||
err := wechat.BindWechat(qrCache.UserId, we.FromUserName) | |||||
if err != nil { | if err != nil { | ||||
if err, ok := err.(WechatBindError); ok { | |||||
if err, ok := err.(wechat.WechatBindError); ok { | |||||
return err.Reply | return err.Reply | ||||
} | } | ||||
return BIND_REPLY_FAILED_DEFAULT | |||||
return wechat.BIND_REPLY_FAILED_DEFAULT | |||||
} | } | ||||
qrCache.Status = BIND_STATUS_BOUND | |||||
qrCache.Status = wechat.BIND_STATUS_BOUND | |||||
jsonStr, _ := json.Marshal(qrCache) | jsonStr, _ := json.Marshal(qrCache) | ||||
redis_client.Setex(redis_key.WechatBindingUserIdKey(sceneStr), string(jsonStr), 60*time.Second) | redis_client.Setex(redis_key.WechatBindingUserIdKey(sceneStr), string(jsonStr), 60*time.Second) | ||||
} | } | ||||
@@ -163,7 +164,7 @@ func HandleScanEvent(we WechatMsg) string { | |||||
notification.NotifyWechatBind(u, we.FromUserName) | notification.NotifyWechatBind(u, we.FromUserName) | ||||
} | } | ||||
return BIND_REPLY_SUCCESS | |||||
return wechat.BIND_REPLY_SUCCESS | |||||
} | } | ||||
func HandleSubscribeEvent(we WechatMsg) *WechatReplyContent { | func HandleSubscribeEvent(we WechatMsg) *WechatReplyContent { |