You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2020/03/16 08:27:18 UTC

[camel-k] branch master updated: Fix probes port detection

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

nferraro 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 1e0aab1  Fix probes port detection
1e0aab1 is described below

commit 1e0aab1d3ae7eb39536156a2c06619b22b56e0c9
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Fri Mar 13 19:21:36 2020 +0100

    Fix probes port detection
---
 pkg/trait/container.go             | 90 +++++++++++++++++++++++---------------
 pkg/trait/container_probes_test.go | 21 ++++++---
 2 files changed, 69 insertions(+), 42 deletions(-)

diff --git a/pkg/trait/container.go b/pkg/trait/container.go
index 416e844..6028936 100644
--- a/pkg/trait/container.go
+++ b/pkg/trait/container.go
@@ -41,7 +41,6 @@ const (
 	defaultContainerName = "integration"
 	defaultContainerPort = 8080
 	defaultServicePort   = 80
-	defaultProbePort     = 8081
 	defaultProbePath     = "/health"
 	containerTraitID     = "container"
 )
@@ -81,10 +80,10 @@ type containerTrait struct {
 
 	// ProbesEnabled enable/disable probes on the container (default `false`)
 	ProbesEnabled bool `property:"probes-enabled"`
-	// ProbePort configures the port on which the probes are exposed if the container is not exposed
-	// through an `http` port (default `8081`). Note that the value has no effect for Knative service
+	// ProbePort configures the port on which the probes are exposed, by default it inhierit the
+	// value from the `http` port configured on the container. Note that the value has no effect for Knative service
 	// as the port should be the same as the port declared by the container.
-	ProbePort int `property:"probe-port"`
+	ProbePort *int `property:"probe-port"`
 	// Path to access on the probe ( default `/health`). Note that this property is not supported
 	// on quarkus runtime and setting it will result in the integration failing to start.
 	ProbePath string `property:"probe-path"`
@@ -123,7 +122,7 @@ func newContainerTrait() Trait {
 		ServicePortName: httpPortName,
 		Name:            defaultContainerName,
 		ProbesEnabled:   false,
-		ProbePort:       defaultProbePort,
+		ProbePort:       nil,
 		ProbePath:       defaultProbePath,
 	}
 }
@@ -181,6 +180,7 @@ func (t *containerTrait) configureDependencies(e *Environment) {
 	}
 }
 
