@@ -454,6 +454,7 @@ func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool) | |||||
AllowRebaseMerge: allowRebaseMerge, | AllowRebaseMerge: allowRebaseMerge, | ||||
AllowSquash: allowSquash, | AllowSquash: allowSquash, | ||||
AvatarURL: repo.avatarLink(e), | AvatarURL: repo.avatarLink(e), | ||||
Status: int(repo.Status), | |||||
} | } | ||||
} | } | ||||
@@ -311,6 +311,7 @@ func ToOrganization(org *models.User) *api.Organization { | |||||
Location: org.Location, | Location: org.Location, | ||||
Visibility: org.Visibility.String(), | Visibility: org.Visibility.String(), | ||||
RepoAdminChangeTeamAccess: org.RepoAdminChangeTeamAccess, | RepoAdminChangeTeamAccess: org.RepoAdminChangeTeamAccess, | ||||
NumRepos: org.NumRepos, | |||||
} | } | ||||
} | } | ||||
@@ -15,6 +15,7 @@ type Organization struct { | |||||
Location string `json:"location"` | Location string `json:"location"` | ||||
Visibility string `json:"visibility"` | Visibility string `json:"visibility"` | ||||
RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"` | RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"` | ||||
NumRepos int `json:"num_repos"` | |||||
} | } | ||||
// CreateOrgOption options for creating an organization | // CreateOrgOption options for creating an organization | ||||
@@ -90,6 +90,7 @@ type Repository struct { | |||||
AllowRebaseMerge bool `json:"allow_rebase_explicit"` | AllowRebaseMerge bool `json:"allow_rebase_explicit"` | ||||
AllowSquash bool `json:"allow_squash_merge"` | AllowSquash bool `json:"allow_squash_merge"` | ||||
AvatarURL string `json:"avatar_url"` | AvatarURL string `json:"avatar_url"` | ||||
Status int `json:"status"` | |||||
} | } | ||||
// CreateRepoOption options when creating repository | // CreateRepoOption options when creating repository | ||||
@@ -1217,7 +1217,7 @@ cloudbrain.benchmark.evaluate_train=Train Script | |||||
cloudbrain.benchmark.evaluate_test=Test Script | cloudbrain.benchmark.evaluate_test=Test Script | ||||
cloudbrain.benchmark.types={"type":[{"id":1,"rank_link":"https://git.openi.org.cn/benchmark/?username=admin&algType=detection","first":"Target detection","second":[{"id":1,"value":"None","attachment":"84cf39c4-d8bc-41aa-aaa3-182ce289b105","owner":"yangzhx","repo_name":"detection_benchmark_script"}]},{"id":2,"rank_link":"https://git.openi.org.cn/benchmark/?username=admin&algType=reid","first":"Target re-identification","second":[{"id":1,"value":"Vehicle re-identification","attachment":"84cf39c4-d8bc-41aa-aaa3-182ce289b105","owner":"JiahongXu","repo_name":"benchmark_reID_script"},{"id":2,"value":"Image-based person re-identification","attachment":"84cf39c4-d8bc-41aa-aaa3-182ce289b105","owner":"JiahongXu","repo_name":"benchmark_reID_script"}]},{"id":3,"rank_link":"https://git.openi.org.cn/benchmark/?username=admin&algType=tracking","first":"Multi-target tracking","second":[{"id":1,"value":"None","attachment":"84cf39c4-d8bc-41aa-aaa3-182ce289b105","owner":"lix07","repo_name":"MOT_benchmark_script"}]}]} | cloudbrain.benchmark.types={"type":[{"id":1,"rank_link":"https://git.openi.org.cn/benchmark/?username=admin&algType=detection","first":"Target detection","second":[{"id":1,"value":"None","attachment":"84cf39c4-d8bc-41aa-aaa3-182ce289b105","owner":"yangzhx","repo_name":"detection_benchmark_script"}]},{"id":2,"rank_link":"https://git.openi.org.cn/benchmark/?username=admin&algType=reid","first":"Target re-identification","second":[{"id":1,"value":"Vehicle re-identification","attachment":"84cf39c4-d8bc-41aa-aaa3-182ce289b105","owner":"JiahongXu","repo_name":"benchmark_reID_script"},{"id":2,"value":"Image-based person re-identification","attachment":"84cf39c4-d8bc-41aa-aaa3-182ce289b105","owner":"JiahongXu","repo_name":"benchmark_reID_script"}]},{"id":3,"rank_link":"https://git.openi.org.cn/benchmark/?username=admin&algType=tracking","first":"Multi-target tracking","second":[{"id":1,"value":"None","attachment":"84cf39c4-d8bc-41aa-aaa3-182ce289b105","owner":"lix07","repo_name":"MOT_benchmark_script"}]}]} | ||||
cloudbrain.morethanonejob=You already have a running or waiting task, create it after that task is over. | cloudbrain.morethanonejob=You already have a running or waiting task, create it after that task is over. | ||||
cloudbrain.morethanonejob1=You have created a <span style="color:rgba(242, 113, 28, 1);"> equivalent task </span> that is waiting or running, please wait for the task to finish before creating it. | |||||
cloudbrain.morethanonejob1=You have created an <span style="color:rgba(242, 113, 28, 1);"> equivalent task </span> that is waiting or running, please wait for the task to finish before creating it. | |||||
cloudbrain.morethanonejob2=You can view all your Cloud Brain tasks in <a href="/cloudbrains" target="_blank"> Home > Cloudbrain Task </a>. | cloudbrain.morethanonejob2=You can view all your Cloud Brain tasks in <a href="/cloudbrains" target="_blank"> Home > Cloudbrain Task </a>. | ||||
modelarts.infer_job_model = Model | modelarts.infer_job_model = Model | ||||
@@ -70,7 +70,7 @@ func CloudBrains(ctx *context.Context) { | |||||
keyword := strings.Trim(ctx.Query("q"), " ") | keyword := strings.Trim(ctx.Query("q"), " ") | ||||
ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||||
ciTasks, _, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||||
ListOptions: models.ListOptions{ | ListOptions: models.ListOptions{ | ||||
Page: page, | Page: page, | ||||
PageSize: setting.UI.IssuePagingNum, | PageSize: setting.UI.IssuePagingNum, | ||||
@@ -84,7 +84,6 @@ func CloudBrains(ctx *context.Context) { | |||||
IsLatestVersion: modelarts.IsLatestVersion, | IsLatestVersion: modelarts.IsLatestVersion, | ||||
ComputeResource: listType, | ComputeResource: listType, | ||||
Type: models.TypeCloudBrainAll, | Type: models.TypeCloudBrainAll, | ||||
AiCenter: aiCenter, | |||||
Cluster: cluster, | Cluster: cluster, | ||||
}) | }) | ||||
if err != nil { | if err != nil { | ||||
@@ -93,19 +92,24 @@ func CloudBrains(ctx *context.Context) { | |||||
} | } | ||||
models.LoadSpecs4CloudbrainInfo(ciTasks) | models.LoadSpecs4CloudbrainInfo(ciTasks) | ||||
for i, task := range ciTasks { | |||||
ciTasks[i].CanDebug = true | |||||
ciTasks[i].CanDel = true | |||||
ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||||
tasks := []*models.CloudbrainInfo{} | |||||
for _, task := range ciTasks { | |||||
if aiCenter == "" || aiCenter == task.Cloudbrain.Spec.AiCenterCode { | |||||
task.CanDebug = true | |||||
task.CanDel = true | |||||
task.Cloudbrain.ComputeResource = task.ComputeResource | |||||
tasks = append(tasks, task) | |||||
} | |||||
} | } | ||||
count := int64(len(tasks)) | |||||
pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum)) | pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum)) | ||||
pager.SetDefaultParams(ctx) | pager.SetDefaultParams(ctx) | ||||
pager.AddParam(ctx, "listType", "ListType") | pager.AddParam(ctx, "listType", "ListType") | ||||
ctx.Data["Page"] = pager | ctx.Data["Page"] = pager | ||||
ctx.Data["PageIsCloudBrain"] = true | ctx.Data["PageIsCloudBrain"] = true | ||||
ctx.Data["Tasks"] = ciTasks | |||||
ctx.Data["Tasks"] = tasks | |||||
ctx.Data["CanCreate"] = true | ctx.Data["CanCreate"] = true | ||||
ctx.Data["Keyword"] = keyword | ctx.Data["Keyword"] = keyword | ||||
@@ -707,6 +707,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Get("/issues/search", repo.SearchIssues) | m.Get("/issues/search", repo.SearchIssues) | ||||
m.Post("/migrate", reqToken(), bind(auth.MigrateRepoForm{}), repo.Migrate) | m.Post("/migrate", reqToken(), bind(auth.MigrateRepoForm{}), repo.Migrate) | ||||
m.Post("/migrate/submit", reqToken(), bind(auth.MigrateRepoForm{}), repo.MigrateSubmit) | |||||
m.Group("/:username/:reponame", func() { | m.Group("/:username/:reponame", func() { | ||||
m.Combo("").Get(reqAnyRepoReader(), repo.Get). | m.Combo("").Get(reqAnyRepoReader(), repo.Get). | ||||
@@ -732,7 +732,7 @@ func GetCloudbrainsDetailData(ctx *context.Context) { | |||||
keyword := strings.Trim(ctx.Query("q"), " ") | keyword := strings.Trim(ctx.Query("q"), " ") | ||||
ciTasks, count, err := models.CloudbrainAll(&models.CloudbrainsOptions{ | |||||
ciTasks, _, err := models.CloudbrainAll(&models.CloudbrainsOptions{ | |||||
ListOptions: models.ListOptions{ | ListOptions: models.ListOptions{ | ||||
Page: page, | Page: page, | ||||
PageSize: pageSize, | PageSize: pageSize, | ||||
@@ -747,8 +747,8 @@ func GetCloudbrainsDetailData(ctx *context.Context) { | |||||
NeedRepoInfo: true, | NeedRepoInfo: true, | ||||
BeginTimeUnix: int64(recordBeginTime), | BeginTimeUnix: int64(recordBeginTime), | ||||
EndTimeUnix: endTime.Unix(), | EndTimeUnix: endTime.Unix(), | ||||
AiCenter: aiCenter, | |||||
NeedDeleteInfo: needDeleteInfo, | |||||
// AiCenter: aiCenter, | |||||
NeedDeleteInfo: needDeleteInfo, | |||||
}) | }) | ||||
if err != nil { | if err != nil { | ||||
ctx.ServerError("Get job failed:", err) | ctx.ServerError("Get job failed:", err) | ||||
@@ -758,43 +758,45 @@ func GetCloudbrainsDetailData(ctx *context.Context) { | |||||
nilTime := time.Time{} | nilTime := time.Time{} | ||||
tasks := []models.TaskDetail{} | tasks := []models.TaskDetail{} | ||||
for i, task := range ciTasks { | for i, task := range ciTasks { | ||||
ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||||
var taskDetail models.TaskDetail | |||||
taskDetail.ID = ciTasks[i].Cloudbrain.ID | |||||
taskDetail.JobID = ciTasks[i].Cloudbrain.JobID | |||||
taskDetail.JobName = ciTasks[i].JobName | |||||
taskDetail.DisplayJobName = ciTasks[i].DisplayJobName | |||||
taskDetail.Status = ciTasks[i].Status | |||||
taskDetail.JobType = ciTasks[i].JobType | |||||
taskDetail.CreatedUnix = ciTasks[i].Cloudbrain.CreatedUnix | |||||
taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration | |||||
taskDetail.StartTime = ciTasks[i].StartTime | |||||
taskDetail.EndTime = ciTasks[i].EndTime | |||||
taskDetail.ComputeResource = ciTasks[i].ComputeResource | |||||
taskDetail.Type = ciTasks[i].Cloudbrain.Type | |||||
taskDetail.UserName = ciTasks[i].User.Name | |||||
taskDetail.RepoID = ciTasks[i].RepoID | |||||
if ciTasks[i].Repo != nil { | |||||
taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name | |||||
taskDetail.RepoAlias = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Alias | |||||
} | |||||
if ciTasks[i].Cloudbrain.WorkServerNumber >= 1 { | |||||
taskDetail.WorkServerNum = int64(ciTasks[i].Cloudbrain.WorkServerNumber) | |||||
} else { | |||||
taskDetail.WorkServerNum = 1 | |||||
} | |||||
taskDetail.CardDuration = repo.GetCloudbrainCardDuration(ciTasks[i].Cloudbrain) | |||||
taskDetail.WaitTime = repo.GetCloudbrainWaitTime(ciTasks[i].Cloudbrain) | |||||
if aiCenter == "" || aiCenter == task.Cloudbrain.Spec.AiCenterCode { | |||||
ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||||
var taskDetail models.TaskDetail | |||||
taskDetail.ID = ciTasks[i].Cloudbrain.ID | |||||
taskDetail.JobID = ciTasks[i].Cloudbrain.JobID | |||||
taskDetail.JobName = ciTasks[i].JobName | |||||
taskDetail.DisplayJobName = ciTasks[i].DisplayJobName | |||||
taskDetail.Status = ciTasks[i].Status | |||||
taskDetail.JobType = ciTasks[i].JobType | |||||
taskDetail.CreatedUnix = ciTasks[i].Cloudbrain.CreatedUnix | |||||
taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration | |||||
taskDetail.StartTime = ciTasks[i].StartTime | |||||
taskDetail.EndTime = ciTasks[i].EndTime | |||||
taskDetail.ComputeResource = ciTasks[i].ComputeResource | |||||
taskDetail.Type = ciTasks[i].Cloudbrain.Type | |||||
taskDetail.UserName = ciTasks[i].User.Name | |||||
taskDetail.RepoID = ciTasks[i].RepoID | |||||
if ciTasks[i].Repo != nil { | |||||
taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name | |||||
taskDetail.RepoAlias = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Alias | |||||
} | |||||
if ciTasks[i].Cloudbrain.WorkServerNumber >= 1 { | |||||
taskDetail.WorkServerNum = int64(ciTasks[i].Cloudbrain.WorkServerNumber) | |||||
} else { | |||||
taskDetail.WorkServerNum = 1 | |||||
} | |||||
taskDetail.CardDuration = repo.GetCloudbrainCardDuration(ciTasks[i].Cloudbrain) | |||||
taskDetail.WaitTime = repo.GetCloudbrainWaitTime(ciTasks[i].Cloudbrain) | |||||
if ciTasks[i].Cloudbrain.DeletedAt != nilTime || ciTasks[i].Repo == nil { | |||||
taskDetail.IsDelete = true | |||||
} else { | |||||
taskDetail.IsDelete = false | |||||
if ciTasks[i].Cloudbrain.DeletedAt != nilTime || ciTasks[i].Repo == nil { | |||||
taskDetail.IsDelete = true | |||||
} else { | |||||
taskDetail.IsDelete = false | |||||
} | |||||
taskDetail.Spec = ciTasks[i].Spec | |||||
tasks = append(tasks, taskDetail) | |||||
} | } | ||||
taskDetail.Spec = ciTasks[i].Spec | |||||
tasks = append(tasks, taskDetail) | |||||
} | } | ||||
count := int64(len(tasks)) | |||||
pager := context.NewPagination(int(count), pageSize, page, getTotalPage(count, pageSize)) | pager := context.NewPagination(int(count), pageSize, page, getTotalPage(count, pageSize)) | ||||
pager.SetDefaultParams(ctx) | pager.SetDefaultParams(ctx) | ||||
pager.AddParam(ctx, "listType", "ListType") | pager.AddParam(ctx, "listType", "ListType") | ||||
@@ -6,6 +6,8 @@ package repo | |||||
import ( | import ( | ||||
"bytes" | "bytes" | ||||
"code.gitea.io/gitea/modules/task" | |||||
"code.gitea.io/gitea/routers/response" | |||||
"errors" | "errors" | ||||
"fmt" | "fmt" | ||||
"net/http" | "net/http" | ||||
@@ -216,3 +218,146 @@ func handleMigrateError(ctx *context.APIContext, repoOwner *models.User, remoteA | |||||
} | } | ||||
} | } | ||||
} | } | ||||
func MigrateSubmit(ctx *context.APIContext, form auth.MigrateRepoForm) { | |||||
log.Info("receive MigrateSubmit request") | |||||
ctxUser, bizErr := checkContextUser(ctx, form.UID) | |||||
if bizErr != nil { | |||||
ctx.JSON(http.StatusOK, response.ResponseError(bizErr)) | |||||
return | |||||
} | |||||
remoteAddr, err := form.ParseRemoteAddr(ctx.User) | |||||
if err != nil { | |||||
if models.IsErrInvalidCloneAddr(err) { | |||||
addrErr := err.(models.ErrInvalidCloneAddr) | |||||
switch { | |||||
case addrErr.IsURLError: | |||||
ctx.JSON(http.StatusOK, response.PARAM_ERROR) | |||||
case addrErr.IsPermissionDenied: | |||||
ctx.JSON(http.StatusOK, response.INSUFFICIENT_PERMISSION) | |||||
case addrErr.IsInvalidPath: | |||||
ctx.JSON(http.StatusOK, response.PARAM_ERROR) | |||||
default: | |||||
ctx.JSON(http.StatusOK, response.SYSTEM_ERROR) | |||||
} | |||||
} else { | |||||
ctx.JSON(http.StatusOK, response.SYSTEM_ERROR) | |||||
} | |||||
return | |||||
} | |||||
var gitServiceType = api.PlainGitService | |||||
u, err := url.Parse(form.CloneAddr) | |||||
if err == nil && strings.EqualFold(u.Host, "github.com") { | |||||
gitServiceType = api.GithubService | |||||
} | |||||
var opts = migrations.MigrateOptions{ | |||||
OriginalURL: form.CloneAddr, | |||||
GitServiceType: gitServiceType, | |||||
CloneAddr: remoteAddr, | |||||
RepoName: form.RepoName, | |||||
Alias: form.Alias, | |||||
Description: form.Description, | |||||
Private: form.Private || setting.Repository.ForcePrivate, | |||||
Mirror: form.Mirror, | |||||
AuthUsername: form.AuthUsername, | |||||
AuthPassword: form.AuthPassword, | |||||
Wiki: form.Wiki, | |||||
Issues: form.Issues, | |||||
Milestones: form.Milestones, | |||||
Labels: form.Labels, | |||||
Comments: true, | |||||
PullRequests: form.PullRequests, | |||||
Releases: form.Releases, | |||||
} | |||||
if opts.Mirror { | |||||
opts.Issues = false | |||||
opts.Milestones = false | |||||
opts.Labels = false | |||||
opts.Comments = false | |||||
opts.PullRequests = false | |||||
opts.Releases = false | |||||
} | |||||
err = models.CheckCreateRepository(ctx.User, ctxUser, opts.RepoName, opts.Alias) | |||||
if err != nil { | |||||
handleMigrateError4Api(ctx, ctxUser, remoteAddr, err) | |||||
return | |||||
} | |||||
err = task.MigrateRepository(ctx.User, ctxUser, opts) | |||||
if err == nil { | |||||
r := make(map[string]string) | |||||
r["OpenIUrl"] = strings.TrimSuffix(setting.AppURL, "/") + "/" + ctxUser.Name + "/" + opts.RepoName | |||||
r["OriginUrl"] = form.CloneAddr | |||||
ctx.JSON(http.StatusOK, response.SuccessWithData(r)) | |||||
return | |||||
} | |||||
handleMigrateError4Api(ctx, ctxUser, remoteAddr, err) | |||||
} | |||||
func checkContextUser(ctx *context.APIContext, uid int64) (*models.User, *response.BizError) { | |||||
if uid == ctx.User.ID || uid == 0 { | |||||
return ctx.User, nil | |||||
} | |||||
org, err := models.GetUserByID(uid) | |||||
if models.IsErrUserNotExist(err) { | |||||
return ctx.User, nil | |||||
} | |||||
if err != nil { | |||||
return nil, response.SYSTEM_ERROR | |||||
} | |||||
// Check ownership of organization. | |||||
if !org.IsOrganization() { | |||||
return nil, nil | |||||
} | |||||
if !ctx.User.IsAdmin { | |||||
canCreate, err := org.CanCreateOrgRepo(ctx.User.ID) | |||||
if err != nil { | |||||
return nil, response.NewBizError(err) | |||||
} else if !canCreate { | |||||
return nil, response.INSUFFICIENT_PERMISSION | |||||
} | |||||
} | |||||
return org, nil | |||||
} | |||||
func handleMigrateError4Api(ctx *context.APIContext, repoOwner *models.User, remoteAddr string, err error) { | |||||
switch { | |||||
case models.IsErrRepoAlreadyExist(err): | |||||
ctx.JSON(http.StatusOK, response.Error(3, "The repository with the same name already exists.")) | |||||
case migrations.IsRateLimitError(err): | |||||
ctx.JSON(http.StatusOK, response.ServerError("Remote visit addressed rate limitation.")) | |||||
case migrations.IsTwoFactorAuthError(err): | |||||
ctx.JSON(http.StatusOK, response.ServerError("Remote visit required two factors authentication.")) | |||||
case models.IsErrReachLimitOfRepo(err): | |||||
ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("You have already reached your limit of %d repositories.", repoOwner.MaxCreationLimit()))) | |||||
case models.IsErrNameReserved(err): | |||||
ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("The username '%s' is reserved.", err.(models.ErrNameReserved).Name))) | |||||
case models.IsErrNameCharsNotAllowed(err): | |||||
ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("The username '%s' contains invalid characters.", err.(models.ErrNameCharsNotAllowed).Name))) | |||||
case models.IsErrNamePatternNotAllowed(err): | |||||
ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("The pattern '%s' is not allowed in a username.", err.(models.ErrNamePatternNotAllowed).Pattern))) | |||||
default: | |||||
err = util.URLSanitizedError(err, remoteAddr) | |||||
if strings.Contains(err.Error(), "Authentication failed") || | |||||
strings.Contains(err.Error(), "Bad credentials") || | |||||
strings.Contains(err.Error(), "could not read Username") { | |||||
ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("Authentication failed: %v.", err))) | |||||
} else if strings.Contains(err.Error(), "fatal:") { | |||||
ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("Migration failed: %v.", err))) | |||||
} else { | |||||
ctx.JSON(http.StatusOK, response.ServerError(err.Error())) | |||||
} | |||||
} | |||||
} | |||||
func QueryRepoSatus(ctx *context.APIContext, form auth.MigrateRepoForm) { | |||||
} |
@@ -1,8 +1,14 @@ | |||||
package response | package response | ||||
//repo response | |||||
var RESOURCE_QUEUE_NOT_AVAILABLE = &BizError{Code: 1001, Err: "resource queue not available"} | var RESOURCE_QUEUE_NOT_AVAILABLE = &BizError{Code: 1001, Err: "resource queue not available"} | ||||
var SPECIFICATION_NOT_EXIST = &BizError{Code: 1002, Err: "specification not exist"} | var SPECIFICATION_NOT_EXIST = &BizError{Code: 1002, Err: "specification not exist"} | ||||
var SPECIFICATION_NOT_AVAILABLE = &BizError{Code: 1003, Err: "specification not available"} | var SPECIFICATION_NOT_AVAILABLE = &BizError{Code: 1003, Err: "specification not available"} | ||||
var CATEGORY_STILL_HAS_BADGES = &BizError{Code: 1004, Err: "Please delete badges in the category first"} | var CATEGORY_STILL_HAS_BADGES = &BizError{Code: 1004, Err: "Please delete badges in the category first"} | ||||
var BADGES_STILL_HAS_USERS = &BizError{Code: 1005, Err: "Please delete users of badge first"} | var BADGES_STILL_HAS_USERS = &BizError{Code: 1005, Err: "Please delete users of badge first"} | ||||
//common response | |||||
var SYSTEM_ERROR = &BizError{Code: 9009, Err: "System error.Please try again later"} | |||||
var INSUFFICIENT_PERMISSION = &BizError{Code: 9003, Err: "insufficient permissions"} | |||||
var PARAM_ERROR = &BizError{Code: 9001, Err: "param error permissions"} |
@@ -812,7 +812,7 @@ func Cloudbrains(ctx *context.Context) { | |||||
for i, _ := range repos { | for i, _ := range repos { | ||||
repoIDList = append(repoIDList, repos[i].ID) | repoIDList = append(repoIDList, repos[i].ID) | ||||
} | } | ||||
ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||||
ciTasks, _, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||||
ListOptions: models.ListOptions{ | ListOptions: models.ListOptions{ | ||||
Page: page, | Page: page, | ||||
PageSize: setting.UI.IssuePagingNum, | PageSize: setting.UI.IssuePagingNum, | ||||
@@ -828,7 +828,6 @@ func Cloudbrains(ctx *context.Context) { | |||||
RepoIDList: repoIDList, | RepoIDList: repoIDList, | ||||
ComputeResource: listType, | ComputeResource: listType, | ||||
Type: models.TypeCloudBrainAll, | Type: models.TypeCloudBrainAll, | ||||
AiCenter: aiCenter, | |||||
Cluster: cluster, | Cluster: cluster, | ||||
}) | }) | ||||
if err != nil { | if err != nil { | ||||
@@ -836,18 +835,22 @@ func Cloudbrains(ctx *context.Context) { | |||||
return | return | ||||
} | } | ||||
models.LoadSpecs4CloudbrainInfo(ciTasks) | models.LoadSpecs4CloudbrainInfo(ciTasks) | ||||
for i, task := range ciTasks { | |||||
ciTasks[i].CanDebug = true | |||||
ciTasks[i].CanDel = true | |||||
ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||||
tasks := []*models.CloudbrainInfo{} | |||||
for _, task := range ciTasks { | |||||
if aiCenter == "" || aiCenter == task.Cloudbrain.Spec.AiCenterCode { | |||||
task.CanDebug = true | |||||
task.CanDel = true | |||||
task.Cloudbrain.ComputeResource = task.ComputeResource | |||||
tasks = append(tasks, task) | |||||
} | |||||
} | } | ||||
count := int64(len(tasks)) | |||||
pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum)) | pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum)) | ||||
pager.SetDefaultParams(ctx) | pager.SetDefaultParams(ctx) | ||||
pager.AddParam(ctx, "listType", "ListType") | pager.AddParam(ctx, "listType", "ListType") | ||||
ctx.Data["Page"] = pager | ctx.Data["Page"] = pager | ||||
ctx.Data["PageIsUserCloudBrain"] = true | ctx.Data["PageIsUserCloudBrain"] = true | ||||
ctx.Data["Tasks"] = ciTasks | |||||
ctx.Data["Tasks"] = tasks | |||||
ctx.Data["CanCreate"] = true | ctx.Data["CanCreate"] = true | ||||
ctx.Data["Keyword"] = keyword | ctx.Data["Keyword"] = keyword | ||||
@@ -16,19 +16,11 @@ | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster=resource_cluster_c2net&aiCenter={{$.aiCenter}}" data-value="{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}">{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}</a> | <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster=resource_cluster_c2net&aiCenter={{$.aiCenter}}" data-value="{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}">{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}</a> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||||
<div class="default text" style="color: rgba(0,0,0,.87);">{{.i18n.Tr "cloudbrain.all_ai_center"}}</div> | |||||
<div class="ui selection dropdown" id="aiCenter-sel" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||||
<div class="default text" style="color: rgba(0,0,0,.87);" aicenter="{{$.aiCenter}}">{{if eq $.aiCenter ""}}{{.i18n.Tr "cloudbrain.all_ai_center"}}{{end}}</div> | |||||
<i class="dropdown icon"></i> | <i class="dropdown icon"></i> | ||||
<div class="menu"> | <div class="menu"> | ||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=" data-value='{{.i18n.Tr "cloudbrain.all_ai_center"}}'>{{.i18n.Tr "cloudbrain.all_ai_center"}}</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=鹏城云计算所" data-value="鹏城云计算所">鹏城云计算所</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=成都智算" data-value="成都智算">成都智算</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=合肥类脑" data-value="合肥类脑">合肥类脑</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=octopus" data-value="octopus">octopus</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=武汉智算" data-value="武汉智算">武汉智算</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=西安智算" data-value="西安智算">西安智算</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=中原智算" data-value="中原智算">中原智算</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=许昌AI中心" data-value="许昌AI中心">许昌AI中心</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=" data-value='{{.i18n.Tr "cloudbrain.all_ai_center"}}'>{{.i18n.Tr "cloudbrain.all_ai_center"}}</a> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | <div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | ||||
@@ -73,4 +65,44 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | |||||
</div> | |||||
<script> | |||||
;(function() { | |||||
document.addEventListener('DOMContentLoaded', function() { | |||||
$.ajax({ | |||||
type: "GET", | |||||
url: "/admin/resources/queue/centers", | |||||
dataType: "json", | |||||
data: {}, | |||||
success: function (res) { | |||||
if (res && res.Code === 0) { | |||||
var data = res.Data; | |||||
var aiCenterSelEl = $('#aiCenter-sel'); | |||||
var itemEl = aiCenterSelEl.find('.menu .item').eq(0); | |||||
var selectAiCenterCode = aiCenterSelEl.find('.default').attr('aicenter'); | |||||
var selectAiCenterName = ''; | |||||
for (var i = 0, iLen = data.length; i < iLen; i++) { | |||||
var dataI = data[i]; | |||||
var itemClone = itemEl.clone(); | |||||
var oHref = itemClone.attr('href'); | |||||
var oId = itemClone.attr('id'); | |||||
itemClone.attr('data-value', dataI.AiCenterCode); | |||||
itemClone.removeAttr('id'); | |||||
itemClone.attr('href', oHref + dataI.AiCenterCode); | |||||
itemClone.text(dataI.AiCenterName); | |||||
aiCenterSelEl.find('.menu').append(itemClone); | |||||
if (selectAiCenterCode === dataI.AiCenterCode) { | |||||
selectAiCenterName = dataI.AiCenterName; | |||||
} | |||||
} | |||||
selectAiCenterCode && aiCenterSelEl.dropdown('set selected', selectAiCenterCode); | |||||
selectAiCenterName && aiCenterSelEl.dropdown('set text', selectAiCenterName); | |||||
} | |||||
}, | |||||
error: function (err) { | |||||
console.log(err); | |||||
} | |||||
}); | |||||
}); | |||||
})(); | |||||
</script> |
@@ -28,19 +28,11 @@ | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster=resource_cluster_c2net&aiCenter={{$.aiCenter}}" data-value="{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}">{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}</a> | <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster=resource_cluster_c2net&aiCenter={{$.aiCenter}}" data-value="{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}">{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}</a> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||||
<div class="default text" style="color: rgba(0,0,0,.87);">{{.i18n.Tr "cloudbrain.all_ai_center"}}</div> | |||||
<div class="ui selection dropdown" id="aiCenter-sel" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||||
<div class="default text" style="color: rgba(0,0,0,.87);" aicenter="{{$.aiCenter}}">{{if eq $.aiCenter ""}}{{.i18n.Tr "cloudbrain.all_ai_center"}}{{end}}</div> | |||||
<i class="dropdown icon"></i> | <i class="dropdown icon"></i> | ||||
<div class="menu"> | <div class="menu"> | ||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=" data-value='{{.i18n.Tr "cloudbrain.all_ai_center"}}'>{{.i18n.Tr "cloudbrain.all_ai_center"}}</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=鹏城云计算所" data-value="鹏城云计算所">鹏城云计算所</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=成都智算" data-value="成都智算">成都智算</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=合肥类脑" data-value="合肥类脑">合肥类脑</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=octopus" data-value="octopus">octopus</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=武汉智算" data-value="武汉智算">武汉智算</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=西安智算" data-value="西安智算">西安智算</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=中原智算" data-value="中原智算">中原智算</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=许昌AI中心" data-value="许昌AI中心">许昌AI中心</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=" data-value='{{.i18n.Tr "cloudbrain.all_ai_center"}}'>{{.i18n.Tr "cloudbrain.all_ai_center"}}</a> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | <div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | ||||
@@ -87,4 +79,44 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | |||||
</div> | |||||
<script> | |||||
;(function() { | |||||
document.addEventListener('DOMContentLoaded', function() { | |||||
$.ajax({ | |||||
type: "GET", | |||||
url: "/admin/resources/queue/centers", | |||||
dataType: "json", | |||||
data: {}, | |||||
success: function (res) { | |||||
if (res && res.Code === 0) { | |||||
var data = res.Data; | |||||
var aiCenterSelEl = $('#aiCenter-sel'); | |||||
var itemEl = aiCenterSelEl.find('.menu .item').eq(0); | |||||
var selectAiCenterCode = aiCenterSelEl.find('.default').attr('aicenter'); | |||||
var selectAiCenterName = ''; | |||||
for (var i = 0, iLen = data.length; i < iLen; i++) { | |||||
var dataI = data[i]; | |||||
var itemClone = itemEl.clone(); | |||||
var oHref = itemClone.attr('href'); | |||||
var oId = itemClone.attr('id'); | |||||
itemClone.attr('data-value', dataI.AiCenterCode); | |||||
itemClone.removeAttr('id'); | |||||
itemClone.attr('href', oHref + dataI.AiCenterCode); | |||||
itemClone.text(dataI.AiCenterName); | |||||
aiCenterSelEl.find('.menu').append(itemClone); | |||||
if (selectAiCenterCode === dataI.AiCenterCode) { | |||||
selectAiCenterName = dataI.AiCenterName; | |||||
} | |||||
} | |||||
selectAiCenterCode && aiCenterSelEl.dropdown('set selected', selectAiCenterCode); | |||||
selectAiCenterName && aiCenterSelEl.dropdown('set text', selectAiCenterName); | |||||
} | |||||
}, | |||||
error: function (err) { | |||||
console.log(err); | |||||
} | |||||
}); | |||||
}); | |||||
})(); | |||||
</script> |
@@ -1,11 +1,11 @@ | |||||
<div> | <div> | ||||
<div class="ui modal max-full-log{{.VersionName}} container" style="height: 90%;margin: 3rem auto;"> | <div class="ui modal max-full-log{{.VersionName}} container" style="height: 90%;margin: 3rem auto;"> | ||||
<div class="file-info" style="padding: 2rem;justify-content: space-between;"> | |||||
<div class="file-info" style="padding: 2rem;justify-content: space-between;height: 10%;"> | |||||
<div id="log-file-title" style="font-size: 16px;font-weight:600"></div> | <div id="log-file-title" style="font-size: 16px;font-weight:600"></div> | ||||
<div class="file-info"> | <div class="file-info"> | ||||
<a class="file-info" id="{{.VersionName}}-log-down" href=""> | <a class="file-info" id="{{.VersionName}}-log-down" href=""> | ||||
<i class="ri-download-cloud-2-line"></i> | <i class="ri-download-cloud-2-line"></i> | ||||
<span style="margin-left: 0.3rem;" class="log-file-down"></span> | |||||
<span style="margin-left: 0.3rem;font-size: 12px;" class="log-file-down"></span> | |||||
</a> | </a> | ||||
<div class="file-info close-log-dialog" data-version="{{.VersionName}}" style="margin-left: 1rem;color:#0366d6;cursor: pointer;"> | <div class="file-info close-log-dialog" data-version="{{.VersionName}}" style="margin-left: 1rem;color:#0366d6;cursor: pointer;"> | ||||
<i class="ri-fullscreen-exit-fill" style="font-size: 16px;"></i> | <i class="ri-fullscreen-exit-fill" style="font-size: 16px;"></i> | ||||
@@ -16,7 +16,7 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div style="margin: 0 2.5rem;border: 1px solid #e8e8e8;height: 88%;position: relative;"> | |||||
<div style="margin: 0 2.5rem;border: 1px solid #e8e8e8;height: 85%;position: relative;"> | |||||
<span> | <span> | ||||
<a style="position: absolute; right: -32px;cursor: pointer;" | <a style="position: absolute; right: -32px;cursor: pointer;" | ||||
class="log_top-max" data-version="{{.VersionName}}" data-max="-max"><i class="icon-to-top"></i></a> | class="log_top-max" data-version="{{.VersionName}}" data-max="-max"><i class="icon-to-top"></i></a> | ||||
@@ -527,7 +527,7 @@ | |||||
<i class="ri-download-cloud-2-line"></i> | <i class="ri-download-cloud-2-line"></i> | ||||
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span> | <span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span> | ||||
</a> | </a> | ||||
<div class="file-info full-log-dialog" data-version="{{.VersionName}}" data-log="{{$.i18n.Tr "repo.modelarts.log_file"}}" | |||||
<div class="file-info full-log-dialog" data-version="{{.VersionName}}" data-log="{{$.i18n.Tr "repo.modelarts.log_file"}}" data-log-type="c2Net" | |||||
data-exit="{{$.i18n.Tr "repo.modelarts.exit_full_screen"}}" style="margin-left: 1rem;color:#0366d6;cursor: pointer;" | data-exit="{{$.i18n.Tr "repo.modelarts.exit_full_screen"}}" style="margin-left: 1rem;color:#0366d6;cursor: pointer;" | ||||
data-log-down="{{$.i18n.Tr "repo.modelarts.download_log"}}" data-href="/api/v1/repos/{{$.RepoRelPath}}/grampus/train-job/{{.JobID}}/download_log" | data-log-down="{{$.i18n.Tr "repo.modelarts.download_log"}}" data-href="/api/v1/repos/{{$.RepoRelPath}}/grampus/train-job/{{.JobID}}/download_log" | ||||
data-scroll-top="{{$.i18n.Tr "repo.log_scroll_start"}}" data-scroll-bottom="{{$.i18n.Tr "repo.log_scroll_end"}}"> | data-scroll-top="{{$.i18n.Tr "repo.log_scroll_start"}}" data-scroll-bottom="{{$.i18n.Tr "repo.log_scroll_end"}}"> | ||||
@@ -53,6 +53,7 @@ export default async function initCloudrainSow() { | |||||
if (data.Lines == 0) { | if (data.Lines == 0) { | ||||
if (max) { | if (max) { | ||||
$("body").toast({ | $("body").toast({ | ||||
class: "black", | |||||
message: `您已翻阅至日志底部,请稍后再试!`, | message: `您已翻阅至日志底部,请稍后再试!`, | ||||
}); | }); | ||||
} else { | } else { | ||||
@@ -99,6 +100,7 @@ export default async function initCloudrainSow() { | |||||
if (data.Lines == 0) { | if (data.Lines == 0) { | ||||
if (max) { | if (max) { | ||||
$("body").toast({ | $("body").toast({ | ||||
class: "black", | |||||
message: `您已翻阅至日志顶部,请稍后再试!`, | message: `您已翻阅至日志顶部,请稍后再试!`, | ||||
}); | }); | ||||
} else { | } else { | ||||
@@ -157,6 +159,7 @@ export default async function initCloudrainSow() { | |||||
let logContentDom = document.querySelector(`#log${max}${version_name}`); | let logContentDom = document.querySelector(`#log${max}${version_name}`); | ||||
let ID = $(`#accordion${version_name}`).data("jobid"); | let ID = $(`#accordion${version_name}`).data("jobid"); | ||||
let repoPath = $(`#accordion${version_name}`).data("repopath"); | let repoPath = $(`#accordion${version_name}`).data("repopath"); | ||||
let start_line = $(`#log${version_name} input[name=end_line${max}]`).val(); | |||||
$(`#log_file${max}${version_name}`).siblings("pre").remove(); | $(`#log_file${max}${version_name}`).siblings("pre").remove(); | ||||
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({ | $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({ | ||||
"background-color": "#fff", | "background-color": "#fff", | ||||
@@ -177,6 +180,7 @@ export default async function initCloudrainSow() { | |||||
if (data.Lines == 0) { | if (data.Lines == 0) { | ||||
if (max) { | if (max) { | ||||
$("body").toast({ | $("body").toast({ | ||||
class: "black", | |||||
message: `您已翻阅至日志顶部,请稍后再试!`, | message: `您已翻阅至日志顶部,请稍后再试!`, | ||||
}); | }); | ||||
} else { | } else { | ||||
@@ -187,7 +191,45 @@ export default async function initCloudrainSow() { | |||||
}, 1000); | }, 1000); | ||||
} | } | ||||
} | } | ||||
scrollAnimation(logContentDom, logContentDom.scrollTop, 0); | |||||
$.get( | |||||
`/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${data.StartLine}&lines=${lines}&order=asc`, | |||||
(data) => { | |||||
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css( | |||||
"display", | |||||
"none" | |||||
); | |||||
if (data.Lines == 0) { | |||||
if (max) { | |||||
$("body").toast({ | |||||
class: "black", | |||||
message: `您已翻阅至日志顶部,请稍后再试!`, | |||||
}); | |||||
} else { | |||||
$(`.message${version_name} #header`).text("您已翻阅至日志顶部"); | |||||
$(`.message${version_name}`).css("display", "block"); | |||||
setTimeout(function () { | |||||
$(`.message${version_name}`).css("display", "none"); | |||||
}, 1000); | |||||
} | |||||
} else { | |||||
if (start_line === data.StartLine || start_line === "") { | |||||
return; | |||||
} else { | |||||
$(`#log${version_name} input[name=start_line${max}]`).val( | |||||
data.StartLine | |||||
); | |||||
$(`#log${max}${version_name}`).prepend("<pre>" + data.Content); | |||||
} | |||||
} | |||||
} | |||||
).fail(function (err) { | |||||
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css( | |||||
"display", | |||||
"none" | |||||
); | |||||
console.log(err); | |||||
}); | |||||
scrollAnimation(logContentDom, logContentDom.scrollTop, 10); | |||||
} | } | ||||
).fail((err) => { | ).fail((err) => { | ||||
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css( | $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css( | ||||
@@ -256,6 +298,7 @@ export default async function initCloudrainSow() { | |||||
if (data.Lines == 0) { | if (data.Lines == 0) { | ||||
if (max) { | if (max) { | ||||
$("body").toast({ | $("body").toast({ | ||||
class: "black", | |||||
message: `您已翻阅至日志底部,请稍后再试!`, | message: `您已翻阅至日志底部,请稍后再试!`, | ||||
}); | }); | ||||
} else { | } else { | ||||
@@ -290,7 +333,8 @@ export default async function initCloudrainSow() { | |||||
}); | }); | ||||
let test = $(`#log_file${version_name}`).nextAll(); | let test = $(`#log_file${version_name}`).nextAll(); | ||||
$(`#log${version_name} input[name=init_log]`).val(test[0].innerHTML); | |||||
test.length !== 0 && | |||||
$(`#log${version_name} input[name=init_log]`).val(test[0].innerHTML); | |||||
scrollAnimation( | scrollAnimation( | ||||
logContentDom, | logContentDom, | ||||
@@ -299,7 +343,7 @@ export default async function initCloudrainSow() { | |||||
); | ); | ||||
} | } | ||||
).fail((err) => { | ).fail((err) => { | ||||
$(`#log${version_name} .ui.inverted.active.dimmer`).css( | |||||
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css( | |||||
"display", | "display", | ||||
"none" | "none" | ||||
); | ); | ||||
@@ -544,7 +544,7 @@ function userSearchControll() { | |||||
: params.get("jobStatus").toUpperCase(); | : params.get("jobStatus").toUpperCase(); | ||||
const dropdownValueArray = [cluster, aiCenter, jobType, listType, jobStatus]; | const dropdownValueArray = [cluster, aiCenter, jobType, listType, jobStatus]; | ||||
$("#userCloud .default.text ").each(function (index, e) { | $("#userCloud .default.text ").each(function (index, e) { | ||||
$(e).text(dropdownValueArray[index]); | |||||
index != 1 && $(e).text(dropdownValueArray[index]); | |||||
}); | }); | ||||
} | } | ||||
@@ -579,7 +579,7 @@ function AdaminSearchControll() { | |||||
: params.get("jobStatus").toUpperCase(); | : params.get("jobStatus").toUpperCase(); | ||||
const dropdownValueArray = [cluster, aiCenter, jobType, listType, jobStatus]; | const dropdownValueArray = [cluster, aiCenter, jobType, listType, jobStatus]; | ||||
$("#adminCloud .default.text ").each(function (index, e) { | $("#adminCloud .default.text ").each(function (index, e) { | ||||
$(e).text(dropdownValueArray[index]); | |||||
index != 1 && $(e).text(dropdownValueArray[index]); | |||||
}); | }); | ||||
} | } | ||||
userSearchControll(); | userSearchControll(); | ||||