@@ -123,8 +123,9 @@ type GetImagesResult struct { | |||
} | |||
type GetImagesPayload struct { | |||
Count int `json:"count"` | |||
ImageInfo []*ImageInfo `json:"rows"` | |||
Count int `json:"count"` | |||
TotalPages int `json:"totalPages,omitempty"` | |||
ImageInfo []*ImageInfo `json:"rows"` | |||
} | |||
type CloudbrainsOptions struct { | |||
@@ -1,9 +1,11 @@ | |||
package cloudbrain | |||
import ( | |||
"code.gitea.io/gitea/modules/log" | |||
"encoding/json" | |||
"fmt" | |||
"strings" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/setting" | |||
@@ -11,13 +13,16 @@ import ( | |||
) | |||
var ( | |||
restyClient *resty.Client | |||
HOST string | |||
TOKEN string | |||
restyClient *resty.Client | |||
HOST string | |||
TOKEN string | |||
ImagesUrlMap = map[string]string{Public: "/rest-server/api/v1/image/public/list/", Custom: "/rest-server/api/v1/image/list/"} | |||
) | |||
const ( | |||
JobHasBeenStopped = "S410" | |||
Public = "public" | |||
Custom = "custom" | |||
) | |||
func getRestyClient() *resty.Client { | |||
@@ -77,6 +82,12 @@ sendjob: | |||
Post(HOST + "/rest-server/api/v1/jobs/") | |||
if err != nil { | |||
if res != nil { | |||
var response models.CloudBrainResult | |||
json.Unmarshal(res.Body(), &response) | |||
log.Error("code(%s), msg(%s)", response.Code, response.Msg) | |||
return nil, fmt.Errorf(response.Msg) | |||
} | |||
return nil, fmt.Errorf("resty create job: %s", err) | |||
} | |||
@@ -126,6 +137,16 @@ sendjob: | |||
} | |||
func GetImages() (*models.GetImagesResult, error) { | |||
return GetImagesPageable(1, 100, Custom, "") | |||
} | |||
func GetPublicImages() (*models.GetImagesResult, error) { | |||
return GetImagesPageable(1, 100, Public, "") | |||
} | |||
func GetImagesPageable(page int, size int, imageType string, name string) (*models.GetImagesResult, error) { | |||
checkSetting() | |||
client := getRestyClient() | |||
var getImagesResult models.GetImagesResult | |||
@@ -136,9 +157,9 @@ sendjob: | |||
res, err := client.R(). | |||
SetHeader("Content-Type", "application/json"). | |||
SetAuthToken(TOKEN). | |||
SetQueryString("pageIndex=1&pageSize=100"). | |||
SetQueryString(getQueryString(page, size, name)). | |||
SetResult(&getImagesResult). | |||
Get(HOST + "/rest-server/api/v1/image/list/") | |||
Get(HOST + ImagesUrlMap[imageType]) | |||
if err != nil { | |||
return nil, fmt.Errorf("resty GetImages: %v", err) | |||
@@ -157,48 +178,30 @@ sendjob: | |||
goto sendjob | |||
} | |||
if len(response.Code) != 0 { | |||
log.Error("getImagesResult failed(%s): %s", response.Code, response.Msg) | |||
return &getImagesResult, fmt.Errorf("getImagesResult failed(%s): %s", response.Code, response.Msg) | |||
} | |||
if getImagesResult.Code != Success { | |||
return &getImagesResult, fmt.Errorf("getImagesResult err: %s", res.String()) | |||
} | |||
getImagesResult.Payload.TotalPages = getTotalPages(getImagesResult, size) | |||
return &getImagesResult, nil | |||
} | |||
func GetPublicImages() (*models.GetImagesResult, error) { | |||
checkSetting() | |||
client := getRestyClient() | |||
var getImagesResult models.GetImagesResult | |||
retry := 0 | |||
sendjob: | |||
res, err := client.R(). | |||
SetHeader("Content-Type", "application/json"). | |||
SetAuthToken(TOKEN). | |||
SetQueryString("pageIndex=1&pageSize=100"). | |||
SetResult(&getImagesResult). | |||
Get(HOST + "/rest-server/api/v1/image/public/list/") | |||
if err != nil { | |||
return nil, fmt.Errorf("resty GetPublicImages: %v", err) | |||
} | |||
if getImagesResult.Code == "S401" && retry < 1 { | |||
retry++ | |||
_ = loginCloudbrain() | |||
goto sendjob | |||
func getTotalPages(getImagesResult models.GetImagesResult, size int) int { | |||
totalCount := getImagesResult.Payload.Count | |||
var totalPages int | |||
if totalCount%size != 0 { | |||
totalPages = totalCount/size + 1 | |||
} else { | |||
totalPages = totalCount / size | |||
} | |||
return totalPages | |||
} | |||
if getImagesResult.Code != Success { | |||
return &getImagesResult, fmt.Errorf("getImgesResult err: %s", res.String()) | |||
func getQueryString(page int, size int, name string) string { | |||
if strings.TrimSpace(name) == "" { | |||
return fmt.Sprintf("pageIndex=%d&pageSize=%d", page, size) | |||
} | |||
return &getImagesResult, nil | |||
return fmt.Sprintf("pageIndex=%d&pageSize=%d&name=%s", page, size, name) | |||
} | |||
func CommitImage(jobID string, params models.CommitImageParams) error { | |||
@@ -32,7 +32,8 @@ const ( | |||
// tplExploreOrganizations explore organizations page template | |||
tplExploreOrganizations base.TplName = "explore/organizations" | |||
// tplExploreCode explore code page template | |||
tplExploreCode base.TplName = "explore/code" | |||
tplExploreCode base.TplName = "explore/code" | |||
tplExploreImages base.TplName = "explore/images" | |||
) | |||
// Home render home page | |||
@@ -475,6 +476,10 @@ func ExploreCode(ctx *context.Context) { | |||
ctx.HTML(200, tplExploreCode) | |||
} | |||
func ExploreImages(ctx *context.Context) { | |||
ctx.HTML(200, tplExploreImages) | |||
} | |||
// NotFound render 404 page | |||
func NotFound(ctx *context.Context) { | |||
ctx.Data["Title"] = "Page Not Found" | |||
@@ -1,8 +1,6 @@ | |||
package repo | |||
import ( | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/storage" | |||
"encoding/json" | |||
"errors" | |||
"net/http" | |||
@@ -13,6 +11,9 @@ import ( | |||
"strings" | |||
"time" | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/storage" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/auth" | |||
"code.gitea.io/gitea/modules/base" | |||
@@ -23,10 +24,10 @@ import ( | |||
) | |||
const ( | |||
tplCloudBrainIndex base.TplName = "repo/cloudbrain/index" | |||
tplCloudBrainNew base.TplName = "repo/cloudbrain/new" | |||
tplCloudBrainShow base.TplName = "repo/cloudbrain/show" | |||
tplCloudBrainShowModels base.TplName = "repo/cloudbrain/models/index" | |||
tplCloudBrainIndex base.TplName = "repo/cloudbrain/index" | |||
tplCloudBrainNew base.TplName = "repo/cloudbrain/new" | |||
tplCloudBrainShow base.TplName = "repo/cloudbrain/show" | |||
tplCloudBrainShowModels base.TplName = "repo/cloudbrain/models/index" | |||
) | |||
var ( | |||
@@ -89,13 +90,12 @@ func cutString(str string, lens int) string { | |||
func jobNamePrefixValid(s string) string { | |||
lowStr := strings.ToLower(s) | |||
re := regexp.MustCompile(`[^a-z0-9\\.\\-]+`) | |||
re := regexp.MustCompile(`[^a-z0-9_\\-]+`) | |||
return re.ReplaceAllString(lowStr, "") | |||
} | |||
func CloudBrainNew(ctx *context.Context) { | |||
func cloudBrainNewDataPrepare(ctx *context.Context) error{ | |||
ctx.Data["PageIsCloudBrain"] = true | |||
t := time.Now() | |||
var jobName = jobNamePrefixValid(cutString(ctx.User.Name, 5)) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | |||
ctx.Data["job_name"] = jobName | |||
@@ -103,7 +103,7 @@ func CloudBrainNew(ctx *context.Context) { | |||
result, err := cloudbrain.GetImages() | |||
if err != nil { | |||
ctx.Data["error"] = err.Error() | |||
log.Error("cloudbrain.GetImages failed:", err.Error(), ctx.Data["msgID"]) | |||
log.Error("cloudbrain.GetImages failed:", err.Error(), ctx.Data["MsgID"]) | |||
} | |||
for i, payload := range result.Payload.ImageInfo { | |||
@@ -119,7 +119,7 @@ func CloudBrainNew(ctx *context.Context) { | |||
resultPublic, err := cloudbrain.GetPublicImages() | |||
if err != nil { | |||
ctx.Data["error"] = err.Error() | |||
log.Error("cloudbrain.GetPublicImages failed:", err.Error(), ctx.Data["msgID"]) | |||
log.Error("cloudbrain.GetPublicImages failed:", err.Error(), ctx.Data["MsgID"]) | |||
} | |||
for i, payload := range resultPublic.Payload.ImageInfo { | |||
@@ -134,8 +134,8 @@ func CloudBrainNew(ctx *context.Context) { | |||
attachs, err := models.GetAllUserAttachments(ctx.User.ID) | |||
if err != nil { | |||
ctx.ServerError("GetAllUserAttachments failed:", err) | |||
return | |||
log.Error("GetAllUserAttachments failed: %v", err, ctx.Data["MsgID"]) | |||
return err | |||
} | |||
ctx.Data["attachments"] = attachs | |||
@@ -162,6 +162,16 @@ func CloudBrainNew(ctx *context.Context) { | |||
ctx.Data["resource_specs"] = cloudbrain.ResourceSpecs.ResourceSpec | |||
ctx.Data["snn4imagenet_path"] = cloudbrain.Snn4imagenetMountPath | |||
ctx.Data["is_snn4imagenet_enabled"] = setting.IsSnn4imagenetEnabled | |||
return nil | |||
} | |||
func CloudBrainNew(ctx *context.Context) { | |||
err := cloudBrainNewDataPrepare(ctx) | |||
if err != nil { | |||
ctx.ServerError("get new cloudbrain info failed", err) | |||
return | |||
} | |||
ctx.HTML(200, tplCloudBrainNew) | |||
} | |||
@@ -177,7 +187,8 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||
resourceSpecId := form.ResourceSpecId | |||
if jobType != string(models.JobTypeBenchmark) && jobType != string(models.JobTypeDebug) && jobType != string(models.JobTypeSnn4imagenet) { | |||
log.Error("jobtype error:", jobType, ctx.Data["msgID"]) | |||
log.Error("jobtype error:", jobType, ctx.Data["MsgID"]) | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr("jobtype error", tplCloudBrainNew, &form) | |||
return | |||
} | |||
@@ -185,11 +196,13 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||
_, err := models.GetCloudbrainByName(jobName) | |||
if err == nil { | |||
log.Error("the job name did already exist", ctx.Data["MsgID"]) | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr("the job name did already exist", tplCloudBrainNew, &form) | |||
return | |||
} else { | |||
if !models.IsErrJobNotExist(err) { | |||
log.Error("system error, %v", err, ctx.Data["MsgID"]) | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr("system error", tplCloudBrainNew, &form) | |||
return | |||
} | |||
@@ -200,6 +213,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||
modelPath := setting.JobPath + jobName + cloudbrain.ModelMountPath | |||
err = os.MkdirAll(modelPath, os.ModePerm) | |||
if err != nil { | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr(err.Error(), tplCloudBrainNew, &form) | |||
return | |||
} | |||
@@ -223,6 +237,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||
err = cloudbrain.GenerateTask(ctx, jobName, image, command, uuid, codePath, modelPath, benchmarkPath, snn4imagenetPath, jobType, gpuQueue, resourceSpecId) | |||
if err != nil { | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr(err.Error(), tplCloudBrainNew, &form) | |||
return | |||
} | |||
@@ -397,6 +412,38 @@ func CloudBrainShowModels(ctx *context.Context) { | |||
ctx.HTML(200, tplCloudBrainShowModels) | |||
} | |||
func GetPublicImages(ctx *context.Context) { | |||
getImages(ctx, cloudbrain.Public) | |||
} | |||
func GetCustomImages(ctx *context.Context) { | |||
getImages(ctx, cloudbrain.Custom) | |||
} | |||
func getImages(ctx *context.Context, imageType string) { | |||
log.Info("Get images begin") | |||
page := ctx.QueryInt("page") | |||
size := ctx.QueryInt("size") | |||
name := ctx.Query("name") | |||
getImagesResult, err := cloudbrain.GetImagesPageable(page, size, imageType, name) | |||
if err != nil { | |||
log.Error("Can not get images:%v", err) | |||
ctx.JSON(http.StatusOK, models.GetImagesPayload{ | |||
Count: 0, | |||
TotalPages: 0, | |||
ImageInfo: []*models.ImageInfo{}, | |||
}) | |||
} else { | |||
ctx.JSON(http.StatusOK, getImagesResult.Payload) | |||
} | |||
log.Info("Get images end") | |||
} | |||
func getModelDirs(jobName string, parentDir string) (string, error) { | |||
var req string | |||
modelActualPath := setting.JobPath + jobName + "/model/" | |||
@@ -413,7 +460,7 @@ func CloudBrainDownloadModel(ctx *context.Context) { | |||
parentDir := ctx.Query("parentDir") | |||
fileName := ctx.Query("fileName") | |||
jobName := ctx.Query("jobName") | |||
filePath := "jobs/" +jobName + "/model/" + parentDir | |||
filePath := "jobs/" + jobName + "/model/" + parentDir | |||
url, err := storage.Attachments.PresignedGetURL(filePath, fileName) | |||
if err != nil { | |||
log.Error("PresignedGetURL failed: %v", err.Error(), ctx.Data["msgID"]) | |||
@@ -6,13 +6,14 @@ package routes | |||
import ( | |||
"bytes" | |||
"code.gitea.io/gitea/routers/secure" | |||
"encoding/gob" | |||
"net/http" | |||
"path" | |||
"text/template" | |||
"time" | |||
"code.gitea.io/gitea/routers/secure" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/auth" | |||
"code.gitea.io/gitea/modules/context" | |||
@@ -313,11 +314,14 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Get("", func(ctx *context.Context) { | |||
ctx.Redirect(setting.AppSubURL + "/explore/repos") | |||
}) | |||
m.Get("/images/public", repo.GetPublicImages) | |||
m.Get("/images/custom", repo.GetCustomImages) | |||
m.Get("/repos", routers.ExploreRepos) | |||
m.Get("/datasets", routers.ExploreDatasets) | |||
m.Get("/users", routers.ExploreUsers) | |||
m.Get("/organizations", routers.ExploreOrganizations) | |||
m.Get("/code", routers.ExploreCode) | |||
m.Get("/images", routers.ExploreImages) | |||
}, ignSignIn) | |||
m.Combo("/install", routers.InstallInit).Get(routers.Install). | |||
Post(bindIgnErr(auth.InstallForm{}), routers.InstallPost) | |||
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》