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()) | |||
}, reqAnyRepoReader()) | |||
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) | |||
}, reqRepoReader(models.UnitTypeCloudBrain)) | |||
m.Group("/modelarts", func() { | |||
@@ -6,11 +6,12 @@ | |||
package repo | |||
import ( | |||
"code.gitea.io/gitea/modules/log" | |||
"net/http" | |||
"sort" | |||
"time" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/cloudbrain" | |||
"code.gitea.io/gitea/modules/context" | |||
@@ -48,14 +49,12 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||
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 { | |||
ctx.NotFound(err) | |||
return | |||
ctx.Data["error"] = err.Error() | |||
} | |||
jobResult, err := cloudbrain.GetJob(jobID) | |||
jobResult, err := cloudbrain.GetJob(job.JobID) | |||
if err != nil { | |||
ctx.NotFound(err) | |||
return | |||
@@ -84,7 +83,7 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||
} | |||
ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
"JobID": result.Config.JobID, | |||
"JobName": result.Config.JobName, | |||
"JobStatus": result.JobStatus.State, | |||
"SubState": result.JobStatus.SubState, | |||
"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 | |||
result, err := cloudbrain.GetJobLog(jobID) | |||
if err != nil{ | |||
if err != nil { | |||
log.Error("GetJobLog failed: %v", err, ctx.Data["MsgID"]) | |||
ctx.ServerError(err.Error(), err) | |||
return | |||
@@ -115,7 +114,7 @@ func CloudbrainGetLog(ctx *context.Context) { | |||
if len(result.Hits.Hits) >= cloudbrain.LogPageSize { | |||
for { | |||
resultNext, err := cloudbrain.GetJobAllLog(result.ScrollID) | |||
if err != nil{ | |||
if err != nil { | |||
log.Error("GetJobAllLog failed: %v", err, ctx.Data["MsgID"]) | |||
} else { | |||
for _, hit := range resultNext.Hits.Hits { | |||
@@ -142,8 +141,8 @@ func CloudbrainGetLog(ctx *context.Context) { | |||
} | |||
ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
"JobID": jobID, | |||
"Content": content, | |||
"JobID": jobID, | |||
"Content": content, | |||
}) | |||
return | |||
@@ -77,6 +77,7 @@ func GetModelArtsNotebook2(ctx *context.APIContext) { | |||
ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
"JobID": jobID, | |||
"JobName": job.JobName, | |||
"JobStatus": result.Status, | |||
}) | |||
@@ -351,13 +351,13 @@ func CloudBrainShow(ctx *context.Context) { | |||
func cloudBrainShow(ctx *context.Context, tpName base.TplName) { | |||
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 { | |||
ctx.Data["error"] = err.Error() | |||
} | |||
result, err := cloudbrain.GetJob(jobID) | |||
result, err := cloudbrain.GetJob(task.JobID) | |||
if err != nil { | |||
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["task"] = task | |||
ctx.Data["jobID"] = jobID | |||
// ctx.Data["jobID"] = task.JobID | |||
ctx.Data["jobName"] = task.JobName | |||
version_list_task := make([]*models.Cloudbrain, 0) | |||
version_list_task = append(version_list_task, task) | |||
@@ -268,6 +268,7 @@ func NotebookShow(ctx *context.Context) { | |||
ctx.Data["task"] = task | |||
ctx.Data["jobID"] = jobID | |||
ctx.Data["jobName"] = task.JobName | |||
ctx.Data["result"] = result | |||
ctx.HTML(200, tplModelArtsNotebookShow) | |||
} | |||
@@ -974,8 +974,10 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
}, context.RepoRef()) | |||
m.Group("/cloudbrain", func() { | |||
m.Group("/:jobid", func() { | |||
m.Group("/:jobname", func() { | |||
m.Get("", reqRepoCloudBrainReader, repo.CloudBrainShow) | |||
}) | |||
m.Group("/:jobid", func() { | |||
m.Get("/debug", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDebug) | |||
m.Post("/commit_image", cloudbrain.AdminOrJobCreaterRight, bindIgnErr(auth.CommitImageCloudBrainForm{}), repo.CloudBrainCommitImage) | |||
m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainStop) | |||
@@ -287,13 +287,13 @@ | |||
<div class="row"> | |||
<!-- 任务名 --> | |||
<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> | |||
</a> | |||
</div> | |||
<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> | |||
</div> | |||
@@ -607,6 +607,7 @@ | |||
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'] | |||
@@ -615,38 +616,39 @@ | |||
return | |||
} | |||
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 | |||
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"){ | |||
$('#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"){ | |||
// $('#model-debug-'+jobID).removeClass('blue') | |||
// $('#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)){ | |||
$('#model-debug-'+jobID).removeClass('blue').addClass('disabled') | |||
$('#model-debug-'+jobName).removeClass('blue').addClass('disabled') | |||
} | |||
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)){ | |||
$('#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)){ | |||
$('#stop-model-debug-'+jobID).removeClass('blue').addClass('disabled') | |||
$('#stop-model-debug-'+jobName).removeClass('blue').addClass('disabled') | |||
} | |||
if(status==="STOPPED" || status==="FAILED"|| status==="START_FAILED"){ | |||
$('#model-delete-'+jobID).removeClass('disabled').addClass('blue') | |||
$('#model-delete-'+jobName).removeClass('disabled').addClass('blue') | |||
}else{ | |||
$('#model-delete-'+jobID).removeClass('blue').addClass('disabled') | |||
$('#model-delete-'+jobName).removeClass('blue').addClass('disabled') | |||
} | |||
}).fail(function(err) { | |||
console.log(err); | |||