| @@ -385,34 +385,28 @@ func getPrivateAttachments(e Engine, userID int64) ([]*AttachmentUsername, error | |||||
| return attachments, nil | return attachments, nil | ||||
| } | } | ||||
| /* | |||||
| func GetAllUserAttachments(userID int64) ([]*AttachmentUsername, error) { | |||||
| attachsPub, err := getAllPublicAttachments(x) | |||||
| if err != nil { | |||||
| log.Error("getAllPublicAttachments failed:%v", err) | |||||
| return nil, err | |||||
| } | |||||
| attachsPri, err := getPrivateAttachments(x, userID) | |||||
| if err != nil { | |||||
| log.Error("getPrivateAttachments failed:%v", err) | |||||
| func getAllUserAttachments(e Engine, userID int64) ([]*AttachmentUsername, error) { | |||||
| attachments := make([]*AttachmentUsername, 0, 10) | |||||
| if err := e.Table("attachment").Join("LEFT", "`user`", "attachment.uploader_id "+ | |||||
| "= `user`.id").Where("decompress_state= ? and type = ? and (uploader_id= ? or is_private = ?)", DecompressStateDone, TypeCloudBrainOne, userID, false).Find(&attachments); err != nil { | |||||
| return nil, err | return nil, err | ||||
| } | } | ||||
| return append(attachsPub, attachsPri...), nil | |||||
| return attachments, nil | |||||
| } | } | ||||
| */ | |||||
| func GetAllUserAttachments(userID int64) ([]*AttachmentUsername, error) { | |||||
| return getAllUserAttachments(x, userID) | |||||
| } | |||||
| func getAllUserAttachments(e Engine, userID int64) ([]*AttachmentUsername, error) { | |||||
| func getModelArtsUserAttachments(e Engine, userID int64) ([]*AttachmentUsername, error) { | |||||
| attachments := make([]*AttachmentUsername, 0, 10) | attachments := make([]*AttachmentUsername, 0, 10) | ||||
| if err := e.Table("attachment").Join("LEFT", "`user`", "attachment.uploader_id "+ | if err := e.Table("attachment").Join("LEFT", "`user`", "attachment.uploader_id "+ | ||||
| "= `user`.id").Where("decompress_state= ? and type = ? and (uploader_id= ? or is_private = ?)", DecompressStateDone, TypeCloudBrainOne, userID, false).Find(&attachments); err != nil { | |||||
| "= `user`.id").Where("type = ? and (uploader_id= ? or is_private = ?)", TypeCloudBrainTwo, userID, false).Find(&attachments); err != nil { | |||||
| return nil, err | return nil, err | ||||
| } | } | ||||
| return attachments, nil | return attachments, nil | ||||
| } | } | ||||
| func GetAllUserAttachments(userID int64) ([]*AttachmentUsername, error) { | |||||
| return getAllUserAttachments(x, userID) | |||||
| func GetModelArtsUserAttachments(userID int64) ([]*AttachmentUsername, error) { | |||||
| return getModelArtsUserAttachments(x, userID) | |||||
| } | } | ||||
| @@ -407,6 +407,25 @@ type Domain struct { | |||||
| Name string `json:name` | Name string `json:name` | ||||
| } | } | ||||
| const ( | |||||
| ActionStart = "start" | |||||
| ActionStop = "stop" | |||||
| ActionRestart = "restart" | |||||
| ActionQueue = "queue" | |||||
| ActionDequeue = "dequeue" | |||||
| ) | |||||
| type NotebookAction struct { | |||||
| Action string `json:"action"` | |||||
| } | |||||
| type NotebookActionResult struct { | |||||
| ErrorCode string `json:"error_code"` | |||||
| ErrorMsg string `json:"error_msg"` | |||||
| CurrentStatus string `json:"current_status"` | |||||
| PreviousState string `json:"previous_state"` | |||||
| } | |||||
| func Cloudbrains(opts *CloudbrainsOptions) ([]*Cloudbrain, int64, error) { | func Cloudbrains(opts *CloudbrainsOptions) ([]*Cloudbrain, int64, error) { | ||||
| sess := x.NewSession() | sess := x.NewSession() | ||||
| defer sess.Close() | defer sess.Close() | ||||
| @@ -145,54 +145,23 @@ sendjob: | |||||
| return &result, nil | return &result, nil | ||||
| } | } | ||||
| func GetImages() (*models.GetImagesResult, error) { | |||||
| func StopJob(jobID string, param models.NotebookAction) (*models.NotebookActionResult, error) { | |||||
| checkSetting() | checkSetting() | ||||
| client := getRestyClient() | client := getRestyClient() | ||||
| var getImagesResult models.GetImagesResult | |||||
| var result models.NotebookActionResult | |||||
| retry := 0 | retry := 0 | ||||
| sendjob: | sendjob: | ||||
| res, err := client.R(). | res, err := client.R(). | ||||
| SetHeader("Content-Type", "application/json"). | SetHeader("Content-Type", "application/json"). | ||||
| SetBody(param). | |||||
| SetAuthToken(TOKEN). | SetAuthToken(TOKEN). | ||||
| SetResult(&getImagesResult). | |||||
| Get(HOST + "/rest-server/api/v1/image/list/") | |||||
| if err != nil { | |||||
| return nil, fmt.Errorf("resty GetImages: %v", err) | |||||
| } | |||||
| if res.StatusCode() == http.StatusUnauthorized && retry < 1 { | |||||
| retry++ | |||||
| _ = getToken() | |||||
| goto sendjob | |||||
| } | |||||
| //if len(result.ErrorCode) != 0 { | |||||
| // return &result, fmt.Errorf("CreateJob failed(%s): %s", result.ErrorCode, result.ErrorMsg) | |||||
| //} | |||||
| return &getImagesResult, nil | |||||
| } | |||||
| func CommitImage(jobID string, params models.CommitImageParams) error { | |||||
| checkSetting() | |||||
| client := getRestyClient() | |||||
| var result models.CommitImageResult | |||||
| retry := 0 | |||||
| sendjob: | |||||
| res, err := client.R(). | |||||
| SetHeader("Content-Type", "application/json"). | |||||
| SetAuthToken(TOKEN). | |||||
| SetBody(params). | |||||
| SetResult(&result). | SetResult(&result). | ||||
| Post(HOST + "/rest-server/api/v1/jobs/" + jobID + "/commitImage") | |||||
| Post(HOST + "/v1/" + setting.ProjectID + urlNotebook + jobID + "/action") | |||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("resty CommitImage: %v", err) | |||||
| return &result, fmt.Errorf("resty StopJob: %v", err) | |||||
| } | } | ||||
| if res.StatusCode() == http.StatusUnauthorized && retry < 1 { | if res.StatusCode() == http.StatusUnauthorized && retry < 1 { | ||||
| @@ -201,40 +170,9 @@ sendjob: | |||||
| goto sendjob | goto sendjob | ||||
| } | } | ||||
| //if len(result.ErrorCode) != 0 { | |||||
| // return &result, fmt.Errorf("CreateJob failed(%s): %s", result.ErrorCode, result.ErrorMsg) | |||||
| //} | |||||
| return nil | |||||
| } | |||||
| func StopJob(jobID string) error { | |||||
| checkSetting() | |||||
| client := getRestyClient() | |||||
| var result models.StopJobResult | |||||
| retry := 0 | |||||
| sendjob: | |||||
| res, err := client.R(). | |||||
| SetHeader("Content-Type", "application/json"). | |||||
| SetAuthToken(TOKEN). | |||||
| SetResult(&result). | |||||
| Delete(HOST + "/rest-server/api/v1/jobs/" + jobID) | |||||
| if err != nil { | |||||
| return fmt.Errorf("resty StopJob: %v", err) | |||||
| } | |||||
| if res.StatusCode() == http.StatusUnauthorized && retry < 1 { | |||||
| retry++ | |||||
| _ = getToken() | |||||
| goto sendjob | |||||
| if len(result.ErrorCode) != 0 { | |||||
| return &result, fmt.Errorf("CreateJob failed(%s): %s", result.ErrorCode, result.ErrorMsg) | |||||
| } | } | ||||
| //if len(result.ErrorCode) != 0 { | |||||
| // return &result, fmt.Errorf("CreateJob failed(%s): %s", result.ErrorCode, result.ErrorMsg) | |||||
| //} | |||||
| return nil | |||||
| return &result, nil | |||||
| } | } | ||||
| @@ -29,7 +29,7 @@ func MustEnableModelArts(ctx *context.Context) { | |||||
| } | } | ||||
| } | } | ||||
| func ModelArtsIndex(ctx *context.Context) { | func ModelArtsIndex(ctx *context.Context) { | ||||
| MustEnableCloudbrain(ctx) | |||||
| MustEnableModelArts(ctx) | |||||
| repo := ctx.Repo.Repository | repo := ctx.Repo.Repository | ||||
| page := ctx.QueryInt("page") | page := ctx.QueryInt("page") | ||||
| if page <= 0 { | if page <= 0 { | ||||
| @@ -42,7 +42,7 @@ func ModelArtsIndex(ctx *context.Context) { | |||||
| PageSize: setting.UI.IssuePagingNum, | PageSize: setting.UI.IssuePagingNum, | ||||
| }, | }, | ||||
| RepoID: repo.ID, | RepoID: repo.ID, | ||||
| // SortType: sortType, | |||||
| Type: models.TypeCloudBrainTwo, | |||||
| }) | }) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.ServerError("Cloudbrain", err) | ctx.ServerError("Cloudbrain", err) | ||||
| @@ -64,7 +64,7 @@ func ModelArtsIndex(ctx *context.Context) { | |||||
| ctx.Data["PageIsCloudBrain"] = true | ctx.Data["PageIsCloudBrain"] = true | ||||
| ctx.Data["Tasks"] = ciTasks | ctx.Data["Tasks"] = ciTasks | ||||
| ctx.HTML(200, tplCloudBrainIndex) | |||||
| ctx.HTML(200, tplModelArtsIndex) | |||||
| } | } | ||||
| func ModelArtsNew(ctx *context.Context) { | func ModelArtsNew(ctx *context.Context) { | ||||
| @@ -74,17 +74,14 @@ func ModelArtsNew(ctx *context.Context) { | |||||
| var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | ||||
| ctx.Data["job_name"] = jobName | ctx.Data["job_name"] = jobName | ||||
| //attachs, err := models.GetAllUserAttachments(ctx.User.ID) | |||||
| //if err != nil { | |||||
| // ctx.ServerError("GetAllUserAttachments failed:", err) | |||||
| // return | |||||
| //} | |||||
| attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID) | |||||
| if err != nil { | |||||
| ctx.ServerError("GetAllUserAttachments failed:", err) | |||||
| return | |||||
| } | |||||
| //ctx.Data["attachments"] = attachs | |||||
| //ctx.Data["command"] = cloudbrain.Command | |||||
| //ctx.Data["code_path"] = cloudbrain.CodeMountPath | |||||
| ctx.Data["attachments"] = attachs | |||||
| ctx.Data["dataset_path"] = modelarts.DataSetMountPath | ctx.Data["dataset_path"] = modelarts.DataSetMountPath | ||||
| //ctx.Data["model_path"] = cloudbrain.ModelMountPath | |||||
| ctx.HTML(200, tplModelArtsNew) | ctx.HTML(200, tplModelArtsNew) | ||||
| } | } | ||||
| @@ -96,7 +93,7 @@ func ModelArtsCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||||
| err := modelarts.GenerateTask(ctx, jobName, uuid) | err := modelarts.GenerateTask(ctx, jobName, uuid) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.RenderWithErr(err.Error(), tplCloudBrainNew, &form) | |||||
| ctx.RenderWithErr(err.Error(), tplModelArtsNew, &form) | |||||
| return | return | ||||
| } | } | ||||
| ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts") | ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts") | ||||
| @@ -134,7 +131,7 @@ func ModelArtsShow(ctx *context.Context) { | |||||
| ctx.Data["task"] = task | ctx.Data["task"] = task | ||||
| ctx.Data["jobID"] = jobID | ctx.Data["jobID"] = jobID | ||||
| ctx.HTML(200, tplCloudBrainShow) | |||||
| ctx.HTML(200, tplModelArtsShow) | |||||
| } | } | ||||
| func ModelArtsDebug(ctx *context.Context) { | func ModelArtsDebug(ctx *context.Context) { | ||||
| @@ -151,38 +148,6 @@ func ModelArtsDebug(ctx *context.Context) { | |||||
| ctx.Redirect(debugUrl) | ctx.Redirect(debugUrl) | ||||
| } | } | ||||
| func ModelArtsCommitImage(ctx *context.Context, form auth.CommitImageCloudBrainForm) { | |||||
| var jobID = ctx.Params(":jobid") | |||||
| task, err := models.GetCloudbrainByJobID(jobID) | |||||
| if err != nil { | |||||
| ctx.JSON(200, map[string]string{ | |||||
| "result_code": "-1", | |||||
| "error_msg": "GetCloudbrainByJobID failed", | |||||
| }) | |||||
| return | |||||
| } | |||||
| err = cloudbrain.CommitImage(jobID, models.CommitImageParams{ | |||||
| Ip: task.ContainerIp, | |||||
| TaskContainerId: task.ContainerID, | |||||
| ImageDescription: form.Description, | |||||
| ImageTag: form.Tag, | |||||
| }) | |||||
| if err != nil { | |||||
| log.Error("CommitImage(%s) failed:", task.JobName, err.Error()) | |||||
| ctx.JSON(200, map[string]string{ | |||||
| "result_code": "-1", | |||||
| "error_msg": "CommitImage failed", | |||||
| }) | |||||
| return | |||||
| } | |||||
| ctx.JSON(200, map[string]string{ | |||||
| "result_code": "0", | |||||
| "error_msg": "", | |||||
| }) | |||||
| } | |||||
| func ModelArtsStop(ctx *context.Context) { | func ModelArtsStop(ctx *context.Context) { | ||||
| var jobID = ctx.Params(":jobid") | var jobID = ctx.Params(":jobid") | ||||
| log.Info(jobID) | log.Info(jobID) | ||||
| @@ -198,13 +163,18 @@ func ModelArtsStop(ctx *context.Context) { | |||||
| return | return | ||||
| } | } | ||||
| err = cloudbrain.StopJob(jobID) | |||||
| param := models.NotebookAction{ | |||||
| Action: models.ActionStop, | |||||
| } | |||||
| res, err := modelarts.StopJob(jobID, param) | |||||
| if err != nil { | if err != nil { | ||||
| log.Error("StopJob(%s) failed:%v", task.JobName, err.Error()) | log.Error("StopJob(%s) failed:%v", task.JobName, err.Error()) | ||||
| ctx.ServerError("StopJob failed", err) | ctx.ServerError("StopJob failed", err) | ||||
| return | return | ||||
| } | } | ||||
| log.Info("pre(%s), current(%s)", res.PreviousState, res.CurrentStatus) | |||||
| task.Status = string(models.JobStopped) | task.Status = string(models.JobStopped) | ||||
| err = models.UpdateJob(task) | err = models.UpdateJob(task) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -212,7 +182,7 @@ func ModelArtsStop(ctx *context.Context) { | |||||
| return | return | ||||
| } | } | ||||
| ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/cloudbrain") | |||||
| ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts") | |||||
| } | } | ||||
| func ModelArtsDel(ctx *context.Context) { | func ModelArtsDel(ctx *context.Context) { | ||||
| @@ -235,16 +205,6 @@ func ModelArtsDel(ctx *context.Context) { | |||||
| return | return | ||||
| } | } | ||||
| ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/cloudbrain") | |||||
| ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts") | |||||
| } | } | ||||
| func ModelArtsBenchmark(ctx *context.Context) { | |||||
| var jobID = ctx.Params(":jobid") | |||||
| _, err := models.GetCloudbrainByJobID(jobID) | |||||
| if err != nil { | |||||
| ctx.ServerError("GetCloudbrainByJobID failed", err) | |||||
| return | |||||
| } | |||||
| ctx.Redirect(setting.BenchmarkServerHost) | |||||
| } | |||||
| @@ -920,8 +920,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| m.Group("/:jobid", func() { | m.Group("/:jobid", func() { | ||||
| m.Get("", reqRepoCloudBrainReader, repo.ModelArtsShow) | m.Get("", reqRepoCloudBrainReader, repo.ModelArtsShow) | ||||
| m.Get("/debug", reqRepoCloudBrainReader, repo.ModelArtsDebug) | m.Get("/debug", reqRepoCloudBrainReader, repo.ModelArtsDebug) | ||||
| //m.Post("/stop", reqRepoCloudBrainWriter, repo.CloudBrainStop) | |||||
| //m.Post("/del", reqRepoCloudBrainWriter, repo.CloudBrainDel) | |||||
| m.Post("/stop", reqRepoCloudBrainWriter, repo.ModelArtsStop) | |||||
| m.Post("/del", reqRepoCloudBrainWriter, repo.ModelArtsDel) | |||||
| }) | }) | ||||
| m.Get("/create", reqRepoCloudBrainWriter, repo.ModelArtsNew) | m.Get("/create", reqRepoCloudBrainWriter, repo.ModelArtsNew) | ||||
| m.Post("/create", reqRepoCloudBrainWriter, bindIgnErr(auth.CreateModelArtsForm{}), repo.ModelArtsCreate) | m.Post("/create", reqRepoCloudBrainWriter, bindIgnErr(auth.CreateModelArtsForm{}), repo.ModelArtsCreate) | ||||