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 0d523af05 feat(ctrl): leverage core error handler vs trait
0d523af05 is described below

commit 0d523af050fa8f25184f38ef047394ac11b48fd0
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Sat Jan 18 09:02:40 2025 +0100

    feat(ctrl): leverage core error handler vs trait
    
    * Trait was internal and it is removed as no longer needed
---
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc |   2 +
 e2e/common/traits/error_handler_test.go           |  49 ----------
 pkg/apis/camel/v1/error_handler_types.go          |   9 --
 pkg/apis/camel/v1/error_handler_types_support.go  |  11 +--
 pkg/apis/camel/v1/integration_types_support.go    |   2 +-
 pkg/apis/camel/v1/trait/error_handler.go          |   2 +
 pkg/controller/pipe/error_handler.go              |  42 +++++++-
 pkg/controller/pipe/error_handler_test.go         |  24 +----
 pkg/controller/pipe/integration.go                |  11 +++
 pkg/controller/pipe/integration_test.go           |  98 +++++++++++++++++--
 pkg/trait/error_handler.go                        | 111 ----------------------
 pkg/trait/error_handler_test.go                   | 111 ----------------------
 pkg/trait/kamelets.go                             |   9 +-
 pkg/trait/kamelets_test.go                        |   5 +
 pkg/trait/trait_register.go                       |   1 -
 15 files changed, 156 insertions(+), 331 deletions(-)

diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc 
b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index fd9a261d0..5731cb674 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -7030,6 +7030,8 @@ These take precedence over any previously defined 
environment variables.
 
 * <<#_camel_apache_org_v1_Traits, Traits>>
 
+WARNING: This trait is no longer in use.
+
 The error-handler is a platform trait used to inject Error Handler source into 
