This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch camel-master in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 3641f17299cdc3d4ceaa10d6b107224ce388bea3 Author: aldettinger <aldettin...@gmail.com> AuthorDate: Tue Feb 9 18:13:44 2021 +0100 Made nats TLS auth tests optional fixes #2211 --- .../component/nats/it/NatsConfiguration.java | 8 +- .../quarkus/component/nats/it/NatsRoutes.java | 19 ++- .../nats/src/main/resources/application.properties | 4 +- .../camel/quarkus/component/nats/it/NatsTest.java | 6 + .../component/nats/it/NatsTestResource.java | 155 +++++++++++++++------ 5 files changed, 141 insertions(+), 51 deletions(-) diff --git a/integration-tests/nats/src/main/java/org/apache/camel/quarkus/component/nats/it/NatsConfiguration.java b/integration-tests/nats/src/main/java/org/apache/camel/quarkus/component/nats/it/NatsConfiguration.java index b270159..b50aa0d 100644 --- a/integration-tests/nats/src/main/java/org/apache/camel/quarkus/component/nats/it/NatsConfiguration.java +++ b/integration-tests/nats/src/main/java/org/apache/camel/quarkus/component/nats/it/NatsConfiguration.java @@ -18,7 +18,9 @@ package org.apache.camel.quarkus.component.nats.it; import javax.inject.Named; +import io.quarkus.arc.properties.IfBuildProperty; import org.apache.camel.component.nats.NatsComponent; +import org.eclipse.microprofile.config.ConfigProvider; import org.eclipse.microprofile.config.inject.ConfigProperty; public class NatsConfiguration { @@ -27,6 +29,7 @@ public class NatsConfiguration { public static final String NATS_BROKER_URL_NO_AUTH_CONFIG_KEY = "camel.nats.test.broker-url-no-auth"; public static final String NATS_BROKER_URL_TLS_AUTH_CONFIG_KEY = "camel.nats.test.broker-url-tls-auth"; public static final String NATS_BROKER_URL_TOKEN_AUTH_CONFIG_KEY = "camel.nats.test.broker-url-token-auth"; + public static final String NATS_ENABLE_TLS_TESTS_CONFIG_KEY = "camel.nats.test.enable-tls"; @ConfigProperty(name = NATS_BROKER_URL_BASIC_AUTH_CONFIG_KEY) String natsBasicAuthBrokerUrl; @@ -34,9 +37,6 @@ public class NatsConfiguration { @ConfigProperty(name = NATS_BROKER_URL_NO_AUTH_CONFIG_KEY) String natsNoAuthBrokerUrl; - @ConfigProperty(name = NATS_BROKER_URL_TLS_AUTH_CONFIG_KEY) - String natsTlsAuthBrokerUrl; - @ConfigProperty(name = NATS_BROKER_URL_TOKEN_AUTH_CONFIG_KEY) String natsTokenAuthBrokerUrl; @@ -55,8 +55,10 @@ public class NatsConfiguration { } @Named + @IfBuildProperty(name = NATS_ENABLE_TLS_TESTS_CONFIG_KEY, stringValue = "true") NatsComponent natsTlsAuth() { NatsComponent component = new NatsComponent(); + String natsTlsAuthBrokerUrl = ConfigProvider.getConfig().getValue(NATS_BROKER_URL_TLS_AUTH_CONFIG_KEY, String.class); component.setServers(natsTlsAuthBrokerUrl); return component; } diff --git a/integration-tests/nats/src/main/java/org/apache/camel/quarkus/component/nats/it/NatsRoutes.java b/integration-tests/nats/src/main/java/org/apache/camel/quarkus/component/nats/it/NatsRoutes.java index 67bf1a3..32ffe69 100644 --- a/integration-tests/nats/src/main/java/org/apache/camel/quarkus/component/nats/it/NatsRoutes.java +++ b/integration-tests/nats/src/main/java/org/apache/camel/quarkus/component/nats/it/NatsRoutes.java @@ -25,19 +25,36 @@ import org.apache.camel.support.jsse.KeyManagersParameters; import org.apache.camel.support.jsse.KeyStoreParameters; import org.apache.camel.support.jsse.SSLContextParameters; import org.apache.camel.support.jsse.TrustManagersParameters; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.apache.camel.quarkus.component.nats.it.NatsConfiguration.NATS_ENABLE_TLS_TESTS_CONFIG_KEY; @ApplicationScoped public class NatsRoutes extends RouteBuilder { + private static final Logger LOG = LoggerFactory.getLogger(NatsRoutes.class); + @Inject NatsResource natsResource; + @ConfigProperty(name = NATS_ENABLE_TLS_TESTS_CONFIG_KEY) + boolean tlsTestsEnabled; + @Override public void configure() { from("natsBasicAuth:test").routeId("basic-auth").bean(natsResource, "storeMessage"); from("natsNoAuth:test").routeId("no-auth").bean(natsResource, "storeMessage"); from("natsTokenAuth:test").routeId("token-auth").bean(natsResource, "storeMessage"); - from("natsTlsAuth:test?sslContextParameters=#ssl&secure=true").routeId("tls-auth").bean(natsResource, "storeMessage"); + + if (tlsTestsEnabled) { + LOG.info("TLS tests enabled so starting the TLS auth route"); + final String uri = "natsTlsAuth:test?sslContextParameters=#ssl&secure=true"; + from(uri).routeId("tls-auth").bean(natsResource, "storeMessage"); + } else { + LOG.info("TLS tests NOT enabled, so NOT starting the TLS auth route"); + } from("natsNoAuth:max?maxMessages=2").routeId("2-msg-max").bean(natsResource, "storeMessage"); diff --git a/integration-tests/nats/src/main/resources/application.properties b/integration-tests/nats/src/main/resources/application.properties index 45284f0..b94b7c4 100644 --- a/integration-tests/nats/src/main/resources/application.properties +++ b/integration-tests/nats/src/main/resources/application.properties @@ -14,4 +14,6 @@ ## See the License for the specific language governing permissions and ## limitations under the License. ## --------------------------------------------------------------------------- -quarkus.camel.native.resources.include-patterns=certs/*.jks \ No newline at end of file +quarkus.camel.native.resources.include-patterns=certs/*.jks + +camel.nats.test.enable-tls=${ENABLE_TLS_TESTS:false} \ No newline at end of file diff --git a/integration-tests/nats/src/test/java/org/apache/camel/quarkus/component/nats/it/NatsTest.java b/integration-tests/nats/src/test/java/org/apache/camel/quarkus/component/nats/it/NatsTest.java index 177848f..802e270 100644 --- a/integration-tests/nats/src/test/java/org/apache/camel/quarkus/component/nats/it/NatsTest.java +++ b/integration-tests/nats/src/test/java/org/apache/camel/quarkus/component/nats/it/NatsTest.java @@ -22,6 +22,7 @@ import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; import io.restassured.http.Header; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import static io.restassured.RestAssured.given; import static org.awaitility.Awaitility.await; @@ -59,7 +60,12 @@ class NatsTest { assertEquals("no-auth-msg", messages[0]); } + /* + * The tests with TLS authentication fail in some environments (quarkus-platform, loaded systems and maybe more). + * They can be enabled locally with "export ENABLE_TLS_TESTS=true". + */ @Test + @EnabledIfEnvironmentVariable(named = "ENABLE_TLS_TESTS", matches = "true") void tlsAuthProduceConsumeRoundTripShouldSucceed() { Header header = new Header("sendToEndpointUri", "natsTlsAuth:test?sslContextParameters=#ssl&secure=true"); given().when().header(header).body("tls-auth-msg").post("/nats/send").then().statusCode(204); diff --git a/integration-tests/nats/src/test/java/org/apache/camel/quarkus/component/nats/it/NatsTestResource.java b/integration-tests/nats/src/test/java/org/apache/camel/quarkus/component/nats/it/NatsTestResource.java index 46cc3a0..6a6344a 100644 --- a/integration-tests/nats/src/test/java/org/apache/camel/quarkus/component/nats/it/NatsTestResource.java +++ b/integration-tests/nats/src/test/java/org/apache/camel/quarkus/component/nats/it/NatsTestResource.java @@ -16,6 +16,7 @@ */ package org.apache.camel.quarkus.component.nats.it; +import java.util.HashMap; import java.util.Map; import org.apache.camel.quarkus.testcontainers.ContainerResourceLifecycleManager; @@ -23,6 +24,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.containers.BindMode; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.SelinuxContext; +import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.TestcontainersConfiguration; @@ -30,7 +33,6 @@ import static org.apache.camel.quarkus.component.nats.it.NatsConfiguration.NATS_ import static org.apache.camel.quarkus.component.nats.it.NatsConfiguration.NATS_BROKER_URL_NO_AUTH_CONFIG_KEY; import static org.apache.camel.quarkus.component.nats.it.NatsConfiguration.NATS_BROKER_URL_TLS_AUTH_CONFIG_KEY; import static org.apache.camel.quarkus.component.nats.it.NatsConfiguration.NATS_BROKER_URL_TOKEN_AUTH_CONFIG_KEY; -import static org.apache.camel.util.CollectionHelper.mapOf; public class NatsTestResource implements ContainerResourceLifecycleManager { @@ -41,36 +43,101 @@ public class NatsTestResource implements ContainerResourceLifecycleManager { private static final int NATS_SERVER_PORT = 4222; private static final String TOKEN_AUTH_TOKEN = "!admin23456"; - private GenericContainer basicAuthContainer, noAuthContainer, tlsAuthContainer, tokenAuthContainer; + private GenericContainer<?> basicAuthContainer, noAuthContainer, tlsAuthContainer, tokenAuthContainer; @Override public Map<String, String> start() { LOG.info(TestcontainersConfiguration.getInstance().toString()); - // Start the container needed for the basic authentication test - basicAuthContainer = new GenericContainer(NATS_IMAGE).withExposedPorts(NATS_SERVER_PORT) + Map<String, String> properties = new HashMap<>(); + + basicAuthContainer = basicAuthContainer(properties); + noAuthContainer = noAuthContainer(properties); + tokenAuthContainer = tokenAuthContainer(properties); + + if ("true".equals(System.getenv("ENABLE_TLS_TESTS"))) { + LOG.info("TLS tests enabled so starting the TLS auth container"); + tlsAuthContainer = tlsAuthContainer(properties); + } else { + LOG.info("TLS tests NOT enabled, so NOT starting the TLS auth container"); + } + + LOG.info("Properties: {}", properties); + + return properties; + } + + @Override + public void stop() { + stop(basicAuthContainer); + stop(noAuthContainer); + stop(tlsAuthContainer); + stop(tokenAuthContainer); + } + + private void stop(GenericContainer<?> container) { + try { + if (container != null) { + container.stop(); + } + } catch (Exception ex) { + LOG.error("An issue occurred while stopping " + container.getNetworkAliases(), ex); + } + } + + private static GenericContainer<?> basicAuthContainer(Map<String, String> properties) { + LOG.info("Starting basicAuthContainer"); + // container needed for the basic authentication test + GenericContainer<?> container = new GenericContainer<>(NATS_IMAGE) + .withExposedPorts(NATS_SERVER_PORT) + .withNetworkAliases("basicAuthContainer") .withCommand("-DV", "--user", BASIC_AUTH_USERNAME, "--pass", BASIC_AUTH_PASSWORD) + .withLogConsumer(new Slf4jLogConsumer(LOG).withPrefix("basicAuthContainer")) .waitingFor(Wait.forLogMessage(".*Server is ready.*", 1)); - basicAuthContainer.start(); - String basicAuthIp = basicAuthContainer.getContainerIpAddress(); - Integer basicAuthPort = basicAuthContainer.getMappedPort(NATS_SERVER_PORT); + + container.start(); + + String basicAuthIp = container.getContainerIpAddress(); + Integer basicAuthPort = container.getMappedPort(NATS_SERVER_PORT); String basicAuthAuthority = BASIC_AUTH_USERNAME + ":" + BASIC_AUTH_PASSWORD; String basicAuthBrokerUrl = String.format("%s@%s:%d", basicAuthAuthority, basicAuthIp, basicAuthPort); - // Start the container needed for tests without authentication - noAuthContainer = new GenericContainer(NATS_IMAGE).withExposedPorts(NATS_SERVER_PORT) + properties.put(NATS_BROKER_URL_BASIC_AUTH_CONFIG_KEY, basicAuthBrokerUrl); + + return container; + } + + private static GenericContainer<?> noAuthContainer(Map<String, String> properties) { + LOG.info("Starting noAuthContainer"); + // container needed for the basic authentication test + GenericContainer<?> container = new GenericContainer<>(NATS_IMAGE) + .withExposedPorts(NATS_SERVER_PORT) + .withNetworkAliases("noAuthContainer") + .withLogConsumer(new Slf4jLogConsumer(LOG).withPrefix("noAuthContainer")) .waitingFor(Wait.forLogMessage(".*Listening for route connections.*", 1)); - noAuthContainer.start(); - String noAuthIp = noAuthContainer.getContainerIpAddress(); - Integer noAuthPort = noAuthContainer.getMappedPort(NATS_SERVER_PORT); + + container.start(); + + String noAuthIp = container.getContainerIpAddress(); + Integer noAuthPort = container.getMappedPort(NATS_SERVER_PORT); String noAuthBrokerUrl = String.format("%s:%s", noAuthIp, noAuthPort); + properties.put(NATS_BROKER_URL_NO_AUTH_CONFIG_KEY, noAuthBrokerUrl); + + return container; + } + + private static GenericContainer<?> tlsAuthContainer(Map<String, String> properties) { + LOG.info("Starting tlsAuthContainer"); // Start the container needed for the TLS authentication test - tlsAuthContainer = new GenericContainer(NATS_IMAGE).withExposedPorts(NATS_SERVER_PORT) - .withClasspathResourceMapping("certs/ca.pem", "/certs/ca.pem", BindMode.READ_ONLY) - .withClasspathResourceMapping("certs/key.pem", "/certs/key.pem", BindMode.READ_ONLY) - .withClasspathResourceMapping("certs/server.pem", "/certs/server.pem", BindMode.READ_ONLY) - .withClasspathResourceMapping("conf/tls.conf", "/conf/tls.conf", BindMode.READ_ONLY) + GenericContainer<?> container = new GenericContainer<>(NATS_IMAGE) + .withExposedPorts(NATS_SERVER_PORT) + .withNetworkAliases("tlsAuthContainer") + .withClasspathResourceMapping("certs/ca.pem", "/certs/ca.pem", BindMode.READ_ONLY, SelinuxContext.SHARED) + .withClasspathResourceMapping("certs/key.pem", "/certs/key.pem", BindMode.READ_ONLY, SelinuxContext.SHARED) + .withClasspathResourceMapping("certs/server.pem", "/certs/server.pem", BindMode.READ_ONLY, + SelinuxContext.SHARED) + .withClasspathResourceMapping("conf/tls.conf", "/conf/tls.conf", BindMode.READ_ONLY, SelinuxContext.SHARED) .withCommand( "--config", "/conf/tls.conf", "--tls", @@ -78,47 +145,43 @@ public class NatsTestResource implements ContainerResourceLifecycleManager { "--tlskey=/certs/key.pem", "--tlsverify", "--tlscacert=/certs/ca.pem") + .withLogConsumer(new Slf4jLogConsumer(LOG).withPrefix("tlsAuthContainer")) .waitingFor(Wait.forLogMessage(".*Server is ready.*", 1)); try { - tlsAuthContainer.start(); + container.start(); } catch (Exception ex) { - throw new RuntimeException("An issue occurred while starting tlsAuthContainer: " + tlsAuthContainer.getLogs(), ex); + throw new RuntimeException("An issue occurred while starting tlsAuthContainer: " + container.getLogs(), ex); } - String tlsAuthIp = tlsAuthContainer.getContainerIpAddress(); - Integer tlsAuthPort = tlsAuthContainer.getMappedPort(NATS_SERVER_PORT); + + container.start(); + + String tlsAuthIp = container.getContainerIpAddress(); + Integer tlsAuthPort = container.getMappedPort(NATS_SERVER_PORT); String tlsAuthBrokerUrl = String.format("%s:%d", tlsAuthIp, tlsAuthPort); + properties.put(NATS_BROKER_URL_TLS_AUTH_CONFIG_KEY, tlsAuthBrokerUrl); + + return container; + } + + private static GenericContainer<?> tokenAuthContainer(Map<String, String> properties) { + LOG.info("Starting tokenAuthContainer"); // Start the container needed for the token authentication test - tokenAuthContainer = new GenericContainer(NATS_IMAGE).withExposedPorts(NATS_SERVER_PORT) + GenericContainer<?> container = new GenericContainer<>(NATS_IMAGE) + .withExposedPorts(NATS_SERVER_PORT) + .withNetworkAliases("tokenAuthContainer") .withCommand("-DV", "-auth", TOKEN_AUTH_TOKEN) + .withLogConsumer(new Slf4jLogConsumer(LOG).withPrefix("tokenAuthContainer")) .waitingFor(Wait.forLogMessage(".*Server is ready.*", 1)); - tokenAuthContainer.start(); - String tokenAuthIp = tokenAuthContainer.getContainerIpAddress(); - Integer tokenAuthPort = tokenAuthContainer.getMappedPort(NATS_SERVER_PORT); + + container.start(); + + String tokenAuthIp = container.getContainerIpAddress(); + Integer tokenAuthPort = container.getMappedPort(NATS_SERVER_PORT); String tokenAuthBrokerUrl = String.format("%s@%s:%d", TOKEN_AUTH_TOKEN, tokenAuthIp, tokenAuthPort); - Map<String, String> properties = mapOf(NATS_BROKER_URL_BASIC_AUTH_CONFIG_KEY, basicAuthBrokerUrl); - properties.put(NATS_BROKER_URL_NO_AUTH_CONFIG_KEY, noAuthBrokerUrl); - properties.put(NATS_BROKER_URL_TLS_AUTH_CONFIG_KEY, tlsAuthBrokerUrl); properties.put(NATS_BROKER_URL_TOKEN_AUTH_CONFIG_KEY, tokenAuthBrokerUrl); - return properties; - } - - @Override - public void stop() { - stop(basicAuthContainer, "natsBasicAuthContainer"); - stop(noAuthContainer, "natsNoAuthContainer"); - stop(tlsAuthContainer, "natsTlsAuthContainer"); - stop(tokenAuthContainer, "natsTokenAuthContainer"); - } - private void stop(GenericContainer<?> container, String id) { - try { - if (container != null) { - container.stop(); - } - } catch (Exception ex) { - LOG.error("An issue occured while stopping " + id, ex); - } + return container; } }