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..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,6 +2,7 @@
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.images.builder.Transferable;
import org.testcontainers.utility.DockerImageName;
/**
@@ -12,13 +13,21 @@
* Exposed ports:
*
* - HTTP: 6333
- * - Grpc: 6334
+ * - GRPC: 6334
*
*/
public class QdrantContainer extends GenericContainer {
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("qdrant/qdrant");
+ private static final int QDRANT_REST_PORT = 6333;
+
+ private static final int QDRANT_GRPC_PORT = 6334;
+
+ private static final String CONFIG_FILE_PATH = "/qdrant/config/config.yaml";
+
+ private static final String API_KEY_ENV = "QDRANT__SERVICE__API_KEY";
+
public QdrantContainer(String image) {
this(DockerImageName.parse(image));
}
@@ -26,11 +35,23 @@ 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(Transferable configFile) {
+ return withCopyToContainer(configFile, CONFIG_FILE_PATH);
+ }
+
+ public int getGrpcPort() {
+ return getMappedPort(QDRANT_GRPC_PORT);
}
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..d313a873d26 100644
--- a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java
+++ b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java
@@ -1,19 +1,21 @@
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 org.testcontainers.images.builder.Transferable;
+import java.util.UUID;
import java.util.concurrent.ExecutionException;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
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")
@@ -21,16 +23,67 @@ 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 shouldSetApiKey() 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()
+ );
+
+ assertThatThrownBy(() -> unauthClient.healthCheckAsync().get()).isInstanceOf(ExecutionException.class);
+
+ 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();
+ }
+ }
+
+ @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()
+ );
+
+ assertThatThrownBy(() -> unauthClient.healthCheckAsync().get()).isInstanceOf(ExecutionException.class);
+
+ 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();
}
}
}