88 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
package runtime
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"k8s.io/apimachinery/pkg/util/sets"
 | 
						|
	"k8s.io/klog/v2"
 | 
						|
 | 
						|
	"github.com/karmada-io/karmada/pkg/scheduler/framework"
 | 
						|
)
 | 
						|
 | 
						|
// PluginFactory is a function that builds a plugin.
 | 
						|
type PluginFactory = func() (framework.Plugin, error)
 | 
						|
 | 
						|
// Registry is a collection of all available plugins. The framework uses a
 | 
						|
// registry to enable and initialize configured plugins.
 | 
						|
// All plugins must be in the registry before initializing the framework.
 | 
						|
type Registry map[string]PluginFactory
 | 
						|
 | 
						|
// Register adds a new plugin to the registry. If a plugin with the same name
 | 
						|
// exists, it returns an error.
 | 
						|
func (r Registry) Register(name string, factory PluginFactory) error {
 | 
						|
	if _, ok := r[name]; ok {
 | 
						|
		return fmt.Errorf("a plugin named %v already exists", name)
 | 
						|
	}
 | 
						|
	r[name] = factory
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// Unregister removes an existing plugin from the registry. If no plugin with
 | 
						|
// the provided name exists, it returns an error.
 | 
						|
func (r Registry) Unregister(name string) error {
 | 
						|
	if _, ok := r[name]; !ok {
 | 
						|
		return fmt.Errorf("no plugin named %v exists", name)
 | 
						|
	}
 | 
						|
	delete(r, name)
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// Merge merges the provided registry to the current one.
 | 
						|
func (r Registry) Merge(in Registry) error {
 | 
						|
	for name, factory := range in {
 | 
						|
		if err := r.Register(name, factory); err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// FactoryNames returns all known plugin names
 | 
						|
func (r Registry) FactoryNames() []string {
 | 
						|
	return sets.StringKeySet(r).List()
 | 
						|
}
 | 
						|
 | 
						|
// Filter out the disabled plugin
 | 
						|
func (r Registry) Filter(names []string) Registry {
 | 
						|
	var retRegistry = make(Registry)
 | 
						|
	for _, name := range names {
 | 
						|
		// --plugins=*
 | 
						|
		if name == "*" {
 | 
						|
			for factoryName, factory := range r {
 | 
						|
				klog.Infof("Enable Scheduler plugin %q", factoryName)
 | 
						|
				retRegistry[factoryName] = factory
 | 
						|
			}
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	for _, name := range names {
 | 
						|
		// --plugins=foo
 | 
						|
		if factory, ok := r[name]; ok {
 | 
						|
			retRegistry[name] = factory
 | 
						|
			klog.Infof("Enable Scheduler plugin %q", name)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		// --plugins=*,-foo
 | 
						|
		// --plugins=-foo,*
 | 
						|
		if strings.HasPrefix(name, "-") && len(retRegistry) > 0 {
 | 
						|
			factoryName := strings.TrimLeft(name, "-")
 | 
						|
			delete(retRegistry, factoryName)
 | 
						|
			klog.Warningf("%q is disabled", factoryName)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return retRegistry
 | 
						|
}
 |