Skip to content

Commit ba25e5d

Browse files
[qdrant] Allow to set key and config file (#8556)
Co-authored-by: Anush008 <[email protected]>
1 parent 8d0cf9b commit ba25e5d

File tree

2 files changed

+90
-16
lines changed

2 files changed

+90
-16
lines changed

modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.testcontainers.containers.GenericContainer;
44
import org.testcontainers.containers.wait.strategy.Wait;
5+
import org.testcontainers.images.builder.Transferable;
56
import org.testcontainers.utility.DockerImageName;
67

78
/**
@@ -12,25 +13,45 @@
1213
* Exposed ports:
1314
* <ul>
1415
* <li>HTTP: 6333</li>
15-
* <li>Grpc: 6334</li>
16+
* <li>GRPC: 6334</li>
1617
* </ul>
1718
*/
1819
public class QdrantContainer extends GenericContainer<QdrantContainer> {
1920

2021
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("qdrant/qdrant");
2122

23+
private static final int QDRANT_REST_PORT = 6333;
24+
25+
private static final int QDRANT_GRPC_PORT = 6334;
26+
27+
private static final String CONFIG_FILE_PATH = "/qdrant/config/config.yaml";
28+
29+
private static final String API_KEY_ENV = "QDRANT__SERVICE__API_KEY";
30+
2231
public QdrantContainer(String image) {
2332
this(DockerImageName.parse(image));
2433
}
2534

2635
public QdrantContainer(DockerImageName dockerImageName) {
2736
super(dockerImageName);
2837
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
29-
withExposedPorts(6333, 6334);
30-
waitingFor(Wait.forHttp("/readyz").forPort(6333));
38+
withExposedPorts(QDRANT_REST_PORT, QDRANT_GRPC_PORT);
39+
waitingFor(Wait.forHttp("/readyz").forPort(QDRANT_REST_PORT));
40+
}
41+
42+
public QdrantContainer withApiKey(String apiKey) {
43+
return withEnv(API_KEY_ENV, apiKey);
44+
}
45+
46+
public QdrantContainer withConfigFile(Transferable configFile) {
47+
return withCopyToContainer(configFile, CONFIG_FILE_PATH);
48+
}
49+
50+
public int getGrpcPort() {
51+
return getMappedPort(QDRANT_GRPC_PORT);
3152
}
3253

3354
public String getGrpcHostAddress() {
34-
return getHost() + ":" + getMappedPort(6334);
55+
return getHost() + ":" + getGrpcPort();
3556
}
3657
}
Lines changed: 65 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,89 @@
11
package org.testcontainers.qdrant;
22

3-
import io.grpc.Grpc;
4-
import io.grpc.InsecureChannelCredentials;
3+
import io.qdrant.client.QdrantClient;
54
import io.qdrant.client.QdrantGrpcClient;
65
import io.qdrant.client.grpc.QdrantOuterClass;
76
import org.junit.Test;
7+
import org.testcontainers.images.builder.Transferable;
88

9+
import java.util.UUID;
910
import java.util.concurrent.ExecutionException;
1011

1112
import static org.assertj.core.api.Assertions.assertThat;
13+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1214

1315
public class QdrantContainerTest {
1416

1517
@Test
16-
public void test() throws ExecutionException, InterruptedException {
18+
public void shouldReturnVersion() throws ExecutionException, InterruptedException {
1719
try (
1820
// qdrantContainer {
1921
QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4")
2022
// }
2123
) {
2224
qdrant.start();
2325

24-
QdrantGrpcClient client = QdrantGrpcClient
25-
.newBuilder(
26-
Grpc.newChannelBuilder(qdrant.getGrpcHostAddress(), InsecureChannelCredentials.create()).build()
27-
)
28-
.build();
29-
QdrantOuterClass.HealthCheckReply healthCheckReply = client
30-
.qdrant()
31-
.healthCheck(QdrantOuterClass.HealthCheckRequest.getDefaultInstance())
32-
.get();
26+
QdrantClient client = new QdrantClient(
27+
QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).build()
28+
);
29+
QdrantOuterClass.HealthCheckReply healthCheckReply = client.healthCheckAsync().get();
3330
assertThat(healthCheckReply.getVersion()).isEqualTo("1.7.4");
31+
32+
client.close();
33+
}
34+
}
35+
36+
@Test
37+
public void shouldSetApiKey() throws ExecutionException, InterruptedException {
38+
String apiKey = UUID.randomUUID().toString();
39+
try (QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4").withApiKey(apiKey)) {
40+
qdrant.start();
41+
42+
final QdrantClient unauthClient = new QdrantClient(
43+
QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).build()
44+
);
45+
46+
assertThatThrownBy(() -> unauthClient.healthCheckAsync().get()).isInstanceOf(ExecutionException.class);
47+
48+
unauthClient.close();
49+
50+
final QdrantClient client = new QdrantClient(
51+
QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).withApiKey(apiKey).build()
52+
);
53+
54+
QdrantOuterClass.HealthCheckReply healthCheckReply = client.healthCheckAsync().get();
55+
assertThat(healthCheckReply.getVersion()).isEqualTo("1.7.4");
56+
57+
client.close();
58+
}
59+
}
60+
61+
@Test
62+
public void shouldSetApiKeyUsingConfigFile() throws ExecutionException, InterruptedException {
63+
String apiKey = UUID.randomUUID().toString();
64+
String configFile = "service:\n api_key: " + apiKey;
65+
try (
66+
QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4")
67+
.withConfigFile(Transferable.of(configFile))
68+
) {
69+
qdrant.start();
70+
71+
final QdrantClient unauthClient = new QdrantClient(
72+
QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).build()
73+
);
74+
75+
assertThatThrownBy(() -> unauthClient.healthCheckAsync().get()).isInstanceOf(ExecutionException.class);
76+
77+
unauthClient.close();
78+
79+
final QdrantClient client = new QdrantClient(
80+
QdrantGrpcClient.newBuilder(qdrant.getHost(), qdrant.getGrpcPort(), false).withApiKey(apiKey).build()
81+
);
82+
83+
QdrantOuterClass.HealthCheckReply healthCheckReply = client.healthCheckAsync().get();
84+
assertThat(healthCheckReply.getVersion()).isEqualTo("1.7.4");
85+
86+
client.close();
3487
}
3588
}
3689
}

0 commit comments

Comments
 (0)