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

lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit 9b9f7437eae8872480c0e5facaf4cf5809912524
Author: nferraro <ni.ferr...@gmail.com>
AuthorDate: Wed Oct 31 00:17:20 2018 +0100

    Add ingress trait
---
 pkg/trait/catalog.go               |  4 +++
 pkg/trait/{route.go => ingress.go} | 55 +++++++++++++++++++++++---------------
 pkg/trait/route.go                 |  6 +++--
 3 files changed, 41 insertions(+), 24 deletions(-)

diff --git a/pkg/trait/catalog.go b/pkg/trait/catalog.go
index 049b1a6..d5cf865 100644
--- a/pkg/trait/catalog.go
+++ b/pkg/trait/catalog.go
@@ -30,6 +30,7 @@ type Catalog struct {
        tDeployment ITrait
        tService    ITrait
        tRoute      ITrait
+       tIngress    ITrait
        tOwner      ITrait
 }
 
@@ -39,6 +40,7 @@ func NewCatalog() *Catalog {
                tDeployment: newDeploymentTrait(),
                tService:    newServiceTrait(),
                tRoute:      newRouteTrait(),
+               tIngress:    newIngressTrait(),
                tOwner:      newOwnerTrait(),
        }
 }
@@ -48,6 +50,7 @@ func (c *Catalog) allTraits() []ITrait {
                c.tDeployment,
                c.tService,
                c.tRoute,
+               c.tIngress,
                c.tOwner,
        }
 }
@@ -65,6 +68,7 @@ func (c *Catalog) traitsFor(environment *environment) 
[]ITrait {
                return []ITrait{
                        c.tDeployment,
                        c.tService,
+                       c.tIngress,
                        c.tOwner,
                }
                // case Knative: ...
diff --git a/pkg/trait/route.go b/pkg/trait/ingress.go
similarity index 54%
copy from pkg/trait/route.go
copy to pkg/trait/ingress.go
index 1553bae..bbd7017 100644
--- a/pkg/trait/route.go
+++ b/pkg/trait/ingress.go
@@ -18,41 +18,50 @@ limitations under the License.
 package trait
 
 import (
+       "errors"
        "github.com/apache/camel-k/pkg/util/kubernetes"
-       routev1 "github.com/openshift/api/route/v1"
        corev1 "k8s.io/api/core/v1"
+       "k8s.io/api/extensions/v1beta1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/util/intstr"
 )
 
-type routeTrait struct {
+type ingressTrait struct {
        BaseTrait `property:",squash"`
+       Host      string `property:"host"`
 }
 
-func newRouteTrait() *routeTrait {
-       return &routeTrait{
-               BaseTrait: newBaseTrait("route"),
+func newIngressTrait() *ingressTrait {
+       return &ingressTrait{
+               BaseTrait: newBaseTrait("ingress"),
+               Host:      "",
        }
 }
 
-func (e *routeTrait) autoconfigure(environment *environment, resources 
*kubernetes.Collection) error {
+func (e *ingressTrait) autoconfigure(environment *environment, resources 
*kubernetes.Collection) error {
        if e.Enabled == nil {
                hasService := e.getTargetService(environment, resources) != nil
-               e.Enabled = &hasService
+               hasHost := e.Host != ""
+               enabled := hasService && hasHost
+               e.Enabled = &enabled
        }
        return nil
 }
 
-func (e *routeTrait) customize(environment *environment, resources 
*kubernetes.Collection) error {
+func (e *ingressTrait) customize(environment *environment, resources 
*kubernetes.Collection) error {
+       if e.Host == "" {
+               return errors.New("cannot apply ingress trait: no host defined")
+       }
        service := e.getTargetService(environment, resources)
-       if service != nil {
-               resources.Add(e.getRouteFor(environment, service))
+       if service == nil {
+               return errors.New("cannot apply ingress trait: no target 
service")
        }
 
+       resources.Add(e.getIngressFor(environment, service))
        return nil
 }
 
-func (*routeTrait) getTargetService(e *environment, resources 
*kubernetes.Collection) (service *corev1.Service) {
+func (*ingressTrait) getTargetService(e *environment, resources 
*kubernetes.Collection) (service *corev1.Service) {
        resources.VisitService(func(s *corev1.Service) {
                if s.ObjectMeta.Labels != nil {
                        if intName, ok := 
s.ObjectMeta.Labels["camel.apache.org/integration"]; ok && intName == 
e.Integration.Name {
@@ -63,25 +72,27 @@ func (*routeTrait) getTargetService(e *environment, 
resources *kubernetes.Collec
        return
 }
 
-func (*routeTrait) getRouteFor(e *environment, service *corev1.Service) 
*routev1.Route {
-       route := routev1.Route{
+func (e *ingressTrait) getIngressFor(env *environment, service 
*corev1.Service) *v1beta1.Ingress {
+       ingress := v1beta1.Ingress{
                TypeMeta: metav1.TypeMeta{
-                       Kind:       "Route",
-                       APIVersion: routev1.SchemeGroupVersion.String(),
+                       Kind:       "Ingress",
+                       APIVersion: v1beta1.SchemeGroupVersion.String(),
                },
                ObjectMeta: metav1.ObjectMeta{
                        Name:      service.Name,
                        Namespace: service.Namespace,
                },
-               Spec: routev1.RouteSpec{
-                       Port: &routev1.RoutePort{
-                               TargetPort: intstr.FromString("http"),
+               Spec: v1beta1.IngressSpec{
+                       Backend: &v1beta1.IngressBackend{
+                               ServiceName: service.Name,
+                               ServicePort: intstr.FromString("http"),
                        },
-                       To: routev1.RouteTargetReference{
-                               Kind: "Service",
-                               Name: service.Name,
+                       Rules: []v1beta1.IngressRule{
+                               {
+                                       Host: e.Host,
+                               },
                        },
                },
        }
-       return &route
+       return &ingress
 }
diff --git a/pkg/trait/route.go b/pkg/trait/route.go
index 1553bae..b3efa1a 100644
--- a/pkg/trait/route.go
+++ b/pkg/trait/route.go
@@ -18,6 +18,7 @@ limitations under the License.
 package trait
 
 import (
+       "errors"
        "github.com/apache/camel-k/pkg/util/kubernetes"
        routev1 "github.com/openshift/api/route/v1"
        corev1 "k8s.io/api/core/v1"
@@ -45,10 +46,11 @@ func (e *routeTrait) autoconfigure(environment 
*environment, resources *kubernet
 
 func (e *routeTrait) customize(environment *environment, resources 
*kubernetes.Collection) error {
        service := e.getTargetService(environment, resources)
-       if service != nil {
-               resources.Add(e.getRouteFor(environment, service))
+       if service == nil {
+               return errors.New("cannot apply route trait: no target service")
        }
 
+       resources.Add(e.getRouteFor(environment, service))
        return nil
 }
 

Reply via email to