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