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)