This is an automated email from the ASF dual-hosted git repository.
pcongiusti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git
The following commit(s) were added to refs/heads/main by this push:
new 676f40f fix(kamelets): error handler uri autodiscovery
676f40f is described below
commit 676f40f1378555357b4954e3539c0395e7ac9df5
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Wed Aug 25 17:42:39 2021 +0200
fix(kamelets): error handler uri autodiscovery
* Discovery and setting depedencies when using directly a URI
* Refactoring inspector.go and runtime catalog in order to reuse biz logic
Closes #2492
---
pkg/trait/error_handler.go | 26 ++++++++-
pkg/trait/error_handler_test.go | 93 +++++++++++++++++++++++++++++++++
pkg/util/camel/camel_runtime_catalog.go | 15 ++++++
pkg/util/source/inspector.go | 18 +------
4 files changed, 135 insertions(+), 17 deletions(-)
diff --git a/pkg/trait/error_handler.go b/pkg/trait/error_handler.go
index 547ac52..dfb4799 100644
--- a/pkg/trait/error_handler.go
+++ b/pkg/trait/error_handler.go
@@ -18,6 +18,9 @@ limitations under the License.
package trait
import (
+ "fmt"
+ "strings"
+
v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
"gopkg.in/yaml.v2"
@@ -34,7 +37,8 @@ type errorHandlerTrait struct {
func newErrorHandlerTrait() Trait {
return &errorHandlerTrait{
- BaseTrait: NewBaseTrait("error-handler", 500),
+ // NOTE: Must run before dependency trait
+ BaseTrait: NewBaseTrait("error-handler", 470),
}
}
@@ -61,11 +65,31 @@ func (t *errorHandlerTrait) Configure(e *Environment)
(bool, error) {
func (t *errorHandlerTrait) Apply(e *Environment) error {
if e.IntegrationInPhase(v1.IntegrationPhaseInitialization) {
+ // If the user configure directly the URI, we need to
autodiscover the underlying component
+ // and add the related dependency
+ defaultErrorHandlerURI :=
e.Integration.Spec.GetConfigurationProperty(
+ fmt.Sprintf("%s.deadLetterUri",
v1alpha1.ErrorHandlerAppPropertiesPrefix))
+ if defaultErrorHandlerURI != "" &&
!strings.HasPrefix(defaultErrorHandlerURI, "kamelet:") {
+ t.addErrorHandlerDependencies(e, defaultErrorHandlerURI)
+ }
+
return t.addErrorHandlerAsSource(e)
}
return nil
}
+func (t *errorHandlerTrait) addErrorHandlerDependencies(e *Environment, uri
string) {
+ candidateComp, scheme := e.CamelCatalog.DecodeComponent(uri)
+ if candidateComp != nil {
+
e.Integration.Spec.AddDependency(candidateComp.GetDependencyID())
+ if scheme != nil {
+ for _, dep := range
candidateComp.GetProducerDependencyIDs(scheme.ID) {
+ e.Integration.Spec.AddDependency(dep)
+ }
+ }
+ }
+}
+
func (t *errorHandlerTrait) addErrorHandlerAsSource(e *Environment) error {
flowErrorHandler := map[string]interface{}{
"error-handler": map[string]string{
diff --git a/pkg/trait/error_handler_test.go b/pkg/trait/error_handler_test.go
new file mode 100644
index 0000000..c77d1ba
--- /dev/null
+++ b/pkg/trait/error_handler_test.go
@@ -0,0 +1,93 @@
+/*
+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 (
+ "fmt"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+
+ v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+ "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+ "github.com/apache/camel-k/pkg/util/camel"
+)
+
+func TestErrorHandlerConfigureFromIntegrationProperty(t *testing.T) {
+ e := &Environment{
+ Catalog: NewEnvironmentTestCatalog(),
+ Integration: &v1.Integration{},
+ }
+ e.Integration.Spec.AddConfiguration("property", fmt.Sprintf("%v = %s",
v1alpha1.ErrorHandlerRefName, "defaultErrorHandler"))
+
+ trait := newErrorHandlerTrait()
+ enabled, err := trait.Configure(e)
+ assert.Nil(t, err)
+ assert.False(t, enabled)
+
+ e.Integration.Status.Phase = v1.IntegrationPhaseNone
+ enabled, err = trait.Configure(e)
+ assert.Nil(t, err)
+ assert.False(t, enabled)
+
+ e.Integration.Status.Phase = v1.IntegrationPhaseInitialization
+ enabled, err = trait.Configure(e)
+ assert.Nil(t, err)
+ assert.True(t, enabled)
+}
+
+func TestErrorHandlerApplySource(t *testing.T) {
+ e := &Environment{
+ Catalog: NewEnvironmentTestCatalog(),
+ Integration: &v1.Integration{},
+ }
+ e.Integration.Spec.AddConfiguration("property", fmt.Sprintf("%v = %s",
v1alpha1.ErrorHandlerRefName, "defaultErrorHandler"))
+ e.Integration.Status.Phase = v1.IntegrationPhaseInitialization
+
+ trait := newErrorHandlerTrait()
+ enabled, err := trait.Configure(e)
+ assert.Nil(t, err)
+ assert.True(t, enabled)
+ err = trait.Apply(e)
+ assert.Nil(t, err)
+ assert.Equal(t, `- error-handler:
+ ref: defaultErrorHandler
+`, e.Integration.Status.GeneratedSources[0].Content)
+}
+
+func TestErrorHandlerApplyDependency(t *testing.T) {
+ c, err := camel.DefaultCatalog()
+ assert.Nil(t, err)
+ e := &Environment{
+ Catalog: NewEnvironmentTestCatalog(),
+ CamelCatalog: c,
+ Integration: &v1.Integration{},
+ }
+ e.Integration.Spec.AddConfiguration("property",
"camel.beans.defaultErrorHandler =
#class:org.apache.camel.builder.DeadLetterChannelBuilder")
+ e.Integration.Spec.AddConfiguration("property",
"camel.beans.defaultErrorHandler.deadLetterUri = log:info")
+ e.Integration.Spec.AddConfiguration("property", fmt.Sprintf("%v = %s",
v1alpha1.ErrorHandlerRefName, "defaultErrorHandler"))
+ e.Integration.Status.Phase = v1.IntegrationPhaseInitialization
+
+ trait := newErrorHandlerTrait()
+ enabled, err := trait.Configure(e)
+ assert.Nil(t, err)
+ assert.True(t, enabled)
+ err = trait.Apply(e)
+ assert.Nil(t, err)
+ assert.Equal(t, "camel:log", e.Integration.Spec.Dependencies[0])
+}
diff --git a/pkg/util/camel/camel_runtime_catalog.go
b/pkg/util/camel/camel_runtime_catalog.go
index dc71a40..e726685 100644
--- a/pkg/util/camel/camel_runtime_catalog.go
+++ b/pkg/util/camel/camel_runtime_catalog.go
@@ -146,3 +146,18 @@ func (c *RuntimeCatalog) VisitSchemes(visitor func(string,
v1.CamelScheme) bool)
}
}
}
+
+// DecodeComponent parses an URI and return a camel artifact and a scheme
+func (c *RuntimeCatalog) DecodeComponent(uri string) (*v1.CamelArtifact,
*v1.CamelScheme) {
+ uriSplit := strings.SplitN(uri, ":", 2)
+ if len(uriSplit) < 2 {
+ return nil, nil
+ }
+ uriStart := uriSplit[0]
+ scheme, ok := c.GetScheme(uriStart)
+ var schemeRef *v1.CamelScheme
+ if ok {
+ schemeRef = &scheme
+ }
+ return c.GetArtifactByScheme(uriStart), schemeRef
+}
diff --git a/pkg/util/source/inspector.go b/pkg/util/source/inspector.go
index c2f80fd..9ed9b87 100644
--- a/pkg/util/source/inspector.go
+++ b/pkg/util/source/inspector.go
@@ -239,7 +239,7 @@ func (i *baseInspector) discoverCapabilities(source
v1.SourceSpec, meta *Metadat
// discoverDependencies returns a list of dependencies required by the given
source code
func (i *baseInspector) discoverDependencies(source v1.SourceSpec, meta
*Metadata) {
for _, uri := range meta.FromURIs {
- candidateComp, scheme := i.decodeComponent(uri)
+ candidateComp, scheme := i.catalog.DecodeComponent(uri)
if candidateComp != nil {
i.addDependency(candidateComp.GetDependencyID(), meta)
if scheme != nil {
@@ -251,7 +251,7 @@ func (i *baseInspector) discoverDependencies(source
v1.SourceSpec, meta *Metadat
}
for _, uri := range meta.ToURIs {
- candidateComp, scheme := i.decodeComponent(uri)
+ candidateComp, scheme := i.catalog.DecodeComponent(uri)
if candidateComp != nil {
i.addDependency(candidateComp.GetDependencyID(), meta)
if scheme != nil {
@@ -303,20 +303,6 @@ func (i *baseInspector) addDependency(dependency string,
meta *Metadata) {
meta.Dependencies.Add(dependency)
}
-func (i *baseInspector) decodeComponent(uri string) (*v1.CamelArtifact,
*v1.CamelScheme) {
- uriSplit := strings.SplitN(uri, ":", 2)
- if len(uriSplit) < 2 {
- return nil, nil
- }
- uriStart := uriSplit[0]
- scheme, ok := i.catalog.GetScheme(uriStart)
- var schemeRef *v1.CamelScheme
- if ok {
- schemeRef = &scheme
- }
- return i.catalog.GetArtifactByScheme(uriStart), schemeRef
-}
-
// hasOnlyPassiveEndpoints returns true if the source has no endpoint that
needs to remain always active
func (i *baseInspector) hasOnlyPassiveEndpoints(fromURIs []string) bool {
passivePlusHTTP := make(map[string]bool)