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 96d8b60e948d093e741f55ad9e1473d0e194881b
Author: Antonin Stefanutti <[email protected]>
AuthorDate: Thu Apr 8 16:26:51 2021 +0200

    fix: Prevent Integration environment variables ordering randomization
---
 pkg/trait/container.go       |  4 ++--
 pkg/trait/cron.go            |  2 +-
 pkg/trait/deployment.go      |  4 +---
 pkg/trait/knative_service.go |  2 +-
 pkg/trait/trait.go           |  8 ++++----
 pkg/trait/trait_types.go     | 12 ++++++++----
 pkg/trait/util.go            | 32 +++++++++++++++++++-------------
 pkg/trait/util_test.go       | 10 ++++++----
 8 files changed, 42 insertions(+), 32 deletions(-)

diff --git a/pkg/trait/container.go b/pkg/trait/container.go
index 8f3a7d1..238a827 100644
--- a/pkg/trait/container.go
+++ b/pkg/trait/container.go
@@ -186,8 +186,8 @@ func (t *containerTrait) configureContainer(e *Environment) 
error {
        }
 
        // combine Environment of integration with platform, kit, integration
-       for key, value := range e.collectConfigurationPairs("env") {
-               envvar.SetVal(&container.Env, key, value)
+       for _, env := range e.collectConfigurationPairs("env") {
+               envvar.SetVal(&container.Env, env.Name, env.Value)
        }
 
        envvar.SetVal(&container.Env, "CAMEL_K_DIGEST", 
e.Integration.Status.Digest)
diff --git a/pkg/trait/cron.go b/pkg/trait/cron.go
index 478fe12..e876128 100644
--- a/pkg/trait/cron.go
+++ b/pkg/trait/cron.go
@@ -266,7 +266,7 @@ func (t *cronTrait) getCronJobFor(e *Environment) 
*v1beta1.CronJob {
 
        // Copy annotations from the integration resource
        if e.Integration.Annotations != nil {
-               for k, v := range 
FilterTransferableAnnotations(e.Integration.Annotations) {
+               for k, v := range 
filterTransferableAnnotations(e.Integration.Annotations) {
                        annotations[k] = v
                }
        }
diff --git a/pkg/trait/deployment.go b/pkg/trait/deployment.go
index 8fd05ad..11d24c6 100644
--- a/pkg/trait/deployment.go
+++ b/pkg/trait/deployment.go
@@ -60,9 +60,7 @@ func (t *deploymentTrait) Configure(e *Environment) (bool, 
error) {
                return condition != nil && condition.Status == 
corev1.ConditionTrue, nil
        }
 
-       //
        // Don't deploy when a different strategy is needed (e.g. Knative, Cron)
-       //
        strategy, err := e.DetermineControllerStrategy()
        if err != nil {
                e.Integration.Status.SetErrorCondition(
@@ -141,7 +139,7 @@ func (t *deploymentTrait) getDeploymentFor(e *Environment) 
*appsv1.Deployment {
        // create a copy to avoid sharing the underlying annotation map
        annotations := make(map[string]string)
        if e.Integration.Annotations != nil {
-               for k, v := range 
FilterTransferableAnnotations(e.Integration.Annotations) {
+               for k, v := range 
filterTransferableAnnotations(e.Integration.Annotations) {
                        annotations[k] = v
                }
        }
diff --git a/pkg/trait/knative_service.go b/pkg/trait/knative_service.go
index a6f5eda..a1e8ac1 100644
--- a/pkg/trait/knative_service.go
+++ b/pkg/trait/knative_service.go
@@ -269,7 +269,7 @@ func (t *knativeServiceTrait) getServiceFor(e *Environment) 
*serving.Service {
 
        // Copy annotations from the integration resource
        if e.Integration.Annotations != nil {
-               for k, v := range 
FilterTransferableAnnotations(e.Integration.Annotations) {
+               for k, v := range 
filterTransferableAnnotations(e.Integration.Annotations) {
                        annotations[k] = v
                }
        }
diff --git a/pkg/trait/trait.go b/pkg/trait/trait.go
index 28c388e..35ea851 100644
--- a/pkg/trait/trait.go
+++ b/pkg/trait/trait.go
@@ -20,17 +20,17 @@ package trait
 import (
        "context"
 
+       "github.com/pkg/errors"
+
        corev1 "k8s.io/api/core/v1"
+       k8serrors "k8s.io/apimachinery/pkg/api/errors"
 
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/apache/camel-k/pkg/client"
        "github.com/apache/camel-k/pkg/platform"
        "github.com/apache/camel-k/pkg/util/kubernetes"
-       "github.com/pkg/errors"
-       k8serrors "k8s.io/apimachinery/pkg/api/errors"
 )
 
-// Apply --
 func Apply(ctx context.Context, c client.Client, integration *v1.Integration, 
kit *v1.IntegrationKit) (*Environment, error) {
        environment, err := newEnvironment(ctx, c, integration, kit)
        if err != nil {
@@ -77,7 +77,7 @@ func newEnvironment(ctx context.Context, c client.Client, 
integration *v1.Integr
        }
 
        if kit == nil {
-               kit, err = GetIntegrationKit(ctx, c, integration)
+               kit, err = getIntegrationKit(ctx, c, integration)
                if err != nil {
                        return nil, err
                }
diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go
index a34c718..b3cd991 100644
--- a/pkg/trait/trait_types.go
+++ b/pkg/trait/trait_types.go
@@ -402,8 +402,8 @@ func (e *Environment) computeConfigMaps() []ctrl.Object {
        // properties have the priority
        userProperties := ""
 
-       for key, val := range e.collectConfigurationPairs("property") {
-               userProperties += fmt.Sprintf("%s=%s\n", key, val)
+       for _, prop := range e.collectConfigurationPairs("property") {
+               userProperties += fmt.Sprintf("%s=%s\n", prop.Name, prop.Value)
        }
 
        if userProperties != "" {
@@ -783,8 +783,12 @@ func (e *Environment) 
collectConfigurationValues(configurationType string) []str
        return collectConfigurationValues(configurationType, e.Platform, 
e.IntegrationKit, e.Integration)
 }
 
-func (e *Environment) collectConfigurationPairs(configurationType string) 
map[string]string {
-       return CollectConfigurationPairs(configurationType, e.Platform, 
e.IntegrationKit, e.Integration)
+type variable struct {
+       Name, Value string
+}
+
+func (e *Environment) collectConfigurationPairs(configurationType string) 
[]variable {
+       return collectConfigurationPairs(configurationType, e.Platform, 
e.IntegrationKit, e.Integration)
 }
 
 func (e *Environment) getIntegrationContainer() *corev1.Container {
diff --git a/pkg/trait/util.go b/pkg/trait/util.go
index debba1f..591f90b 100644
--- a/pkg/trait/util.go
+++ b/pkg/trait/util.go
@@ -28,7 +28,7 @@ import (
        user "github.com/mitchellh/go-homedir"
        "github.com/scylladb/go-set/strset"
 
-       k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
+       ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/apache/camel-k/pkg/client"
@@ -39,17 +39,13 @@ import (
 
 var exactVersionRegexp = regexp.MustCompile(`^(\d+)\.(\d+)\.([\w-.]+)$`)
 
-// GetIntegrationKit retrieves the kit set on the integration
-func GetIntegrationKit(ctx context.Context, c client.Client, integration 
*v1.Integration) (*v1.IntegrationKit, error) {
+// getIntegrationKit retrieves the kit set on the integration
+func getIntegrationKit(ctx context.Context, c client.Client, integration 
*v1.Integration) (*v1.IntegrationKit, error) {
        if integration.Status.IntegrationKit == nil {
                return nil, nil
        }
        kit := 
v1.NewIntegrationKit(integration.Status.IntegrationKit.Namespace, 
integration.Status.IntegrationKit.Name)
-       key := k8sclient.ObjectKey{
-               Namespace: integration.Status.IntegrationKit.Namespace,
-               Name:      integration.Status.IntegrationKit.Name,
-       }
-       err := c.Get(ctx, key, &kit)
+       err := c.Get(ctx, ctrl.ObjectKeyFromObject(&kit), &kit)
        return &kit, err
 }
 
@@ -80,8 +76,8 @@ func collectConfigurationValues(configurationType string, 
configurable ...v1.Con
        return s
 }
 
-func CollectConfigurationPairs(configurationType string, configurable 
...v1.Configurable) map[string]string {
-       result := make(map[string]string)
+func collectConfigurationPairs(configurationType string, configurable 
...v1.Configurable) []variable {
+       result := make([]variable, 0)
 
        for _, c := range configurable {
                c := c
@@ -103,7 +99,17 @@ func CollectConfigurationPairs(configurationType string, 
configurable ...v1.Conf
                                        v := strings.TrimSpace(pair[1])
 
                                        if len(k) > 0 && len(v) > 0 {
-                                               result[k] = v
+                                               ok := false
+                                               for i, variable := range result 
{
+                                                       if variable.Name == k {
+                                                               result[i].Value 
= v
+                                                               ok = true
+                                                               break
+                                                       }
+                                               }
+                                               if !ok {
+                                                       result = append(result, 
variable{Name: k, Value: v})
+                                               }
                                        }
                                }
                        }
@@ -129,8 +135,8 @@ func keyValuePairArrayAsStringMap(pairs []string) 
(map[string]string, error) {
        return m, nil
 }
 
-// FilterTransferableAnnotations returns a map containing annotations that are 
meaningful for being transferred to child resources.
-func FilterTransferableAnnotations(annotations map[string]string) 
map[string]string {
+// filterTransferableAnnotations returns a map containing annotations that are 
meaningful for being transferred to child resources.
+func filterTransferableAnnotations(annotations map[string]string) 
map[string]string {
        res := make(map[string]string)
        for k, v := range annotations {
                if strings.HasPrefix(k, "kubectl.kubernetes.io") {
diff --git a/pkg/trait/util_test.go b/pkg/trait/util_test.go
index 9e9e350..87d70cf 100644
--- a/pkg/trait/util_test.go
+++ b/pkg/trait/util_test.go
@@ -94,8 +94,10 @@ func TestCollectConfigurationPairs(t *testing.T) {
        e.Platform.ResyncStatusFullConfig()
 
        pairs := e.collectConfigurationPairs("property")
-       assert.Equal(t, "integration", pairs["p1"])
-       assert.Equal(t, "kit", pairs["p2"])
-       assert.Equal(t, "platform", pairs["p3"])
-       assert.Equal(t, "integration", pairs["p4"])
+       assert.Equal(t, pairs, []variable{
+               {Name: "p1", Value: "integration"},
+               {Name: "p2", Value: "kit"},
+               {Name: "p3", Value: "platform"},
+               {Name: "p4", Value: "integration"},
+       })
 }

Reply via email to