You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2018/11/05 19:46:31 UTC

[camel-k] 02/06: Add ingress trait

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...@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
 }