diff --git a/core/build.gradle b/core/build.gradle index 618c31c7176..2d76c38c0de 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -57,7 +57,7 @@ project.tasks.check.dependsOn(jarFileTest) dependencies { compile 'junit:junit:4.12' - compile 'org.slf4j:slf4j-api:1.7.29' + compile 'org.slf4j:slf4j-api:1.7.30' compile 'org.jetbrains:annotations:17.0.0' compile 'javax.annotation:javax.annotation-api:1.3.2' compile 'org.apache.commons:commons-compress:1.19' @@ -106,10 +106,10 @@ dependencies { } testCompile 'org.apache.httpcomponents:httpclient:4.5.9' - testCompile 'redis.clients:jedis:3.1.0' + testCompile 'redis.clients:jedis:3.2.0' testCompile 'com.rabbitmq:amqp-client:5.8.0' testCompile 'org.mongodb:mongo-java-driver:3.12.0' - testCompile ('org.mockito:mockito-core:3.2.0') { + testCompile ('org.mockito:mockito-core:3.2.4') { exclude(module: 'hamcrest-core') } // Synthetic JAR used for MountableFileTest and DirectoryTarResourceTest diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientConfigUtils.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientConfigUtils.java index bfeabc63f8a..d88dc76331f 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientConfigUtils.java +++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientConfigUtils.java @@ -43,8 +43,10 @@ public class DockerClientConfigUtils { .map(StringUtils::trimToEmpty) .filter(StringUtils::isNotBlank); - - + /** + * Use {@link DockerClientFactory#dockerHostIpAddress()} + */ + @Deprecated public static String getDockerHostIpAddress(DockerClientConfig config) { switch (config.getDockerHost().getScheme()) { case "http": diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java index 7101b23b21a..aa607964ae5 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java +++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java @@ -1,8 +1,10 @@ package org.testcontainers.dockerclient; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Throwables; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; @@ -17,6 +19,7 @@ import org.testcontainers.dockerclient.transport.okhttp.OkHttpDockerCmdExecFactory; import org.testcontainers.utility.TestcontainersConfiguration; +import java.net.URI; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -33,6 +36,8 @@ public abstract class DockerClientProviderStrategy { protected DockerClient client; protected DockerClientConfig config; + private String dockerHostIpAddress; + private static final RateLimiter PING_RATE_LIMITER = RateLimiterBuilder.newBuilder() .withRate(2, TimeUnit.SECONDS) .withConstantThroughput() @@ -188,8 +193,38 @@ protected void ping(DockerClient client, int timeoutInSeconds) { } } - public String getDockerHostIpAddress() { - return DockerClientConfigUtils.getDockerHostIpAddress(this.config); + public synchronized String getDockerHostIpAddress() { + if (dockerHostIpAddress == null) { + dockerHostIpAddress = resolveDockerHostIpAddress(client, config.getDockerHost()); + } + return dockerHostIpAddress; + } + + @VisibleForTesting + static String resolveDockerHostIpAddress(DockerClient client, URI dockerHost) { + switch (dockerHost.getScheme()) { + case "http": + case "https": + case "tcp": + return dockerHost.getHost(); + case "unix": + case "npipe": + if (DockerClientConfigUtils.IN_A_CONTAINER) { + return client.inspectNetworkCmd() + .withNetworkId("bridge") + .exec() + .getIpam() + .getConfig() + .stream() + .filter(it -> it.getGateway() != null) + .findAny() + .map(Network.Ipam.Config::getGateway) + .orElse("localhost"); + } + return "localhost"; + default: + return null; + } } protected void checkOSType() { diff --git a/core/src/test/java/org/testcontainers/dockerclient/DockerClientConfigUtilsTest.java b/core/src/test/java/org/testcontainers/dockerclient/DockerClientConfigUtilsTest.java index 2e88982a7a8..353d6ea94e7 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/DockerClientConfigUtilsTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/DockerClientConfigUtilsTest.java @@ -1,9 +1,10 @@ package org.testcontainers.dockerclient; -import com.github.dockerjava.core.DefaultDockerClientConfig; -import com.github.dockerjava.core.DockerClientConfig; -import org.junit.Ignore; +import com.github.dockerjava.api.DockerClient; import org.junit.Test; +import org.testcontainers.DockerClientFactory; + +import java.net.URI; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -11,44 +12,29 @@ public class DockerClientConfigUtilsTest { + DockerClient client = DockerClientFactory.lazyClient(); + @Test public void getDockerHostIpAddressShouldReturnLocalhostWhenUnixSocket() { - DockerClientConfig configuration = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withDockerHost("unix:///var/run/docker.sock") - .withDockerTlsVerify(false) // TODO - check wrt. https://github.com/docker-java/docker-java/issues/588 - .build(); - String actual = DockerClientConfigUtils.getDockerHostIpAddress(configuration); + String actual = DockerClientProviderStrategy.resolveDockerHostIpAddress(client, URI.create("unix:///var/run/docker.sock")); assertEquals("localhost", actual); } - @Test @Ignore - public void getDockerHostIpAddressShouldReturnDockerHostIpWhenHttpUri() { - DockerClientConfig configuration = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost("http://12.23.34.45").build(); - String actual = DockerClientConfigUtils.getDockerHostIpAddress(configuration); - assertEquals("12.23.34.45", actual); - } - - @Test @Ignore + @Test public void getDockerHostIpAddressShouldReturnDockerHostIpWhenHttpsUri() { - DockerClientConfig configuration = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost("https://12.23.34.45").build(); - String actual = DockerClientConfigUtils.getDockerHostIpAddress(configuration); + String actual = DockerClientProviderStrategy.resolveDockerHostIpAddress(client, URI.create("http://12.23.34.45")); assertEquals("12.23.34.45", actual); } @Test public void getDockerHostIpAddressShouldReturnDockerHostIpWhenTcpUri() { - DockerClientConfig configuration = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withDockerHost("tcp://12.23.34.45") - .withDockerTlsVerify(false) // TODO - check wrt. https://github.com/docker-java/docker-java/issues/588 - .build(); - String actual = DockerClientConfigUtils.getDockerHostIpAddress(configuration); + String actual = DockerClientProviderStrategy.resolveDockerHostIpAddress(client, URI.create("tcp://12.23.34.45")); assertEquals("12.23.34.45", actual); } - @Test @Ignore + @Test public void getDockerHostIpAddressShouldReturnNullWhenUnsupportedUriScheme() { - DockerClientConfig configuration = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost("gopher://12.23.34.45").build(); - String actual = DockerClientConfigUtils.getDockerHostIpAddress(configuration); + String actual = DockerClientProviderStrategy.resolveDockerHostIpAddress(client, URI.create("gopher://12.23.34.45")); assertNull(actual); } diff --git a/examples/linked-container/build.gradle b/examples/linked-container/build.gradle index dc9f7158e29..dea159a89b5 100644 --- a/examples/linked-container/build.gradle +++ b/examples/linked-container/build.gradle @@ -6,7 +6,7 @@ repositories { jcenter() } dependencies { - compileOnly 'org.slf4j:slf4j-api:1.7.29' + compileOnly 'org.slf4j:slf4j-api:1.7.30' implementation 'com.squareup.okhttp3:okhttp:3.14.4' implementation 'org.json:json:20180813' testImplementation 'org.postgresql:postgresql:42.2.9' diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 12e78729a28..cf22e89c528 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - compileOnly 'org.slf4j:slf4j-api:1.7.29' + compileOnly 'org.slf4j:slf4j-api:1.7.30' implementation 'redis.clients:jedis:3.2.0' implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.google.guava:guava:23.0' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 664a0fac876..b665b9a24a4 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - compileOnly 'org.slf4j:slf4j-api:1.7.29' + compileOnly 'org.slf4j:slf4j-api:1.7.30' implementation 'redis.clients:jedis:3.2.0' implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.google.guava:guava:23.0' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 3b4af328379..b06d4e7cb30 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -11,7 +11,7 @@ dependencies { implementation 'redis.clients:jedis:3.2.0' implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.google.guava:guava:23.0' - compileOnly 'org.slf4j:slf4j-api:1.7.29' + compileOnly 'org.slf4j:slf4j-api:1.7.30' testImplementation 'ch.qos.logback:logback-classic:1.2.3' testImplementation 'org.testcontainers:testcontainers' diff --git a/modules/elasticsearch/build.gradle b/modules/elasticsearch/build.gradle index 9e7ac832916..2201efff48a 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -2,6 +2,6 @@ description = "TestContainers :: elasticsearch" dependencies { compile project(':testcontainers') - testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.5.0" + testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.5.1" testCompile "org.elasticsearch.client:transport:6.7.1" } diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle index 8ff335251a3..18cc5ddfe96 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -7,9 +7,9 @@ dependencies { testCompile project(':mysql') testCompile project(':postgresql') testCompile 'com.zaxxer:HikariCP:3.4.1' - testCompile 'redis.clients:jedis:3.1.0' + testCompile 'redis.clients:jedis:3.2.0' testCompile 'org.apache.httpcomponents:httpclient:4.5.10' - testCompile ('org.mockito:mockito-core:3.2.0') { + testCompile ('org.mockito:mockito-core:3.2.4') { exclude(module: 'hamcrest-core') } diff --git a/modules/kafka/build.gradle b/modules/kafka/build.gradle index d9d7c20ca4a..d064e46c1dc 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Kafka" dependencies { compile project(':testcontainers') - testCompile 'org.apache.kafka:kafka-clients:2.3.1' + testCompile 'org.apache.kafka:kafka-clients:2.4.0' testCompile 'org.assertj:assertj-core:3.14.0' testCompile 'com.google.guava:guava:23.0' } diff --git a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java index ea25bf629e6..ede111ed2d8 100644 --- a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java +++ b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java @@ -263,6 +263,15 @@ public RabbitMQContainer withPolicy(String name, String pattern, Map definition) { + values.add(asList("rabbitmqadmin", "declare", "policy", + "--vhost=" + vhost, + "name=" + name, + "pattern=" + pattern, + "definition=" + toJson(definition))); + return self(); + } + public RabbitMQContainer withPolicy(String name, String pattern, Map definition, int priority, String applyTo) { values.add(asList("rabbitmqadmin", "declare", "policy", "name=" + name, diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java index bdda594818f..5822e213a82 100644 --- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java +++ b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java @@ -154,21 +154,22 @@ public void shouldStartTheWholeEnchilada() throws IOException, InterruptedExcept { try (RabbitMQContainer container = new RabbitMQContainer()) { container - .withVhost("vhost1") - .withVhostLimit("vhost1", "max-connections", 1) - .withVhost("vhost2", true) - .withExchange("direct-exchange", "direct") - .withExchange("topic-exchange", "topic") - .withQueue("queue1") - .withQueue("queue2", true, false, ImmutableMap.of("x-message-ttl", 1000)) - .withBinding("direct-exchange", "queue1") - .withUser("user1", "password1") - .withUser("user2", "password2", ImmutableSet.of("administrator")) - .withPermission("vhost1", "user1", ".*", ".*", ".*") - .withPolicy("max length policy", "^dog", ImmutableMap.of("max-length", 1), 1, "queues") - .withPolicy("alternate exchange policy", "^direct-exchange", ImmutableMap.of("alternate-exchange", "amq.direct")) - .withOperatorPolicy("operator policy 1", "^queue1", ImmutableMap.of("message-ttl", 1000), 1, "queues") - .withPluginsEnabled("rabbitmq_shovel", "rabbitmq_random_exchange"); + .withVhost("vhost1") + .withVhostLimit("vhost1", "max-connections", 1) + .withVhost("vhost2", true) + .withExchange("direct-exchange", "direct") + .withExchange("topic-exchange", "topic") + .withQueue("queue1") + .withQueue("queue2", true, false, ImmutableMap.of("x-message-ttl", 1000)) + .withBinding("direct-exchange", "queue1") + .withUser("user1", "password1") + .withUser("user2", "password2", ImmutableSet.of("administrator")) + .withPermission("vhost1", "user1", ".*", ".*", ".*") + .withPolicy("max length policy", "^dog", ImmutableMap.of("max-length", 1), 1, "queues") + .withPolicy("alternate exchange policy", "^direct-exchange", ImmutableMap.of("alternate-exchange", "amq.direct")) + .withPolicy("vhost2", "ha-all", ".*", ImmutableMap.of("ha-mode", "all", "ha-sync-mode", "automatic")) + .withOperatorPolicy("operator policy 1", "^queue1", ImmutableMap.of("message-ttl", 1000), 1, "queues") + .withPluginsEnabled("rabbitmq_shovel", "rabbitmq_random_exchange"); container.start(); @@ -192,6 +193,10 @@ public void shouldStartTheWholeEnchilada() throws IOException, InterruptedExcept .getStdout()) .contains("max length policy", "alternate exchange policy"); + assertThat(container.execInContainer("rabbitmqadmin", "list", "policies", "--vhost=vhost2") + .getStdout()) + .contains("ha-all", "ha-sync-mode"); + assertThat(container.execInContainer("rabbitmqadmin", "list", "operator_policies") .getStdout()) .contains("operator policy 1"); diff --git a/modules/vault/build.gradle b/modules/vault/build.gradle index 55249f74fb0..0a68c9310e0 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Vault" dependencies { compile project(':testcontainers') - testCompile 'com.bettercloud:vault-java-driver:5.0.0' + testCompile 'com.bettercloud:vault-java-driver:5.1.0' testCompile 'io.rest-assured:rest-assured:4.1.2' testCompile 'org.assertj:assertj-core:3.14.0'