This is an automated email from the ASF dual-hosted git repository. nferraro pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 76e46c9703f6fbc74547b8e46685eda0520cd409 Author: lburgazzoli <[email protected]> AuthorDate: Thu Nov 29 16:23:18 2018 +0100 chore: support for computing knative channel/service host name from uri --- .../src/test/resources/log4j2-test.xml | 4 +- .../apache/camel/component/knative/Knative.java | 1 + .../camel/component/knative/KnativeComponent.java | 1 - .../component/knative/KnativeConfiguration.java | 5 - .../camel/component/knative/KnativeEndpoint.java | 45 +++++-- .../component/knative/KnativeEnvironment.java | 26 ++++ .../camel/component/knative/KnativeSupport.java | 13 ++ .../component/knative/KnativeComponentMain.java | 89 ------------- .../component/knative/KnativeComponentTest.java | 139 ++++++++++++++++++++- .../src/test/resources/log4j2-test.xml | 4 +- 10 files changed, 214 insertions(+), 113 deletions(-) diff --git a/runtime/camel-knative-http/src/test/resources/log4j2-test.xml b/runtime/camel-knative-http/src/test/resources/log4j2-test.xml index 403c946..b31e8b4 100644 --- a/runtime/camel-knative-http/src/test/resources/log4j2-test.xml +++ b/runtime/camel-knative-http/src/test/resources/log4j2-test.xml @@ -9,10 +9,10 @@ <Loggers> <Root level="INFO"> - <AppenderRef ref="STDOUT"/> <!-- - <AppenderRef ref="NONE"/> + <AppenderRef ref="STDOUT"/> --> + <AppenderRef ref="NONE"/> </Root> </Loggers> diff --git a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/Knative.java b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/Knative.java index 4ea19d4..ce701ef 100644 --- a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/Knative.java +++ b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/Knative.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; public final class Knative { public static final ObjectMapper MAPPER = new ObjectMapper().registerModule(new Jdk8Module()); + public static final String HTTP_COMPONENT = "knative-http"; public static final String KNATIVE_PROTOCOL = "knative.protocol"; public static final String KNATIVE_TYPE = "knative.type"; diff --git a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeComponent.java b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeComponent.java index 496a71a..0767fda 100644 --- a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeComponent.java +++ b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeComponent.java @@ -22,7 +22,6 @@ import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.impl.DefaultComponent; import org.apache.camel.util.IntrospectionSupport; -import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.StringHelper; public class KnativeComponent extends DefaultComponent { diff --git a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeConfiguration.java b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeConfiguration.java index f3b0472..cc3fa65 100644 --- a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeConfiguration.java +++ b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeConfiguration.java @@ -17,14 +17,9 @@ package org.apache.camel.component.knative; import org.apache.camel.RuntimeCamelException; -import org.apache.camel.cloud.ServiceDefinition; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriParam; -import java.util.Arrays; - -import static org.apache.camel.util.CollectionHelper.mapOf; - public class KnativeConfiguration implements Cloneable { @UriParam @Metadata(required = "true") diff --git a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeEndpoint.java b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeEndpoint.java index ce50beb..10f264c 100644 --- a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeEndpoint.java +++ b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeEndpoint.java @@ -20,6 +20,7 @@ import java.io.InputStream; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.util.HashMap; import java.util.Map; import org.apache.camel.CamelContext; @@ -37,7 +38,6 @@ import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; import org.apache.camel.spi.UriPath; -import org.apache.camel.util.CollectionHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.ServiceHelper; import org.apache.camel.util.StringHelper; @@ -76,7 +76,7 @@ public class KnativeEndpoint extends DefaultEndpoint implements DelegateEndpoint this.name = remaining.indexOf('/') != -1 ? StringHelper.before(remaining, "/") : remaining; this.configuration = configuration; this.environment = this.configuration.getEnvironment(); - this.service = this.environment.mandatoryLookupService(targetType, remaining); + this.service = this.environment.lookupServiceOrDefault(targetType, remaining); switch (service.getProtocol()) { case http: @@ -205,10 +205,29 @@ public class KnativeEndpoint extends DefaultEndpoint implements DelegateEndpoint private static Endpoint http(CamelContext context, ServiceDefinition definition) { try { - final String host = definition.getHost(); - final int port = definition.getPort(); final String scheme = Knative.HTTP_COMPONENT; - final String protocol = definition.getMetadata().get(Knative.KNATIVE_PROTOCOL); + final String protocol = definition.getMetadata().getOrDefault(Knative.KNATIVE_PROTOCOL, "http"); + + String host = definition.getHost(); + int port = definition.getPort(); + + if (ObjectHelper.isEmpty(host)) { + String name = definition.getName(); + String zone = definition.getMetadata().get(ServiceDefinition.SERVICE_META_ZONE); + + if (ObjectHelper.isNotEmpty(zone)) { + try { + zone = context.resolvePropertyPlaceholders(zone); + } catch (IllegalArgumentException e) { + zone = null; + } + } + if (ObjectHelper.isNotEmpty(zone)) { + name = name + "." + zone; + } + + host = name; + } ObjectHelper.notNull(host, ServiceDefinition.SERVICE_META_HOST); ObjectHelper.notNull(protocol, Knative.KNATIVE_PROTOCOL); @@ -229,18 +248,18 @@ public class KnativeEndpoint extends DefaultEndpoint implements DelegateEndpoint final String filterKey = definition.getMetadata().get(Knative.FILTER_HEADER_NAME); final String filterVal = definition.getMetadata().get(Knative.FILTER_HEADER_VALUE); + final Map<String, Object> parameters = new HashMap<>(); if (ObjectHelper.isNotEmpty(filterKey) && ObjectHelper.isNotEmpty(filterVal)) { - uri = URISupport.appendParametersToURI( - uri, - CollectionHelper.mapOf("filter.headerName", filterKey, "filter.headerValue", filterVal) - ); + parameters.put("filter.headerName", filterKey); + parameters.put("filter.headerValue", filterVal); } - uri = URISupport.appendParametersToURI( - uri, - CollectionHelper.mapOf("useRelativePath", "true") - ); + // configure netty to use relative path instead of full + // path that is the default to make istio working + parameters.put("useRelativePath", "true"); + + uri = URISupport.appendParametersToURI(uri, parameters); return context.getEndpoint(uri); } catch (Exception e) { diff --git a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeEnvironment.java b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeEnvironment.java index 9ec4406..e133f4b 100644 --- a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeEnvironment.java +++ b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeEnvironment.java @@ -21,6 +21,7 @@ import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -93,6 +94,31 @@ public class KnativeEnvironment { ); } + + public KnativeServiceDefinition lookupServiceOrDefault(Knative.Type type, String name) { + return lookupService(type, name).orElseGet(() -> { + final String contextPath = StringHelper.after(name, "/"); + final String serviceName = (contextPath == null) ? name : StringHelper.before(name, "/"); + final Map<String, String> meta = new HashMap<>(); + + // namespace derived by default from env var + meta.put(ServiceDefinition.SERVICE_META_ZONE, "{{env:NAMESPACE}}"); + + if (contextPath != null) { + meta.put(ServiceDefinition.SERVICE_META_PATH, "/" + contextPath); + } + + return new KnativeEnvironment.KnativeServiceDefinition( + type, + Knative.Protocol.http, + serviceName, + "", + -1, + meta + ); + }); + } + // ************************ // // Helpers diff --git a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeSupport.java b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeSupport.java index 9c6c049..f84ac46 100644 --- a/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeSupport.java +++ b/runtime/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeSupport.java @@ -16,11 +16,15 @@ */ package org.apache.camel.component.knative; +import java.io.UnsupportedEncodingException; +import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; import java.util.Objects; import org.apache.camel.Exchange; +import org.apache.camel.util.CollectionHelper; +import org.apache.camel.util.URISupport; public final class KnativeSupport { private KnativeSupport() { @@ -43,4 +47,13 @@ public final class KnativeSupport { return answer; } + + public static String appendParametersToURI(String uri, String key, Object value, Object... keyVals) + throws UnsupportedEncodingException, URISyntaxException { + + return URISupport.appendParametersToURI( + uri, + CollectionHelper.mapOf(key, value, keyVals) + ); + } } diff --git a/runtime/camel-knative/src/test/java/org/apache/camel/component/knative/KnativeComponentMain.java b/runtime/camel-knative/src/test/java/org/apache/camel/component/knative/KnativeComponentMain.java deleted file mode 100644 index b983695..0000000 --- a/runtime/camel-knative/src/test/java/org/apache/camel/component/knative/KnativeComponentMain.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * 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.component.knative; - -import java.util.Arrays; - -import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.impl.DefaultCamelContext; -import org.apache.camel.impl.SimpleRegistry; - -import static org.apache.camel.util.CollectionHelper.mapOf; - -public class KnativeComponentMain { - public static void main(String[] args) throws Exception { - KnativeComponent component = new KnativeComponent(); - component.setEnvironment(newEnv()); - - SimpleRegistry registry = new SimpleRegistry(); - registry.put("knative", component); - - DefaultCamelContext context = new DefaultCamelContext(registry); - - try { - context.disableJMX(); - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("knative:endpoint/ep1") - .convertBodyTo(String.class) - .to("log:ep1?showAll=true&multiline=true") - .setBody().constant("Hello from CH1"); - from("knative:endpoint/ep2") - .convertBodyTo(String.class) - .to("log:ep2?showAll=true&multiline=true") - .setBody().constant("Hello from CH2"); - } - }); - - context.start(); - - Thread.sleep(Integer.MAX_VALUE); - } finally { - context.stop(); - } - } - - private static KnativeEnvironment newEnv() { - return new KnativeEnvironment(Arrays.asList( - new KnativeEnvironment.KnativeServiceDefinition( - Knative.Type.endpoint, - Knative.Protocol.http, - "ep1", - "localhost", - 8080, - mapOf( - Knative.KNATIVE_EVENT_TYPE, "org.apache.camel.event", - Knative.CONTENT_TYPE, "text/plain", - Knative.FILTER_HEADER_NAME, "CE-Source", - Knative.FILTER_HEADER_VALUE, "CE1" - )), - new KnativeEnvironment.KnativeServiceDefinition( - Knative.Type.endpoint, - Knative.Protocol.http, - "ep2", - "localhost", - 8080, - mapOf( - Knative.KNATIVE_EVENT_TYPE, "org.apache.camel.event", - Knative.CONTENT_TYPE, "text/plain", - Knative.FILTER_HEADER_NAME, "CE-Source", - Knative.FILTER_HEADER_VALUE, "CE2" - )) - )); - } -} diff --git a/runtime/camel-knative/src/test/java/org/apache/camel/component/knative/KnativeComponentTest.java b/runtime/camel-knative/src/test/java/org/apache/camel/component/knative/KnativeComponentTest.java index 631e95b..571e368 100644 --- a/runtime/camel-knative/src/test/java/org/apache/camel/component/knative/KnativeComponentTest.java +++ b/runtime/camel-knative/src/test/java/org/apache/camel/component/knative/KnativeComponentTest.java @@ -19,6 +19,8 @@ package org.apache.camel.component.knative; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; +import java.util.Collections; +import java.util.Properties; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.camel.CamelContext; @@ -27,6 +29,7 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.cloud.ServiceDefinition; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.component.netty4.NettyEndpoint; +import org.apache.camel.component.properties.PropertiesComponent; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.test.AvailablePortFinder; import org.junit.jupiter.api.AfterEach; @@ -149,6 +152,140 @@ public class KnativeComponentTest { } @Test + void testCreateEndpointWithComputedHost() throws Exception { + KnativeEnvironment env = new KnativeEnvironment(Arrays.asList( + new KnativeEnvironment.KnativeServiceDefinition( + Knative.Type.endpoint, + Knative.Protocol.http, + "myEndpoint", + "", + -1, + mapOf(ServiceDefinition.SERVICE_META_PATH, "/a/path")) + )); + + KnativeComponent component = context.getComponent("knative", KnativeComponent.class); + component.setEnvironment(env); + + context.start(); + + // + // Endpoint with context path derived from service definition + // + + KnativeEndpoint e1 = context.getEndpoint("knative:endpoint/myEndpoint", KnativeEndpoint.class); + + assertThat(e1).isNotNull(); + assertThat(e1.getService()).isNotNull(); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("name", "myEndpoint"); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("type", Knative.Type.endpoint); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("protocol", Knative.Protocol.http); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("path", "/a/path"); + assertThat(e1.getEndpoint()).isInstanceOf(NettyEndpoint.class); + assertThat(e1.getEndpoint()).hasFieldOrPropertyWithValue("endpointUri", "http://myEndpoint/a/path"); + } + + @Test + void testCreateEndpointWithComputedHostAndNamespace() throws Exception { + KnativeEnvironment env = new KnativeEnvironment(Arrays.asList( + new KnativeEnvironment.KnativeServiceDefinition( + Knative.Type.endpoint, + Knative.Protocol.http, + "myEndpoint", + "", + -1, + mapOf( + ServiceDefinition.SERVICE_META_PATH, "/a/path", + ServiceDefinition.SERVICE_META_ZONE, "myNamespace")) + )); + + KnativeComponent component = context.getComponent("knative", KnativeComponent.class); + component.setEnvironment(env); + + context.start(); + + // + // Endpoint with context path derived from service definition + // + + KnativeEndpoint e1 = context.getEndpoint("knative:endpoint/myEndpoint", KnativeEndpoint.class); + + assertThat(e1).isNotNull(); + assertThat(e1.getService()).isNotNull(); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("name", "myEndpoint"); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("type", Knative.Type.endpoint); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("protocol", Knative.Protocol.http); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("path", "/a/path"); + assertThat(e1.getEndpoint()).isInstanceOf(NettyEndpoint.class); + assertThat(e1.getEndpoint()).hasFieldOrPropertyWithValue("endpointUri", "http://myEndpoint.myNamespace/a/path"); + } + + @Test + void testCreateEndpointWithComputedHostAndNamespaceWithProperty() throws Exception { + KnativeEnvironment env = new KnativeEnvironment(Arrays.asList( + new KnativeEnvironment.KnativeServiceDefinition( + Knative.Type.endpoint, + Knative.Protocol.http, + "myEndpoint", + "", + -1, + mapOf( + ServiceDefinition.SERVICE_META_PATH, "/a/path", + ServiceDefinition.SERVICE_META_ZONE, "{{myNamespaceKey}}")) + )); + + Properties properties = new Properties(); + properties.setProperty("myNamespaceKey", "myNamespace"); + + PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); + pc.setInitialProperties(properties); + + KnativeComponent component = context.getComponent("knative", KnativeComponent.class); + component.setEnvironment(env); + + context.start(); + + // + // Endpoint with context path derived from service definition + // + + KnativeEndpoint e1 = context.getEndpoint("knative:endpoint/myEndpoint", KnativeEndpoint.class); + + assertThat(e1).isNotNull(); + assertThat(e1.getService()).isNotNull(); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("name", "myEndpoint"); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("type", Knative.Type.endpoint); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("protocol", Knative.Protocol.http); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("path", "/a/path"); + assertThat(e1.getEndpoint()).isInstanceOf(NettyEndpoint.class); + assertThat(e1.getEndpoint()).hasFieldOrPropertyWithValue("endpointUri", "http://myEndpoint.myNamespace/a/path"); + } + + @Test + void testCreateEndpointWithDefaults() throws Exception { + KnativeEnvironment env = new KnativeEnvironment(Collections.emptyList()); + + KnativeComponent component = context.getComponent("knative", KnativeComponent.class); + component.setEnvironment(env); + + context.start(); + + // + // Endpoint with context path derived from service definition + // + + KnativeEndpoint e1 = context.getEndpoint("knative:endpoint/myEndpoint/my/path", KnativeEndpoint.class); + + assertThat(e1).isNotNull(); + assertThat(e1.getService()).isNotNull(); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("name", "myEndpoint"); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("type", Knative.Type.endpoint); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("protocol", Knative.Protocol.http); + assertThat(e1.getService()).hasFieldOrPropertyWithValue("path", "/my/path"); + assertThat(e1.getEndpoint()).isInstanceOf(NettyEndpoint.class); + assertThat(e1.getEndpoint()).hasFieldOrPropertyWithValue("endpointUri", "http://myEndpoint/my/path"); + } + + @Test void testInvokeEndpoint() throws Exception { final int port = AvailablePortFinder.getNextAvailable(); @@ -326,7 +463,7 @@ public class KnativeComponentTest { } @Test - void testConsumeContentFithFilter() throws Exception { + void testConsumeContentWithFilter() throws Exception { final int port = AvailablePortFinder.getNextAvailable(); KnativeEnvironment env = new KnativeEnvironment(Arrays.asList( diff --git a/runtime/camel-knative/src/test/resources/log4j2-test.xml b/runtime/camel-knative/src/test/resources/log4j2-test.xml index 403c946..b31e8b4 100644 --- a/runtime/camel-knative/src/test/resources/log4j2-test.xml +++ b/runtime/camel-knative/src/test/resources/log4j2-test.xml @@ -9,10 +9,10 @@ <Loggers> <Root level="INFO"> - <AppenderRef ref="STDOUT"/> <!-- - <AppenderRef ref="NONE"/> + <AppenderRef ref="STDOUT"/> --> + <AppenderRef ref="NONE"/> </Root> </Loggers>
