Skip to content

Commit 0c9833b

Browse files
authored
Add Milvus module (#8352)
1 parent 2c5244d commit 0c9833b

File tree

13 files changed

+205
-0
lines changed

13 files changed

+205
-0
lines changed

.github/ISSUE_TEMPLATE/bug_report.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ body:
3333
- Kafka
3434
- LocalStack
3535
- MariaDB
36+
- Milvus
3637
- MinIO
3738
- MockServer
3839
- MongoDB

.github/ISSUE_TEMPLATE/enhancement.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ body:
3333
- Kafka
3434
- LocalStack
3535
- MariaDB
36+
- Milvus
3637
- MinIO
3738
- MockServer
3839
- MongoDB

.github/ISSUE_TEMPLATE/feature.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ body:
3333
- Kafka
3434
- LocalStack
3535
- MariaDB
36+
- Milvus
3637
- MinIO
3738
- MockServer
3839
- MongoDB

.github/dependabot.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ updates:
166166
ignore:
167167
- dependency-name: "org.mariadb:r2dbc-mariadb"
168168
update-types: [ "version-update:semver-minor" ]
169+
- package-ecosystem: "gradle"
170+
directory: "/modules/milvus"
171+
schedule:
172+
interval: "weekly"
173+
open-pull-requests-limit: 10
169174
- package-ecosystem: "gradle"
170175
directory: "/modules/minio"
171176
schedule:

.github/labeler.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@
9999
- changed-files:
100100
- any-glob-to-any-file:
101101
- modules/mariadb/**/*
102+
"modules/milvus":
103+
- changed-files:
104+
- any-glob-to-any-file:
105+
- modules/milvus/**/*
102106
"modules/minio":
103107
- changed-files:
104108
- any-glob-to-any-file:

.github/settings.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ labels:
169169
- name: modules/mariadb
170170
color: '#006b75'
171171

172+
- name: modules/milvus
173+
color: '#006b75'
174+
172175
- name: modules/minio
173176
color: '#006b75'
174177

docs/modules/milvus.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Milvus
2+
3+
Testcontainers module for [Milvus](https://hub.docker.com/r/milvusdb/milvus).
4+
5+
## Milvus's usage examples
6+
7+
You can start a Milvus container instance from any Java application by using:
8+
9+
<!--codeinclude-->
10+
[Default config](../../modules/milvus/src/test/java/org/testcontainers/milvus/MilvusContainerTest.java) inside_block:milvusContainer
11+
<!--/codeinclude-->
12+
13+
With external Etcd:
14+
15+
<!--codeinclude-->
16+
[External Etcd](../../modules/milvus/src/test/java/org/testcontainers/milvus/MilvusContainerTest.java) inside_block:externalEtcd
17+
<!--/codeinclude-->
18+
19+
## Adding this module to your project dependencies
20+
21+
Add the following dependency to your `pom.xml`/`build.gradle` file:
22+
23+
=== "Gradle"
24+
```groovy
25+
testImplementation "org.testcontainers:milvus:{{latest_version}}"
26+
```
27+
28+
=== "Maven"
29+
```xml
30+
<dependency>
31+
<groupId>org.testcontainers</groupId>
32+
<artifactId>milvus</artifactId>
33+
<version>{{latest_version}}</version>
34+
<scope>test</scope>
35+
</dependency>
36+
```

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ nav:
8484
- modules/k3s.md
8585
- modules/kafka.md
8686
- modules/localstack.md
87+
- modules/milvus.md
8788
- modules/minio.md
8889
- modules/mockserver.md
8990
- modules/nginx.md

modules/milvus/build.gradle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
description = "Testcontainers :: ActiveMQ"
2+
3+
dependencies {
4+
api project(':testcontainers')
5+
6+
testImplementation 'org.assertj:assertj-core:3.25.1'
7+
testImplementation 'io.milvus:milvus-sdk-java:2.3.4'
8+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.testcontainers.milvus;
2+
3+
import org.testcontainers.containers.GenericContainer;
4+
import org.testcontainers.containers.wait.strategy.Wait;
5+
import org.testcontainers.utility.DockerImageName;
6+
import org.testcontainers.utility.MountableFile;
7+
8+
/**
9+
* Testcontainers implementation for Milvus.
10+
* <p>
11+
* Supported image: {@code milvusdb/milvus}
12+
* <p>
13+
* Exposed ports:
14+
* <ul>
15+
* <li>Management port: 9091</li>
16+
* <li>HTTP: 19530</li>
17+
* </ul>
18+
*/
19+
public class MilvusContainer extends GenericContainer<MilvusContainer> {
20+
21+
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("milvusdb/milvus");
22+
23+
private String etcdEndpoint;
24+
25+
public MilvusContainer(String image) {
26+
this(DockerImageName.parse(image));
27+
}
28+
29+
public MilvusContainer(DockerImageName dockerImageName) {
30+
super(dockerImageName);
31+
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
32+
withExposedPorts(9091, 19530);
33+
waitingFor(Wait.forHttp("/healthz").forPort(9091));
34+
withCommand("milvus", "run", "standalone");
35+
withCopyFileToContainer(
36+
MountableFile.forClasspathResource("testcontainers/embedEtcd.yaml"),
37+
"/milvus/configs/embedEtcd.yaml"
38+
);
39+
withEnv("COMMON_STORAGETYPE", "local");
40+
}
41+
42+
@Override
43+
protected void configure() {
44+
if (this.etcdEndpoint == null) {
45+
withEnv("ETCD_USE_EMBED", "true");
46+
withEnv("ETCD_DATA_DIR", "/var/lib/milvus/etcd");
47+
withEnv("ETCD_CONFIG_PATH", "/milvus/configs/embedEtcd.yaml");
48+
} else {
49+
withEnv("ETCD_ENDPOINTS", this.etcdEndpoint);
50+
}
51+
}
52+
53+
public MilvusContainer withEtcdEndpoint(String etcdEndpoint) {
54+
this.etcdEndpoint = etcdEndpoint;
55+
return this;
56+
}
57+
58+
public String getEndpoint() {
59+
return "http://" + getHost() + ":" + getMappedPort(19530);
60+
}
61+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
listen-client-urls: http://0.0.0.0:2379
2+
advertise-client-urls: http://0.0.0.0:2379
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.testcontainers.milvus;
2+
3+
import io.milvus.client.MilvusServiceClient;
4+
import io.milvus.param.ConnectParam;
5+
import org.junit.Test;
6+
import org.testcontainers.containers.GenericContainer;
7+
import org.testcontainers.containers.Network;
8+
import org.testcontainers.containers.wait.strategy.Wait;
9+
10+
import static org.assertj.core.api.Assertions.assertThat;
11+
12+
public class MilvusContainerTest {
13+
14+
@Test
15+
public void withDefaultConfig() {
16+
try (
17+
// milvusContainer {
18+
MilvusContainer milvus = new MilvusContainer("milvusdb/milvus:v2.3.9")
19+
// }
20+
) {
21+
milvus.start();
22+
23+
assertThat(milvus.getEnvMap()).doesNotContainKey("ETCD_ENDPOINTS");
24+
assertMilvusVersion(milvus);
25+
}
26+
}
27+
28+
@Test
29+
public void withExternalEtcd() {
30+
try (
31+
// externalEtcd {
32+
Network network = Network.newNetwork();
33+
GenericContainer<?> etcd = new GenericContainer<>("quay.io/coreos/etcd:v3.5.5")
34+
.withNetwork(network)
35+
.withNetworkAliases("etcd")
36+
.withCommand(
37+
"etcd",
38+
"-advertise-client-urls=http://127.0.0.1:2379",
39+
"-listen-client-urls=http://0.0.0.0:2379",
40+
"--data-dir=/etcd"
41+
)
42+
.withEnv("ETCD_AUTO_COMPACTION_MODE", "revision")
43+
.withEnv("ETCD_AUTO_COMPACTION_RETENTION", "1000")
44+
.withEnv("ETCD_QUOTA_BACKEND_BYTES", "4294967296")
45+
.withEnv("ETCD_SNAPSHOT_COUNT", "50000")
46+
.waitingFor(Wait.forLogMessage(".*ready to serve client requests.*", 1));
47+
MilvusContainer milvus = new MilvusContainer("milvusdb/milvus:v2.3.9")
48+
.withNetwork(network)
49+
.withEtcdEndpoint("etcd:2379")
50+
.dependsOn(etcd)
51+
// }
52+
) {
53+
milvus.start();
54+
55+
assertThat(milvus.getEnvMap()).doesNotContainKey("ETCD_USE_EMBED");
56+
assertMilvusVersion(milvus);
57+
}
58+
}
59+
60+
private static void assertMilvusVersion(MilvusContainer milvus) {
61+
MilvusServiceClient milvusClient = new MilvusServiceClient(
62+
ConnectParam.newBuilder().withUri(milvus.getEndpoint()).build()
63+
);
64+
assertThat(milvusClient.getVersion().getData().getVersion()).isEqualTo("v2.3.9");
65+
}
66+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<configuration>
2+
3+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
4+
<!-- encoders are assigned the type
5+
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
6+
<encoder>
7+
<pattern>%d{HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
8+
</encoder>
9+
</appender>
10+
11+
<root level="INFO">
12+
<appender-ref ref="STDOUT"/>
13+
</root>
14+
15+
<logger name="org.testcontainers" level="INFO"/>
16+
</configuration>

0 commit comments

Comments
 (0)