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

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


The following commit(s) were added to refs/heads/main by this push:
     new 47f719a12 fix(ctrl): address changes during phase transition
47f719a12 is described below

commit 47f719a12b7ce4a1d007d3e749e9236f362a997f
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Mon Feb 26 14:57:57 2024 +0100

    fix(ctrl): address changes during phase transition
---
 pkg/util/digest/digest.go      | 47 +++++++++++++++++++------------
 pkg/util/digest/digest_test.go | 63 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+), 18 deletions(-)

diff --git a/pkg/util/digest/digest.go b/pkg/util/digest/digest.go
index 8e34d097b..1aed64a1f 100644
--- a/pkg/util/digest/digest.go
+++ b/pkg/util/digest/digest.go
@@ -116,27 +116,13 @@ func ComputeForIntegration(integration *v1.Integration, 
configmaps []*corev1.Con
        // Calculation logic prior to 1.10.0 (the new Traits API schema) is 
maintained
        // in order to keep consistency in the digest calculated from the same 
set of
        // Trait configurations for backward compatibility.
-       traitsMap, err := toMap(integration.Spec.Traits)
-       if err != nil {
+       if err := computeForTraits(hash, integration.Spec.Traits); err != nil {
                return "", err
        }
-       for _, name := range sortedTraitsMapKeys(traitsMap) {
-               if name != "addons" {
-                       if err := computeForTrait(hash, name, traitsMap[name]); 
err != nil {
-                               return "", err
-                       }
-               } else {
-                       // Addons
-                       addons := traitsMap["addons"]
-                       for _, name := range util.SortedMapKeys(addons) {
-                               if addon, ok := 
addons[name].(map[string]interface{}); ok {
-                                       if err := computeForTrait(hash, name, 
addon); err != nil {
-                                               return "", err
-                                       }
-                               }
-                       }
-               }
+       if err := computeForTraits(hash, integration.Status.Traits); err != nil 
{
+               return "", err
        }
+
        // Integration traits as annotations
        for _, k := range sortedTraitAnnotationsKeys(integration) {
                v := integration.Annotations[k]
@@ -212,6 +198,31 @@ func ComputeForIntegration(integration *v1.Integration, 
configmaps []*corev1.Con
        return digest, nil
 }
 
+func computeForTraits(hash hash.Hash, traits v1.Traits) error {
+       specTraitsMap, err := toMap(traits)
+       if err != nil {
+               return err
+       }
+       for _, name := range sortedTraitsMapKeys(specTraitsMap) {
+               if name != "addons" {
+                       if err := computeForTrait(hash, name, 
specTraitsMap[name]); err != nil {
+                               return err
+                       }
+               } else {
+                       // Addons
+                       addons := specTraitsMap["addons"]
+                       for _, name := range util.SortedMapKeys(addons) {
+                               if addon, ok := 
addons[name].(map[string]interface{}); ok {
+                                       if err := computeForTrait(hash, name, 
addon); err != nil {
+                                               return err
+                                       }
+                               }
+                       }
+               }
+       }
+       return nil
+}
+
 func computeForTrait(hash hash.Hash, name string, trait 
map[string]interface{}) error {
        if _, err := hash.Write([]byte(name + "[")); err != nil {
                return err
diff --git a/pkg/util/digest/digest_test.go b/pkg/util/digest/digest_test.go
index a40a174a9..a08036bb5 100644
--- a/pkg/util/digest/digest_test.go
+++ b/pkg/util/digest/digest_test.go
@@ -138,3 +138,66 @@ func TestDigestUsesSecret(t *testing.T) {
        require.NoError(t, err)
        assert.NotEqual(t, digest2, digest3)
 }
+
+func TestDigestMatchingTraitsUpdated(t *testing.T) {
+       it := v1.Integration{
+               Spec: v1.IntegrationSpec{
+                       Traits: v1.Traits{
+                               Camel: &trait.CamelTrait{
+                                       Properties: []string{"hello=world"},
+                               },
+                       },
+               },
+       }
+
+       itSpecOnlyTraitUpdated := v1.Integration{
+               Spec: v1.IntegrationSpec{
+                       Traits: v1.Traits{
+                               Camel: &trait.CamelTrait{
+                                       Properties: []string{"hello=world2"},
+                               },
+                       },
+               },
+       }
+
+       itStatusOnlyTraitUpdated := v1.Integration{
+               Spec: v1.IntegrationSpec{},
+               Status: v1.IntegrationStatus{
+                       Traits: v1.Traits{
+                               Camel: &trait.CamelTrait{
+                                       Properties: []string{"hello=world2"},
+                               },
+                       },
+               },
+       }
+
+       itDigest, err := ComputeForIntegration(&it, nil, nil)
+       assert.Nil(t, err)
+       itSpecOnlyTraitUpdatedDigest, err := 
ComputeForIntegration(&itSpecOnlyTraitUpdated, nil, nil)
+       assert.Nil(t, err)
+       itStatusOnlyTraitUpdatedDigest, err := 
ComputeForIntegration(&itStatusOnlyTraitUpdated, nil, nil)
+       assert.Nil(t, err)
+
+       assert.NotEqual(t, itSpecOnlyTraitUpdatedDigest, itDigest, "Digests 
must not be equal")
+       assert.NotEqual(t, itStatusOnlyTraitUpdatedDigest, itDigest, "Digests 
must not be equal")
+       assert.Equal(t, itSpecOnlyTraitUpdatedDigest, 
itStatusOnlyTraitUpdatedDigest, "Digests must be equal")
+}
+
+func TestSpecStatusDrift(t *testing.T) {
+       it := v1.Integration{}
+       it.Spec.Traits.Camel = &trait.CamelTrait{}
+       it.Status.Traits.Camel = &trait.CamelTrait{}
+
+       it.Spec.Traits.Camel.Properties = []string{"hello=world1"}
+       d1, err := ComputeForIntegration(&it, nil, nil)
+       assert.Nil(t, err)
+       it.Status.Traits.Camel.Properties = []string{"hello=world2"}
+       d2, err := ComputeForIntegration(&it, nil, nil)
+       assert.Nil(t, err)
+       it.Spec.Traits.Camel.Properties = []string{"hello=world3"}
+       d3, err := ComputeForIntegration(&it, nil, nil)
+       assert.Nil(t, err)
+
+       assert.NotEqual(t, d2, d1, "d2 must not be equal to d1")
+       assert.NotEqual(t, d3, d2, "d3 must not be equal to d2")
+}

Reply via email to