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
+
+
+
+
+
+
+
+
+