This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit ec6a3a3424bb0a30180948bc8a7cbc3e1bf9fdd3 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sat Oct 30 14:56:11 2021 +0200 CAMEL-17150: camel-yaml-dsl - Should be able to load camel-k yaml file --- .../camel/dsl/yaml/KameletRoutesBuilderLoader.java | 4 ++ .../camel/dsl/yaml/YamlRoutesBuilderLoader.java | 53 +++++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/KameletRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/KameletRoutesBuilderLoader.java index c8ed68d..1f770ca 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/KameletRoutesBuilderLoader.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/KameletRoutesBuilderLoader.java @@ -47,6 +47,10 @@ public class KameletRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { protected RouteBuilder builder(Node node) { Node template = nodeAt(node, "/spec/template"); if (template == null) { + // fallback till flows get removed + template = nodeAt(node, "/spec/flows"); + } + if (template == null) { // fallback till flow get removed template = nodeAt(node, "/spec/flow"); } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java index 50348b5..30cd3fa 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java @@ -16,11 +16,15 @@ */ package org.apache.camel.dsl.yaml; +import java.util.List; +import java.util.Objects; + import org.apache.camel.CamelContextAware; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.builder.ErrorHandlerBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.builder.RouteConfigurationBuilder; +import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport; import org.apache.camel.dsl.yaml.deserializers.OutputAwareFromDefinition; import org.apache.camel.model.OnExceptionDefinition; import org.apache.camel.model.RouteConfigurationDefinition; @@ -31,9 +35,14 @@ import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.model.rest.VerbDefinition; import org.apache.camel.spi.CamelContextCustomizer; import org.apache.camel.spi.annotations.RoutesLoader; +import org.snakeyaml.engine.v2.nodes.MappingNode; import org.snakeyaml.engine.v2.nodes.Node; +import org.snakeyaml.engine.v2.nodes.NodeTuple; +import org.snakeyaml.engine.v2.nodes.NodeType; import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asSequenceNode; +import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asText; +import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.nodeAt; @ManagedResource(description = "Managed YAML RoutesBuilderLoader") @RoutesLoader(YamlRoutesBuilderLoader.EXTENSION) @@ -48,7 +57,9 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { return new RouteConfigurationBuilder() { @Override public void configure() throws Exception { - for (Node node : asSequenceNode(root).getValue()) { + Node target = preConfigureNode(root); + + for (Node node : asSequenceNode(target).getValue()) { Object item = getDeserializationContext().mandatoryResolve(node).construct(node); if (item instanceof OutputAwareFromDefinition) { @@ -96,7 +107,9 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { @Override public void configuration() throws Exception { - for (Node node : asSequenceNode(root).getValue()) { + Node target = preConfigureNode(root); + + for (Node node : asSequenceNode(target).getValue()) { Object item = getDeserializationContext().mandatoryResolve(node).construct(node); if (item instanceof RouteConfigurationDefinition) { CamelContextAware.trySetCamelContext(getRouteConfigurationCollection(), getCamelContext()); @@ -107,4 +120,40 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { }; } + private static Node preConfigureNode(Node root) { + Node target = root; + + // check if the yaml is a camel-k yaml with embedded routes (called flow(s)) + if (Objects.equals(root.getNodeType(), NodeType.MAPPING)) { + final MappingNode mn = YamlDeserializerSupport.asMappingNode(root); + boolean camelk = anyTupleMatches(mn.getValue(), "apiVersion", "camel.apache.org/v1") && + anyTupleMatches(mn.getValue(), "kind", "Integration"); + if (camelk) { + Node routes = nodeAt(root, "/spec/flows"); + if (routes == null) { + routes = nodeAt(root, "/spec/flow"); + } + if (routes != null) { + target = routes; + } + } + } + + return target; + } + + private static boolean anyTupleMatches(List<NodeTuple> list, String aKey, String aValue) { + for (NodeTuple tuple : list) { + final String key = asText(tuple.getKeyNode()); + final Node val = tuple.getValueNode(); + if (Objects.equals(aKey, key) && NodeType.SCALAR.equals(val.getNodeType())) { + String value = asText(tuple.getValueNode()); + if (Objects.equals(aValue, value)) { + return true; + } + } + } + return false; + } + }