|
- 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,
- })
- }
-
- func FindAvailableSpecs(userId int64, opts models.FindSpecsOptions) ([]*models.Specification, error) {
- r, err := models.FindAvailableSpecs(opts)
- if err != nil {
- log.Error("FindAvailableSpecs error.%v", err)
- return nil, err
- }
- specs := make([]*models.Specification, 0, len(r))
- specMap := make(map[int64]string, 0)
- //filter exclusive spec
- 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] = ""
- }
- }
- }
- return specs, err
- }
-
- func GetAndCheckSpec(userId int64, specId int64, opts models.FindSpecsOptions) (*models.Specification, error) {
- if specId == 0 {
- return nil, nil
- }
- opts.SpecId = specId
- r, err := FindAvailableSpecs(userId, opts)
- if err != nil {
- return nil, err
- }
- if r == nil || len(r) == 0 {
- return nil, nil
- }
- return r[0], nil
- }
|