Browse Source

Merge branch 'V20221102' of git.openi.org.cn:OpenI/aiforge into npu-model-upload

pull/3134/head
lewis 2 years ago
parent
commit
4745b2c809
17 changed files with 360 additions and 87 deletions
  1. +1
    -0
      models/repo.go
  2. +1
    -0
      modules/convert/convert.go
  3. +1
    -0
      modules/structs/org.go
  4. +1
    -0
      modules/structs/repo.go
  5. +1
    -1
      options/locale/locale_en-US.ini
  6. +12
    -8
      routers/admin/cloudbrains.go
  7. +1
    -0
      routers/api/v1/api.go
  8. +39
    -37
      routers/api/v1/repo/cloudbrain_dashboard.go
  9. +145
    -0
      routers/api/v1/repo/migrate.go
  10. +6
    -0
      routers/response/response_list.go
  11. +11
    -8
      routers/user/home.go
  12. +44
    -12
      templates/admin/cloudbrain/search.tmpl
  13. +44
    -12
      templates/admin/cloudbrain/search_dashboard.tmpl
  14. +3
    -3
      templates/custom/max_log.tmpl
  15. +1
    -1
      templates/repo/grampus/trainjob/show.tmpl
  16. +47
    -3
      web_src/js/features/cloudbrainShow.js
  17. +2
    -2
      web_src/js/features/cloudrbanin.js

+ 1
- 0
models/repo.go View File

@@ -454,6 +454,7 @@ func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool)
AllowRebaseMerge: allowRebaseMerge,
AllowSquash: allowSquash,
AvatarURL: repo.avatarLink(e),
Status: int(repo.Status),
}
}



+ 1
- 0
modules/convert/convert.go View File

@@ -311,6 +311,7 @@ func ToOrganization(org *models.User) *api.Organization {
Location: org.Location,
Visibility: org.Visibility.String(),
RepoAdminChangeTeamAccess: org.RepoAdminChangeTeamAccess,
NumRepos: org.NumRepos,
}
}



+ 1
- 0
modules/structs/org.go View File

@@ -15,6 +15,7 @@ type Organization struct {
Location string `json:"location"`
Visibility string `json:"visibility"`
RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"`
NumRepos int `json:"num_repos"`
}

// CreateOrgOption options for creating an organization


+ 1
- 0
modules/structs/repo.go View File

@@ -90,6 +90,7 @@ type Repository struct {
AllowRebaseMerge bool `json:"allow_rebase_explicit"`
AllowSquash bool `json:"allow_squash_merge"`
AvatarURL string `json:"avatar_url"`
Status int `json:"status"`
}

// CreateRepoOption options when creating repository


+ 1
- 1
options/locale/locale_en-US.ini View File

@@ -1217,7 +1217,7 @@ cloudbrain.benchmark.evaluate_train=Train 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.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>.

modelarts.infer_job_model = Model


+ 12
- 8
routers/admin/cloudbrains.go View File

