func NewUnidlingController(scaleNS kextclient.ScalesGetter, endptsNS kclient.EndpointsGetter, evtNS kclient.EventsGetter, dcNamespacer deployclient.DeploymentConfigsGetter, rcNamespacer kclient.ReplicationControllersGetter, resyncPeriod time.Duration) *UnidlingController { fieldSet := fields.Set{} fieldSet["reason"] = unidlingapi.NeedPodsReason fieldSelector := fieldSet.AsSelector() unidlingController := &UnidlingController{ scaleNamespacer: scaleNS, endpointsNamespacer: endptsNS, queue: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()), lastFiredCache: &lastFiredCache{ items: make(map[types.NamespacedName]time.Time), }, dcNamespacer: dcNamespacer, rcNamespacer: rcNamespacer, } _, controller := framework.NewInformer( &cache.ListWatch{ // No need to list -- we only care about new events ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { return &kapi.EventList{}, nil }, WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { options.FieldSelector = fieldSelector return evtNS.Events(kapi.NamespaceAll).Watch(options) }, }, &kapi.Event{}, resyncPeriod, framework.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { event := obj.(*kapi.Event) unidlingController.enqueueEvent(event) }, UpdateFunc: func(oldObj interface{}, newObj interface{}) { // retrigger on new last-seen times event := newObj.(*kapi.Event) unidlingController.enqueueEvent(event) }, DeleteFunc: func(obj interface{}) { // this is just to clean up our cache of the last seen times event := obj.(*kapi.Event) unidlingController.clearEventFromCache(event) }, }, ) unidlingController.controller = controller return unidlingController }
// Returns the appropriate field selector based on the API version being used to communicate with the server. // The returned field selector can be used with List and Watch to filter desired events. func (e *events) GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector { apiVersion := e.client.APIVersion().String() field := fields.Set{} if involvedObjectName != nil { field[GetInvolvedObjectNameFieldLabel(apiVersion)] = *involvedObjectName } if involvedObjectNamespace != nil { field["involvedObject.namespace"] = *involvedObjectNamespace } if involvedObjectKind != nil { field["involvedObject.kind"] = *involvedObjectKind } if involvedObjectUID != nil { field["involvedObject.uid"] = *involvedObjectUID } return field.AsSelector() }