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

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


The following commit(s) were added to refs/heads/main by this push:
     new d5ea766   fix #2733 : Native support for kamelet.yaml discovery.
d5ea766 is described below

commit d5ea76670cb0283b9e59ecc69e5a9b770415ae43
Author: Andrea Tarocchi <[email protected]>
AuthorDate: Wed Jun 16 16:59:10 2021 +0200

     fix #2733 : Native support for kamelet.yaml discovery.
---
 .../ROOT/pages/reference/extensions/kamelet.adoc   | 41 +++++++++++
 extensions/kamelet/deployment/pom.xml              |  4 ++
 .../kamelet/deployment/KameletProcessor.java       | 81 +++++++++++++++++++++-
 ...{KameletProcessor.java => KameletResolver.java} | 16 +++--
 ...rocessor.java => KameletResolverBuildItem.java} | 20 ++++--
 extensions/kamelet/runtime/src/main/doc/usage.adoc | 18 +++++
 .../component/kamelet/KameletConfiguration.java}   | 25 ++++---
 .../quarkus/component/kamelet/KameletRecorder.java | 45 ++++++++++++
 integration-tests/kamelet/pom.xml                  | 17 +++++
 .../component/kamelet/it/KameletResource.java      | 27 ++++++--
 .../component/kamelet/it/KameletRoutes.java        | 25 -------
 .../src/main/resources/application.properties      |  5 ++
 ...iscovery.kamelet.yaml => injector.kamelet.yaml} | 35 +++++++++-
 .../main/resources/kamelets/logger.kamelet.yaml    | 57 +++++++++++++++
 .../quarkus/component/kamelet/it/KameletTest.java  | 23 +++---
 15 files changed, 375 insertions(+), 64 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/kamelet.adoc 
b/docs/modules/ROOT/pages/reference/extensions/kamelet.adoc
index 8ae41ee..c335a61 100644
--- a/docs/modules/ROOT/pages/reference/extensions/kamelet.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/kamelet.adoc
@@ -37,3 +37,44 @@ Or add the coordinates to your existing project:
 ----
 
 Check the xref:user-guide/index.adoc[User guide] for more information about 
writing Camel Quarkus applications.
+
+== Usage
+
+=== Pre-load Kamelets at build-time
+
+This extension allows to pre-load a set of Kamelets at build time using the 
`quarkus.camel.kamelet.identifiers` property.
+
+=== Using the Kamelet Catalog
+
+A set of pre-made Kamelets can be found on the 
https://camel.apache.org/camel-kamelets/latest[Kamelet Catalog].
+To use the Kamelet from the catalog you need to copy their yaml definition 
(that you can find https://github.com/apache/camel-kamelets/[in the 
camel-kamelet repo]) on your project in the classpath. Alternatively you can 
add the `camel-quarkus-kamelets-catalog` artifact to your `pom.xml`:
+
+[source,xml]
+----
+<dependency>
+    <groupId>org.apache.camel.kamelets</groupId>
+    <artifactId>camel-kamelets-catalog</artifactId>
+</dependency>
+----
+
+This artifact add all the kamelets available in the catalog to your Camel 
Quarkus application for build time processing. If you include it with the scope 
`provided` the artifact should not be part of the runtime classpath, but at 
build time, all the kamelets listed via `quarkus.camel.kamelet.identifiers` 
property should be preloaded.
+
+
+== Additional Camel Quarkus configuration
+
+[width="100%",cols="80,5,15",options="header"]
+|===
+| Configuration property | Type | Default
+
+
+|icon:lock[title=Fixed at build time] 
[[quarkus.camel.kamelet.identifiers]]`link:#quarkus.camel.kamelet.identifiers[quarkus.camel.kamelet.identifiers]`
+
+List of kamelets identifiers to pre-load at build time. 
+ Each individual identifier is used to set the related 
`org.apache.camel.model.RouteTemplateDefinition` id.
+| `string`
+| 
+|===
+
+[.configuration-legend]
+icon:lock[title=Fixed at build time] Configuration property fixed at build 
time. All other configuration properties are overridable at runtime.
+
diff --git a/extensions/kamelet/deployment/pom.xml 
b/extensions/kamelet/deployment/pom.xml
index 3020219..462b0e2 100644
--- a/extensions/kamelet/deployment/pom.xml
+++ b/extensions/kamelet/deployment/pom.xml
@@ -38,6 +38,10 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-kamelet</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-yaml-dsl</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git 
a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
 
