[camel-k] branch master updated: Added unit tests for the affinity trait #255

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[camel-k] branch master updated: Added unit tests for the affinity trait #255

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

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


The following commit(s) were added to refs/heads/master by this push:
     new accf2e8  Added unit tests for the affinity trait #255
accf2e8 is described below

commit accf2e8dfb6f2c689d56cfbcd71a674d17bc3e8d
Author: aldettinger <[hidden email]>
AuthorDate: Fri Nov 8 17:20:10 2019 +0100

    Added unit tests for the affinity trait #255
---
 pkg/trait/affinity_test.go | 154 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 154 insertions(+)

diff --git a/pkg/trait/affinity_test.go b/pkg/trait/affinity_test.go
new file mode 100644
index 0000000..4aa7153
--- /dev/null
+++ b/pkg/trait/affinity_test.go
@@ -0,0 +1,154 @@
+/*
+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 (
+ "testing"
+
+ "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"
+
+ "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+ "github.com/apache/camel-k/pkg/util/kubernetes"
+)
+
+func TestConfigureAffinityTraitDoesSucceed(t *testing.T) {
+ affinityTrait, environment, _ := createNominalAffinityTest()
+ configured, err := affinityTrait.Configure(environment)
+
+ assert.True(t, configured)
+ assert.Nil(t, err)
+}
+
+func TestConfigureAffinityTraitWithConflictingAffinitiesFails(t *testing.T) {
+ affinityTrait, environment, _ := createNominalAffinityTest()
+ affinityTrait.PodAffinity = true
+ affinityTrait.PodAntiAffinity = true
+ configured, err := affinityTrait.Configure(environment)
+
+ assert.False(t, configured)
+ assert.NotNil(t, err)
+}
+
+func TestConfigureDisabledAffinityTraitFails(t *testing.T) {
+ affinityTrait, environment, _ := createNominalAffinityTest()
+ affinityTrait.Enabled = new(bool)
+ configured, err := affinityTrait.Configure(environment)
+
+ assert.False(t, configured)
+ assert.Nil(t, err)
+}
+
+func TestApplyEmptyAffinityLabelsDoesSucceed(t *testing.T) {
+ affinityTrait, environment, _ := createNominalAffinityTest()
+
+ err := affinityTrait.Apply(environment)
+
+ assert.Nil(t, err)
+}
+
+func TestApplyNodeAffinityLabelsDoesSucceed(t *testing.T) {
+ affinityTrait, environment, deployment := createNominalAffinityTest()
+ affinityTrait.NodeAffinityLabels = "criteria = value"
+
+ err := affinityTrait.Apply(environment)
+
+ assert.Nil(t, err)
+ assert.NotNil(t, deployment.Spec.Template.Spec.Affinity.NodeAffinity)
+ nodeAffinity := deployment.Spec.Template.Spec.Affinity.NodeAffinity
+ assert.NotNil(t, nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions[0])
+ nodeSelectorRequirement := nodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions[0]
+ assert.Equal(t, "criteria", nodeSelectorRequirement.Key)
+ assert.Equal(t, corev1.NodeSelectorOpIn, nodeSelectorRequirement.Operator)
+ assert.ElementsMatch(t, [1]string{"value"}, nodeSelectorRequirement.Values)
+}
+
+func TestApplyPodAntiAffinityLabelsDoesSucceed(t *testing.T) {
+ affinityTrait, environment, deployment := createNominalAffinityTest()
+ affinityTrait.PodAntiAffinity = true
+ affinityTrait.PodAntiAffinityLabels = "criteria != value"
+
+ err := affinityTrait.Apply(environment)
+
+ assert.Nil(t, err)
+ assert.NotNil(t, deployment.Spec.Template.Spec.Affinity.PodAntiAffinity)
+ podAntiAffinity := deployment.Spec.Template.Spec.Affinity.PodAntiAffinity
+ assert.NotNil(t, podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].LabelSelector.MatchExpressions[0])
+ userRequirement := podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].LabelSelector.MatchExpressions[0]
+ assert.Equal(t, "criteria", userRequirement.Key)
+ assert.Equal(t, metav1.LabelSelectorOpNotIn, userRequirement.Operator)
+ assert.ElementsMatch(t, [1]string{"value"}, userRequirement.Values)
+ assert.NotNil(t, podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].LabelSelector.MatchExpressions[1])
+ integrationRequirement := podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].LabelSelector.MatchExpressions[1]
+ assert.Equal(t, "camel.apache.org/integration", integrationRequirement.Key)
+ assert.Equal(t, metav1.LabelSelectorOpIn, integrationRequirement.Operator)
+ assert.ElementsMatch(t, [1]string{"integration-name"}, integrationRequirement.Values)
+}
+
+func TestApplyPodAffinityLabelsDoesSucceed(t *testing.T) {
+ affinityTrait, environment, deployment := createNominalAffinityTest()
+ affinityTrait.PodAffinity = true
+ affinityTrait.PodAffinityLabels = "!criteria"
+
+ err := affinityTrait.Apply(environment)
+
+ assert.Nil(t, err)
+ assert.NotNil(t, deployment.Spec.Template.Spec.Affinity.PodAffinity)
+ podAffinity := deployment.Spec.Template.Spec.Affinity.PodAffinity
+ assert.NotNil(t, podAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].LabelSelector.MatchExpressions[0])
+ userRequirement := podAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].LabelSelector.MatchExpressions[0]
+ assert.Equal(t, "criteria", userRequirement.Key)
+ assert.Equal(t, metav1.LabelSelectorOpDoesNotExist, userRequirement.Operator)
+ assert.NotNil(t, podAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].LabelSelector.MatchExpressions[1])
+ integrationRequirement := podAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].LabelSelector.MatchExpressions[1]
+ assert.Equal(t, "camel.apache.org/integration", integrationRequirement.Key)
+ assert.Equal(t, metav1.LabelSelectorOpIn, integrationRequirement.Operator)
+ assert.ElementsMatch(t, [1]string{"integration-name"}, integrationRequirement.Values)
+}
+
+func createNominalAffinityTest() (*affinityTrait, *Environment, *appsv1.Deployment) {
+ trait := newAffinityTrait()
+ enabled := true
+ trait.Enabled = &enabled
+
+ deployment := &appsv1.Deployment{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "integration-name",
+ },
+ Spec: appsv1.DeploymentSpec{
+ Template: corev1.PodTemplateSpec{},
+ },
+ }
+
+ environment := &Environment{
+ Integration: &v1alpha1.Integration{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "integration-name",
+ },
+ Status: v1alpha1.IntegrationStatus{
+ Phase: v1alpha1.IntegrationPhaseDeploying,
+ },
+ },
+ Resources: kubernetes.NewCollection(deployment),
+ }
+
+ return trait, environment, deployment
+}