the integration runtime.
 
 
diff --git a/e2e/common/traits/error_handler_test.go 
b/e2e/common/traits/error_handler_test.go
deleted file mode 100644
index d421a99e1..000000000
--- a/e2e/common/traits/error_handler_test.go
+++ /dev/null
@@ -1,49 +0,0 @@
-//go:build integration
-// +build integration
-
-// To enable compilation of this file in Goland, go to "Settings -> Go -> 
Vendoring & Build Tags -> Custom Tags" and add "integration"
-
-/*
-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 common
-
-import (
-       "context"
-       "testing"
-
-       . "github.com/onsi/gomega"
-
-       corev1 "k8s.io/api/core/v1"
-
-       . "github.com/apache/camel-k/v2/e2e/support"
-       v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-)
-
-func TestErrorHandlerTrait(t *testing.T) {
-       t.Parallel()
-       WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns string) {
-               t.Run("Run errored integration with error handler", func(t 
*testing.T) {
-                       name := RandomizedSuffixName("error-handler")
-                       g.Expect(KamelRun(t, ctx, ns, 
"files/ErroredRoute.java", "--name", name, "-t", "error-handler.enabled=true", 
"-t", "error-handler.ref=defaultErrorHandler", "-p", 
"camel.beans.defaultErrorHandler=#class:org.apache.camel.builder.DeadLetterChannelBuilder",
 "-p", 
"camel.beans.defaultErrorHandler.deadLetterUri=log:my-special-error-handler-in-place?level=ERROR&showCaughtException=false&showBody=false&showBodyType=false&showExchangePattern=false").Execute()).To(Succeed())
-                       g.Eventually(IntegrationPodPhase(t, ctx, ns, name), 
TestTimeoutLong).Should(Equal(corev1.PodRunning))
-                       g.Eventually(IntegrationConditionStatus(t, ctx, ns, 
name, v1.IntegrationConditionReady), 
TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
-                       g.Eventually(IntegrationLogs(t, ctx, ns, name), 
TestTimeoutShort).ShouldNot(ContainSubstring("InvalidPayloadException"))
-                       g.Eventually(IntegrationLogs(t, ctx, ns, name), 
TestTimeoutShort).Should(ContainSubstring("my-special-error-handler-in-place"))
-               })
-       })
-}
diff --git a/pkg/apis/camel/v1/error_handler_types.go 
b/pkg/apis/camel/v1/error_handler_types.go
index 49b93d20d..e27280818 100644
--- a/pkg/apis/camel/v1/error_handler_types.go
+++ b/pkg/apis/camel/v1/error_handler_types.go
@@ -17,15 +17,6 @@ limitations under the License.
 
 package v1
 
-const (
-       // ErrorHandlerRefName the reference name to use when looking for an 
error handler.
-       ErrorHandlerRefName = "camel.k.errorHandler.ref"
-       // ErrorHandlerRefDefaultName the default name of the error handler.
-       ErrorHandlerRefDefaultName = "defaultErrorHandler"
-       // ErrorHandlerAppPropertiesPrefix the prefix used for the error 
handler bean.
-       ErrorHandlerAppPropertiesPrefix = "camel.beans.defaultErrorHandler"
-)
-
 // ErrorHandlerSpec represents an unstructured object for an error handler.
 type ErrorHandlerSpec struct {
        RawMessage `json:",inline,omitempty"`
diff --git a/pkg/apis/camel/v1/error_handler_types_support.go 
b/pkg/apis/camel/v1/error_handler_types_support.go
index 483c39319..d12e76d1f 100644
--- a/pkg/apis/camel/v1/error_handler_types_support.go
+++ b/pkg/apis/camel/v1/error_handler_types_support.go
@@ -68,10 +68,7 @@ func (e ErrorHandlerNone) Type() ErrorHandlerType {
 
 // Configuration --.
 func (e ErrorHandlerNone) Configuration() (map[string]interface{}, error) {
-       return map[string]interface{}{
-               ErrorHandlerAppPropertiesPrefix: 
"#class:org.apache.camel.builder.NoErrorHandlerBuilder",
-               ErrorHandlerRefName:             ErrorHandlerRefDefaultName,
-       }, nil
+       return map[string]interface{}{}, nil
 }
 
 // ErrorHandlerLog represent a default (log) error handler type.
@@ -91,17 +88,12 @@ func (e ErrorHandlerLog) Configuration() 
(map[string]interface{}, error) {
        if err != nil {
                return nil, err
        }
-       properties[ErrorHandlerAppPropertiesPrefix] = 
"#class:org.apache.camel.builder.DefaultErrorHandlerBuilder"
-
        if e.Parameters != nil {
                var parameters map[string]interface{}
                err := json.Unmarshal(e.Parameters.RawMessage, &parameters)
                if err != nil {
                        return nil, err
                }
-               for key, value := range parameters {
-                       properties[ErrorHandlerAppPropertiesPrefix+"."+key] = 
value
-               }
        }
 
        return properties, nil
@@ -129,7 +121,6 @@ func (e ErrorHandlerSink) Configuration() 
(map[string]interface{}, error) {
        if err != nil {
                return nil, err
        }
-       properties[ErrorHandlerAppPropertiesPrefix] = 
"#class:org.apache.camel.builder.DeadLetterChannelBuilder"
 
        return properties, err
 }
diff --git a/pkg/apis/camel/v1/integration_types_support.go 
b/pkg/apis/camel/v1/integration_types_support.go
index c54a4e886..88c50be27 100644
--- a/pkg/apis/camel/v1/integration_types_support.go
+++ b/pkg/apis/camel/v1/integration_types_support.go
@@ -502,7 +502,7 @@ func ToYamlDSL(flows []Flow) ([]byte, error) {
        if err != nil {
                return nil, err
        }
-       jsondata := make([]map[string]interface{}, 0)
+       var jsondata interface{}
        d := json.NewDecoder(bytes.NewReader(data))
        d.UseNumber()
        if err := d.Decode(&jsondata); err != nil {
diff --git a/pkg/apis/camel/v1/trait/error_handler.go 
b/pkg/apis/camel/v1/trait/error_handler.go
index c84934f64..d52a27ca7 100644
--- a/pkg/apis/camel/v1/trait/error_handler.go
+++ b/pkg/apis/camel/v1/trait/error_handler.go
@@ -17,6 +17,8 @@ limitations under the License.
 
 package trait
 
+// WARNING: This trait is no longer in use.
+//
 // The error-handler is a platform trait used to inject Error Handler source 
into the integration runtime.
 //
 // +camel-k:trait=error-handler.
diff --git a/pkg/controller/pipe/error_handler.go 
b/pkg/controller/pipe/error_handler.go
index cdec5aea8..a03ed4f30 100644
--- a/pkg/controller/pipe/error_handler.go
+++ b/pkg/controller/pipe/error_handler.go
@@ -26,6 +26,10 @@ import (
        "github.com/apache/camel-k/v2/pkg/util/bindings"
 )
 
+const defaultCamelErrorHandler = "defaultErrorHandler"
+
+// maybeErrorHandler will return a Binding mapping a DeadLetterChannel, a Log 
or a None Error Handler.
+// If the bindings has no URI, then, you can assume it's a none Error Handler.
 func maybeErrorHandler(errHandlConf *v1.ErrorHandlerSpec, bindingContext 
bindings.BindingContext) (*bindings.Binding, error) {
        if errHandlConf == nil {
                return nil, nil
@@ -39,7 +43,11 @@ func maybeErrorHandler(errHandlConf *v1.ErrorHandlerSpec, 
bindingContext binding
        }
        // We need to get the translated URI from any referenced resource (ie, 
kamelets)
        if errorHandlerSpec.Type() == v1.ErrorHandlerTypeSink {
-               errorHandlerBinding, err = bindings.Translate(bindingContext, 
bindings.EndpointContext{Type: v1.EndpointTypeErrorHandler}, 
*errorHandlerSpec.Endpoint())
+               errorHandlerBinding, err = bindings.Translate(
+                       bindingContext,
+                       bindings.EndpointContext{Type: 
v1.EndpointTypeErrorHandler},
+                       *errorHandlerSpec.Endpoint(),
+               )
                if err != nil {
                        return nil, fmt.Errorf("could not determine error 
handler URI: %w", err)
                }
@@ -48,6 +56,9 @@ func maybeErrorHandler(errHandlConf *v1.ErrorHandlerSpec, 
bindingContext binding
                errorHandlerBinding = &bindings.Binding{
                        ApplicationProperties: make(map[string]string),
                }
+               if errorHandlerSpec.Type() == v1.ErrorHandlerTypeLog {
+                       errorHandlerBinding.URI = defaultCamelErrorHandler
+               }
        }
 
        err = setErrorHandlerConfiguration(errorHandlerBinding, 
errorHandlerSpec)
@@ -106,8 +117,31 @@ func setErrorHandlerConfiguration(errorHandlerBinding 
*bindings.Binding, errorHa
        for key, value := range properties {
                errorHandlerBinding.ApplicationProperties[key] = 
fmt.Sprintf("%v", value)
        }
-       if errorHandler.Type() == v1.ErrorHandlerTypeSink && 
errorHandlerBinding.URI != "" {
-               
errorHandlerBinding.ApplicationProperties[fmt.Sprintf("%s.deadLetterUri", 
v1.ErrorHandlerAppPropertiesPrefix)] = errorHandlerBinding.URI
-       }
+
        return nil
 }
+
+// translateCamelErrorHandler will translate a binding as an error handler 
YAML as expected by Camel.
+func translateCamelErrorHandler(b *bindings.Binding) map[string]interface{} {
+       yamlCode := map[string]interface{}{}
+       switch b.URI {
+       case "":
+               yamlCode["errorHandler"] = map[string]interface{}{
+                       "noErrorHandler": map[string]interface{}{},
+               }
+       case defaultCamelErrorHandler:
+               yamlCode["errorHandler"] = map[string]interface{}{
+                       "defaultErrorHandler": map[string]interface{}{
+                               "logName": "err",
+                       },
+               }
+       default:
+               yamlCode["errorHandler"] = map[string]interface{}{
+                       "deadLetterChannel": map[string]interface{}{
+                               "deadLetterUri": b.URI,
+                       },
+               }
+       }
+
+       return yamlCode
+}
diff --git a/pkg/controller/pipe/error_handler_test.go 
b/pkg/controller/pipe/error_handler_test.go
index 4cd751f8d..9ec0f1984 100644
--- a/pkg/controller/pipe/error_handler_test.go
+++ b/pkg/controller/pipe/error_handler_test.go
@@ -31,10 +31,8 @@ func TestParseErrorHandlerNoneDoesSucceed(t *testing.T) {
        )
        require.NoError(t, err)
        assert.Equal(t, v1.ErrorHandlerTypeNone, noErrorHandler.Type())
-       parameters, err := noErrorHandler.Configuration()
+       _, err = noErrorHandler.Configuration()
        require.NoError(t, err)
-       assert.Equal(t, 
"#class:org.apache.camel.builder.NoErrorHandlerBuilder", 
parameters[v1.ErrorHandlerAppPropertiesPrefix])
-       assert.Equal(t, v1.ErrorHandlerRefDefaultName, 
parameters[v1.ErrorHandlerRefName])
 }
 
 func TestParseErrorHandlerLogDoesSucceed(t *testing.T) {
@@ -43,10 +41,8 @@ func TestParseErrorHandlerLogDoesSucceed(t *testing.T) {
        )
        require.NoError(t, err)
        assert.Equal(t, v1.ErrorHandlerTypeLog, logErrorHandler.Type())
-       parameters, err := logErrorHandler.Configuration()
+       _, err = logErrorHandler.Configuration()
        require.NoError(t, err)
-       assert.Equal(t, 
"#class:org.apache.camel.builder.DefaultErrorHandlerBuilder", 
parameters[v1.ErrorHandlerAppPropertiesPrefix])
-       assert.Equal(t, v1.ErrorHandlerRefDefaultName, 
parameters[v1.ErrorHandlerRefName])
 }
 
 func TestParseErrorHandlerLogWithParametersDoesSucceed(t *testing.T) {
@@ -55,12 +51,8 @@ func TestParseErrorHandlerLogWithParametersDoesSucceed(t 
*testing.T) {
        )
        require.NoError(t, err)
        assert.Equal(t, v1.ErrorHandlerTypeLog, logErrorHandler.Type())
-       parameters, err := logErrorHandler.Configuration()
+       _, err = logErrorHandler.Configuration()
        require.NoError(t, err)
-       assert.Equal(t, 
"#class:org.apache.camel.builder.DefaultErrorHandlerBuilder", 
parameters[v1.ErrorHandlerAppPropertiesPrefix])
-       assert.Equal(t, "value1", 
parameters["camel.beans.defaultErrorHandler.param1"])
-       assert.Equal(t, "value2", 
parameters["camel.beans.defaultErrorHandler.param2"])
-       assert.Equal(t, v1.ErrorHandlerRefDefaultName, 
parameters[v1.ErrorHandlerRefName])
 }
 
 func TestParseErrorHandlerSinkDoesSucceed(t *testing.T) {
@@ -71,10 +63,8 @@ func TestParseErrorHandlerSinkDoesSucceed(t *testing.T) {
        assert.NotNil(t, sinkErrorHandler)
        assert.Equal(t, v1.ErrorHandlerTypeSink, sinkErrorHandler.Type())
        assert.Equal(t, "someUri", *sinkErrorHandler.Endpoint().URI)
-       parameters, err := sinkErrorHandler.Configuration()
+       _, err = sinkErrorHandler.Configuration()
        require.NoError(t, err)
-       assert.Equal(t, 
"#class:org.apache.camel.builder.DeadLetterChannelBuilder", 
parameters[v1.ErrorHandlerAppPropertiesPrefix])
-       assert.Equal(t, v1.ErrorHandlerRefDefaultName, 
parameters[v1.ErrorHandlerRefName])
 }
 
 func TestParseErrorHandlerSinkWithParametersDoesSucceed(t *testing.T) {
@@ -93,12 +83,8 @@ func TestParseErrorHandlerSinkWithParametersDoesSucceed(t 
*testing.T) {
        assert.NotNil(t, sinkErrorHandler)
        assert.Equal(t, v1.ErrorHandlerTypeSink, sinkErrorHandler.Type())
        assert.Equal(t, "someUri", *sinkErrorHandler.Endpoint().URI)
-       parameters, err := sinkErrorHandler.Configuration()
+       _, err = sinkErrorHandler.Configuration()
        require.NoError(t, err)
-       assert.Equal(t, 
"#class:org.apache.camel.builder.DeadLetterChannelBuilder", 
parameters[v1.ErrorHandlerAppPropertiesPrefix])
-       assert.Equal(t, v1.ErrorHandlerRefDefaultName, 
parameters[v1.ErrorHandlerRefName])
-       assert.Equal(t, "value1", 
parameters["camel.beans.defaultErrorHandler.param1"])
-       assert.Equal(t, "value2", 
parameters["camel.beans.defaultErrorHandler.param2"])
 }
 
 func TestParseErrorHandlerSinkFail(t *testing.T) {
diff --git a/pkg/controller/pipe/integration.go 
b/pkg/controller/pipe/integration.go
index 95d18722e..d093295c6 100644
--- a/pkg/controller/pipe/integration.go
+++ b/pkg/controller/pipe/integration.go
@@ -204,10 +204,21 @@ func CreateIntegrationFor(ctx context.Context, c 
client.Client, binding *v1.Pipe
                        "from": fromWrapper,
                },
        }
+
+       if errorHandler != nil {
+               eh := translateCamelErrorHandler(errorHandler)
+               encodedErrorHandler, err := json.Marshal(eh)
+               if err != nil {
+                       return nil, err
+               }
+               it.Spec.Flows = append(it.Spec.Flows, v1.Flow{RawMessage: 
encodedErrorHandler})
+       }
+
        encodedRoute, err := json.Marshal(flowRoute)
        if err != nil {
                return nil, err
        }
+
        it.Spec.Flows = append(it.Spec.Flows, v1.Flow{RawMessage: encodedRoute})
 
        return &it, nil
diff --git a/pkg/controller/pipe/integration_test.go 
b/pkg/controller/pipe/integration_test.go
index d5756003f..fe7868b22 100644
--- a/pkg/controller/pipe/integration_test.go
+++ b/pkg/controller/pipe/integration_test.go
@@ -54,6 +54,38 @@ func TestCreateIntegrationForPipe(t *testing.T) {
        assert.Equal(t, expectedNominalRoute(), string(dsl))
 }
 
+func TestCreateIntegrationForPipeWithSinkKameletErrorHandler(t *testing.T) {
+       client, err := internal.NewFakeClient()
+       require.NoError(t, err)
+
+       pipe := nominalPipe("my-error-handler-pipe")
+       pipe.Spec.ErrorHandler = &v1.ErrorHandlerSpec{
+               RawMessage: []byte(`{"sink": {"endpoint": {"ref": {"kind": 
"Kamelet", "apiVersion": "camel.apache.org/v1", "name": "my-err"}}}}`),
+       }
+
+       it, err := CreateIntegrationFor(context.TODO(), client, &pipe)
+       require.NoError(t, err)
+       assert.Equal(t, "my-error-handler-pipe", it.Name)
+       assert.Equal(t, "default", it.Namespace)
+       assert.Equal(t, "camel.apache.org/v1", it.OwnerReferences[0].APIVersion)
+       assert.Equal(t, "Pipe", it.OwnerReferences[0].Kind)
+       assert.Equal(t, "my-error-handler-pipe", it.OwnerReferences[0].Name)
+       dsl, err := v1.ToYamlDSL(it.Spec.Flows)
+       require.NoError(t, err)
+       assert.Equal(t,
+               `- errorHandler:
+    deadLetterChannel:
+      deadLetterUri: kamelet:my-err/errorHandler
+- route:
+    from:
+      steps:
+      - to: kamelet:my-sink/sink
+      uri: kamelet:my-source/source
+    id: binding
+`, string(dsl),
+       )
+}
+
 func TestCreateIntegrationForPipeWithSinkErrorHandler(t *testing.T) {
        client, err := internal.NewFakeClient()
        require.NoError(t, err)
@@ -70,13 +102,20 @@ func TestCreateIntegrationForPipeWithSinkErrorHandler(t 
*testing.T) {
        assert.Equal(t, "camel.apache.org/v1", it.OwnerReferences[0].APIVersion)
        assert.Equal(t, "Pipe", it.OwnerReferences[0].Kind)
        assert.Equal(t, "my-error-handler-pipe", it.OwnerReferences[0].Name)
-       assert.Len(t, it.Spec.Configuration, 3)
-       assert.Equal(t, 
"#class:org.apache.camel.builder.DeadLetterChannelBuilder", 
it.Spec.GetConfigurationProperty("camel.beans.defaultErrorHandler"))
-       assert.Equal(t, "someUri", 
it.Spec.GetConfigurationProperty("camel.beans.defaultErrorHandler.deadLetterUri"))
-       assert.Equal(t, "defaultErrorHandler", 
it.Spec.GetConfigurationProperty(v1.ErrorHandlerRefName))
        dsl, err := v1.ToYamlDSL(it.Spec.Flows)
        require.NoError(t, err)
-       assert.Equal(t, expectedNominalRoute(), string(dsl))
+       assert.Equal(t,
+               `- errorHandler:
+    deadLetterChannel:
+      deadLetterUri: someUri
+- route:
+    from:
+      steps:
+      - to: kamelet:my-sink/sink
+      uri: kamelet:my-source/source
+    id: binding
+`, string(dsl),
+       )
 }
 
 func TestCreateIntegrationForPipeWithLogErrorHandler(t *testing.T) {
@@ -95,13 +134,52 @@ func TestCreateIntegrationForPipeWithLogErrorHandler(t 
*testing.T) {
        assert.Equal(t, "camel.apache.org/v1", it.OwnerReferences[0].APIVersion)
        assert.Equal(t, "Pipe", it.OwnerReferences[0].Kind)
        assert.Equal(t, "my-error-handler-pipe", it.OwnerReferences[0].Name)
-       assert.Len(t, it.Spec.Configuration, 3)
-       assert.Equal(t, 
"#class:org.apache.camel.builder.DefaultErrorHandlerBuilder", 
it.Spec.GetConfigurationProperty("camel.beans.defaultErrorHandler"))
-       assert.Equal(t, "true", 
it.Spec.GetConfigurationProperty("camel.beans.defaultErrorHandler.showHeaders"))
-       assert.Equal(t, "defaultErrorHandler", 
it.Spec.GetConfigurationProperty(v1.ErrorHandlerRefName))
        dsl, err := v1.ToYamlDSL(it.Spec.Flows)
        require.NoError(t, err)
-       assert.Equal(t, expectedNominalRoute(), string(dsl))
+       assert.Equal(t,
+               `- errorHandler:
+    defaultErrorHandler:
+      logName: err
+- route:
+    from:
+      steps:
+      - to: kamelet:my-sink/sink
+      uri: kamelet:my-source/source
+    id: binding
+`, string(dsl),
+       )
+}
+
+func TestCreateIntegrationForPipeWithNoneErrorHandler(t *testing.T) {
+       client, err := internal.NewFakeClient()
+       require.NoError(t, err)
+
+       pipe := nominalPipe("my-error-handler-pipe")
+       pipe.Spec.ErrorHandler = &v1.ErrorHandlerSpec{
+               RawMessage: []byte(`{"none": {}}`),
+       }
+
+       it, err := CreateIntegrationFor(context.TODO(), client, &pipe)
+       require.NoError(t, err)
+       assert.Equal(t, "my-error-handler-pipe", it.Name)
+       assert.Equal(t, "default", it.Namespace)
+       assert.Equal(t, "camel.apache.org/v1", it.OwnerReferences[0].APIVersion)
+       assert.Equal(t, "Pipe", it.OwnerReferences[0].Kind)
+       assert.Equal(t, "my-error-handler-pipe", it.OwnerReferences[0].Name)
+       dsl, err := v1.ToYamlDSL(it.Spec.Flows)
+       require.NoError(t, err)
+       assert.Equal(t,
+               `- errorHandler:
+    noErrorHandler: {}
+- route:
+    from:
+      steps:
+      - to: kamelet:my-sink/sink
+      uri: kamelet:my-source/source
+    id: binding
+`,
+               string(dsl),
+       )
 }
 
 func TestCreateIntegrationForPipeDataType(t *testing.T) {
diff --git a/pkg/trait/error_handler.go b/pkg/trait/error_handler.go
deleted file mode 100644
index 05eabeaa1..000000000
--- a/pkg/trait/error_handler.go
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
-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"
-       "strings"
-
-       "gopkg.in/yaml.v2"
-
-       v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-       traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
-       "github.com/apache/camel-k/v2/pkg/util"
-)
-
-const (
-       errorHandlerTraitID    = "error-handler"
-       errorHandlerTraitOrder = 470
-)
-
-type errorHandlerTrait struct {
-       BasePlatformTrait
-       traitv1.ErrorHandlerTrait `property:",squash"`
-}
-
-func newErrorHandlerTrait() Trait {
-       return &errorHandlerTrait{
-               // NOTE: Must run before dependency trait
-               BasePlatformTrait: NewBasePlatformTrait(errorHandlerTraitID, 
errorHandlerTraitOrder),
-       }
-}
-
-func (t *errorHandlerTrait) Configure(e *Environment) (bool, *TraitCondition, 
error) {
-       if e.Integration == nil {
-               return false, nil, nil
-       }
-       if !e.IntegrationInPhase(v1.IntegrationPhaseInitialization) && 
!e.IntegrationInRunningPhases() {
-               return false, nil, nil
-       }
-       if t.ErrorHandlerRef == "" {
-               t.ErrorHandlerRef = 
e.Integration.Spec.GetConfigurationProperty(v1.ErrorHandlerRefName)
-       }
-
-       return t.ErrorHandlerRef != "", nil, nil
-}
-
-func (t *errorHandlerTrait) Apply(e *Environment) error {
-       if e.IntegrationInPhase(v1.IntegrationPhaseInitialization) {
-               // If the user configure directly the URI, we need to 
auto-discover the underlying component
-               // and add the related dependency
-               defaultErrorHandlerURI := 
e.Integration.Spec.GetConfigurationProperty(
-                       fmt.Sprintf("%s.deadLetterUri", 
v1.ErrorHandlerAppPropertiesPrefix))
-               if defaultErrorHandlerURI != "" && 
!strings.HasPrefix(defaultErrorHandlerURI, "kamelet:") {
-                       t.addErrorHandlerDependencies(e, defaultErrorHandlerURI)
-               }
-
-               return t.addGlobalErrorHandlerAsSource(e)
-       }
-       return nil
-}
-
-func (t *errorHandlerTrait) addErrorHandlerDependencies(e *Environment, uri 
string) {
-       candidateComp, scheme := e.CamelCatalog.DecodeComponent(uri)
-       if candidateComp != nil {
-               util.StringSliceUniqueAdd(&e.Integration.Status.Dependencies, 
candidateComp.GetDependencyID())
-               if scheme != nil {
-                       for _, dep := range 
candidateComp.GetProducerDependencyIDs(scheme.ID) {
-                               
util.StringSliceUniqueAdd(&e.Integration.Status.Dependencies, dep)
-                       }
-               }
-       }
-}
-
-func (t *errorHandlerTrait) addGlobalErrorHandlerAsSource(e *Environment) 
error {
-       flowErrorHandler := map[string]interface{}{
-               "errorHandler": map[string]string{
-                       "refErrorHandler": t.ErrorHandlerRef,
-               },
-       }
-       encodedFlowErrorHandler, err := 
yaml.Marshal([]map[string]interface{}{flowErrorHandler})
-       if err != nil {
-               return err
-       }
-       errorHandlerSource := v1.SourceSpec{
-               DataSpec: v1.DataSpec{
-                       Name:    "camel-k-embedded-error-handler.yaml",
-                       Content: string(encodedFlowErrorHandler),
-               },
-               Language: v1.LanguageYaml,
-               Type:     v1.SourceTypeErrorHandler,
-       }
-
-       e.Integration.Status.AddOrReplaceGeneratedSources(errorHandlerSource)
-
-       return nil
-}
diff --git a/pkg/trait/error_handler_test.go b/pkg/trait/error_handler_test.go
deleted file mode 100644
index 4f6ed6168..000000000
--- a/pkg/trait/error_handler_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
-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"
-       "github.com/stretchr/testify/require"
-
-       v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-       "github.com/apache/camel-k/v2/pkg/util/camel"
-)
-
-func TestErrorHandlerConfigureFromIntegrationProperty(t *testing.T) {
-       catalog, err := camel.DefaultCatalog()
-       require.NoError(t, err)
-       e := &Environment{
-               CamelCatalog: catalog,
-               Catalog:      NewEnvironmentTestCatalog(),
-               Integration:  &v1.Integration{},
-       }
-       e.Integration.Spec.AddConfigurationProperty(fmt.Sprintf("%v = %s", 
v1.ErrorHandlerRefName, "defaultErrorHandler"))
-
-       trait := newErrorHandlerTrait()
-       enabled, condition, err := trait.Configure(e)
-       require.NoError(t, err)
-       assert.False(t, enabled)
-       assert.Nil(t, condition)
-
-       e.Integration.Status.Phase = v1.IntegrationPhaseNone
-       enabled, condition, err = trait.Configure(e)
-       require.NoError(t, err)
-       assert.False(t, enabled)
-       assert.Nil(t, condition)
-
-       e.Integration.Status.Phase = v1.IntegrationPhaseInitialization
-       enabled, condition, err = trait.Configure(e)
-       require.NoError(t, err)
-       assert.True(t, enabled)
-       assert.Nil(t, condition)
-
-}
-
-func TestErrorHandlerApplySource(t *testing.T) {
-       catalog, err := camel.DefaultCatalog()
-       require.NoError(t, err)
-       e := &Environment{
-               CamelCatalog: catalog,
-               Catalog:      NewEnvironmentTestCatalog(),
-               Integration:  &v1.Integration{},
-       }
-       e.Integration.Spec.AddConfiguration("property", fmt.Sprintf("%v = %s", 
v1.ErrorHandlerRefName, "defaultErrorHandler"))
-       e.Integration.Status.Phase = v1.IntegrationPhaseInitialization
-
-       trait := newErrorHandlerTrait()
-       enabled, condition, err := trait.Configure(e)
-       require.NoError(t, err)
-       assert.True(t, enabled)
-       assert.Nil(t, condition)
-
-       err = trait.Apply(e)
-       require.NoError(t, err)
-       assert.Equal(t, `- errorHandler:
-    refErrorHandler: defaultErrorHandler
-`, e.Integration.Status.GeneratedSources[0].Content)
-}
-
-func TestErrorHandlerApplyDependency(t *testing.T) {
-       c, err := camel.DefaultCatalog()
-       require.NoError(t, err)
-       e := &Environment{
-               Catalog:      NewEnvironmentTestCatalog(),
-               CamelCatalog: c,
-               Integration:  &v1.Integration{},
-       }
-       
e.Integration.Spec.AddConfigurationProperty("camel.beans.defaultErrorHandler = 
#class:org.apache.camel.builder.DeadLetterChannelBuilder")
-       
e.Integration.Spec.AddConfigurationProperty("camel.beans.defaultErrorHandler.deadLetterUri
 = log:info")
-       e.Integration.Spec.AddConfigurationProperty(fmt.Sprintf("%v = %s", 
v1.ErrorHandlerRefName, "defaultErrorHandler"))
-       e.Integration.Status.Phase = v1.IntegrationPhaseInitialization
-
-       trait := newErrorHandlerTrait()
-       enabled, condition, err := trait.Configure(e)
-       require.NoError(t, err)
-       assert.True(t, enabled)
-       assert.Nil(t, condition)
-
-       err = trait.Apply(e)
-       require.NoError(t, err)
-       assert.Len(t, e.Integration.Spec.Configuration, 3)
-       assert.Equal(t, 
"#class:org.apache.camel.builder.DeadLetterChannelBuilder", 
e.Integration.Spec.GetConfigurationProperty("camel.beans.defaultErrorHandler"))
-       assert.Equal(t, "log:info", 
e.Integration.Spec.GetConfigurationProperty("camel.beans.defaultErrorHandler.deadLetterUri"))
-       assert.Equal(t, "defaultErrorHandler", 
e.Integration.Spec.GetConfigurationProperty(v1.ErrorHandlerRefName))
-       assert.Equal(t, "camel:log", e.Integration.Status.Dependencies[0])
-}
diff --git a/pkg/trait/kamelets.go b/pkg/trait/kamelets.go
index f587b5109..bf52ac619 100644
--- a/pkg/trait/kamelets.go
+++ b/pkg/trait/kamelets.go
@@ -39,7 +39,6 @@ import (
        "github.com/apache/camel-k/v2/pkg/util/camel"
        "github.com/apache/camel-k/v2/pkg/util/digest"
        "github.com/apache/camel-k/v2/pkg/util/dsl"
-       "github.com/apache/camel-k/v2/pkg/util/source"
 )
 
 const (
@@ -48,6 +47,7 @@ const (
 
        contentKey                  = "content"
        KameletLocationProperty     = "camel.component.kamelet.location"
+       KameletErrorHandler         = "camel.component.kamelet.no-error-handler"
        kameletMountPointAnnotation = "camel.apache.org/kamelet.mount-point"
 )
 
@@ -83,11 +83,6 @@ func (t *kameletsTrait) Configure(e *Environment) (bool, 
*TraitCondition, error)
                if err != nil {
                        return false, nil, err
                }
-               // Check if a Kamelet is configured as default error handler URI
-               defaultErrorHandlerURI := 
e.Integration.Spec.GetConfigurationProperty(v1.ErrorHandlerAppPropertiesPrefix 
+ ".deadLetterUri")
-               if defaultErrorHandlerURI != "" && 
strings.HasPrefix(defaultErrorHandlerURI, "kamelet:") {
-                       kamelets = append(kamelets, 
source.ExtractKamelet(defaultErrorHandlerURI))
-               }
                if len(kamelets) > 0 {
                        sort.Strings(kamelets)
                        t.List = strings.Join(kamelets, ",")
@@ -228,6 +223,8 @@ func (t *kameletsTrait) addKamelets(e *Environment) error {
                }
        }
        e.ApplicationProperties[KameletLocationProperty] += 
",classpath:/kamelets"
+       // required because of https://issues.apache.org/jira/browse/CAMEL-21599
+       e.ApplicationProperties[KameletErrorHandler] = "false"
        // resort dependencies
        sort.Strings(e.Integration.Status.Dependencies)
 
diff --git a/pkg/trait/kamelets_test.go b/pkg/trait/kamelets_test.go
index ef6820f4e..43275de86 100644
--- a/pkg/trait/kamelets_test.go
+++ b/pkg/trait/kamelets_test.go
@@ -747,4 +747,9 @@ func TestKameletAuto(t *testing.T) {
        assert.Equal(t, traitv1.KameletsTrait{
                List: "none,timer",
        }, trait.KameletsTrait)
+       assert.Equal(t,
+               
"file:/etc/camel/kamelets/kamelets-bundle-it-001,classpath:/kamelets",
+               environment.ApplicationProperties[KameletLocationProperty],
+       )
+       assert.Equal(t, "false", 
environment.ApplicationProperties[KameletErrorHandler])
 }
diff --git a/pkg/trait/trait_register.go b/pkg/trait/trait_register.go
index 6d543a88b..e21402783 100644
--- a/pkg/trait/trait_register.go
+++ b/pkg/trait/trait_register.go
@@ -29,7 +29,6 @@ func init() {
        AddToTraits(newDeployerTrait)
        AddToTraits(newDeploymentTrait)
        AddToTraits(newEnvironmentTrait)
-       AddToTraits(newErrorHandlerTrait)
        AddToTraits(newGCTrait)
        AddToTraits(newHealthTrait)
        AddToTraits(NewInitTrait)

Reply via email to