Reviewed-on: https://git.openi.org.cn/OpenI/aiforge/pulls/1510 Reviewed-by: lewis <747342561@qq.com>pull/1517/head
@@ -878,7 +878,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
}, reqAdmin()) | }, reqAdmin()) | ||||
}, reqAnyRepoReader()) | }, reqAnyRepoReader()) | ||||
m.Group("/cloudbrain", func() { | m.Group("/cloudbrain", func() { | ||||
m.Get("/:jobid", repo.GetCloudbrainTask) | |||||
// m.Get("/:jobid", repo.GetCloudbrainTask) | |||||
m.Get("/:jobname", repo.GetCloudbrainTask) | |||||
m.Get("/:jobid/log", repo.CloudbrainGetLog) | m.Get("/:jobid/log", repo.CloudbrainGetLog) | ||||
}, reqRepoReader(models.UnitTypeCloudBrain)) | }, reqRepoReader(models.UnitTypeCloudBrain)) | ||||
m.Group("/modelarts", func() { | m.Group("/modelarts", func() { | ||||
@@ -6,11 +6,12 @@ | |||||
package repo | package repo | ||||
import ( | import ( | ||||
"code.gitea.io/gitea/modules/log" | |||||
"net/http" | "net/http" | ||||
"sort" | "sort" | ||||
"time" | "time" | ||||
"code.gitea.io/gitea/modules/log" | |||||
"code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
"code.gitea.io/gitea/modules/cloudbrain" | "code.gitea.io/gitea/modules/cloudbrain" | ||||
"code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
@@ -48,14 +49,12 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||||
err error | err error | ||||
) | ) | ||||
jobID := ctx.Params(":jobid") | |||||
repoID := ctx.Repo.Repository.ID | |||||
job, err := models.GetRepoCloudBrainByJobID(repoID, jobID) | |||||
jobName := ctx.Params(":jobname") | |||||
job, err := models.GetCloudbrainByName(jobName) | |||||
if err != nil { | if err != nil { | ||||
ctx.NotFound(err) | |||||
return | |||||
ctx.Data["error"] = err.Error() | |||||
} | } | ||||
jobResult, err := cloudbrain.GetJob(jobID) | |||||
jobResult, err := cloudbrain.GetJob(job.JobID) | |||||
if err != nil { | if err != nil { | ||||
ctx.NotFound(err) | ctx.NotFound(err) | ||||
return | return | ||||
@@ -84,7 +83,7 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||||
} | } | ||||
ctx.JSON(http.StatusOK, map[string]interface{}{ | ctx.JSON(http.StatusOK, map[string]interface{}{ | ||||
"JobID": result.Config.JobID, | |||||
"JobName": result.Config.JobName, | |||||
"JobStatus": result.JobStatus.State, | "JobStatus": result.JobStatus.State, | ||||
"SubState": result.JobStatus.SubState, | "SubState": result.JobStatus.SubState, | ||||
"CreatedTime": time.Unix(result.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05"), | "CreatedTime": time.Unix(result.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05"), | ||||
@@ -104,7 +103,7 @@ func CloudbrainGetLog(ctx *context.Context) { | |||||
var hits []models.Hits | var hits []models.Hits | ||||
result, err := cloudbrain.GetJobLog(jobID) | result, err := cloudbrain.GetJobLog(jobID) | ||||
if err != nil{ | |||||
if err != nil { | |||||
log.Error("GetJobLog failed: %v", err, ctx.Data["MsgID"]) | log.Error("GetJobLog failed: %v", err, ctx.Data["MsgID"]) | ||||
ctx.ServerError(err.Error(), err) | ctx.ServerError(err.Error(), err) | ||||
return | return | ||||
@@ -115,7 +114,7 @@ func CloudbrainGetLog(ctx *context.Context) { | |||||
if len(result.Hits.Hits) >= cloudbrain.LogPageSize { | if len(result.Hits.Hits) >= cloudbrain.LogPageSize { | ||||
for { | for { | ||||
resultNext, err := cloudbrain.GetJobAllLog(result.ScrollID) | resultNext, err := cloudbrain.GetJobAllLog(result.ScrollID) | ||||
if err != nil{ | |||||
if err != nil { | |||||
log.Error("GetJobAllLog failed: %v", err, ctx.Data["MsgID"]) | log.Error("GetJobAllLog failed: %v", err, ctx.Data["MsgID"]) | ||||
} else { | } else { | ||||
for _, hit := range resultNext.Hits.Hits { | for _, hit := range resultNext.Hits.Hits { | ||||
@@ -142,8 +141,8 @@ func CloudbrainGetLog(ctx *context.Context) { | |||||
} | } | ||||
ctx.JSON(http.StatusOK, map[string]interface{}{ | ctx.JSON(http.StatusOK, map[string]interface{}{ | ||||
"JobID": jobID, | |||||
"Content": content, | |||||
"JobID": jobID, | |||||
"Content": content, | |||||
}) | }) | ||||
return | return | ||||
@@ -77,6 +77,7 @@ func GetModelArtsNotebook2(ctx *context.APIContext) { | |||||
ctx.JSON(http.StatusOK, map[string]interface{}{ | ctx.JSON(http.StatusOK, map[string]interface{}{ | ||||
"JobID": jobID, | "JobID": jobID, | ||||
"JobName": job.JobName, | |||||
"JobStatus": result.Status, | "JobStatus": result.Status, | ||||
}) | }) | ||||
@@ -351,13 +351,13 @@ func CloudBrainShow(ctx *context.Context) { | |||||
func cloudBrainShow(ctx *context.Context, tpName base.TplName) { | func cloudBrainShow(ctx *context.Context, tpName base.TplName) { | ||||
ctx.Data["PageIsCloudBrain"] = true | ctx.Data["PageIsCloudBrain"] = true | ||||
var jobID = ctx.Params(":jobid") | |||||
task, err := models.GetCloudbrainByJobID(jobID) | |||||
var jobName = ctx.Params(":jobname") | |||||
task, err := models.GetCloudbrainByName(jobName) | |||||
if err != nil { | if err != nil { | ||||
ctx.Data["error"] = err.Error() | ctx.Data["error"] = err.Error() | ||||
} | } | ||||
result, err := cloudbrain.GetJob(jobID) | |||||
result, err := cloudbrain.GetJob(task.JobID) | |||||
if err != nil { | if err != nil { | ||||
ctx.Data["error"] = err.Error() | ctx.Data["error"] = err.Error() | ||||
} | } | ||||
@@ -422,7 +422,7 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName) { | |||||
ctx.Data["duration"] = util.AddZero(duration/3600000) + ":" + util.AddZero(duration%3600000/60000) + ":" + util.AddZero(duration%60000/1000) | ctx.Data["duration"] = util.AddZero(duration/3600000) + ":" + util.AddZero(duration%3600000/60000) + ":" + util.AddZero(duration%60000/1000) | ||||
ctx.Data["task"] = task | ctx.Data["task"] = task | ||||
ctx.Data["jobID"] = jobID | |||||
// ctx.Data["jobID"] = task.JobID | |||||
ctx.Data["jobName"] = task.JobName | ctx.Data["jobName"] = task.JobName | ||||
version_list_task := make([]*models.Cloudbrain, 0) | version_list_task := make([]*models.Cloudbrain, 0) | ||||
version_list_task = append(version_list_task, task) | version_list_task = append(version_list_task, task) | ||||
@@ -268,6 +268,7 @@ func NotebookShow(ctx *context.Context) { | |||||
ctx.Data["task"] = task | ctx.Data["task"] = task | ||||
ctx.Data["jobID"] = jobID | ctx.Data["jobID"] = jobID | ||||
ctx.Data["jobName"] = task.JobName | |||||
ctx.Data["result"] = result | ctx.Data["result"] = result | ||||
ctx.HTML(200, tplModelArtsNotebookShow) | ctx.HTML(200, tplModelArtsNotebookShow) | ||||
} | } | ||||
@@ -974,8 +974,10 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
}, context.RepoRef()) | }, context.RepoRef()) | ||||
m.Group("/cloudbrain", func() { | m.Group("/cloudbrain", func() { | ||||
m.Group("/:jobid", func() { | |||||
m.Group("/:jobname", func() { | |||||
m.Get("", reqRepoCloudBrainReader, repo.CloudBrainShow) | m.Get("", reqRepoCloudBrainReader, repo.CloudBrainShow) | ||||
}) | |||||
m.Group("/:jobid", func() { | |||||
m.Get("/debug", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDebug) | m.Get("/debug", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDebug) | ||||
m.Post("/commit_image", cloudbrain.AdminOrJobCreaterRight, bindIgnErr(auth.CommitImageCloudBrainForm{}), repo.CloudBrainCommitImage) | m.Post("/commit_image", cloudbrain.AdminOrJobCreaterRight, bindIgnErr(auth.CommitImageCloudBrainForm{}), repo.CloudBrainCommitImage) | ||||
m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainStop) | m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainStop) | ||||
@@ -287,13 +287,13 @@ | |||||
<div class="row"> | <div class="row"> | ||||
<!-- 任务名 --> | <!-- 任务名 --> | ||||
<div class="four wide column"> | <div class="four wide column"> | ||||
<a class="title" href='{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}' title="{{.JobName}}" style="font-size: 14px;"> | |||||
<a class="title" href='{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain/{{.JobName}}{{else}}{{$.RepoLink}}/modelarts/notebook/{{.JobID}}{{end}}' title="{{.JobName}}" style="font-size: 14px;"> | |||||
<span class="fitted text_over" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> | <span class="fitted text_over" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> | ||||
</a> | </a> | ||||
</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}}"> | |||||
<span class="job-status" id="{{.JobID}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}" data-resource="{{.ComputeResource}}" data-jobname="{{.JobName}}"> | |||||
<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> | ||||
@@ -607,6 +607,7 @@ | |||||
function loadJobStatus() { | function loadJobStatus() { | ||||
$(".job-status").each((index, job) => { | $(".job-status").each((index, job) => { | ||||
const jobID = job.dataset.jobid; | const jobID = job.dataset.jobid; | ||||
const jobName = job.dataset.jobname; | |||||
const repoPath = job.dataset.repopath; | const repoPath = job.dataset.repopath; | ||||
const computeResource = job.dataset.resource | const computeResource = job.dataset.resource | ||||
const initArray = ['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED','UNAVAILABLE','DELETED','RESIZE_FAILED'] | const initArray = ['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED','UNAVAILABLE','DELETED','RESIZE_FAILED'] | ||||
@@ -615,38 +616,39 @@ | |||||
return | return | ||||
} | } | ||||
const diffResource = computeResource == "NPU" ? 'modelarts/notebook' : 'cloudbrain' | const diffResource = computeResource == "NPU" ? 'modelarts/notebook' : 'cloudbrain' | ||||
$.get(`/api/v1/repos/${repoPath}/${diffResource}/${jobID}`, (data) => { | |||||
const jobID = data.JobID | |||||
const diffApi = computeResource == "NPU" ? jobID : jobName | |||||
$.get(`/api/v1/repos/${repoPath}/${diffResource}/${diffApi}`, (data) => { | |||||
const jobName = data.JobName | |||||
const status = data.JobStatus | const status = data.JobStatus | ||||
if (status != job.textContent.trim()) { | if (status != job.textContent.trim()) { | ||||
$('#' + jobID+'-icon').removeClass().addClass(status) | |||||
$('#' + jobID+ '-text').text(status) | |||||
$('#' + jobName+'-icon').removeClass().addClass(status) | |||||
$('#' + jobName+ '-text').text(status) | |||||
} | } | ||||
if(status==="RUNNING"){ | if(status==="RUNNING"){ | ||||
$('#model-debug-'+jobID).removeClass('disabled').addClass('blue').text('调试').css("margin","0 1rem") | |||||
$('#model-image-'+jobID).removeClass('disabled').addClass('blue') | |||||
$('#model-debug-'+jobName).removeClass('disabled').addClass('blue').text('调试').css("margin","0 1rem") | |||||
$('#model-image-'+jobName).removeClass('disabled').addClass('blue') | |||||
} | } | ||||
if(status!=="RUNNING"){ | if(status!=="RUNNING"){ | ||||
// $('#model-debug-'+jobID).removeClass('blue') | // $('#model-debug-'+jobID).removeClass('blue') | ||||
// $('#model-debug-'+jobID).addClass('disabled') | // $('#model-debug-'+jobID).addClass('disabled') | ||||
$('#model-image-'+jobID).removeClass('blue').addClass('disabled') | |||||
$('#model-image-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | } | ||||
if(["CREATING","STOPPING","WAITING","STARTING"].includes(status)){ | if(["CREATING","STOPPING","WAITING","STARTING"].includes(status)){ | ||||
$('#model-debug-'+jobID).removeClass('blue').addClass('disabled') | |||||
$('#model-debug-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | } | ||||
if(['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED'].includes(status)){ | if(['STOPPED','FAILED','START_FAILED','CREATE_FAILED','SUCCEEDED'].includes(status)){ | ||||
$('#model-debug-'+jobID).removeClass('disabled').addClass('blue').text('再次调试').css("margin","0") | |||||
$('#model-debug-'+jobName).removeClass('disabled').addClass('blue').text('再次调试').css("margin","0") | |||||
} | } | ||||
if(["RUNNING","WAITING"].includes(status)){ | if(["RUNNING","WAITING"].includes(status)){ | ||||
$('#stop-model-debug-'+jobID).removeClass('disabled').addClass('blue') | |||||
$('#stop-model-debug-'+jobName).removeClass('disabled').addClass('blue') | |||||
} | } | ||||
if(["CREATING","STOPPING","STARTING","STOPPED","FAILED","START_FAILED","SUCCEEDED"].includes(status)){ | if(["CREATING","STOPPING","STARTING","STOPPED","FAILED","START_FAILED","SUCCEEDED"].includes(status)){ | ||||
$('#stop-model-debug-'+jobID).removeClass('blue').addClass('disabled') | |||||
$('#stop-model-debug-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | } | ||||
if(status==="STOPPED" || status==="FAILED"|| status==="START_FAILED"){ | if(status==="STOPPED" || status==="FAILED"|| status==="START_FAILED"){ | ||||
$('#model-delete-'+jobID).removeClass('disabled').addClass('blue') | |||||
$('#model-delete-'+jobName).removeClass('disabled').addClass('blue') | |||||
}else{ | }else{ | ||||
$('#model-delete-'+jobID).removeClass('blue').addClass('disabled') | |||||
$('#model-delete-'+jobName).removeClass('blue').addClass('disabled') | |||||
} | } | ||||
}).fail(function(err) { | }).fail(function(err) { | ||||
console.log(err); | console.log(err); | ||||