You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2021/04/12 09:30:59 UTC

[camel-k] 01/02: fix: Prevent Integration environment variables ordering randomization

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 <an...@stefanutti.fr>
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"},
+	})
 }