mirror of https://github.com/k3s-io/k3s
41 lines
882 B
Go
41 lines
882 B
Go
|
package generic
|
||
|
|
||
|
import (
|
||
|
"k8s.io/apimachinery/pkg/api/equality"
|
||
|
"k8s.io/apimachinery/pkg/api/meta"
|
||
|
"k8s.io/apimachinery/pkg/runtime"
|
||
|
)
|
||
|
|
||
|
func UpdateOnChange(updater Updater, handler Handler) Handler {
|
||
|
return func(key string, obj runtime.Object) (runtime.Object, error) {
|
||
|
if obj == nil {
|
||
|
return handler(key, nil)
|
||
|
}
|
||
|
|
||
|
copyObj := obj.DeepCopyObject()
|
||
|
newObj, err := handler(key, copyObj)
|
||
|
if newObj != nil {
|
||
|
copyObj = newObj
|
||
|
}
|
||
|
|
||
|
oldMeta, ignoreErr := meta.Accessor(obj)
|
||
|
if ignoreErr != nil {
|
||
|
return copyObj, err
|
||
|
}
|
||
|
|
||
|
newMeta, ignoreErr := meta.Accessor(copyObj)
|
||
|
if ignoreErr != nil {
|
||
|
return copyObj, err
|
||
|
}
|
||
|
|
||
|
if oldMeta.GetResourceVersion() == newMeta.GetResourceVersion() && !equality.Semantic.DeepEqual(obj, copyObj) {
|
||
|
newObj, err := updater(copyObj)
|
||
|
if newObj != nil && err == nil {
|
||
|
copyObj = newObj
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return copyObj, err
|
||
|
}
|
||
|
}
|