Skip to content

Commit 8aed123

Browse files
rojiHofmeisterAn
andauthored
feat: Add Milvus module (#1131)
Co-authored-by: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com>
1 parent 2131fbd commit 8aed123

12 files changed

+313
-0
lines changed

Directory.Packages.props

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
<PackageVersion Include="Microsoft.Azure.Cosmos" Version="3.32.1"/>
4848
<PackageVersion Include="Microsoft.Azure.Kusto.Data" Version="11.3.3"/>
4949
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.1.3"/>
50+
<PackageVersion Include="Milvus.Client" Version="2.2.2-preview.6"/>
5051
<PackageVersion Include="MongoDB.Driver" Version="2.19.0"/>
5152
<PackageVersion Include="MyCouch" Version="7.6.0"/>
5253
<PackageVersion Include="MySqlConnector" Version="2.2.5"/>

Testcontainers.sln

+14
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.LocalStack",
6363
EndProject
6464
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.MariaDb", "src\Testcontainers.MariaDb\Testcontainers.MariaDb.csproj", "{4B204EB3-C478-422E-9B6F-62DF3871291A}"
6565
EndProject
66+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Milvus", "src\Testcontainers.Milvus\Testcontainers.Milvus.csproj", "{B024E315-831F-429D-92AA-44B839AC10F4}"
67+
EndProject
6668
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Minio", "src\Testcontainers.Minio\Testcontainers.Minio.csproj", "{1266E1E6-5CEF-4161-8B45-83282455746E}"
6769
EndProject
6870
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.MongoDb", "src\Testcontainers.MongoDb\Testcontainers.MongoDb.csproj", "{2613F146-6C66-4059-9D37-D48BA6B61515}"
@@ -151,6 +153,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.LocalStack.T
151153
EndProject
152154
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.MariaDb.Tests", "tests\Testcontainers.MariaDb.Tests\Testcontainers.MariaDb.Tests.csproj", "{7F0AE083-9DB8-4BD4-91F7-C199DCC7301D}"
153155
EndProject
156+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Milvus.Tests", "tests\Testcontainers.Milvus.Tests\Testcontainers.Milvus.Tests.csproj", "{5247DF94-32F3-4ED6-AE71-6AB4F4078E6D}"
157+
EndProject
154158
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Minio.Tests", "tests\Testcontainers.Minio.Tests\Testcontainers.Minio.Tests.csproj", "{5DB1F35F-B714-4B62-84BE-16A33084D3E1}"
155159
EndProject
156160
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.MongoDb.Tests", "tests\Testcontainers.MongoDb.Tests\Testcontainers.MongoDb.Tests.csproj", "{82A7E7B8-3187-4CAE-845B-0BF43409B38A}"
@@ -300,6 +304,10 @@ Global
300304
{4B204EB3-C478-422E-9B6F-62DF3871291A}.Debug|Any CPU.Build.0 = Debug|Any CPU
301305
{4B204EB3-C478-422E-9B6F-62DF3871291A}.Release|Any CPU.ActiveCfg = Release|Any CPU
302306
{4B204EB3-C478-422E-9B6F-62DF3871291A}.Release|Any CPU.Build.0 = Release|Any CPU
307+
{B024E315-831F-429D-92AA-44B839AC10F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
308+
{B024E315-831F-429D-92AA-44B839AC10F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
309+
{B024E315-831F-429D-92AA-44B839AC10F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
310+
{B024E315-831F-429D-92AA-44B839AC10F4}.Release|Any CPU.Build.0 = Release|Any CPU
303311
{1266E1E6-5CEF-4161-8B45-83282455746E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
304312
{1266E1E6-5CEF-4161-8B45-83282455746E}.Debug|Any CPU.Build.0 = Debug|Any CPU
305313
{1266E1E6-5CEF-4161-8B45-83282455746E}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -476,6 +484,10 @@ Global
476484
{7F0AE083-9DB8-4BD4-91F7-C199DCC7301D}.Debug|Any CPU.Build.0 = Debug|Any CPU
477485
{7F0AE083-9DB8-4BD4-91F7-C199DCC7301D}.Release|Any CPU.ActiveCfg = Release|Any CPU
478486
{7F0AE083-9DB8-4BD4-91F7-C199DCC7301D}.Release|Any CPU.Build.0 = Release|Any CPU
487+
{5247DF94-32F3-4ED6-AE71-6AB4F4078E6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
488+
{5247DF94-32F3-4ED6-AE71-6AB4F4078E6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
489+
{5247DF94-32F3-4ED6-AE71-6AB4F4078E6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
490+
{5247DF94-32F3-4ED6-AE71-6AB4F4078E6D}.Release|Any CPU.Build.0 = Release|Any CPU
479491
{5DB1F35F-B714-4B62-84BE-16A33084D3E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
480492
{5DB1F35F-B714-4B62-84BE-16A33084D3E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
481493
{5DB1F35F-B714-4B62-84BE-16A33084D3E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -583,6 +595,7 @@ Global
583595
{FCF59758-2403-4EC9-9EAE-4EC69A3F27AF} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
584596
{3792268A-EF08-4569-8118-991E08FD61C4} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
585597
{4B204EB3-C478-422E-9B6F-62DF3871291A} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
598+
{B024E315-831F-429D-92AA-44B839AC10F4} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
586599
{1266E1E6-5CEF-4161-8B45-83282455746E} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
587600
{2613F146-6C66-4059-9D37-D48BA6B61515} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
588601
{121FB123-40D9-44D4-9AB7-AD57ED34F466} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
@@ -627,6 +640,7 @@ Global
627640
{FA59D75A-8D3A-412C-92E6-4A56033162DD} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
628641
{728CBE16-1D52-4F84-AF01-7229E6013512} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
629642
{7F0AE083-9DB8-4BD4-91F7-C199DCC7301D} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
643+
{5247DF94-32F3-4ED6-AE71-6AB4F4078E6D} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
630644
{5DB1F35F-B714-4B62-84BE-16A33084D3E1} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
631645
{82A7E7B8-3187-4CAE-845B-0BF43409B38A} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
632646
{25DBED78-99F4-433F-BBF5-1B4E9DEAE437} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
root = true
+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
namespace Testcontainers.Milvus;
2+
3+
/// <inheritdoc cref="ContainerBuilder{TBuilderEntity, TContainerEntity, TConfigurationEntity}" />
4+
[PublicAPI]
5+
public sealed class MilvusBuilder : ContainerBuilder<MilvusBuilder, MilvusContainer, MilvusConfiguration>
6+
{
7+
public const string MilvusEtcdConfigFilePath = "/milvus/configs/embedEtcd.yaml";
8+
9+
public const string MilvusImage = "milvusdb/milvus:v2.3.10";
10+
11+
public const ushort MilvusManagementPort = 9091;
12+
13+
public const ushort MilvusGrpcPort = 19530;
14+
15+
private static readonly byte[] EtcdConfig = Encoding.Default.GetBytes(string.Join("\n", "advertise-client-urls: http://0.0.0.0:2379", "listen-client-urls: http://0.0.0.0:2379"));
16+
17+
/// <summary>
18+
/// Initializes a new instance of the <see cref="MilvusBuilder" /> class.
19+
/// </summary>
20+
public MilvusBuilder()
21+
: this(new MilvusConfiguration())
22+
{
23+
DockerResourceConfiguration = Init().DockerResourceConfiguration;
24+
}
25+
26+
/// <summary>
27+
/// Initializes a new instance of the <see cref="MilvusBuilder" /> class.
28+
/// </summary>
29+
/// <param name="resourceConfiguration">The Docker resource configuration.</param>
30+
private MilvusBuilder(MilvusConfiguration resourceConfiguration)
31+
: base(resourceConfiguration)
32+
{
33+
DockerResourceConfiguration = resourceConfiguration;
34+
}
35+
36+
/// <inheritdoc />
37+
protected override MilvusConfiguration DockerResourceConfiguration { get; }
38+
39+
/// <summary>
40+
/// Sets the etcd endpoint.
41+
/// </summary>
42+
/// <param name="etcdEndpoint">The etcd endpoint.</param>
43+
/// <returns>A configured instance of <see cref="MilvusBuilder" />.</returns>
44+
public MilvusBuilder WithEtcdEndpoint(string etcdEndpoint)
45+
{
46+
return WithEnvironment("ETCD_USE_EMBED", "false")
47+
.WithEnvironment("ETCD_CONFIG_PATH", string.Empty)
48+
.WithEnvironment("ETCD_DATA_DIR", string.Empty)
49+
.WithEnvironment("ETCD_ENDPOINTS", etcdEndpoint);
50+
}
51+
52+
/// <inheritdoc />
53+
public override MilvusContainer Build()
54+
{
55+
Validate();
56+
return new MilvusContainer(DockerResourceConfiguration, TestcontainersSettings.Logger);
57+
}
58+
59+
/// <inheritdoc />
60+
protected override MilvusBuilder Init()
61+
{
62+
return base.Init()
63+
.WithImage(MilvusImage)
64+
.WithPortBinding(MilvusManagementPort, true)
65+
.WithPortBinding(MilvusGrpcPort, true)
66+
.WithCommand("milvus", "run", "standalone")
67+
.WithEnvironment("COMMON_STORAGETYPE", "local")
68+
// For embedded etcd only; see WithEtcdEndpoint(string) for using an external etcd.
69+
.WithEnvironment("ETCD_USE_EMBED", "true")
70+
.WithEnvironment("ETCD_CONFIG_PATH", MilvusEtcdConfigFilePath)
71+
.WithEnvironment("ETCD_DATA_DIR", "/var/lib/milvus/etcd")
72+
.WithResourceMapping(EtcdConfig, MilvusEtcdConfigFilePath)
73+
.WithWaitStrategy(Wait.ForUnixContainer().UntilHttpRequestIsSucceeded(request =>
74+
request.ForPort(MilvusManagementPort).ForPath("/healthz")));
75+
}
76+
77+
/// <inheritdoc />
78+
protected override MilvusBuilder Clone(IResourceConfiguration<CreateContainerParameters> resourceConfiguration)
79+
{
80+
return Merge(DockerResourceConfiguration, new MilvusConfiguration(resourceConfiguration));
81+
}
82+
83+
/// <inheritdoc />
84+
protected override MilvusBuilder Clone(IContainerConfiguration resourceConfiguration)
85+
{
86+
return Merge(DockerResourceConfiguration, new MilvusConfiguration(resourceConfiguration));
87+
}
88+
89+
/// <inheritdoc />
90+
protected override MilvusBuilder Merge(MilvusConfiguration oldValue, MilvusConfiguration newValue)
91+
{
92+
return new MilvusBuilder(new MilvusConfiguration(oldValue, newValue));
93+
}
94+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
namespace Testcontainers.Milvus;
2+
3+
/// <inheritdoc cref="ContainerConfiguration" />
4+
[PublicAPI]
5+
public sealed class MilvusConfiguration : ContainerConfiguration
6+
{
7+
/// <summary>
8+
/// Initializes a new instance of the <see cref="MilvusConfiguration" /> class.
9+
/// </summary>
10+
public MilvusConfiguration()
11+
{
12+
}
13+
14+
/// <summary>
15+
/// Initializes a new instance of the <see cref="MilvusConfiguration" /> class.
16+
/// </summary>
17+
/// <param name="resourceConfiguration">The Docker resource configuration.</param>
18+
public MilvusConfiguration(IResourceConfiguration<CreateContainerParameters> resourceConfiguration)
19+
: base(resourceConfiguration)
20+
{
21+
// Passes the configuration upwards to the base implementations to create an updated immutable copy.
22+
}
23+
24+
/// <summary>
25+
/// Initializes a new instance of the <see cref="MilvusConfiguration" /> class.
26+
/// </summary>
27+
/// <param name="resourceConfiguration">The Docker resource configuration.</param>
28+
public MilvusConfiguration(IContainerConfiguration resourceConfiguration)
29+
: base(resourceConfiguration)
30+
{
31+
// Passes the configuration upwards to the base implementations to create an updated immutable copy.
32+
}
33+
34+
/// <summary>
35+
/// Initializes a new instance of the <see cref="MilvusConfiguration" /> class.
36+
/// </summary>
37+
/// <param name="resourceConfiguration">The Docker resource configuration.</param>
38+
public MilvusConfiguration(MilvusConfiguration resourceConfiguration)
39+
: this(new MilvusConfiguration(), resourceConfiguration)
40+
{
41+
// Passes the configuration upwards to the base implementations to create an updated immutable copy.
42+
}
43+
44+
/// <summary>
45+
/// Initializes a new instance of the <see cref="MilvusConfiguration" /> class.
46+
/// </summary>
47+
/// <param name="oldValue">The old Docker resource configuration.</param>
48+
/// <param name="newValue">The new Docker resource configuration.</param>
49+
public MilvusConfiguration(MilvusConfiguration oldValue, MilvusConfiguration newValue)
50+
: base(oldValue, newValue)
51+
{
52+
}
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
namespace Testcontainers.Milvus;
2+
3+
/// <inheritdoc cref="DockerContainer" />
4+
[PublicAPI]
5+
public sealed class MilvusContainer : DockerContainer
6+
{
7+
/// <summary>
8+
/// Initializes a new instance of the <see cref="MilvusContainer" /> class.
9+
/// </summary>
10+
/// <param name="configuration">The container configuration.</param>
11+
/// <param name="logger">The logger.</param>
12+
public MilvusContainer(MilvusConfiguration configuration, ILogger logger)
13+
: base(configuration, logger)
14+
{
15+
}
16+
17+
/// <summary>
18+
/// Gets the Milvus endpoint.
19+
/// </summary>
20+
/// <returns>The Milvus endpoint.</returns>
21+
public Uri GetEndpoint()
22+
{
23+
return new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(MilvusBuilder.MilvusGrpcPort)).Uri;
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<TargetFrameworks>net6.0;net8.0;netstandard2.0;netstandard2.1;net462</TargetFrameworks>
4+
<LangVersion>latest</LangVersion>
5+
</PropertyGroup>
6+
<ItemGroup>
7+
<PackageReference Include="JetBrains.Annotations" VersionOverride="2023.3.0" PrivateAssets="All"/>
8+
</ItemGroup>
9+
<ItemGroup>
10+
<ProjectReference Include="../Testcontainers/Testcontainers.csproj"/>
11+
</ItemGroup>
12+
</Project>

src/Testcontainers.Milvus/Usings.cs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
global using System;
2+
global using System.Text;
3+
global using Docker.DotNet.Models;
4+
global using DotNet.Testcontainers.Builders;
5+
global using DotNet.Testcontainers.Configurations;
6+
global using DotNet.Testcontainers.Containers;
7+
global using JetBrains.Annotations;
8+
global using Microsoft.Extensions.Logging;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
root = true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
namespace Testcontainers.Milvus;
2+
3+
public abstract class MilvusContainerTest : IAsyncLifetime
4+
{
5+
private const string MilvusVersion = "v2.3.10";
6+
7+
private readonly MilvusContainer _milvusContainer;
8+
9+
private MilvusContainerTest(MilvusContainer milvusContainer)
10+
{
11+
_milvusContainer = milvusContainer;
12+
}
13+
14+
public Task InitializeAsync()
15+
{
16+
return _milvusContainer.StartAsync();
17+
}
18+
19+
public Task DisposeAsync()
20+
{
21+
return _milvusContainer.DisposeAsync().AsTask();
22+
}
23+
24+
[Fact]
25+
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
26+
public async Task GetVersionReturnsExpectedVersion()
27+
{
28+
// Given
29+
using var client = new MilvusClient(_milvusContainer.GetEndpoint());
30+
31+
// When
32+
var version = await client.GetVersionAsync()
33+
.ConfigureAwait(true);
34+
35+
// Then
36+
Assert.Equal(MilvusVersion, version);
37+
}
38+
39+
[UsedImplicitly]
40+
public sealed class MilvusDefaultConfiguration : MilvusContainerTest
41+
{
42+
public MilvusDefaultConfiguration()
43+
: base(new MilvusBuilder().WithImage("milvusdb/milvus:" + MilvusVersion).Build())
44+
{
45+
}
46+
}
47+
48+
[UsedImplicitly]
49+
public sealed class MilvusSidecarConfiguration : MilvusContainerTest
50+
{
51+
public MilvusSidecarConfiguration()
52+
: this(new NetworkBuilder().Build())
53+
{
54+
}
55+
56+
private MilvusSidecarConfiguration(INetwork network)
57+
: base(new MilvusBuilder()
58+
.WithImage("milvusdb/milvus:" + MilvusVersion)
59+
.WithEtcdEndpoint("etcd:2379")
60+
.DependsOn(new ContainerBuilder()
61+
.WithImage("quay.io/coreos/etcd:v3.5.5")
62+
.WithNetworkAliases("etcd")
63+
.WithCommand("etcd")
64+
.WithCommand("-advertise-client-urls=http://127.0.0.1:2379")
65+
.WithCommand("-listen-client-urls=http://0.0.0.0:2379")
66+
.WithCommand("-data-dir=/etcd")
67+
.WithEnvironment("ETCD_AUTO_COMPACTION_MODE", "periodic")
68+
.WithEnvironment("ETCD_AUTO_COMPACTION_RETENTION", "0")
69+
.WithEnvironment("ETCD_QUOTA_BACKEND_BYTES", "0")
70+
.WithEnvironment("ETCD_SNAPSHOT_COUNT", "100000")
71+
.WithWaitStrategy(Wait.ForUnixContainer().UntilMessageIsLogged("ready to serve client requests"))
72+
.DependsOn(network)
73+
.Build())
74+
.DependsOn(network)
75+
.Build())
76+
{
77+
}
78+
}
79+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<TargetFrameworks>net8.0</TargetFrameworks>
4+
<IsPackable>false</IsPackable>
5+
<IsPublishable>false</IsPublishable>
6+
</PropertyGroup>
7+
<ItemGroup>
8+
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
9+
<PackageReference Include="coverlet.collector"/>
10+
<PackageReference Include="xunit.runner.visualstudio"/>
11+
<PackageReference Include="xunit"/>
12+
<PackageReference Include="Milvus.Client"/>
13+
</ItemGroup>
14+
<ItemGroup>
15+
<ProjectReference Include="../../src/Testcontainers.Milvus/Testcontainers.Milvus.csproj"/>
16+
<ProjectReference Include="../Testcontainers.Commons/Testcontainers.Commons.csproj"/>
17+
</ItemGroup>
18+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
global using System.Threading.Tasks;
2+
global using DotNet.Testcontainers.Builders;
3+
global using DotNet.Testcontainers.Commons;
4+
global using DotNet.Testcontainers.Networks;
5+
global using JetBrains.Annotations;
6+
global using Milvus.Client;
7+
global using Xunit;

0 commit comments

Comments
 (0)