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  }