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"));
}
}