+// nolint:gocyclo
 func (t *containerTrait) configureContainer(e *Environment) error {
 	container := corev1.Container{
 		Name:  t.Name,
@@ -203,32 +203,40 @@ func (t *containerTrait) configureContainer(e *Environment) error {
 	if t.Expose != nil && *t.Expose {
 		t.configureService(e, &container)
 	}
-	if props := e.ComputeApplicationProperties(); props != nil {
-		e.Resources.Add(props)
-	}
 
 	//
 	// Deployment
 	//
 	if err := e.Resources.VisitDeploymentE(func(deployment *appsv1.Deployment) error {
+		if t.ProbesEnabled {
+			var port int
+
+			switch {
+			case t.ProbePort != nil:
+				port = *t.ProbePort
+			case t.Expose != nil && *t.Expose && t.PortName == httpPortName:
+				port = t.Port
+			default:
+				return fmt.Errorf("unable to determine the port probes should be bound to")
+			}
+
+			if err := t.configureProbes(e, &container, port, t.ProbePath); err != nil {
+				return err
+			}
+		}
+
 		for _, envVar := range e.EnvVars {
 			envvar.SetVar(&container.Env, envVar)
 		}
+		if props := e.ComputeApplicationProperties(); props != nil {
+			e.Resources.Add(props)
+		}
 
 		e.ConfigureVolumesAndMounts(
 			&deployment.Spec.Template.Spec.Volumes,
 			&container.VolumeMounts,
 		)
 
-		port := t.Port
-		if t.PortName != httpPortName {
-			port = t.ProbePort
-		}
-
-		if err := t.configureProbes(e, &container, port, t.ProbePath); err != nil {
-			return err
-		}
-
 		deployment.Spec.Template.Spec.Containers = append(deployment.Spec.Template.Spec.Containers, container)
 
 		return nil
@@ -240,6 +248,13 @@ func (t *containerTrait) configureContainer(e *Environment) error {
 	// Knative Service
 	//
 	if err := e.Resources.VisitKnativeServiceE(func(service *serving.Service) error {
+		if t.ProbesEnabled {
+			// don't set the port on Knative service as it is not allowed.
+			if err := t.configureProbes(e, &container, 0, t.ProbePath); err != nil {
+				return err
+			}
+		}
+
 		for _, env := range e.EnvVars {
 			switch {
 			case env.ValueFrom == nil:
@@ -254,17 +269,15 @@ func (t *containerTrait) configureContainer(e *Environment) error {
 				envvar.SetVar(&container.Env, env)
 			}
 		}
+		if props := e.ComputeApplicationProperties(); props != nil {
+			e.Resources.Add(props)
+		}
 
 		e.ConfigureVolumesAndMounts(
 			&service.Spec.ConfigurationSpec.Template.Spec.Volumes,
 			&container.VolumeMounts,
 		)
 
-		// don't set the port on Knative service as it is not allowed.
-		if err := t.configureProbes(e, &container, 0, t.ProbePath); err != nil {
-			return err
-		}
-
 		service.Spec.ConfigurationSpec.Template.Spec.Containers = append(service.Spec.ConfigurationSpec.Template.Spec.Containers, container)
 
 		return nil
@@ -276,24 +289,35 @@ func (t *containerTrait) configureContainer(e *Environment) error {
 	// CronJob
 	//
 	if err := e.Resources.VisitCronJobE(func(cron *v1beta1.CronJob) error {
+		if t.ProbesEnabled {
+			var port int
+
+			switch {
+			case t.ProbePort != nil:
+				port = *t.ProbePort
+			case t.Expose != nil && *t.Expose && t.PortName == httpPortName:
+				port = t.Port
+			default:
+				return fmt.Errorf("unable to determine the port probes should be bound to")
+			}
+
+			if err := t.configureProbes(e, &container, port, t.ProbePath); err != nil {
+				return err
+			}
+		}
+
 		for _, envVar := range e.EnvVars {
 			envvar.SetVar(&container.Env, envVar)
 		}
+		if props := e.ComputeApplicationProperties(); props != nil {
+			e.Resources.Add(props)
+		}
 
 		e.ConfigureVolumesAndMounts(
 			&cron.Spec.JobTemplate.Spec.Template.Spec.Volumes,
 			&container.VolumeMounts,
 		)
 
-		port := t.Port
-		if t.PortName != httpPortName {
-			port = t.ProbePort
-		}
-
-		if err := t.configureProbes(e, &container, port, t.ProbePath); err != nil {
-			return err
-		}
-
 		cron.Spec.JobTemplate.Spec.Template.Spec.Containers = append(cron.Spec.JobTemplate.Spec.Template.Spec.Containers, container)
 
 		return nil
@@ -391,10 +415,6 @@ func (t *containerTrait) configureResources(_ *Environment, container *corev1.Co
 	}
 }
 func (t *containerTrait) configureProbes(e *Environment, container *corev1.Container, port int, path string) error {
-	if !t.ProbesEnabled {
-		return nil
-	}
-
 	if e.ApplicationProperties == nil {
 		e.ApplicationProperties = make(map[string]string)
 	}
diff --git a/pkg/trait/container_probes_test.go b/pkg/trait/container_probes_test.go
index 930710b..5d2cde6 100644
--- a/pkg/trait/container_probes_test.go
+++ b/pkg/trait/container_probes_test.go
@@ -84,7 +84,6 @@ func TestProbesDepsQuarkus(t *testing.T) {
 	env.Integration.Status.Phase = v1.IntegrationPhaseInitialization
 
 	ctr := newTestContainerTrait()
-	ctr.ProbePort = 9191
 
 	ok, err := ctr.Configure(&env)
 	assert.Nil(t, err)
@@ -102,8 +101,10 @@ func TestProbesOnDeployment(t *testing.T) {
 	env.Integration.Status.Phase = v1.IntegrationPhaseDeploying
 	env.Resources.Add(&target)
 
+	expose := true
+
 	ctr := newTestContainerTrait()
-	ctr.ProbePort = 9191
+	ctr.Expose = &expose
 	ctr.LivenessTimeout = 1234
 
 	err := ctr.Apply(&env)
@@ -125,19 +126,21 @@ func TestProbesOnDeploymentWithNoHttpPort(t *testing.T) {
 	env.Integration.Status.Phase = v1.IntegrationPhaseDeploying
 	env.Resources.Add(&target)
 
+	probePort := 9191
+
 	ctr := newTestContainerTrait()
 	ctr.PortName = "custom"
-	ctr.ProbePort = 9191
+	ctr.ProbePort = &probePort
 	ctr.LivenessTimeout = 1234
 
 	err := ctr.Apply(&env)
 	assert.Nil(t, err)
 
 	assert.Equal(t, "", target.Spec.Template.Spec.Containers[0].LivenessProbe.HTTPGet.Host)
-	assert.Equal(t, int32(9191), target.Spec.Template.Spec.Containers[0].LivenessProbe.HTTPGet.Port.IntVal)
+	assert.Equal(t, int32(probePort), target.Spec.Template.Spec.Containers[0].LivenessProbe.HTTPGet.Port.IntVal)
 	assert.Equal(t, defaultProbePath, target.Spec.Template.Spec.Containers[0].LivenessProbe.HTTPGet.Path)
 	assert.Equal(t, "", target.Spec.Template.Spec.Containers[0].ReadinessProbe.HTTPGet.Host)
-	assert.Equal(t, int32(9191), target.Spec.Template.Spec.Containers[0].ReadinessProbe.HTTPGet.Port.IntVal)
+	assert.Equal(t, int32(probePort), target.Spec.Template.Spec.Containers[0].ReadinessProbe.HTTPGet.Port.IntVal)
 	assert.Equal(t, defaultProbePath, target.Spec.Template.Spec.Containers[0].ReadinessProbe.HTTPGet.Path)
 	assert.Equal(t, int32(1234), target.Spec.Template.Spec.Containers[0].LivenessProbe.TimeoutSeconds)
 }
@@ -149,8 +152,10 @@ func TestProbesOnKnativeService(t *testing.T) {
 	env.Integration.Status.Phase = v1.IntegrationPhaseDeploying
 	env.Resources.Add(&target)
 
+	expose := true
+
 	ctr := newTestContainerTrait()
-	ctr.ProbePort = 9191
+	ctr.Expose = &expose
 	ctr.LivenessTimeout = 1234
 
 	err := ctr.Apply(&env)
@@ -172,9 +177,11 @@ func TestProbesOnKnativeServiceWithNoHttpPort(t *testing.T) {
 	env.Integration.Status.Phase = v1.IntegrationPhaseDeploying
 	env.Resources.Add(&target)
 
+	probePort := 9191
+
 	ctr := newTestContainerTrait()
 	ctr.PortName = "custom"
-	ctr.ProbePort = 9191
+	ctr.ProbePort = &probePort
 	ctr.LivenessTimeout = 1234
 
 	err := ctr.Apply(&env)