in pkg/coscheduling/coscheduling.go [64:106]
func New(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)
}
conf, err := clientcmd.BuildConfigFromFlags(args.KubeMaster, args.KubeConfigPath)
if err != nil {
return nil, fmt.Errorf("failed to init rest.Config: %v", err)
}
pgClient := pgclientset.NewForConfigOrDie(conf)
pgInformerFactory := pgformers.NewSharedInformerFactory(pgClient, 0)
pgInformer := pgInformerFactory.Scheduling().V1alpha1().PodGroups()
fieldSelector, err := fields.ParseSelector(",status.phase!=" + string(v1.PodSucceeded) + ",status.phase!=" + string(v1.PodFailed))
if err != nil {
klog.Fatalf("ParseSelector failed %+v", err)
}
informerFactory := informers.NewSharedInformerFactoryWithOptions(handle.ClientSet(), 0, informers.WithTweakListOptions(func(opt *metav1.ListOptions) {
opt.LabelSelector = util.PodGroupLabel
opt.FieldSelector = fieldSelector.String()
}))
podInformer := informerFactory.Core().V1().Pods()
scheduleTimeDuration := time.Duration(args.PermitWaitingTimeSeconds) * time.Second
deniedPGExpirationTime := time.Duration(args.DeniedPGExpirationTimeSeconds) * time.Second
ctx := context.TODO()
pgMgr := core.NewPodGroupManager(pgClient, handle.SnapshotSharedLister(), &scheduleTimeDuration, &deniedPGExpirationTime, pgInformer, podInformer)
plugin := &Coscheduling{
frameworkHandler: handle,
pgMgr: pgMgr,
scheduleTimeout: &scheduleTimeDuration,
}
pgInformerFactory.Start(ctx.Done())
informerFactory.Start(ctx.Done())
if !cache.WaitForCacheSync(ctx.Done(), pgInformer.Informer().HasSynced, podInformer.Informer().HasSynced) {
klog.Error("Cannot sync caches")
return nil, fmt.Errorf("WaitForCacheSync failed")
}
return plugin, nil
}