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) +}
