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

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

commit 93c3d2bff91a17cb02193a7dd1e2729fd0e7bd50
Author: Antonin Stefanutti <anto...@stefanutti.fr>
AuthorDate: Wed Nov 27 10:39:59 2019 +0100

    chore(patch): Skip patch requests for empty JSON merge patches
---
 pkg/trait/deployer.go | 47 +++++++++++++++++++++++++----------------------
 1 file changed, 25 insertions(+), 22 deletions(-)

diff --git a/pkg/trait/deployer.go b/pkg/trait/deployer.go
index f6052a1..a996f5b 100644
--- a/pkg/trait/deployer.go
+++ b/pkg/trait/deployer.go
@@ -85,7 +85,15 @@ func (t *deployerTrait) Apply(e *Environment) error {
                                        return err
                                }
 
-                               err = env.Client.Patch(env.C, resource, 
mergeFrom(object))
+                               patch, err := positiveMergePatch(object, 
resource)
+                               if err != nil {
+                                       return err
+                               } else if len(patch) == 0 {
+                                       // Avoid triggering a patch request for 
nothing
+                                       continue
+                               }
+
+                               err = env.Client.Patch(env.C, resource, 
client.ConstantPatch(types.MergePatchType, patch))
                                if err != nil {
                                        return errors.Wrap(err, "error during 
patch resource")
                                }
@@ -102,26 +110,18 @@ func (t *deployerTrait) IsPlatformTrait() bool {
        return true
 }
 
-type mergeFromPositivePatch struct {
-       from runtime.Object
-}
-
-func (s *mergeFromPositivePatch) Type() types.PatchType {
-       return types.MergePatchType
-}
-
-func (s *mergeFromPositivePatch) Data(obj runtime.Object) ([]byte, error) {
-       originalJSON, err := json.Marshal(s.from)
+func positiveMergePatch(source runtime.Object, target runtime.Object) ([]byte, 
error) {
+       sourceJSON, err := json.Marshal(source)
        if err != nil {
                return nil, err
        }
 
-       modifiedJSON, err := json.Marshal(obj)
+       targetJSON, err := json.Marshal(target)
        if err != nil {
                return nil, err
        }
 
-       mergePatch, err := jsonpatch.CreateMergePatch(originalJSON, 
modifiedJSON)
+       mergePatch, err := jsonpatch.CreateMergePatch(sourceJSON, targetJSON)
        if err != nil {
                return nil, err
        }
@@ -138,11 +138,12 @@ func (s *mergeFromPositivePatch) Data(obj runtime.Object) 
([]byte, error) {
        // by the traits.
        removeNilValues(reflect.ValueOf(positivePatch), reflect.Value{})
 
-       return json.Marshal(positivePatch)
-}
+       // Return an empty patch if no keys remain
+       if len(positivePatch) == 0 {
+               return make([]byte, 0), nil
+       }
 
-func mergeFrom(obj runtime.Object) client.Patch {
-       return &mergeFromPositivePatch{obj}
+       return json.Marshal(positivePatch)
 }
 
 func removeNilValues(v reflect.Value, parent reflect.Value) {
@@ -156,15 +157,17 @@ func removeNilValues(v reflect.Value, parent 
reflect.Value) {
                }
        case reflect.Map:
                for _, k := range v.MapKeys() {
-                       c := v.MapIndex(k)
-                       if c.IsNil() {
-                               v.SetMapIndex(k, reflect.Value{})
-                       } else if c.Elem().Kind() == reflect.Map && 
len(c.Elem().MapKeys()) == 0 {
+                       switch c := v.MapIndex(k); {
+                       case !c.IsValid():
+                               // Skip keys previously deleted
+                               continue
+                       case c.IsNil(), c.Elem().Kind() == reflect.Map && 
len(c.Elem().MapKeys()) == 0:
                                v.SetMapIndex(k, reflect.Value{})
-                       } else {
+                       default:
                                removeNilValues(c, v)
                        }
                }
+               // Back process the parent map in case it has been emptied so 
that it's deleted as well
                if len(v.MapKeys()) == 0 && parent.Kind() == reflect.Map {
                        removeNilValues(parent, reflect.Value{})
                }

Reply via email to