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 5aa0b5bb79a60d009eb6077ed69ce216ff9293b8 Author: Pasquale Congiusti <[email protected]> AuthorDate: Mon Mar 1 16:46:11 2021 +0100 refactor(trait): deployment strategy * Moved the logic of retrieving the deployment strategy outside toleration trait Ref #2047 --- pkg/trait/toleration.go | 45 +++---------------- pkg/trait/toleration_test.go | 95 ++++----------------------------------- pkg/trait/trait_types.go | 32 +++++++++++++ pkg/trait/trait_types_test.go | 101 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 126 deletions(-) diff --git a/pkg/trait/toleration.go b/pkg/trait/toleration.go index 700b1ea..481cebf 100644 --- a/pkg/trait/toleration.go +++ b/pkg/trait/toleration.go @@ -22,10 +22,7 @@ import ( "regexp" "strconv" - appsv1 "k8s.io/api/apps/v1" - "k8s.io/api/batch/v1beta1" corev1 "k8s.io/api/core/v1" - serving "knative.dev/serving/pkg/apis/serving/v1" v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/util" @@ -74,46 +71,14 @@ func (t *tolerationTrait) Apply(e *Environment) (err error) { if err != nil { return err } - var specTolerations *[]corev1.Toleration - found := false - - // Deployment - deployment := e.Resources.GetDeployment(func(d *appsv1.Deployment) bool { - return d.Name == e.Integration.Name - }) - if deployment != nil { - specTolerations = &deployment.Spec.Template.Spec.Tolerations - found = true - } - - // Knative service - if !found { - knativeService := e.Resources.GetKnativeService(func(s *serving.Service) bool { - return s.Name == e.Integration.Name - }) - if knativeService != nil { - specTolerations = &knativeService.Spec.Template.Spec.Tolerations - found = true - } - } - - // Cronjob - if !found { - cronJob := e.Resources.GetCronJob(func(c *v1beta1.CronJob) bool { - return c.Name == e.Integration.Name - }) - if cronJob != nil { - specTolerations = &cronJob.Spec.JobTemplate.Spec.Template.Spec.Tolerations - found = true - } - } + podSpec := e.GetIntegrationPodSpec() // Add the toleration - if found { - if *specTolerations == nil { - *specTolerations = make([]corev1.Toleration, 0) + if podSpec != nil { + if podSpec.Tolerations == nil { + podSpec.Tolerations = make([]corev1.Toleration, 0) } - *specTolerations = append(*specTolerations, tolerations...) + podSpec.Tolerations = append(podSpec.Tolerations, tolerations...) } return nil diff --git a/pkg/trait/toleration_test.go b/pkg/trait/toleration_test.go index b5b4741..8ce65cb 100644 --- a/pkg/trait/toleration_test.go +++ b/pkg/trait/toleration_test.go @@ -21,20 +21,14 @@ import ( "testing" "github.com/stretchr/testify/assert" - serving "knative.dev/serving/pkg/apis/serving/v1" - appsv1 "k8s.io/api/apps/v1" - "k8s.io/api/batch/v1beta1" corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/util" - "github.com/apache/camel-k/pkg/util/kubernetes" ) func TestConfigureTolerationTraitMissingTaint(t *testing.T) { - environment, _ := createNominalDeploymentTolerationTest() + environment, _ := createNominalDeploymentTraitTest() tolerationTrait := createNominalTolerationTrait() success, err := tolerationTrait.Configure(environment) @@ -44,7 +38,7 @@ func TestConfigureTolerationTraitMissingTaint(t *testing.T) { } func TestApplyTolerationTraitMalformedTaint(t *testing.T) { - environment, _ := createNominalDeploymentTolerationTest() + environment, _ := createNominalDeploymentTraitTest() tolerationTrait := createNominalTolerationTrait() tolerationTrait.Taints = append(tolerationTrait.Taints, "my-toleration-failure") @@ -57,13 +51,13 @@ func TestApplyPodTolerationLabelsDefault(t *testing.T) { tolerationTrait := createNominalTolerationTrait() tolerationTrait.Taints = append(tolerationTrait.Taints, "my-toleration=my-value:NoExecute") - environment, deployment := createNominalDeploymentTolerationTest() + environment, deployment := createNominalDeploymentTraitTest() testApplyPodTolerationLabelsDefault(t, tolerationTrait, environment, &deployment.Spec.Template.Spec.Tolerations) - environment, knativeService := createNominalKnativeServiceTolerationTest() + environment, knativeService := createNominalKnativeServiceTraitTest() testApplyPodTolerationLabelsDefault(t, tolerationTrait, environment, &knativeService.Spec.Template.Spec.Tolerations) - environment, cronJob := createNominalCronJobTolerationTest() + environment, cronJob := createNominalCronJobTraitTest() testApplyPodTolerationLabelsDefault(t, tolerationTrait, environment, &cronJob.Spec.JobTemplate.Spec.Template.Spec.Tolerations) } @@ -83,13 +77,13 @@ func TestApplyPodTolerationLabelsTolerationSeconds(t *testing.T) { tolerationTrait := createNominalTolerationTrait() tolerationTrait.Taints = append(tolerationTrait.Taints, "my-toleration:NoExecute:300") - environment, deployment := createNominalDeploymentTolerationTest() + environment, deployment := createNominalDeploymentTraitTest() testApplyPodTolerationLabelsTolerationSeconds(t, tolerationTrait, environment, &deployment.Spec.Template.Spec.Tolerations) - environment, knativeService := createNominalKnativeServiceTolerationTest() + environment, knativeService := createNominalKnativeServiceTraitTest() testApplyPodTolerationLabelsTolerationSeconds(t, tolerationTrait, environment, &knativeService.Spec.Template.Spec.Tolerations) - environment, cronJob := createNominalCronJobTolerationTest() + environment, cronJob := createNominalCronJobTraitTest() testApplyPodTolerationLabelsTolerationSeconds(t, tolerationTrait, environment, &cronJob.Spec.JobTemplate.Spec.Template.Spec.Tolerations) } @@ -106,7 +100,7 @@ func testApplyPodTolerationLabelsTolerationSeconds(t *testing.T, trait *tolerati } func TestTolerationValidTaints(t *testing.T) { - environment, _ := createNominalDeploymentTolerationTest() + environment, _ := createNominalDeploymentTraitTest() tolerationTrait := createNominalTolerationTrait() tolerationTrait.Taints = append(tolerationTrait.Taints, "my-toleration:NoExecute") tolerationTrait.Taints = append(tolerationTrait.Taints, "my-toleration:NoSchedule") @@ -122,77 +116,6 @@ func TestTolerationValidTaints(t *testing.T) { assert.Nil(t, err) } -func createNominalDeploymentTolerationTest() (*Environment, *appsv1.Deployment) { - deployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "integration-name", - }, - Spec: appsv1.DeploymentSpec{ - Template: corev1.PodTemplateSpec{}, - }, - } - - environment := &Environment{ - Integration: &v1.Integration{ - ObjectMeta: metav1.ObjectMeta{ - Name: "integration-name", - }, - Status: v1.IntegrationStatus{ - Phase: v1.IntegrationPhaseDeploying, - }, - }, - Resources: kubernetes.NewCollection(deployment), - } - - return environment, deployment -} - -func createNominalKnativeServiceTolerationTest() (*Environment, *serving.Service) { - knativeService := &serving.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "integration-name", - }, - Spec: serving.ServiceSpec{}, - } - - environment := &Environment{ - Integration: &v1.Integration{ - ObjectMeta: metav1.ObjectMeta{ - Name: "integration-name", - }, - Status: v1.IntegrationStatus{ - Phase: v1.IntegrationPhaseDeploying, - }, - }, - Resources: kubernetes.NewCollection(knativeService), - } - - return environment, knativeService -} - -func createNominalCronJobTolerationTest() (*Environment, *v1beta1.CronJob) { - cronJob := &v1beta1.CronJob{ - ObjectMeta: metav1.ObjectMeta{ - Name: "integration-name", - }, - Spec: v1beta1.CronJobSpec{}, - } - - environment := &Environment{ - Integration: &v1.Integration{ - ObjectMeta: metav1.ObjectMeta{ - Name: "integration-name", - }, - Status: v1.IntegrationStatus{ - Phase: v1.IntegrationPhaseDeploying, - }, - }, - Resources: kubernetes.NewCollection(cronJob), - } - - return environment, cronJob -} - func createNominalTolerationTrait() *tolerationTrait { tolerationTrait := newTolerationTrait().(*tolerationTrait) tolerationTrait.Enabled = util.BoolP(true) diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go index 2fff975..5b360d0 100644 --- a/pkg/trait/trait_types.go +++ b/pkg/trait/trait_types.go @@ -25,9 +25,12 @@ import ( "strconv" "strings" + appsv1 "k8s.io/api/apps/v1" + "k8s.io/api/batch/v1beta1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + serving "knative.dev/serving/pkg/apis/serving/v1" v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/client" @@ -309,6 +312,35 @@ func (e *Environment) getControllerStrategyChoosers() (res []ControllerStrategyS return res } +// GetIntegrationPodSpec return the Integration Template Pod Specification, regardless of the deployment strategy +func (e *Environment) GetIntegrationPodSpec() *corev1.PodSpec { + // Deployment + deployment := e.Resources.GetDeployment(func(d *appsv1.Deployment) bool { + return d.Name == e.Integration.Name + }) + if deployment != nil { + return &deployment.Spec.Template.Spec + } + + // Knative service + knativeService := e.Resources.GetKnativeService(func(s *serving.Service) bool { + return s.Name == e.Integration.Name + }) + if knativeService != nil { + return &knativeService.Spec.Template.Spec.PodSpec + } + + // Cronjob + cronJob := e.Resources.GetCronJob(func(c *v1beta1.CronJob) bool { + return c.Name == e.Integration.Name + }) + if cronJob != nil { + return &cronJob.Spec.JobTemplate.Spec.Template.Spec + } + + return nil +} + // DetermineNamespace -- func (e *Environment) DetermineNamespace() string { if e.Integration != nil && e.Integration.Namespace != "" { diff --git a/pkg/trait/trait_types_test.go b/pkg/trait/trait_types_test.go new file mode 100644 index 0000000..68e0238 --- /dev/null +++ b/pkg/trait/trait_types_test.go @@ -0,0 +1,101 @@ +/* +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 ( + serving "knative.dev/serving/pkg/apis/serving/v1" + + appsv1 "k8s.io/api/apps/v1" + "k8s.io/api/batch/v1beta1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + v1 "github.com/apache/camel-k/pkg/apis/camel/v1" + "github.com/apache/camel-k/pkg/util/kubernetes" +) + +func createNominalDeploymentTraitTest() (*Environment, *appsv1.Deployment) { + deployment := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "integration-name", + }, + Spec: appsv1.DeploymentSpec{ + Template: corev1.PodTemplateSpec{}, + }, + } + + environment := &Environment{ + Integration: &v1.Integration{ + ObjectMeta: metav1.ObjectMeta{ + Name: "integration-name", + }, + Status: v1.IntegrationStatus{ + Phase: v1.IntegrationPhaseDeploying, + }, + }, + Resources: kubernetes.NewCollection(deployment), + } + + return environment, deployment +} + +func createNominalKnativeServiceTraitTest() (*Environment, *serving.Service) { + knativeService := &serving.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "integration-name", + }, + Spec: serving.ServiceSpec{}, + } + + environment := &Environment{ + Integration: &v1.Integration{ + ObjectMeta: metav1.ObjectMeta{ + Name: "integration-name", + }, + Status: v1.IntegrationStatus{ + Phase: v1.IntegrationPhaseDeploying, + }, + }, + Resources: kubernetes.NewCollection(knativeService), + } + + return environment, knativeService +} + +func createNominalCronJobTraitTest() (*Environment, *v1beta1.CronJob) { + cronJob := &v1beta1.CronJob{ + ObjectMeta: metav1.ObjectMeta{ + Name: "integration-name", + }, + Spec: v1beta1.CronJobSpec{}, + } + + environment := &Environment{ + Integration: &v1.Integration{ + ObjectMeta: metav1.ObjectMeta{ + Name: "integration-name", + }, + Status: v1.IntegrationStatus{ + Phase: v1.IntegrationPhaseDeploying, + }, + }, + Resources: kubernetes.NewCollection(cronJob), + } + + return environment, cronJob +}
