From b28f41eb025a3f24d36a4ea641a962137e3ef36b Mon Sep 17 00:00:00 2001 From: shashidharatd Date: Wed, 8 Feb 2017 16:45:39 +0530 Subject: [PATCH] Add new ResourceEventHandlerFuncs to federated informer --- .../federation-controller/util/handlers.go | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/federation/pkg/federation-controller/util/handlers.go b/federation/pkg/federation-controller/util/handlers.go index b568faf2b92..0e2dec5bf58 100644 --- a/federation/pkg/federation-controller/util/handlers.go +++ b/federation/pkg/federation-controller/util/handlers.go @@ -77,3 +77,35 @@ func NewTriggerOnMetaAndSpecChanges(triggerFunc func(pkgruntime.Object)) *cache. }, } } + +// Returns cache.ResourceEventHandlerFuncs that trigger the given function +// on object add/delete or ObjectMeta or given field is updated. +func NewTriggerOnMetaAndFieldChanges(field string, triggerFunc func(pkgruntime.Object)) *cache.ResourceEventHandlerFuncs { + getFieldOrPanic := func(obj interface{}, fieldName string) interface{} { + val := reflect.ValueOf(obj).Elem().FieldByName(fieldName) + if val.IsValid() { + return val.Interface() + } else { + panic(fmt.Errorf("field not found: %s", fieldName)) + } + } + return &cache.ResourceEventHandlerFuncs{ + DeleteFunc: func(old interface{}) { + oldObj := old.(pkgruntime.Object) + triggerFunc(oldObj) + }, + AddFunc: func(cur interface{}) { + curObj := cur.(pkgruntime.Object) + triggerFunc(curObj) + }, + UpdateFunc: func(old, cur interface{}) { + curObj := cur.(pkgruntime.Object) + oldMeta := getFieldOrPanic(old, "ObjectMeta").(metav1.ObjectMeta) + curMeta := getFieldOrPanic(cur, "ObjectMeta").(metav1.ObjectMeta) + if !ObjectMetaEquivalent(oldMeta, curMeta) || + !reflect.DeepEqual(getFieldOrPanic(old, field), getFieldOrPanic(cur, field)) { + triggerFunc(curObj) + } + }, + } +}