@@ -70,7 +70,7 @@ func CloudBrains(ctx *context.Context) {

keyword := strings.Trim(ctx.Query("q"), " ")

ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{
ciTasks, _, err := models.Cloudbrains(&models.CloudbrainsOptions{
ListOptions: models.ListOptions{
Page: page,
PageSize: setting.UI.IssuePagingNum,
@@ -84,7 +84,6 @@ func CloudBrains(ctx *context.Context) {
IsLatestVersion: modelarts.IsLatestVersion,
ComputeResource: listType,
Type: models.TypeCloudBrainAll,
AiCenter: aiCenter,
Cluster: cluster,
})
if err != nil {
@@ -93,19 +92,24 @@ func CloudBrains(ctx *context.Context) {
}

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.SetDefaultParams(ctx)
pager.AddParam(ctx, "listType", "ListType")
ctx.Data["Page"] = pager
ctx.Data["PageIsCloudBrain"] = true
ctx.Data["Tasks"] = ciTasks
ctx.Data["Tasks"] = tasks
ctx.Data["CanCreate"] = true
ctx.Data["Keyword"] = keyword



+ 1
- 0
routers/api/v1/api.go View File

@@ -707,6 +707,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("/issues/search", repo.SearchIssues)

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.Combo("").Get(reqAnyRepoReader(), repo.Get).


+ 39
- 37
routers/api/v1/repo/cloudbrain_dashboard.go View File

@@ -732,7 +732,7 @@ func GetCloudbrainsDetailData(ctx *context.Context) {

keyword := strings.Trim(ctx.Query("q"), " ")

ciTasks, count, err := models.CloudbrainAll(&models.CloudbrainsOptions{
ciTasks, _, err := models.CloudbrainAll(&models.CloudbrainsOptions{
ListOptions: models.ListOptions{
Page: page,
PageSize: pageSize,
@@ -747,8 +747,8 @@ func GetCloudbrainsDetailData(ctx *context.Context) {
NeedRepoInfo: true,
BeginTimeUnix: int64(recordBeginTime),
EndTimeUnix: endTime.Unix(),
AiCenter: aiCenter,
NeedDeleteInfo: needDeleteInfo,
// AiCenter: aiCenter,
NeedDeleteInfo: needDeleteInfo,
})
if err != nil {
ctx.ServerError("Get job failed:", err)
@@ -758,43 +758,45 @@ func GetCloudbrainsDetailData(ctx *context.Context) {
nilTime := time.Time{}
tasks := []models.TaskDetail{}
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.SetDefaultParams(ctx)
pager.AddParam(ctx, "listType", "ListType")


+ 145
- 0
routers/api/v1/repo/migrate.go View File

@@ -6,6 +6,8 @@ package repo

import (
"bytes"
"code.gitea.io/gitea/modules/task"
"code.gitea.io/gitea/routers/response"
"errors"
"fmt"
"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) {

}

+ 6
- 0
routers/response/response_list.go View File

@@ -1,8 +1,14 @@
package response

//repo response
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_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 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"}

+ 11
- 8
routers/user/home.go View File

@@ -812,7 +812,7 @@ func Cloudbrains(ctx *context.Context) {
for i, _ := range repos {
repoIDList = append(repoIDList, repos[i].ID)
}
ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{
ciTasks, _, err := models.Cloudbrains(&models.CloudbrainsOptions{
ListOptions: models.ListOptions{
Page: page,
PageSize: setting.UI.IssuePagingNum,
@@ -828,7 +828,6 @@ func Cloudbrains(ctx *context.Context) {
RepoIDList: repoIDList,
ComputeResource: listType,
Type: models.TypeCloudBrainAll,
AiCenter: aiCenter,
Cluster: cluster,
})
if err != nil {
@@ -836,18 +835,22 @@ func Cloudbrains(ctx *context.Context) {
return
}
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.SetDefaultParams(ctx)
pager.AddParam(ctx, "listType", "ListType")
ctx.Data["Page"] = pager
ctx.Data["PageIsUserCloudBrain"] = true
ctx.Data["Tasks"] = ciTasks
ctx.Data["Tasks"] = tasks
ctx.Data["CanCreate"] = true
ctx.Data["Keyword"] = keyword



+ 44
- 12
templates/admin/cloudbrain/search.tmpl View File

@@ -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>
</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>
<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 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>
<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>

+ 44
- 12
templates/admin/cloudbrain/search_dashboard.tmpl View File

@@ -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>
</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>
<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 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>
<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>

+ 3
- 3
templates/custom/max_log.tmpl View File

@@ -1,11 +1,11 @@
<div>
<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 class="file-info">
<a class="file-info" id="{{.VersionName}}-log-down" href="">
<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>
<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>
@@ -16,7 +16,7 @@
</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>
<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>


+ 1
- 1
templates/repo/grampus/trainjob/show.tmpl View File

@@ -527,7 +527,7 @@
<i class="ri-download-cloud-2-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span>
</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-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"}}">


+ 47
- 3
web_src/js/features/cloudbrainShow.js View File

@@ -53,6 +53,7 @@ export default async function initCloudrainSow() {
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: `您已翻阅至日志底部,请稍后再试!`,
});
} else {
@@ -99,6 +100,7 @@ export default async function initCloudrainSow() {
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: `您已翻阅至日志顶部,请稍后再试!`,
});
} else {
@@ -157,6 +159,7 @@ export default async function initCloudrainSow() {
let logContentDom = document.querySelector(`#log${max}${version_name}`);
let ID = $(`#accordion${version_name}`).data("jobid");
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${max}${version_name} .ui.inverted.active.dimmer`).css({
"background-color": "#fff",
@@ -177,6 +180,7 @@ export default async function initCloudrainSow() {
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: `您已翻阅至日志顶部,请稍后再试!`,
});
} else {
@@ -187,7 +191,45 @@ export default async function initCloudrainSow() {
}, 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) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
@@ -256,6 +298,7 @@ export default async function initCloudrainSow() {
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: `您已翻阅至日志底部,请稍后再试!`,
});
} else {
@@ -290,7 +333,8 @@ export default async function initCloudrainSow() {
});

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(
logContentDom,
@@ -299,7 +343,7 @@ export default async function initCloudrainSow() {
);
}
).fail((err) => {
$(`#log${version_name} .ui.inverted.active.dimmer`).css(
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);


+ 2
- 2
web_src/js/features/cloudrbanin.js View File

@@ -544,7 +544,7 @@ function userSearchControll() {
: params.get("jobStatus").toUpperCase();
const dropdownValueArray = [cluster, aiCenter, jobType, listType, jobStatus];
$("#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();
const dropdownValueArray = [cluster, aiCenter, jobType, listType, jobStatus];
$("#adminCloud .default.text ").each(function (index, e) {
$(e).text(dropdownValueArray[index]);
index != 1 && $(e).text(dropdownValueArray[index]);
});
}
userSearchControll();


Loading…
Cancel
Save