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 a91f56963 feat: support Error Handler
a91f56963 is described below
commit a91f5696355ba5d8c4e9b69ec965e489efdacfe1
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Sat Jan 11 09:57:52 2025 +0100
feat: support Error Handler
---
pkg/util/source/inspector.go | 18 ++++++++-
pkg/util/source/inspector_java_source_test.go | 21 +++++++++++
pkg/util/source/inspector_xml.go | 16 +++++++-
pkg/util/source/inspector_xml_test.go | 19 ++++++++++
pkg/util/source/inspector_yaml.go | 16 ++++++--
pkg/util/source/inspector_yaml_test.go | 54 +++++++++++++++++++++++++++
6 files changed, 137 insertions(+), 7 deletions(-)
diff --git a/pkg/util/source/inspector.go b/pkg/util/source/inspector.go
index 8d58602a2..101fbd91e 100644
--- a/pkg/util/source/inspector.go
+++ b/pkg/util/source/inspector.go
@@ -31,6 +31,7 @@ type catalog2deps func(*camel.RuntimeCatalog) []string
const (
defaultJSONDataFormat = "jackson"
+ kamelet = "kamelet"
)
var (
@@ -51,6 +52,7 @@ var (
jsonLibraryRegexp = regexp.MustCompile(`.*JsonLibrary\.Jackson.*`)
jsonLanguageRegexp = regexp.MustCompile(`.*\.json\(\).*`)
beanRegexp = regexp.MustCompile(`.*\.bean\(.*\).*`)
+ errorHandlerRegexp =
regexp.MustCompile(`errorHandler\s*\(\s*deadLetterChannel\s*\(\s*["|']([a-zA-Z0-9-]+:[^"|']+)["|']\s*\).*`)
circuitBreakerRegexp = regexp.MustCompile(`.*\.circuitBreaker\(\).*`)
restConfigurationRegexp =
regexp.MustCompile(`.*restConfiguration\(\).*`)
restRegexp = regexp.MustCompile(`.*rest\s*\([^)]*\).*`)
@@ -253,7 +255,7 @@ func (i *baseInspector) extract(source v1.SourceSpec, meta
*Metadata,
meta.ToURIs = append(meta.ToURIs, to...)
for _, k := range kameletEips {
- AddKamelet(meta, "kamelet:"+k)
+ AddKamelet(meta, kamelet+":"+k)
}
if err := i.discoverCapabilities(source, meta); err != nil {
@@ -350,6 +352,18 @@ func (i *baseInspector) discoverDependencies(source
v1.SourceSpec, meta *Metadat
}
}
+ for _, match := range
errorHandlerRegexp.FindAllStringSubmatch(source.Content, -1) {
+ if len(match) > 1 {
+ _, scheme := i.catalog.DecodeComponent(match[1])
+ if dfDep := i.catalog.GetArtifactByScheme(scheme.ID);
dfDep != nil {
+ meta.AddDependency(dfDep.GetDependencyID())
+ }
+ if scheme.ID == kamelet {
+ AddKamelet(meta, match[1])
+ }
+ }
+ }
+
return nil
}
@@ -430,7 +444,7 @@ func (i *baseInspector) hasOnlyPassiveEndpoints(fromURIs
[]string) bool {
func (i *baseInspector) containsOnlyURIsIn(fromURI []string, allowed
map[string]bool) bool {
for _, uri := range fromURI {
- if uri == "kamelet:source" {
+ if uri == kamelet+":source" {
continue
}
prefix := i.getURIPrefix(uri)
diff --git a/pkg/util/source/inspector_java_source_test.go
b/pkg/util/source/inspector_java_source_test.go
index 4d52c9864..0ecc4b5c3 100644
--- a/pkg/util/source/inspector_java_source_test.go
+++ b/pkg/util/source/inspector_java_source_test.go
@@ -206,3 +206,24 @@ func TestJavaBeanDependencies(t *testing.T) {
assert.Contains(t, meta.Dependencies.List(), "camel:log")
})
}
+
+func TestErrorHandlerDependencies(t *testing.T) {
+ inspector := newTestJavaSourceInspector(t)
+
+ sourceSpec := &v1.SourceSpec{
+ DataSpec: v1.DataSpec{
+ Name: "test.java",
+ Content: `
+ public void configure() throws Exception {
+ errorHandler(deadLetterChannel("seda:error"));
+ from("timer:foo").to("log:bar");
+ }
+ `,
+ },
+ }
+ assertExtract(t, inspector, sourceSpec.Content, func(meta *Metadata) {
+ assert.Contains(t, meta.Dependencies.List(), "camel:timer")
+ assert.Contains(t, meta.Dependencies.List(), "camel:seda")
+ assert.Contains(t, meta.Dependencies.List(), "camel:log")
+ })
+}
diff --git a/pkg/util/source/inspector_xml.go b/pkg/util/source/inspector_xml.go
index 2604a5944..521f96242 100644
--- a/pkg/util/source/inspector_xml.go
+++ b/pkg/util/source/inspector_xml.go
@@ -77,6 +77,18 @@ func (i XMLInspector) Extract(source v1.SourceSpec, meta
*Metadata) error {
}
}
}
+ case "deadLetterChannel":
+ for _, a := range se.Attr {
+ if a.Name.Local == "deadLetterUri" {
+ _, scheme :=
i.catalog.DecodeComponent(a.Value)
+ if dfDep :=
i.catalog.GetArtifactByScheme(scheme.ID); dfDep != nil {
+
meta.AddDependency(dfDep.GetDependencyID())
+ }
+ if scheme.ID == kamelet {
+ AddKamelet(meta,
a.Value)
+ }
+ }
+ }
case "from", "fromF":
for _, a := range se.Attr {
if a.Name.Local == URI {
@@ -89,10 +101,10 @@ func (i XMLInspector) Extract(source v1.SourceSpec, meta
*Metadata) error {
meta.ToURIs =
append(meta.ToURIs, a.Value)
}
}
- case "kamelet":
+ case kamelet:
for _, a := range se.Attr {
if a.Name.Local == "name" {
- AddKamelet(meta,
"kamelet:"+a.Value)
+ AddKamelet(meta,
kamelet+":"+a.Value)
}
}
}
diff --git a/pkg/util/source/inspector_xml_test.go
b/pkg/util/source/inspector_xml_test.go
index a8de69477..1b770141a 100644
--- a/pkg/util/source/inspector_xml_test.go
+++ b/pkg/util/source/inspector_xml_test.go
@@ -238,3 +238,22 @@ func TestXMLBeanDependencies(t *testing.T) {
assert.Contains(t, meta.Dependencies.List(), "camel:log")
})
}
+
+func TestXMLErrorHandlerDependencies(t *testing.T) {
+ xmlCode := `
+ <errorHandler>
+ <deadLetterChannel deadLetterUri="seda:dead">
+ <redeliveryPolicy maximumRedeliveries="3"
redeliveryDelay="250"/>
+ </deadLetterChannel>
+ </errorHandler>
+ <from uri="timer:foo"/>
+ <to uri="log:bar"></to>
+ `
+ inspector := newTestXMLInspector(t)
+
+ assertExtract(t, inspector, xmlCode, func(meta *Metadata) {
+ assert.Contains(t, meta.Dependencies.List(), "camel:timer")
+ assert.Contains(t, meta.Dependencies.List(), "camel:seda")
+ assert.Contains(t, meta.Dependencies.List(), "camel:log")
+ })
+}
diff --git a/pkg/util/source/inspector_yaml.go
b/pkg/util/source/inspector_yaml.go
index 3b280fc7f..840aaaf10 100644
--- a/pkg/util/source/inspector_yaml.go
+++ b/pkg/util/source/inspector_yaml.go
@@ -111,13 +111,13 @@ func (i YAMLInspector) parseStep(key string, content
interface{}, meta *Metadata
}
}
}
- case "kamelet":
+ case kamelet:
switch t := content.(type) {
case string:
- AddKamelet(meta, "kamelet:"+t)
+ AddKamelet(meta, kamelet+":"+t)
case map[interface{}]interface{}:
if name, ok := t["name"].(string); ok {
- AddKamelet(meta, "kamelet:"+name)
+ AddKamelet(meta, kamelet+":"+name)
}
}
}
@@ -170,6 +170,16 @@ func (i YAMLInspector) parseStep(key string, content
interface{}, meta *Metadata
return err
}
}
+ case "deadLetterUri":
+ if s, ok := v.(string); ok {
+ _, scheme :=
i.catalog.DecodeComponent(s)
+ if dfDep :=
i.catalog.GetArtifactByScheme(scheme.ID); dfDep != nil {
+
meta.AddDependency(dfDep.GetDependencyID())
+ }
+ if scheme.ID == kamelet {
+ AddKamelet(meta, s)
+ }
+ }
default:
// Always follow children because from/to uris
can be nested
if ks, ok := k.(string); ok {
diff --git a/pkg/util/source/inspector_yaml_test.go
b/pkg/util/source/inspector_yaml_test.go
index fbe8c286e..a94c25491 100644
--- a/pkg/util/source/inspector_yaml_test.go
+++ b/pkg/util/source/inspector_yaml_test.go
@@ -776,3 +776,57 @@ func TestYamlBeanDependencies(t *testing.T) {
assert.Contains(t, meta.Dependencies.List(), "camel:log")
})
}
+
+func TestYAMLErrorHandler(t *testing.T) {
+ yamlContractFirst := `
+- errorHandler:
+ deadLetterChannel:
+ deadLetterUri: kafka:my-dlc
+- route:
+ id: route1
+ from:
+ uri: "timer:tick"
+ parameters:
+ period: "5000"
+ steps:
+ - setBody:
+ constant: "Hello Yaml !!!"
+ - transform:
+ simple: "${body.toUpperCase()}"
+ - to: "{{url}}"
+`
+
+ inspector := newTestYAMLInspector(t)
+ t.Run("TestYAMLErrorHandler", func(t *testing.T) {
+ assertExtractYAML(t, inspector, yamlContractFirst, func(meta
*Metadata) {
+ assert.Contains(t, meta.Dependencies.List(),
"camel:kafka")
+ })
+ })
+}
+
+func TestYAMLErrorHandlerKamelet(t *testing.T) {
+ yamlContractFirst := `
+- errorHandler:
+ deadLetterChannel:
+ deadLetterUri: kamelet:my-kamelet/errorHandler
+- route:
+ id: route1
+ from:
+ uri: "timer:tick"
+ parameters:
+ period: "5000"
+ steps:
+ - setBody:
+ constant: "Hello Yaml !!!"
+ - transform:
+ simple: "${body.toUpperCase()}"
+ - to: "{{url}}"
+`
+
+ inspector := newTestYAMLInspector(t)
+ t.Run("TestYAMLErrorHandler", func(t *testing.T) {
+ assertExtractYAML(t, inspector, yamlContractFirst, func(meta
*Metadata) {
+ assert.Contains(t, meta.Kamelets, "my-kamelet/error")
+ })
+ })
+}