| @@ -183,6 +183,17 @@ func GetWaittingTop() ([]*CloudbrainInfo, error) { | |||
| Find(&cloudbrains); err != nil { | |||
| log.Info("find error.") | |||
| } | |||
| var ids []int64 | |||
| for _, task := range cloudbrains { | |||
| ids = append(ids, task.RepoID) | |||
| } | |||
| repositoryMap, err := GetRepositoriesMapByIDs(ids) | |||
| if err == nil { | |||
| for _, task := range cloudbrains { | |||
| task.Repo = repositoryMap[task.RepoID] | |||
| } | |||
| } | |||
| return cloudbrains, nil | |||
| } | |||
| @@ -199,6 +210,16 @@ func GetRunningTop() ([]*CloudbrainInfo, error) { | |||
| Find(&cloudbrains); err != nil { | |||
| log.Info("find error.") | |||
| } | |||
| var ids []int64 | |||
| for _, task := range cloudbrains { | |||
| ids = append(ids, task.RepoID) | |||
| } | |||
| repositoryMap, err := GetRepositoriesMapByIDs(ids) | |||
| if err == nil { | |||
| for _, task := range cloudbrains { | |||
| task.Repo = repositoryMap[task.RepoID] | |||
| } | |||
| } | |||
| return cloudbrains, nil | |||
| } | |||
| @@ -3,6 +3,7 @@ package models | |||
| import ( | |||
| "code.gitea.io/gitea/modules/timeutil" | |||
| "fmt" | |||
| "strings" | |||
| "xorm.io/builder" | |||
| ) | |||
| @@ -197,12 +198,104 @@ type Specification struct { | |||
| AiCenterName string | |||
| IsExclusive bool | |||
| ExclusiveOrg string | |||
| //specs that have the same sourceSpecId, computeResource and cluster as current spec | |||
| RelatedSpecs []*Specification | |||
| } | |||
| func (Specification) TableName() string { | |||
| return "resource_specification" | |||
| } | |||
| func (s *Specification) loadRelatedSpecs() { | |||
| if s.RelatedSpecs != nil { | |||
| return | |||
| } | |||
| defaultSpecs := make([]*Specification, 0) | |||
| if s.SourceSpecId == "" { | |||
| s.RelatedSpecs = defaultSpecs | |||
| return | |||
| } | |||
| r, err := FindSpecs(FindSpecsOptions{ | |||
| ComputeResource: s.ComputeResource, | |||
| Cluster: s.Cluster, | |||
| SourceSpecId: s.SourceSpecId, | |||
| RequestAll: true, | |||
| SpecStatus: SpecOnShelf, | |||
| }) | |||
| if err != nil { | |||
| s.RelatedSpecs = defaultSpecs | |||
| return | |||
| } | |||
| s.RelatedSpecs = r | |||
| } | |||
| func (s *Specification) GetAvailableCenterIds(userIds ...int64) []string { | |||
| s.loadRelatedSpecs() | |||
| if len(s.RelatedSpecs) == 0 { | |||
| return make([]string, 0) | |||
| } | |||
| var uId int64 | |||
| if len(userIds) > 0 { | |||
| uId = userIds[0] | |||
| } | |||
| //filter exclusive specs | |||
| specs := FilterExclusiveSpecs(s.RelatedSpecs, uId) | |||
| centerIds := make([]string, len(specs)) | |||
| for i, v := range specs { | |||
| centerIds[i] = v.AiCenterCode | |||
| } | |||
| return centerIds | |||
| } | |||
| func FilterExclusiveSpecs(r []*Specification, userId int64) []*Specification { | |||
| if userId == 0 { | |||
| return r | |||
| } | |||
| specs := make([]*Specification, 0, len(r)) | |||
| specMap := make(map[int64]string, 0) | |||
| for i := 0; i < len(r); i++ { | |||
| spec := r[i] | |||
| if _, has := specMap[spec.ID]; has { | |||
| continue | |||
| } | |||
| if !spec.IsExclusive { | |||
| specs = append(specs, spec) | |||
| specMap[spec.ID] = "" | |||
| continue | |||
| } | |||
| orgs := strings.Split(spec.ExclusiveOrg, ";") | |||
| for _, org := range orgs { | |||
| isMember, _ := IsOrganizationMemberByOrgName(org, userId) | |||
| if isMember { | |||
| specs = append(specs, spec) | |||
| specMap[spec.ID] = "" | |||
| break | |||
| } | |||
| } | |||
| } | |||
| return specs | |||
| } | |||
| func DistinctSpecs(r []*Specification) []*Specification { | |||
| specs := make([]*Specification, 0, len(r)) | |||
| sourceSpecIdMap := make(map[string]string, 0) | |||
| for i := 0; i < len(r); i++ { | |||
| spec := r[i] | |||
| if spec.SourceSpecId == "" { | |||
| specs = append(specs, spec) | |||
| continue | |||
| } | |||
| if _, has := sourceSpecIdMap[spec.SourceSpecId]; has { | |||
| continue | |||
| } | |||
| specs = append(specs, spec) | |||
| sourceSpecIdMap[spec.SourceSpecId] = "" | |||
| } | |||
| return specs | |||
| } | |||
| func InsertResourceSpecification(r ResourceSpecification) (int64, error) { | |||
| return x.Insert(&r) | |||
| } | |||
| @@ -104,6 +104,7 @@ func ToSpecification(s *models.Specification) *api.SpecificationShow { | |||
| func ToTagger(user *models.User) *api.Tagger { | |||
| return &api.Tagger{ | |||
| ID: user.ID, | |||
| Name: user.Name, | |||
| RelAvatarURL: user.RelAvatarLink(), | |||
| Email: user.Email, | |||
| @@ -105,8 +105,6 @@ func getDatasetGrampus(datasetInfos map[string]models.DatasetInfo) []models.Gram | |||
| func GenerateTrainJob(ctx *context.Context, req *GenerateTrainJobReq) (jobId string, err error) { | |||
| createTime := timeutil.TimeStampNow() | |||
| centerID, centerName := getCentersParamter(ctx, req) | |||
| var datasetGrampus, modelGrampus []models.GrampusDataset | |||
| var codeGrampus models.GrampusDataset | |||
| if ProcessorTypeNPU == req.ProcessType { | |||
| @@ -138,8 +136,7 @@ func GenerateTrainJob(ctx *context.Context, req *GenerateTrainJobReq) (jobId str | |||
| ResourceSpecId: req.Spec.SourceSpecId, | |||
| ImageId: req.ImageId, | |||
| ImageUrl: req.ImageUrl, | |||
| CenterID: centerID, | |||
| CenterName: centerName, | |||
| CenterID: req.Spec.GetAvailableCenterIds(ctx.User.ID), | |||
| ReplicaNum: 1, | |||
| Datasets: datasetGrampus, | |||
| Models: modelGrampus, | |||
| @@ -1,6 +1,7 @@ | |||
| package structs | |||
| type Tagger struct { | |||
| ID int64 `json:"id"` | |||
| Name string `json:"name"` | |||
| Email string `json:"email"` | |||
| RelAvatarURL string `json:"relAvatarURL"` | |||
| @@ -738,7 +738,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| }, reqToken(), repoAssignment()) | |||
| m.Group("/file_notebook", func() { | |||
| m.Get("", reqToken(), repo.GetFileNoteBookInfo) | |||
| m.Get("", repo.GetFileNoteBookInfo) | |||
| m.Post("/create", reqToken(), reqWeChat(), bind(api.CreateFileNotebookJobOption{}), repo.CreateFileNoteBook) | |||
| }) | |||
| @@ -968,6 +968,8 @@ func GetWaittingTop(ctx *context.Context) { | |||
| taskDetail.RepoID = ciTasks[i].RepoID | |||
| if ciTasks[i].Repo != nil { | |||
| taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name | |||
| } else { | |||
| taskDetail.RepoName = "" | |||
| } | |||
| WaitTimeInt := time.Now().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix() | |||
| taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt) | |||
| @@ -975,6 +977,13 @@ func GetWaittingTop(ctx *context.Context) { | |||
| if WaitTimeInt < 0 { | |||
| taskDetail.WaitTime = "00:00:00" | |||
| } | |||
| taskDetail.ID = ciTasks[i].Cloudbrain.ID | |||
| taskDetail.ComputeResource = ciTasks[i].Cloudbrain.ComputeResource | |||
| taskDetail.JobType = ciTasks[i].Cloudbrain.JobType | |||
| taskDetail.JobID = ciTasks[i].Cloudbrain.JobID | |||
| taskDetail.Type = ciTasks[i].Cloudbrain.Type | |||
| tasks = append(tasks, taskDetail) | |||
| } | |||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
| @@ -1001,6 +1010,12 @@ func GetRunningTop(ctx *context.Context) { | |||
| taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name | |||
| } | |||
| taskDetail.ID = ciTasks[i].Cloudbrain.ID | |||
| taskDetail.ComputeResource = ciTasks[i].Cloudbrain.ComputeResource | |||
| taskDetail.JobType = ciTasks[i].Cloudbrain.JobType | |||
| taskDetail.JobID = ciTasks[i].Cloudbrain.JobID | |||
| taskDetail.Type = ciTasks[i].Cloudbrain.Type | |||
| tasks = append(tasks, taskDetail) | |||
| } | |||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
| @@ -246,10 +246,10 @@ func FindAvailableSpecs(userId int64, opts models.FindSpecsOptions) ([]*models.S | |||
| return nil, err | |||
| } | |||
| //filter exclusive specs | |||
| specs := filterExclusiveSpecs(r, userId) | |||
| specs := models.FilterExclusiveSpecs(r, userId) | |||
| //distinct by sourceSpecId | |||
| specs = distinctSpecs(specs) | |||
| specs = models.DistinctSpecs(specs) | |||
| return specs, err | |||
| } | |||
| @@ -265,50 +265,6 @@ func FindAvailableSpecs4Show(userId int64, opts models.FindSpecsOptions) ([]*api | |||
| return result, nil | |||
| } | |||
| func filterExclusiveSpecs(r []*models.Specification, userId int64) []*models.Specification { | |||
| specs := make([]*models.Specification, 0, len(r)) | |||
| specMap := make(map[int64]string, 0) | |||
| for i := 0; i < len(r); i++ { | |||
| spec := r[i] | |||
| if _, has := specMap[spec.ID]; has { | |||
| continue | |||
| } | |||
| if !spec.IsExclusive { | |||
| specs = append(specs, spec) | |||
| specMap[spec.ID] = "" | |||
| continue | |||
| } | |||
| orgs := strings.Split(spec.ExclusiveOrg, ";") | |||
| for _, org := range orgs { | |||
| isMember, _ := models.IsOrganizationMemberByOrgName(org, userId) | |||
| if isMember { | |||
| specs = append(specs, spec) | |||
| specMap[spec.ID] = "" | |||
| break | |||
| } | |||
| } | |||
| } | |||
| return specs | |||
| } | |||
| func distinctSpecs(r []*models.Specification) []*models.Specification { | |||
| specs := make([]*models.Specification, 0, len(r)) | |||
| sourceSpecIdMap := make(map[string]string, 0) | |||
| for i := 0; i < len(r); i++ { | |||
| spec := r[i] | |||
| if spec.SourceSpecId == "" { | |||
| specs = append(specs, spec) | |||
| continue | |||
| } | |||
| if _, has := sourceSpecIdMap[spec.SourceSpecId]; has { | |||
| continue | |||
| } | |||
| specs = append(specs, spec) | |||
| sourceSpecIdMap[spec.SourceSpecId] = "" | |||
| } | |||
| return specs | |||
| } | |||
| func GetAndCheckSpec(userId int64, specId int64, opts models.FindSpecsOptions) (*models.Specification, error) { | |||
| if specId == 0 { | |||
| return nil, nil | |||