github.com/gocrane/crane@v0.11.0/pkg/recommendation/recommender/recommenders.go (about) 1 package recommender 2 3 import ( 4 "fmt" 5 "sync" 6 7 "k8s.io/klog/v2" 8 9 analysisv1alph1 "github.com/gocrane/api/analysis/v1alpha1" 10 "github.com/gocrane/crane/pkg/recommendation/recommender/apis" 11 ) 12 13 type Factory func(apis.Recommender, analysisv1alph1.RecommendationRule) (Recommender, error) 14 15 // All registered Recommender providers. 16 var ( 17 providersMutex sync.Mutex 18 providers = make(map[string]Factory) 19 ) 20 21 // RegisterRecommenderProvider registers a recommender.Factory by name. This 22 // is expected to happen during app startup. 23 func RegisterRecommenderProvider(name string, recommender Factory) { 24 providersMutex.Lock() 25 defer providersMutex.Unlock() 26 if _, found := providers[name]; found { 27 klog.Fatalf("recommender provider %q was registered twice", name) 28 } 29 klog.V(1).Infof("Registered recommender provider %q", name) 30 providers[name] = recommender 31 } 32 33 // GetRecommenderProvider creates an instance of the named Recommender provider, or nil if 34 // the name is unknown. The error return is only used if the named provider 35 // was known but failed to initialize. 36 func GetRecommenderProvider(recommenderName string, recommender apis.Recommender, recommendationRule analysisv1alph1.RecommendationRule) (Recommender, error) { 37 providersMutex.Lock() 38 defer providersMutex.Unlock() 39 f, found := providers[recommenderName] 40 if !found { 41 return nil, fmt.Errorf("unknown recommender name: %s", recommenderName) 42 } 43 return f(recommender, recommendationRule) 44 }