func (gc *GarbageCollector) monitorFor(resource schema.GroupVersionResource, kind schema.GroupVersionKind) (monitor, error) { // TODO: consider store in one storage. glog.V(6).Infof("create storage for resource %s", resource) var monitor monitor client, err := gc.metaOnlyClientPool.ClientForGroupVersionKind(kind) if err != nil { return monitor, err } gc.registeredRateLimiterForMonitors.registerIfNotPresent(resource.GroupVersion(), client, "garbage_collector_monitoring") setObjectTypeMeta := func(obj interface{}) { runtimeObject, ok := obj.(runtime.Object) if !ok { utilruntime.HandleError(fmt.Errorf("expected runtime.Object, got %#v", obj)) } runtimeObject.GetObjectKind().SetGroupVersionKind(kind) } monitor.store, monitor.controller = cache.NewInformer( gcListWatcher(client, resource), nil, ResourceResyncTime, cache.ResourceEventHandlerFuncs{ // add the event to the propagator's eventQueue. AddFunc: func(obj interface{}) { setObjectTypeMeta(obj) event := &event{ eventType: addEvent, obj: obj, } gc.propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: event}) }, UpdateFunc: func(oldObj, newObj interface{}) { setObjectTypeMeta(newObj) event := &event{updateEvent, newObj, oldObj} gc.propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: event}) }, DeleteFunc: func(obj interface{}) { // delta fifo may wrap the object in a cache.DeletedFinalStateUnknown, unwrap it if deletedFinalStateUnknown, ok := obj.(cache.DeletedFinalStateUnknown); ok { obj = deletedFinalStateUnknown.Obj } setObjectTypeMeta(obj) event := &event{ eventType: deleteEvent, obj: obj, } gc.propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: event}) }, }, ) return monitor, nil }
func (o *ResourceConfig) ResourceEnabled(resource schema.GroupVersionResource) bool { versionOverride, versionExists := o.GroupVersionResourceConfigs[resource.GroupVersion()] if !versionExists { return false } if !versionOverride.Enable { return false } if versionOverride.DisabledResources.Has(resource.Resource) { return false } if len(versionOverride.EnabledResources) > 0 { return versionOverride.EnabledResources.Has(resource.Resource) } return true }
// TODO turn this into reusable method checking available resources func contains(resourcesList []*metav1.APIResourceList, resource schema.GroupVersionResource) bool { resources := discovery.FilteredBy(discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { return resource.GroupVersion().String() == gv && resource.Resource == r.Name }), resourcesList) return len(resources) != 0 }