@@ -680,6 +680,10 @@ type TrainJobResult struct { | |||
IsSuccess bool `json:"is_success"` | |||
} | |||
type LogFile struct { | |||
Name string | |||
} | |||
func Cloudbrains(opts *CloudbrainsOptions) ([]*Cloudbrain, int64, error) { | |||
sess := x.NewSession() | |||
defer sess.Close() | |||
@@ -569,7 +569,7 @@ sendjob: | |||
Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID + "/log/file-names") | |||
if err != nil { | |||
return nil, fmt.Errorf("resty GetTrainJobLog: %v", err) | |||
return nil, fmt.Errorf("resty GetTrainJobLogFileNames: %v", err) | |||
} | |||
if res.StatusCode() == http.StatusUnauthorized && retry < 1 { | |||
@@ -584,13 +584,13 @@ sendjob: | |||
log.Error("json.Unmarshal failed(%s): %v", res.String(), err.Error()) | |||
return &result, fmt.Errorf("json.Unmarshal failed(%s): %v", res.String(), err.Error()) | |||
} | |||
log.Error("GetTrainJobLog failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg) | |||
return &result, fmt.Errorf("GetTrainJobLog failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg) | |||
log.Error("GetTrainJobLogFileNames failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg) | |||
return &result, fmt.Errorf("GetTrainJobLogFileNames failed(%d):%s(%s)", res.StatusCode(), temp.ErrorCode, temp.ErrorMsg) | |||
} | |||
if !result.IsSuccess { | |||
log.Error("GetTrainJobLog(%s) failed", jobID) | |||
return &result, fmt.Errorf("获取作业日志失败:%s", result.ErrorMsg) | |||
log.Error("GetTrainJobLogFileNames(%s) failed", jobID) | |||
return &result, fmt.Errorf("获取作业日志文件失败:%s", result.ErrorMsg) | |||
} | |||
return &result, nil | |||
@@ -576,6 +576,15 @@ func TrainJobShow(ctx *context.Context) { | |||
result.DatasetName = attach.Name | |||
} | |||
resultLogFile, resultLog, err := trainJobGetLog(ctx, jobID) | |||
if err != nil { | |||
log.Error("trainJobGetLog(%s) failed:%v", jobID, err.Error()) | |||
ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil) | |||
} | |||
ctx.Data["log_file_name"] = resultLogFile.LogFileList[0] | |||
ctx.Data["log"] = resultLog | |||
ctx.Data["task"] = task | |||
ctx.Data["jobID"] = jobID | |||
ctx.Data["result"] = result | |||
@@ -586,29 +595,37 @@ func TrainJobGetLog(ctx *context.Context) { | |||
ctx.Data["PageIsCloudBrain"] = true | |||
var jobID = ctx.Params(":jobid") | |||
resultLogFile, result, err := trainJobGetLog(ctx, jobID) | |||
if err != nil { | |||
log.Error("trainJobGetLog(%s) failed:%v", jobID, err.Error()) | |||
ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil) | |||
} | |||
ctx.Data["log_file_name"] = resultLogFile.LogFileList[0] | |||
ctx.Data["log"] = result | |||
ctx.HTML(http.StatusOK, tplModelArtsTrainJobShow) | |||
} | |||
func trainJobGetLog(ctx *context.Context, jobID string) (*models.GetTrainJobLogFileNamesResult, *models.GetTrainJobLogResult, error){ | |||
task, err := models.GetCloudbrainByJobID(jobID) | |||
if err != nil { | |||
log.Error("GetCloudbrainByJobID(%s) failed:%v", jobID, err.Error()) | |||
ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil) | |||
return | |||
return nil, nil, err | |||
} | |||
resultLogFile, err := modelarts.GetTrainJobLogFileNames(jobID, strconv.FormatInt(task.VersionID, 10)) | |||
if err != nil { | |||
log.Error("GetTrainJobLogFileNames(%s) failed:%v", jobID, err.Error()) | |||
ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil) | |||
return | |||
return nil, nil, err | |||
} | |||
result, err := modelarts.GetTrainJobLog(jobID, strconv.FormatInt(task.VersionID, 10), "", resultLogFile.LogFileList[0], modelarts.OrderDesc, 20) | |||
if err != nil { | |||
log.Error("GetTrainJobLog(%s) failed:%v", jobID, err.Error()) | |||
ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil) | |||
return | |||
return nil, nil, err | |||
} | |||
ctx.Data["log"] = result | |||
ctx.HTML(http.StatusOK, tplModelArtsTrainJobShow) | |||
return resultLogFile, result, err | |||
} | |||
func TrainJobDel(ctx *context.Context) { | |||
@@ -116,12 +116,8 @@ | |||
<div class="ui top attached segment" style="background: #f0f0f0;"> | |||
<form class="ui form" action="{{.Link}}" method="post"> | |||
<div class="inline field"> | |||
<label>{{$.i18n.Tr "repo.modelarts.log"}}</label> | |||
<select class="ui search dropdown" id="trainjob_datasets" style='width:385px' name="attachment"> | |||
{{range .attachments}} | |||
<option name="attachment" value="{{.UUID}}">{{.Attachment.Name}}</option> | |||
{{end}} | |||
</select> | |||
<label>{{$.i18n.Tr "repo.modelarts.log"}}:</label> | |||
<text>{{.log_file_name}}</text> | |||
</div> | |||
</form> | |||
</div> | |||