From 2c987eec1bbae7eb4d7469dfa048bd4fae379a92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 21 Feb 2024 13:52:04 -0500 Subject: [PATCH] Add Qdrant module (#8353) Co-authored-by: Anush --- .github/ISSUE_TEMPLATE/bug_report.yaml | 1 + .github/ISSUE_TEMPLATE/enhancement.yaml | 1 + .github/ISSUE_TEMPLATE/feature.yaml | 1 + .github/dependabot.yml | 5 +++ .github/labeler.yml | 4 +++ .github/settings.yml | 3 ++ docs/modules/qdrant.md | 30 ++++++++++++++++ mkdocs.yml | 1 + modules/qdrant/build.gradle | 12 +++++++ .../qdrant/QdrantContainer.java | 36 +++++++++++++++++++ .../qdrant/QdrantContainerTest.java | 36 +++++++++++++++++++ .../src/test/resources/logback-test.xml | 16 +++++++++ 12 files changed, 146 insertions(+) create mode 100644 docs/modules/qdrant.md create mode 100644 modules/qdrant/build.gradle create mode 100644 modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java create mode 100644 modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java create mode 100644 modules/qdrant/src/test/resources/logback-test.xml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index d7c304a2cd4..8d363cb978f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -47,6 +47,7 @@ body: - PostgreSQL - Presto - Pulsar + - Qdrant - QuestDB - RabbitMQ - Redpanda diff --git a/.github/ISSUE_TEMPLATE/enhancement.yaml b/.github/ISSUE_TEMPLATE/enhancement.yaml index 2bc0e8a3e20..6ee160c982b 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yaml +++ b/.github/ISSUE_TEMPLATE/enhancement.yaml @@ -47,6 +47,7 @@ body: - PostgreSQL - Presto - Pulsar + - Qdrant - QuestDB - RabbitMQ - Redpanda diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index 02310b638e1..3f8920b4059 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -45,6 +45,7 @@ body: - Oracle XE - OrientDB - PostgreSQL + - Qdrant - QuestDB - Presto - Pulsar diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 24ced388caf..bf9b145f2b3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -240,6 +240,11 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + - package-ecosystem: "gradle" + directory: "/modules/qdrant" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/questdb" schedule: diff --git a/.github/labeler.yml b/.github/labeler.yml index b7c1aa2ac01..0fd1ec90d29 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -152,6 +152,10 @@ - changed-files: - any-glob-to-any-file: - modules/pulsar/**/* +"modules/qdrant": + - changed-files: + - any-glob-to-any-file: + - modules/qdrant/**/* "modules/questdb": - changed-files: - any-glob-to-any-file: diff --git a/.github/settings.yml b/.github/settings.yml index fdf582198d2..a4589aab643 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -205,6 +205,9 @@ labels: - name: modules/pulsar color: '#006b75' + - name: modules/qdrant + color: '#006b75' + - name: modules/questdb color: '#006b75' diff --git a/docs/modules/qdrant.md b/docs/modules/qdrant.md new file mode 100644 index 00000000000..25aef090c97 --- /dev/null +++ b/docs/modules/qdrant.md @@ -0,0 +1,30 @@ +# Qdrant + +Testcontainers module for [Qdrant](https://registry.hub.docker.com/r/qdrant/qdrant) + +## Qdrant's usage examples + +You can start a Qdrant container instance from any Java application by using: + + +[Default QDrant container](../../modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java) inside_block:qdrantContainer + + +## Adding this module to your project dependencies + +Add the following dependency to your `pom.xml`/`build.gradle` file: + +=== "Gradle" + ```groovy + testImplementation "org.testcontainers:qdrant:{{latest_version}}" + ``` + +=== "Maven" + ```xml + + org.testcontainers + qdrant + {{latest_version}} + test + + ``` diff --git a/mkdocs.yml b/mkdocs.yml index bcd53d294d9..67974735281 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -89,6 +89,7 @@ nav: - modules/mockserver.md - modules/nginx.md - modules/pulsar.md + - modules/qdrant.md - modules/rabbitmq.md - modules/redpanda.md - modules/solace.md diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle new file mode 100644 index 00000000000..cc856e1d970 --- /dev/null +++ b/modules/qdrant/build.gradle @@ -0,0 +1,12 @@ +description = "Testcontainers :: Qdrant" + +dependencies { + api project(':testcontainers') + + testImplementation 'org.assertj:assertj-core:3.25.1' + testImplementation 'io.qdrant:client:1.7.1' + testImplementation platform('io.grpc:grpc-bom:1.61.1') + testImplementation 'io.grpc:grpc-stub' + testImplementation 'io.grpc:grpc-protobuf' + testImplementation 'io.grpc:grpc-netty-shaded' +} diff --git a/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java b/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java new file mode 100644 index 00000000000..341349fe18c --- /dev/null +++ b/modules/qdrant/src/main/java/org/testcontainers/qdrant/QdrantContainer.java @@ -0,0 +1,36 @@ +package org.testcontainers.qdrant; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation for Qdrant. + *

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

+ * Exposed ports: + *

+ */ +public class QdrantContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("qdrant/qdrant"); + + public QdrantContainer(String image) { + this(DockerImageName.parse(image)); + } + + public QdrantContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + withExposedPorts(6333, 6334); + waitingFor(Wait.forHttp("/readyz").forPort(6333)); + } + + public String getGrpcHostAddress() { + return getHost() + ":" + getMappedPort(6334); + } +} diff --git a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java new file mode 100644 index 00000000000..e33582bf552 --- /dev/null +++ b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java @@ -0,0 +1,36 @@ +package org.testcontainers.qdrant; + +import io.grpc.Grpc; +import io.grpc.InsecureChannelCredentials; +import io.qdrant.client.QdrantGrpcClient; +import io.qdrant.client.grpc.QdrantOuterClass; +import org.junit.Test; + +import java.util.concurrent.ExecutionException; + +import static org.assertj.core.api.Assertions.assertThat; + +public class QdrantContainerTest { + + @Test + public void test() throws ExecutionException, InterruptedException { + try ( + // qdrantContainer { + QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4") + // } + ) { + qdrant.start(); + + QdrantGrpcClient client = QdrantGrpcClient + .newBuilder( + Grpc.newChannelBuilder(qdrant.getGrpcHostAddress(), InsecureChannelCredentials.create()).build() + ) + .build(); + QdrantOuterClass.HealthCheckReply healthCheckReply = client + .qdrant() + .healthCheck(QdrantOuterClass.HealthCheckRequest.getDefaultInstance()) + .get(); + assertThat(healthCheckReply.getVersion()).isEqualTo("1.7.4"); + } + } +} diff --git a/modules/qdrant/src/test/resources/logback-test.xml b/modules/qdrant/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..83ef7a1a3ef --- /dev/null +++ b/modules/qdrant/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} %-5level %logger - %msg%n + + + + + + + + +