From d6767c9095c6896c5fafc00e2ca69fe872fcfe8d Mon Sep 17 00:00:00 2001 From: Anush008 Date: Wed, 13 Mar 2024 11:24:00 +0530 Subject: [PATCH 1/5] refactor: Qdrant module --- .../qdrant/QdrantContainer.java | 48 +++++++++++++++---- .../qdrant/QdrantContainerTest.java | 45 ++++++++++++----- 2 files changed, 73 insertions(+), 20 deletions(-) diff --git a/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java b/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java index 341349fe18c..51832314b8b 100644 --- a/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java +++ b/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java @@ -3,22 +3,32 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.MountableFile; /** * Testcontainers implementation for Qdrant. - *

- * Supported image: {@code qdrant/qdrant} - *

- * Exposed ports: + * + *

Supported image: {@code qdrant/qdrant} + * + *

Exposed ports: + * *

*/ public class QdrantContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("qdrant/qdrant"); + private final int QDRANT_REST_PORT = 6333; + + private final int QDRANT_GRPC_PORT = 6334; + + private final String CONFIG_FILE_PATH = "/qdrant/config/config.yaml"; + + private final String API_KEY_ENV = "QDRANT__SERVICE__API_KEY"; + public QdrantContainer(String image) { this(DockerImageName.parse(image)); } @@ -26,11 +36,31 @@ public QdrantContainer(String image) { public QdrantContainer(DockerImageName dockerImageName) { super(dockerImageName); dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); - withExposedPorts(6333, 6334); - waitingFor(Wait.forHttp("/readyz").forPort(6333)); + withExposedPorts(QDRANT_REST_PORT, QDRANT_GRPC_PORT); + waitingFor(Wait.forHttp("/readyz").forPort(QDRANT_REST_PORT)); + } + + public QdrantContainer withApiKey(String apiKey) { + return withEnv(API_KEY_ENV, apiKey); + } + + public QdrantContainer withConfigFile(MountableFile configFile) { + return withCopyFileToContainer(configFile, CONFIG_FILE_PATH); + } + + public int getRestPort() { + return getMappedPort(QDRANT_REST_PORT); + } + + public int getGrpcPort() { + return getMappedPort(QDRANT_GRPC_PORT); + } + + public String getRestHostAddress() { + return getHost() + ":" + getRestPort(); } public String getGrpcHostAddress() { - return getHost() + ":" + getMappedPort(6334); + return getHost() + ":" + getGrpcPort(); } } diff --git a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java index e33582bf552..1ee9983f259 100644 --- a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java +++ b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java @@ -1,14 +1,15 @@ package org.testcontainers.qdrant; -import io.grpc.Grpc; -import io.grpc.InsecureChannelCredentials; +import io.qdrant.client.QdrantClient; import io.qdrant.client.QdrantGrpcClient; import io.qdrant.client.grpc.QdrantOuterClass; import org.junit.Test; +import java.util.UUID; import java.util.concurrent.ExecutionException; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertThrows; public class QdrantContainerTest { @@ -21,16 +22,38 @@ public void test() throws ExecutionException, InterruptedException { ) { qdrant.start(); - QdrantGrpcClient client = QdrantGrpcClient - .newBuilder( - Grpc.newChannelBuilder(qdrant.getGrpcHostAddress(), InsecureChannelCredentials.create()).build() - ) - .build(); - QdrantOuterClass.HealthCheckReply healthCheckReply = client - .qdrant() - .healthCheck(QdrantOuterClass.HealthCheckRequest.getDefaultInstance()) - .get(); + QdrantClient client = new QdrantClient( + QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).build() + ); + QdrantOuterClass.HealthCheckReply healthCheckReply = client.healthCheckAsync().get(); assertThat(healthCheckReply.getVersion()).isEqualTo("1.7.4"); + + client.close(); + } + } + + @Test + public void testApiKey() throws ExecutionException, InterruptedException { + String apiKey = UUID.randomUUID().toString(); + try (QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4").withApiKey(apiKey);) { + qdrant.start(); + + final QdrantClient unauthClient = new QdrantClient( + QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).build() + ); + + assertThrows(ExecutionException.class, () -> unauthClient.healthCheckAsync().get()); + + unauthClient.close(); + + final QdrantClient client = new QdrantClient( + QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).withApiKey(apiKey).build() + ); + + QdrantOuterClass.HealthCheckReply healthCheckReply = client.healthCheckAsync().get(); + assertThat(healthCheckReply.getVersion()).isEqualTo("1.7.4"); + + client.close(); } } } From 7dcb0340bb5b46d8c4f6f2981a310d3067f912f6 Mon Sep 17 00:00:00 2001 From: Anush Date: Thu, 14 Mar 2024 11:07:11 +0530 Subject: [PATCH 2/5] chore: getHttpPort() QdrantContainer.java --- .../main/java/org/testcontainers/qdrant/QdrantContainer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java b/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java index 51832314b8b..da991dbf265 100644 --- a/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java +++ b/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java @@ -48,7 +48,7 @@ public QdrantContainer withConfigFile(MountableFile configFile) { return withCopyFileToContainer(configFile, CONFIG_FILE_PATH); } - public int getRestPort() { + public int getHttpPort() { return getMappedPort(QDRANT_REST_PORT); } @@ -57,7 +57,7 @@ public int getGrpcPort() { } public String getRestHostAddress() { - return getHost() + ":" + getRestPort(); + return getHost() + ":" + getHttpPort(); } public String getGrpcHostAddress() { From 215af26f548e8ca8439ed9c789b277aa8b8422e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 14 Mar 2024 16:04:03 -0600 Subject: [PATCH 3/5] Apply suggestions from code review --- .../java/org/testcontainers/qdrant/QdrantContainerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java index 1ee9983f259..55f6559f001 100644 --- a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java +++ b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java @@ -35,7 +35,7 @@ public void test() throws ExecutionException, InterruptedException { @Test public void testApiKey() throws ExecutionException, InterruptedException { String apiKey = UUID.randomUUID().toString(); - try (QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4").withApiKey(apiKey);) { + try (QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4").withApiKey(apiKey)) { qdrant.start(); final QdrantClient unauthClient = new QdrantClient( From 1616aa9aa271cf7cf3b2c6dc8bf3f5c8f5815dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 18 Apr 2024 12:18:53 -0500 Subject: [PATCH 4/5] Polish --- .../qdrant/QdrantContainer.java | 35 +++++++------------ .../qdrant/QdrantContainerTest.java | 34 ++++++++++++++++-- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java b/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java index da991dbf265..e00ac541d48 100644 --- a/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java +++ b/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java @@ -2,32 +2,31 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.images.builder.Transferable; import org.testcontainers.utility.DockerImageName; -import org.testcontainers.utility.MountableFile; /** * Testcontainers implementation for Qdrant. - * - *

Supported image: {@code qdrant/qdrant} - * - *

Exposed ports: - * + *

+ * Supported image: {@code qdrant/qdrant} + *

+ * Exposed ports: *

    - *
  • HTTP: 6333 - *
  • GRPC: 6334 + *
  • HTTP: 6333
  • + *
  • GRPC: 6334
  • *
*/ public class QdrantContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("qdrant/qdrant"); - private final int QDRANT_REST_PORT = 6333; + private static final int QDRANT_REST_PORT = 6333; - private final int QDRANT_GRPC_PORT = 6334; + private static final int QDRANT_GRPC_PORT = 6334; - private final String CONFIG_FILE_PATH = "/qdrant/config/config.yaml"; + private static final String CONFIG_FILE_PATH = "/qdrant/config/config.yaml"; - private final String API_KEY_ENV = "QDRANT__SERVICE__API_KEY"; + private static final String API_KEY_ENV = "QDRANT__SERVICE__API_KEY"; public QdrantContainer(String image) { this(DockerImageName.parse(image)); @@ -44,22 +43,14 @@ public QdrantContainer withApiKey(String apiKey) { return withEnv(API_KEY_ENV, apiKey); } - public QdrantContainer withConfigFile(MountableFile configFile) { - return withCopyFileToContainer(configFile, CONFIG_FILE_PATH); - } - - public int getHttpPort() { - return getMappedPort(QDRANT_REST_PORT); + public QdrantContainer withConfigFile(Transferable configFile) { + return withCopyToContainer(configFile, CONFIG_FILE_PATH); } public int getGrpcPort() { return getMappedPort(QDRANT_GRPC_PORT); } - public String getRestHostAddress() { - return getHost() + ":" + getHttpPort(); - } - public String getGrpcHostAddress() { return getHost() + ":" + getGrpcPort(); } diff --git a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java index 55f6559f001..ef5ca45fb58 100644 --- a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java +++ b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java @@ -4,6 +4,7 @@ import io.qdrant.client.QdrantGrpcClient; import io.qdrant.client.grpc.QdrantOuterClass; import org.junit.Test; +import org.testcontainers.images.builder.Transferable; import java.util.UUID; import java.util.concurrent.ExecutionException; @@ -14,7 +15,7 @@ public class QdrantContainerTest { @Test - public void test() throws ExecutionException, InterruptedException { + public void shouldReturnVersion() throws ExecutionException, InterruptedException { try ( // qdrantContainer { QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4") @@ -33,7 +34,7 @@ public void test() throws ExecutionException, InterruptedException { } @Test - public void testApiKey() throws ExecutionException, InterruptedException { + public void shouldSetApiKey() throws ExecutionException, InterruptedException { String apiKey = UUID.randomUUID().toString(); try (QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4").withApiKey(apiKey)) { qdrant.start(); @@ -56,4 +57,33 @@ public void testApiKey() throws ExecutionException, InterruptedException { client.close(); } } + + @Test + public void shouldSetApiKeyUsingConfigFile() throws ExecutionException, InterruptedException { + String apiKey = UUID.randomUUID().toString(); + String configFile = "service:\n api_key: " + apiKey; + try ( + QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4") + .withConfigFile(Transferable.of(configFile)) + ) { + qdrant.start(); + + final QdrantClient unauthClient = new QdrantClient( + QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).build() + ); + + assertThrows(ExecutionException.class, () -> unauthClient.healthCheckAsync().get()); + + unauthClient.close(); + + final QdrantClient client = new QdrantClient( + QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).withApiKey(apiKey).build() + ); + + QdrantOuterClass.HealthCheckReply healthCheckReply = client.healthCheckAsync().get(); + assertThat(healthCheckReply.getVersion()).isEqualTo("1.7.4"); + + client.close(); + } + } } From 36cc265d33f2414556276cc76357b9e3ea61cc26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 18 Apr 2024 14:10:56 -0500 Subject: [PATCH 5/5] Fix checkstyle --- .../java/org/testcontainers/qdrant/QdrantContainerTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java index ef5ca45fb58..d313a873d26 100644 --- a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java +++ b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java @@ -10,7 +10,7 @@ import java.util.concurrent.ExecutionException; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertThrows; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class QdrantContainerTest { @@ -43,7 +43,7 @@ public void shouldSetApiKey() throws ExecutionException, InterruptedException { QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).build() ); - assertThrows(ExecutionException.class, () -> unauthClient.healthCheckAsync().get()); + assertThatThrownBy(() -> unauthClient.healthCheckAsync().get()).isInstanceOf(ExecutionException.class); unauthClient.close(); @@ -72,7 +72,7 @@ public void shouldSetApiKeyUsingConfigFile() throws ExecutionException, Interrup QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).build() ); - assertThrows(ExecutionException.class, () -> unauthClient.healthCheckAsync().get()); + assertThatThrownBy(() -> unauthClient.healthCheckAsync().get()).isInstanceOf(ExecutionException.class); unauthClient.close();