diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index fed1e5d8766..9ee3683f331 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -50,6 +50,7 @@ body: - Oracle Free - Oracle XE - OrientDB + - Pinecone - PostgreSQL - Presto - Pulsar diff --git a/.github/ISSUE_TEMPLATE/enhancement.yaml b/.github/ISSUE_TEMPLATE/enhancement.yaml index c89fc29208c..5dcbcc35cbd 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yaml +++ b/.github/ISSUE_TEMPLATE/enhancement.yaml @@ -50,6 +50,7 @@ body: - Oracle Free - Oracle XE - OrientDB + - Pinecone - PostgreSQL - Presto - Pulsar diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index aa9bf4e7777..9975d31f51e 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -50,6 +50,7 @@ body: - Oracle Free - Oracle XE - OrientDB + - Pinecone - PostgreSQL - Qdrant - QuestDB diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 17dd0e2aa05..e845f9bdc6c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -274,6 +274,11 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + - package-ecosystem: "gradle" + directory: "/modules/pinecone" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/pulsar" schedule: diff --git a/.github/labeler.yml b/.github/labeler.yml index 537f40a944b..613da38298c 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -168,6 +168,10 @@ - changed-files: - any-glob-to-any-file: - modules/orientdb/**/* +"modules/pinecone": + - changed-files: + - any-glob-to-any-file: + - modules/pinecone/**/* "modules/postgres": - changed-files: - any-glob-to-any-file: diff --git a/.github/settings.yml b/.github/settings.yml index cc9f477b19d..35266397a60 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -211,6 +211,9 @@ labels: - name: modules/orientdb color: '#006b75' + - name: modules/pinecone + color: '#006b75' + - name: modules/postgres color: '#006b75' diff --git a/docs/modules/pinecone.md b/docs/modules/pinecone.md new file mode 100644 index 00000000000..77feaadcf4c --- /dev/null +++ b/docs/modules/pinecone.md @@ -0,0 +1,30 @@ +# Pinecone + +Testcontainers module for [Pinecone](https://github.com/orgs/pinecone-io/packages/container/package/pinecone-local). + +## PineconeContainer's usage examples + +You can start an Pinecone container instance from any Java application by using: + + +[Pinecone container](../../modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeContainerTest.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:pinecone:{{latest_version}}" +``` + +=== "Maven" +```xml + + org.testcontainers + pinecone + {{latest_version}} + test + +``` diff --git a/mkdocs.yml b/mkdocs.yml index c308128969b..0e7597b62e5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -95,6 +95,7 @@ nav: - modules/nginx.md - modules/ollama.md - modules/openfga.md + - modules/pinecone.md - modules/pulsar.md - modules/qdrant.md - modules/rabbitmq.md diff --git a/modules/pinecone/build.gradle b/modules/pinecone/build.gradle new file mode 100644 index 00000000000..a78b81a3902 --- /dev/null +++ b/modules/pinecone/build.gradle @@ -0,0 +1,8 @@ +description = "Testcontainers :: ActiveMQ" + +dependencies { + api project(':testcontainers') + + testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'io.pinecone:pinecone-client:3.1.0' +} diff --git a/modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeContainer.java b/modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeContainer.java new file mode 100644 index 00000000000..845b62aa075 --- /dev/null +++ b/modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeContainer.java @@ -0,0 +1,34 @@ +package org.testcontainers.pinecone; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation for Pinecone. + *

+ * Exposed port: 5080 + */ +public class PineconeContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( + "ghcr.io/pinecone-io/pinecone-local" + ); + + private static final int PORT = 5080; + + public PineconeContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public PineconeContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + withEnv("PORT", String.valueOf(5080)); + withExposedPorts(5080); + } + + public String getEndpoint() { + return "http://" + getHost() + ":" + getMappedPort(PORT); + } +} diff --git a/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeContainerTest.java b/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeContainerTest.java new file mode 100644 index 00000000000..0e8f2778605 --- /dev/null +++ b/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeContainerTest.java @@ -0,0 +1,33 @@ +package org.testcontainers.pinecone; + +import io.pinecone.clients.Pinecone; +import org.junit.Test; +import org.openapitools.db_control.client.model.DeletionProtection; +import org.openapitools.db_control.client.model.IndexModel; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PineconeContainerTest { + + @Test + public void testSimple() { + try ( // container { + PineconeContainer container = new PineconeContainer("ghcr.io/pinecone-io/pinecone-local:v0.7.0") + // } + ) { + container.start(); + + // client { + Pinecone pinecone = new Pinecone.Builder("pclocal") + .withHost(container.getEndpoint()) + .withTlsEnabled(false) + .build(); + // } + + String indexName = "example-index"; + pinecone.createServerlessIndex(indexName, "cosine", 2, "aws", "us-east-1", DeletionProtection.DISABLED); + IndexModel indexModel = pinecone.describeIndex(indexName); + assertThat(indexModel.getDeletionProtection()).isEqualTo(DeletionProtection.DISABLED); + } + } +} diff --git a/modules/pinecone/src/test/resources/logback-test.xml b/modules/pinecone/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..83ef7a1a3ef --- /dev/null +++ b/modules/pinecone/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} %-5level %logger - %msg%n + + + + + + + + +