diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index a140ad15285..216076ee084 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -17,6 +17,7 @@ body: - ActiveMQ - Azure - Cassandra + - ChromaDB - Clickhouse - CockroachDB - Consul diff --git a/.github/ISSUE_TEMPLATE/enhancement.yaml b/.github/ISSUE_TEMPLATE/enhancement.yaml index 7c60044546f..80b20178318 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yaml +++ b/.github/ISSUE_TEMPLATE/enhancement.yaml @@ -17,6 +17,7 @@ body: - ActiveMQ - Azure - Cassandra + - ChromaDB - Clickhouse - CockroachDB - Consul diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index 91c750ef7f8..96af8c19ea7 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -17,6 +17,7 @@ body: - ActiveMQ - Azure - Cassandra + - ChromaDB - Clickhouse - CockroachDB - CrateDB diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7111d36c2a6..4f81e37b26b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -51,6 +51,11 @@ updates: ignore: - dependency-name: "io.dropwizard.metrics:metrics-core" update-types: [ "version-update:semver-major" ] + - package-ecosystem: "gradle" + directory: "/modules/chromadb" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/clickhouse" schedule: diff --git a/.github/labeler.yml b/.github/labeler.yml index 0960bf74461..70e69146d25 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -27,6 +27,10 @@ - changed-files: - any-glob-to-any-file: - modules/cassandra/**/* +"modules/chromadb": + - changed-files: + - any-glob-to-any-file: + - modules/chromadb/**/* "modules/clickhouse": - changed-files: - any-glob-to-any-file: diff --git a/.github/settings.yml b/.github/settings.yml index aa3b62b90fe..12629f2f355 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -115,6 +115,9 @@ labels: - name: modules/cassandra color: '#006b75' + - name: modules/chromadb + color: '#006b75' + - name: modules/clickhouse color: '#006b75' diff --git a/docs/modules/chromadb.md b/docs/modules/chromadb.md new file mode 100644 index 00000000000..9b14dfc2970 --- /dev/null +++ b/docs/modules/chromadb.md @@ -0,0 +1,30 @@ +# ChromaDB + +Testcontainers module for [ChromaDB](https://registry.hub.docker.com/r/chromadb/chroma) + +## ChromaDB's usage examples + +You can start a ChromaDB container instance from any Java application by using: + + +[Default ChromaDB container](../../modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java) inside_block:container + + +## Adding this module to your project dependencies + +Add the following dependency to your `pom.xml`/`build.gradle` file: + +=== "Gradle" +```groovy +testImplementation "org.testcontainers:chromadb:{{latest_version}}" +``` + +=== "Maven" +```xml + +org.testcontainers +chromadb +{{latest_version}} +test + +``` diff --git a/mkdocs.yml b/mkdocs.yml index 86cfd3a823a..cda56106885 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,6 +75,7 @@ nav: - modules/databases/yugabytedb.md - modules/activemq.md - modules/azure.md + - modules/chromadb.md - modules/consul.md - modules/docker_compose.md - modules/elasticsearch.md diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle new file mode 100644 index 00000000000..2b170c21570 --- /dev/null +++ b/modules/chromadb/build.gradle @@ -0,0 +1,8 @@ +description = "Testcontainers :: ChromaDB" + +dependencies { + api project(':testcontainers') + + testImplementation 'org.assertj:assertj-core:3.25.1' + testImplementation 'io.rest-assured:rest-assured:5.4.0' +} diff --git a/modules/chromadb/src/main/java/org/testcontainers/chromadb/ChromaDBContainer.java b/modules/chromadb/src/main/java/org/testcontainers/chromadb/ChromaDBContainer.java new file mode 100644 index 00000000000..a1bccf3904f --- /dev/null +++ b/modules/chromadb/src/main/java/org/testcontainers/chromadb/ChromaDBContainer.java @@ -0,0 +1,34 @@ +package org.testcontainers.chromadb; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation of ChromaDB. + *

+ * Supported images: {@code chromadb/chroma}, {@code ghcr.io/chroma-core/chroma} + *

+ * Exposed ports: 8000 + */ +public class ChromaDBContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_DOCKER_IMAGE = DockerImageName.parse("chromadb/chroma"); + + private static final DockerImageName GHCR_DOCKER_IMAGE = DockerImageName.parse("ghcr.io/chroma-core/chroma"); + + public ChromaDBContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public ChromaDBContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_DOCKER_IMAGE, GHCR_DOCKER_IMAGE); + withExposedPorts(8000); + waitingFor(Wait.forHttp("/api/v1/heartbeat")); + } + + public String getEndpoint() { + return "http://" + getHost() + ":" + getFirstMappedPort(); + } +} diff --git a/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java b/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java new file mode 100644 index 00000000000..945af0dcbff --- /dev/null +++ b/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java @@ -0,0 +1,30 @@ +package org.testcontainers.chromadb; + +import io.restassured.http.ContentType; +import org.junit.Test; + +import static io.restassured.RestAssured.given; + +public class ChromaDBContainerTest { + + @Test + public void test() { + try ( // container { + ChromaDBContainer chroma = new ChromaDBContainer("chromadb/chroma:0.4.22") + // } + ) { + chroma.start(); + + given() + .baseUri(chroma.getEndpoint()) + .when() + .body("{\"name\": \"test\"}") + .contentType(ContentType.JSON) + .post("/api/v1/databases") + .then() + .statusCode(200); + + given().baseUri(chroma.getEndpoint()).when().get("/api/v1/databases/test").then().statusCode(200); + } + } +} diff --git a/modules/chromadb/src/test/resources/logback-test.xml b/modules/chromadb/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..83ef7a1a3ef --- /dev/null +++ b/modules/chromadb/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} %-5level %logger - %msg%n + + + + + + + + +