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" "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 UpdateSpecUnitPrice(doerId int64, specId int64, unitPrice int) *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 } err = models.UpdateSpecUnitPriceById(specId, unitPrice) if err != nil { return response.NewBizError(err) } if oldSpec.UnitPrice != unitPrice { AddSpecOperateLog(doerId, "edit", operate_log.NewLogValues().Add("unitPrice", unitPrice), operate_log.NewLogValues().Add("unitPrice", oldSpec.UnitPrice), specId, fmt.Sprintf("修改资源规格单价从%d积分到%d积分", oldSpec.UnitPrice, unitPrice)) } return nil } func SyncGrampusSpecs(doerId int64) error { r, err := grampus.GetResourceSpecs("") if err != nil { return err } log.Info("SyncGrampusSpecs result = %+v", r) 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, unitPrice int) *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 } err = models.ResourceSpecOnShelf(id, unitPrice) if err != nil { return response.NewBizError(err) } if spec.UnitPrice != unitPrice { AddSpecOperateLog(doerId, "on-shelf", operate_log.NewLogValues().Add("UnitPrice", unitPrice), operate_log.NewLogValues().Add("UnitPrice", spec.UnitPrice), id, fmt.Sprintf("定价上架资源规格,单价为%d", unitPrice)) } else { AddSpecOperateLog(doerId, "on-shelf", nil, nil, id, "上架资源规格") } return nil } func ResourceSpecOffShelf(doerId int64, id int64) *response.BizError { _, err := models.ResourceSpecOffShelf(id) if err != nil { return response.NewBizError(err) } AddSpecOperateLog(doerId, "off-shelf", nil, nil, id, "下架资源规格") return nil } func AddSpecOperateLog(doerId int64, operateType string, newValue, oldValue *models.LogValues, specId int64, comment string) { var newString = "" var oldString = "" if newValue != nil { newString = newValue.JsonString() } if oldValue != nil { oldString = oldValue.JsonString() } operate_log.Log(models.AdminOperateLog{ BizType: "SpecOperate", OperateType: operateType, OldValue: oldString, NewValue: newString, RelatedId: fmt.Sprint(specId), CreatedBy: doerId, Comment: comment, }) }