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 8052da5abed8460b7fb0ca7aa375c52172edc0f1 Author: nferraro <[email protected]> AuthorDate: Thu Oct 4 13:15:51 2018 +0200 Added service trait --- pkg/trait/base.go | 21 +++------ pkg/trait/catalog.go | 8 ++-- pkg/trait/{expose.go => route.go} | 15 ++++--- pkg/trait/service.go | 92 +++++++++++++++++++++++++++++++++++++++ pkg/trait/trait.go | 4 -- 5 files changed, 113 insertions(+), 27 deletions(-) diff --git a/pkg/trait/base.go b/pkg/trait/base.go index 69a46b9..d831d79 100644 --- a/pkg/trait/base.go +++ b/pkg/trait/base.go @@ -35,17 +35,8 @@ func (*baseTrait) ID() ID { } func (d *baseTrait) Customize(environment Environment, resources *kubernetes.Collection) (bool, error) { - var cm *corev1.ConfigMap - var err error - if cm, err = d.getConfigMapFor(environment); err != nil { - return false, err - } - resources.Add(cm) - var depl *appsv1.Deployment - if depl, err = d.getDeploymentFor(environment); err != nil { - return false, err - } - resources.Add(depl) + resources.Add(d.getConfigMapFor(environment)) + resources.Add(d.getDeploymentFor(environment)) return true, nil } @@ -55,7 +46,7 @@ func (d *baseTrait) Customize(environment Environment, resources *kubernetes.Col // // ********************************** -func (*baseTrait) getConfigMapFor(e Environment) (*corev1.ConfigMap, error) { +func (*baseTrait) getConfigMapFor(e Environment) *corev1.ConfigMap { // combine properties of integration with context, integration // properties have the priority properties := CombineConfigurationAsMap("property", e.Context, e.Integration) @@ -80,7 +71,7 @@ func (*baseTrait) getConfigMapFor(e Environment) (*corev1.ConfigMap, error) { }, } - return &cm, nil + return &cm } // ********************************** @@ -89,7 +80,7 @@ func (*baseTrait) getConfigMapFor(e Environment) (*corev1.ConfigMap, error) { // // ********************************** -func (*baseTrait) getDeploymentFor(e Environment) (*appsv1.Deployment, error) { +func (*baseTrait) getDeploymentFor(e Environment) *appsv1.Deployment { sourceName := strings.TrimPrefix(e.Integration.Spec.Source.Name, "/") // combine environment of integration with context, integration @@ -240,5 +231,5 @@ func (*baseTrait) getDeploymentFor(e Environment) (*appsv1.Deployment, error) { deployment.Spec.Template.Spec.Volumes = vols deployment.Spec.Template.Spec.Containers[0].VolumeMounts = mnts - return &deployment, nil + return &deployment } diff --git a/pkg/trait/catalog.go b/pkg/trait/catalog.go index 3325860..a969012 100644 --- a/pkg/trait/catalog.go +++ b/pkg/trait/catalog.go @@ -23,8 +23,9 @@ import ( ) var ( - tExpose = &exposeTrait{} tBase = &baseTrait{} + tService = &serviceTrait{} + tRoute = &routeTrait{} tOwner = &ownerTrait{} ) @@ -34,13 +35,14 @@ func CustomizersFor(environment Environment) Customizer { case v1alpha1.IntegrationPlatformClusterOpenShift: return compose( tBase, - tExpose, + tService, + tRoute, tOwner, ) case v1alpha1.IntegrationPlatformClusterKubernetes: return compose( tBase, - tExpose, + tService, tOwner, ) // case Knative: ... diff --git a/pkg/trait/expose.go b/pkg/trait/route.go similarity index 72% rename from pkg/trait/expose.go rename to pkg/trait/route.go index 2dac116..681c8b1 100644 --- a/pkg/trait/expose.go +++ b/pkg/trait/route.go @@ -19,15 +19,20 @@ package trait import ( "github.com/apache/camel-k/pkg/util/kubernetes" + routev1 "github.com/openshift/api/route/v1" ) -type exposeTrait struct { +type routeTrait struct { } -func (*exposeTrait) ID() ID { - return ID("expose") +func (*routeTrait) ID() ID { + return ID("route") } -func (*exposeTrait) Customize(environment Environment, resources *kubernetes.Collection) (bool, error) { - return false, nil +func (e *routeTrait) Customize(environment Environment, resources *kubernetes.Collection) (bool, error) { + return true, nil +} + +func (*routeTrait) getRouteFor(e Environment) *routev1.Route { + return nil } diff --git a/pkg/trait/service.go b/pkg/trait/service.go new file mode 100644 index 0000000..3576f94 --- /dev/null +++ b/pkg/trait/service.go @@ -0,0 +1,92 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package trait + +import ( + "github.com/apache/camel-k/pkg/util/kubernetes" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +var webComponents = map[string]bool{ + "camel:servlet": true, + "camel:undertow": true, + "camel:jetty": true, + "camel:netty-http": true, + "camel:netty4-http": true, + // TODO find a better way to discover need for exposure + // maybe using the resolved classpath of the context instead of the requested dependencies +} + +type serviceTrait struct { +} + +func (*serviceTrait) ID() ID { + return ID("service") +} + +func (e *serviceTrait) Customize(environment Environment, resources *kubernetes.Collection) (bool, error) { + if !e.requiresService(environment) { + return false, nil + } + resources.Add(e.getServiceFor(environment)) + return true, nil +} + +func (*serviceTrait) getServiceFor(e Environment) *corev1.Service { + svc := corev1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: e.Integration.Name, + Namespace: e.Integration.Namespace, + Labels: e.Integration.Labels, + }, + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + { + Name: "http", + Port: 80, + Protocol: corev1.ProtocolTCP, + TargetPort: intstr.IntOrString{ + // TODO discovering the real port is hard - maybe we should just set 8080 as conventional port in the doc + // or allow users to configure it in the trait configuration section + IntVal: 8080, + }, + }, + }, + Selector: map[string]string{ + "camel.apache.org/integration": e.Integration.Name, + }, + }, + } + + return &svc +} + +func (*serviceTrait) requiresService(environment Environment) bool { + for _, dep := range environment.Integration.Spec.Dependencies { + if decision, present := webComponents[dep]; present { + return decision + } + } + return false +} diff --git a/pkg/trait/trait.go b/pkg/trait/trait.go index 90e4d29..d9c372f 100644 --- a/pkg/trait/trait.go +++ b/pkg/trait/trait.go @@ -19,7 +19,6 @@ package trait import ( "github.com/apache/camel-k/pkg/apis/camel/v1alpha1" - "github.com/apache/camel-k/pkg/discover" "github.com/apache/camel-k/pkg/platform" "github.com/apache/camel-k/pkg/util/kubernetes" ) @@ -29,7 +28,6 @@ type Environment struct { Platform *v1alpha1.IntegrationPlatform Context *v1alpha1.IntegrationContext Integration *v1alpha1.Integration - Dependencies []string ExecutedCustomizers []ID } @@ -43,13 +41,11 @@ func NewEnvironment(integration *v1alpha1.Integration) (*Environment, error) { if err != nil { return nil, err } - dependencies := discover.Dependencies(integration.Spec.Source) return &Environment{ Platform: pl, Context: ctx, Integration: integration, - Dependencies: dependencies, ExecutedCustomizers: make([]ID, 0), }, nil }
