Reviewed-on: https://git.openi.org.cn/OpenI/aiforge/pulls/1020tags/v1.21.12.1
| @@ -31,6 +31,7 @@ const ( | |||
| JobTypeBrainScore JobType = "BRAINSCORE" | |||
| JobTypeTrain JobType = "TRAIN" | |||
| //notebook | |||
| ModelArtsCreateQueue ModelArtsJobStatus = "CREATE_QUEUING" //免费资源创建排队中 | |||
| ModelArtsCreating ModelArtsJobStatus = "CREATING" //创建中 | |||
| ModelArtsCreateFailed ModelArtsJobStatus = "CREATE_FAILED" //创建失败 | |||
| @@ -46,6 +47,30 @@ const ( | |||
| ModelArtsDeleted ModelArtsJobStatus = "DELETED" //已删除 | |||
| ModelArtsResizing ModelArtsJobStatus = "RESIZING" //规格变更中 | |||
| ModelArtsResizFailed ModelArtsJobStatus = "RESIZE_FAILED" //规格变更失败 | |||
| //trainjob | |||
| ModelArtsTrainJobUnknown ModelArtsJobStatus = "UNKNOWN" //作业状态未知 | |||
| ModelArtsTrainJobInit ModelArtsJobStatus = "INIT" //作业初始化状态 | |||
| ModelArtsTrainJobImageCreating ModelArtsJobStatus = "IMAGE_CREATING" //作业镜像正在创建 | |||
| ModelArtsTrainJobImageFailed ModelArtsJobStatus = "IMAGE_FAILED" //作业镜像创建失败 | |||
| ModelArtsTrainJobSubmitTrying ModelArtsJobStatus = "SUBMIT_TRYING" //作业正在提交 | |||
| ModelArtsTrainJobSubmitFailed ModelArtsJobStatus = "SUBMIT_FAILED" //作业提交失败 | |||
| ModelArtsTrainJobDeleteFailed ModelArtsJobStatus = "DELETE_FAILED" //作业删除失败 | |||
| ModelArtsTrainJobWaiting ModelArtsJobStatus = "WAITING" //作业正在排队中 | |||
| ModelArtsTrainJobRunning ModelArtsJobStatus = "RUNNING" //作业正在运行中 | |||
| ModelArtsTrainJobKilling ModelArtsJobStatus = "KILLING" //作业正在取消 | |||
| ModelArtsTrainJobCompleted ModelArtsJobStatus = "COMPLETED" //作业已经完成 | |||
| ModelArtsTrainJobFailed ModelArtsJobStatus = "FAILED" //作业运行失败 | |||
| ModelArtsTrainJobKilled ModelArtsJobStatus = "KILLED" //作业取消成功 | |||
| ModelArtsTrainJobCanceled ModelArtsJobStatus = "CANCELED" //作业取消 | |||
| ModelArtsTrainJobLost ModelArtsJobStatus = "LOST" //作业丢失 | |||
| ModelArtsTrainJobScaling ModelArtsJobStatus = "SCALING" //作业正在扩容 | |||
| ModelArtsTrainJobSubmitModelFailed ModelArtsJobStatus = "SUBMIT_MODEL_FAILED" //提交模型失败 | |||
| ModelArtsTrainJobDeployServiceFailed ModelArtsJobStatus = "DEPLOY_SERVICE_FAILED" //部署服务失败 | |||
| ModelArtsTrainJobCheckInit ModelArtsJobStatus = "CHECK_INIT" //审核作业初始化 | |||
| ModelArtsTrainJobCheckRunning ModelArtsJobStatus = "CHECK_RUNNING" //审核作业正在运行中 | |||
| ModelArtsTrainJobCheckRunningCompleted ModelArtsJobStatus = "CHECK_RUNNING_COMPLETED" //审核作业已经完成 | |||
| ModelArtsTrainJobCheckFailed ModelArtsJobStatus = "CHECK_FAILED" //审核作业失败 | |||
| ) | |||
| type Cloudbrain struct { | |||
| @@ -1091,3 +1116,31 @@ func CanDelJob(isSigned bool, user *User, job *CloudbrainInfo) bool { | |||
| } | |||
| return false | |||
| } | |||
| func GetCloudBrainUnStoppedJob() ([]*Cloudbrain, error) { | |||
| cloudbrains := make([]*Cloudbrain, 0, 10) | |||
| return cloudbrains, x. | |||
| NotIn("status", | |||
| JobStopped, JobSucceeded, JobFailed, ModelArtsCreateFailed, ModelArtsStartFailed, ModelArtsUnavailable, ModelArtsResizFailed, ModelArtsDeleted, | |||
| ModelArtsStopped, ModelArtsTrainJobCanceled, ModelArtsTrainJobCheckFailed, ModelArtsTrainJobCompleted, ModelArtsTrainJobDeleteFailed, ModelArtsTrainJobDeployServiceFailed, | |||
| ModelArtsTrainJobFailed, ModelArtsTrainJobImageFailed, ModelArtsTrainJobKilled, ModelArtsTrainJobLost, ModelArtsTrainJobSubmitFailed, ModelArtsTrainJobSubmitModelFailed). | |||
| Limit(100). | |||
| Find(&cloudbrains) | |||
| } | |||
| func GetCloudbrainCountByUserID(userID int64) (int, error) { | |||
| count, err := x.In("status", JobWaiting, JobRunning).And("job_type = ? and user_id = ? and type = ?", JobTypeDebug, userID, TypeCloudBrainOne).Count(new(Cloudbrain)) | |||
| return int(count), err | |||
| } | |||
| func GetCloudbrainNotebookCountByUserID(userID int64) (int, error) { | |||
| count, err := x.In("status", ModelArtsCreateQueue, ModelArtsCreating, ModelArtsStarting, ModelArtsReadyToStart, ModelArtsResizing, ModelArtsStartQueuing, ModelArtsRunning, ModelArtsRestarting). | |||
| And("job_type = ? and user_id = ? and type = ?", JobTypeDebug, userID, TypeCloudBrainTwo).Count(new(Cloudbrain)) | |||
| return int(count), err | |||
| } | |||
| func GetCloudbrainTrainJobCountByUserID(userID int64) (int, error) { | |||
| count, err := x.In("status", ModelArtsTrainJobInit, ModelArtsTrainJobImageCreating, ModelArtsTrainJobSubmitTrying, ModelArtsTrainJobWaiting, ModelArtsTrainJobRunning, ModelArtsTrainJobScaling, ModelArtsTrainJobCheckInit, ModelArtsTrainJobCheckRunning, ModelArtsTrainJobCheckRunningCompleted). | |||
| And("job_type = ? and user_id = ? and type = ?", JobTypeTrain, userID, TypeCloudBrainTwo).Count(new(Cloudbrain)) | |||
| return int(count), err | |||
| } | |||
| @@ -524,7 +524,7 @@ func RepoAssignment() macaron.Handler { | |||
| } | |||
| ctx.Data["Tags"] = tags | |||
| brs, err := ctx.Repo.GitRepo.GetBranches() | |||
| brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches", err) | |||
| return | |||
| @@ -712,7 +712,7 @@ func RepoRefByType(refType RepoRefType) macaron.Handler { | |||
| refName = ctx.Repo.Repository.DefaultBranch | |||
| ctx.Repo.BranchName = refName | |||
| if !ctx.Repo.GitRepo.IsBranchExist(refName) { | |||
| brs, err := ctx.Repo.GitRepo.GetBranches() | |||
| brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches", err) | |||
| return | |||
| @@ -6,7 +6,9 @@ | |||
| package git | |||
| import ( | |||
| "bufio" | |||
| "fmt" | |||
| "io" | |||
| "strings" | |||
| "github.com/go-git/go-git/v5/plumbing" | |||
| @@ -74,25 +76,6 @@ func (repo *Repository) SetDefaultBranch(name string) error { | |||
| return err | |||
| } | |||
| // GetBranches returns all branches of the repository. | |||
| func (repo *Repository) GetBranches() ([]string, error) { | |||
| var branchNames []string | |||
| branches, err := repo.gogitRepo.Branches() | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| _ = branches.ForEach(func(branch *plumbing.Reference) error { | |||
| branchNames = append(branchNames, strings.TrimPrefix(branch.Name().String(), BranchPrefix)) | |||
| return nil | |||
| }) | |||
| // TODO: Sort? | |||
| return branchNames, nil | |||
| } | |||
| // GetBranch returns a branch by it's name | |||
| func (repo *Repository) GetBranch(branch string) (*Branch, error) { | |||
| if !repo.IsBranchExist(branch) { | |||
| @@ -106,16 +89,16 @@ func (repo *Repository) GetBranch(branch string) (*Branch, error) { | |||
| } | |||
| // GetBranchesByPath returns a branch by it's path | |||
| func GetBranchesByPath(path string) ([]*Branch, error) { | |||
| func GetBranchesByPath(path string, skip, limit int) ([]*Branch, int, error) { | |||
| gitRepo, err := OpenRepository(path) | |||
| if err != nil { | |||
| return nil, err | |||
| return nil, 0, err | |||
| } | |||
| defer gitRepo.Close() | |||
| brs, err := gitRepo.GetBranches() | |||
| brs, countAll, err := gitRepo.GetBranches(skip, limit) | |||
| if err != nil { | |||
| return nil, err | |||
| return nil, 0, err | |||
| } | |||
| branches := make([]*Branch, len(brs)) | |||
| @@ -127,7 +110,7 @@ func GetBranchesByPath(path string) ([]*Branch, error) { | |||
| } | |||
| } | |||
| return branches, nil | |||
| return branches, countAll, nil | |||
| } | |||
| // DeleteBranchOptions Option(s) for delete branch | |||
| @@ -183,3 +166,91 @@ func (repo *Repository) RemoveRemote(name string) error { | |||
| func (branch *Branch) GetCommit() (*Commit, error) { | |||
| return branch.gitRepo.GetBranchCommit(branch.Name) | |||
| } | |||
| // GetBranches returns branches from the repository, skipping skip initial branches and | |||
| // returning at most limit branches, or all branches if limit is 0. | |||
| func (repo *Repository) GetBranches(skip, limit int) ([]string, int, error) { | |||
| return callShowRef(repo.Path, BranchPrefix, "--heads", skip, limit) | |||
| } | |||
| // callShowRef return refs, if limit = 0 it will not limit | |||
| func callShowRef(repoPath, prefix, arg string, skip, limit int) (branchNames []string, countAll int, err error) { | |||
| stdoutReader, stdoutWriter := io.Pipe() | |||
| defer func() { | |||
| _ = stdoutReader.Close() | |||
| _ = stdoutWriter.Close() | |||
| }() | |||
| go func() { | |||
| stderrBuilder := &strings.Builder{} | |||
| err := NewCommand("show-ref", arg).RunInDirPipeline(repoPath, stdoutWriter, stderrBuilder) | |||
| if err != nil { | |||
| if stderrBuilder.Len() == 0 { | |||
| _ = stdoutWriter.Close() | |||
| return | |||
| } | |||
| _ = stdoutWriter.CloseWithError(ConcatenateError(err, stderrBuilder.String())) | |||
| } else { | |||
| _ = stdoutWriter.Close() | |||
| } | |||
| }() | |||
| i := 0 | |||
| bufReader := bufio.NewReader(stdoutReader) | |||
| for i < skip { | |||
| _, isPrefix, err := bufReader.ReadLine() | |||
| if err == io.EOF { | |||
| return branchNames, i, nil | |||
| } | |||
| if err != nil { | |||
| return nil, 0, err | |||
| } | |||
| if !isPrefix { | |||
| i++ | |||
| } | |||
| } | |||
| for limit == 0 || i < skip+limit { | |||
| // The output of show-ref is simply a list: | |||
| // <sha> SP <ref> LF | |||
| _, err := bufReader.ReadSlice(' ') | |||
| for err == bufio.ErrBufferFull { | |||
| // This shouldn't happen but we'll tolerate it for the sake of peace | |||
| _, err = bufReader.ReadSlice(' ') | |||
| } | |||
| if err == io.EOF { | |||
| return branchNames, i, nil | |||
| } | |||
| if err != nil { | |||
| return nil, 0, err | |||
| } | |||
| branchName, err := bufReader.ReadString('\n') | |||
| if err == io.EOF { | |||
| // This shouldn't happen... but we'll tolerate it for the sake of peace | |||
| return branchNames, i, nil | |||
| } | |||
| if err != nil { | |||
| return nil, i, err | |||
| } | |||
| branchName = strings.TrimPrefix(branchName, prefix) | |||
| if len(branchName) > 0 { | |||
| branchName = branchName[:len(branchName)-1] | |||
| } | |||
| branchNames = append(branchNames, branchName) | |||
| i++ | |||
| } | |||
| // count all refs | |||
| for limit != 0 { | |||
| _, isPrefix, err := bufReader.ReadLine() | |||
| if err == io.EOF { | |||
| return branchNames, i, nil | |||
| } | |||
| if err != nil { | |||
| return nil, 0, err | |||
| } | |||
| if !isPrefix { | |||
| i++ | |||
| } | |||
| } | |||
| return branchNames, i, nil | |||
| } | |||
| @@ -10,7 +10,6 @@ import ( | |||
| "strings" | |||
| "github.com/go-git/go-git/v5/plumbing" | |||
| "github.com/mcuadros/go-version" | |||
| ) | |||
| // TagPrefix tags prefix path on the repository | |||
| @@ -225,29 +224,35 @@ func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, error) { | |||
| return tags, nil | |||
| } | |||
| // GetTags returns all tags of the repository. | |||
| func (repo *Repository) GetTags() ([]string, error) { | |||
| var tagNames []string | |||
| tags, err := repo.gogitRepo.Tags() | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| //// GetTags returns all tags of the repository. | |||
| //func (repo *Repository) GetTags() ([]string, error) { | |||
| // var tagNames []string | |||
| // | |||
| // tags, err := repo.gogitRepo.Tags() | |||
| // if err != nil { | |||
| // return nil, err | |||
| // } | |||
| // | |||
| // _ = tags.ForEach(func(tag *plumbing.Reference) error { | |||
| // tagNames = append(tagNames, strings.TrimPrefix(tag.Name().String(), TagPrefix)) | |||
| // return nil | |||
| // }) | |||
| // | |||
| // version.Sort(tagNames) | |||
| // | |||
| // // Reverse order | |||
| // for i := 0; i < len(tagNames)/2; i++ { | |||
| // j := len(tagNames) - i - 1 | |||
| // tagNames[i], tagNames[j] = tagNames[j], tagNames[i] | |||
| // } | |||
| // | |||
| // return tagNames, nil | |||
| //} | |||
| _ = tags.ForEach(func(tag *plumbing.Reference) error { | |||
| tagNames = append(tagNames, strings.TrimPrefix(tag.Name().String(), TagPrefix)) | |||
| return nil | |||
| }) | |||
| version.Sort(tagNames) | |||
| // Reverse order | |||
| for i := 0; i < len(tagNames)/2; i++ { | |||
| j := len(tagNames) - i - 1 | |||
| tagNames[i], tagNames[j] = tagNames[j], tagNames[i] | |||
| } | |||
| return tagNames, nil | |||
| // GetTags returns all tags of the repository. | |||
| func (repo *Repository) GetTags() (tags []string, err error) { | |||
| tags, _, err = callShowRef(repo.Path, TagPrefix, "--tags", 0, 0) | |||
| return | |||
| } | |||
| // GetTagType gets the type of the tag, either commit (simple) or tag (annotated) | |||
| @@ -140,3 +140,11 @@ func ParseBool(value string) (result bool, valid bool) { | |||
| } | |||
| return intValue != 0, true | |||
| } | |||
| // ConcatenateError concatenats an error with stderr string | |||
| func ConcatenateError(err error, stderr string) error { | |||
| if len(stderr) == 0 { | |||
| return err | |||
| } | |||
| return fmt.Errorf("%w - %s", err, stderr) | |||
| } | |||
| @@ -23,9 +23,10 @@ func GetBranch(repo *models.Repository, branch string) (*git.Branch, error) { | |||
| return gitRepo.GetBranch(branch) | |||
| } | |||
| // GetBranches returns all the branches of a repository | |||
| func GetBranches(repo *models.Repository) ([]*git.Branch, error) { | |||
| return git.GetBranchesByPath(repo.RepoPath()) | |||
| // GetBranches returns branches from the repository, skipping skip initial branches and | |||
| // returning at most limit branches, or all branches if limit is 0. | |||
| func GetBranches(repo *models.Repository, skip, limit int) ([]*git.Branch, int, error) { | |||
| return git.GetBranchesByPath(repo.RepoPath(), skip, limit) | |||
| } | |||
| // checkBranchName validates branch name with existing repository branches | |||
| @@ -36,7 +37,7 @@ func checkBranchName(repo *models.Repository, name string) error { | |||
| } | |||
| defer gitRepo.Close() | |||
| branches, err := GetBranches(repo) | |||
| branches, _, err := GetBranches(repo, 0, 0) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| @@ -204,7 +204,7 @@ func ListBranches(ctx *context.APIContext) { | |||
| // "200": | |||
| // "$ref": "#/responses/BranchList" | |||
| branches, err := repo_module.GetBranches(ctx.Repo.Repository) | |||
| branches, _, err := repo_module.GetBranches(ctx.Repo.Repository,0,0) | |||
| if err != nil { | |||
| ctx.Error(http.StatusInternalServerError, "GetBranches", err) | |||
| return | |||
| @@ -181,7 +181,7 @@ func deleteBranch(ctx *context.Context, branchName string) error { | |||
| } | |||
| func loadBranches(ctx *context.Context) []*Branch { | |||
| rawBranches, err := repo_module.GetBranches(ctx.Repo.Repository) | |||
| rawBranches, _, err := repo_module.GetBranches(ctx.Repo.Repository, 0, 0) | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches", err) | |||
| return nil | |||
| @@ -216,7 +216,22 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||
| return | |||
| } | |||
| _, err := models.GetCloudbrainByName(jobName) | |||
| count, err := models.GetCloudbrainCountByUserID(ctx.User.ID) | |||
| if err != nil { | |||
| log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | |||
| cloudBrainNewDataPrepare(ctx) | |||
| ctx.RenderWithErr("system error", tplCloudBrainNew, &form) | |||
| return | |||
| } else { | |||
| if count >= 1 { | |||
| log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | |||
| cloudBrainNewDataPrepare(ctx) | |||
| ctx.RenderWithErr("you have already a running or waiting task, can not create more", tplCloudBrainNew, &form) | |||
| return | |||
| } | |||
| } | |||
| _, err = models.GetCloudbrainByName(jobName) | |||
| if err == nil { | |||
| log.Error("the job name did already exist", ctx.Data["MsgID"]) | |||
| cloudBrainNewDataPrepare(ctx) | |||
| @@ -507,7 +507,7 @@ func getBranchesForRepo(user *models.User, repo *models.Repository) (bool, []str | |||
| } | |||
| defer gitRepo.Close() | |||
| branches, err := gitRepo.GetBranches() | |||
| branches, _, err := gitRepo.GetBranches(0, 0) | |||
| if err != nil { | |||
| return false, nil, err | |||
| } | |||
| @@ -528,7 +528,7 @@ func CompareDiff(ctx *context.Context) { | |||
| } | |||
| if ctx.Data["PageIsComparePull"] == true { | |||
| headBranches, err := headGitRepo.GetBranches() | |||
| headBranches, _, err := headGitRepo.GetBranches(0,0) | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches", err) | |||
| return | |||
| @@ -424,7 +424,7 @@ func RetrieveRepoMetas(ctx *context.Context, repo *models.Repository, isPull boo | |||
| return nil | |||
| } | |||
| brs, err := ctx.Repo.GitRepo.GetBranches() | |||
| brs, _, err := ctx.Repo.GitRepo.GetBranches(0,0) | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches", err) | |||
| return nil | |||
| @@ -116,7 +116,22 @@ func NotebookCreate(ctx *context.Context, form auth.CreateModelArtsNotebookForm) | |||
| description := form.Description | |||
| flavor := form.Flavor | |||
| err := modelarts.GenerateTask(ctx, jobName, uuid, description, flavor) | |||
| count, err := models.GetCloudbrainNotebookCountByUserID(ctx.User.ID) | |||
| if err != nil { | |||
| log.Error("GetCloudbrainNotebookCountByUserID failed:%v", err, ctx.Data["MsgID"]) | |||
| cloudBrainNewDataPrepare(ctx) | |||
| ctx.RenderWithErr("system error", tplModelArtsNotebookNew, &form) | |||
| return | |||
| } else { | |||
| if count >= 1 { | |||
| log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | |||
| cloudBrainNewDataPrepare(ctx) | |||
| ctx.RenderWithErr("you have already a running or waiting task, can not create more", tplModelArtsNotebookNew, &form) | |||
| return | |||
| } | |||
| } | |||
| err = modelarts.GenerateTask(ctx, jobName, uuid, description, flavor) | |||
| if err != nil { | |||
| ctx.RenderWithErr(err.Error(), tplModelArtsNotebookNew, &form) | |||
| return | |||
| @@ -362,13 +377,6 @@ func trainJobNewDataPrepare(ctx *context.Context) error { | |||
| outputObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.OutputPath | |||
| ctx.Data["train_url"] = outputObsPath | |||
| Branches, err := ctx.Repo.GitRepo.GetBranches() | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches error:", err) | |||
| return err | |||
| } | |||
| ctx.Data["Branches"] = Branches | |||
| ctx.Data["BranchesCount"] = len(Branches) | |||
| ctx.Data["params"] = "" | |||
| ctx.Data["BranchName"] = ctx.Repo.BranchName | |||
| @@ -439,14 +447,6 @@ func ErrorNewDataPrepare(ctx *context.Context, form auth.CreateModelArtsTrainJob | |||
| outputObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.OutputPath | |||
| ctx.Data["train_url"] = outputObsPath | |||
| Branches, err := ctx.Repo.GitRepo.GetBranches() | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches error:", err) | |||
| return err | |||
| } | |||
| ctx.Data["Branches"] = Branches | |||
| ctx.Data["BranchesCount"] = len(Branches) | |||
| configList, err := getConfigList(modelarts.PerPage, 1, modelarts.SortByCreateTime, "desc", "", modelarts.ConfigTypeCustom) | |||
| if err != nil { | |||
| ctx.ServerError("getConfigList failed:", err) | |||
| @@ -542,13 +542,13 @@ func trainJobNewVersionDataPrepare(ctx *context.Context) error { | |||
| outputObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.OutputPath | |||
| ctx.Data["train_url"] = outputObsPath | |||
| Branches, err := ctx.Repo.GitRepo.GetBranches() | |||
| branches, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches error:", err) | |||
| return err | |||
| } | |||
| ctx.Data["branches"] = Branches | |||
| ctx.Data["branches"] = branches | |||
| ctx.Data["branch_name"] = task.BranchName | |||
| ctx.Data["description"] = task.Description | |||
| ctx.Data["boot_file"] = task.BootFile | |||
| @@ -631,12 +631,12 @@ func VersionErrorDataPrepare(ctx *context.Context, form auth.CreateModelArtsTrai | |||
| outputObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.OutputPath | |||
| ctx.Data["train_url"] = outputObsPath | |||
| Branches, err := ctx.Repo.GitRepo.GetBranches() | |||
| branches, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) | |||
| if err != nil { | |||
| ctx.ServerError("GetBranches error:", err) | |||
| return err | |||
| } | |||
| ctx.Data["branches"] = Branches | |||
| ctx.Data["branches"] = branches | |||
| ctx.Data["description"] = form.Description | |||
| ctx.Data["dataset_name"] = task.DatasetName | |||
| ctx.Data["work_server_number"] = form.WorkServerNumber | |||
| @@ -684,6 +684,21 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||
| VersionCount := modelarts.VersionCount | |||
| EngineName := form.EngineName | |||
| count, err := models.GetCloudbrainTrainJobCountByUserID(ctx.User.ID) | |||
| if err != nil { | |||
| log.Error("GetCloudbrainTrainJobCountByUserID failed:%v", err, ctx.Data["MsgID"]) | |||
| ErrorNewDataPrepare(ctx, form) | |||
| ctx.RenderWithErr("system error", tplModelArtsTrainJobNew, &form) | |||
| return | |||
| } else { | |||
| if count >= 1 { | |||
| log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | |||
| ErrorNewDataPrepare(ctx, form) | |||
| ctx.RenderWithErr("you have already a running or waiting task, can not create more", tplModelArtsTrainJobNew, &form) | |||
| return | |||
| } | |||
| } | |||
| if err := paramCheckCreateTrainJob(form); err != nil { | |||
| log.Error("paramCheckCreateTrainJob failed:(%v)", err) | |||
| ErrorNewDataPrepare(ctx, form) | |||
| @@ -854,6 +869,21 @@ func TrainJobCreateVersion(ctx *context.Context, form auth.CreateModelArtsTrainJ | |||
| ctx.Data["PageIsTrainJob"] = true | |||
| var jobID = ctx.Params(":jobid") | |||
| count, err := models.GetCloudbrainTrainJobCountByUserID(ctx.User.ID) | |||
| if err != nil { | |||
| log.Error("GetCloudbrainTrainJobCountByUserID failed:%v", err, ctx.Data["MsgID"]) | |||
| VersionErrorDataPrepare(ctx, form) | |||
| ctx.RenderWithErr("system error", tplModelArtsTrainJobVersionNew, &form) | |||
| return | |||
| } else { | |||
| if count >= 1 { | |||
| log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | |||
| VersionErrorDataPrepare(ctx, form) | |||
| ctx.RenderWithErr("you have already a running or waiting task, can not create more", tplModelArtsTrainJobVersionNew, &form) | |||
| return | |||
| } | |||
| } | |||
| latestTask, err := models.GetCloudbrainByJobIDAndIsLatestVersion(jobID, modelarts.IsLatestVersion) | |||
| if err != nil { | |||
| ctx.ServerError("GetCloudbrainByJobIDAndIsLatestVersion faild:", err) | |||
| @@ -208,7 +208,7 @@ func RepoStatisticDaily(date string) { | |||
| maxRepoRadar.Completeness = tempRepoStat.Completeness | |||
| } | |||
| if tempRepoStat.Liveness < minRepoRadar.Completeness { | |||
| if tempRepoStat.Liveness < minRepoRadar.Liveness { | |||
| minRepoRadar.Liveness = tempRepoStat.Liveness | |||
| } | |||
| @@ -252,7 +252,7 @@ func runSync(m *models.Mirror) ([]*mirrorSyncResult, bool) { | |||
| } | |||
| } | |||
| branches, err := repo_module.GetBranches(m.Repo) | |||
| branches, _, err := repo_module.GetBranches(m.Repo,0,0) | |||
| if err != nil { | |||
| log.Error("GetBranches: %v", err) | |||
| return nil, false | |||
| @@ -452,7 +452,7 @@ func CloseBranchPulls(doer *models.User, repoID int64, branch string) error { | |||
| // CloseRepoBranchesPulls close all pull requests which head branches are in the given repository | |||
| func CloseRepoBranchesPulls(doer *models.User, repo *models.Repository) error { | |||
| branches, err := git.GetBranchesByPath(repo.RepoPath()) | |||
| branches, _, err := git.GetBranchesByPath(repo.RepoPath(), 0, 0) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| @@ -474,6 +474,7 @@ td, th { | |||
| <script> | |||
| console.log({{.version_list_task}}) | |||
| console.log({{.}}) | |||
| $('.menu .item').tab() | |||
| // $('.ui.style.accordion').accordion(); | |||
| @@ -709,11 +710,13 @@ td, th { | |||
| } | |||
| function logScroll(version_name) { | |||
| let container = document.querySelector(`#log${version_name}`) | |||
| let scrollTop = container.scrollTop | |||
| let scrollHeight = container.scrollHeight | |||
| let clientHeight = container.clientHeight | |||
| if(parseInt(scrollTop) + clientHeight == scrollHeight || parseInt(scrollTop) + clientHeight +1 == scrollHeight || parseInt(scrollTop) + clientHeight - 1 == scrollHeight){ | |||
| let scrollLeft = container.scrollLeft | |||
| if((parseInt(scrollTop) + clientHeight == scrollHeight || parseInt(scrollTop) + clientHeight +1 == scrollHeight || parseInt(scrollTop) + clientHeight - 1 == scrollHeight) && (scrollLeft===0)){ | |||
| let end_line = $(`#log${version_name} input[name=end_line]`).val() | |||
| $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`, (data) => { | |||
| if (data.Lines == 0){ | |||
| @@ -736,7 +739,7 @@ td, th { | |||
| console.log(err); | |||
| }); | |||
| } | |||
| if(scrollTop == 0){ | |||
| if(scrollTop == 0 && scrollLeft==0){ | |||
| let start_line = $(`#log${version_name} input[name=start_line]`).val() | |||
| $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`, (data) => { | |||
| if (data.Lines == 0){ | |||
| @@ -346,7 +346,7 @@ | |||
| {{template "base/footer" .}} | |||
| <script> | |||
| let url_href = location.pathname.split('create_version')[0] | |||
| let url_href = location.pathname.split('/create_version')[0] | |||
| let url_post = location.pathname | |||
| let version_name = location.search.split('?version_name=')[1] | |||
| $("#parents_version").val(version_name) | |||