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 <[email protected]>
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)

Reply via email to