This is an automated email from the ASF dual-hosted git repository. astefanutti pushed a commit to branch release-1.3.x in repository https://gitbox.apache.org/repos/asf/camel-k.git
The following commit(s) were added to refs/heads/release-1.3.x by this push: new 77a0956 fix: Consider ObjectMeta field for deep derivative comparison before patching 77a0956 is described below commit 77a095600b512e82a6361ece67faa615157e893f Author: Antonin Stefanutti <anto...@stefanutti.fr> AuthorDate: Wed Feb 17 11:54:52 2021 +0100 fix: Consider ObjectMeta field for deep derivative comparison before patching --- pkg/trait/deployer.go | 7 ++++--- pkg/util/patch/patch.go | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/pkg/trait/deployer.go b/pkg/trait/deployer.go index 81aaee8..e21b0bd 100644 --- a/pkg/trait/deployer.go +++ b/pkg/trait/deployer.go @@ -94,9 +94,10 @@ func (t *deployerTrait) Apply(e *Environment) error { return err } - if !patch.SpecEqualDeepDerivative(object, resource) { - // If both objects have a "Spec" field and it contains all expected fields - // (plus optional others), then avoid patching + // If both objects have "ObjectMeta" and "Spec" fields and they contain all the expected fields + // (plus optional others), then avoid patching. + if !patch.ObjectMetaEqualDeepDerivative(object, resource) || + !patch.SpecEqualDeepDerivative(object, resource) { p, err := patch.PositiveMergePatch(object, resource) if err != nil { diff --git a/pkg/util/patch/patch.go b/pkg/util/patch/patch.go index 67c2813..e2c54b1 100644 --- a/pkg/util/patch/patch.go +++ b/pkg/util/patch/patch.go @@ -91,6 +91,25 @@ func removeNilValues(v reflect.Value, parent reflect.Value) { } } +func ObjectMetaEqualDeepDerivative(object runtime.Object, expected runtime.Object) (res bool) { + defer func() { + if r := recover(); r != nil { + res = false + } + }() + + if expected == nil { + return true + } else if object == nil { + return false + } + + objectMeta := reflect.ValueOf(object).Elem().FieldByName("ObjectMeta").Interface() + expectedMeta := reflect.ValueOf(expected).Elem().FieldByName("ObjectMeta").Interface() + + return equality.Semantic.DeepDerivative(expectedMeta, objectMeta) +} + func SpecEqualDeepDerivative(object runtime.Object, expected runtime.Object) (res bool) { defer func() { if r := recover(); r != nil {