From 6983a3987122134fc2227014793bf3609abc5cf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 17 May 2024 17:13:37 -0600 Subject: [PATCH] Add Docker Compose Service Connection for Weaviate --- ...DockerComposeConnectionDetailsFactory.java | 64 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 +- ...rComposeConnectionDetailsFactoryTests.java | 22 +++++++ .../connection/weaviate/weaviate-compose.yaml | 5 ++ 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 spring-ai-spring-boot-docker-compose/src/main/java/org/springframework/ai/docker/compose/service/connection/weaviate/WeaviateDockerComposeConnectionDetailsFactory.java create mode 100644 spring-ai-spring-boot-docker-compose/src/test/java/org/springframework/ai/docker/compose/service/connection/weaviate/WeaviateDockerComposeConnectionDetailsFactoryTests.java create mode 100644 spring-ai-spring-boot-docker-compose/src/test/resources/org/springframework/ai/docker/compose/service/connection/weaviate/weaviate-compose.yaml diff --git a/spring-ai-spring-boot-docker-compose/src/main/java/org/springframework/ai/docker/compose/service/connection/weaviate/WeaviateDockerComposeConnectionDetailsFactory.java b/spring-ai-spring-boot-docker-compose/src/main/java/org/springframework/ai/docker/compose/service/connection/weaviate/WeaviateDockerComposeConnectionDetailsFactory.java new file mode 100644 index 0000000000..54856bd2d6 --- /dev/null +++ b/spring-ai-spring-boot-docker-compose/src/main/java/org/springframework/ai/docker/compose/service/connection/weaviate/WeaviateDockerComposeConnectionDetailsFactory.java @@ -0,0 +1,64 @@ +/* + * Copyright 2023 - 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.ai.docker.compose.service.connection.weaviate; + +import org.springframework.ai.autoconfigure.vectorstore.weaviate.WeaviateConnectionDetails; +import org.springframework.boot.docker.compose.core.RunningService; +import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; +import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; + +/** + * @author EddĂș MelĂ©ndez + */ +class WeaviateDockerComposeConnectionDetailsFactory + extends DockerComposeConnectionDetailsFactory { + + private static final String[] WEAVIATE_CONTAINER_NAMES = { "semitechnologies/weaviate", + "cr.weaviate.io/semitechnologies/weaviate" }; + + private static final int WEAVIATE_PORT = 8080; + + protected WeaviateDockerComposeConnectionDetailsFactory() { + super(WEAVIATE_CONTAINER_NAMES); + } + + @Override + protected WeaviateConnectionDetails getDockerComposeConnectionDetails(DockerComposeConnectionSource source) { + return new WeaviateDockerComposeConnectionDetails(source.getRunningService()); + } + + /** + * {@link WeaviateConnectionDetails} backed by a {@code Weaviate} + * {@link RunningService}. + */ + static class WeaviateDockerComposeConnectionDetails extends DockerComposeConnectionDetails + implements WeaviateConnectionDetails { + + private final String host; + + WeaviateDockerComposeConnectionDetails(RunningService service) { + super(service); + this.host = service.host() + ":" + service.ports().get(WEAVIATE_PORT); + } + + @Override + public String getHost() { + return this.host; + } + + } + +} diff --git a/spring-ai-spring-boot-docker-compose/src/main/resources/META-INF/spring.factories b/spring-ai-spring-boot-docker-compose/src/main/resources/META-INF/spring.factories index 0fd5833500..e4b30377e7 100644 --- a/spring-ai-spring-boot-docker-compose/src/main/resources/META-INF/spring.factories +++ b/spring-ai-spring-boot-docker-compose/src/main/resources/META-INF/spring.factories @@ -2,4 +2,5 @@ org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFacto org.springframework.ai.docker.compose.service.connection.chroma.ChromaDockerComposeConnectionDetailsFactory,\ org.springframework.ai.docker.compose.service.connection.ollama.OllamaDockerComposeConnectionDetailsFactory,\ org.springframework.ai.docker.compose.service.connection.qdrant.QdrantDockerComposeConnectionDetailsFactory,\ -org.springframework.ai.docker.compose.service.connection.redis.RedisDockerComposeConnectionDetailsFactory \ No newline at end of file +org.springframework.ai.docker.compose.service.connection.redis.RedisDockerComposeConnectionDetailsFactory,\ +org.springframework.ai.docker.compose.service.connection.weaviate.WeaviateDockerComposeConnectionDetailsFactory \ No newline at end of file diff --git a/spring-ai-spring-boot-docker-compose/src/test/java/org/springframework/ai/docker/compose/service/connection/weaviate/WeaviateDockerComposeConnectionDetailsFactoryTests.java b/spring-ai-spring-boot-docker-compose/src/test/java/org/springframework/ai/docker/compose/service/connection/weaviate/WeaviateDockerComposeConnectionDetailsFactoryTests.java new file mode 100644 index 0000000000..9895d0957a --- /dev/null +++ b/spring-ai-spring-boot-docker-compose/src/test/java/org/springframework/ai/docker/compose/service/connection/weaviate/WeaviateDockerComposeConnectionDetailsFactoryTests.java @@ -0,0 +1,22 @@ +package org.springframework.ai.docker.compose.service.connection.weaviate; + +import org.junit.jupiter.api.Test; +import org.springframework.ai.autoconfigure.vectorstore.weaviate.WeaviateConnectionDetails; +import org.springframework.boot.docker.compose.service.connection.test.AbstractDockerComposeIntegrationTests; +import org.testcontainers.utility.DockerImageName; + +import static org.assertj.core.api.Assertions.assertThat; + +class WeaviateDockerComposeConnectionDetailsFactoryTests extends AbstractDockerComposeIntegrationTests { + + WeaviateDockerComposeConnectionDetailsFactoryTests() { + super("weaviate-compose.yaml", DockerImageName.parse("semitechnologies/weaviate")); + } + + @Test + void runCreatesConnectionDetails() { + WeaviateConnectionDetails connectionDetails = run(WeaviateConnectionDetails.class); + assertThat(connectionDetails.getHost()).isNotNull(); + } + +} diff --git a/spring-ai-spring-boot-docker-compose/src/test/resources/org/springframework/ai/docker/compose/service/connection/weaviate/weaviate-compose.yaml b/spring-ai-spring-boot-docker-compose/src/test/resources/org/springframework/ai/docker/compose/service/connection/weaviate/weaviate-compose.yaml new file mode 100644 index 0000000000..823b89629d --- /dev/null +++ b/spring-ai-spring-boot-docker-compose/src/test/resources/org/springframework/ai/docker/compose/service/connection/weaviate/weaviate-compose.yaml @@ -0,0 +1,5 @@ +services: + weaviate: + image: '{imageName}' + ports: + - '8080'