Browse Source

Merge remote-tracking branch 'origin/V20220228' into zouap_user

pull/1530/head
zouap 3 years ago
parent
commit
0537627085
7 changed files with 44 additions and 36 deletions
  1. +2
    -1
      routers/api/v1/api.go
  2. +11
    -12
      routers/api/v1/repo/cloudbrain.go
  3. +1
    -0
      routers/api/v1/repo/modelarts.go
  4. +6
    -5
      routers/repo/cloudbrain.go
  5. +3
    -1
      routers/repo/modelarts.go
  6. +3
    -1
      routers/routes/routes.go
  7. +18
    -16
      templates/repo/debugjob/index.tmpl

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

@@ -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() {


+ 11
- 12
routers/api/v1/repo/cloudbrain.go View File

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


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

@@ -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,
}) })




+ 6
- 5
routers/repo/cloudbrain.go View File

@@ -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)
@@ -582,12 +582,13 @@ func logErrorAndUpdateJobStatus(err error, taskInfo *models.Cloudbrain) {
} }


func CloudBrainDel(ctx *context.Context) { func CloudBrainDel(ctx *context.Context) {
var listType = ctx.Query("debugListType")
if err := deleteCloudbrainJob(ctx); err != nil { if err := deleteCloudbrainJob(ctx); err != nil {
log.Error("deleteCloudbrainJob failed: %v", err, ctx.Data["msgID"]) log.Error("deleteCloudbrainJob failed: %v", err, ctx.Data["msgID"])
ctx.ServerError(err.Error(), err) ctx.ServerError(err.Error(), err)
return return
} }
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=all")
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=" + listType)
} }


func deleteCloudbrainJob(ctx *context.Context) error { func deleteCloudbrainJob(ctx *context.Context) error {


+ 3
- 1
routers/repo/modelarts.go View File

@@ -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)
} }
@@ -417,6 +418,7 @@ func NotebookManage(ctx *context.Context) {


func NotebookDel(ctx *context.Context) { func NotebookDel(ctx *context.Context) {
var jobID = ctx.Params(":jobid") var jobID = ctx.Params(":jobid")
var listType = ctx.Query("debugListType")
task := ctx.Cloudbrain task := ctx.Cloudbrain


if task.Status != string(models.ModelArtsCreateFailed) && task.Status != string(models.ModelArtsStartFailed) && task.Status != string(models.ModelArtsStopped) { if task.Status != string(models.ModelArtsCreateFailed) && task.Status != string(models.ModelArtsStartFailed) && task.Status != string(models.ModelArtsStopped) {
@@ -442,7 +444,7 @@ func NotebookDel(ctx *context.Context) {
return return
} }


ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=all")
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=" + listType)
} }


func TrainJobIndex(ctx *context.Context) { func TrainJobIndex(ctx *context.Context) {


+ 3
- 1
routers/routes/routes.go View File

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


+ 18
- 16
templates/repo/debugjob/index.tmpl View File

@@ -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>
@@ -366,7 +366,7 @@
</form> </form>
<!-- 删除 --> <!-- 删除 -->
<form id="delForm-{{.JobID}}" action="{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}/del" method="post"> <form id="delForm-{{.JobID}}" action="{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}/del" method="post">
<input type="hidden" name="debugListType" value="all">
<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="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;">
@@ -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);


Loading…
Cancel
Save