You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2020/03/17 15:11:26 UTC

[camel-k] branch master updated: Fix #1325: add 3scale addon

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

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


The following commit(s) were added to refs/heads/master by this push:
     new b7ec6ae  Fix #1325: add 3scale addon
b7ec6ae is described below

commit b7ec6aeb65f19a5aef424167f8b56763907b59a2
Author: Nicola Ferraro <ni...@gmail.com>
AuthorDate: Mon Mar 16 18:48:02 2020 +0100

    Fix #1325: add 3scale addon
---
 addons/register_3scale.go                     |  27 +++++
 addons/threescale/3scale.go                   | 138 ++++++++++++++++++++++++++
 addons/threescale/3scale_test.go              | 114 +++++++++++++++++++++
 addons/threescale/zz_generated_doc.go         |   1 +
 docs/modules/ROOT/nav.adoc                    |   3 +-
 docs/modules/ROOT/pages/traits/3scale.adoc    |  52 ++++++++++
 docs/modules/ROOT/pages/traits/container.adoc |  59 +++++++++++
 docs/modules/ROOT/pages/traits/openapi.adoc   |   4 +-
 docs/modules/ROOT/pages/traits/traits.adoc    |   3 +-
 pkg/cmd/run.go                                |   2 +-
 10 files changed, 398 insertions(+), 5 deletions(-)

