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.

queryresourceslogic.go 3.7 kB

11 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package schedule
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/zeromicro/go-zero/core/logx"
  6. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service/collector"
  7. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/storeLink"
  8. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
  9. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
  10. "strconv"
  11. "strings"
  12. "sync"
  13. "time"
  14. )
  15. const (
  16. ADAPTERID = "1777144940459986944" // 异构适配器id
  17. )
  18. type QueryResourcesLogic struct {
  19. logx.Logger
  20. ctx context.Context
  21. svcCtx *svc.ServiceContext
  22. }
  23. func NewQueryResourcesLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryResourcesLogic {
  24. return &QueryResourcesLogic{
  25. Logger: logx.WithContext(ctx),
  26. ctx: ctx,
  27. svcCtx: svcCtx,
  28. }
  29. }
  30. func (l *QueryResourcesLogic) QueryResources(req *types.QueryResourcesReq) (resp *types.QueryResourcesResp, err error) {
  31. resp = &types.QueryResourcesResp{}
  32. rus, err := l.queryResources(req.ClusterIDs)
  33. if err != nil {
  34. return nil, err
  35. }
  36. resp.Data = rus
  37. return resp, nil
  38. }
  39. func (l *QueryResourcesLogic) queryResources(clusterIds []string) ([]*collector.ResourceSpec, error) {
  40. var ulist []*collector.ResourceSpec
  41. var clusters []types.ClusterInfo
  42. if len(clusterIds) != 0 {
  43. for _, id := range clusterIds {
  44. cluster, err := l.svcCtx.Scheduler.AiStorages.GetClustersById(id)
  45. if err != nil {
  46. return nil, err
  47. }
  48. clusters = append(clusters, *cluster)
  49. }
  50. } else {
  51. cs, err := l.svcCtx.Scheduler.AiStorages.GetClustersByAdapterId(ADAPTERID)
  52. if err != nil {
  53. return nil, err
  54. }
  55. clusters = cs.List
  56. }
  57. if len(clusters) == 0 {
  58. return nil, errors.New("no clusters found ")
  59. }
  60. var ch = make(chan *collector.ResourceSpec, len(clusters))
  61. var wg sync.WaitGroup
  62. for _, cluster := range clusters {
  63. wg.Add(1)
  64. c := cluster
  65. go func() {
  66. defer wg.Done()
  67. done := make(chan bool)
  68. var u *collector.ResourceSpec
  69. var err error
  70. go func() {
  71. col, found := l.svcCtx.Scheduler.AiService.AiCollectorAdapterMap[strconv.FormatInt(c.AdapterId, 10)][c.Id]
  72. if !found {
  73. done <- true
  74. return
  75. }
  76. u, err = col.GetResourceSpecs(l.ctx)
  77. if err != nil {
  78. done <- true
  79. return
  80. }
  81. done <- true
  82. }()
  83. select {
  84. case <-done:
  85. ch <- u
  86. case <-time.After(10 * time.Second):
  87. return
  88. }
  89. }()
  90. }
  91. wg.Wait()
  92. close(ch)
  93. for v := range ch {
  94. ulist = append(ulist, v)
  95. }
  96. // handle empty usage
  97. return handleEmptyResourceUsage(clusters, ulist), nil
  98. }
  99. func handleEmptyResourceUsage(list []types.ClusterInfo, ulist []*collector.ResourceSpec) []*collector.ResourceSpec {
  100. var rus []*collector.ResourceSpec
  101. m := make(map[string]interface{})
  102. for _, u := range ulist {
  103. if u == nil {
  104. continue
  105. }
  106. m[u.ClusterId] = u
  107. }
  108. for _, l := range list {
  109. s, ok := m[l.Id]
  110. if !ok {
  111. ru := &collector.ResourceSpec{
  112. ClusterId: l.Id,
  113. Resources: nil,
  114. Msg: "resources unavailable, please retry later",
  115. }
  116. rus = append(rus, ru)
  117. } else {
  118. if s == nil {
  119. ru := &collector.ResourceSpec{
  120. ClusterId: l.Id,
  121. Resources: nil,
  122. Msg: "resources unavailable, please retry later",
  123. }
  124. rus = append(rus, ru)
  125. } else {
  126. r, ok := s.(*collector.ResourceSpec)
  127. if ok {
  128. if r.Resources == nil {
  129. ru := &collector.ResourceSpec{
  130. ClusterId: r.ClusterId,
  131. Resources: nil,
  132. Msg: "resources unavailable, please retry later",
  133. }
  134. rus = append(rus, ru)
  135. } else {
  136. // add cluster type
  137. t, ok := storeLink.ClusterTypeMap[strings.Title(l.Name)]
  138. if ok {
  139. r.ClusterType = t
  140. }
  141. rus = append(rus, r)
  142. }
  143. }
  144. }
  145. }
  146. }
  147. return rus
  148. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.