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"},
+ })
}