diff --git a/models/resource_queue.go b/models/resource_queue.go index cd42e2cb2..50fe08b36 100644 --- a/models/resource_queue.go +++ b/models/resource_queue.go @@ -2,6 +2,8 @@ package models import ( "code.gitea.io/gitea/modules/timeutil" + "errors" + "strconv" "strings" "xorm.io/builder" ) @@ -197,9 +199,74 @@ func ParseComputeResourceFormGrampus(grampusDeviceKind string) string { return strings.ToUpper(t[1]) } -func ParseMemSizeFromGrampus(grampusMemSize string) float32 { +type MemSize struct { + Sizes []string + Hex int +} + +var memSize = MemSize{Sizes: []string{"K", "M", "G", "T", "P", "E"}, Hex: 1000} +var iMemSize = MemSize{Sizes: []string{"Ki", "Mi", "Gi", "Ti", "Pi", "Ei"}, Hex: 1024} + +func MatchMemSize(memSize MemSize, val string) (int, float32, error) { + for i, v := range memSize.Sizes { + if strings.HasSuffix(val, v) { + s := strings.TrimSuffix(val, v) + f, err := strconv.ParseFloat(s, 32) + if err != nil { + return 0, 0, err + } + return i, float32(f), nil + } + } + return -1, 0, nil +} + +//TransferMemSize transfer oldValue format from old index to new index +//eg: memSize.Sizes = []string{"M", "G", "T", "P", "E"}, oldValue = 10 , oldIndex = 1 , newIndex = 0. it means transfer 10G to 10000M +//so it returns 10000 +func TransferMemSize(memSize MemSize, oldValue float32, oldIndex int, newIndex int) float32 { + diff := oldIndex - newIndex + r := oldValue + if diff > 0 { + r = oldValue * float32(diff) * float32(memSize.Hex) + } else if diff < 0 { + r = oldValue / float32(-1*diff) / float32(memSize.Hex) + } + return r +} - return 0 +//ParseMemSize find the memSize which matches value's format,and parse the number from value +func ParseMemSize(value string, memSize MemSize, newIndex int) (bool, float32, error) { + index, r, err := MatchMemSize(memSize, value) + if err != nil { + return false, 0, err + } + if index < 0 { + return false, 0, nil + } + return true, TransferMemSize(memSize, r, index, newIndex), nil +} + +func ParseMemSizeFromGrampus(grampusMemSize string) (float32, error) { + if grampusMemSize == "" { + return 0, nil + } + memflag, memResult, err := ParseMemSize(grampusMemSize, memSize, 2) + if err != nil { + return 0, err + } + if memflag { + return memResult, nil + } + + iMemFlag, imemResult, err := ParseMemSize(grampusMemSize, iMemSize, 2) + if err != nil { + return 0, err + } + if iMemFlag { + return imemResult, nil + } + return 0, errors.New("grampus memSize format error") } func SyncGrampusQueues(updateList []ResourceQueue, insertList []ResourceQueue, existIds []int64) error { diff --git a/services/cloudbrain/resource/resource_specification.go b/services/cloudbrain/resource/resource_specification.go index e7a6ae54d..1b327aa59 100644 --- a/services/cloudbrain/resource/resource_specification.go +++ b/services/cloudbrain/resource/resource_specification.go @@ -3,6 +3,7 @@ package resource import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/grampus" + "code.gitea.io/gitea/modules/log" "errors" "strings" ) @@ -41,6 +42,11 @@ func SyncGrampusSpecs(doerId int64) error { 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, @@ -68,8 +74,8 @@ func SyncGrampusSpecs(doerId int64) error { SourceSpecId: spec.ID, AccCardsNum: spec.SpecInfo.AccDeviceNum, CpuCores: spec.SpecInfo.CpuCoreNum, - MemGiB: models.ParseMemSizeFromGrampus(spec.SpecInfo.MemorySize), - GPUMemGiB: models.ParseMemSizeFromGrampus(spec.SpecInfo.AccDeviceMemory), + MemGiB: memGiB, + GPUMemGiB: gpuMemGiB, Status: models.SpecNotVerified, IsAutomaticSync: true, CreatedBy: doerId, @@ -81,8 +87,8 @@ func SyncGrampusSpecs(doerId int64) error { ID: oldSpec.ID, AccCardsNum: spec.SpecInfo.AccDeviceNum, CpuCores: spec.SpecInfo.CpuCoreNum, - MemGiB: models.ParseMemSizeFromGrampus(spec.SpecInfo.MemorySize), - GPUMemGiB: models.ParseMemSizeFromGrampus(spec.SpecInfo.AccDeviceMemory), + MemGiB: memGiB, + GPUMemGiB: gpuMemGiB, UpdatedBy: doerId, }) }