package service import ( "fmt" "gitlink.org.cn/JointCloud/pcm-coordinator/internal/config" "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database" "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service/collector" hpcservice "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service/hpc" "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types" "strconv" "sync" ) const ( PcmSlurm = "pcm-slurm" ) type HpcService struct { HpcExecutorAdapterMap map[string]collector.HPCCollector Storage *database.HpcStorage LocalCache map[string]interface{} Conf *config.Config TaskSyncLock sync.Mutex } // NewHpcService 创建并初始化HpcService实例 func NewHpcService(conf *config.Config, storages *database.HpcStorage, localCache map[string]interface{}) (*HpcService, error) { hpcService := &HpcService{ HpcExecutorAdapterMap: make(map[string]collector.HPCCollector), Storage: storages, LocalCache: localCache, Conf: conf, } if err := hpcService.initAdapters(); err != nil { return nil, err } return hpcService, nil } // initAdapters 初始化所有适配器 func (s *HpcService) initAdapters() error { adapters, err := s.loadAdapters() if err != nil { return err } for _, adapter := range adapters { if err := s.processAdapter(*adapter); err != nil { return err } } return nil } // loadAdapters 从存储中加载适配器 func (s *HpcService) loadAdapters() ([]*types.AdapterInfo, error) { const aiType = "2" return s.Storage.GetAdaptersByType(aiType) } // processAdapter 处理单个适配器 func (s *HpcService) processAdapter(adapter types.AdapterInfo) error { if adapter.Id == "" { return nil } executor, err := s.createExecutor(adapter) if err != nil { return err } if executor != nil { s.HpcExecutorAdapterMap[adapter.Id] = executor } return nil } // createExecutor 根据适配器类型创建对应的执行器 func (s *HpcService) createExecutor(adapter types.AdapterInfo) (collector.HPCCollector, error) { switch adapter.Nickname { case PcmSlurm: return s.CreateSlurmExecutor(adapter) // 可以在这里添加其他类型的适配器 default: return nil, nil // 或者返回错误,取决于业务需求 } } // CreateSlurmExecutor 创建Slurm执行器 func (s *HpcService) CreateSlurmExecutor(adapter types.AdapterInfo) (collector.HPCCollector, error) { id, err := strconv.ParseInt(adapter.Id, 10, 64) if err != nil { return nil, fmt.Errorf("failed to parse adapter ID %s: %v", adapter.Id, err) } return hpcservice.NewHpc(adapter.Server, id, adapter.Nickname), nil }