b/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
index e818b75..3ababbe 100644
--- 
a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
+++ 
b/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
@@ -16,15 +16,94 @@
  */
 package org.apache.camel.quarkus.component.kamelet.deployment;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
 import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.Ordered;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.RouteTemplateDefinition;
+import org.apache.camel.quarkus.component.kamelet.KameletConfiguration;
+import org.apache.camel.quarkus.component.kamelet.KameletRecorder;
+import 
org.apache.camel.quarkus.core.deployment.spi.CamelContextCustomizerBuildItem;
+import org.apache.camel.spi.Resource;
 
 class KameletProcessor {
-
     private static final String FEATURE = "camel-kamelet";
 
     @BuildStep
     FeatureBuildItem feature() {
         return new FeatureBuildItem(FEATURE);
     }
+
+    @BuildStep
+    KameletResolverBuildItem defaultResolver() {
+        return new KameletResolverBuildItem(new KameletResolver() {
+            @Override
+            public Optional<Resource> resolve(String id, CamelContext context) 
throws Exception {
+                ExtendedCamelContext ecc = 
context.adapt(ExtendedCamelContext.class);
+                return Optional.ofNullable(
+                        ecc.getResourceLoader().resolveResource("/kamelets/" + 
id + ".kamelet.yaml"));
+            }
+        });
+    }
+
+    @Record(ExecutionTime.STATIC_INIT)
+    @BuildStep
+    CamelContextCustomizerBuildItem configureTemplates(
+            List<KameletResolverBuildItem> resolvers,
+            KameletConfiguration configuration,
+            KameletRecorder recorder) throws Exception {
+
+        List<RouteTemplateDefinition> definitions = new ArrayList<>();
+        List<KameletResolver> kameletResolvers = resolvers.stream()
+                .map(KameletResolverBuildItem::getResolver)
+                .sorted(Comparator.comparingInt(Ordered::getOrder))
+                .collect(Collectors.toList());
+
+        CamelContext context = new DefaultCamelContext();
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+
+        for (String id : 
configuration.identifiers.orElse(Collections.emptyList())) {
+            for (KameletResolver resolver : kameletResolvers) {
+                final Optional<Resource> resource = resolver.resolve(id, ecc);
+                if (!resource.isPresent()) {
+                    continue;
+                }
+
+                Collection<RoutesBuilder> rbs = 
ecc.getRoutesLoader().findRoutesBuilders(resource.get());
+                for (RoutesBuilder rb : rbs) {
+                    RouteBuilder routeBuilder = (RouteBuilder) rb;
+                    routeBuilder.configure();
+                    if 
(routeBuilder.getRouteTemplateCollection().getRouteTemplates().size() == 0) {
+                        throw new IllegalStateException(
+                                "No kamelet template was created for "
+                                        + "kamelet:" + id + ". It might be 
that the kamelet was malformed?");
+                    } else if 
(routeBuilder.getRouteTemplateCollection().getRouteTemplates().size() > 1) {
+                        throw new IllegalStateException(
+                                "A kamelet is not supposed to create more than 
one route ("
+                                        + "kamelet:" + id + ","
+                                        + "routes: " + 
routeBuilder.getRouteTemplateCollection().getRouteTemplates().size()
+                                        + ")");
+                    }
+
+                    
definitions.add(routeBuilder.getRouteTemplateCollection().getRouteTemplates().get(0));
+                }
+            }
+        }
+
+        return new 
CamelContextCustomizerBuildItem(recorder.createTemplateLoaderCustomizer(definitions));
+    }
 }
diff --git 
a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
 
b/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletResolver.java
similarity index 71%
copy from 
extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
copy to 
extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletResolver.java
index e818b75..a32305f 100644
--- 
a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
+++ 
b/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletResolver.java
@@ -16,15 +16,17 @@
  */
 package org.apache.camel.quarkus.component.kamelet.deployment;
 
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.builditem.FeatureBuildItem;
+import java.util.Optional;
 
-class KameletProcessor {
+import org.apache.camel.CamelContext;
+import org.apache.camel.Ordered;
+import org.apache.camel.spi.Resource;
 
-    private static final String FEATURE = "camel-kamelet";
+public interface KameletResolver extends Ordered {
+    Optional<Resource> resolve(String id, CamelContext context) throws 
Exception;
 
-    @BuildStep
-    FeatureBuildItem feature() {
-        return new FeatureBuildItem(FEATURE);
+    @Override
+    default int getOrder() {
+        return Ordered.LOWEST;
     }
 }
diff --git 
a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
 
b/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletResolverBuildItem.java
similarity index 58%
copy from 
extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
copy to 
extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletResolverBuildItem.java
index e818b75..f463f0b 100644
--- 
a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
+++ 
b/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletResolverBuildItem.java
@@ -16,15 +16,21 @@
  */
 package org.apache.camel.quarkus.component.kamelet.deployment;
 
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.builder.item.MultiBuildItem;
 
-class KameletProcessor {
+/**
+ * Build item used by kamelet providers to plug their own way of resolving 
kamelets giving a name. This could be
+ * leveraged by a future camel-quarkus-kamelet-catalog extension to resolve 
kamelets as they may have a different naming
+ * structure or location in the classpath.
+ */
+public final class KameletResolverBuildItem extends MultiBuildItem {
+    private final KameletResolver resolver;
 
-    private static final String FEATURE = "camel-kamelet";
+    public KameletResolverBuildItem(KameletResolver resolver) {
+        this.resolver = resolver;
+    }
 
-    @BuildStep
-    FeatureBuildItem feature() {
-        return new FeatureBuildItem(FEATURE);
+    public KameletResolver getResolver() {
+        return this.resolver;
     }
 }
diff --git a/extensions/kamelet/runtime/src/main/doc/usage.adoc 
b/extensions/kamelet/runtime/src/main/doc/usage.adoc
new file mode 100644
index 0000000..a435ff3
--- /dev/null
+++ b/extensions/kamelet/runtime/src/main/doc/usage.adoc
@@ -0,0 +1,18 @@
+=== Pre-load Kamelets at build-time
+
+This extension allows to pre-load a set of Kamelets at build time using the 
`quarkus.camel.kamelet.identifiers` property.
+
+=== Using the Kamelet Catalog
+
+A set of pre-made Kamelets can be found on the 
https://camel.apache.org/camel-kamelets/latest[Kamelet Catalog].
+To use the Kamelet from the catalog you need to copy their yaml definition 
(that you can find https://github.com/apache/camel-kamelets/[in the 
camel-kamelet repo]) on your project in the classpath. Alternatively you can 
add the `camel-quarkus-kamelets-catalog` artifact to your `pom.xml`:
+
+[source,xml]
+----
+<dependency>
+    <groupId>org.apache.camel.kamelets</groupId>
+    <artifactId>camel-kamelets-catalog</artifactId>
+</dependency>
+----
+
+This artifact add all the kamelets available in the catalog to your Camel 
Quarkus application for build time processing. If you include it with the scope 
`provided` the artifact should not be part of the runtime classpath, but at 
build time, all the kamelets listed via `quarkus.camel.kamelet.identifiers` 
property should be preloaded.
diff --git 
a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
 
b/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletConfiguration.java
similarity index 56%
copy from 
extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
copy to 
extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletConfiguration.java
index e818b75..58a1eb8 100644
--- 
a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
+++ 
b/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletConfiguration.java
@@ -14,17 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.kamelet.deployment;
+package org.apache.camel.quarkus.component.kamelet;
 
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.builditem.FeatureBuildItem;
+import java.util.List;
+import java.util.Optional;
 
-class KameletProcessor {
+import io.quarkus.runtime.annotations.ConfigItem;
+import io.quarkus.runtime.annotations.ConfigPhase;
+import io.quarkus.runtime.annotations.ConfigRoot;
 
-    private static final String FEATURE = "camel-kamelet";
-
-    @BuildStep
-    FeatureBuildItem feature() {
-        return new FeatureBuildItem(FEATURE);
-    }
+@ConfigRoot(name = "camel.kamelet", phase = ConfigPhase.BUILD_TIME)
+public class KameletConfiguration {
+    /**
+     * List of kamelets identifiers to pre-load at build time.
+     * <p>
+     * Each individual identifier is used to set the related {@link 
org.apache.camel.model.RouteTemplateDefinition} id.
+     */
+    @ConfigItem
+    public Optional<List<String>> identifiers;
 }
diff --git 
a/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletRecorder.java
 
b/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletRecorder.java
new file mode 100644
index 0000000..1f59ead
--- /dev/null
+++ 
b/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletRecorder.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.kamelet;
+
+import java.util.List;
+
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
+import io.quarkus.runtime.annotations.RelaxedValidation;
+import org.apache.camel.CamelContext;
+import org.apache.camel.model.Model;
+import org.apache.camel.model.RouteTemplateDefinition;
+import org.apache.camel.spi.CamelContextCustomizer;
+
+@Recorder
+public class KameletRecorder {
+    public RuntimeValue<CamelContextCustomizer> createTemplateLoaderCustomizer(
+            @RelaxedValidation List<RouteTemplateDefinition> definitions) {
+
+        return new RuntimeValue<>(new CamelContextCustomizer() {
+            @Override
+            public void configure(CamelContext context) {
+                try {
+                    
context.getExtension(Model.class).addRouteTemplateDefinitions(definitions);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+    }
+}
diff --git a/integration-tests/kamelet/pom.xml 
b/integration-tests/kamelet/pom.xml
index ade4967..d0fd1ea 100644
--- a/integration-tests/kamelet/pom.xml
+++ b/integration-tests/kamelet/pom.xml
@@ -63,6 +63,10 @@
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy-jsonb</artifactId>
+        </dependency>
 
         <!-- test dependencies -->
         <dependency>
@@ -79,6 +83,19 @@
         <!-- The following dependencies guarantee that this module is built 
after them. You can update them by running `mvn process-resources -Pformat -N` 
from the source tree root directory -->
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-bean-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-direct-deployment</artifactId>
             <version>${project.version}</version>
             <type>pom</type>
diff --git 
a/integration-tests/kamelet/src/main/java/org/apache/camel/quarkus/component/kamelet/it/KameletResource.java
 
b/integration-tests/kamelet/src/main/java/org/apache/camel/quarkus/component/kamelet/it/KameletResource.java
index 7ef58e1..d899853 100644
--- 
a/integration-tests/kamelet/src/main/java/org/apache/camel/quarkus/component/kamelet/it/KameletResource.java
+++ 
b/integration-tests/kamelet/src/main/java/org/apache/camel/quarkus/component/kamelet/it/KameletResource.java
@@ -17,6 +17,9 @@
 package org.apache.camel.quarkus.component.kamelet.it;
 
 import javax.inject.Inject;
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonArrayBuilder;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
@@ -25,13 +28,19 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.FluentProducerTemplate;
+import org.apache.camel.model.Model;
+import org.apache.camel.model.OptionalIdentifiedDefinition;
 
 @Path("/kamelet")
 public class KameletResource {
 
     @Inject
+    CamelContext camelContext;
+
+    @Inject
     FluentProducerTemplate fluentProducerTemplate;
 
     @Inject
@@ -73,10 +82,18 @@ public class KameletResource {
         return fluentProducerTemplate.toF("kamelet:%s", 
name).withBody(message).request(String.class);
     }
 
-    @Path("/auto-discovery")
-    @POST
-    @Produces(MediaType.TEXT_PLAIN)
-    public String autoDiscovery(String message) {
-        return fluentProducerTemplate.toF("kamelet:auto-discovery?message=%s", 
message).request(String.class);
+    @Path("/list")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public JsonArray list() {
+        JsonArrayBuilder builder = Json.createArrayBuilder();
+
+        camelContext.getExtension(Model.class)
+                .getRouteTemplateDefinitions()
+                .stream()
+                .map(OptionalIdentifiedDefinition::getId)
+                .forEach(builder::add);
+
+        return builder.build();
     }
 }
diff --git 
a/integration-tests/kamelet/src/main/java/org/apache/camel/quarkus/component/kamelet/it/KameletRoutes.java
 
b/integration-tests/kamelet/src/main/java/org/apache/camel/quarkus/component/kamelet/it/KameletRoutes.java
index e7eb134..7cbc140 100644
--- 
a/integration-tests/kamelet/src/main/java/org/apache/camel/quarkus/component/kamelet/it/KameletRoutes.java
+++ 
b/integration-tests/kamelet/src/main/java/org/apache/camel/quarkus/component/kamelet/it/KameletRoutes.java
@@ -17,15 +17,11 @@
 package org.apache.camel.quarkus.component.kamelet.it;
 
 import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Named;
 
 import io.quarkus.runtime.annotations.RegisterForReflection;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
-import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.spi.Resource;
-import org.apache.camel.support.RoutesBuilderLoaderSupport;
 
 @ApplicationScoped
 public class KameletRoutes extends RouteBuilder {
@@ -75,25 +71,4 @@ public class KameletRoutes extends RouteBuilder {
             
exchange.getMessage().setBody(exchange.getMessage().getBody(String.class) + 
"-suffix");
         }
     }
-
-    @Named("routes-builder-loader-kamelet.yaml")
-    RoutesBuilderLoaderSupport routesBuilderLoaderKameletYaml() {
-        return new RoutesBuilderLoaderSupport() {
-            @Override
-            public String getSupportedExtension() {
-                return "kamelet.yaml";
-            }
-
-            @Override
-            public RoutesBuilder loadRoutesBuilder(Resource resource) {
-                return new RouteBuilder() {
-                    @Override
-                    public void configure() {
-                        
routeTemplate("auto-discovery").templateParameter("message").from("kamelet:source").setBody()
-                                .constant("Auto-discovered {{message}}");
-                    }
-                };
-            }
-        };
-    }
 }
diff --git 
a/integration-tests/kamelet/src/main/resources/application.properties 
b/integration-tests/kamelet/src/main/resources/application.properties
index eb752cc..dd2333e 100644
--- a/integration-tests/kamelet/src/main/resources/application.properties
+++ b/integration-tests/kamelet/src/main/resources/application.properties
@@ -15,3 +15,8 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 camel.kamelet.setBodyFromProperties.bodyValueFromProperty=Camel Quarkus 
Kamelet Property
+
+quarkus.camel.kamelet.identifiers = injector,logger
+
+# this is needed to actually test that kamelet are preloaded at build time:
+camel.component.kamelet.location = file:/invalid
\ No newline at end of file
diff --git 
a/integration-tests/kamelet/src/main/resources/kamelets/auto-discovery.kamelet.yaml
 b/integration-tests/kamelet/src/main/resources/kamelets/injector.kamelet.yaml
similarity index 50%
rename from 
integration-tests/kamelet/src/main/resources/kamelets/auto-discovery.kamelet.yaml
rename to 
integration-tests/kamelet/src/main/resources/kamelets/injector.kamelet.yaml
index d48d285..5ebd224 100644
--- 
a/integration-tests/kamelet/src/main/resources/kamelets/auto-discovery.kamelet.yaml
+++ 
b/integration-tests/kamelet/src/main/resources/kamelets/injector.kamelet.yaml
@@ -15,4 +15,37 @@
 # limitations under the License.
 #
 
-# Fake kamelet definition to be loaded by "routes-builder-loader-kamelet.yaml" 
bean from registry
\ No newline at end of file
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+  name: injector
+  labels:
+    camel.apache.org/kamelet.type: "source"
+    camel.apache.org/kamelet.name: "injector"
+    camel.apache.org/kamelet.version: "v1alpha1"
+    camel.apache.org/kamelet.revision: "1"
+spec:
+  definition:
+    title: "Injector"
+    description: "Inject Data"
+    properties:
+      delay:
+        title: Delay
+        description: Delay
+        type: string
+        default: "1s"
+  types:
+    out:
+      mediaType: application/json
+  dependencies:
+    - "camel:timer"
+  flow:
+    from:
+      uri: timer
+      parameters:
+        timerName: "{{routeId}}"
+        period: "{{delay}}"
+      steps:
+        - set-body:
+            exchange-property: "CamelTimerCounter"
+        - to: "kamelet:sink"
diff --git 
a/integration-tests/kamelet/src/main/resources/kamelets/logger.kamelet.yaml 
b/integration-tests/kamelet/src/main/resources/kamelets/logger.kamelet.yaml
new file mode 100644
index 0000000..d974eef
--- /dev/null
+++ b/integration-tests/kamelet/src/main/resources/kamelets/logger.kamelet.yaml
@@ -0,0 +1,57 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+  name: logger
+  labels:
+    camel.apache.org/kamelet.type: "sink"
+    camel.apache.org/kamelet.name: "log"
+    camel.apache.org/kamelet.version: "v1alpha1"
+spec:
+  definition:
+    title: "Logger"
+    description: "Logger"
+    properties:
+      loggerName:
+        title: Name of the logging category
+        description:  Name of the logging category
+        type: string
+        default: "logger"
+      showAll:
+        title: Show All
+        description: Show All
+        type: boolean
+        default: false
+      multiLine:
+        title: Multi Line
+        description: Multi Line
+        type: boolean
+        default: false
+  dependencies:
+    - "camel:log"
+  flow:
+    from:
+      uri: "kamelet:source"
+      steps:
+        - to:
+            uri: "log"
+            parameters:
+              loggerName: "{{loggerName}}"
+              showAll: "{{showAll}}"
+              multiline: "{{multiLine}}"
diff --git 
a/integration-tests/kamelet/src/test/java/org/apache/camel/quarkus/component/kamelet/it/KameletTest.java
 
b/integration-tests/kamelet/src/test/java/org/apache/camel/quarkus/component/kamelet/it/KameletTest.java
index f1fa7e8..7beefc3 100644
--- 
a/integration-tests/kamelet/src/test/java/org/apache/camel/quarkus/component/kamelet/it/KameletTest.java
+++ 
b/integration-tests/kamelet/src/test/java/org/apache/camel/quarkus/component/kamelet/it/KameletTest.java
@@ -16,12 +16,17 @@
  */
 package org.apache.camel.quarkus.component.kamelet.it;
 
+import java.util.ArrayList;
+import java.util.Map;
+
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
+import io.restassured.response.Response;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @QuarkusTest
 class KameletTest {
@@ -86,13 +91,15 @@ class KameletTest {
     }
 
     @Test
-    public void testAutoDiscovery() {
-        RestAssured.given()
-                .contentType(ContentType.TEXT)
-                .body("Kamelet")
-                .post("/kamelet/auto-discovery")
-                .then()
-                .statusCode(200)
-                .body(is("Auto-discovered Kamelet"));
+    public void testDiscovered() {
+        Response resp = RestAssured.given()
+                .contentType(ContentType.JSON)
+                .when().get("/kamelet/list");
+        resp.then().statusCode(200);
+
+        ArrayList<Map<String, ?>> jsonAsArrayList = resp.body()
+                .jsonPath().get("");
+        assertTrue(jsonAsArrayList.contains("injector"));
+        assertTrue(jsonAsArrayList.contains("logger"));
     }
 }

Reply via email to