package resource import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/grampus" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/routers/response" "code.gitea.io/gitea/services/admin/operate_log" "encoding/json" "fmt" "strings" ) func AddResourceSpecification(doerId int64, req models.ResourceSpecificationReq) error { if req.Status == 0 { req.Status = models.SpecNotVerified } spec := req.ToDTO() if _, err := models.InsertResourceSpecification(spec); err != nil { return err } return nil } func UpdateResourceSpecification(doerId int64, specId int64, req models.ResourceSpecificationReq) *response.BizError { oldSpec, err := models.GetResourceSpecification(&models.ResourceSpecification{ID: specId}) if err != nil { return response.NewBizError(err) } if oldSpec == nil { return response.SPECIFICATION_NOT_EXIST } n, err := models.UpdateResourceSpecificationById(specId, models.ResourceSpecification{ UnitPrice: req.UnitPrice, }) if err != nil { return response.NewBizError(err) } if n > 0 { newSpec, _ := models.GetResourceSpecification(&models.ResourceSpecification{ID: specId}) AddSpecOperateLog(doerId, "edit", newSpec, oldSpec, fmt.Sprintf("修改单价从%d积分到%d积分", oldSpec.UnitPrice, newSpec.UnitPrice)) } return nil } func SyncGrampusSpecs(doerId int64) error { r, err := grampus.GetResourceSpecs("") if err != nil { return err } specUpdateList := make([]models.ResourceSpecification, 0) specInsertList := make([]models.ResourceSpecification, 0) existIds := make([]int64, 0) for _, spec := range r.Infos { for _, c := range spec.Centers { computeResource := models.ParseComputeResourceFormGrampus(spec.SpecInfo.AccDeviceKind) if computeResource == "" { continue } accCardType := strings.ToUpper(spec.SpecInfo.AccDeviceModel) memGiB, err := models.ParseMemSizeFromGrampus(spec.SpecInfo.MemorySize) gpuMemGiB, err := models.ParseMemSizeFromGrampus(spec.SpecInfo.AccDeviceMemory) if err != nil { log.Error("ParseMemSizeFromGrampus error. MemorySize=%s AccDeviceMemory=%s", spec.SpecInfo.MemorySize, spec.SpecInfo.AccDeviceMemory) } // get resource queue.if queue not exist,skip it r, err := models.GetResourceQueue(&models.ResourceQueue{ Cluster: models.C2NetCluster, AiCenterCode: c.ID, ComputeResource: computeResource, AccCardType: accCardType, }) if err != nil || r == nil { continue } //Determine if this specification already exists.if exist,update params //if not exist,insert a new record and status is SpecNotVerified oldSpec, err := models.GetResourceSpecification(&models.ResourceSpecification{ QueueId: r.ID, SourceSpecId: spec.ID, }) if err != nil { return err } if oldSpec == nil { specInsertList = append(specInsertList, models.ResourceSpecification{ QueueId: r.ID, SourceSpecId: spec.ID, AccCardsNum: spec.SpecInfo.AccDeviceNum, CpuCores: spec.SpecInfo.CpuCoreNum, MemGiB: memGiB, GPUMemGiB: gpuMemGiB, Status: models.SpecNotVerified, IsAutomaticSync: true, CreatedBy: doerId, UpdatedBy: doerId, }) } else { existIds = append(existIds, oldSpec.ID) specUpdateList = append(specUpdateList, models.ResourceSpecification{ ID: oldSpec.ID, AccCardsNum: spec.SpecInfo.AccDeviceNum, CpuCores: spec.SpecInfo.CpuCoreNum, MemGiB: memGiB, GPUMemGiB: gpuMemGiB, UpdatedBy: doerId, }) } } } return models.SyncGrampusSpecs(specUpdateList, specInsertList, existIds) } //GetResourceSpecificationList returns specification and queue func GetResourceSpecificationList(opts models.SearchResourceSpecificationOptions) (*models.ResourceSpecAndQueueListRes, error) { n, r, err := models.SearchResourceSpecification(opts) if err != nil { return nil, err } return models.NewResourceSpecAndQueueListRes(n, r), nil } func GetResourceSpecificationScenes(specId int64) ([]models.ResourceSceneBriefRes, error) { r, err := models.GetSpecScenes(specId) if err != nil { return nil, err } return r, nil } func ResourceSpecOnShelf(doerId int64, id int64, req models.ResourceSpecificationReq) *response.BizError { spec, err := models.GetResourceSpecification(&models.ResourceSpecification{ID: id}) if err != nil { return response.NewBizError(err) } if spec == nil { return response.SPECIFICATION_NOT_EXIST } if q, err := models.GetResourceQueue(&models.ResourceQueue{ID: spec.QueueId}); err != nil || q == nil { return response.RESOURCE_QUEUE_NOT_AVAILABLE } n, err := models.ResourceSpecOnShelf(id, models.ResourceSpecification{ UnitPrice: req.UnitPrice, }) if err != nil { return response.NewBizError(err) } if n > 0 { newSpec, _ := models.GetResourceSpecification(&models.ResourceSpecification{ID: id}) AddSpecOperateLog(doerId, "on-shelf", newSpec, spec, fmt.Sprintf("修改单价从%d积分到%d积分", spec.UnitPrice, newSpec.UnitPrice)) } return nil } func ResourceSpecOffShelf(doerId int64, id int64) *response.BizError { _, err := models.ResourceSpecOffShelf(id) if err != nil { return response.NewBizError(err) } return nil } func AddSpecOperateLog(doerId int64, operateType string, newSpec, oldSpec *models.ResourceSpecification, comment string) { newJson, _ := json.Marshal(newSpec) oldJson, _ := json.Marshal(oldSpec) operate_log.Log(models.AdminOperateLog{ BizType: "SpecOperate", OperateType: operateType, OldValue: string(newJson), NewValue: string(oldJson), RelatedId: fmt.Sprint(newSpec.ID), Comment: comment, CreatedBy: doerId, }) }