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.

hpc_service.go 2.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package service
  2. import (
  3. "fmt"
  4. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/config"
  5. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database"
  6. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service/collector"
  7. hpcservice "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service/hpc"
  8. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
  9. "strconv"
  10. "sync"
  11. )
  12. const (
  13. PcmSlurm = "pcm-slurm"
  14. )
  15. type HpcService struct {
  16. HpcExecutorAdapterMap map[string]collector.HPCCollector
  17. Storage *database.HpcStorage
  18. LocalCache map[string]interface{}
  19. Conf *config.Config
  20. TaskSyncLock sync.Mutex
  21. }
  22. // NewHpcService 创建并初始化HpcService实例
  23. func NewHpcService(conf *config.Config, storages *database.HpcStorage, localCache map[string]interface{}) (*HpcService, error) {
  24. hpcService := &HpcService{
  25. HpcExecutorAdapterMap: make(map[string]collector.HPCCollector),
  26. Storage: storages,
  27. LocalCache: localCache,
  28. Conf: conf,
  29. }
  30. if err := hpcService.initAdapters(); err != nil {
  31. return nil, err
  32. }
  33. return hpcService, nil
  34. }
  35. // initAdapters 初始化所有适配器
  36. func (s *HpcService) initAdapters() error {
  37. adapters, err := s.loadAdapters()
  38. if err != nil {
  39. return err
  40. }
  41. for _, adapter := range adapters {
  42. if err := s.processAdapter(*adapter); err != nil {
  43. return err
  44. }
  45. }
  46. return nil
  47. }
  48. // loadAdapters 从存储中加载适配器
  49. func (s *HpcService) loadAdapters() ([]*types.AdapterInfo, error) {
  50. const aiType = "2"
  51. return s.Storage.GetAdaptersByType(aiType)
  52. }
  53. // processAdapter 处理单个适配器
  54. func (s *HpcService) processAdapter(adapter types.AdapterInfo) error {
  55. if adapter.Id == "" {
  56. return nil
  57. }
  58. executor, err := s.createExecutor(adapter)
  59. if err != nil {
  60. return err
  61. }
  62. if executor != nil {
  63. s.HpcExecutorAdapterMap[adapter.Id] = executor
  64. }
  65. return nil
  66. }
  67. // createExecutor 根据适配器类型创建对应的执行器
  68. func (s *HpcService) createExecutor(adapter types.AdapterInfo) (collector.HPCCollector, error) {
  69. switch adapter.Nickname {
  70. case PcmSlurm:
  71. return s.CreateSlurmExecutor(adapter)
  72. // 可以在这里添加其他类型的适配器
  73. default:
  74. return nil, nil // 或者返回错误,取决于业务需求
  75. }
  76. }
  77. // CreateSlurmExecutor 创建Slurm执行器
  78. func (s *HpcService) CreateSlurmExecutor(adapter types.AdapterInfo) (collector.HPCCollector, error) {
  79. id, err := strconv.ParseInt(adapter.Id, 10, 64)
  80. if err != nil {
  81. return nil, fmt.Errorf("failed to parse adapter ID %s: %v", adapter.Id, err)
  82. }
  83. return hpcservice.NewHpc(adapter.Server, id, adapter.Nickname), nil
  84. }

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.