This is an automated email from the ASF dual-hosted git repository.

nferraro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/master by this push:
     new 3b992da  Fix #1936: avoid patching if the target resource contains all 
expected fields
3b992da is described below

commit 3b992dacb1bf81d781a263dbc1b12ee7d0ffcfef
Author: nicolaferraro <ni.ferr...@gmail.com>
AuthorDate: Fri Jan 22 13:28:23 2021 +0100

    Fix #1936: avoid patching if the target resource contains all expected 
fields
---
 pkg/trait/builder.go     |  2 ++
 pkg/trait/deployer.go    | 28 ++++++++++++++++------------
 pkg/trait/trait_types.go |  5 +++++
 pkg/util/patch/patch.go  | 20 ++++++++++++++++++++
 4 files changed, 43 insertions(+), 12 deletions(-)

diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index bdf9d42..3fa45d7 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -485,6 +485,7 @@ func mountRegistrySecret(name string, secret 
registrySecret, volumes *[]corev1.V
        *volumeMounts = append(*volumeMounts, corev1.VolumeMount{
                Name:      "registry-secret",
                MountPath: secret.mountPath,
+               ReadOnly:  true,
        })
 
        if secret.refEnv != "" {
@@ -530,6 +531,7 @@ func mountRegistryConfigMap(name string, config 
registryConfigMap, volumes *[]co
        *volumeMounts = append(*volumeMounts, corev1.VolumeMount{
                Name:      "registry-config",
                MountPath: config.mountPath,
+               ReadOnly:  true,
        })
 }
 
diff --git a/pkg/trait/deployer.go b/pkg/trait/deployer.go
index b3cf394..81aaee8 100644
--- a/pkg/trait/deployer.go
+++ b/pkg/trait/deployer.go
@@ -19,7 +19,6 @@ package trait
 
 import (
        "github.com/pkg/errors"
-
        "k8s.io/apimachinery/pkg/types"
 
        "sigs.k8s.io/controller-runtime/pkg/client"
@@ -95,17 +94,22 @@ func (t *deployerTrait) Apply(e *Environment) error {
                                        return err
                                }
 
-                               p, err := patch.PositiveMergePatch(object, 
resource)
-                               if err != nil {
-                                       return err
-                               } else if len(p) == 0 {
-                                       // Avoid triggering a patch request for 
nothing
-                                       continue
-                               }
-
-                               err = env.Client.Patch(env.C, resource, 
client.RawPatch(types.MergePatchType, p))
-                               if err != nil {
-                                       return errors.Wrap(err, "error during 
patch resource")
+                               if !patch.SpecEqualDeepDerivative(object, 
resource) {
+                                       // If both objects have a "Spec" field 
and it contains all expected fields
+                                       // (plus optional others), then avoid 
patching
+
+                                       p, err := 
patch.PositiveMergePatch(object, resource)
+                                       if err != nil {
+                                               return err
+                                       } else if len(p) == 0 {
+                                               // Avoid triggering a patch 
request for nothing
+                                               continue
+                                       }
+
+                                       err = env.Client.Patch(env.C, resource, 
client.RawPatch(types.MergePatchType, p))
+                                       if err != nil {
+                                               return errors.Wrap(err, "error 
during patch resource")
+                                       }
                                }
                        }
                        return nil
diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go
index 8343fb9..f28fc8f 100644
--- a/pkg/trait/trait_types.go
+++ b/pkg/trait/trait_types.go
@@ -559,6 +559,7 @@ func (e *Environment) ConfigureVolumesAndMounts(vols 
*[]corev1.Volume, mnts *[]c
                *mnts = append(*mnts, corev1.VolumeMount{
                        Name:      refName,
                        MountPath: resPath,
+                       ReadOnly:  true,
                })
        }
 
@@ -603,6 +604,7 @@ func (e *Environment) ConfigureVolumesAndMounts(vols 
*[]corev1.Volume, mnts *[]c
                *mnts = append(*mnts, corev1.VolumeMount{
                        Name:      refName,
                        MountPath: resPath,
+                       ReadOnly:  true,
                })
        }
 
@@ -639,6 +641,7 @@ func (e *Environment) ConfigureVolumesAndMounts(vols 
*[]corev1.Volume, mnts *[]c
                                *mnts = append(*mnts, corev1.VolumeMount{
                                        Name:      propertiesType + 
"-properties",
                                        MountPath: mountPath,
+                                       ReadOnly:  true,
                                })
                        }
                })
@@ -665,6 +668,7 @@ func (e *Environment) ConfigureVolumesAndMounts(vols 
*[]corev1.Volume, mnts *[]c
                *mnts = append(*mnts, corev1.VolumeMount{
                        Name:      refName,
                        MountPath: path.Join(ConfigMapsMountPath, 
strings.ToLower(cmName)),
+                       ReadOnly:  true,
                })
        }
 
@@ -687,6 +691,7 @@ func (e *Environment) ConfigureVolumesAndMounts(vols 
*[]corev1.Volume, mnts *[]c
                *mnts = append(*mnts, corev1.VolumeMount{
                        Name:      refName,
                        MountPath: path.Join(SecretsMountPath, 
strings.ToLower(secretName)),
+                       ReadOnly:  true,
                })
        }
 
diff --git a/pkg/util/patch/patch.go b/pkg/util/patch/patch.go
index e0ae632..67c2813 100644
--- a/pkg/util/patch/patch.go
+++ b/pkg/util/patch/patch.go
@@ -21,6 +21,7 @@ import (
        "reflect"
 
        jsonpatch "github.com/evanphx/json-patch"
+       "k8s.io/apimachinery/pkg/api/equality"
 
        "k8s.io/apimachinery/pkg/runtime"
        "k8s.io/apimachinery/pkg/util/json"
@@ -89,3 +90,22 @@ func removeNilValues(v reflect.Value, parent reflect.Value) {
                }
        }
 }
+
+func SpecEqualDeepDerivative(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
+       }
+
+       objectSpec := 
reflect.ValueOf(object).Elem().FieldByName("Spec").Interface()
+       expectedSpec := 
reflect.ValueOf(expected).Elem().FieldByName("Spec").Interface()
+
+       return equality.Semantic.DeepDerivative(expectedSpec, objectSpec)
+}

Reply via email to