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 }