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

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

commit 1bb2a6c824a4fa63c195657f677d2db6df8cbeea
Author: Tadayoshi Sato <[email protected]>
AuthorDate: Mon Sep 12 13:22:33 2022 +0900

    feat(metadata): raise error when capability/dependency not resolved in 
CamelCatalog
---
 addons/keda/keda_test.go                           |  49 ++++-----
 addons/resume/resume.go                            |   5 +-
 pkg/apis/camel/v1/camelcatalog_types_support.go    |  12 +++
 pkg/metadata/metadata_dependencies_test.go         | 109 +++++++++++---------
 pkg/metadata/metadata_http_test.go                 |  44 ++++----
 pkg/metadata/metadata_uri_test.go                  |  85 ++++++++--------
 pkg/trait/kamelets.go                              |   4 +-
 pkg/trait/kamelets_test.go                         |  41 ++++----
 pkg/trait/knative_service_test.go                  |  21 ++--
 pkg/trait/mount_test.go                            |   9 +-
 pkg/util/source/inspector.go                       | 112 +++++++++++++++------
 pkg/util/source/inspector_groovy.go                |  20 +---
 pkg/util/source/inspector_java_script.go           |  20 +---
 pkg/util/source/inspector_java_source.go           |  20 +---
 pkg/util/source/inspector_kotlin.go                |  20 +---
 pkg/util/source/inspector_xml.go                   |  14 ++-
 pkg/util/source/inspector_yaml.go                  |  16 +--
 .../source/{inspector_kamelet.go => kamelet.go}    |   0
 pkg/util/source/types.go                           |  16 ++-
 19 files changed, 321 insertions(+), 296 deletions(-)

