You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2018/10/08 14:19:47 UTC

[camel-k] 07/14: Added tests

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

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

commit de9bcfe2825da5ffd98367a12ea9e8cb8a5ded59
Author: nferraro <ni...@gmail.com>
AuthorDate: Thu Oct 4 23:11:58 2018 +0200

    Added tests
---
 pkg/trait/base.go                 |   6 +-
 pkg/trait/catalog.go              |   4 +-
 pkg/trait/owner.go                |   2 +-
 pkg/trait/route.go                |   4 +-
 pkg/trait/service.go              |   6 +-
 pkg/trait/trait.go                |   4 +-
 pkg/trait/trait_test.go           | 127 ++++++++++++++++++++++++++++++++++++++
 pkg/trait/types.go                |  14 ++---
 pkg/util/kubernetes/collection.go |  54 ++++++++++++++++
 9 files changed, 201 insertions(+), 20 deletions(-)

diff --git a/pkg/trait/base.go b/pkg/trait/base.go
index d5eea62..3432b93 100644
--- a/pkg/trait/base.go
+++ b/pkg/trait/base.go
@@ -34,7 +34,7 @@ func (*baseTrait) id() id {
 	return id("base")
 }
 
-func (d *baseTrait) customize(environment environment, resources *kubernetes.Collection) (bool, error) {
+func (d *baseTrait) customize(environment *environment, resources *kubernetes.Collection) (bool, error) {
 	resources.Add(d.getConfigMapFor(environment))
 	resources.Add(d.getDeploymentFor(environment))
 	return true, nil
@@ -46,7 +46,7 @@ func (d *baseTrait) customize(environment environment, resources *kubernetes.Col
 //
 // **********************************
 
-func (*baseTrait) getConfigMapFor(e environment) *corev1.ConfigMap {
+func (*baseTrait) getConfigMapFor(e *environment) *corev1.ConfigMap {
 	// combine properties of integration with context, integration
 	// properties have the priority
 	properties := CombineConfigurationAsMap("property", e.Context, e.Integration)
@@ -82,7 +82,7 @@ func (*baseTrait) getConfigMapFor(e environment) *corev1.ConfigMap {
 //
 // **********************************
 
-func (*baseTrait) getDeploymentFor(e environment) *appsv1.Deployment {
+func (*baseTrait) getDeploymentFor(e *environment) *appsv1.Deployment {
 	sourceName := strings.TrimPrefix(e.Integration.Spec.Source.Name, "/")
 
 	// combine environment of integration with context, integration
diff --git a/pkg/trait/catalog.go b/pkg/trait/catalog.go
index a2ba3b5..df8ad07 100644
--- a/pkg/trait/catalog.go
+++ b/pkg/trait/catalog.go
@@ -30,7 +30,7 @@ var (
 )
 
 // customizersFor returns a Catalog for the given integration details
-func customizersFor(environment environment) customizer {
+func customizersFor(environment *environment) customizer {
 	switch environment.Platform.Spec.Cluster {
 	case v1alpha1.IntegrationPlatformClusterOpenShift:
 		return compose(
@@ -66,7 +66,7 @@ func (c *chainedCustomizer) id() id {
 	return id("")
 }
 
-func (c *chainedCustomizer) customize(environment environment, resources *kubernetes.Collection) (bool, error) {
+func (c *chainedCustomizer) customize(environment *environment, resources *kubernetes.Collection) (bool, error) {
 	atLeastOne := false
 	for _, custom := range c.customizers {
 		if environment.isEnabled(custom.id()) {
diff --git a/pkg/trait/owner.go b/pkg/trait/owner.go
index 6d77ff9..8603bd5 100644
--- a/pkg/trait/owner.go
+++ b/pkg/trait/owner.go
@@ -28,7 +28,7 @@ func (*ownerTrait) id() id {
 	return id("owner")
 }
 
-func (*ownerTrait) customize(e environment, resources *kubernetes.Collection) (bool, error) {
+func (*ownerTrait) customize(e *environment, resources *kubernetes.Collection) (bool, error) {
 	controller := true
 	blockOwnerDeletion := true
 	resources.VisitMetaObject(func(res metav1.Object) {
diff --git a/pkg/trait/route.go b/pkg/trait/route.go
index ded0fe3..acf6984 100644
--- a/pkg/trait/route.go
+++ b/pkg/trait/route.go
@@ -32,7 +32,7 @@ func (*routeTrait) id() id {
 	return id("route")
 }
 
-func (e *routeTrait) customize(environment environment, resources *kubernetes.Collection) (bool, error) {
+func (e *routeTrait) customize(environment *environment, resources *kubernetes.Collection) (bool, error) {
 	var service *corev1.Service
 	resources.VisitService(func(s *corev1.Service) {
 		if s.ObjectMeta.Labels != nil {
@@ -50,7 +50,7 @@ func (e *routeTrait) customize(environment environment, resources *kubernetes.Co
 	return false, nil
 }
 
-func (*routeTrait) getRouteFor(e environment, service *corev1.Service) *routev1.Route {
+func (*routeTrait) getRouteFor(e *environment, service *corev1.Service) *routev1.Route {
 	route := routev1.Route{
 		TypeMeta: metav1.TypeMeta{
 			Kind:       "Route",
diff --git a/pkg/trait/service.go b/pkg/trait/service.go
index d7d116a..f52d08d 100644
--- a/pkg/trait/service.go
+++ b/pkg/trait/service.go
@@ -45,7 +45,7 @@ func (*serviceTrait) id() id {
 	return id("service")
 }
 
-func (e *serviceTrait) customize(environment environment, resources *kubernetes.Collection) (bool, error) {
+func (e *serviceTrait) customize(environment *environment, resources *kubernetes.Collection) (bool, error) {
 	if !e.requiresService(environment) {
 		return false, nil
 	}
@@ -57,7 +57,7 @@ func (e *serviceTrait) customize(environment environment, resources *kubernetes.
 	return true, nil
 }
 
-func (s *serviceTrait) getServiceFor(e environment) (*corev1.Service, error) {
+func (s *serviceTrait) getServiceFor(e *environment) (*corev1.Service, error) {
 	port, err := e.getIntConfigOr(s.id(), serviceTraitPortKey, 8080)
 	if err != nil {
 		return nil, err
@@ -93,7 +93,7 @@ func (s *serviceTrait) getServiceFor(e environment) (*corev1.Service, error) {
 	return &svc, nil
 }
 
-func (*serviceTrait) requiresService(environment environment) bool {
+func (*serviceTrait) requiresService(environment *environment) bool {
 	for _, dep := range environment.Integration.Spec.Dependencies {
 		if decision, present := webComponents[dep]; present {
 			return decision
diff --git a/pkg/trait/trait.go b/pkg/trait/trait.go
index a2b83c6..db3c56f 100644
--- a/pkg/trait/trait.go
+++ b/pkg/trait/trait.go
@@ -32,9 +32,9 @@ func ComputeDeployment(integration *v1alpha1.Integration) ([]runtime.Object, err
 		return nil, err
 	}
 	resources := kubernetes.NewCollection()
-	customizers := customizersFor(*environment)
+	customizers := customizersFor(environment)
 	// invoke the trait framework to determine the needed resources
-	if _, err = customizers.customize(*environment, resources); err != nil {
+	if _, err = customizers.customize(environment, resources); err != nil {
 		return nil, errors.Wrap(err, "error during trait customization")
 	}
 	return resources.Items(), nil
diff --git a/pkg/trait/trait_test.go b/pkg/trait/trait_test.go
new file mode 100644
index 0000000..9ffea3a
--- /dev/null
+++ b/pkg/trait/trait_test.go
@@ -0,0 +1,127 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package trait
+
+import (
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/util/kubernetes"
+	routev1 "github.com/openshift/api/route/v1"
+	"github.com/stretchr/testify/assert"
+	appsv1 "k8s.io/api/apps/v1"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"testing"
+)
+
+func TestOpenshiftTraits(t *testing.T) {
+	env := createTestEnv(v1alpha1.IntegrationPlatformClusterOpenShift, "camel:core")
+	res := processTestEnv(t, env)
+	assert.Contains(t, env.ExecutedCustomizers, id("base"))
+	assert.NotContains(t, env.ExecutedCustomizers, id("service"))
+	assert.NotContains(t, env.ExecutedCustomizers, id("route"))
+	assert.Contains(t, env.ExecutedCustomizers, id("owner"))
+	assert.NotNil(t, res.GetConfigMap(func(cm *corev1.ConfigMap) bool {
+		return cm.Name == "test"
+	}))
+	assert.NotNil(t, res.GetDeployment(func(deployment *appsv1.Deployment) bool {
+		return deployment.Name == "test"
+	}))
+}
+
+func TestOpenshiftTraitsWithWeb(t *testing.T) {
+	env := createTestEnv(v1alpha1.IntegrationPlatformClusterOpenShift, "camel:core", "camel:undertow")
+	res := processTestEnv(t, env)
+	assert.Contains(t, env.ExecutedCustomizers, id("base"))
+	assert.Contains(t, env.ExecutedCustomizers, id("service"))
+	assert.Contains(t, env.ExecutedCustomizers, id("route"))
+	assert.Contains(t, env.ExecutedCustomizers, id("owner"))
+	assert.NotNil(t, res.GetConfigMap(func(cm *corev1.ConfigMap) bool {
+		return cm.Name == "test"
+	}))
+	assert.NotNil(t, res.GetDeployment(func(deployment *appsv1.Deployment) bool {
+		return deployment.Name == "test"
+	}))
+	assert.NotNil(t, res.GetService(func(svc *corev1.Service) bool {
+		return svc.Name == "test"
+	}))
+	assert.NotNil(t, res.GetRoute(func(svc *routev1.Route) bool {
+		return svc.Name == "test"
+	}))
+}
+
+func TestKubernetesTraits(t *testing.T) {
+	env := createTestEnv(v1alpha1.IntegrationPlatformClusterKubernetes, "camel:core")
+	res := processTestEnv(t, env)
+	assert.Contains(t, env.ExecutedCustomizers, id("base"))
+	assert.NotContains(t, env.ExecutedCustomizers, id("service"))
+	assert.NotContains(t, env.ExecutedCustomizers, id("route"))
+	assert.Contains(t, env.ExecutedCustomizers, id("owner"))
+	assert.NotNil(t, res.GetConfigMap(func(cm *corev1.ConfigMap) bool {
+		return cm.Name == "test"
+	}))
+	assert.NotNil(t, res.GetDeployment(func(deployment *appsv1.Deployment) bool {
+		return deployment.Name == "test"
+	}))
+}
+
+func TestKubernetesTraitsWithWeb(t *testing.T) {
+	env := createTestEnv(v1alpha1.IntegrationPlatformClusterKubernetes, "camel:core", "camel:servlet")
+	res := processTestEnv(t, env)
+	assert.Contains(t, env.ExecutedCustomizers, id("base"))
+	assert.Contains(t, env.ExecutedCustomizers, id("service"))
+	assert.NotContains(t, env.ExecutedCustomizers, id("route"))
+	assert.Contains(t, env.ExecutedCustomizers, id("owner"))
+	assert.NotNil(t, res.GetConfigMap(func(cm *corev1.ConfigMap) bool {
+		return cm.Name == "test"
+	}))
+	assert.NotNil(t, res.GetDeployment(func(deployment *appsv1.Deployment) bool {
+		return deployment.Name == "test"
+	}))
+	assert.NotNil(t, res.GetService(func(svc *corev1.Service) bool {
+		return svc.Name == "test"
+	}))
+}
+
+func processTestEnv(t *testing.T, env *environment) *kubernetes.Collection {
+	resources := kubernetes.NewCollection()
+	customizers := customizersFor(env)
+	_, err := customizers.customize(env, resources)
+	assert.Nil(t, err)
+	return resources
+}
+
+func createTestEnv(cluster v1alpha1.IntegrationPlatformCluster, dependencies ...string) *environment {
+	return &environment{
+		Integration: &v1alpha1.Integration{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "test",
+				Namespace: "ns",
+			},
+			Spec: v1alpha1.IntegrationSpec{
+				Dependencies: dependencies,
+			},
+		},
+		Context: &v1alpha1.IntegrationContext{},
+		Platform: &v1alpha1.IntegrationPlatform{
+			Spec: v1alpha1.IntegrationPlatformSpec{
+				Cluster: cluster,
+			},
+		},
+		ExecutedCustomizers: make([]id, 0),
+	}
+}
diff --git a/pkg/trait/types.go b/pkg/trait/types.go
index dd8c269..ad002e1 100644
--- a/pkg/trait/types.go
+++ b/pkg/trait/types.go
@@ -32,7 +32,7 @@ type customizer interface {
 	// The Name of the customizer
 	id() id
 	// Customize executes the trait customization on the resources and return true if the resources have been changed
-	customize(environment environment, resources *kubernetes.Collection) (bool, error)
+	customize(environment *environment, resources *kubernetes.Collection) (bool, error)
 }
 
 // A environment provides the context where the trait is executed
@@ -43,7 +43,7 @@ type environment struct {
 	ExecutedCustomizers []id
 }
 
-func (e environment) getTraitSpec(traitID id) *v1alpha1.IntegrationTraitSpec {
+func (e *environment) getTraitSpec(traitID id) *v1alpha1.IntegrationTraitSpec {
 	if e.Integration.Spec.Traits == nil {
 		return nil
 	}
@@ -53,12 +53,12 @@ func (e environment) getTraitSpec(traitID id) *v1alpha1.IntegrationTraitSpec {
 	return nil
 }
 
-func (e environment) isEnabled(traitID id) bool {
+func (e *environment) isEnabled(traitID id) bool {
 	conf := e.getTraitSpec(traitID)
 	return conf == nil || conf.Enabled == nil || *conf.Enabled
 }
 
-func (e environment) getConfig(traitID id, key string) *string {
+func (e *environment) getConfig(traitID id, key string) *string {
 	conf := e.getTraitSpec(traitID)
 	if conf == nil || conf.Configuration == nil {
 		return nil
@@ -69,7 +69,7 @@ func (e environment) getConfig(traitID id, key string) *string {
 	return nil
 }
 
-func (e environment) getConfigOr(traitID id, key string, defaultValue string) string {
+func (e *environment) getConfigOr(traitID id, key string, defaultValue string) string {
 	val := e.getConfig(traitID, key)
 	if val != nil {
 		return *val
@@ -77,7 +77,7 @@ func (e environment) getConfigOr(traitID id, key string, defaultValue string) st
 	return defaultValue
 }
 
-func (e environment) getIntConfig(traitID id, key string) (*int, error) {
+func (e *environment) getIntConfig(traitID id, key string) (*int, error) {
 	val := e.getConfig(traitID, key)
 	if val == nil {
 		return nil, nil
@@ -89,7 +89,7 @@ func (e environment) getIntConfig(traitID id, key string) (*int, error) {
 	return &intVal, nil
 }
 
-func (e environment) getIntConfigOr(traitID id, key string, defaultValue int) (int, error) {
+func (e *environment) getIntConfigOr(traitID id, key string, defaultValue int) (int, error) {
 	val, err := e.getIntConfig(traitID, key)
 	if err != nil {
 		return 0, err
diff --git a/pkg/util/kubernetes/collection.go b/pkg/util/kubernetes/collection.go
index 0b5f217..8f099c3 100644
--- a/pkg/util/kubernetes/collection.go
+++ b/pkg/util/kubernetes/collection.go
@@ -18,6 +18,7 @@ limitations under the License.
 package kubernetes
 
 import (
+	routev1 "github.com/openshift/api/route/v1"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -55,6 +56,17 @@ func (c *Collection) VisitDeployment(visitor func(*appsv1.Deployment)) {
 	})
 }
 
+// GetDeployment returns a Deployment that matches the given function
+func (c *Collection) GetDeployment(filter func(*appsv1.Deployment)bool) *appsv1.Deployment {
+	var retValue *appsv1.Deployment
+	c.VisitDeployment(func(re *appsv1.Deployment) {
+		if filter(re) {
+			retValue = re
+		}
+	})
+	return retValue
+}
+
 // VisitConfigMap executes the visitor function on all ConfigMap resources
 func (c *Collection) VisitConfigMap(visitor func(*corev1.ConfigMap)) {
 	c.Visit(func(res runtime.Object) {
@@ -64,6 +76,17 @@ func (c *Collection) VisitConfigMap(visitor func(*corev1.ConfigMap)) {
 	})
 }
 
+// GetConfigMap returns a ConfigMap that matches the given function
+func (c *Collection) GetConfigMap(filter func(*corev1.ConfigMap)bool) *corev1.ConfigMap {
+	var retValue *corev1.ConfigMap
+	c.VisitConfigMap(func(re *corev1.ConfigMap) {
+		if filter(re) {
+			retValue = re
+		}
+	})
+	return retValue
+}
+
 // VisitService executes the visitor function on all Service resources
 func (c *Collection) VisitService(visitor func(*corev1.Service)) {
 	c.Visit(func(res runtime.Object) {
@@ -73,6 +96,37 @@ func (c *Collection) VisitService(visitor func(*corev1.Service)) {
 	})
 }
 
+// GetService returns a Service that matches the given function
+func (c *Collection) GetService(filter func(*corev1.Service)bool) *corev1.Service {
+	var retValue *corev1.Service
+	c.VisitService(func(re *corev1.Service) {
+		if filter(re) {
+			retValue = re
+		}
+	})
+	return retValue
+}
+
+// VisitRoute executes the visitor function on all Route resources
+func (c *Collection) VisitRoute(visitor func(*routev1.Route)) {
+	c.Visit(func(res runtime.Object) {
+		if conv, ok := res.(*routev1.Route); ok {
+			visitor(conv)
+		}
+	})
+}
+
+// GetRoute returns a Route that matches the given function
+func (c *Collection) GetRoute(filter func(*routev1.Route)bool) *routev1.Route {
+	var retValue *routev1.Route
+	c.VisitRoute(func(re *routev1.Route) {
+		if filter(re) {
+			retValue = re
+		}
+	})
+	return retValue
+}
+
 // VisitMetaObject executes the visitor function on all meta.Object resources
 func (c *Collection) VisitMetaObject(visitor func(metav1.Object)) {
 	c.Visit(func(res runtime.Object) {