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 64553ae05309806ebbdf999179a3edc4bcc425ee
Author: Antonin Stefanutti <[email protected]>
AuthorDate: Tue Sep 24 18:28:09 2019 +0200

    fix(prometheus): Create a service if no one exists already
---
 pkg/trait/prometheus.go | 47 ++++++++++++++++++++++---------------
 pkg/trait/service.go    | 61 ++++++++++++++++++++++++++++---------------------
 2 files changed, 64 insertions(+), 44 deletions(-)

diff --git a/pkg/trait/prometheus.go b/pkg/trait/prometheus.go
index 7ff1db4..bbef5b8 100644
--- a/pkg/trait/prometheus.go
+++ b/pkg/trait/prometheus.go
@@ -94,32 +94,43 @@ func (t *prometheusTrait) Apply(e *Environment) (err error) 
{
        container.Ports = append(container.Ports, *containerPort)
        condition.Message += fmt.Sprintf("%s(%s/%d)", container.Name, 
containerPort.Name, containerPort.ContainerPort)
 
-       // Add the service port
+       // Retrieve the service or create a new one if the service trait is 
enabled
+       serviceEnabled := false
        service := e.Resources.GetServiceForIntegration(e.Integration)
        if service == nil {
-               condition.Status = corev1.ConditionFalse
-               condition.Reason = 
v1alpha1.IntegrationConditionServiceNotAvailableReason
-       } else {
+               trait := e.Catalog.GetTrait(serviceTraitID)
+               if serviceTrait, ok := trait.(*serviceTrait); ok {
+                       serviceEnabled = serviceTrait.isEnabled()
+               }
+               if serviceEnabled {
+                       // add a new service if not already created
+                       service = getServiceFor(e)
+                       e.Resources.Add(service)
+               }
+       }
+
+       // Add the service port and service monitor resource
+       // A better strategy may be needed when the Knative profile is active
+       if serviceEnabled {
                servicePort := t.getServicePort()
                service.Spec.Ports = append(service.Spec.Ports, *servicePort)
                condition.Message += fmt.Sprintf("%s(%s/%d) -> ", service.Name, 
servicePort.Name, servicePort.Port)
-       }
-
-       e.Integration.Status.SetConditions(condition)
 
-       if condition.Status == corev1.ConditionFalse {
-               return nil
-       }
-
-       // Add the ServiceMonitor resource
-       if t.ServiceMonitor {
-               smt, err := t.getServiceMonitorFor(e)
-               if err != nil {
-                       return err
+               // Add the ServiceMonitor resource
+               if t.ServiceMonitor {
+                       smt, err := t.getServiceMonitorFor(e)
+                       if err != nil {
+                               return err
+                       }
+                       e.Resources.Add(smt)
                }
-               e.Resources.Add(smt)
+       } else {
+               condition.Status = corev1.ConditionFalse
+               condition.Reason = 
v1alpha1.IntegrationConditionServiceNotAvailableReason
        }
 
+       e.Integration.Status.SetConditions(condition)
+
        return nil
 }
 
@@ -167,7 +178,7 @@ func (t *prometheusTrait) getServiceMonitorFor(e 
*Environment) (*monitoringv1.Se
                        },
                        Endpoints: []monitoringv1.Endpoint{
                                {
-                                       Port: "prometheus",
+                                       Port: prometheusPortName,
                                },
                        },
                },
diff --git a/pkg/trait/service.go b/pkg/trait/service.go
index ae204c0..3efb446 100644
--- a/pkg/trait/service.go
+++ b/pkg/trait/service.go
@@ -30,16 +30,23 @@ type serviceTrait struct {
        Auto      *bool `property:"auto"`
 }
 
-const httpPortName = "http"
+const (
+       serviceTraitID = "service"
+       httpPortName   = "http"
+)
 
 func newServiceTrait() *serviceTrait {
        return &serviceTrait{
-               BaseTrait: newBaseTrait("service"),
+               BaseTrait: newBaseTrait(serviceTraitID),
        }
 }
 
+func (t *serviceTrait) isEnabled() bool {
+       return t.Enabled == nil || *t.Enabled
+}
+
 func (t *serviceTrait) Configure(e *Environment) (bool, error) {
-       if t.Enabled != nil && !*t.Enabled {
+       if !t.isEnabled() {
                e.Integration.Status.SetCondition(
                        v1alpha1.IntegrationConditionServiceAvailable,
                        corev1.ConditionFalse,
@@ -83,32 +90,34 @@ func (t *serviceTrait) Configure(e *Environment) (bool, 
error) {
        return true, nil
 }
 
-func (t *serviceTrait) Apply(e *Environment) (err error) {
+func (t *serviceTrait) Apply(e *Environment) error {
        svc := e.Resources.GetServiceForIntegration(e.Integration)
+       // add a new service if not already created
        if svc == nil {
-               svc := corev1.Service{
-                       TypeMeta: metav1.TypeMeta{
-                               Kind:       "Service",
-                               APIVersion: "v1",
-                       },
-                       ObjectMeta: metav1.ObjectMeta{
-                               Name:      e.Integration.Name,
-                               Namespace: e.Integration.Namespace,
-                               Labels: map[string]string{
-                                       "camel.apache.org/integration": 
e.Integration.Name,
-                               },
+               svc = getServiceFor(e)
+               e.Resources.Add(svc)
+       }
+       return nil
+}
+
+func getServiceFor(e *Environment) *corev1.Service {
+       return &corev1.Service{
+               TypeMeta: metav1.TypeMeta{
+                       Kind:       "Service",
+                       APIVersion: "v1",
+               },
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      e.Integration.Name,
+                       Namespace: e.Integration.Namespace,
+                       Labels: map[string]string{
+                               "camel.apache.org/integration": 
e.Integration.Name,
                        },
-                       Spec: corev1.ServiceSpec{
-                               Ports: []corev1.ServicePort{},
-                               Selector: map[string]string{
-                                       "camel.apache.org/integration": 
e.Integration.Name,
-                               },
+               },
+               Spec: corev1.ServiceSpec{
+                       Ports: []corev1.ServicePort{},
+                       Selector: map[string]string{
+                               "camel.apache.org/integration": 
e.Integration.Name,
                        },
-               }
-
-               // add a new service if not already created
-               e.Resources.Add(&svc)
+               },
        }
-
-       return nil
 }

Reply via email to