diff --git a/addons/register_3scale.go b/addons/register_3scale.go
new file mode 100644
index 0000000..aaa3cb1
--- /dev/null
+++ b/addons/register_3scale.go
@@ -0,0 +1,27 @@
+/*
+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 addons
+
+import (
+	"github.com/apache/camel-k/addons/threescale"
+	"github.com/apache/camel-k/pkg/trait"
+)
+
+func init() {
+	trait.AddToTraits(threescale.NewThreeScaleTrait)
+}
diff --git a/addons/threescale/3scale.go b/addons/threescale/3scale.go
new file mode 100644
index 0000000..fa2250c
--- /dev/null
+++ b/addons/threescale/3scale.go
@@ -0,0 +1,138 @@
+/*
+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 threescale
+
+import (
+	"strconv"
+
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/pkg/trait"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// The 3scale trait can be used to automatically create annotations that allow
+// 3scale to discover the generated service and make it available for API management.
+//
+// The 3scale trait is disabled by default.
+//
+// +camel-k:trait=3scale
+type threeScaleTrait struct {
+	trait.BaseTrait `property:",squash"`
+	// Enables automatic configuration of the trait.
+	Auto *bool `property:"auto"`
+	// The scheme to use to contact the service (default `http`)
+	Scheme string `property:"scheme"`
+	// The path where the API is published (default `/`)
+	Path string `property:"path"`
+	// The port where the service is exposed (default `80`)
+	Port int `property:"port"`
+	// The path where the Open-API specification is published (default `/api-doc`)
+	DescriptionPath *string `property:"description-path"`
+}
+
+const (
+	// ThreeScaleSchemeAnnotation --
+	ThreeScaleSchemeAnnotation = "discovery.3scale.net/scheme"
+	// ThreeScaleSchemeDefaultValue --
+	ThreeScaleSchemeDefaultValue = "http"
+
+	// ThreeScalePortAnnotation --
+	ThreeScalePortAnnotation = "discovery.3scale.net/port"
+	// ThreeScalePortDefaultValue --
+	ThreeScalePortDefaultValue = 80
+
+	// ThreeScalePathAnnotation --
+	ThreeScalePathAnnotation = "discovery.3scale.net/path"
+	// ThreeScalePathDefaultValue --
+	ThreeScalePathDefaultValue = "/"
+
+	// ThreeScaleDescriptionPathAnnotation --
+	ThreeScaleDescriptionPathAnnotation = "discovery.3scale.net/description-path"
+	// ThreeScaleDescriptionPathDefaultValue --
+	ThreeScaleDescriptionPathDefaultValue = "/api-doc"
+
+	// ThreeScaleDiscoveryLabel --
+	ThreeScaleDiscoveryLabel = "discovery.3scale.net"
+	// ThreeScaleDiscoveryLabelEnabled --
+	ThreeScaleDiscoveryLabelEnabled = "true"
+)
+
+// NewThreeScaleTrait --
+func NewThreeScaleTrait() trait.Trait {
+	return &threeScaleTrait{
+		BaseTrait: trait.NewBaseTrait("3scale", trait.TraitOrderPostProcessResources),
+	}
+}
+
+func (t *threeScaleTrait) Configure(e *trait.Environment) (bool, error) {
+	if t.Enabled == nil || !*t.Enabled {
+		// disabled by default
+		return false, nil
+	}
+
+	if !e.IntegrationInPhase(v1.IntegrationPhaseDeploying) {
+		return false, nil
+	}
+
+	if t.Auto == nil || *t.Auto {
+		if t.Scheme == "" {
+			t.Scheme = ThreeScaleSchemeDefaultValue
+		}
+		if t.Path == "" {
+			t.Path = ThreeScalePathDefaultValue
+		}
+		if t.Port == 0 {
+			t.Port = ThreeScalePortDefaultValue
+		}
+		if t.DescriptionPath == nil {
+			openAPI := ThreeScaleDescriptionPathDefaultValue
+			t.DescriptionPath = &openAPI
+		}
+	}
+	return true, nil
+}
+
+func (t *threeScaleTrait) Apply(e *trait.Environment) error {
+	if svc := e.Resources.GetServiceForIntegration(e.Integration); svc != nil {
+		t.addLabelsAndAnnotations(&svc.ObjectMeta)
+	}
+	return nil
+}
+
+func (t *threeScaleTrait) addLabelsAndAnnotations(obj *metav1.ObjectMeta) {
+	if obj.Labels == nil {
+		obj.Labels = make(map[string]string)
+	}
+	obj.Labels[ThreeScaleDiscoveryLabel] = ThreeScaleDiscoveryLabelEnabled
+
+	if obj.Annotations == nil {
+		obj.Annotations = make(map[string]string)
+	}
+	if t.Scheme != "" {
+		obj.Annotations[ThreeScaleSchemeAnnotation] = t.Scheme
+	}
+	if t.Path != "" {
+		obj.Annotations[ThreeScalePathAnnotation] = t.Path
+	}
+	if t.Port != 0 {
+		obj.Annotations[ThreeScalePortAnnotation] = strconv.Itoa(t.Port)
+	}
+	if t.DescriptionPath != nil && *t.DescriptionPath != "" {
+		obj.Annotations[ThreeScaleDescriptionPathAnnotation] = *t.DescriptionPath
+	}
+}
diff --git a/addons/threescale/3scale_test.go b/addons/threescale/3scale_test.go
new file mode 100644
index 0000000..2ac8506
--- /dev/null
+++ b/addons/threescale/3scale_test.go
@@ -0,0 +1,114 @@
+/*
+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 threescale
+
+import (
+	"testing"
+
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/pkg/trait"
+	"github.com/apache/camel-k/pkg/util/camel"
+	"github.com/apache/camel-k/pkg/util/kubernetes"
+	"github.com/stretchr/testify/assert"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+func TestThreeScaleDisabled(t *testing.T) {
+	catalog, err := camel.DefaultCatalog()
+	assert.Nil(t, err)
+
+	e := &trait.Environment{
+		CamelCatalog: catalog,
+	}
+
+	threeScale := NewThreeScaleTrait()
+	enabled, err := threeScale.Configure(e)
+	assert.Nil(t, err)
+	assert.False(t, enabled)
+}
+
+func TestThreeScaleInjection(t *testing.T) {
+	svc, e := createEnvironment(t)
+	threeScale := NewThreeScaleTrait()
+	enabled := true
+	threeScale.(*threeScaleTrait).Enabled = &enabled
+	ok, err := threeScale.Configure(e)
+	assert.Nil(t, err)
+	assert.True(t, ok)
+
+	err = threeScale.Apply(e)
+	assert.Nil(t, err)
+
+	assert.Equal(t, "true", svc.Labels["discovery.3scale.net"])
+	assert.Equal(t, "http", svc.Annotations["discovery.3scale.net/scheme"])
+	assert.Equal(t, "/", svc.Annotations["discovery.3scale.net/path"])
+	assert.Equal(t, "80", svc.Annotations["discovery.3scale.net/port"])
+	assert.Equal(t, "/api-doc", svc.Annotations["discovery.3scale.net/description-path"])
+}
+
+func TestThreeScaleInjectionNoAPIPath(t *testing.T) {
+	svc, e := createEnvironment(t)
+	threeScale := NewThreeScaleTrait()
+	enabled := true
+	threeScale.(*threeScaleTrait).Enabled = &enabled
+	noPath := ""
+	threeScale.(*threeScaleTrait).DescriptionPath = &noPath
+	ok, err := threeScale.Configure(e)
+	assert.Nil(t, err)
+	assert.True(t, ok)
+
+	err = threeScale.Apply(e)
+	assert.Nil(t, err)
+
+	assert.Equal(t, "true", svc.Labels["discovery.3scale.net"])
+	assert.Equal(t, "http", svc.Annotations["discovery.3scale.net/scheme"])
+	assert.Equal(t, "/", svc.Annotations["discovery.3scale.net/path"])
+	assert.Equal(t, "80", svc.Annotations["discovery.3scale.net/port"])
+	_, p := svc.Annotations["discovery.3scale.net/description-path"]
+	assert.False(t, p)
+}
+
+func createEnvironment(t *testing.T) (*corev1.Service, *trait.Environment) {
+	catalog, err := camel.DefaultCatalog()
+	assert.Nil(t, err)
+
+	e := trait.Environment{
+		CamelCatalog: catalog,
+	}
+
+	svc := corev1.Service{
+		ObjectMeta: metav1.ObjectMeta{
+			Labels: map[string]string{
+				"camel.apache.org/integration": "test",
+			},
+		},
+	}
+	e.Resources = kubernetes.NewCollection(&svc)
+
+	it := v1.Integration{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: "test",
+		},
+		Status: v1.IntegrationStatus{
+			Phase: v1.IntegrationPhaseDeploying,
+		},
+	}
+	e.Integration = &it
+	return &svc, &e
+}
diff --git a/addons/threescale/zz_generated_doc.go b/addons/threescale/zz_generated_doc.go
new file mode 100644
index 0000000..38eec99
--- /dev/null
+++ b/addons/threescale/zz_generated_doc.go
@@ -0,0 +1 @@
+package threescale
diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc
index 9a7f96b..9d9daa5 100644
--- a/docs/modules/ROOT/nav.adoc
+++ b/docs/modules/ROOT/nav.adoc
@@ -16,6 +16,7 @@
 ** xref:configuration/configmap-secret.adoc[ConfigMap/Secret]
 * xref:traits/traits.adoc[Traits]
 // Start of autogenerated code - DO NOT EDIT! (trait-nav)
+** xref:traits/3scale.adoc[3scale]
 ** xref:traits/affinity.adoc[Affinity]
 ** xref:traits/builder.adoc[Builder]
 ** xref:traits/camel.adoc[Camel]
@@ -33,12 +34,12 @@
 ** xref:traits/knative-service.adoc[Knative Service]
 ** xref:traits/knative.adoc[Knative]
 ** xref:traits/master.adoc[Master]
+** xref:traits/openapi.adoc[Openapi]
 ** xref:traits/owner.adoc[Owner]
 ** xref:traits/platform.adoc[Platform]
 ** xref:traits/prometheus.adoc[Prometheus]
 ** xref:traits/pull-secret.adoc[Pull Secret]
 ** xref:traits/quarkus.adoc[Quarkus]
-** xref:traits/openapi.adoc[Rest Dsl]
 ** xref:traits/route.adoc[Route]
 ** xref:traits/service.adoc[Service]
 // End of autogenerated code - DO NOT EDIT! (trait-nav)
diff --git a/docs/modules/ROOT/pages/traits/3scale.adoc b/docs/modules/ROOT/pages/traits/3scale.adoc
new file mode 100755
index 0000000..ff11f2c
--- /dev/null
+++ b/docs/modules/ROOT/pages/traits/3scale.adoc
@@ -0,0 +1,52 @@
+= 3scale Trait
+
+// Start of autogenerated code - DO NOT EDIT! (description)
+The 3scale trait can be used to automatically create annotations that allow
+3scale to discover the generated service and make it available for API management.
+
+The 3scale trait is disabled by default.
+
+
+This trait is available in the following profiles: **Kubernetes, Knative, OpenShift**.
+
+// End of autogenerated code - DO NOT EDIT! (description)
+// Start of autogenerated code - DO NOT EDIT! (configuration)
+== Configuration
+
+Trait properties can be specified when running any integration with the CLI:
+```
+kamel run --trait 3scale.[key]=[value] --trait 3scale.[key2]=[value2] integration.groovy
+```
+The following configuration options are available:
+
+[cols="2,1,5a"]
+|===
+|Property | Type | Description
+
+| 3scale.enabled
+| bool
+| Can be used to enable or disable a trait. All traits share this common property.
+
+| 3scale.auto
+| bool
+| Enables automatic configuration of the trait.
+
+| 3scale.scheme
+| string
+| The scheme to use to contact the service (default `http`)
+
+| 3scale.path
+| string
+| The path where the API is published (default `/`)
+
+| 3scale.port
+| int
+| The port where the service is exposed (default `80`)
+
+| 3scale.description-path
+| string
+| The path where the Open-API specification is published (default `/api-doc`)
+
+|===
+
+// End of autogenerated code - DO NOT EDIT! (configuration)
diff --git a/docs/modules/ROOT/pages/traits/container.adoc b/docs/modules/ROOT/pages/traits/container.adoc
index 1f98244..95edc41 100755
--- a/docs/modules/ROOT/pages/traits/container.adoc
+++ b/docs/modules/ROOT/pages/traits/container.adoc
@@ -72,6 +72,65 @@ The following configuration options are available:
 | string
 | The main container name. It's named `integration` by default.
 
+| container.probes-enabled
+| bool
+| ProbesEnabled enable/disable probes on the container (default `false`)
+
+| container.probe-port
+| int
+| ProbePort configures the port on which the probes are exposed, by default it inhierit the
+value from the `http` port configured on the container. Note that the value has no effect for Knative service
+as the port should be the same as the port declared by the container.
+
+| container.probe-path
+| string
+| Path to access on the probe ( default `/health`). Note that this property is not supported
+on quarkus runtime and setting it will result in the integration failing to start.
+
+| container.liveness-initial-delay
+| int32
+| Number of seconds after the container has started before liveness probes are initiated.
+
+| container.liveness-timeout
+| int32
+| Number of seconds after which the probe times out. Applies to the liveness probe.
+
+| container.liveness-period
+| int32
+| How often to perform the probe. Applies to the liveness probe.
+
+| container.liveness-success-threshold
+| int32
+| Minimum consecutive successes for the probe to be considered successful after having failed.
+Applies to the liveness probe.
+
+| container.liveness-failure-threshold
+| int32
+| Minimum consecutive failures for the probe to be considered failed after having succeeded.
+Applies to the liveness probe.
+
+| container.readiness-initial-delay
+| int32
+| Number of seconds after the container has started before readiness probes are initiated.
+
+| container.readiness-timeout
+| int32
+| Number of seconds after which the probe times out. Applies to the readiness probe.
+
+| container.readiness-period
+| int32
+| How often to perform the probe. Applies to the readiness probe.
+
+| container.readiness-success-threshold
+| int32
+| Minimum consecutive successes for the probe to be considered successful after having failed.
+Applies to the readiness probe.
+
+| container.readiness-failure-threshold
+| int32
+| Minimum consecutive failures for the probe to be considered failed after having succeeded.
+Applies to the readiness probe.
+
 |===
 
 // End of autogenerated code - DO NOT EDIT! (configuration)
diff --git a/docs/modules/ROOT/pages/traits/openapi.adoc b/docs/modules/ROOT/pages/traits/openapi.adoc
index e3fe189..b8d919c 100755
--- a/docs/modules/ROOT/pages/traits/openapi.adoc
+++ b/docs/modules/ROOT/pages/traits/openapi.adoc
@@ -1,7 +1,7 @@
 = Rest Dsl Trait
 
 // Start of autogenerated code - DO NOT EDIT! (description)
-The Rest DSL trait is internally used to allow creating integrations from a OpenAPI specs.
+The OpenAPI DSL trait is internally used to allow creating integrations from a OpenAPI specs.
 
 
 This trait is available in the following profiles: **Kubernetes, Knative, OpenShift**.
@@ -22,7 +22,7 @@ The following configuration options are available:
 |===
 |Property | Type | Description
 
-| rest-dsl.enabled
+| openapi.enabled
 | bool
 | Can be used to enable or disable a trait. All traits share this common property.
 
diff --git a/docs/modules/ROOT/pages/traits/traits.adoc b/docs/modules/ROOT/pages/traits/traits.adoc
index fac82b1..e2e663c 100644
--- a/docs/modules/ROOT/pages/traits/traits.adoc
+++ b/docs/modules/ROOT/pages/traits/traits.adoc
@@ -34,6 +34,7 @@ A trait may have additional properties that can be configured by the end user.
 See the trait description pages for more information on a specific trait:
 
 // Start of autogenerated code - DO NOT EDIT! (trait-list)
+* xref:traits/3scale.adoc[3scale Trait]
 * xref:traits/affinity.adoc[Affinity Trait]
 * xref:traits/builder.adoc[Builder Trait]
 * xref:traits/camel.adoc[Camel Trait]
@@ -51,12 +52,12 @@ See the trait description pages for more information on a specific trait:
 * xref:traits/knative-service.adoc[Knative Service Trait]
 * xref:traits/knative.adoc[Knative Trait]
 * xref:traits/master.adoc[Master Trait]
+* xref:traits/openapi.adoc[Openapi Trait]
 * xref:traits/owner.adoc[Owner Trait]
 * xref:traits/platform.adoc[Platform Trait]
 * xref:traits/prometheus.adoc[Prometheus Trait]
 * xref:traits/pull-secret.adoc[Pull Secret Trait]
 * xref:traits/quarkus.adoc[Quarkus Trait]
-* xref:traits/openapi.adoc[Rest Dsl Trait]
 * xref:traits/route.adoc[Route Trait]
 * xref:traits/service.adoc[Service Trait]
 // End of autogenerated code - DO NOT EDIT! (trait-list)
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index 918c694..5329c0d 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -50,7 +50,7 @@ import (
 )
 
 var (
-	traitConfigRegexp = regexp.MustCompile(`^([a-z-]+)((?:\.[a-z-]+)+)=(.*)$`)
+	traitConfigRegexp = regexp.MustCompile(`^([a-z0-9-]+)((?:\.[a-z0-9-]+)+)=(.*)$`)
 )
 
 func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *runCmdOptions) {