in pkg/coscheduling/coscheduling.go [63:103]
func New(_ context.Context, obj runtime.Object, handle framework.Handle) (framework.Plugin, error) {
args, ok := obj.(*config.CoschedulingArgs)
if !ok {
return nil, fmt.Errorf("want args to be of type CoschedulingArgs, got %T", obj)
}
scheme := runtime.NewScheme()
_ = clientscheme.AddToScheme(scheme)
_ = v1.AddToScheme(scheme)
_ = v1alpha1.AddToScheme(scheme)
client, err := client.New(handle.KubeConfig(), client.Options{Scheme: scheme})
if err != nil {
return nil, err
}
// Performance improvement when retrieving list of objects by namespace or we'll log 'index not exist' warning.
handle.SharedInformerFactory().Core().V1().Pods().Informer().AddIndexers(cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc})
scheduleTimeDuration := time.Duration(args.PermitWaitingTimeSeconds) * time.Second
pgMgr := core.NewPodGroupManager(
client,
handle.SnapshotSharedLister(),
&scheduleTimeDuration,
// Keep the podInformer (from frameworkHandle) as the single source of Pods.
handle.SharedInformerFactory().Core().V1().Pods(),
)
plugin := &Coscheduling{
frameworkHandler: handle,
pgMgr: pgMgr,
scheduleTimeout: &scheduleTimeDuration,
}
if args.PodGroupBackoffSeconds < 0 {
err := fmt.Errorf("parse arguments failed")
klog.ErrorS(err, "PodGroupBackoffSeconds cannot be negative")
return nil, err
} else if args.PodGroupBackoffSeconds > 0 {
pgBackoff := time.Duration(args.PodGroupBackoffSeconds) * time.Second
plugin.pgBackoff = &pgBackoff
}
return plugin, nil
}