You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

resource_specification.go 5.7 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package resource
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/grampus"
  5. "code.gitea.io/gitea/modules/log"
  6. "code.gitea.io/gitea/routers/response"
  7. "code.gitea.io/gitea/services/admin/operate_log"
  8. "encoding/json"
  9. "fmt"
  10. "strings"
  11. )
  12. func AddResourceSpecification(doerId int64, req models.ResourceSpecificationReq) error {
  13. if req.Status == 0 {
  14. req.Status = models.SpecNotVerified
  15. }
  16. spec := req.ToDTO()
  17. if _, err := models.InsertResourceSpecification(spec); err != nil {
  18. return err
  19. }
  20. return nil
  21. }
  22. func UpdateResourceSpecification(doerId int64, specId int64, req models.ResourceSpecificationReq) *response.BizError {
  23. oldSpec, err := models.GetResourceSpecification(&models.ResourceSpecification{ID: specId})
  24. if err != nil {
  25. return response.NewBizError(err)
  26. }
  27. if oldSpec == nil {
  28. return response.SPECIFICATION_NOT_EXIST
  29. }
  30. n, err := models.UpdateResourceSpecificationById(specId, models.ResourceSpecification{
  31. UnitPrice: req.UnitPrice,
  32. })
  33. if err != nil {
  34. return response.NewBizError(err)
  35. }
  36. if n > 0 {
  37. newSpec, _ := models.GetResourceSpecification(&models.ResourceSpecification{ID: specId})
  38. AddSpecOperateLog(doerId, "edit", newSpec, oldSpec, fmt.Sprintf("修改单价从%d积分到%d积分", oldSpec.UnitPrice, newSpec.UnitPrice))
  39. }
  40. return nil
  41. }
  42. func SyncGrampusSpecs(doerId int64) error {
  43. r, err := grampus.GetResourceSpecs("")
  44. if err != nil {
  45. return err
  46. }
  47. specUpdateList := make([]models.ResourceSpecification, 0)
  48. specInsertList := make([]models.ResourceSpecification, 0)
  49. existIds := make([]int64, 0)
  50. for _, spec := range r.Infos {
  51. for _, c := range spec.Centers {
  52. computeResource := models.ParseComputeResourceFormGrampus(spec.SpecInfo.AccDeviceKind)
  53. if computeResource == "" {
  54. continue
  55. }
  56. accCardType := strings.ToUpper(spec.SpecInfo.AccDeviceModel)
  57. memGiB, err := models.ParseMemSizeFromGrampus(spec.SpecInfo.MemorySize)
  58. gpuMemGiB, err := models.ParseMemSizeFromGrampus(spec.SpecInfo.AccDeviceMemory)
  59. if err != nil {
  60. log.Error("ParseMemSizeFromGrampus error. MemorySize=%s AccDeviceMemory=%s", spec.SpecInfo.MemorySize, spec.SpecInfo.AccDeviceMemory)
  61. }
  62. // get resource queue.if queue not exist,skip it
  63. r, err := models.GetResourceQueue(&models.ResourceQueue{
  64. Cluster: models.C2NetCluster,
  65. AiCenterCode: c.ID,
  66. ComputeResource: computeResource,
  67. AccCardType: accCardType,
  68. })
  69. if err != nil || r == nil {
  70. continue
  71. }
  72. //Determine if this specification already exists.if exist,update params
  73. //if not exist,insert a new record and status is SpecNotVerified
  74. oldSpec, err := models.GetResourceSpecification(&models.ResourceSpecification{
  75. QueueId: r.ID,
  76. SourceSpecId: spec.ID,
  77. })
  78. if err != nil {
  79. return err
  80. }
  81. if oldSpec == nil {
  82. specInsertList = append(specInsertList, models.ResourceSpecification{
  83. QueueId: r.ID,
  84. SourceSpecId: spec.ID,
  85. AccCardsNum: spec.SpecInfo.AccDeviceNum,
  86. CpuCores: spec.SpecInfo.CpuCoreNum,
  87. MemGiB: memGiB,
  88. GPUMemGiB: gpuMemGiB,
  89. Status: models.SpecNotVerified,
  90. IsAutomaticSync: true,
  91. CreatedBy: doerId,
  92. UpdatedBy: doerId,
  93. })
  94. } else {
  95. existIds = append(existIds, oldSpec.ID)
  96. specUpdateList = append(specUpdateList, models.ResourceSpecification{
  97. ID: oldSpec.ID,
  98. AccCardsNum: spec.SpecInfo.AccDeviceNum,
  99. CpuCores: spec.SpecInfo.CpuCoreNum,
  100. MemGiB: memGiB,
  101. GPUMemGiB: gpuMemGiB,
  102. UpdatedBy: doerId,
  103. })
  104. }
  105. }
  106. }
  107. return models.SyncGrampusSpecs(specUpdateList, specInsertList, existIds)
  108. }
  109. //GetResourceSpecificationList returns specification and queue
  110. func GetResourceSpecificationList(opts models.SearchResourceSpecificationOptions) (*models.ResourceSpecAndQueueListRes, error) {
  111. n, r, err := models.SearchResourceSpecification(opts)
  112. if err != nil {
  113. return nil, err
  114. }
  115. return models.NewResourceSpecAndQueueListRes(n, r), nil
  116. }
  117. func GetResourceSpecificationScenes(specId int64) ([]models.ResourceSceneBriefRes, error) {
  118. r, err := models.GetSpecScenes(specId)
  119. if err != nil {
  120. return nil, err
  121. }
  122. return r, nil
  123. }
  124. func ResourceSpecOnShelf(doerId int64, id int64, req models.ResourceSpecificationReq) *response.BizError {
  125. spec, err := models.GetResourceSpecification(&models.ResourceSpecification{ID: id})
  126. if err != nil {
  127. return response.NewBizError(err)
  128. }
  129. if spec == nil {
  130. return response.SPECIFICATION_NOT_EXIST
  131. }
  132. if q, err := models.GetResourceQueue(&models.ResourceQueue{ID: spec.QueueId}); err != nil || q == nil {
  133. return response.RESOURCE_QUEUE_NOT_AVAILABLE
  134. }
  135. n, err := models.ResourceSpecOnShelf(id, models.ResourceSpecification{
  136. UnitPrice: req.UnitPrice,
  137. })
  138. if err != nil {
  139. return response.NewBizError(err)
  140. }
  141. if n > 0 {
  142. newSpec, _ := models.GetResourceSpecification(&models.ResourceSpecification{ID: id})
  143. AddSpecOperateLog(doerId, "on-shelf", newSpec, spec, fmt.Sprintf("修改单价从%d积分到%d积分", spec.UnitPrice, newSpec.UnitPrice))
  144. }
  145. return nil
  146. }
  147. func ResourceSpecOffShelf(doerId int64, id int64) *response.BizError {
  148. _, err := models.ResourceSpecOffShelf(id)
  149. if err != nil {
  150. return response.NewBizError(err)
  151. }
  152. return nil
  153. }
  154. func AddSpecOperateLog(doerId int64, operateType string, newSpec, oldSpec *models.ResourceSpecification, comment string) {
  155. newJson, _ := json.Marshal(newSpec)
  156. oldJson, _ := json.Marshal(oldSpec)
  157. operate_log.Log(models.AdminOperateLog{
  158. BizType: "SpecOperate",
  159. OperateType: operateType,
  160. OldValue: string(newJson),
  161. NewValue: string(oldJson),
  162. RelatedId: fmt.Sprint(newSpec.ID),
  163. Comment: comment,
  164. CreatedBy: doerId,
  165. })
  166. }