diff --git a/addons/keda/keda_test.go b/addons/keda/keda_test.go
index 4783653ca..75924a83d 100644
--- a/addons/keda/keda_test.go
+++ b/addons/keda/keda_test.go
@@ -35,17 +35,13 @@ import (
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/runtime"
-)
-
-var (
-       testingTrue  = true
-       testingFalse = false
+       "k8s.io/utils/pointer"
 )
 
 func TestManualConfig(t *testing.T) {
        keda, _ := NewKedaTrait().(*kedaTrait)
-       keda.Enabled = &testingTrue
-       keda.Auto = &testingFalse
+       keda.Enabled = pointer.Bool(true)
+       keda.Auto = pointer.Bool(false)
        meta := map[string]string{
                "prop":      "val",
                "camelCase": "VAL",
@@ -72,8 +68,8 @@ func TestManualConfig(t *testing.T) {
 
 func TestConfigFromSecret(t *testing.T) {
        keda, _ := NewKedaTrait().(*kedaTrait)
-       keda.Enabled = &testingTrue
-       keda.Auto = &testingFalse
+       keda.Enabled = pointer.Bool(true)
+       keda.Auto = pointer.Bool(false)
        meta := map[string]string{
                "prop":      "val",
                "camelCase": "VAL",
@@ -119,7 +115,7 @@ func TestConfigFromSecret(t *testing.T) {
 
 func TestKameletAutoDetection(t *testing.T) {
        keda, _ := NewKedaTrait().(*kedaTrait)
-       keda.Enabled = &testingTrue
+       keda.Enabled = pointer.Bool(true)
        env := createBasicTestEnvironment(
                &camelv1alpha1.Kamelet{
                        ObjectMeta: metav1.ObjectMeta{
@@ -209,7 +205,7 @@ func TestKameletAutoDetection(t *testing.T) {
 
 func TestKameletBindingAutoDetection(t *testing.T) {
        keda, _ := NewKedaTrait().(*kedaTrait)
-       keda.Enabled = &testingTrue
+       keda.Enabled = pointer.Bool(true)
        logEndpoint := "log:info"
        klb := camelv1alpha1.KameletBinding{
                ObjectMeta: metav1.ObjectMeta{
@@ -322,15 +318,15 @@ func TestKameletBindingAutoDetection(t *testing.T) {
 
 func TestHackReplicas(t *testing.T) {
        keda, _ := NewKedaTrait().(*kedaTrait)
-       keda.Enabled = &testingTrue
-       keda.Auto = &testingFalse
+       keda.Enabled = pointer.Bool(true)
+       keda.Auto = pointer.Bool(false)
        keda.Triggers = append(keda.Triggers, kedaTrigger{
                Type: "custom",
                Metadata: map[string]string{
                        "a": "b",
                },
        })
-       keda.HackControllerReplicas = &testingTrue
+       keda.HackControllerReplicas = pointer.Bool(true)
        env := createBasicTestEnvironment(
                &camelv1.Integration{
                        ObjectMeta: metav1.ObjectMeta{
@@ -356,15 +352,15 @@ func TestHackReplicas(t *testing.T) {
 
 func TestHackKLBReplicas(t *testing.T) {
        keda, _ := NewKedaTrait().(*kedaTrait)
-       keda.Enabled = &testingTrue
-       keda.Auto = &testingFalse
+       keda.Enabled = pointer.Bool(true)
+       keda.Auto = pointer.Bool(false)
        keda.Triggers = append(keda.Triggers, kedaTrigger{
                Type: "custom",
                Metadata: map[string]string{
                        "a": "b",
                },
        })
-       keda.HackControllerReplicas = &testingTrue
+       keda.HackControllerReplicas = pointer.Bool(true)
        env := createBasicTestEnvironment(
                &camelv1alpha1.KameletBinding{
                        ObjectMeta: metav1.ObjectMeta{
@@ -483,19 +479,14 @@ func createBasicTestEnvironment(resources 
...runtime.Object) *trait.Environment
                }
        }
 
+       camelCatalog, _ := camel.DefaultCatalog()
+
        return &trait.Environment{
-               Catalog:     trait.NewCatalog(nil),
-               Ctx:         context.Background(),
-               Client:      fakeClient,
-               Integration: it,
-               CamelCatalog: &camel.RuntimeCatalog{
-                       CamelCatalogSpec: camelv1.CamelCatalogSpec{
-                               Runtime: camelv1.RuntimeSpec{
-                                       Version:  "0.0.1",
-                                       Provider: 
camelv1.RuntimeProviderQuarkus,
-                               },
-                       },
-               },
+               Catalog:               trait.NewCatalog(nil),
+               Ctx:                   context.Background(),
+               Client:                fakeClient,
+               Integration:           it,
+               CamelCatalog:          camelCatalog,
                Platform:              pl,
                Resources:             kubernetes.NewCollection(),
                ApplicationProperties: make(map[string]string),
diff --git a/addons/resume/resume.go b/addons/resume/resume.go
index de590aa65..020c770e5 100644
--- a/addons/resume/resume.go
+++ b/addons/resume/resume.go
@@ -91,7 +91,10 @@ func (r *resumeTrait) Configure(environment 
*trait.Environment) (bool, error) {
                        return false, err
                }
 
-               meta := metadata.ExtractAll(environment.CamelCatalog, sources)
+               meta, err := metadata.ExtractAll(environment.CamelCatalog, 
sources)
+               if err != nil {
+                       return false, err
+               }
 
                for _, endpoint := range meta.FromURIs {
                        log.Infof("Processing component %s", endpoint)
diff --git a/pkg/apis/camel/v1/camelcatalog_types_support.go 
b/pkg/apis/camel/v1/camelcatalog_types_support.go
index 9c0ba615b..0d643bdfb 100644
--- a/pkg/apis/camel/v1/camelcatalog_types_support.go
+++ b/pkg/apis/camel/v1/camelcatalog_types_support.go
@@ -62,6 +62,18 @@ func NewCamelCatalogList() CamelCatalogList {
        }
 }
 
+// GetRuntimeVersion returns the Camel K runtime version of the catalog.
+func (c *CamelCatalogSpec) GetRuntimeVersion() string {
+       return c.Runtime.Version
+}
+
+// HasCapability checks if the given capability is present in the catalog.
+func (c *CamelCatalogSpec) HasCapability(capability string) bool {
+       _, ok := c.Runtime.Capabilities[capability]
+
+       return ok
+}
+
 // GetDependencyID returns a Camel K recognizable maven dependency for the 
artifact
 func (in *CamelArtifact) GetDependencyID() string {
        switch {
diff --git a/pkg/metadata/metadata_dependencies_test.go 
b/pkg/metadata/metadata_dependencies_test.go
index 61593de53..674cebdd4 100644
--- a/pkg/metadata/metadata_dependencies_test.go
+++ b/pkg/metadata/metadata_dependencies_test.go
@@ -21,6 +21,7 @@ import (
        "testing"
 
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/apache/camel-k/pkg/util/camel"
@@ -35,7 +36,6 @@ func TestDependenciesJavaSource(t *testing.T) {
 
                            from("telegram:bots/cippa").to("log:stash");
                            from("timer:tick").to("amqp:queue");
-                           from("ine:xistent").to("amqp:queue");
                                from("twitter-search:{{twitterKeywords}}"
                     + "?delay={{twitterDelayMs}}");
                        `,
@@ -44,10 +44,10 @@ func TestDependenciesJavaSource(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -71,7 +71,6 @@ func TestDependenciesJavaScript(t *testing.T) {
 
                            from('telegram:bots/cippa').to("log:stash");
                            from('timer:tick').to("amqp:queue");
-                           from("ine:xistent").to("amqp:queue");
                            '"'
                    `,
                },
@@ -79,10 +78,10 @@ func TestDependenciesJavaScript(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -105,7 +104,6 @@ func TestDependenciesGroovy(t *testing.T) {
 
                            from('telegram:bots/cippa').to("log:stash");
                            from('timer:tick').to("amqp:queue");
-                           from("ine:xistent").to("amqp:queue");
                                from('twitter-search:{{twitterKeywords}}'
                     + '?delay={{twitterDelayMs}}');
                            '"
@@ -115,10 +113,10 @@ func TestDependenciesGroovy(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -147,10 +145,10 @@ func TestDependencies(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(t,
                []string{
@@ -162,6 +160,27 @@ func TestDependencies(t *testing.T) {
                meta.Dependencies.List())
 }
 
+func TestDependencyInexistent(t *testing.T) {
+       code := v1.SourceSpec{
+               DataSpec: v1.DataSpec{
+                       Name: "Request.java",
+                       Content: `
+                           from("http:test").to("log:end");
+                           from("https:test").to("log:end");
+                           from("twitter-timeline:test").to("mock:end");
+                           from("ine:xistent").to("amqp:queue");
+                   `,
+               },
+               Language: v1.LanguageJavaSource,
+       }
+
+       catalog, err := camel.DefaultCatalog()
+       require.NoError(t, err)
+
+       _, err = Extract(catalog, code)
+       assert.Error(t, err)
+}
+
 func TestDependenciesQuarkus(t *testing.T) {
        code := v1.SourceSpec{
                DataSpec: v1.DataSpec{
@@ -180,11 +199,11 @@ func TestDependenciesQuarkus(t *testing.T) {
        }
 
        catalog, err := camel.QuarkusCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.NotNil(t, catalog)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(t,
                []string{
@@ -212,10 +231,10 @@ func TestJacksonDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -241,10 +260,10 @@ func TestJacksonImplicitDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -276,10 +295,10 @@ func TestLanguageDependencies(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.ElementsMatch(
                t,
                []string{
@@ -311,10 +330,10 @@ func TestLanguageDependenciesTransformExpression(t 
*testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.ElementsMatch(
                t,
                []string{
@@ -342,10 +361,10 @@ func TestCircuitBreakerDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(t,
                []string{
@@ -373,10 +392,10 @@ func TestRestDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -406,10 +425,10 @@ func TestRestWithPathDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t, []string{
@@ -437,10 +456,10 @@ func TestRestConfigurationDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t, []string{
@@ -467,10 +486,10 @@ func TestRestClosureDependencyGroovy(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -498,10 +517,10 @@ func TestRestClosureDependencyKotlin(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -533,10 +552,10 @@ func TestXMLCircuitBreakerDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -573,10 +592,10 @@ func TestXMLRestDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -631,10 +650,10 @@ func TestXMLLanguageDependencies(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.ElementsMatch(
                t,
                []string{
@@ -702,10 +721,10 @@ func TestYAMLRestDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -729,10 +748,10 @@ func TestYAMLCircuitBreakerDependency(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
@@ -753,10 +772,10 @@ func TestYAMLLanguageDependencies(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.ElementsMatch(
                t,
diff --git a/pkg/metadata/metadata_http_test.go 
b/pkg/metadata/metadata_http_test.go
index 15ebacf65..6aecde9fe 100644
--- a/pkg/metadata/metadata_http_test.go
+++ b/pkg/metadata/metadata_http_test.go
@@ -21,6 +21,7 @@ import (
        "testing"
 
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/apache/camel-k/pkg/util/camel"
@@ -33,17 +34,16 @@ func TestHttpJavaSource(t *testing.T) {
                        Content: `
                        from("telegram:bots/cippa").to("log:stash");
                        from("netty-http:uri").to("log:stash");
-                       from("ine:xistent").to("log:stash");
                `,
                },
                Language: v1.LanguageJavaSource,
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.False(t, meta.PassiveEndpoints)
@@ -65,10 +65,10 @@ func TestHttpOnlyJavaSource(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.True(t, meta.PassiveEndpoints)
@@ -87,10 +87,10 @@ func TestHttpOnlyJavaSourceRest(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.True(t, meta.PassiveEndpoints)
@@ -109,10 +109,10 @@ func TestHttpOnlyJavaSourceRest2(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.True(t, meta.PassiveEndpoints)
@@ -124,7 +124,7 @@ func TestNoHttpGroovySource(t *testing.T) {
                        Name: "Request.groovy",
                        Content: `
                        from('direct:bots/cippa').to("log:stash");
-                       from('teelgram:uri').to("log:stash");
+                       from('telegram:uri').to("log:stash");
                        from('seda:path').to("log:stash");
                `,
                },
@@ -132,10 +132,10 @@ func TestNoHttpGroovySource(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.False(t, meta.ExposesHTTPServices)
        assert.False(t, meta.PassiveEndpoints)
@@ -155,10 +155,10 @@ func TestHttpOnlyGroovySource(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.True(t, meta.PassiveEndpoints)
@@ -178,10 +178,10 @@ func TestHttpXMLSource(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.False(t, meta.PassiveEndpoints)
@@ -202,10 +202,10 @@ func TestHttpOnlyXMLSource(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := Extract(catalog, code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.True(t, meta.PassiveEndpoints)
@@ -237,10 +237,10 @@ func TestMultilangHTTPOnlySource(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := ExtractAll(catalog, codes)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.True(t, meta.PassiveEndpoints)
@@ -274,10 +274,10 @@ func TestMultilangHTTPSource(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        meta, err := ExtractAll(catalog, codes)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.True(t, meta.ExposesHTTPServices)
        assert.False(t, meta.PassiveEndpoints)
diff --git a/pkg/metadata/metadata_uri_test.go 
b/pkg/metadata/metadata_uri_test.go
index e046b4827..c22aa7b4a 100644
--- a/pkg/metadata/metadata_uri_test.go
+++ b/pkg/metadata/metadata_uri_test.go
@@ -21,6 +21,7 @@ import (
        "testing"
 
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 
        v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
        "github.com/apache/camel-k/pkg/util/camel"
@@ -47,10 +48,10 @@ func TestJava1(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metadata, err := Extract(catalog, source)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.Contains(t, metadata.FromURIs, "timer:tick")
        assert.Len(t, metadata.FromURIs, 1)
@@ -75,8 +76,8 @@ func TestJava2(t *testing.T) {
                                                                                
        "log:info?skipBodyLineSeparator=false"
 
                                                                       )
-                                                       .toD("uri:2")
-                                                       .toF("uri:%s", "3");
+                                                       .toD("direct:2")
+                                                       .toF("direct:%s", "3");
                                }
                        }
                `,
@@ -85,16 +86,16 @@ func TestJava2(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metadata, err := Extract(catalog, source)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.Contains(t, metadata.FromURIs, "timer:tick")
        assert.Len(t, metadata.FromURIs, 1)
        assert.Contains(t, metadata.ToURIs, 
"log:info?skipBodyLineSeparator=false")
-       assert.Contains(t, metadata.ToURIs, "uri:2")
-       assert.Contains(t, metadata.ToURIs, "uri:%s") // resolution not 
supported yet
+       assert.Contains(t, metadata.ToURIs, "direct:2")
+       assert.Contains(t, metadata.ToURIs, "direct:%s") // resolution not 
supported yet
        assert.Len(t, metadata.ToURIs, 3)
 }
 
@@ -109,26 +110,26 @@ func TestGroovy1(t *testing.T) {
                                .to   
('log:info?skipBodyLineSeparator=false').to(
                                                                                
        'http://url' )
 
-                       from("uri:2")
+                       from("direct:2")
                        .setBody().constant("aa")
-                               .to('uri:3')
+                               .to('direct:3')
                `,
                },
                Language: v1.LanguageGroovy,
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metadata, err := Extract(catalog, source)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.Contains(t, metadata.FromURIs, "timer:tick")
-       assert.Contains(t, metadata.FromURIs, "uri:2")
+       assert.Contains(t, metadata.FromURIs, "direct:2")
        assert.Len(t, metadata.FromURIs, 2)
        assert.Contains(t, metadata.ToURIs, 
"log:info?skipBodyLineSeparator=false")
        assert.Contains(t, metadata.ToURIs, "http://url";)
-       assert.Contains(t, metadata.ToURIs, "uri:3")
+       assert.Contains(t, metadata.ToURIs, "direct:3")
        assert.Len(t, metadata.ToURIs, 3)
 }
 
@@ -139,27 +140,27 @@ func TestGroovy2(t *testing.T) {
                        Content: `
                        rest().get("/")
                                .to   
('log:info?skipBodyLineSeparator=false').to( 'http://url' )
-                                               .toD('dyn:1')
+                                               .toD('seda:1')
                                                .tony('thisisnot:anuri')
-                                               .toD( "dyn:2")
-                                               .toF( "f:%s", "2")
+                                               .toD( "seda:2")
+                                               .toF( "file:%s", "2")
                `,
                },
                Language: v1.LanguageGroovy,
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metadata, err := Extract(catalog, source)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.Empty(t, metadata.FromURIs)
        assert.Contains(t, metadata.ToURIs, 
"log:info?skipBodyLineSeparator=false")
        assert.Contains(t, metadata.ToURIs, "http://url";)
-       assert.Contains(t, metadata.ToURIs, "dyn:1")
-       assert.Contains(t, metadata.ToURIs, "dyn:2")
-       assert.Contains(t, metadata.ToURIs, "f:%s") // resolution not supported 
yet
+       assert.Contains(t, metadata.ToURIs, "seda:1")
+       assert.Contains(t, metadata.ToURIs, "seda:2")
+       assert.Contains(t, metadata.ToURIs, "file:%s") // resolution not 
supported yet
        assert.Len(t, metadata.ToURIs, 5)
 }
 
@@ -185,10 +186,10 @@ func TestXml1(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metadata, err := Extract(catalog, source)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.Contains(t, metadata.FromURIs, "timer:hello?period=3000")
        assert.Len(t, metadata.FromURIs, 1)
@@ -209,30 +210,30 @@ func TestKotlin1(t *testing.T) {
                                .to   
("log:info?skipBodyLineSeparator=false").to(
                                                                                
        "http://url"; )
 
-                       from("uri:2")
+                       from("direct:2")
                        .setBody().constant("aa")
-                               .to("uri:3")
-                               .toD("uri:4")
-                               .toF("uri:%s", 5)
+                               .to("direct:3")
+                               .toD("direct:4")
+                               .toF("direct:%s", 5)
                `,
                },
                Language: v1.LanguageKotlin,
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metadata, err := Extract(catalog, source)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.Contains(t, metadata.FromURIs, "timer:tick")
-       assert.Contains(t, metadata.FromURIs, "uri:2")
+       assert.Contains(t, metadata.FromURIs, "direct:2")
        assert.Len(t, metadata.FromURIs, 2)
        assert.Contains(t, metadata.ToURIs, 
"log:info?skipBodyLineSeparator=false")
        assert.Contains(t, metadata.ToURIs, "http://url";)
-       assert.Contains(t, metadata.ToURIs, "uri:3")
-       assert.Contains(t, metadata.ToURIs, "uri:4")
-       assert.Contains(t, metadata.ToURIs, "uri:%s") // resolution not 
supported yet
+       assert.Contains(t, metadata.ToURIs, "direct:3")
+       assert.Contains(t, metadata.ToURIs, "direct:4")
+       assert.Contains(t, metadata.ToURIs, "direct:%s") // resolution not 
supported yet
        assert.Len(t, metadata.ToURIs, 5)
 }
 
@@ -244,24 +245,24 @@ func TestJavascript1(t *testing.T) {
 
                        rest().get("/")
                                .to   
('log:info?skipBodyLineSeparator=false').to( 'http://url' )
-                               .toD("uri:2")
-                               .toF("uri:%s", "3")
+                               .toD("direct:2")
+                               .toF("direct:%s", "3")
                `,
                },
                Language: v1.LanguageJavaScript,
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metadata, err := Extract(catalog, source)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.Empty(t, metadata.FromURIs)
        assert.Contains(t, metadata.ToURIs, 
"log:info?skipBodyLineSeparator=false")
        assert.Contains(t, metadata.ToURIs, "http://url";)
-       assert.Contains(t, metadata.ToURIs, "uri:2")
-       assert.Contains(t, metadata.ToURIs, "uri:%s") // resolution not 
supported yet
+       assert.Contains(t, metadata.ToURIs, "direct:2")
+       assert.Contains(t, metadata.ToURIs, "direct:%s") // resolution not 
supported yet
        assert.Len(t, metadata.ToURIs, 4)
 }
 
@@ -289,10 +290,10 @@ func TestJYaml(t *testing.T) {
        }
 
        catalog, err := camel.DefaultCatalog()
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metadata, err := Extract(catalog, source)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        assert.NotEmpty(t, metadata.FromURIs)
        assert.Contains(t, metadata.FromURIs, "timer:tick")
diff --git a/pkg/trait/kamelets.go b/pkg/trait/kamelets.go
index e71f78864..d7bafcc56 100644
--- a/pkg/trait/kamelets.go
+++ b/pkg/trait/kamelets.go
@@ -147,7 +147,7 @@ func (t *kameletsTrait) collectKamelets(e *Environment) 
(map[string]*v1alpha1.Ka
        sort.Strings(missingKamelets)
 
        if len(missingKamelets) > 0 {
-               message := fmt.Sprintf("kamelets %s found, %s not found in 
repositories: %s",
+               message := fmt.Sprintf("kamelets [%s] found, [%s] not found in 
repositories: %s",
                        strings.Join(availableKamelets, ","),
                        strings.Join(missingKamelets, ","),
                        repo.String())
@@ -166,7 +166,7 @@ func (t *kameletsTrait) collectKamelets(e *Environment) 
(map[string]*v1alpha1.Ka
                v1.IntegrationConditionKameletsAvailable,
                corev1.ConditionTrue,
                v1.IntegrationConditionKameletsAvailableReason,
-               fmt.Sprintf("kamelets %s found in repositories: %s", 
strings.Join(availableKamelets, ","), repo.String()),
+               fmt.Sprintf("kamelets [%s] found in repositories: %s", 
strings.Join(availableKamelets, ","), repo.String()),
        )
 
        return kamelets, nil
diff --git a/pkg/trait/kamelets_test.go b/pkg/trait/kamelets_test.go
index 9a7737bd6..906fb6498 100644
--- a/pkg/trait/kamelets_test.go
+++ b/pkg/trait/kamelets_test.go
@@ -27,6 +27,7 @@ import (
        "github.com/apache/camel-k/pkg/util/kubernetes"
        "github.com/apache/camel-k/pkg/util/test"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/runtime"
@@ -40,7 +41,7 @@ func TestConfigurationNoKameletsUsed(t *testing.T) {
     - to: log:info
 `)
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.False(t, enabled)
        assert.Equal(t, "", trait.List)
 }
@@ -60,7 +61,7 @@ func TestConfigurationWithKamelets(t *testing.T) {
     - to: kamelet://complex-.-.-1c/b
 `)
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
        assert.Equal(t, []string{"c0", "c1", "c2", "complex-.-.-1a", 
"complex-.-.-1b", "complex-.-.-1c"}, trait.getKameletKeys())
        assert.Equal(t, []configurationKey{
@@ -100,12 +101,12 @@ func TestKameletLookup(t *testing.T) {
                Status: v1alpha1.KameletStatus{Phase: 
v1alpha1.KameletPhaseReady},
        })
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
        assert.Equal(t, []string{"timer"}, trait.getKameletKeys())
 
        err = trait.Apply(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        cm := environment.Resources.GetConfigMap(func(_ *corev1.ConfigMap) bool 
{ return true })
        assert.NotNil(t, cm)
        assert.Equal(t, "it-kamelet-timer-template", cm.Name)
@@ -149,12 +150,12 @@ func TestKameletSecondarySourcesLookup(t *testing.T) {
                Status: v1alpha1.KameletStatus{Phase: 
v1alpha1.KameletPhaseReady},
        })
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
        assert.Equal(t, []string{"timer"}, trait.getKameletKeys())
 
        err = trait.Apply(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        cmFlow := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-template" })
        assert.NotNil(t, cmFlow)
        cmRes := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-000" })
@@ -200,12 +201,12 @@ func TestNonYAMLKameletLookup(t *testing.T) {
                Status: v1alpha1.KameletStatus{Phase: 
v1alpha1.KameletPhaseReady},
        })
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
        assert.Equal(t, []string{"timer"}, trait.getKameletKeys())
 
        err = trait.Apply(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        cm := environment.Resources.GetConfigMap(func(_ *corev1.ConfigMap) bool 
{ return true })
        assert.NotNil(t, cm)
        assert.Equal(t, "it-kamelet-timer-000", cm.Name)
@@ -276,12 +277,12 @@ func TestMultipleKamelets(t *testing.T) {
                Status: v1alpha1.KameletStatus{Phase: 
v1alpha1.KameletPhaseReady},
        })
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
        assert.Equal(t, []string{"logger", "timer"}, trait.getKameletKeys())
 
        err = trait.Apply(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        cmFlow := environment.Resources.GetConfigMap(func(c *corev1.ConfigMap) 
bool { return c.Name == "it-kamelet-timer-template" })
        assert.NotNil(t, cmFlow)
@@ -363,13 +364,13 @@ func TestKameletConfigLookup(t *testing.T) {
                },
        })
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
        assert.Equal(t, []string{"timer"}, trait.getKameletKeys())
        assert.Equal(t, []configurationKey{newConfigurationKey("timer", "")}, 
trait.getConfigurationKeys())
 
        err = trait.Apply(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Len(t, environment.Integration.Status.Configuration, 2)
        assert.Contains(t, environment.Integration.Status.Configuration, 
v1.ConfigurationSpec{Type: "secret", Value: "my-secret"})
        assert.NotContains(t, environment.Integration.Status.Configuration, 
v1.ConfigurationSpec{Type: "secret", Value: "my-secret2"})
@@ -427,7 +428,7 @@ func TestKameletNamedConfigLookup(t *testing.T) {
                },
        })
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
        assert.Equal(t, []string{"timer"}, trait.getKameletKeys())
        assert.Equal(t, []configurationKey{
@@ -436,7 +437,7 @@ func TestKameletNamedConfigLookup(t *testing.T) {
        }, trait.getConfigurationKeys())
 
        err = trait.Apply(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Len(t, environment.Integration.Status.Configuration, 2)
        assert.Contains(t, environment.Integration.Status.Configuration, 
v1.ConfigurationSpec{Type: "secret", Value: "my-secret"})
        assert.Contains(t, environment.Integration.Status.Configuration, 
v1.ConfigurationSpec{Type: "secret", Value: "my-secret2"})
@@ -468,7 +469,7 @@ func TestKameletConditionFalse(t *testing.T) {
                })
 
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
 
        err = trait.Apply(environment)
@@ -478,8 +479,8 @@ func TestKameletConditionFalse(t *testing.T) {
        cond := 
environment.Integration.Status.GetCondition(v1.IntegrationConditionKameletsAvailable)
        assert.Equal(t, corev1.ConditionFalse, cond.Status)
        assert.Equal(t, v1.IntegrationConditionKameletsAvailableReason, 
cond.Reason)
-       assert.Contains(t, cond.Message, "timer found")
-       assert.Contains(t, cond.Message, "none not found")
+       assert.Contains(t, cond.Message, "[timer] found")
+       assert.Contains(t, cond.Message, "[none] not found")
 }
 
 func TestKameletConditionTrue(t *testing.T) {
@@ -521,17 +522,17 @@ func TestKameletConditionTrue(t *testing.T) {
                })
 
        enabled, err := trait.Configure(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, enabled)
 
        err = trait.Apply(environment)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Len(t, environment.Integration.Status.Conditions, 1)
 
        cond := 
environment.Integration.Status.GetCondition(v1.IntegrationConditionKameletsAvailable)
        assert.Equal(t, corev1.ConditionTrue, cond.Status)
        assert.Equal(t, v1.IntegrationConditionKameletsAvailableReason, 
cond.Reason)
-       assert.Contains(t, cond.Message, "none,timer found")
+       assert.Contains(t, cond.Message, "[none,timer] found")
 }
 
 func createKameletsTestEnvironment(flow string, objects ...runtime.Object) 
(*kameletsTrait, *Environment) {
diff --git a/pkg/trait/knative_service_test.go 
b/pkg/trait/knative_service_test.go
index 15f69a1aa..4719beaa2 100644
--- a/pkg/trait/knative_service_test.go
+++ b/pkg/trait/knative_service_test.go
@@ -21,6 +21,7 @@ import (
        "testing"
 
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -44,12 +45,12 @@ const (
 
 func TestKnativeService(t *testing.T) {
        catalog, err := camel.DefaultCatalog()
-       assert.Nil(t, err)
+       require.NoError(t, err)
 
        traitCatalog := NewCatalog(nil)
 
-       compressedRoute, err := 
gzip.CompressBase64([]byte(`from("undertow:test").log("hello")`))
-       assert.NoError(t, err)
+       compressedRoute, err := 
gzip.CompressBase64([]byte(`from("platform-http:test").log("hello")`))
+       require.NoError(t, err)
 
        environment := Environment{
                CamelCatalog: catalog,
@@ -124,7 +125,7 @@ func TestKnativeService(t *testing.T) {
 
        err = traitCatalog.apply(&environment)
 
-       assert.Nil(t, err)
+       require.NoError(t, err)
        assert.NotEmpty(t, environment.ExecutedTraits)
        assert.NotNil(t, environment.GetTrait("knative"))
        assert.NotNil(t, envvar.Get(environment.EnvVars, 
"CAMEL_KNATIVE_CONFIGURATION"))
@@ -191,7 +192,7 @@ func TestKnativeService(t *testing.T) {
 
 func TestKnativeServiceWithCustomContainerName(t *testing.T) {
        catalog, err := camel.DefaultCatalog()
-       assert.Nil(t, err)
+       require.NoError(t, err)
 
        traitCatalog := NewCatalog(nil)
 
@@ -251,7 +252,7 @@ func TestKnativeServiceWithCustomContainerName(t 
*testing.T) {
 
        err = traitCatalog.apply(&environment)
 
-       assert.Nil(t, err)
+       require.NoError(t, err)
        assert.NotEmpty(t, environment.ExecutedTraits)
        assert.NotNil(t, environment.GetTrait("knative-service"))
        assert.NotNil(t, environment.GetTrait("container"))
@@ -272,7 +273,7 @@ func TestKnativeServiceWithCustomContainerName(t 
*testing.T) {
 
 func TestKnativeServiceWithResr(t *testing.T) {
        catalog, err := camel.DefaultCatalog()
-       assert.Nil(t, err)
+       require.NoError(t, err)
 
        traitCatalog := NewCatalog(nil)
 
@@ -333,7 +334,7 @@ func TestKnativeServiceWithResr(t *testing.T) {
 
        err = traitCatalog.apply(&environment)
 
-       assert.Nil(t, err)
+       require.NoError(t, err)
        assert.NotEmpty(t, environment.ExecutedTraits)
        assert.NotNil(t, environment.GetTrait("knative"))
 
@@ -374,7 +375,7 @@ func createKnativeServiceTestEnvironment(t *testing.T, 
trait *traitv1.KnativeSer
        t.Helper()
 
        catalog, err := camel.DefaultCatalog()
-       assert.Nil(t, err)
+       require.NoError(t, err)
 
        traitCatalog := NewCatalog(nil)
 
@@ -437,7 +438,7 @@ func createKnativeServiceTestEnvironment(t *testing.T, 
trait *traitv1.KnativeSer
 
        err = traitCatalog.apply(environment)
 
-       assert.Nil(t, err)
+       require.NoError(t, err)
 
        return environment
 }
diff --git a/pkg/trait/mount_test.go b/pkg/trait/mount_test.go
index 5daa8db32..1e3953c22 100644
--- a/pkg/trait/mount_test.go
+++ b/pkg/trait/mount_test.go
@@ -22,6 +22,7 @@ import (
        "testing"
 
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 
        appsv1 "k8s.io/api/apps/v1"
        corev1 "k8s.io/api/core/v1"
@@ -44,7 +45,7 @@ func TestMountVolumesEmpty(t *testing.T) {
 
        err := traitCatalog.apply(environment)
 
-       assert.Nil(t, err)
+       require.NoError(t, err)
        assert.NotEmpty(t, environment.ExecutedTraits)
        assert.NotNil(t, environment.GetTrait("mount"))
 
@@ -66,7 +67,7 @@ func TestMountVolumesIntegrationPhaseDeploying(t *testing.T) {
 
        err := traitCatalog.apply(environment)
 
-       assert.Nil(t, err)
+       require.NoError(t, err)
        assert.NotEmpty(t, environment.ExecutedTraits)
        assert.NotNil(t, environment.GetTrait("mount"))
 
@@ -114,7 +115,7 @@ func TestMountVolumesIntegrationPhaseInitialization(t 
*testing.T) {
 
        err := traitCatalog.apply(environment)
 
-       assert.Nil(t, err)
+       require.NoError(t, err)
        assert.NotEmpty(t, environment.ExecutedTraits)
        assert.Nil(t, environment.GetTrait("mount"))
 
@@ -128,7 +129,7 @@ func getNominalEnv(t *testing.T, traitCatalog *Catalog) 
*Environment {
        t.Helper()
        fakeClient, _ := test.NewFakeClient()
        catalog, _ := camel.DefaultCatalog()
-       compressedRoute, _ := 
gzip.CompressBase64([]byte(`from("undertow:test").log("hello")`))
+       compressedRoute, _ := 
gzip.CompressBase64([]byte(`from("platform-http:test").log("hello")`))
 
        return &Environment{
                CamelCatalog: catalog,
diff --git a/pkg/util/source/inspector.go b/pkg/util/source/inspector.go
index be2b86ddc..b8334bae6 100644
--- a/pkg/util/source/inspector.go
+++ b/pkg/util/source/inspector.go
@@ -18,6 +18,7 @@ limitations under the License.
 package source
 
 import (
+       "fmt"
        "regexp"
        "strings"
 
@@ -161,12 +162,13 @@ var (
        }
 )
 
-// Inspector --.
+// Inspector is the common interface for language specific inspector 
implementations.
 type Inspector interface {
        Extract(v1.SourceSpec, *Metadata) error
 }
 
-// InspectorForLanguage --.
+// InspectorForLanguage is the factory function to return a new inspector for 
the given language
+// with the catalog.
 func InspectorForLanguage(catalog *camel.RuntimeCatalog, language v1.Language) 
Inspector {
        switch language {
        case v1.LanguageJavaSource:
@@ -217,13 +219,40 @@ func (i baseInspector) Extract(v1.SourceSpec, *Metadata) 
error {
        return nil
 }
 
-// discoverDependencies returns a list of dependencies required by the given 
source code.
-func (i *baseInspector) discoverCapabilities(source v1.SourceSpec, meta 
*Metadata) {
+func (i *baseInspector) extract(source v1.SourceSpec, meta *Metadata,
+       from, to, kameletEips []string, hasRest bool) error {
+       meta.FromURIs = append(meta.FromURIs, from...)
+       meta.ToURIs = append(meta.ToURIs, to...)
+
+       for _, k := range kameletEips {
+               AddKamelet(meta, "kamelet:"+k)
+       }
+
+       if err := i.discoverCapabilities(source, meta); err != nil {
+               return err
+       }
+       if err := i.discoverDependencies(source, meta); err != nil {
+               return err
+       }
+       i.discoverKamelets(meta)
+
+       if hasRest {
+               meta.AddRequiredCapability(v1.CapabilityRest)
+       }
+
+       meta.ExposesHTTPServices = hasRest || i.containsHTTPURIs(meta.FromURIs)
+       meta.PassiveEndpoints = i.hasOnlyPassiveEndpoints(meta.FromURIs)
+
+       return nil
+}
+
+// discoverCapabilities returns a list of dependencies required by the given 
source code.
+func (i *baseInspector) discoverCapabilities(source v1.SourceSpec, meta 
*Metadata) error {
        uris := util.StringSliceJoin(meta.FromURIs, meta.ToURIs)
 
        for _, uri := range uris {
                if i.getURIPrefix(uri) == "platform-http" {
-                       meta.RequiredCapabilities.Add(v1.CapabilityPlatformHTTP)
+                       meta.AddRequiredCapability(v1.CapabilityPlatformHTTP)
                }
        }
 
@@ -233,34 +262,37 @@ func (i *baseInspector) discoverCapabilities(source 
v1.SourceSpec, meta *Metadat
                }
 
                for _, capability := range capabilities {
-                       meta.RequiredCapabilities.Add(capability)
+                       meta.AddRequiredCapability(capability)
                }
        }
+
+       // validate capabilities
+       var err error
+       meta.RequiredCapabilities.Each(func(capability string) bool {
+               if !i.catalog.HasCapability(capability) {
+                       err = fmt.Errorf("capability %s not supported in camel 
catalog runtime version %s",
+                               capability, i.catalog.GetRuntimeVersion())
+                       return false
+               }
+               return true
+       })
+
+       return err
 }
 
 // discoverDependencies returns a list of dependencies required by the given 
source code.
-func (i *baseInspector) discoverDependencies(source v1.SourceSpec, meta 
*Metadata) {
+func (i *baseInspector) discoverDependencies(source v1.SourceSpec, meta 
*Metadata) error {
        for _, uri := range meta.FromURIs {
-               candidateComp, scheme := i.catalog.DecodeComponent(uri)
-               if candidateComp != nil {
-                       i.addDependency(candidateComp.GetDependencyID(), meta)
-                       if scheme != nil {
-                               for _, dep := range 
candidateComp.GetConsumerDependencyIDs(scheme.ID) {
-                                       i.addDependency(dep, meta)
-                               }
-                       }
+               // consumer
+               if err := i.addDependencies(uri, meta, true); err != nil {
+                       return err
                }
        }
 
        for _, uri := range meta.ToURIs {
-               candidateComp, scheme := i.catalog.DecodeComponent(uri)
-               if candidateComp != nil {
-                       i.addDependency(candidateComp.GetDependencyID(), meta)
-                       if scheme != nil {
-                               for _, dep := range 
candidateComp.GetProducerDependencyIDs(scheme.ID) {
-                                       i.addDependency(dep, meta)
-                               }
-                       }
+               // producer
+               if err := i.addDependencies(uri, meta, false); err != nil {
+                       return err
                }
        }
 
@@ -270,14 +302,14 @@ func (i *baseInspector) discoverDependencies(source 
v1.SourceSpec, meta *Metadat
                }
 
                for _, dep := range supplier(i.catalog) {
-                       i.addDependency(dep, meta)
+                       meta.AddDependency(dep)
                }
        }
 
        for _, match := range 
languageRegexp.FindAllStringSubmatch(source.Content, -1) {
                if len(match) > 1 {
                        if dependency, ok := 
i.catalog.GetLanguageDependency(match[1]); ok {
-                               i.addDependency(dependency, meta)
+                               meta.AddDependency(dependency)
                        }
                }
        }
@@ -285,15 +317,16 @@ func (i *baseInspector) discoverDependencies(source 
v1.SourceSpec, meta *Metadat
        for _, match := range 
camelTypeRegexp.FindAllStringSubmatch(source.Content, -1) {
                if len(match) > 1 {
                        if dependency, ok := 
i.catalog.GetJavaTypeDependency(match[1]); ok {
-                               i.addDependency(dependency, meta)
+                               meta.AddDependency(dependency)
                        }
                }
        }
+
+       return nil
 }
 
-// discoverDependencies inspects endpoints and extract kamelets
-// nolint: unparam
-func (i *baseInspector) discoverKamelets(source v1.SourceSpec, meta *Metadata) 
{
+// discoverKamelets inspects endpoints and extract kamelets.
+func (i *baseInspector) discoverKamelets(meta *Metadata) {
        for _, uri := range meta.FromURIs {
                AddKamelet(meta, uri)
        }
@@ -302,8 +335,25 @@ func (i *baseInspector) discoverKamelets(source 
v1.SourceSpec, meta *Metadata) {
        }
 }
 
-func (i *baseInspector) addDependency(dependency string, meta *Metadata) {
-       meta.Dependencies.Add(dependency)
+func (i *baseInspector) addDependencies(uri string, meta *Metadata, consumer 
bool) error {
+       candidateComp, scheme := i.catalog.DecodeComponent(uri)
+       if candidateComp == nil || scheme == nil {
+               return fmt.Errorf("component not found for uri %q in camel 
catalog runtime version %s",
+                       uri, i.catalog.GetRuntimeVersion())
+       }
+
+       meta.AddDependency(candidateComp.GetDependencyID())
+       var deps []string
+       if consumer {
+               deps = candidateComp.GetConsumerDependencyIDs(scheme.ID)
+       } else {
+               deps = candidateComp.GetProducerDependencyIDs(scheme.ID)
+       }
+       for _, dep := range deps {
+               meta.AddDependency(dep)
+       }
+
+       return nil
 }
 
 // hasOnlyPassiveEndpoints returns true if the source has no endpoint that 
needs to remain always active.
diff --git a/pkg/util/source/inspector_groovy.go 
b/pkg/util/source/inspector_groovy.go
index 686814084..210ee99b4 100644
--- a/pkg/util/source/inspector_groovy.go
+++ b/pkg/util/source/inspector_groovy.go
@@ -45,30 +45,12 @@ func (i GroovyInspector) Extract(source v1.SourceSpec, meta 
*Metadata) error {
                singleQuotedWireTap,
                doubleQuotedWireTap,
        )
-
-       meta.FromURIs = append(meta.FromURIs, from...)
-       meta.ToURIs = append(meta.ToURIs, to...)
-
        kameletEips := util.FindAllDistinctStringSubmatch(
                source.Content,
                singleQuotedKameletEip,
                doubleQuotedKameletEip)
 
-       for _, k := range kameletEips {
-               AddKamelet(meta, "kamelet:"+k)
-       }
-
-       i.discoverCapabilities(source, meta)
-       i.discoverDependencies(source, meta)
-       i.discoverKamelets(source, meta)
-
        hasRest := restRegexp.MatchString(source.Content) || 
restClosureRegexp.MatchString(source.Content)
-       if hasRest {
-               meta.RequiredCapabilities.Add(v1.CapabilityRest)
-       }
-
-       meta.ExposesHTTPServices = hasRest || i.containsHTTPURIs(meta.FromURIs)
-       meta.PassiveEndpoints = i.hasOnlyPassiveEndpoints(meta.FromURIs)
 
-       return nil
+       return i.extract(source, meta, from, to, kameletEips, hasRest)
 }
diff --git a/pkg/util/source/inspector_java_script.go 
b/pkg/util/source/inspector_java_script.go
index ebcbe37bb..d6d74c331 100644
--- a/pkg/util/source/inspector_java_script.go
+++ b/pkg/util/source/inspector_java_script.go
@@ -45,30 +45,12 @@ func (i JavaScriptInspector) Extract(source v1.SourceSpec, 
meta *Metadata) error
                singleQuotedWireTap,
                doubleQuotedWireTap,
        )
-
-       meta.FromURIs = append(meta.FromURIs, from...)
-       meta.ToURIs = append(meta.ToURIs, to...)
-
        kameletEips := util.FindAllDistinctStringSubmatch(
                source.Content,
                singleQuotedKameletEip,
                doubleQuotedKameletEip)
 
-       for _, k := range kameletEips {
-               AddKamelet(meta, "kamelet:"+k)
-       }
-
-       i.discoverCapabilities(source, meta)
-       i.discoverDependencies(source, meta)
-       i.discoverKamelets(source, meta)
-
        hasRest := restRegexp.MatchString(source.Content)
-       if hasRest {
-               meta.RequiredCapabilities.Add(v1.CapabilityRest)
-       }
-
-       meta.ExposesHTTPServices = hasRest || i.containsHTTPURIs(meta.FromURIs)
-       meta.PassiveEndpoints = i.hasOnlyPassiveEndpoints(meta.FromURIs)
 
-       return nil
+       return i.extract(source, meta, from, to, kameletEips, hasRest)
 }
diff --git a/pkg/util/source/inspector_java_source.go 
b/pkg/util/source/inspector_java_source.go
index 00a9f391f..6fd6ee59d 100644
--- a/pkg/util/source/inspector_java_source.go
+++ b/pkg/util/source/inspector_java_source.go
@@ -39,30 +39,12 @@ func (i JavaSourceInspector) Extract(source v1.SourceSpec, 
meta *Metadata) error
                doubleQuotedToF,
                doubleQuotedWireTap,
        )
-
-       meta.FromURIs = append(meta.FromURIs, from...)
-       meta.ToURIs = append(meta.ToURIs, to...)
-
        kameletEips := util.FindAllDistinctStringSubmatch(
                source.Content,
                singleQuotedKameletEip,
                doubleQuotedKameletEip)
 
-       for _, k := range kameletEips {
-               AddKamelet(meta, "kamelet:"+k)
-       }
-
-       i.discoverCapabilities(source, meta)
-       i.discoverDependencies(source, meta)
-       i.discoverKamelets(source, meta)
-
        hasRest := restRegexp.MatchString(source.Content)
-       if hasRest {
-               meta.RequiredCapabilities.Add(v1.CapabilityRest)
-       }
-
-       meta.ExposesHTTPServices = hasRest || i.containsHTTPURIs(meta.FromURIs)
-       meta.PassiveEndpoints = i.hasOnlyPassiveEndpoints(meta.FromURIs)
 
-       return nil
+       return i.extract(source, meta, from, to, kameletEips, hasRest)
 }
diff --git a/pkg/util/source/inspector_kotlin.go 
b/pkg/util/source/inspector_kotlin.go
index 753d0dbbf..e3f4a8d75 100644
--- a/pkg/util/source/inspector_kotlin.go
+++ b/pkg/util/source/inspector_kotlin.go
@@ -39,30 +39,12 @@ func (i KotlinInspector) Extract(source v1.SourceSpec, meta 
*Metadata) error {
                doubleQuotedToF,
                doubleQuotedWireTap,
        )
-
-       meta.FromURIs = append(meta.FromURIs, from...)
-       meta.ToURIs = append(meta.ToURIs, to...)
-
        kameletEips := util.FindAllDistinctStringSubmatch(
                source.Content,
                singleQuotedKameletEip,
                doubleQuotedKameletEip)
 
-       for _, k := range kameletEips {
-               AddKamelet(meta, "kamelet:"+k)
-       }
-
-       i.discoverCapabilities(source, meta)
-       i.discoverDependencies(source, meta)
-       i.discoverKamelets(source, meta)
-
        hasRest := restRegexp.MatchString(source.Content) || 
restClosureRegexp.MatchString(source.Content)
-       if hasRest {
-               meta.RequiredCapabilities.Add(v1.CapabilityRest)
-       }
-
-       meta.ExposesHTTPServices = hasRest || i.containsHTTPURIs(meta.FromURIs)
-       meta.PassiveEndpoints = i.hasOnlyPassiveEndpoints(meta.FromURIs)
 
-       return nil
+       return i.extract(source, meta, from, to, kameletEips, hasRest)
 }
diff --git a/pkg/util/source/inspector_xml.go b/pkg/util/source/inspector_xml.go
index 51baaee24..3e55eb3b9 100644
--- a/pkg/util/source/inspector_xml.go
+++ b/pkg/util/source/inspector_xml.go
@@ -52,7 +52,7 @@ func (i XMLInspector) Extract(source v1.SourceSpec, meta 
*Metadata) error {
                                for _, a := range se.Attr {
                                        if a.Name.Local == "language" {
                                                if dependency, ok := 
i.catalog.GetLanguageDependency(a.Value); ok {
-                                                       
i.addDependency(dependency, meta)
+                                                       
meta.AddDependency(dependency)
                                                }
                                        }
                                }
@@ -77,14 +77,18 @@ func (i XMLInspector) Extract(source v1.SourceSpec, meta 
*Metadata) error {
                        }
 
                        if dependency, ok := 
i.catalog.GetLanguageDependency(se.Name.Local); ok {
-                               i.addDependency(dependency, meta)
+                               meta.AddDependency(dependency)
                        }
                }
        }
 
-       i.discoverCapabilities(source, meta)
-       i.discoverDependencies(source, meta)
-       i.discoverKamelets(source, meta)
+       if err := i.discoverCapabilities(source, meta); err != nil {
+               return err
+       }
+       if err := i.discoverDependencies(source, meta); err != nil {
+               return err
+       }
+       i.discoverKamelets(meta)
 
        meta.ExposesHTTPServices = meta.ExposesHTTPServices || 
i.containsHTTPURIs(meta.FromURIs)
        meta.PassiveEndpoints = i.hasOnlyPassiveEndpoints(meta.FromURIs)
diff --git a/pkg/util/source/inspector_yaml.go 
b/pkg/util/source/inspector_yaml.go
index a28ac260e..e672f763d 100644
--- a/pkg/util/source/inspector_yaml.go
+++ b/pkg/util/source/inspector_yaml.go
@@ -48,9 +48,13 @@ func (i YAMLInspector) Extract(source v1.SourceSpec, meta 
*Metadata) error {
                }
        }
 
-       i.discoverCapabilities(source, meta)
-       i.discoverDependencies(source, meta)
-       i.discoverKamelets(source, meta)
+       if err := i.discoverCapabilities(source, meta); err != nil {
+               return err
+       }
+       if err := i.discoverDependencies(source, meta); err != nil {
+               return err
+       }
+       i.discoverKamelets(meta)
 
        meta.ExposesHTTPServices = meta.ExposesHTTPServices || 
i.containsHTTPURIs(meta.FromURIs)
        meta.PassiveEndpoints = i.hasOnlyPassiveEndpoints(meta.FromURIs)
@@ -77,7 +81,7 @@ func (i YAMLInspector) parseStep(key string, content 
interface{}, meta *Metadata
                                        }
                                }
                                if dfDep := 
i.catalog.GetArtifactByDataFormat(dataFormatID); dfDep != nil {
-                                       
i.addDependency(dfDep.GetDependencyID(), meta)
+                                       
meta.AddDependency(dfDep.GetDependencyID())
                                }
                        }
                }
@@ -102,7 +106,7 @@ func (i YAMLInspector) parseStep(key string, content 
interface{}, meta *Metadata
 
                        if s, ok := k.(string); ok {
                                if dependency, ok := 
i.catalog.GetLanguageDependency(s); ok {
-                                       i.addDependency(dependency, meta)
+                                       meta.AddDependency(dependency)
                                }
                        }
 
@@ -133,7 +137,7 @@ func (i YAMLInspector) parseStep(key string, content 
interface{}, meta *Metadata
                        case "language":
                                if s, ok := v.(string); ok {
                                        if dependency, ok := 
i.catalog.GetLanguageDependency(s); ok {
-                                               i.addDependency(dependency, 
meta)
+                                               meta.AddDependency(dependency)
                                        }
                                } else if m, ok := 
v.(map[interface{}]interface{}); ok {
                                        if err := i.parseStep("language", m, 
meta); err != nil {
diff --git a/pkg/util/source/inspector_kamelet.go b/pkg/util/source/kamelet.go
similarity index 100%
rename from pkg/util/source/inspector_kamelet.go
rename to pkg/util/source/kamelet.go
diff --git a/pkg/util/source/types.go b/pkg/util/source/types.go
index 76ff78917..3c8304d63 100644
--- a/pkg/util/source/types.go
+++ b/pkg/util/source/types.go
@@ -17,9 +17,11 @@ limitations under the License.
 
 package source
 
-import "github.com/scylladb/go-set/strset"
+import (
+       "github.com/scylladb/go-set/strset"
+)
 
-// Metadata --.
+// Metadata represents metadata for Integration source.
 type Metadata struct {
        // All starting URIs of defined routes
        FromURIs []string
@@ -41,7 +43,7 @@ type Metadata struct {
        Kamelets []string
 }
 
-// NewMetadata --.
+// NewMetadata creates a new metadata.
 func NewMetadata() Metadata {
        return Metadata{
                FromURIs:             make([]string, 0),
@@ -50,3 +52,11 @@ func NewMetadata() Metadata {
                RequiredCapabilities: strset.New(),
        }
 }
+
+func (m *Metadata) AddRequiredCapability(capability string) {
+       m.RequiredCapabilities.Add(capability)
+}
+
+func (m *Metadata) AddDependency(dependency string) {
+       m.Dependencies.Add(dependency)
+}

Reply via email to