in pkg/trimaran/targetloadpacking/targetloadpacking.go [71:133]
func New(obj runtime.Object, handle framework.Handle) (framework.Plugin, error) {
args, err := getArgs(obj)
if err != nil {
return nil, err
}
hostTargetUtilizationPercent = args.TargetUtilization
requestsMilliCores = args.DefaultRequests.Cpu().MilliValue()
requestsMultiplier, _ = strconv.ParseFloat(args.DefaultRequestsMultiplier, 64)
podAssignEventHandler := trimaran.New()
var client loadwatcherapi.Client
if args.WatcherAddress != "" {
client, err = loadwatcherapi.NewServiceClient(args.WatcherAddress)
} else {
opts := watcher.MetricsProviderOpts{string(args.MetricProvider.Type), args.MetricProvider.Address, args.MetricProvider.Token}
client, err = loadwatcherapi.NewLibraryClient(opts)
}
pl := &TargetLoadPacking{
handle: handle,
client: client,
eventHandler: podAssignEventHandler,
}
pl.handle.SharedInformerFactory().Core().V1().Pods().Informer().AddEventHandler(
cache.FilteringResourceEventHandler{
FilterFunc: func(obj interface{}) bool {
switch t := obj.(type) {
case *v1.Pod:
return isAssigned(t)
case cache.DeletedFinalStateUnknown:
if pod, ok := t.Obj.(*v1.Pod); ok {
return isAssigned(pod)
}
utilruntime.HandleError(fmt.Errorf("unable to convert object %T to *v1.Pod in %T", obj, pl))
return false
default:
utilruntime.HandleError(fmt.Errorf("unable to handle object in %T: %T", pl, obj))
return false
}
},
Handler: podAssignEventHandler,
},
)
// populate metrics before returning
err = pl.updateMetrics()
if err != nil {
klog.Warningf("unable to populate metrics initially: %v", err)
}
go func() {
metricsUpdaterTicker := time.NewTicker(time.Second * metricsUpdateIntervalSeconds)
for range metricsUpdaterTicker.C {
err = pl.updateMetrics()
if err != nil {
klog.Warningf("unable to update metrics: %v", err)
}
}
}()
return pl, nil
}