Reviewed-on: https://git.openi.org.cn/OpenI/aiforge/pulls/1539 Reviewed-by: lewis <747342561@qq.com>pull/1546/head
@@ -219,17 +219,20 @@ type GetImagesPayload struct { | |||||
type CloudbrainsOptions struct { | type CloudbrainsOptions struct { | ||||
ListOptions | ListOptions | ||||
RepoID int64 // include all repos if empty | |||||
UserID int64 | |||||
JobID string | |||||
SortType string | |||||
CloudbrainIDs []int64 | |||||
// JobStatus CloudbrainStatus | |||||
RepoID int64 // include all repos if empty | |||||
UserID int64 | |||||
JobID string | |||||
SortType string | |||||
CloudbrainIDs []int64 | |||||
JobStatus []string | |||||
JobStatusNot bool | |||||
Keyword string | |||||
Type int | Type int | ||||
JobTypes []string | JobTypes []string | ||||
VersionName string | VersionName string | ||||
IsLatestVersion string | IsLatestVersion string | ||||
JobTypeNot bool | JobTypeNot bool | ||||
NeedRepoInfo bool | |||||
} | } | ||||
type TaskPod struct { | type TaskPod struct { | ||||
@@ -1082,16 +1085,39 @@ func Cloudbrains(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) { | |||||
} | } | ||||
if (opts.IsLatestVersion) != "" { | if (opts.IsLatestVersion) != "" { | ||||
cond = cond.And( | |||||
builder.Eq{"cloudbrain.is_latest_version": opts.IsLatestVersion}, | |||||
) | |||||
cond = cond.And(builder.Or(builder.And(builder.Eq{"cloudbrain.is_latest_version": opts.IsLatestVersion}, builder.Eq{"cloudbrain.job_type": "TRAIN"}), builder.Neq{"cloudbrain.job_type": "TRAIN"})) | |||||
} | } | ||||
if len(opts.CloudbrainIDs) > 0 { | if len(opts.CloudbrainIDs) > 0 { | ||||
cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs)) | cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs)) | ||||
} | } | ||||
count, err := sess.Where(cond).Count(new(Cloudbrain)) | |||||
if len(opts.JobStatus) > 0 { | |||||
if opts.JobStatusNot { | |||||
cond = cond.And( | |||||
builder.NotIn("cloudbrain.status", opts.JobStatus), | |||||
) | |||||
} else { | |||||
cond = cond.And( | |||||
builder.In("cloudbrain.status", opts.JobStatus), | |||||
) | |||||
} | |||||
} | |||||
var count int64 | |||||
var err error | |||||
condition := "cloudbrain.user_id = `user`.id" | |||||
if len(opts.Keyword) == 0 { | |||||
count, err = sess.Where(cond).Count(new(Cloudbrain)) | |||||
} else { | |||||
lowerKeyWord := strings.ToLower(opts.Keyword) | |||||
cond = cond.And(builder.Or(builder.Like{"LOWER(cloudbrain.job_name)", lowerKeyWord}, builder.Like{"`user`.lower_name", lowerKeyWord})) | |||||
count, err = sess.Table(&Cloudbrain{}).Where(cond). | |||||
Join("left", "`user`", condition).Count(new(CloudbrainInfo)) | |||||
} | |||||
if err != nil { | if err != nil { | ||||
return nil, 0, fmt.Errorf("Count: %v", err) | return nil, 0, fmt.Errorf("Count: %v", err) | ||||
} | } | ||||
@@ -1109,11 +1135,25 @@ func Cloudbrains(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) { | |||||
sess.OrderBy("cloudbrain.created_unix DESC") | sess.OrderBy("cloudbrain.created_unix DESC") | ||||
cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum) | cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum) | ||||
if err := sess.Table(&Cloudbrain{}).Where(cond). | if err := sess.Table(&Cloudbrain{}).Where(cond). | ||||
Join("left", "`user`", "cloudbrain.user_id = `user`.id"). | |||||
Join("left", "`user`", condition). | |||||
Find(&cloudbrains); err != nil { | Find(&cloudbrains); err != nil { | ||||
return nil, 0, fmt.Errorf("Find: %v", err) | return nil, 0, fmt.Errorf("Find: %v", err) | ||||
} | } | ||||
if opts.NeedRepoInfo { | |||||
var ids []int64 | |||||
for _, task := range cloudbrains { | |||||
ids = append(ids, task.RepoID) | |||||
} | |||||
repositoryMap, err := GetRepositoriesMapByIDs(ids) | |||||
if err == nil { | |||||
for _, task := range cloudbrains { | |||||
task.Repo = repositoryMap[task.RepoID] | |||||
} | |||||
} | |||||
} | |||||
return cloudbrains, count, nil | return cloudbrains, count, nil | ||||
} | } | ||||
@@ -864,9 +864,13 @@ confirm_choice = confirm | |||||
cloudbran1_tips = Only data in zip format can create cloudbrain tasks | cloudbran1_tips = Only data in zip format can create cloudbrain tasks | ||||
cloudbrain_creator=Creator | cloudbrain_creator=Creator | ||||
cloudbrain_task = Task Name | cloudbrain_task = Task Name | ||||
cloudbrain_task_type = Task Type | |||||
cloudbrain_task_name=Cloud Brain Task Name | |||||
cloudbrain_operate = Operate | cloudbrain_operate = Operate | ||||
cloudbrain_status_createtime = Status/Createtime | cloudbrain_status_createtime = Status/Createtime | ||||
cloudbrain_status_runtime = Running Time | cloudbrain_status_runtime = Running Time | ||||
cloudbrain_jobname_err=Name must start with a lowercase letter or number,can include lowercase letter,number,_ and -,can not end with _, and can be up to 36 characters long. | |||||
cloudbrain_query_fail=Failed to query cloudbrain information. | |||||
record_begintime_get_err=Can not get the record begin time. | record_begintime_get_err=Can not get the record begin time. | ||||
parameter_is_wrong=The input parameter is wrong. | parameter_is_wrong=The input parameter is wrong. | ||||
@@ -2344,6 +2348,12 @@ datasets.owner=Owner | |||||
datasets.name=name | datasets.name=name | ||||
datasets.private=Private | datasets.private=Private | ||||
cloudbrain.all_task_types=All Task Types | |||||
cloudbrain.all_computing_resources=All Computing Resources | |||||
cloudbrain.all_status=All Status | |||||
cloudbrain.download_report=Download Report | |||||
cloudbrain.cloudbrain_name=Cloudbrain Name | |||||
hooks.desc = Webhooks automatically make HTTP POST requests to a server when certain openi events trigger. Webhooks defined here are defaults and will be copied into all new repositories. Read more in the <a target="_blank" rel="noopener" href="https://docs.openi.io/en-us/webhooks/">webhooks guide</a>. | hooks.desc = Webhooks automatically make HTTP POST requests to a server when certain openi events trigger. Webhooks defined here are defaults and will be copied into all new repositories. Read more in the <a target="_blank" rel="noopener" href="https://docs.openi.io/en-us/webhooks/">webhooks guide</a>. | ||||
hooks.add_webhook = Add Default Webhook | hooks.add_webhook = Add Default Webhook | ||||
hooks.update_webhook = Update Default Webhook | hooks.update_webhook = Update Default Webhook | ||||
@@ -868,10 +868,13 @@ confirm_choice=确定 | |||||
cloudbran1_tips=只有zip格式的数据集才能发起云脑任务 | cloudbran1_tips=只有zip格式的数据集才能发起云脑任务 | ||||
cloudbrain_creator=创建者 | cloudbrain_creator=创建者 | ||||
cloudbrain_task=任务名称 | cloudbrain_task=任务名称 | ||||
cloudbrain_task_type=任务类型 | |||||
cloudbrain_task_name=云脑侧任务名称 | |||||
cloudbrain_operate=操作 | cloudbrain_operate=操作 | ||||
cloudbrain_status_createtime=状态/创建时间 | cloudbrain_status_createtime=状态/创建时间 | ||||
cloudbrain_status_runtime = 运行时长 | cloudbrain_status_runtime = 运行时长 | ||||
cloudbrain_jobname_err=只能以小写字母或数字开头且只包含小写字母、数字、_和-,不能以_结尾,最长36个字符。 | cloudbrain_jobname_err=只能以小写字母或数字开头且只包含小写字母、数字、_和-,不能以_结尾,最长36个字符。 | ||||
cloudbrain_query_fail=查询云脑任务失败。 | |||||
record_begintime_get_err=无法获取统计开始时间。 | record_begintime_get_err=无法获取统计开始时间。 | ||||
parameter_is_wrong=输入参数错误,请检查输入参数。 | parameter_is_wrong=输入参数错误,请检查输入参数。 | ||||
@@ -2354,6 +2357,12 @@ datasets.owner=所有者 | |||||
datasets.name=名称 | datasets.name=名称 | ||||
datasets.private=私有 | datasets.private=私有 | ||||
cloudbrain.all_task_types=全部任务类型 | |||||
cloudbrain.all_computing_resources=全部计算资源 | |||||
cloudbrain.all_status=全部状态 | |||||
cloudbrain.download_report=下载此报告 | |||||
cloudbrain.cloudbrain_name=云脑侧名称 | |||||
hooks.desc=当某些 openi 事件触发时, Web 钩子会自动向服务器发出 HTTP POST 请求。此处定义的 Web 钩子是默认值, 将复制到所有新建项目中。参阅 <a target="_blank" rel="noopener" href="https://docs.openi.io/en-us/webhooks/">Web钩子指南</a> 获取更多内容。 | hooks.desc=当某些 openi 事件触发时, Web 钩子会自动向服务器发出 HTTP POST 请求。此处定义的 Web 钩子是默认值, 将复制到所有新建项目中。参阅 <a target="_blank" rel="noopener" href="https://docs.openi.io/en-us/webhooks/">Web钩子指南</a> 获取更多内容。 | ||||
hooks.add_webhook=新增默认Web钩子 | hooks.add_webhook=新增默认Web钩子 | ||||
hooks.update_webhook=更新默认Web钩子 | hooks.update_webhook=更新默认Web钩子 | ||||
@@ -2420,7 +2429,7 @@ auths.sspi_auto_activate_users_helper=允许 SSPI 认证自动激活新用户 | |||||
auths.sspi_strip_domain_names=从用户名中删除域名部分 | auths.sspi_strip_domain_names=从用户名中删除域名部分 | ||||
auths.sspi_strip_domain_names_helper=如果选中此项,域名将从登录名中删除(例如,"DOMAIN\user"和"user@example.org",两者都将变成只是“用户”)。 | auths.sspi_strip_domain_names_helper=如果选中此项,域名将从登录名中删除(例如,"DOMAIN\user"和"user@example.org",两者都将变成只是“用户”)。 | ||||
auths.sspi_separator_replacement=要使用的分隔符代替\, / 和 @ | auths.sspi_separator_replacement=要使用的分隔符代替\, / 和 @ | ||||
auths.sspi_separator_replacement_helper=用于替换下级登录名称分隔符的字符 (例如) "DOMAIN\user") 中的 \ 和用户主名字(如"user@example.org中的 @ )。 | |||||
auths.sspi_separator_replacement_helper=用于替换下级登录名称分隔符的字符 (例如) "DOMAIN\user") 中的 \ 和用户主名字(如"user@example.org"中的 @ )。 | |||||
auths.sspi_default_language=默认语言 | auths.sspi_default_language=默认语言 | ||||
auths.sspi_default_language_helper=SSPI 认证方法为用户自动创建的默认语言。如果您想要自动检测到语言,请留空。 | auths.sspi_default_language_helper=SSPI 认证方法为用户自动创建的默认语言。如果您想要自动检测到语言,请留空。 | ||||
auths.tips=帮助提示 | auths.tips=帮助提示 | ||||
@@ -13869,6 +13869,130 @@ | |||||
"integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", | "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", | ||||
"dev": true | "dev": true | ||||
}, | }, | ||||
"ts-loader": { | |||||
"version": "4.0.0", | |||||
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.0.0.tgz", | |||||
"integrity": "sha512-iissbnuJkqbB3YAmnWyEbmdNcGcoiiXopKHKyqdoCrFQVi9pnplXeveQDXJnQOCYNNcb2pjT2zzSYTX6c9QtAA==", | |||||
"dev": true, | |||||
"requires": { | |||||
"chalk": "^2.3.0", | |||||
"enhanced-resolve": "^4.0.0", | |||||
"loader-utils": "^1.0.2", | |||||
"micromatch": "^3.1.4", | |||||
"semver": "^5.0.1" | |||||
}, | |||||
"dependencies": { | |||||
"braces": { | |||||
"version": "2.3.2", | |||||
"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", | |||||
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", | |||||
"dev": true, | |||||
"requires": { | |||||
"arr-flatten": "^1.1.0", | |||||
"array-unique": "^0.3.2", | |||||
"extend-shallow": "^2.0.1", | |||||
"fill-range": "^4.0.0", | |||||
"isobject": "^3.0.1", | |||||
"repeat-element": "^1.1.2", | |||||
"snapdragon": "^0.8.1", | |||||
"snapdragon-node": "^2.0.1", | |||||
"split-string": "^3.0.2", | |||||
"to-regex": "^3.0.1" | |||||
}, | |||||
"dependencies": { | |||||
"extend-shallow": { | |||||
"version": "2.0.1", | |||||
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", | |||||
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", | |||||
"dev": true, | |||||
"requires": { | |||||
"is-extendable": "^0.1.0" | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
"fill-range": { | |||||
"version": "4.0.0", | |||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", | |||||
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", | |||||
"dev": true, | |||||
"requires": { | |||||
"extend-shallow": "^2.0.1", | |||||
"is-number": "^3.0.0", | |||||
"repeat-string": "^1.6.1", | |||||
"to-regex-range": "^2.1.0" | |||||
}, | |||||
"dependencies": { | |||||
"extend-shallow": { | |||||
"version": "2.0.1", | |||||
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", | |||||
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", | |||||
"dev": true, | |||||
"requires": { | |||||
"is-extendable": "^0.1.0" | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
"is-number": { | |||||
"version": "3.0.0", | |||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", | |||||
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", | |||||
"dev": true, | |||||
"requires": { | |||||
"kind-of": "^3.0.2" | |||||
}, | |||||
"dependencies": { | |||||
"kind-of": { | |||||
"version": "3.2.2", | |||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", | |||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", | |||||
"dev": true, | |||||
"requires": { | |||||
"is-buffer": "^1.1.5" | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
"isobject": { | |||||
"version": "3.0.1", | |||||
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", | |||||
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", | |||||
"dev": true | |||||
}, | |||||
"micromatch": { | |||||
"version": "3.1.10", | |||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", | |||||
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", | |||||
"dev": true, | |||||
"requires": { | |||||
"arr-diff": "^4.0.0", | |||||
"array-unique": "^0.3.2", | |||||
"braces": "^2.3.1", | |||||
"define-property": "^2.0.2", | |||||
"extend-shallow": "^3.0.2", | |||||
"extglob": "^2.0.4", | |||||
"fragment-cache": "^0.2.1", | |||||
"kind-of": "^6.0.2", | |||||
"nanomatch": "^1.2.9", | |||||
"object.pick": "^1.3.0", | |||||
"regex-not": "^1.0.0", | |||||
"snapdragon": "^0.8.1", | |||||
"to-regex": "^3.0.2" | |||||
} | |||||
}, | |||||
"to-regex-range": { | |||||
"version": "2.1.1", | |||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", | |||||
"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", | |||||
"dev": true, | |||||
"requires": { | |||||
"is-number": "^3.0.0", | |||||
"repeat-string": "^1.6.1" | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
"tslib": { | "tslib": { | ||||
"version": "1.13.0", | "version": "1.13.0", | ||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", | ||||
@@ -13928,6 +14052,12 @@ | |||||
"is-typedarray": "^1.0.0" | "is-typedarray": "^1.0.0" | ||||
} | } | ||||
}, | }, | ||||
"typescript": { | |||||
"version": "4.5.5", | |||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", | |||||
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", | |||||
"dev": true | |||||
}, | |||||
"ua-parser-js": { | "ua-parser-js": { | ||||
"version": "0.7.21", | "version": "0.7.21", | ||||
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", | ||||
@@ -69,6 +69,8 @@ | |||||
"script-loader": "0.7.2", | "script-loader": "0.7.2", | ||||
"stylelint": "13.3.3", | "stylelint": "13.3.3", | ||||
"stylelint-config-standard": "20.0.0", | "stylelint-config-standard": "20.0.0", | ||||
"ts-loader": "4.0.0", | |||||
"typescript": "4.5.5", | |||||
"updates": "10.2.11" | "updates": "10.2.11" | ||||
}, | }, | ||||
"browserslist": [ | "browserslist": [ | ||||
@@ -0,0 +1,217 @@ | |||||
package admin | |||||
import ( | |||||
"net/http" | |||||
"net/url" | |||||
"strconv" | |||||
"strings" | |||||
"time" | |||||
"github.com/360EntSecGroup-Skylar/excelize/v2" | |||||
"code.gitea.io/gitea/modules/modelarts" | |||||
"code.gitea.io/gitea/models" | |||||
"code.gitea.io/gitea/modules/base" | |||||
"code.gitea.io/gitea/modules/context" | |||||
"code.gitea.io/gitea/modules/log" | |||||
"code.gitea.io/gitea/modules/setting" | |||||
) | |||||
const ( | |||||
tplCloudBrains base.TplName = "admin/cloudbrain/list" | |||||
EXCEL_DATE_FORMAT = "20060102150405" | |||||
CREATE_TIME_FORMAT = "2006/01/02 15:04:05.00" | |||||
) | |||||
func CloudBrains(ctx *context.Context) { | |||||
ctx.Data["Title"] = ctx.Tr("admin.cloudBrains") | |||||
ctx.Data["PageIsAdmin"] = true | |||||
ctx.Data["PageIsAdminCloudBrains"] = true | |||||
listType := ctx.Query("listType") | |||||
jobType := ctx.Query("jobType") | |||||
jobStatus := ctx.Query("jobStatus") | |||||
ctx.Data["ListType"] = listType | |||||
ctx.Data["JobType"] = jobType | |||||
ctx.Data["JobStatus"] = jobStatus | |||||
page := ctx.QueryInt("page") | |||||
if page <= 0 { | |||||
page = 1 | |||||
} | |||||
debugType := modelarts.DebugType | |||||
if listType == models.GPUResource { | |||||
debugType = models.TypeCloudBrainOne | |||||
} else if listType == models.NPUResource { | |||||
debugType = models.TypeCloudBrainTwo | |||||
} | |||||
var jobTypes []string | |||||
jobTypeNot := false | |||||
if jobType == string(models.JobTypeDebug) { | |||||
jobTypes = append(jobTypes, string(models.JobTypeSnn4imagenet), string(models.JobTypeBrainScore), string(models.JobTypeDebug)) | |||||
} else if jobType != "all" && jobType != "" { | |||||
jobTypes = append(jobTypes, jobType) | |||||
} | |||||
var jobStatuses []string | |||||
jobStatusNot := false | |||||
if jobStatus == "other" { | |||||
jobStatusNot = true | |||||
jobStatuses = append(jobStatuses, string(models.ModelArtsTrainJobWaiting), string(models.ModelArtsTrainJobFailed), string(models.ModelArtsRunning), string(models.ModelArtsTrainJobCompleted), | |||||
string(models.ModelArtsStarting), string(models.ModelArtsRestarting), string(models.ModelArtsStartFailed), | |||||
string(models.ModelArtsStopping), string(models.ModelArtsStopped)) | |||||
} else if jobStatus != "all" && jobStatus != "" { | |||||
jobStatuses = append(jobStatuses, jobStatus) | |||||
} | |||||
keyword := strings.Trim(ctx.Query("q"), " ") | |||||
ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||||
ListOptions: models.ListOptions{ | |||||
Page: page, | |||||
PageSize: setting.UI.IssuePagingNum, | |||||
}, | |||||
Keyword: keyword, | |||||
Type: debugType, | |||||
JobTypeNot: jobTypeNot, | |||||
JobStatusNot: jobStatusNot, | |||||
JobStatus: jobStatuses, | |||||
JobTypes: jobTypes, | |||||
NeedRepoInfo: true, | |||||
IsLatestVersion: modelarts.IsLatestVersion, | |||||
}) | |||||
if err != nil { | |||||
ctx.ServerError("Get job failed:", err) | |||||
return | |||||
} | |||||
for i, task := range ciTasks { | |||||
ciTasks[i].CanDebug = true | |||||
ciTasks[i].CanDel = true | |||||
ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||||
} | |||||
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["CanCreate"] = true | |||||
ctx.Data["Keyword"] = keyword | |||||
ctx.HTML(200, tplCloudBrains) | |||||
} | |||||
func DownloadCloudBrains(ctx *context.Context) { | |||||
page := 1 | |||||
pageSize := 300 | |||||
var cloudBrain = ctx.Tr("repo.cloudbrain") | |||||
fileName := getFileName(cloudBrain) | |||||
_, total, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||||
ListOptions: models.ListOptions{ | |||||
Page: page, | |||||
PageSize: 1, | |||||
}, | |||||
Type: modelarts.DebugType, | |||||
NeedRepoInfo: false, | |||||
IsLatestVersion: modelarts.IsLatestVersion, | |||||
}) | |||||
if err != nil { | |||||
log.Warn("Can not get cloud brain info", err) | |||||
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.cloudbrain_query_fail")) | |||||
return | |||||
} | |||||
totalPage := getTotalPage(total, pageSize) | |||||
f := excelize.NewFile() | |||||
index := f.NewSheet(cloudBrain) | |||||
f.DeleteSheet("Sheet1") | |||||
for k, v := range allHeader(ctx) { | |||||
f.SetCellValue(cloudBrain, k, v) | |||||
} | |||||
var row = 2 | |||||
for i := 0; i < totalPage; i++ { | |||||
pageRecords, _, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||||
ListOptions: models.ListOptions{ | |||||
Page: page, | |||||
PageSize: pageSize, | |||||
}, | |||||
Type: modelarts.DebugType, | |||||
NeedRepoInfo: true, | |||||
}) | |||||
if err != nil { | |||||
log.Warn("Can not get cloud brain info", err) | |||||
continue | |||||
} | |||||
for _, record := range pageRecords { | |||||
for k, v := range allValues(row, record, ctx) { | |||||
f.SetCellValue(cloudBrain, k, v) | |||||
} | |||||
row++ | |||||
} | |||||
page++ | |||||
} | |||||
f.SetActiveSheet(index) | |||||
ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName)) | |||||
ctx.Resp.Header().Set("Content-Type", "application/octet-stream") | |||||
f.WriteTo(ctx.Resp) | |||||
} | |||||
func allValues(row int, rs *models.CloudbrainInfo, ctx *context.Context) map[string]string { | |||||
return map[string]string{getCellName("A", row): rs.JobName, getCellName("B", row): rs.Status, getCellName("C", row): rs.JobType, getCellName("D", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT), getCellName("E", row): getDurationTime(rs), | |||||
getCellName("F", row): rs.ComputeResource, getCellName("G", row): rs.Name, getCellName("H", row): rs.Repo.OwnerName + "/" + rs.Repo.Alias, getCellName("I", row): rs.JobName, | |||||
} | |||||
} | |||||
func getDurationTime(rs *models.CloudbrainInfo) string { | |||||
if rs.JobType == "TRAIN" || rs.JobType == "INFERENCE" { | |||||
return rs.TrainJobDuration | |||||
} else { | |||||
return "-" | |||||
} | |||||
} | |||||
func getFileName(baseName string) string { | |||||
return baseName + "_" + time.Now().Format(EXCEL_DATE_FORMAT) + ".xlsx" | |||||
} | |||||
func getTotalPage(total int64, pageSize int) int { | |||||
another := 0 | |||||
if int(total)%pageSize != 0 { | |||||
another = 1 | |||||
} | |||||
return int(total)/pageSize + another | |||||
} | |||||
func allHeader(ctx *context.Context) map[string]string { | |||||
return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.modelarts.status"), "C1": ctx.Tr("repo.cloudbrain_task_type"), "D1": ctx.Tr("repo.modelarts.createtime"), "E1": ctx.Tr("repo.modelarts.train_job.dura_time"), "F1": ctx.Tr("repo.modelarts.computing_resources"), "G1": ctx.Tr("repo.cloudbrain_creator"), "H1": ctx.Tr("repo.repo_name"), "I1": ctx.Tr("repo.cloudbrain_task_name")} | |||||
} | |||||
func getCellName(col string, row int) string { | |||||
return col + strconv.Itoa(row) | |||||
} |
@@ -586,7 +586,13 @@ func CloudBrainDel(ctx *context.Context) { | |||||
ctx.ServerError(err.Error(), err) | ctx.ServerError(err.Error(), err) | ||||
return | return | ||||
} | } | ||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=" + listType) | |||||
var isAdminPage = ctx.Query("isadminpage") | |||||
if ctx.IsUserSiteAdmin() && isAdminPage == "true" { | |||||
ctx.Redirect(setting.AppSubURL + "/admin" + "/cloudbrains") | |||||
} else { | |||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=all") | |||||
} | |||||
} | } | ||||
func deleteCloudbrainJob(ctx *context.Context) error { | func deleteCloudbrainJob(ctx *context.Context) error { | ||||
@@ -1348,5 +1354,11 @@ func BenchmarkDel(ctx *context.Context) { | |||||
ctx.ServerError(err.Error(), err) | ctx.ServerError(err.Error(), err) | ||||
return | return | ||||
} | } | ||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/cloudbrain/benchmark") | |||||
var isAdminPage = ctx.Query("isadminpage") | |||||
if ctx.IsUserSiteAdmin() && isAdminPage == "true" { | |||||
ctx.Redirect(setting.AppSubURL + "/admin" + "/cloudbrains") | |||||
} else { | |||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/cloudbrain/benchmark") | |||||
} | |||||
} | } |
@@ -445,7 +445,12 @@ func NotebookDel(ctx *context.Context) { | |||||
return | return | ||||
} | } | ||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=" + listType) | |||||
var isAdminPage = ctx.Query("isadminpage") | |||||
if ctx.IsUserSiteAdmin() && isAdminPage == "true" { | |||||
ctx.Redirect(setting.AppSubURL + "/admin" + "/cloudbrains") | |||||
} else { | |||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=all") | |||||
} | |||||
} | } | ||||
func TrainJobIndex(ctx *context.Context) { | func TrainJobIndex(ctx *context.Context) { | ||||
@@ -1551,7 +1556,12 @@ func TrainJobDel(ctx *context.Context) { | |||||
DeleteJobStorage(VersionListTasks[0].JobName) | DeleteJobStorage(VersionListTasks[0].JobName) | ||||
} | } | ||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/train-job") | |||||
var isAdminPage = ctx.Query("isadminpage") | |||||
if ctx.IsUserSiteAdmin() && isAdminPage == "true" { | |||||
ctx.Redirect(setting.AppSubURL + "/admin" + "/cloudbrains") | |||||
} else { | |||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/train-job") | |||||
} | |||||
} | } | ||||
func TrainJobStop(ctx *context.Context) { | func TrainJobStop(ctx *context.Context) { | ||||
@@ -508,6 +508,10 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Get("", admin.Datasets) | m.Get("", admin.Datasets) | ||||
// m.Post("/delete", admin.DeleteDataset) | // m.Post("/delete", admin.DeleteDataset) | ||||
}) | }) | ||||
m.Group("/cloudbrains", func() { | |||||
m.Get("", admin.CloudBrains) | |||||
m.Get("/download", admin.DownloadCloudBrains) | |||||
}) | |||||
m.Group("/^:configType(hooks|system-hooks)$", func() { | m.Group("/^:configType(hooks|system-hooks)$", func() { | ||||
m.Get("", admin.DefaultOrSystemWebhooks) | m.Get("", admin.DefaultOrSystemWebhooks) | ||||
@@ -0,0 +1,219 @@ | |||||
{{template "base/head" .}} | |||||
<!-- 弹窗 --> | |||||
<div id="mask"> | |||||
<div id="loadingPage"> | |||||
<div class="rect1"></div> | |||||
<div class="rect2"></div> | |||||
<div class="rect3"></div> | |||||
<div class="rect4"></div> | |||||
<div class="rect5"></div> | |||||
</div> | |||||
</div> | |||||
<!-- 提示框 --> | |||||
<div class="alert"></div> | |||||
<div class="admin user"> | |||||
{{template "admin/navbar" .}} | |||||
<div class="ui container" style="width: 80%;"> | |||||
{{template "base/alert" .}} | |||||
<div class="ui grid" > | |||||
<div class="row" style="border: 1px solid #d4d4d5;margin-top: 15px;padding-top: 0;"> | |||||
{{template "admin/cloudbrain/search" .}} | |||||
<div class="ui ten wide column right aligned" style="margin: 1rem 0;"> | |||||
<a class="ui compact blue basic icon button" style="box-shadow: none !important; padding: 0.8em;" href="/admin/cloudbrains/download"><i class="ri-download-line middle aligned icon"></i>{{.i18n.Tr "admin.cloudbrain.download_report"}}</a> | |||||
</div> | |||||
<div class="ui sixteen wide column"> | |||||
<!-- 任务展示 --> | |||||
<div class="dataset list"> | |||||
<!-- 表头 --> | |||||
<div class="ui grid stackable" style="background: #f0f0f0;;"> | |||||
<div class="row"> | |||||
<div class="two wide column padding0"> | |||||
<span style="margin:0 6px">{{$.i18n.Tr "repo.cloudbrain_task"}}</span> | |||||
</div> | |||||
<div class="one wide column text center padding0"> | |||||
<span style="margin:0 6px">{{$.i18n.Tr "repo.cloudbrain_task_type"}}</span> | |||||
</div> | |||||
<div class="two wide column text center padding0" style="width: 10% !important;"> | |||||
<span>{{$.i18n.Tr "repo.modelarts.status"}}</span> | |||||
</div> | |||||
<div class="two wide column text center padding0" style="width: 10% !important;"> | |||||
<span>{{$.i18n.Tr "repo.modelarts.createtime"}}</span> | |||||
</div> | |||||
<div class="one wide column text center padding0"> | |||||
<span>{{$.i18n.Tr "repo.cloudbrain_status_runtime"}}</span> | |||||
</div> | |||||
<div class="one wide column text center padding0"> | |||||
<span>{{$.i18n.Tr "repo.modelarts.computing_resources"}}</span> | |||||
</div> | |||||
<div class="one wide column text center padding0"> | |||||
<span>{{$.i18n.Tr "repo.cloudbrain_creator"}}</span> | |||||
</div> | |||||
<div class="two wide column text center padding0"> | |||||
<span>{{$.i18n.Tr "repository"}}</span> | |||||
</div> | |||||
<div class="two wide column text center padding0"> | |||||
<span>{{.i18n.Tr "admin.cloudbrain.cloudbrain_name"}}</span> | |||||
</div> | |||||
<div class="two wide column text center padding0" style="width: 17.5%!important;"> | |||||
<span>{{$.i18n.Tr "repo.cloudbrain_operate"}}</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
{{range .Tasks}} | |||||
<div class="ui grid stackable item"> | |||||
<div class="row"> | |||||
<!-- 任务名 --> | |||||
<div class="two wide column padding0"> | |||||
{{if eq .JobType "DEBUG"}} | |||||
<a class="title" href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}/cloudbrain/{{.JobID}}" title="{{.JobName}}" style="font-size: 14px;"> | |||||
<span class="fitted" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> | |||||
</a> | |||||
{{else if eq .JobType "INFERENCE"}} | |||||
<a class="title" href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}/modelarts/inference-job/{{.JobID}}" title="{{.JobName}}" style="font-size: 14px;"> | |||||
<span class="fitted" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> | |||||
</a> | |||||
{{else if eq .JobType "TRAIN"}} | |||||
<a class="title" href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}/modelarts/train-job/{{.JobID}}" title="{{.JobName}}" style="font-size: 14px;"> | |||||
<span class="fitted" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> | |||||
</a> | |||||
{{else if eq .JobType "BENCHMARK"}} | |||||
<a class="title" href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}/cloudbrain/benchmark/{{.JobID}}" title="{{.JobName}}" style="font-size: 14px;"> | |||||
<span class="fitted" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> | |||||
</a> | |||||
{{end}} | |||||
</div> | |||||
<!-- 任务类型 --> | |||||
<div class="one wide column text center padding0"> | |||||
<span style="font-size: 12px;">{{.JobType}} </span> | |||||
</div> | |||||
<!-- 任务状态 --> | |||||
<div class="two wide column text center padding0" style="padding-left: 2.2rem !important; width: 10% !important;"> | |||||
<span class="job-status" id="{{.JobID}}" data-repopath='{{.Repo.OwnerName}}/{{.Repo.Alias}}{{if eq .JobType "DEBUG"}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}{{else if eq .JobType "INFERENCE"}}/modelarts/inference-job{{else if eq .JobType "TRAIN"}}/modelarts/train-job{{else if eq .JobType "BENCHMARK"}}/cloudbrain{{end}}' data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
<span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | |||||
</span> | |||||
</div> | |||||
<!-- 任务创建时间 --> | |||||
<div class="two wide column text center padding0" style="width: 10% !important;"> | |||||
<span style="font-size: 12px;" class="">{{TimeSinceUnix1 .Cloudbrain.CreatedUnix}}</span> | |||||
</div> | |||||
<!-- 任务运行时间 --> | |||||
<div class="one wide column text center padding0"> | |||||
<span style="font-size: 12px;" id="duration-{{.JobID}}">{{if .TrainJobDuration}}{{.TrainJobDuration}}{{else}}--{{end}}</span> | |||||
</div> | |||||
<!-- 计算资源 --> | |||||
<div class="one wide column text center padding0"> | |||||
<span style="font-size: 12px;">{{if .ComputeResource}}{{.ComputeResource}}{{else}}--{{end}}</span> | |||||
</div> | |||||
<!-- 创建者 --> | |||||
<div class="one wide column text center padding0"> | |||||
{{if .User.Name}} | |||||
<a href="{{AppSubUrl}}/{{.User.Name}}" title="{{.User.Name}}"><img class="ui avatar image" src="{{.User.RelAvatarLink}}"></a> | |||||
{{else}} | |||||
<a title="Ghost"><img class="ui avatar image" src="{{AppSubUrl}}/user/avatar/Ghost/-1"></a> | |||||
{{end}} | |||||
</div> | |||||
<!-- 项目 --> | |||||
<div class="two wide column text center padding0"> | |||||
<a href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}" title="{{.Repo.OwnerName}}/{{.Repo.Alias}}">{{.Repo.OwnerName}}/{{.Repo.Alias}}</a> | |||||
</div> | |||||
<!-- 云脑侧名称 --> | |||||
<div class="two wide column text center padding0" style="overflow: hidden;text-overflow:ellipsis;"> | |||||
<span class="fitted">{{.JobName}}</span> | |||||
</div> | |||||
<div class="two wide column text center padding0" style="width: 17.5%!important;"> | |||||
{{if eq .JobType "DEBUG"}} | |||||
<div class="ui compact buttons"> | |||||
<form id="debugAgainForm-{{.JobID}}"> | |||||
{{$.CsrfTokenHtml}} | |||||
{{if eq .Status "RUNNING" "WAITING" "CREATING" "STARTING"}} | |||||
<a style="margin: 0 1rem;" id="ai-debug-{{.JobID}}" class='ui basic ai_debug {{if eq .Status "CREATING" "STOPPING" "WAITING" "STARTING"}}disabled {{else}}blue {{end}}button' data-jobid="{{.JobID}}" data-repopath='{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.JobID}}/'> | |||||
{{$.i18n.Tr "repo.debug"}} | |||||
</a> | |||||
{{else}} | |||||
<a id="ai-debug-{{.JobID}}" class='ui basic ai_debug {{if eq .Status "CREATING" "STOPPING" "WAITING" "STARTING"}} disabled {{else}}blue {{end}}button' data-jobid="{{.JobID}}" data-repopath='{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.JobID}}/'> | |||||
{{$.i18n.Tr "repo.debug_again"}} | |||||
</a> | |||||
{{end}} | |||||
</form> | |||||
</div> | |||||
{{end}} | |||||
<!-- 停止任务 --> | |||||
<div class="ui compact buttons"> | |||||
{{if eq .JobType "DEBUG" "BENCHMARK"}} | |||||
<form id="stopForm-{{.JobID}}" style="margin-left:-1px;"> | |||||
{{$.CsrfTokenHtml}} | |||||
<a style="padding: 0.5rem 1rem;" id="ai-stop-{{.JobID}}" class='ui basic ai_stop {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED" "SUCCEEDED" "STOPPED" "STOPPING"}}disabled {{else}} blue {{end}}button' data-repopath='{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else if eq .JobType "BENCHMARK" }}/cloudbrain/benchmark{{else if eq .ComputeResource "NPU" }}/modelarts/notebook{{end}}/{{.JobID}}/stop' data-jobid="{{.JobID}}"> | |||||
{{$.i18n.Tr "repo.stop"}} | |||||
</a> | |||||
</form> | |||||
{{else}} | |||||
<a style="padding: 0.5rem 1rem;" id="ai-stop-{{.JobID}}" class="ui basic ai_stop_version {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{else}} blue {{end}}button" data-repopath="{{.Repo.OwnerName}}/{{.Repo.Alias}}/modelarts/{{if eq .JobType "INFERENCE"}}inference-job{{else}}train-job{{end}}" data-jobid="{{.JobID}}" data-version="{{.VersionName}}" > | |||||
{{$.i18n.Tr "repo.stop"}} | |||||
</a> | |||||
{{end}} | |||||
</div> | |||||
<!-- 删除任务 --> | |||||
<form class="ui compact buttons" id="delForm-{{.JobID}}" action='{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}{{if eq .JobType "BENCHMARK"}}/cloudbrain/benchmark{{else if eq .JobType "DEBUG"}}{{if eq .ComputeResource "NPU"}}/modelarts/notebook{{else}}/cloudbrain{{end}}{{else if eq .JobType "TRAIN"}}/modelarts/train-job{{end}}/{{.JobID}}/del?isadminpage=true' method="post"> | |||||
{{$.CsrfTokenHtml}} | |||||
<a style="padding: 0.5rem 1rem;margin-left:0.2rem" id="ai-delete-{{.JobID}}" data-repopath="{{.Repo.OwnerName}}/{{.Repo.Alias}}/modelarts/inference-job/{{.JobID}}/del_version?isadminpage=true" data-version="{{.VersionName}}" class="ui basic ai_delete blue button" style="border-radius: .28571429rem;"> | |||||
{{$.i18n.Tr "repo.delete"}} | |||||
</a> | |||||
</form> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
{{end}} | |||||
<div id="app" style="margin-top: 2rem;"> | |||||
<div class="center"> | |||||
<el-pagination | |||||
background | |||||
@current-change="handleCurrentChange" | |||||
:current-page="page" | |||||
:page-sizes="[10]" | |||||
:page-size="10" | |||||
layout="total, sizes, prev, pager, next, jumper" | |||||
:total="{{.Page.Paginater.Total}}"> | |||||
</el-pagination> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<!-- 确认模态框 --> | |||||
<div id="deletemodel"> | |||||
<div class="ui basic modal"> | |||||
<div class="ui icon header"> | |||||
<i class="trash icon"></i> 删除任务 | |||||
</div> | |||||
<div class="content"> | |||||
<p>你确认删除该任务么?此任务一旦删除不可恢复。</p> | |||||
</div> | |||||
<div class="actions"> | |||||
<div class="ui red basic inverted cancel button"> | |||||
<i class="remove icon"></i> 取消操作 | |||||
</div> | |||||
<div class="ui green basic inverted ok button"> | |||||
<i class="checkmark icon"></i> 确定操作 | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
{{template "base/footer" .}} | |||||
<script> | |||||
function getParams(){ | |||||
const params = new URLSearchParams(window.location.search) | |||||
let jobType = !params.get('jobType')? '{{.i18n.Tr "admin.cloudbrain.all_task_types"}}' : params.get('jobType') | |||||
let listType = !params.get('listType')? '{{.i18n.Tr "admin.cloudbrain.all_computing_resources"}}' : params.get('listType') | |||||
let jobStatus = !params.get('jobStatus')? '{{.i18n.Tr "admin.cloudbrain.all_status"}}' : params.get('jobStatus') | |||||
const dropdownValueArray = [jobType,listType,jobStatus] | |||||
$('#adminCloud .default.text ').each(function(index,e){ | |||||
$(e).text(dropdownValueArray[index]) | |||||
}) | |||||
} | |||||
getParams() | |||||
</script> |
@@ -0,0 +1,46 @@ | |||||
<div class="ui attached segment"> | |||||
<form class="ui form ignore-dirty" style="max-width: 90%"> | |||||
<div class="ui fluid action input"> | |||||
<input name="q" value="{{.Keyword}}" placeholder="{{.i18n.Tr "explore.search"}}..." autofocus> | |||||
<button class="ui blue button">{{.i18n.Tr "explore.search"}}</button> | |||||
</div> | |||||
</form> | |||||
</div> | |||||
<div class="ui six wide column" style="margin: 1rem 0;" id="adminCloud"> | |||||
<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 "admin.cloudbrain.all_task_types"}}</div> | |||||
<i class="dropdown icon"></i> | |||||
<div class="menu"> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType=&listType={{$.ListType}}&jobStatus={{$.JobStatus}}" data-value='{{.i18n.Tr "admin.cloudbrain.all_task_types"}}'>{{.i18n.Tr "admin.cloudbrain.all_task_types"}}</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType=DEBUG&listType={{$.ListType}}&jobStatus={{$.JobStatus}}" data-value="DEBUG">DEBUG</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType=TRAIN&listType={{$.ListType}}&jobStatus={{$.JobStatus}}" data-value="TRAIN">TRAIN</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType=INFERENCE&listType={{$.ListType}}&jobStatus={{$.JobStatus}}" data-value="INFERENCE">INFERENCE</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 "admin.cloudbrain.all_computing_resources"}}</div> | |||||
<i class="dropdown icon"></i> | |||||
<div class="menu"> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType=&jobStatus={{$.JobStatus}}" data-value='{{.i18n.Tr "admin.cloudbrain.all_computing_resources"}}'>{{.i18n.Tr "admin.cloudbrain.all_computing_resources"}}</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType=CPU/GPU&jobStatus={{$.JobStatus}}" data-value="CPU/GPU">CPU/GPU</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType=NPU&jobStatus={{$.JobStatus}}" data-value="NPU">NPU</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 "admin.cloudbrain.all_status"}}</div> | |||||
<i class="dropdown icon"></i> | |||||
<div class="menu"> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=" data-value='{{.i18n.Tr "admin.cloudbrain.all_status"}}'>{{.i18n.Tr "admin.cloudbrain.all_status"}}</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=STARTING" data-value="CPU/GPU">STARTING</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=RESTARTING" data-value="NPU">RESTARTING </a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=START_FAILED" data-value="all">START_FAILED</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=STOPPING" data-value="CPU/GPU">STOPPING</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=STOPPED}" data-value="NPU">STOPPED</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=WAITING" data-value="all">WAITING</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=COMPLETED" data-value="CPU/GPU">COMPLETED</a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=FAILED" data-value="NPU">FAILED </a> | |||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus=OTHER" data-value="NPU">OTHER</a> | |||||
</div> | |||||
</div> | |||||
</div> |
@@ -14,6 +14,9 @@ | |||||
<a class="{{if .PageIsAdminDatasets}}active{{end}} item" href="{{AppSubUrl}}/admin/datasets"> | <a class="{{if .PageIsAdminDatasets}}active{{end}} item" href="{{AppSubUrl}}/admin/datasets"> | ||||
{{.i18n.Tr "admin.datasets"}} | {{.i18n.Tr "admin.datasets"}} | ||||
</a> | </a> | ||||
<a class="{{if .PageIsAdminCloudBrains}}active{{end}} item" href="{{AppSubUrl}}/admin/cloudbrains"> | |||||
云脑任务 | |||||
</a> | |||||
<a class="{{if .PageIsAdminHooks}}active{{end}} item" href="{{AppSubUrl}}/admin/hooks"> | <a class="{{if .PageIsAdminHooks}}active{{end}} item" href="{{AppSubUrl}}/admin/hooks"> | ||||
{{.i18n.Tr "admin.hooks"}} | {{.i18n.Tr "admin.hooks"}} | ||||
</a> | </a> | ||||
@@ -120,7 +120,6 @@ | |||||
<script> | <script> | ||||
function show_bt(bt_id){ | function show_bt(bt_id){ | ||||
console.log(bt_id) | |||||
document.getElementById(""+bt_id).getElementsByClassName("button_leaveOrg")[0].style.display="inline-block"; | document.getElementById(""+bt_id).getElementsByClassName("button_leaveOrg")[0].style.display="inline-block"; | ||||
} | } | ||||
@@ -105,7 +105,7 @@ | |||||
</div> | </div> | ||||
<!-- 任务状态 --> | <!-- 任务状态 --> | ||||
<div class="two wide column padding0" style="padding-left: 2.2rem !important;"> | <div class="two wide column padding0" style="padding-left: 2.2rem !important;"> | ||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}" data-version="{{.VersionName}}" data-jobname="{{.JobName}}"> | |||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
<span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | <span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | ||||
</span> | </span> | ||||
</div> | </div> | ||||
@@ -136,10 +136,9 @@ | |||||
<form id="stopForm-{{.JobID}}" style="margin-left:-1px;"> | <form id="stopForm-{{.JobID}}" style="margin-left:-1px;"> | ||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDel}} | {{if .CanDel}} | ||||
<a id="stop-model-debug-{{.JobID}}" class='ui basic {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED"}}disabled {{else}}blue {{end}}button' onclick='stopDebug("{{.JobID}}","{{$.RepoLink}}/cloudbrain/benchmark/{{.JobID}}/stop")'> | |||||
{{$.i18n.Tr "repo.stop"}} | |||||
</a> | |||||
<a id="ai-stop-{{.JobID}}" class='ui basic ai_stop {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED"}}disabled {{else}}blue {{end}}button' data-repopath="{{$.RepoLink}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.JobID}}/stop" data-jobid="{{.JobID}}"> | |||||
{{$.i18n.Tr "repo.stop"}} | |||||
</a> | |||||
{{else}} | {{else}} | ||||
<a class="ui basic disabled button"> | <a class="ui basic disabled button"> | ||||
@@ -147,26 +146,21 @@ | |||||
</a> | </a> | ||||
{{end}} | {{end}} | ||||
</form> | </form> | ||||
<a class="ui basic button {{if $.IsSigned}} blue{{else}} disabled{{end}}" href="{{$.RepoLink}}/cloudbrain/{{.JobID}}/rate" target="_blank"> | <a class="ui basic button {{if $.IsSigned}} blue{{else}} disabled{{end}}" href="{{$.RepoLink}}/cloudbrain/{{.JobID}}/rate" target="_blank"> | ||||
评分 | 评分 | ||||
</a> | </a> | ||||
<!-- 删除任务 --> | <!-- 删除任务 --> | ||||
<form id="delForm-{{.JobID}}" action="{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain/benchmark{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}/del" method="post"> | <form id="delForm-{{.JobID}}" action="{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain/benchmark{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}/del" method="post"> | ||||
<input type="hidden" name="debugListType" value="all"> | <input type="hidden" name="debugListType" value="all"> | ||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDel}} | {{if .CanDel}} | ||||
<a id="model-delete-{{.JobID}}" class='ui basic {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "SUCCEEDED"}}blue {{else}}disabled {{end}}button' onclick="assertDelete(this)" style="border-radius: .28571429rem;"> | |||||
<a id="ai-delete-{{.JobID}}" class='ui basic ai_delete {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "SUCCEEDED"}}blue {{else}}disabled {{end}}button' style="border-radius: .28571429rem;"> | |||||
{{$.i18n.Tr "repo.delete"}} | {{$.i18n.Tr "repo.delete"}} | ||||
</a> | </a> | ||||
{{else}} | {{else}} | ||||
<a class="ui basic button disabled" onclick="assertDelete(this)" style="border-radius: .28571429rem;"> | |||||
<a class="ui basic button disabled" style="border-radius: .28571429rem;"> | |||||
{{$.i18n.Tr "repo.delete"}} | {{$.i18n.Tr "repo.delete"}} | ||||
</a> | </a> | ||||
{{end}} | {{end}} | ||||
</form> | </form> | ||||
</div> | </div> | ||||
@@ -220,169 +214,3 @@ | |||||
</div> | </div> | ||||
{{template "base/footer" .}} | {{template "base/footer" .}} | ||||
<script> | |||||
console.log({{.Tasks}}) | |||||
// 调试和评分新开窗口 | |||||
function stop(obj) { | |||||
if (obj.style.color != "rgb(204, 204, 204)") { | |||||
obj.target = '_blank' | |||||
} else { | |||||
return | |||||
} | |||||
} | |||||
// 删除时用户确认 | |||||
function assertDelete(obj) { | |||||
if (obj.style.color == "rgb(204, 204, 204)") { | |||||
return | |||||
} else { | |||||
var delId = obj.parentNode.id | |||||
flag = 1; | |||||
$('.ui.basic.modal') | |||||
.modal({ | |||||
onDeny: function() { | |||||
flag = false | |||||
}, | |||||
onApprove: function() { | |||||
document.getElementById(delId).submit() | |||||
flag = true | |||||
}, | |||||
onHidden: function() { | |||||
if (flag == false) { | |||||
$('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut(); | |||||
} | |||||
} | |||||
}) | |||||
.modal('show') | |||||
} | |||||
} | |||||
function runtime(time){ | |||||
if(time){ | |||||
let hours = time/3600000<10 ? "0"+parseInt(time/3600000):parseInt(time/3600000) | |||||
let miuns = time%3600000/60000<10 ? "0"+parseInt(time%3600000/60000):parseInt(time%3600000/60000) | |||||
let seconds = time%60000/1000<10 ? "0"+parseInt(time%60000/1000):parseInt(time%60000/1000) | |||||
return hours + ":" + miuns + ":" + seconds | |||||
}else{ | |||||
return "00:00:00" | |||||
} | |||||
} | |||||
// 加载任务状态 | |||||
var timeid = window.setInterval(loadJobStatus, 15000); | |||||
$(document).ready(loadJobStatus); | |||||
function loadJobStatus() { | |||||
$(".job-status").each((index, job) => { | |||||
const jobName = job.dataset.jobname; | |||||
const repoPath = job.dataset.repopath; | |||||
const computeResource = job.dataset.resource | |||||
const initArray = ['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED'] | |||||
if (initArray.includes(job.textContent.trim())) { | |||||
return | |||||
} | |||||
const diffResource = computeResource == "NPU" ? 'modelarts/notebook' : 'cloudbrain' | |||||
const diffApi = computeResource == "NPU" ? jobID : jobName | |||||
$.get(`/api/v1/repos/${repoPath}/${diffResource}/${diffApi}`, (data) => { | |||||
const jobID = data.JobID | |||||
const jobName = data.JobName | |||||
const status = data.JobStatus | |||||
if (status != job.textContent.trim()) { | |||||
$('#' + jobName+'-icon').removeClass().addClass(status) | |||||
$('#' + jobName+ '-text').text(status) | |||||
} | |||||
if(status==="RUNNING"){ | |||||
$('#model-debug-'+jobName).removeClass('disabled').addClass('blue').text('调试').css("margin","0 1rem") | |||||
$('#model-image-'+jobName).removeClass('disabled').addClass('blue') | |||||
} | |||||
if(status!=="RUNNING"){ | |||||
// $('#model-debug-'+jobID).removeClass('blue') | |||||
// $('#model-debug-'+jobID).addClass('disabled') | |||||
$('#model-image-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(["CREATING","STOPPING","WAITING","STARTING"].includes(status)){ | |||||
$('#model-debug-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED'].includes(status)){ | |||||
$('#model-debug-'+jobName).removeClass('disabled').addClass('blue').text('再次调试').css("margin","0") | |||||
} | |||||
if(["RUNNING","WAITING"].includes(status)){ | |||||
$('#stop-model-debug-'+jobName).removeClass('disabled').addClass('blue') | |||||
} | |||||
if(["CREATING","STOPPING","STARTING","STOPPED","FAILED","START_FAILED","SUCCEEDED"].includes(status)){ | |||||
$('#stop-model-debug-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(status==="STOPPED" || status==="FAILED"|| status==="START_FAILED"){ | |||||
$('#model-delete-'+jobName).removeClass('disabled').addClass('blue') | |||||
}else{ | |||||
$('#model-delete-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
}); | |||||
}; | |||||
// 获取弹窗 | |||||
var modal = document.getElementById('imageModal'); | |||||
// 打开弹窗的按钮对象 | |||||
var btns = document.getElementsByClassName("imageBtn"); | |||||
// 获取 <span> 元素,用于关闭弹窗 | |||||
var spans = document.getElementsByClassName('close'); | |||||
// 点击按钮打开弹窗 | |||||
for (i = 0; i < btns.length; i++) { | |||||
btns[i].onclick = function() { | |||||
modal.style.display = "block"; | |||||
} | |||||
} | |||||
// 点击 <span> (x), 关闭弹窗 | |||||
for (i = 0; i < spans.length; i++) { | |||||
spans[i].onclick = function() { | |||||
modal.style.display = "none"; | |||||
} | |||||
} | |||||
// 在用户点击其他地方时,关闭弹窗 | |||||
window.onclick = function(event) { | |||||
if (event.target == modal) { | |||||
modal.style.display = "none"; | |||||
} | |||||
} | |||||
function stopDebug(JobID,stopUrl){ | |||||
$.ajax({ | |||||
type:"POST", | |||||
url:stopUrl, | |||||
data:$('#stopForm-'+JobID).serialize(), | |||||
success:function(res){ | |||||
if(res.result_code==="0"){ | |||||
$('#' + JobID+'-icon').removeClass().addClass(res.status) | |||||
$('#' + JobID+ '-text').text(res.status) | |||||
if(res.status==="STOPPED"){ | |||||
$('#model-debug-'+JobID).removeClass('disabled').addClass('blue').text("再次调试").css("margin","0") | |||||
$('#model-image-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#stop-model-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#model-delete-'+JobID).removeClass('disabled').addClass('blue') | |||||
} | |||||
else{ | |||||
$('#model-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#stop-model-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
} | |||||
}else{ | |||||
$('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); | |||||
} | |||||
}, | |||||
error :function(res){ | |||||
console.log(res) | |||||
} | |||||
}) | |||||
} | |||||
</script> |
@@ -189,7 +189,6 @@ | |||||
let type_id = $('#benchmark_types_id').val(); | let type_id = $('#benchmark_types_id').val(); | ||||
let child_selected_id = $('#benchmark_child_types_id_hidden').val(); | let child_selected_id = $('#benchmark_child_types_id_hidden').val(); | ||||
$.get(`${repolink}/cloudbrain/benchmark/get_child_types?benchmark_type_id=${type_id}`, (data) => { | $.get(`${repolink}/cloudbrain/benchmark/get_child_types?benchmark_type_id=${type_id}`, (data) => { | ||||
console.log(JSON.stringify(data)) | |||||
const n_length = data['child_types'].length | const n_length = data['child_types'].length | ||||
let html='' | let html='' | ||||
for (let i=0;i<n_length;i++){ | for (let i=0;i<n_length;i++){ | ||||
@@ -94,7 +94,6 @@ $(document).ready(function(){ | |||||
$('#course_label_item').empty() | $('#course_label_item').empty() | ||||
}else{ | }else{ | ||||
$.get(`/api/v1/topics/search?q=${query}`,(data)=>{ | $.get(`/api/v1/topics/search?q=${query}`,(data)=>{ | ||||
console.log(data) | |||||
if(data.topics.length!==0){ | if(data.topics.length!==0){ | ||||
let html='' | let html='' | ||||
$('#course_label_item').empty() | $('#course_label_item').empty() | ||||
@@ -107,5 +106,4 @@ $(document).ready(function(){ | |||||
} | } | ||||
}); | }); | ||||
}) | }) | ||||
console.log() | |||||
</script> | </script> |
@@ -293,7 +293,7 @@ | |||||
</div> | </div> | ||||
<div class="two wide column text center"> | <div class="two wide column text center"> | ||||
<!--任务状态 --> | <!--任务状态 --> | ||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}" data-resource="{{.ComputeResource}}" data-jobname="{{.JobName}}"> | |||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}" data-jobid="{{.JobID}}" data-resource="{{.ComputeResource}}"> | |||||
<span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | <span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | ||||
</span> | </span> | ||||
</div> | </div> | ||||
@@ -324,11 +324,11 @@ | |||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDebug}} | {{if .CanDebug}} | ||||
{{if eq .Status "RUNNING" "WAITING" "CREATING" "STARTING"}} | {{if eq .Status "RUNNING" "WAITING" "CREATING" "STARTING"}} | ||||
<a style="margin: 0 1rem;" id="model-debug-{{.JobID}}" class='ui basic {{if eq .Status "CREATING" "STOPPING" "WAITING" "STARTING"}}disabled {{else}}blue {{end}}button' onclick='debugAgain("{{.JobID}}","{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}/")'> | |||||
<a style="margin: 0 1rem;" id="ai-debug-{{.JobID}}" class='ui basic ai_debug {{if eq .Status "CREATING" "STOPPING" "WAITING" "STARTING"}}disabled {{else}}blue {{end}}button' data-jobid="{{.JobID}}" data-repopath='{{$.RepoLink}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.JobID}}/'> | |||||
{{$.i18n.Tr "repo.debug"}} | {{$.i18n.Tr "repo.debug"}} | ||||
</a> | </a> | ||||
{{else}} | {{else}} | ||||
<a id="model-debug-{{.JobID}}" class='ui basic {{if eq .Status "CREATING" "STOPPING" "WAITING" "STARTING"}} disabled {{else}}blue {{end}}button' onclick='debugAgain("{{.JobID}}","{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}/")'> | |||||
<a id="ai-debug-{{.JobID}}" class='ui basic ai_debug {{if eq .Status "CREATING" "STOPPING" "WAITING" "STARTING"}} disabled {{else}}blue {{end}}button' data-jobid="{{.JobID}}" data-repopath='{{$.RepoLink}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.JobID}}/'> | |||||
{{$.i18n.Tr "repo.debug_again"}} | {{$.i18n.Tr "repo.debug_again"}} | ||||
</a> | </a> | ||||
{{end}} | {{end}} | ||||
@@ -349,15 +349,9 @@ | |||||
<form id="stopForm-{{.JobID}}" style="margin-left:-1px;"> | <form id="stopForm-{{.JobID}}" style="margin-left:-1px;"> | ||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDel}} | {{if .CanDel}} | ||||
{{if eq .ComputeResource "CPU/GPU" }} | |||||
<a id="stop-model-debug-{{.JobID}}" class='ui basic {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED"}}disabled {{else}}blue {{end}}button' onclick='stopDebug("{{.JobID}}","{{$.RepoLink}}/cloudbrain/{{.JobID}}/stop")'> | |||||
{{$.i18n.Tr "repo.stop"}} | |||||
</a> | |||||
{{else}} | |||||
<a id="stop-model-debug-{{.JobID}}" class='ui basic {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED"}}disabled {{else}}blue {{end}}button' onclick='stopDebug("{{.JobID}}","{{$.RepoLink}}/modelarts/notebook/{{.JobID}}/stop")'> | |||||
{{$.i18n.Tr "repo.stop"}} | |||||
</a> | |||||
{{end}} | |||||
<a id="ai-stop-{{.JobID}}" class='ui basic ai_stop {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED"}}disabled {{else}}blue {{end}}button' data-repopath="{{$.RepoLink}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.JobID}}/stop" data-jobid="{{.JobID}}"> | |||||
{{$.i18n.Tr "repo.stop"}} | |||||
</a> | |||||
{{else}} | {{else}} | ||||
<a class="ui basic disabled button"> | <a class="ui basic disabled button"> | ||||
{{$.i18n.Tr "repo.stop"}} | {{$.i18n.Tr "repo.stop"}} | ||||
@@ -369,19 +363,16 @@ | |||||
<input type="hidden" name="debugListType" value="{{$.ListType}}"> | <input type="hidden" name="debugListType" value="{{$.ListType}}"> | ||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDel}} | {{if .CanDel}} | ||||
<a id="model-delete-{{.JobID}}" class='ui basic {{if eq .Status "STOPPED" "FAILED" "START_FAILED"}}blue {{else}}disabled {{end}}button' onclick="assertDelete(this)" style="border-radius: .28571429rem;"> | |||||
<a id="ai-delete-{{.JobID}}" class='ui basic ai_delete {{if eq .Status "STOPPED" "FAILED" "START_FAILED"}}blue {{else}}disabled {{end}}button' style="border-radius: .28571429rem;"> | |||||
{{$.i18n.Tr "repo.delete"}} | {{$.i18n.Tr "repo.delete"}} | ||||
</a> | </a> | ||||
{{else}} | {{else}} | ||||
<a class="ui basic button disabled" onclick="assertDelete(this)" style="border-radius: .28571429rem;"> | |||||
{{$.i18n.Tr "repo.delete"}} | |||||
<a class="ui basic button disabled" style="border-radius: .28571429rem;"> | |||||
{{$.i18n.Tr "repo.delete"}} | |||||
</a> | </a> | ||||
{{end}} | {{end}} | ||||
</form> | </form> | ||||
</div> | |||||
<!-- 删除任务 --> | |||||
</div> | |||||
<div class="ui compact buttons" style="{{if eq .ComputeResource "CPU/GPU"}} visibility: visible {{else}} visibility: hidden{{end}}"> | <div class="ui compact buttons" style="{{if eq .ComputeResource "CPU/GPU"}} visibility: visible {{else}} visibility: hidden{{end}}"> | ||||
<div class="ui dropdown" id="model_more" style="padding: .58928571em 1.125em .58928571em;"> | <div class="ui dropdown" id="model_more" style="padding: .58928571em 1.125em .58928571em;"> | ||||
<div class="text">更多</div> | <div class="text">更多</div> | ||||
@@ -411,7 +402,6 @@ | |||||
</a> | </a> | ||||
</div> | </div> | ||||
{{end}} | {{end}} | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
@@ -487,7 +477,6 @@ | |||||
</div> | </div> | ||||
{{template "base/footer" .}} | {{template "base/footer" .}} | ||||
<script> | <script> | ||||
// 调试和评分新开窗口 | // 调试和评分新开窗口 | ||||
const {AppSubUrl, StaticUrlPrefix, csrf} = window.config; | const {AppSubUrl, StaticUrlPrefix, csrf} = window.config; | ||||
@@ -506,155 +495,6 @@ | |||||
} | } | ||||
return(false); | return(false); | ||||
} | } | ||||
function stop(obj) { | |||||
if (obj.style.color != "rgb(204, 204, 204)") { | |||||
obj.target = '_blank' | |||||
} else { | |||||
return | |||||
} | |||||
} | |||||
// 删除时用户确认 | |||||
function assertDelete(obj) { | |||||
if (obj.style.color == "rgb(204, 204, 204)") { | |||||
return | |||||
} else { | |||||
var delId = obj.parentNode.id | |||||
flag = 1; | |||||
$('.ui.basic.modal') | |||||
.modal({ | |||||
onDeny: function() { | |||||
flag = false | |||||
}, | |||||
onApprove: function() { | |||||
document.getElementById(delId).submit() | |||||
flag = true | |||||
$('.alert').html('操作成功!').removeClass('alert-danger').addClass('alert-success').show().delay(1500).fadeOut(); | |||||
}, | |||||
onHidden: function() { | |||||
if (flag == false) { | |||||
$('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut(); | |||||
} | |||||
} | |||||
}) | |||||
.modal('show') | |||||
} | |||||
} | |||||
function debugAgain(JobID,debugUrl){ | |||||
if($('#' + JobID+ '-text').text()==="RUNNING"){ | |||||
window.open(debugUrl+'debug') | |||||
}else{ | |||||
$.ajax({ | |||||
type:"POST", | |||||
url:debugUrl+'restart', | |||||
data:$('#debugAgainForm-'+JobID).serialize(), | |||||
success:function(res){ | |||||
if(res.result_code==="0"){ | |||||
if(res.job_id!==JobID){ | |||||
location.reload() | |||||
}else{ | |||||
$('#' + JobID+'-icon').removeClass().addClass(res.status) | |||||
$('#' + JobID+ '-text').text(res.status) | |||||
$('#model-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#model-delete-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#model-debug-'+JobID).text("调试").css("margin","0 1rem") | |||||
} | |||||
}else{ | |||||
$('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); | |||||
} | |||||
}, | |||||
error :function(res){ | |||||
console.log(res) | |||||
} | |||||
}) | |||||
} | |||||
} | |||||
function stopDebug(JobID,stopUrl){ | |||||
$.ajax({ | |||||
type:"POST", | |||||
url:stopUrl, | |||||
data:$('#stopForm-'+JobID).serialize(), | |||||
success:function(res){ | |||||
if(res.result_code==="0"){ | |||||
$('#' + JobID+'-icon').removeClass().addClass(res.status) | |||||
$('#' + JobID+ '-text').text(res.status) | |||||
if(res.status==="STOPPED"){ | |||||
$('#model-debug-'+JobID).removeClass('disabled').addClass('blue').text("再次调试").css("margin","0") | |||||
$('#model-image-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#stop-model-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#model-delete-'+JobID).removeClass('disabled').addClass('blue') | |||||
} | |||||
else{ | |||||
$('#model-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#stop-model-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
} | |||||
}else{ | |||||
$('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); | |||||
} | |||||
}, | |||||
error :function(res){ | |||||
console.log(res) | |||||
} | |||||
}) | |||||
} | |||||
// 加载任务状态 | |||||
var timeid = window.setInterval(loadJobStatus, 15000); | |||||
$(document).ready(loadJobStatus); | |||||
function loadJobStatus() { | |||||
$(".job-status").each((index, job) => { | |||||
const jobID = job.dataset.jobid; | |||||
const jobName = job.dataset.jobname; | |||||
const repoPath = job.dataset.repopath; | |||||
const computeResource = job.dataset.resource | |||||
const initArray = ['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED','UNAVAILABLE','DELETED','RESIZE_FAILED'] | |||||
if (initArray.includes(job.textContent.trim())) { | |||||
return | |||||
} | |||||
const diffResource = computeResource == "NPU" ? 'modelarts/notebook' : 'cloudbrain' | |||||
const diffApi = computeResource == "NPU" ? jobID : jobName | |||||
$.get(`/api/v1/repos/${repoPath}/${diffResource}/${diffApi}`, (data) => { | |||||
const jobName = data.JobName | |||||
const status = data.JobStatus | |||||
if (status != job.textContent.trim()) { | |||||
$('#' + jobName+'-icon').removeClass().addClass(status) | |||||
$('#' + jobName+ '-text').text(status) | |||||
} | |||||
if(status==="RUNNING"){ | |||||
$('#model-debug-'+jobName).removeClass('disabled').addClass('blue').text('调试').css("margin","0 1rem") | |||||
$('#model-image-'+jobName).removeClass('disabled').addClass('blue') | |||||
} | |||||
if(status!=="RUNNING"){ | |||||
// $('#model-debug-'+jobID).removeClass('blue') | |||||
// $('#model-debug-'+jobID).addClass('disabled') | |||||
$('#model-image-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(["CREATING","STOPPING","WAITING","STARTING"].includes(status)){ | |||||
$('#model-debug-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED'].includes(status)){ | |||||
$('#model-debug-'+jobName).removeClass('disabled').addClass('blue').text('再次调试').css("margin","0") | |||||
} | |||||
if(["RUNNING","WAITING"].includes(status)){ | |||||
$('#stop-model-debug-'+jobName).removeClass('disabled').addClass('blue') | |||||
} | |||||
if(["CREATING","STOPPING","STARTING","STOPPED","FAILED","START_FAILED","SUCCEEDED"].includes(status)){ | |||||
$('#stop-model-debug-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(status==="STOPPED" || status==="FAILED"|| status==="START_FAILED"){ | |||||
$('#model-delete-'+jobName).removeClass('disabled').addClass('blue') | |||||
}else{ | |||||
$('#model-delete-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
}); | |||||
}; | |||||
$(document).ready(function(){ | $(document).ready(function(){ | ||||
dropdownValue = dropdownValue==="CPU%2FGPU"? 'CPU/GPU' : dropdownValue | dropdownValue = dropdownValue==="CPU%2FGPU"? 'CPU/GPU' : dropdownValue | ||||
$('.default.text').text(dropdownValue) | $('.default.text').text(dropdownValue) | ||||
@@ -674,9 +514,6 @@ | |||||
.transition('fade') | .transition('fade') | ||||
}) | }) | ||||
}) | }) | ||||
// 获取弹窗 | // 获取弹窗 | ||||
var modal = document.getElementById('imageModal'); | var modal = document.getElementById('imageModal'); | ||||
@@ -706,7 +543,6 @@ | |||||
modal.style.display = "none"; | modal.style.display = "none"; | ||||
} | } | ||||
} | } | ||||
// 显示弹窗,弹出相应的信息 | // 显示弹窗,弹出相应的信息 | ||||
function showmask() { | function showmask() { | ||||
var image_tag = !$('#image_tag').val() | var image_tag = !$('#image_tag').val() | ||||
@@ -113,11 +113,11 @@ | |||||
<!-- 模型版本 --> | <!-- 模型版本 --> | ||||
<!-- href="{{$.RepoLink}}/modelmanage/show_model_info?name={{.ModelName}}" --> | <!-- href="{{$.RepoLink}}/modelmanage/show_model_info?name={{.ModelName}}" --> | ||||
<div class="three wide column text center padding0"> | <div class="three wide column text center padding0"> | ||||
<a id="{{.JobName}}" href="javascript:void(0);" data-variation="inverted" data-position="top center" data-content="{{$.i18n.Tr "repo.modelarts.infer_job.tooltip"}}" onclick="getModelInfo({{.ModelName}},{{.ModelVersion}},{{.JobName}})">{{.ModelName}} </a> <span style="font-size: 12px;">{{.ModelVersion}} </span> | |||||
<a id="{{.JobName}}" class="goto_modelmanage" href="javascript:void(0);" data-variation="inverted" data-position="top center" data-content="{{$.i18n.Tr "repo.modelarts.infer_job.tooltip"}}" data-jobname={{.JobName}} data-modelname={{.ModelName}} data-version={{.ModelVersion}} data-repopath="{{$.RepoLink}}">{{.ModelName}} </a> <span style="font-size: 12px;">{{.ModelVersion}}</span> | |||||
</div> | </div> | ||||
<!-- 任务状态 --> | <!-- 任务状态 --> | ||||
<div class="two wide column text center padding0" > | <div class="two wide column text center padding0" > | ||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}/modelarts/inference-job" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
<span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | <span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | ||||
</span> | </span> | ||||
</div> | </div> | ||||
@@ -147,11 +147,11 @@ | |||||
<div class="ui compact buttons"> | <div class="ui compact buttons"> | ||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDel}} | {{if .CanDel}} | ||||
<a style="padding: 0.5rem 1rem;" id="{{.JobID}}-stop" class="ui basic {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{else}} blue {{end}}button" onclick="stopVersion({{.VersionName}},{{.JobID}})"> | |||||
<a style="padding: 0.5rem 1rem;" id="ai-stop-{{.JobID}}" class="ui basic ai_stop_version {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{else}} blue {{end}}button" data-repopath="{{$.RepoRelPath}}/modelarts/inference-job" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
{{$.i18n.Tr "repo.stop"}} | {{$.i18n.Tr "repo.stop"}} | ||||
</a> | </a> | ||||
{{else}} | {{else}} | ||||
<a style="padding: 0.5rem 1rem;" id="{{.JobID}}-stop" class="ui basic disabled button"> | |||||
<a style="padding: 0.5rem 1rem;" id="ai-stop-{{.JobID}}" class="ui basic disabled button"> | |||||
{{$.i18n.Tr "repo.stop"}} | {{$.i18n.Tr "repo.stop"}} | ||||
</a> | </a> | ||||
{{end}} | {{end}} | ||||
@@ -174,7 +174,7 @@ | |||||
<div class="ui compact buttons"> | <div class="ui compact buttons"> | ||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDel}} | {{if .CanDel}} | ||||
<a style="padding: 0.5rem 1rem;margin-left:0.2rem" id="model-delete-{{.JobID}}" class="ui basic blue button" onclick="assertDelete(this,{{.VersionName}},{{.JobID}})" style="border-radius: .28571429rem;"> | |||||
<a style="padding: 0.5rem 1rem;margin-left:0.2rem" id="model-delete-{{.JobID}}" class="ui basic ai_delete blue button" data-repopath="{{$.RepoRelPath}}/modelarts/inference-job/{{.JobID}}/del_version" data-version="{{.VersionName}}" style="border-radius: .28571429rem;"> | |||||
{{$.i18n.Tr "repo.delete"}} | {{$.i18n.Tr "repo.delete"}} | ||||
</a> | </a> | ||||
{{else}} | {{else}} | ||||
@@ -221,118 +221,6 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
{{template "base/footer" .}} | {{template "base/footer" .}} | ||||
<script> | |||||
// 加载任务状态 | |||||
var timeid = window.setInterval(loadJobStatus, 15000); | |||||
$(document).ready(loadJobStatus); | |||||
function loadJobStatus() { | |||||
$(".job-status").each((index, job) => { | |||||
const jobID = job.dataset.jobid | |||||
const repoPath = job.dataset.repopath | |||||
const versionname = job.dataset.version | |||||
const status_text = $(`#${jobID}-text`).text() | |||||
const finalState = ['IMAGE_FAILED','SUBMIT_FAILED','DELETE_FAILED','KILLED','COMPLETED','FAILED','CANCELED','LOST','START_FAILED','SUBMIT_MODEL_FAILED','DEPLOY_SERVICE_FAILED','CHECK_FAILED'] | |||||
if(finalState.includes(status_text)){ | |||||
return | |||||
} | |||||
$.get(`/api/v1/repos/${repoPath}/modelarts/inference-job/${jobID}?version_name=${versionname}`, (data) => { | |||||
const jobID = data.JobID | |||||
const status = data.JobStatus | |||||
const duration = data.JobDuration | |||||
$('#duration-'+jobID).text(duration) | |||||
if (status != job.textContent.trim()) { | |||||
$('#' + jobID+'-icon').removeClass().addClass(status) | |||||
$('#' + jobID+ '-text').text(status) | |||||
finalState.includes(status) && $('#' + jobID + '-stop').removeClass('blue').addClass('disabled') | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
}); | |||||
}; | |||||
function getModelInfo(ID,version,JobName){ | |||||
$.get("{{$.RepoLink}}/modelmanage/show_model_info_api?name="+ID,(data)=>{ | |||||
if(data.length===0){ | |||||
$(`#${JobName}`).popup('toggle') | |||||
}else{ | |||||
let versionData = data.filter((item)=>{ | |||||
return item.Version === version | |||||
}) | |||||
if(versionData.length==0){ | |||||
$(`#${JobName}`).popup('toggle') | |||||
} | |||||
else{ | |||||
location.href = "{{$.RepoLink}}/modelmanage/show_model_info?name="+ID | |||||
} | |||||
} | |||||
}) | |||||
} | |||||
function deleteVersion(version_name,jobID){ | |||||
const url = '/api/v1/repos/{{$.RepoRelPath}}/modelarts/inference-job/'+jobID+'/del_version' | |||||
$.post(url,{version_name:version_name},(data)=>{ | |||||
if(data.StatusOK===0){ | |||||
location.reload() | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
} | |||||
function stopVersion(version_name,jobID){ | |||||
const url = '/api/v1/repos/{{$.RepoRelPath}}/modelarts/inference-job/'+jobID+'/stop_version' | |||||
$.post(url,{version_name:version_name},(data)=>{ | |||||
if(data.StatusOK===0){ | |||||
$('#'+version_name+'-stop').removeClass('blue') | |||||
$('#'+version_name+'-stop').addClass('disabled') | |||||
refreshStatus(version_name,jobID) | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
} | |||||
function refreshStatus(version_name,jobID){ | |||||
const url = '/api/v1/repos/{{$.RepoRelPath}}/modelarts/inference-job/'+jobID+'?version_name='+version_name | |||||
$.get(url,(data)=>{ | |||||
$(`#${jobID}-icon`).attr("class",data.JobStatus) | |||||
// detail status and duration | |||||
$(`#${jobID}-text`).text(data.JobStatus) | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
} | |||||
function assertDelete(obj,version_name,jobID) { | |||||
if (obj.style.color == "rgb(204, 204, 204)") { | |||||
return | |||||
} else { | |||||
// var delId = obj.parentNode.id | |||||
flag = 1; | |||||
$('.ui.basic.modal') | |||||
.modal({ | |||||
onDeny: function() { | |||||
flag = false | |||||
}, | |||||
onApprove: function() { | |||||
// document.getElementById(delId).submit() | |||||
deleteVersion(version_name,jobID) | |||||
flag = true | |||||
}, | |||||
onHidden: function() { | |||||
if (flag == false) { | |||||
$('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut(); | |||||
} | |||||
} | |||||
}) | |||||
.modal('show') | |||||
} | |||||
} | |||||
</script> |
@@ -113,7 +113,7 @@ | |||||
</div> | </div> | ||||
<!-- 任务状态 --> | <!-- 任务状态 --> | ||||
<div class="two wide column padding0" style="padding-left: 2.2rem !important;"> | <div class="two wide column padding0" style="padding-left: 2.2rem !important;"> | ||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}/modelarts/train-job" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
<span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | <span><i id="{{.JobID}}-icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="{{.JobID}}-text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | ||||
</span> | </span> | ||||
</div> | </div> | ||||
@@ -143,11 +143,11 @@ | |||||
<div class="ui compact buttons"> | <div class="ui compact buttons"> | ||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDel}} | {{if .CanDel}} | ||||
<a style="padding: 0.5rem 1rem;" id="{{.JobID}}-stop" class="ui basic {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{else}} blue {{end}}button" onclick="stopVersion({{.VersionName}},{{.JobID}})"> | |||||
<a style="padding: 0.5rem 1rem;" id="ai-stop-{{.JobID}}" class="ui basic ai_stop_version {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{else}} blue {{end}}button" data-repopath="{{$.RepoRelPath}}/modelarts/train-job" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
{{$.i18n.Tr "repo.stop"}} | {{$.i18n.Tr "repo.stop"}} | ||||
</a> | </a> | ||||
{{else}} | {{else}} | ||||
<a style="padding: 0.5rem 1rem;" id="{{.JobID}}-stop" class="ui basic disabled button"> | |||||
<a style="padding: 0.5rem 1rem;" id="ai-stop-{{.JobID}}" class="ui basic disabled button"> | |||||
{{$.i18n.Tr "repo.stop"}} | {{$.i18n.Tr "repo.stop"}} | ||||
</a> | </a> | ||||
{{end}} | {{end}} | ||||
@@ -157,7 +157,7 @@ | |||||
<form class="ui compact buttons" id="delForm-{{.JobID}}" action="{{$.Link}}/{{.JobID}}/del" method="post"> | <form class="ui compact buttons" id="delForm-{{.JobID}}" action="{{$.Link}}/{{.JobID}}/del" method="post"> | ||||
{{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
{{if .CanDel}} | {{if .CanDel}} | ||||
<a style="padding: 0.5rem 1rem;margin-left:0.2rem" id="model-delete-{{.JobID}}" class="ui basic blue button" onclick="assertDelete(this)" style="border-radius: .28571429rem;"> | |||||
<a style="padding: 0.5rem 1rem;margin-left:0.2rem" id="model-delete-{{.JobID}}" class="ui basic ai_delete blue button" style="border-radius: .28571429rem;"> | |||||
{{$.i18n.Tr "repo.delete"}} | {{$.i18n.Tr "repo.delete"}} | ||||
</a> | </a> | ||||
{{else}} | {{else}} | ||||
@@ -204,162 +204,5 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
{{template "base/footer" .}} | |||||
<script> | |||||
console.log({{.Tasks}}) | |||||
// 调试和评分新开窗口 | |||||
function stop(obj) { | |||||
if (obj.style.color != "rgb(204, 204, 204)") { | |||||
obj.target = '_blank' | |||||
} else { | |||||
return | |||||
} | |||||
} | |||||
// 删除时用户确认 | |||||
function assertDelete(obj) { | |||||
if (obj.style.color == "rgb(204, 204, 204)") { | |||||
return | |||||
} else { | |||||
var delId = obj.parentNode.id | |||||
flag = 1; | |||||
$('.ui.basic.modal') | |||||
.modal({ | |||||
onDeny: function() { | |||||
flag = false | |||||
}, | |||||
onApprove: function() { | |||||
document.getElementById(delId).submit() | |||||
flag = true | |||||
}, | |||||
onHidden: function() { | |||||
if (flag == false) { | |||||
$('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut(); | |||||
} | |||||
} | |||||
}) | |||||
.modal('show') | |||||
} | |||||
} | |||||
function runtime(time){ | |||||
if(time){ | |||||
let hours = time/3600000<10 ? "0"+parseInt(time/3600000):parseInt(time/3600000) | |||||
let miuns = time%3600000/60000<10 ? "0"+parseInt(time%3600000/60000):parseInt(time%3600000/60000) | |||||
let seconds = time%60000/1000<10 ? "0"+parseInt(time%60000/1000):parseInt(time%60000/1000) | |||||
return hours + ":" + miuns + ":" + seconds | |||||
}else{ | |||||
return "00:00:00" | |||||
} | |||||
} | |||||
// 加载任务状态 | |||||
var timeid = window.setInterval(loadJobStatus, 15000); | |||||
$(document).ready(loadJobStatus); | |||||
function loadJobStatus() { | |||||
$(".job-status").each((index, job) => { | |||||
const jobID = job.dataset.jobid | |||||
const repoPath = job.dataset.repopath | |||||
const versionname = job.dataset.version | |||||
const status_text = $(`#${jobID}-text`).text() | |||||
const finalState = ['IMAGE_FAILED','SUBMIT_FAILED','DELETE_FAILED','KILLED','COMPLETED','FAILED','CANCELED','LOST','START_FAILED','SUBMIT_MODEL_FAILED','DEPLOY_SERVICE_FAILED','CHECK_FAILED'] | |||||
if(finalState.includes(status_text)){ | |||||
return | |||||
} | |||||
$.get(`/api/v1/repos/${repoPath}/modelarts/train-job/${jobID}?version_name=${versionname}`, (data) => { | |||||
const jobID = data.JobID | |||||
const status = data.JobStatus | |||||
const duration = data.JobDuration | |||||
$('#duration-'+jobID).text(duration) | |||||
if (status != job.textContent.trim()) { | |||||
$('#' + jobID+'-icon').removeClass().addClass(status) | |||||
$('#' + jobID+ '-text').text(status) | |||||
finalState.includes(status) && $('#' + jobID + '-stop').removeClass('blue').addClass('disabled') | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
}); | |||||
}; | |||||
// 获取弹窗 | |||||
var modal = document.getElementById('imageModal'); | |||||
// 打开弹窗的按钮对象 | |||||
var btns = document.getElementsByClassName("imageBtn"); | |||||
// 获取 <span> 元素,用于关闭弹窗 | |||||
var spans = document.getElementsByClassName('close'); | |||||
// 点击按钮打开弹窗 | |||||
for (i = 0; i < btns.length; i++) { | |||||
btns[i].onclick = function() { | |||||
modal.style.display = "block"; | |||||
} | |||||
} | |||||
// 点击 <span> (x), 关闭弹窗 | |||||
for (i = 0; i < spans.length; i++) { | |||||
spans[i].onclick = function() { | |||||
modal.style.display = "none"; | |||||
} | |||||
} | |||||
// 在用户点击其他地方时,关闭弹窗 | |||||
window.onclick = function(event) { | |||||
if (event.target == modal) { | |||||
modal.style.display = "none"; | |||||
} | |||||
} | |||||
function stopVersion(version_name,jobID){ | |||||
const url = '/api/v1/repos/{{$.RepoRelPath}}/modelarts/train-job/'+jobID+'/stop_version' | |||||
$.post(url,{version_name:version_name},(data)=>{ | |||||
if(data.StatusOK===0){ | |||||
$('#'+version_name+'-stop').removeClass('blue') | |||||
$('#'+version_name+'-stop').addClass('disabled') | |||||
refreshStatus(version_name,jobID) | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
} | |||||
function refreshStatus(version_name,jobID){ | |||||
const url = '/api/v1/repos/{{$.RepoRelPath}}/modelarts/train-job/'+jobID+'?version_name='+version_name | |||||
$.get(url,(data)=>{ | |||||
$(`#${jobID}-icon`).attr("class",data.JobStatus) | |||||
// detail status and duration | |||||
$(`#${jobID}-text`).text(data.JobStatus) | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
} | |||||
// 显示弹窗,弹出相应的信息 | |||||
function showmask() { | |||||
$('#imageModal').css('display', 'none') | |||||
$('#mask').css('display', 'block') | |||||
$("iframe[name=iframeContent]").on("load", function() { | |||||
var responseText = $("iframe")[0].contentDocument.body.getElementsByTagName("pre")[0].innerHTML; | |||||
var json1 = JSON.parse(responseText) | |||||
$('#mask').css('display', 'none') | |||||
parent.location.href | |||||
if (json1.result_code === "0") { | |||||
$('.alert').html('操作成功!').removeClass('alert-danger').addClass('alert-success').show().delay(1500).fadeOut(); | |||||
} else { | |||||
$('.alert').html(json1.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(5000).fadeOut(); | |||||
} | |||||
}) | |||||
} | |||||
</script> | |||||
{{template "base/footer" .}} |
@@ -518,6 +518,7 @@ td, th { | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | |||||
{{template "base/footer" .}} | {{template "base/footer" .}} | ||||
<script> | <script> | ||||
@@ -186,7 +186,6 @@ | |||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb'> | <div class='ui breadcrumb model_file_bread' id='file_breadcrumb'> | ||||
<div class="active section"></div> | <div class="active section"></div> | ||||
<div class="divider"> / </div> | <div class="divider"> / </div> | ||||
</div> | </div> | ||||
<div id="dir_list"> | <div id="dir_list"> | ||||
@@ -52,6 +52,4 @@ | |||||
</div> | </div> | ||||
<script> | |||||
console.log({{$.Err_Alias}}) | |||||
</script> | |||||
@@ -208,6 +208,3 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
{{template "base/footer" .}} | {{template "base/footer" .}} | ||||
<script> | |||||
console.log({{.Issues}}) | |||||
</script> |
@@ -117,6 +117,3 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
{{template "base/footer" .}} | {{template "base/footer" .}} | ||||
<script> | |||||
console.log({{.Milestones}}) | |||||
</script> |
@@ -141,6 +141,7 @@ | |||||
{{if eq .TabName "activity"}} | {{if eq .TabName "activity"}} | ||||
{{if .EnableHeatmap}} | {{if .EnableHeatmap}} | ||||
<div id="user-heatmap" style="padding-right: 40px"> | <div id="user-heatmap" style="padding-right: 40px"> | ||||
<activity-heatmap :locale="locale" :suburl="suburl" :user="heatmapUser"> | <activity-heatmap :locale="locale" :suburl="suburl" :user="heatmapUser"> | ||||
<div slot="loading"> | <div slot="loading"> | ||||
@@ -310,7 +310,6 @@ export default { | |||||
}, | }, | ||||
handleCurrentChange(val){ | handleCurrentChange(val){ | ||||
console.log(val) | |||||
this.params.page = val | this.params.page = val | ||||
this.getImageList() | this.getImageList() | ||||
@@ -350,7 +349,6 @@ export default { | |||||
}) | }) | ||||
}, | }, | ||||
copyUrl(url){ | copyUrl(url){ | ||||
console.log(url) | |||||
const cInput = document.createElement('input') | const cInput = document.createElement('input') | ||||
cInput.value = url | cInput.value = url | ||||
document.body.appendChild(cInput) | document.body.appendChild(cInput) | ||||
@@ -380,16 +378,13 @@ export default { | |||||
clearP(value){ | clearP(value){ | ||||
console.log("sorce value",value) | |||||
if(!value) return '' | if(!value) return '' | ||||
const reg = /\<\/?p\>/g; | const reg = /\<\/?p\>/g; | ||||
value = value.replace(reg,'') | value = value.replace(reg,'') | ||||
console.log("repalace:",value) | |||||
return value | return value | ||||
}, | }, | ||||
transformTimestamp(timestamp){ | transformTimestamp(timestamp){ | ||||
console.log("timestamp",timestamp) | |||||
let a = new Date(timestamp).getTime(); | let a = new Date(timestamp).getTime(); | ||||
const date = new Date(a); | const date = new Date(a); | ||||
const Y = date.getFullYear() + '-'; | const Y = date.getFullYear() + '-'; | ||||
@@ -200,7 +200,6 @@ | |||||
var saveFileName='' | var saveFileName='' | ||||
var Date=(this.params.startDate).split('-') | var Date=(this.params.startDate).split('-') | ||||
var startDate=Date[0]+''+Date[1]+''+Date[2] | var startDate=Date[0]+''+Date[1]+''+Date[2] | ||||
console.log(startDate) | |||||
Date=(this.params.endDate).split('-') | Date=(this.params.endDate).split('-') | ||||
var endDate=Date[0]+Date[1]+Date[2] | var endDate=Date[0]+Date[1]+Date[2] | ||||
saveFileName = '用户分析_'+this.search+''+startDate+'_'+endDate | saveFileName = '用户分析_'+this.search+''+startDate+'_'+endDate | ||||
@@ -258,7 +257,6 @@ | |||||
getUserList(type_val,index){ | getUserList(type_val,index){ | ||||
this.type_val = type_val | this.type_val = type_val | ||||
this.dynamic = index; | this.dynamic = index; | ||||
console.log("dj:"+type_val) | |||||
var now = new Date(); // 当前日期 | var now = new Date(); // 当前日期 | ||||
var nowDayOfWeek = now.getDay(); // 今天本周的第几天 | var nowDayOfWeek = now.getDay(); // 今天本周的第几天 | ||||
var nowDay = now.getDate(); // 当前日 | var nowDay = now.getDate(); // 当前日 | ||||
@@ -324,7 +322,6 @@ | |||||
// console.log("res.data:"+res.data.data) | // console.log("res.data:"+res.data.data) | ||||
this.totalNum = res.data.count | this.totalNum = res.data.count | ||||
console.log("res.count:"+res.data.count) | |||||
}) | }) | ||||
@@ -354,9 +351,7 @@ | |||||
}, | }, | ||||
filters:{ | filters:{ | ||||
transformTimestamp(timestamp){ | transformTimestamp(timestamp){ | ||||
console.log("timestamp",timestamp) | |||||
let a = new Date(timestamp*1000); | let a = new Date(timestamp*1000); | ||||
const date = new Date(a); | const date = new Date(a); | ||||
const Y = date.getFullYear() + '/'; | const Y = date.getFullYear() + '/'; | ||||
@@ -366,7 +361,6 @@ | |||||
const m = (date.getMinutes() <10 ? '0'+date.getMinutes() : date.getMinutes());// + ':' ; | const m = (date.getMinutes() <10 ? '0'+date.getMinutes() : date.getMinutes());// + ':' ; | ||||
// const s = (date.getSeconds() <10 ? '0'+date.getSeconds() : date.getSeconds()) ; // 秒 | // const s = (date.getSeconds() <10 ? '0'+date.getSeconds() : date.getSeconds()) ; // 秒 | ||||
const dateString = Y + M + D + h + m ;//+ s; | const dateString = Y + M + D + h + m ;//+ s; | ||||
console.log('dateString', dateString); // > dateString 2021-07-06 14:23 | |||||
return dateString; | return dateString; | ||||
}, | }, | ||||
}, | }, | ||||
@@ -100,7 +100,6 @@ export function export_table_to_excel(id) { | |||||
/* original data */ | /* original data */ | ||||
var data = oo[0]; | var data = oo[0]; | ||||
var ws_name = "SheetJS"; | var ws_name = "SheetJS"; | ||||
console.log(data); | |||||
var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); | var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); | ||||
@@ -118,7 +117,7 @@ export function export_table_to_excel(id) { | |||||
} | } | ||||
function formatJson(jsonData) { | function formatJson(jsonData) { | ||||
console.log(jsonData) | |||||
} | } | ||||
export function export_json_to_excel(th, jsonData, defaultTitle) { | export function export_json_to_excel(th, jsonData, defaultTitle) { | ||||
@@ -3,7 +3,6 @@ export function export2Excel(columns,list,filename){ | |||||
const { export_json_to_excel } = require('./Export2Excel'); | const { export_json_to_excel } = require('./Export2Excel'); | ||||
let tHeader = [] | let tHeader = [] | ||||
let filterVal = [] | let filterVal = [] | ||||
console.log(columns) | |||||
if(!columns){ | if(!columns){ | ||||
return; | return; | ||||
} | } | ||||
@@ -0,0 +1,236 @@ | |||||
export default async function initCloudrain() { | |||||
let timeid = window.setInterval(loadJobStatus, 15000); | |||||
$(document).ready(loadJobStatus); | |||||
function loadJobStatus() { | |||||
$(".job-status").each((index, job) => { | |||||
const jobID = job.dataset.jobid; | |||||
const repoPath = job.dataset.repopath; | |||||
// const computeResource = job.dataset.resource | |||||
const versionname = job.dataset.version | |||||
const status_text = $(`#${jobID}-text`).text() | |||||
console.log(versionname) | |||||
const finalState = ['STOPPED','CREATE_FAILED','UNAVAILABLE','DELETED','RESIZE_FAILED','SUCCEEDED','IMAGE_FAILED','SUBMIT_FAILED','DELETE_FAILED','KILLED','COMPLETED','FAILED','CANCELED','LOST','START_FAILED','SUBMIT_MODEL_FAILED','DEPLOY_SERVICE_FAILED','CHECK_FAILED'] | |||||
if (finalState.includes(status_text)) { | |||||
return | |||||
} | |||||
// const diffResource = computeResource == "NPU" ? 'modelarts/notebook' : 'cloudbrain' | |||||
$.get(`/api/v1/repos/${repoPath}/${jobID}?version_name=${versionname}`, (data) => { | |||||
const jobID = data.JobID | |||||
const status = data.JobStatus | |||||
const duration = data.JobDuration | |||||
$('#duration-'+jobID).text(duration) | |||||
if (status != status_text) { | |||||
$('#' + jobID+'-icon').removeClass().addClass(status) | |||||
$('#' + jobID+ '-text').text(status) | |||||
finalState.includes(status) && $('#' + jobID + '-stop').removeClass('blue').addClass('disabled') | |||||
} | |||||
if(status==="RUNNING"){ | |||||
$('#ai-debug-'+jobID).removeClass('disabled').addClass('blue').text('调试').css("margin","0 1rem") | |||||
$('#model-image-'+jobID).removeClass('disabled').addClass('blue') | |||||
} | |||||
if(status!=="RUNNING"){ | |||||
// $('#model-debug-'+jobID).removeClass('blue') | |||||
// $('#model-debug-'+jobID).addClass('disabled') | |||||
$('#model-image-'+jobID).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(["CREATING","STOPPING","WAITING","STARTING"].includes(status)){ | |||||
$('#ai-debug-'+jobID).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED'].includes(status)){ | |||||
$('#ai-debug-'+jobID).removeClass('disabled').addClass('blue').text('再次调试').css("margin","0") | |||||
} | |||||
if(["RUNNING","WAITING"].includes(status)){ | |||||
$('#ai-stop-'+jobID).removeClass('disabled').addClass('blue') | |||||
} | |||||
if(["CREATING","STOPPING","STARTING","STOPPED","FAILED","START_FAILED","SUCCEEDED"].includes(status)){ | |||||
$('#ai-stop-'+jobID).removeClass('blue').addClass('disabled') | |||||
} | |||||
if(["STOPPED","FAILED","START_FAILED","KILLED","COMPLETED","SUCCEEDED"].includes(status)){ | |||||
$('#ai-delete-'+jobID).removeClass('disabled').addClass('blue') | |||||
}else{ | |||||
$('#ai-delete-'+jobID).removeClass('blue').addClass('disabled') | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
}); | |||||
}; | |||||
function assertDelete(obj,versionName,repoPath) { | |||||
if (obj.style.color == "rgb(204, 204, 204)") { | |||||
return | |||||
} else { | |||||
const delId = obj.parentNode.id | |||||
let flag = 1; | |||||
$('.ui.basic.modal') | |||||
.modal({ | |||||
onDeny: function() { | |||||
flag = false | |||||
}, | |||||
onApprove: function() { | |||||
if(!versionName){ | |||||
document.getElementById(delId).submit() | |||||
} | |||||
else{ | |||||
deleteVersion(versionName,repoPath) | |||||
} | |||||
flag = true | |||||
}, | |||||
onHidden: function() { | |||||
if (flag == false) { | |||||
$('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut(); | |||||
} | |||||
} | |||||
}) | |||||
.modal('show') | |||||
} | |||||
} | |||||
function deleteVersion(versionName,repoPath){ | |||||
const url = `/api/v1/repos/${repoPath}` | |||||
$.post(url,{version_name:versionName},(data)=>{ | |||||
if(data.StatusOK===0){ | |||||
location.reload() | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
} | |||||
$('.ui.basic.ai_delete').click(function() { | |||||
const repoPath = this.dataset.repopath | |||||
const versionName = this.dataset.version | |||||
if(repoPath && versionName){ | |||||
assertDelete(this,versionName,repoPath) | |||||
} | |||||
else{ | |||||
assertDelete(this) | |||||
} | |||||
}) | |||||
function stopDebug(JobID,stopUrl){ | |||||
$.ajax({ | |||||
type:"POST", | |||||
url:stopUrl, | |||||
data:$('#stopForm-'+JobID).serialize(), | |||||
success:function(res){ | |||||
if(res.result_code==="0"){ | |||||
$('#' + JobID+'-icon').removeClass().addClass(res.status) | |||||
$('#' + JobID+ '-text').text(res.status) | |||||
if(res.status==="STOPPED"){ | |||||
$('#ai-debug-'+JobID).removeClass('disabled').addClass('blue').text("再次调试").css("margin","0") | |||||
$('#ai-image-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#ai-model-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#ai-delete-'+JobID).removeClass('disabled').addClass('blue') | |||||
$('#ai-stop-'+JobID).removeClass('blue').addClass('disabled') | |||||
} | |||||
else{ | |||||
$('#ai-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#ai-stop-'+JobID).removeClass('blue').addClass('disabled') | |||||
} | |||||
}else{ | |||||
$('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); | |||||
} | |||||
}, | |||||
error :function(res){ | |||||
console.log(res) | |||||
} | |||||
}) | |||||
} | |||||
$('.ui.basic.ai_stop').click(function() { | |||||
const jobID = this.dataset.jobid | |||||
const repoPath = this.dataset.repopath | |||||
stopDebug(jobID,repoPath) | |||||
}) | |||||
function stopVersion(version_name,jobID,repoPath){ | |||||
const url = `/api/v1/repos/${repoPath}/${jobID}/stop_version` | |||||
$.post(url,{version_name:version_name},(data)=>{ | |||||
if(data.StatusOK===0){ | |||||
$('#ai-stop-'+jobID).removeClass('blue') | |||||
$('#ai-stop-'+jobID).addClass('disabled') | |||||
refreshStatus(version_name,jobID,repoPath) | |||||
} | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
} | |||||
function refreshStatus(version_name,jobID,repoPath){ | |||||
const url = `/api/v1/repos/${repoPath}/${jobID}/?version_name${version_name}` | |||||
$.get(url,(data)=>{ | |||||
$(`#${jobID}-icon`).attr("class",data.JobStatus) | |||||
// detail status and duration | |||||
$(`#${jobID}-text`).text(data.JobStatus) | |||||
}).fail(function(err) { | |||||
console.log(err); | |||||
}); | |||||
} | |||||
$('.ui.basic.ai_stop_version').click(function() { | |||||
const jobID = this.dataset.jobid | |||||
const repoPath = this.dataset.repopath | |||||
const versionName = this.dataset.version | |||||
stopVersion(versionName,jobID,repoPath) | |||||
}) | |||||
function getModelInfo(repoPath,modelName,versionName,jobName){ | |||||
console.log("getModelInfo") | |||||
$.get(`${repoPath}/modelmanage/show_model_info_api?name=${modelName}`,(data)=>{ | |||||
if(data.length===0){ | |||||
$(`#${jobName}`).popup('toggle') | |||||
}else{ | |||||
let versionData = data.filter((item)=>{ | |||||
return item.Version === versionName | |||||
}) | |||||
if(versionData.length==0){ | |||||
$(`#${jobName}`).popup('toggle') | |||||
} | |||||
else{ | |||||
location.href = `${repoPath}/modelmanage/show_model_info?name=${modelName}` | |||||
} | |||||
} | |||||
}) | |||||
} | |||||
$('.goto_modelmanage').click(function() { | |||||
const repoPath = this.dataset.repopath | |||||
const modelName = this.dataset.modelname | |||||
const versionName = this.dataset.version | |||||
const jobName = this.dataset.jobname | |||||
getModelInfo(repoPath,modelName,versionName,jobName) | |||||
}) | |||||
function debugAgain(JobID,debugUrl){ | |||||
if($('#' + JobID+ '-text').text()==="RUNNING"){ | |||||
window.open(debugUrl+'debug') | |||||
}else{ | |||||
$.ajax({ | |||||
type:"POST", | |||||
url:debugUrl+'restart', | |||||
data:$('#debugAgainForm-'+JobID).serialize(), | |||||
success:function(res){ | |||||
if(res.result_code==="0"){ | |||||
if(res.job_id!==JobID){ | |||||
location.reload() | |||||
}else{ | |||||
$('#' + JobID+'-icon').removeClass().addClass(res.status) | |||||
$('#' + JobID+ '-text').text(res.status) | |||||
$('#ai-debug-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#ai-delete-'+JobID).removeClass('blue').addClass('disabled') | |||||
$('#ai-debug-'+JobID).text("调试").css("margin","0 1rem") | |||||
} | |||||
}else{ | |||||
$('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); | |||||
} | |||||
}, | |||||
error :function(res){ | |||||
console.log(res) | |||||
} | |||||
}) | |||||
} | |||||
} | |||||
$('.ui.basic.ai_debug').click(function() { | |||||
const jobID = this.dataset.jobid | |||||
const repoPath = this.dataset.repopath | |||||
debugAgain(jobID,repoPath) | |||||
}) | |||||
} | |||||
@@ -40,6 +40,8 @@ import EditTopics from './components/EditTopics.vue'; | |||||
import DataAnalysis from './components/DataAnalysis.vue' | import DataAnalysis from './components/DataAnalysis.vue' | ||||
import Contributors from './components/Contributors.vue' | import Contributors from './components/Contributors.vue' | ||||
import Model from './components/Model.vue'; | import Model from './components/Model.vue'; | ||||
import initCloudrain from './features/cloudrbanin.js' | |||||
Vue.use(ElementUI); | Vue.use(ElementUI); | ||||
Vue.prototype.$axios = axios; | Vue.prototype.$axios = axios; | ||||
@@ -2936,6 +2938,7 @@ $(document).ready(async () => { | |||||
initNotificationCount(); | initNotificationCount(); | ||||
initTribute(); | initTribute(); | ||||
initDropDown(); | initDropDown(); | ||||
initCloudrain(); | |||||
// Repo clone url. | // Repo clone url. | ||||
if ($('#repo-clone-url').length > 0) { | if ($('#repo-clone-url').length > 0) { | ||||
@@ -3584,14 +3587,16 @@ function initVueApp() { | |||||
} | } | ||||
initVueComponents(); | initVueComponents(); | ||||
new Vue({ | new Vue({ | ||||
delimiters: ['${', '}'], | delimiters: ['${', '}'], | ||||
el, | el, | ||||
data: { | data: { | ||||
page:parseInt(new URLSearchParams(window.location.search).get('page')), | |||||
searchLimit: Number( | searchLimit: Number( | ||||
(document.querySelector('meta[name=_search_limit]') || {}).content | (document.querySelector('meta[name=_search_limit]') || {}).content | ||||
), | ), | ||||
page:1, | |||||
suburl: AppSubUrl, | suburl: AppSubUrl, | ||||
uid: Number( | uid: Number( | ||||
(document.querySelector('meta[name=_context_uid]') || {}).content | (document.querySelector('meta[name=_context_uid]') || {}).content | ||||
@@ -3600,6 +3605,15 @@ function initVueApp() { | |||||
}, | }, | ||||
components: { | components: { | ||||
ActivityTopAuthors | ActivityTopAuthors | ||||
}, | |||||
mounted(){ | |||||
this.page = parseInt(new URLSearchParams(window.location.search).get('page')) | |||||
}, | |||||
methods:{ | |||||
handleCurrentChange:function (val) { | |||||
window.location.href='/admin/cloudbrains?page='+val | |||||
this.page = val | |||||
} | |||||
} | } | ||||
}); | }); | ||||
} | } | ||||
@@ -3688,8 +3702,6 @@ function initVueModel() { | |||||
} | } | ||||
function initVueDataAnalysis() { | function initVueDataAnalysis() { | ||||
const el = document.getElementById('data_analysis'); | const el = document.getElementById('data_analysis'); | ||||
console.log("el",el) | |||||
if (!el) { | if (!el) { | ||||
return; | return; | ||||
} | } | ||||
@@ -3756,7 +3768,6 @@ function initFilterBranchTagDropdown(selector) { | |||||
}); | }); | ||||
}); | }); | ||||
$data.remove(); | $data.remove(); | ||||
console.log("-this",this) | |||||
new Vue({ | new Vue({ | ||||
delimiters: ['${', '}'], | delimiters: ['${', '}'], | ||||
el: this, | el: this, | ||||
@@ -720,4 +720,13 @@ display: block; | |||||
.markdown:not(code).file-view{ | .markdown:not(code).file-view{ | ||||
padding: 2em 0!important; | padding: 2em 0!important; | ||||
} | } | ||||
} | |||||
} | |||||
//elemet-ui | |||||
.el-pagination.is-background .el-pager li:not(.disabled).active { | |||||
background-color: #5bb973 !important; | |||||
color: #FFF !important; | |||||
} | |||||
.el-pagination.is-background .el-pager li:hover { | |||||
color: #5bb973 !important; | |||||
} |
@@ -116,6 +116,15 @@ module.exports = { | |||||
], | ], | ||||
}, | }, | ||||
{ | { | ||||
test: /\.ts$/, | |||||
use: [ | |||||
{ | |||||
loader: "ts-loader", | |||||
} | |||||
], | |||||
exclude: /node_modules/ | |||||
}, | |||||
{ | |||||
test: /\.js$/, | test: /\.js$/, | ||||
exclude: /node_modules/, | exclude: /node_modules/, | ||||
use: [ | use: [ | ||||
@@ -252,6 +261,7 @@ module.exports = { | |||||
alias: { | alias: { | ||||
vue$: 'vue/dist/vue.esm.js', // needed because vue's default export is the runtime only | vue$: 'vue/dist/vue.esm.js', // needed because vue's default export is the runtime only | ||||
}, | }, | ||||
extensions: ['.tsx', '.ts', '.js'] | |||||
}, | }, | ||||
watchOptions: { | watchOptions: { | ||||
ignored: [ | ignored: [ | ||||