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