in pkg/capacityscheduling/capacity_scheduling.go [121:192]
func New(ctx context.Context, obj runtime.Object, handle framework.Handle) (framework.Plugin, error) {
c := &CapacityScheduling{
fh: handle,
elasticQuotaInfos: NewElasticQuotaInfos(),
podLister: handle.SharedInformerFactory().Core().V1().Pods().Lister(),
pdbLister: getPDBLister(handle.SharedInformerFactory()),
}
client, err := client.New(handle.KubeConfig(), client.Options{Scheme: scheme})
if err != nil {
return nil, err
}
c.client = client
dynamicCache, err := ctrlruntimecache.New(handle.KubeConfig(), ctrlruntimecache.Options{Scheme: scheme})
if err != nil {
return nil, err
}
elasticQuotaInformer, err := dynamicCache.GetInformer(ctx, &v1alpha1.ElasticQuota{})
if err != nil {
return nil, err
}
elasticQuotaInformer.AddEventHandler(cache.FilteringResourceEventHandler{
FilterFunc: func(obj interface{}) bool {
switch t := obj.(type) {
case *v1alpha1.ElasticQuota:
return true
case cache.DeletedFinalStateUnknown:
if _, ok := t.Obj.(*v1alpha1.ElasticQuota); ok {
return true
}
utilruntime.HandleError(fmt.Errorf("cannot convert to *v1alpha1.ElasticQuota: %v", obj))
return false
default:
utilruntime.HandleError(fmt.Errorf("unable to handle object in %T", obj))
return false
}
},
Handler: cache.ResourceEventHandlerFuncs{
AddFunc: c.addElasticQuota,
UpdateFunc: c.updateElasticQuota,
DeleteFunc: c.deleteElasticQuota,
},
})
podInformer := handle.SharedInformerFactory().Core().V1().Pods().Informer()
podInformer.AddEventHandler(
cache.FilteringResourceEventHandler{
FilterFunc: func(obj interface{}) bool {
switch t := obj.(type) {
case *v1.Pod:
return assignedPod(t)
case cache.DeletedFinalStateUnknown:
if pod, ok := t.Obj.(*v1.Pod); ok {
return assignedPod(pod)
}
return false
default:
return false
}
},
Handler: cache.ResourceEventHandlerFuncs{
AddFunc: c.addPod,
UpdateFunc: c.updatePod,
DeleteFunc: c.deletePod,
},
},
)
klog.InfoS("CapacityScheduling start")
return c, nil
}