From 1899fe871afc77e1bef4aad524bf1678e7274519 Mon Sep 17 00:00:00 2001 From: Alireza Baloochi Date: Fri, 12 Jul 2024 19:07:45 +0330 Subject: [PATCH 1/8] Extract Aspire.Hosting.Milvus.Tests project --- Aspire.sln | 22 +- src/Aspire.Hosting/Aspire.Hosting.csproj | 1 + .../TestConstants.cs | 2 +- .../AddMilvusTests.cs | 4 +- .../Aspire.Hosting.Milvus.Tests.csproj | 22 ++ .../MilvusFunctionalTests.cs | 362 ++++++++++++++++++ .../Aspire.Hosting.Tests.csproj | 2 +- 7 files changed, 403 insertions(+), 12 deletions(-) rename tests/{Aspire.Hosting.Tests/Milvus => Aspire.Hosting.Milvus.Tests}/AddMilvusTests.cs (99%) create mode 100644 tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj create mode 100644 tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs diff --git a/Aspire.sln b/Aspire.sln index 6311189fa29..5d0e62871d4 100644 --- a/Aspire.sln +++ b/Aspire.sln @@ -494,10 +494,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aspire.Hosting.Valkey", "sr EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "withdockerfile", "withdockerfile", "{A6813855-E322-41EF-B2E6-7A44949EF962}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithDockerfile.AppHost", "playground\withdockerfile\WithDockerfile.AppHost\WithDockerfile.AppHost.csproj", "{E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aspire.Hosting.Containers.Tests", "tests\Aspire.Hosting.Containers.Tests\Aspire.Hosting.Containers.Tests.csproj", "{588CD2D7-EE70-43C1-8233-330854BDF53C}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithDockerfile.AppHost", "playground\withdockerfile\WithDockerfile.AppHost\WithDockerfile.AppHost.csproj", "{E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "python", "python", "{7123AB7A-A4FD-4F64-8B05-D2DD0C3E2ABC}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.AppHost", "playground\python\Python.AppHost\Python.AppHost.csproj", "{173BDA6E-F175-4457-BF64-58CD184E9A81}" @@ -508,6 +508,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hosting", "Hosting", "{830A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aspire.Hosting.Redis.Tests", "tests\Aspire.Hosting.Redis.Tests\Aspire.Hosting.Redis.Tests.csproj", "{1BC02557-B78B-48CE-9D3C-488A6B7672F4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aspire.Hosting.Milvus.Tests", "tests\Aspire.Hosting.Milvus.Tests\Aspire.Hosting.Milvus.Tests.csproj", "{986886B7-0E38-4890-92C3-5B46DE322DAF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1310,14 +1312,14 @@ Global {5CB63205-24F4-4388-A41B-BAF3BEA59866}.Debug|Any CPU.Build.0 = Debug|Any CPU {5CB63205-24F4-4388-A41B-BAF3BEA59866}.Release|Any CPU.ActiveCfg = Release|Any CPU {5CB63205-24F4-4388-A41B-BAF3BEA59866}.Release|Any CPU.Build.0 = Release|Any CPU - {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}.Release|Any CPU.Build.0 = Release|Any CPU {588CD2D7-EE70-43C1-8233-330854BDF53C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {588CD2D7-EE70-43C1-8233-330854BDF53C}.Debug|Any CPU.Build.0 = Debug|Any CPU {588CD2D7-EE70-43C1-8233-330854BDF53C}.Release|Any CPU.ActiveCfg = Release|Any CPU {588CD2D7-EE70-43C1-8233-330854BDF53C}.Release|Any CPU.Build.0 = Release|Any CPU + {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9}.Release|Any CPU.Build.0 = Release|Any CPU {173BDA6E-F175-4457-BF64-58CD184E9A81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {173BDA6E-F175-4457-BF64-58CD184E9A81}.Debug|Any CPU.Build.0 = Debug|Any CPU {173BDA6E-F175-4457-BF64-58CD184E9A81}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -1326,6 +1328,10 @@ Global {1BC02557-B78B-48CE-9D3C-488A6B7672F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1BC02557-B78B-48CE-9D3C-488A6B7672F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {1BC02557-B78B-48CE-9D3C-488A6B7672F4}.Release|Any CPU.Build.0 = Release|Any CPU + {986886B7-0E38-4890-92C3-5B46DE322DAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {986886B7-0E38-4890-92C3-5B46DE322DAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {986886B7-0E38-4890-92C3-5B46DE322DAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {986886B7-0E38-4890-92C3-5B46DE322DAF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1561,14 +1567,14 @@ Global {9FAE1602-2C69-4D24-8655-A164489441E8} = {C424395C-1235-41A4-BF55-07880A04368C} {DF00FDA3-D3EC-4E07-B4EC-0EBB57A813A4} = {77CFE74A-32EE-400C-8930-5025E8555256} {5CB63205-24F4-4388-A41B-BAF3BEA59866} = {B80354C7-BE58-43F6-8928-9F3A74AB7F47} - {A6813855-E322-41EF-B2E6-7A44949EF962} = {D173887B-AF42-4576-B9C1-96B9E9B3D9C0} - {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9} = {A6813855-E322-41EF-B2E6-7A44949EF962} {588CD2D7-EE70-43C1-8233-330854BDF53C} = {4981B3A5-4AFD-4191-BF7D-8692D9783D60} + {E6BE41D3-872C-47D2-B5B1-78C37AFAEAF9} = {D173887B-AF42-4576-B9C1-96B9E9B3D9C0} {7123AB7A-A4FD-4F64-8B05-D2DD0C3E2ABC} = {D173887B-AF42-4576-B9C1-96B9E9B3D9C0} {173BDA6E-F175-4457-BF64-58CD184E9A81} = {7123AB7A-A4FD-4F64-8B05-D2DD0C3E2ABC} {C424395C-1235-41A4-BF55-07880A04368C} = {4981B3A5-4AFD-4191-BF7D-8692D9783D60} {830A89EC-4029-4753-B25A-068BAE37DEC7} = {4981B3A5-4AFD-4191-BF7D-8692D9783D60} {1BC02557-B78B-48CE-9D3C-488A6B7672F4} = {830A89EC-4029-4753-B25A-068BAE37DEC7} + {986886B7-0E38-4890-92C3-5B46DE322DAF} = {830A89EC-4029-4753-B25A-068BAE37DEC7} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {6DCEDFEC-988E-4CB3-B45B-191EB5086E0C} diff --git a/src/Aspire.Hosting/Aspire.Hosting.csproj b/src/Aspire.Hosting/Aspire.Hosting.csproj index 8208c241d15..e33c8d4d491 100644 --- a/src/Aspire.Hosting/Aspire.Hosting.csproj +++ b/src/Aspire.Hosting/Aspire.Hosting.csproj @@ -68,6 +68,7 @@ + diff --git a/tests/Aspire.Components.Common.Tests/TestConstants.cs b/tests/Aspire.Components.Common.Tests/TestConstants.cs index 4b7971bf1f7..171991ee75f 100644 --- a/tests/Aspire.Components.Common.Tests/TestConstants.cs +++ b/tests/Aspire.Components.Common.Tests/TestConstants.cs @@ -5,5 +5,5 @@ namespace Aspire.Components.Common.Tests; public static class TestConstants { - public const string AspireTestContainerRegistry = "netaspireci.azurecr.io"; + public const string AspireTestContainerRegistry = "docker.io"; } diff --git a/tests/Aspire.Hosting.Tests/Milvus/AddMilvusTests.cs b/tests/Aspire.Hosting.Milvus.Tests/AddMilvusTests.cs similarity index 99% rename from tests/Aspire.Hosting.Tests/Milvus/AddMilvusTests.cs rename to tests/Aspire.Hosting.Milvus.Tests/AddMilvusTests.cs index 73a88ed027b..3ce36afc20c 100644 --- a/tests/Aspire.Hosting.Tests/Milvus/AddMilvusTests.cs +++ b/tests/Aspire.Hosting.Milvus.Tests/AddMilvusTests.cs @@ -2,13 +2,13 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Net.Sockets; -using Aspire.Hosting.Milvus; +using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Tests.Utils; using Aspire.Hosting.Utils; using Microsoft.Extensions.DependencyInjection; using Xunit; -namespace Aspire.Hosting.Tests.Milvus; +namespace Aspire.Hosting.Milvus.Tests; public class AddMilvusTests { private const int MilvusPortGrpc = 19530; diff --git a/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj b/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj new file mode 100644 index 00000000000..6e0d10ad11c --- /dev/null +++ b/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj @@ -0,0 +1,22 @@ + + + + $(NetCurrent) + $(NoWarn);CS8002 + + + + + + + + + + + + + + + + + diff --git a/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs b/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs new file mode 100644 index 00000000000..dbfc8f2ada4 --- /dev/null +++ b/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs @@ -0,0 +1,362 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Aspire.Components.Common.Tests; +using Aspire.Hosting.Utils; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Milvus.Client; +using Xunit; + +namespace Aspire.Hosting.Milvus.Tests; + +public class MilvusFunctionalTests +{ + //Right now can not set user and password for super user of Milvus at startup. default user and password is root:Milvus. + //https://github.com/milvus-io/milvus/issues/33058 + private const string MilvusToken = "root:Milvus"; + + [Fact] + [RequiresDocker] + public async Task VerifyMilvusResource() + { + var builder = CreateDistributedApplicationBuilder(); + + builder.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey = builder.AddParameter("apikey"); + var milvus = builder.AddMilvus("milvus", apiKey: apiKey); + + using var app = builder.Build(); + + await app.StartAsync(); + + var hb = Host.CreateApplicationBuilder(); + + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{milvus.Resource.Name}"] = await milvus.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + }); + + hb.AddMilvusClient(milvus.Resource.Name); + + using var host = hb.Build(); + + await host.StartAsync(); + + var milvusClient = host.Services.GetRequiredService(); + + string collectionName = "book"; + var collection = await milvusClient.CreateCollectionAsync( + collectionName, + new[] { + FieldSchema.Create("book_id", isPrimaryKey:true), + FieldSchema.Create("word_count"), + FieldSchema.CreateVarchar("book_name", 256), + FieldSchema.CreateFloatVector("book_intro", 2) + } + ); + + var collections = await milvusClient.ListCollectionsAsync(); + + Assert.Single(collections, c => c.Name == collectionName); + } + + [Fact] + [RequiresDocker] + public async Task VerifyMilvusDatabaseResource() + { + var builder = CreateDistributedApplicationBuilder(); + + builder.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey = builder.AddParameter("apikey"); + var milvus = builder.AddMilvus("milvus", apiKey: apiKey); + var db = milvus.AddDatabase("milvusdb", "db1"); + + using var app = builder.Build(); + + await app.StartAsync(); + + var hb = Host.CreateApplicationBuilder(); + + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{db.Resource.Name}"] = await db.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + }); + + hb.AddMilvusClient(db.Resource.Name); + + using var host = hb.Build(); + + await host.StartAsync(); + + var milvusClient = host.Services.GetRequiredService(); + await milvusClient.CreateDatabaseAsync("db1"); + string collectionName = "book"; + var collection = await milvusClient.CreateCollectionAsync( + collectionName, + new[] { + FieldSchema.Create("book_id", isPrimaryKey:true), + FieldSchema.Create("word_count"), + FieldSchema.CreateVarchar("book_name", 256), + FieldSchema.CreateFloatVector("book_intro", 2) + } + ); + + var collections = await milvusClient.ListCollectionsAsync(); + + Assert.Single(collections, c => c.Name == collectionName); + } + + [Fact] + [RequiresDocker] + public async Task WithDataVolumeShouldPersistStateBetweenUsages() + { + var builder1 = CreateDistributedApplicationBuilder(); + builder1.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey1 = builder1.AddParameter("apikey"); + var milvus1 = builder1.AddMilvus("milvus", apiKey1); + + // Use a deterministic volume name to prevent them from exhausting the machines if deletion fails + var volumeName = VolumeNameGenerator.CreateVolumeName(milvus1, nameof(WithDataVolumeShouldPersistStateBetweenUsages)); + milvus1.WithDataVolume(volumeName); + string collectionName = "book"; + + using (var app = builder1.Build()) + { + await app.StartAsync(); + + var hb = Host.CreateApplicationBuilder(); + + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{milvus1.Resource.Name}"] = await milvus1.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + }); + + hb.AddMilvusClient(milvus1.Resource.Name); + + using (var host = hb.Build()) + { + await host.StartAsync(); + + var milvusClient = host.Services.GetRequiredService(); + + var collection = await milvusClient.CreateCollectionAsync( + collectionName, + new[] { + FieldSchema.Create("book_id", isPrimaryKey:true), + FieldSchema.Create("word_count"), + FieldSchema.CreateVarchar("book_name", 256), + FieldSchema.CreateFloatVector("book_intro", 2) + }); + } + + // Stops the container, or the Volume would still be in use + await app.StopAsync(); + } + + var builder2 = CreateDistributedApplicationBuilder(); + builder2.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey2 = builder2.AddParameter("apikey"); + var milvus2 = builder2.AddMilvus("milvus", apiKey2).WithDataVolume(volumeName); + + using (var app = builder2.Build()) + { + await app.StartAsync(); + + var hb = Host.CreateApplicationBuilder(); + + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{milvus2.Resource.Name}"] = await milvus2.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + }); + + hb.AddMilvusClient(milvus2.Resource.Name); + + using (var host = hb.Build()) + { + await host.StartAsync(); + + var milvusClient = host.Services.GetRequiredService(); + + var collections = await milvusClient.ListCollectionsAsync(); + + Assert.Single(collections, c => c.Name == collectionName); + } + + // Stops the container, or the Volume would still be in use + await app.StopAsync(); + } + + DockerUtils.AttemptDeleteDockerVolume(volumeName); + } + + [Fact] + [RequiresDocker] + public async Task WithDataBindMountShouldPersistStateBetweenUsages() + { + var bindMountPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + + if (!Directory.Exists(bindMountPath)) + { + Directory.CreateDirectory(bindMountPath); + } + + var builder1 = CreateDistributedApplicationBuilder(); + builder1.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey1 = builder1.AddParameter("apikey"); + var milvus1 = builder1.AddMilvus("milvus", apiKey1).WithDataBindMount(bindMountPath); + + string collectionName = "book"; + + using (var app = builder1.Build()) + { + await app.StartAsync(); + + var hb = Host.CreateApplicationBuilder(); + + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{milvus1.Resource.Name}"] = await milvus1.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + }); + + hb.AddMilvusClient(milvus1.Resource.Name); + + using (var host = hb.Build()) + { + await host.StartAsync(); + + var milvusClient = host.Services.GetRequiredService(); + var collection = await milvusClient.CreateCollectionAsync( + collectionName, + new[] { + FieldSchema.Create("book_id", isPrimaryKey:true), + FieldSchema.Create("word_count"), + FieldSchema.CreateVarchar("book_name", 256), + FieldSchema.CreateFloatVector("book_intro", 2) + }); + } + + await app.StopAsync(); + } + + var builder2 = CreateDistributedApplicationBuilder(); + builder2.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey2 = builder2.AddParameter("apikey"); + var milvus2 = builder2.AddMilvus("milvus2", apiKey2).WithDataBindMount(bindMountPath); + + using (var app = builder2.Build()) + { + await app.StartAsync(); + + var hb = Host.CreateApplicationBuilder(); + + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{milvus2.Resource.Name}"] = await milvus2.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + }); + + hb.AddMilvusClient(milvus2.Resource.Name); + + using (var host = hb.Build()) + { + await host.StartAsync(); + + var milvusClient = host.Services.GetRequiredService(); + + var collections = await milvusClient.ListCollectionsAsync(); + + Assert.Single(collections, c => c.Name == collectionName); + } + + await app.StopAsync(); + } + + try + { + File.Delete(bindMountPath); + } + catch + { + // Don't fail test if we can't clean the temporary folder + } + } + + [Fact] + [RequiresDocker] + public async Task PersistenceIsDisabledByDefault() + { + var builder1 = CreateDistributedApplicationBuilder(); + builder1.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey1 = builder1.AddParameter("apikey"); + var milvus1 = builder1.AddMilvus("milvus", apiKey1); + + using (var app = builder1.Build()) + { + await app.StartAsync(); + + var hb = Host.CreateApplicationBuilder(); + + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{milvus1.Resource.Name}"] = await milvus1.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + }); + + hb.AddMilvusClient(milvus1.Resource.Name); + + using (var host = hb.Build()) + { + await host.StartAsync(); + + var milvusClient = host.Services.GetRequiredService(); + + string collectionName = "book"; + var collection = await milvusClient.CreateCollectionAsync( + collectionName, + new[] { + FieldSchema.Create("book_id", isPrimaryKey:true), + FieldSchema.Create("word_count"), + FieldSchema.CreateVarchar("book_name", 256), + FieldSchema.CreateFloatVector("book_intro", 2) + }); + } + + await app.StopAsync(); + } + + var builder2 = CreateDistributedApplicationBuilder(); + builder2.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey2 = builder2.AddParameter("apikey"); + var milvus2 = builder2.AddMilvus("milvus", apiKey2); + + using (var app = builder2.Build()) + { + await app.StartAsync(); + + var hb = Host.CreateApplicationBuilder(); + + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{milvus2.Resource.Name}"] = await milvus2.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + }); + + hb.AddMilvusClient(milvus2.Resource.Name); + + using (var host = hb.Build()) + { + await host.StartAsync(); + + var milvusClient = host.Services.GetRequiredService(); + + var collections = await milvusClient.ListCollectionsAsync(); + + Assert.Empty(collections); + } + + await app.StopAsync(); + } + } + + private static TestDistributedApplicationBuilder CreateDistributedApplicationBuilder() => + TestDistributedApplicationBuilder.CreateWithTestContainerRegistry(); +} diff --git a/tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj b/tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj index ee9a9e14332..9268e47f9f9 100644 --- a/tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj +++ b/tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj @@ -30,7 +30,7 @@ - + From ac790463f25e3b53ef828f20e71942c451996173 Mon Sep 17 00:00:00 2001 From: Alireza Baloochi Date: Fri, 12 Jul 2024 19:09:39 +0330 Subject: [PATCH 2/8] revert test registry --- tests/Aspire.Components.Common.Tests/TestConstants.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Aspire.Components.Common.Tests/TestConstants.cs b/tests/Aspire.Components.Common.Tests/TestConstants.cs index 171991ee75f..4b7971bf1f7 100644 --- a/tests/Aspire.Components.Common.Tests/TestConstants.cs +++ b/tests/Aspire.Components.Common.Tests/TestConstants.cs @@ -5,5 +5,5 @@ namespace Aspire.Components.Common.Tests; public static class TestConstants { - public const string AspireTestContainerRegistry = "docker.io"; + public const string AspireTestContainerRegistry = "netaspireci.azurecr.io"; } From 0a0f30293e6524824255098412d93f3c16e07c07 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Mon, 15 Jul 2024 14:40:23 -0500 Subject: [PATCH 3/8] Add xunit logging --- .../MilvusFunctionalTests.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs b/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs index dbfc8f2ada4..83c128ebe2e 100644 --- a/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs +++ b/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs @@ -6,12 +6,14 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Milvus.Client; using Xunit; +using Xunit.Abstractions; namespace Aspire.Hosting.Milvus.Tests; -public class MilvusFunctionalTests +public class MilvusFunctionalTests(ITestOutputHelper testOutputHelper) { //Right now can not set user and password for super user of Milvus at startup. default user and password is root:Milvus. //https://github.com/milvus-io/milvus/issues/33058 @@ -357,6 +359,10 @@ public async Task PersistenceIsDisabledByDefault() } } - private static TestDistributedApplicationBuilder CreateDistributedApplicationBuilder() => - TestDistributedApplicationBuilder.CreateWithTestContainerRegistry(); + private TestDistributedApplicationBuilder CreateDistributedApplicationBuilder() + { + var builder = TestDistributedApplicationBuilder.CreateWithTestContainerRegistry(); + builder.Services.AddXunitLogging(testOutputHelper); + return builder; + } } From ee8bc6b16f77ab2e25f94844857803ee85a7983c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Mon, 15 Jul 2024 22:48:25 -0700 Subject: [PATCH 4/8] Update tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs Co-authored-by: Ankit Jain --- tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs b/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs index 83c128ebe2e..61e3b93d240 100644 --- a/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs +++ b/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs @@ -15,8 +15,8 @@ namespace Aspire.Hosting.Milvus.Tests; public class MilvusFunctionalTests(ITestOutputHelper testOutputHelper) { - //Right now can not set user and password for super user of Milvus at startup. default user and password is root:Milvus. - //https://github.com/milvus-io/milvus/issues/33058 + // Right now can not set user and password for super user of Milvus at startup. default user and password is root:Milvus. + // https://github.com/milvus-io/milvus/issues/33058 private const string MilvusToken = "root:Milvus"; [Fact] From 8b8f3582e4884b9983505a030240f75aaccb22b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Mon, 15 Jul 2024 22:48:31 -0700 Subject: [PATCH 5/8] Update tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj Co-authored-by: Ankit Jain --- .../Aspire.Hosting.Milvus.Tests.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj b/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj index 6e0d10ad11c..067360b81b6 100644 --- a/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj +++ b/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj @@ -3,7 +3,6 @@ $(NetCurrent) $(NoWarn);CS8002 - From 6bb3fe9afd7acb30fa8ccb05a072f3b647ca18e8 Mon Sep 17 00:00:00 2001 From: Alireza Baloochi Date: Sat, 20 Jul 2024 21:59:56 +0330 Subject: [PATCH 6/8] Apply feedback --- src/Aspire.Hosting/Aspire.Hosting.csproj | 1 - .../Aspire.Hosting.Milvus.Tests.csproj | 2 +- .../MilvusFunctionalTests.cs | 394 ++++++------------ .../Aspire.Hosting.Tests.csproj | 2 - 4 files changed, 136 insertions(+), 263 deletions(-) diff --git a/src/Aspire.Hosting/Aspire.Hosting.csproj b/src/Aspire.Hosting/Aspire.Hosting.csproj index e33c8d4d491..8208c241d15 100644 --- a/src/Aspire.Hosting/Aspire.Hosting.csproj +++ b/src/Aspire.Hosting/Aspire.Hosting.csproj @@ -68,7 +68,6 @@ - diff --git a/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj b/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj index 067360b81b6..bcf7ee4fd2b 100644 --- a/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj +++ b/tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj @@ -16,6 +16,6 @@ + - diff --git a/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs b/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs index 61e3b93d240..44faab28822 100644 --- a/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs +++ b/tests/Aspire.Hosting.Milvus.Tests/MilvusFunctionalTests.cs @@ -3,11 +3,13 @@ using Aspire.Components.Common.Tests; using Aspire.Hosting.Utils; +using Grpc.Core; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Milvus.Client; +using Polly; using Xunit; using Xunit.Abstractions; @@ -18,16 +20,23 @@ public class MilvusFunctionalTests(ITestOutputHelper testOutputHelper) // Right now can not set user and password for super user of Milvus at startup. default user and password is root:Milvus. // https://github.com/milvus-io/milvus/issues/33058 private const string MilvusToken = "root:Milvus"; + private const string CollectionName = "book"; [Fact] [RequiresDocker] public async Task VerifyMilvusResource() { + var cts = new CancellationTokenSource(TimeSpan.FromMinutes(5)); + var pipeline = new ResiliencePipelineBuilder() + .AddRetry(new() { MaxRetryAttempts = 10, Delay = TimeSpan.FromSeconds(3), ShouldHandle = new PredicateBuilder().Handle() }) + .Build(); + var builder = CreateDistributedApplicationBuilder(); builder.Configuration["Parameters:apikey"] = MilvusToken; var apiKey = builder.AddParameter("apikey"); var milvus = builder.AddMilvus("milvus", apiKey: apiKey); + var db = milvus.AddDatabase("milvusdb", "db1"); using var app = builder.Build(); @@ -37,325 +46,192 @@ public async Task VerifyMilvusResource() hb.Configuration.AddInMemoryCollection(new Dictionary { - [$"ConnectionStrings:{milvus.Resource.Name}"] = await milvus.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) + [$"ConnectionStrings:{db.Resource.Name}"] = await db.Resource.ConnectionStringExpression.GetValueAsync(default) }); - hb.AddMilvusClient(milvus.Resource.Name); + hb.AddMilvusClient(db.Resource.Name); using var host = hb.Build(); await host.StartAsync(); - var milvusClient = host.Services.GetRequiredService(); + await pipeline.ExecuteAsync( + async token => + { + var milvusClient = host.Services.GetRequiredService(); - string collectionName = "book"; - var collection = await milvusClient.CreateCollectionAsync( - collectionName, - new[] { - FieldSchema.Create("book_id", isPrimaryKey:true), - FieldSchema.Create("word_count"), - FieldSchema.CreateVarchar("book_name", 256), - FieldSchema.CreateFloatVector("book_intro", 2) - } - ); + await milvusClient.CreateDatabaseAsync("db1", token); + await CreateTestDataAsync(milvusClient, token); - var collections = await milvusClient.ListCollectionsAsync(); + }, cts.Token); - Assert.Single(collections, c => c.Name == collectionName); } - [Fact] - [RequiresDocker] - public async Task VerifyMilvusDatabaseResource() + private static async Task CreateTestDataAsync(MilvusClient milvusClient, CancellationToken token) { - var builder = CreateDistributedApplicationBuilder(); - - builder.Configuration["Parameters:apikey"] = MilvusToken; - var apiKey = builder.AddParameter("apikey"); - var milvus = builder.AddMilvus("milvus", apiKey: apiKey); - var db = milvus.AddDatabase("milvusdb", "db1"); - - using var app = builder.Build(); - - await app.StartAsync(); - - var hb = Host.CreateApplicationBuilder(); - - hb.Configuration.AddInMemoryCollection(new Dictionary - { - [$"ConnectionStrings:{db.Resource.Name}"] = await db.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) - }); - - hb.AddMilvusClient(db.Resource.Name); - - using var host = hb.Build(); - - await host.StartAsync(); - - var milvusClient = host.Services.GetRequiredService(); - await milvusClient.CreateDatabaseAsync("db1"); - string collectionName = "book"; var collection = await milvusClient.CreateCollectionAsync( - collectionName, - new[] { - FieldSchema.Create("book_id", isPrimaryKey:true), - FieldSchema.Create("word_count"), - FieldSchema.CreateVarchar("book_name", 256), - FieldSchema.CreateFloatVector("book_intro", 2) - } - ); - - var collections = await milvusClient.ListCollectionsAsync(); - - Assert.Single(collections, c => c.Name == collectionName); + CollectionName, + [ + FieldSchema.Create("book_id", isPrimaryKey:true), + FieldSchema.Create("word_count"), + FieldSchema.CreateVarchar("book_name", 256), + FieldSchema.CreateFloatVector("book_intro", 2) + ] + , cancellationToken: token); + + var collections = await milvusClient.ListCollectionsAsync(cancellationToken: token); + Assert.Single(collections, c => c.Name == CollectionName); } - [Fact] + [Theory] + [InlineData(false)] + [InlineData(true)] [RequiresDocker] - public async Task WithDataVolumeShouldPersistStateBetweenUsages() + public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) { - var builder1 = CreateDistributedApplicationBuilder(); - builder1.Configuration["Parameters:apikey"] = MilvusToken; - var apiKey1 = builder1.AddParameter("apikey"); - var milvus1 = builder1.AddMilvus("milvus", apiKey1); + var dbname = "milvusdbtest"; + var cts = new CancellationTokenSource(TimeSpan.FromMinutes(5)); + var pipeline = new ResiliencePipelineBuilder() + .AddRetry(new() { MaxRetryAttempts = 10, Delay = TimeSpan.FromSeconds(3), ShouldHandle = new PredicateBuilder().Handle() }) + .Build(); - // Use a deterministic volume name to prevent them from exhausting the machines if deletion fails - var volumeName = VolumeNameGenerator.CreateVolumeName(milvus1, nameof(WithDataVolumeShouldPersistStateBetweenUsages)); - milvus1.WithDataVolume(volumeName); - string collectionName = "book"; + string? volumeName = null; + string? bindMountPath = null; - using (var app = builder1.Build()) + try { - await app.StartAsync(); - - var hb = Host.CreateApplicationBuilder(); + var builder1 = CreateDistributedApplicationBuilder(); + builder1.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey1 = builder1.AddParameter("apikey"); + var milvus1 = builder1.AddMilvus("milvus1", apiKey1); + var db1 = milvus1.AddDatabase("milvusdb1", dbname); - hb.Configuration.AddInMemoryCollection(new Dictionary + if (useVolume) { - [$"ConnectionStrings:{milvus1.Resource.Name}"] = await milvus1.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) - }); + // Use a deterministic volume name to prevent them from exhausting the machines if deletion fails + volumeName = VolumeNameGenerator.CreateVolumeName(milvus1, nameof(WithDataShouldPersistStateBetweenUsages)); - hb.AddMilvusClient(milvus1.Resource.Name); - - using (var host = hb.Build()) - { - await host.StartAsync(); - - var milvusClient = host.Services.GetRequiredService(); - - var collection = await milvusClient.CreateCollectionAsync( - collectionName, - new[] { - FieldSchema.Create("book_id", isPrimaryKey:true), - FieldSchema.Create("word_count"), - FieldSchema.CreateVarchar("book_name", 256), - FieldSchema.CreateFloatVector("book_intro", 2) - }); + // if the volume already exists (because of a crashing previous run), try to delete it + DockerUtils.AttemptDeleteDockerVolume(volumeName); + milvus1.WithDataVolume(volumeName); } - - // Stops the container, or the Volume would still be in use - await app.StopAsync(); - } - - var builder2 = CreateDistributedApplicationBuilder(); - builder2.Configuration["Parameters:apikey"] = MilvusToken; - var apiKey2 = builder2.AddParameter("apikey"); - var milvus2 = builder2.AddMilvus("milvus", apiKey2).WithDataVolume(volumeName); - - using (var app = builder2.Build()) - { - await app.StartAsync(); - - var hb = Host.CreateApplicationBuilder(); - - hb.Configuration.AddInMemoryCollection(new Dictionary + else { - [$"ConnectionStrings:{milvus2.Resource.Name}"] = await milvus2.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) - }); - - hb.AddMilvusClient(milvus2.Resource.Name); - - using (var host = hb.Build()) - { - await host.StartAsync(); - - var milvusClient = host.Services.GetRequiredService(); - - var collections = await milvusClient.ListCollectionsAsync(); - - Assert.Single(collections, c => c.Name == collectionName); + bindMountPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + milvus1.WithDataBindMount(bindMountPath); } - // Stops the container, or the Volume would still be in use - await app.StopAsync(); - } + using (var app = builder1.Build()) + { + await app.StartAsync(); - DockerUtils.AttemptDeleteDockerVolume(volumeName); - } + try + { + var hb = Host.CreateApplicationBuilder(); - [Fact] - [RequiresDocker] - public async Task WithDataBindMountShouldPersistStateBetweenUsages() - { - var bindMountPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{db1.Resource.Name}"] = await db1.Resource.ConnectionStringExpression.GetValueAsync(default) + }); - if (!Directory.Exists(bindMountPath)) - { - Directory.CreateDirectory(bindMountPath); - } + hb.AddMilvusClient(db1.Resource.Name); - var builder1 = CreateDistributedApplicationBuilder(); - builder1.Configuration["Parameters:apikey"] = MilvusToken; - var apiKey1 = builder1.AddParameter("apikey"); - var milvus1 = builder1.AddMilvus("milvus", apiKey1).WithDataBindMount(bindMountPath); + using (var host = hb.Build()) + { + await host.StartAsync(); - string collectionName = "book"; + await pipeline.ExecuteAsync( + async token => + { + var milvusClient = host.Services.GetRequiredService(); - using (var app = builder1.Build()) - { - await app.StartAsync(); + await milvusClient.CreateDatabaseAsync(dbname, token); + await CreateTestDataAsync(milvusClient, token); - var hb = Host.CreateApplicationBuilder(); + }, cts.Token); - hb.Configuration.AddInMemoryCollection(new Dictionary - { - [$"ConnectionStrings:{milvus1.Resource.Name}"] = await milvus1.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) - }); + } + } + finally + { + // Stops the container, or the Volume would still be in use + await app.StopAsync(); + } + } - hb.AddMilvusClient(milvus1.Resource.Name); + var builder2 = CreateDistributedApplicationBuilder(); + builder2.Configuration["Parameters:apikey"] = MilvusToken; + var apiKey2 = builder2.AddParameter("apikey"); + var milvus2 = builder2.AddMilvus("milvus2", apiKey2); + var db2 = milvus2.AddDatabase("milvusdb2", dbname); - using (var host = hb.Build()) + if (useVolume) { - await host.StartAsync(); - - var milvusClient = host.Services.GetRequiredService(); - var collection = await milvusClient.CreateCollectionAsync( - collectionName, - new[] { - FieldSchema.Create("book_id", isPrimaryKey:true), - FieldSchema.Create("word_count"), - FieldSchema.CreateVarchar("book_name", 256), - FieldSchema.CreateFloatVector("book_intro", 2) - }); + milvus2.WithDataVolume(volumeName); } - - await app.StopAsync(); - } - - var builder2 = CreateDistributedApplicationBuilder(); - builder2.Configuration["Parameters:apikey"] = MilvusToken; - var apiKey2 = builder2.AddParameter("apikey"); - var milvus2 = builder2.AddMilvus("milvus2", apiKey2).WithDataBindMount(bindMountPath); - - using (var app = builder2.Build()) - { - await app.StartAsync(); - - var hb = Host.CreateApplicationBuilder(); - - hb.Configuration.AddInMemoryCollection(new Dictionary + else { - [$"ConnectionStrings:{milvus2.Resource.Name}"] = await milvus2.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) - }); - - hb.AddMilvusClient(milvus2.Resource.Name); + milvus2.WithDataBindMount(bindMountPath!); + } - using (var host = hb.Build()) + using (var app = builder2.Build()) { - await host.StartAsync(); + await app.StartAsync(); - var milvusClient = host.Services.GetRequiredService(); + try + { + var hb = Host.CreateApplicationBuilder(); - var collections = await milvusClient.ListCollectionsAsync(); + hb.Configuration.AddInMemoryCollection(new Dictionary + { + [$"ConnectionStrings:{db2.Resource.Name}"] = await db2.Resource.ConnectionStringExpression.GetValueAsync(default) + }); - Assert.Single(collections, c => c.Name == collectionName); - } + hb.AddMilvusClient(db2.Resource.Name); - await app.StopAsync(); - } + using (var host = hb.Build()) + { + await host.StartAsync(); - try - { - File.Delete(bindMountPath); - } - catch - { - // Don't fail test if we can't clean the temporary folder - } - } + await pipeline.ExecuteAsync( + async token => + { + var milvusClient = host.Services.GetRequiredService(); - [Fact] - [RequiresDocker] - public async Task PersistenceIsDisabledByDefault() - { - var builder1 = CreateDistributedApplicationBuilder(); - builder1.Configuration["Parameters:apikey"] = MilvusToken; - var apiKey1 = builder1.AddParameter("apikey"); - var milvus1 = builder1.AddMilvus("milvus", apiKey1); + var collections = await milvusClient.ListCollectionsAsync(cancellationToken: token); - using (var app = builder1.Build()) - { - await app.StartAsync(); + Assert.Single(collections, c => c.Name == CollectionName); - var hb = Host.CreateApplicationBuilder(); - - hb.Configuration.AddInMemoryCollection(new Dictionary - { - [$"ConnectionStrings:{milvus1.Resource.Name}"] = await milvus1.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) - }); - - hb.AddMilvusClient(milvus1.Resource.Name); + }, cts.Token); + } + } + finally + { + // Stops the container, or the Volume would still be in use + await app.StopAsync(); + } - using (var host = hb.Build()) - { - await host.StartAsync(); - - var milvusClient = host.Services.GetRequiredService(); - - string collectionName = "book"; - var collection = await milvusClient.CreateCollectionAsync( - collectionName, - new[] { - FieldSchema.Create("book_id", isPrimaryKey:true), - FieldSchema.Create("word_count"), - FieldSchema.CreateVarchar("book_name", 256), - FieldSchema.CreateFloatVector("book_intro", 2) - }); } - await app.StopAsync(); } - - var builder2 = CreateDistributedApplicationBuilder(); - builder2.Configuration["Parameters:apikey"] = MilvusToken; - var apiKey2 = builder2.AddParameter("apikey"); - var milvus2 = builder2.AddMilvus("milvus", apiKey2); - - using (var app = builder2.Build()) + finally { - await app.StartAsync(); - - var hb = Host.CreateApplicationBuilder(); - - hb.Configuration.AddInMemoryCollection(new Dictionary + if (volumeName is not null) { - [$"ConnectionStrings:{milvus2.Resource.Name}"] = await milvus2.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None) - }); - - hb.AddMilvusClient(milvus2.Resource.Name); + DockerUtils.AttemptDeleteDockerVolume(volumeName); + } - using (var host = hb.Build()) + if (bindMountPath is not null) { - await host.StartAsync(); - - var milvusClient = host.Services.GetRequiredService(); - - var collections = await milvusClient.ListCollectionsAsync(); - - Assert.Empty(collections); + try + { + Directory.Delete(bindMountPath, recursive: true); + } + catch + { + // Don't fail test if we can't clean the temporary folder + } } - - await app.StopAsync(); } } diff --git a/tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj b/tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj index cb3826e6ba4..eff1af6a77d 100644 --- a/tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj +++ b/tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj @@ -29,7 +29,6 @@ - @@ -46,7 +45,6 @@ - From 83b18dcc8b98380ce848af889bd0ae2306a19cde Mon Sep 17 00:00:00 2001 From: Alireza Baloochi Date: Sat, 20 Jul 2024 22:23:53 +0330 Subject: [PATCH 7/8] remove launch profile --- tests/Aspire.Hosting.Milvus.Tests/AddMilvusTests.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/Aspire.Hosting.Milvus.Tests/AddMilvusTests.cs b/tests/Aspire.Hosting.Milvus.Tests/AddMilvusTests.cs index 3ce36afc20c..cf2f49620a6 100644 --- a/tests/Aspire.Hosting.Milvus.Tests/AddMilvusTests.cs +++ b/tests/Aspire.Hosting.Milvus.Tests/AddMilvusTests.cs @@ -104,7 +104,7 @@ public async Task MilvusClientAppWithReferenceContainsConnectionStrings() var milvus = appBuilder.AddMilvus("my-milvus", pass) .WithEndpoint("grpc", e => e.AllocatedEndpoint = new AllocatedEndpoint(e, "localhost", MilvusPortGrpc)); - var projectA = appBuilder.AddProject("projecta") + var projectA = appBuilder.AddProject("projecta", o => o.ExcludeLaunchProfile = true) .WithReference(milvus); // Call environment variable callbacks. @@ -209,7 +209,5 @@ public void AddMilvusWithSpecifyingPorts() private sealed class ProjectA : IProjectMetadata { public string ProjectPath => "projectA"; - - public LaunchSettings LaunchSettings { get; } = new(); } } From 332ca7a82880c4d7ca24704d5a01dc6a11faa411 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Mon, 22 Jul 2024 11:40:14 -0500 Subject: [PATCH 8/8] Remove milvus from the EndToEnd tests --- .../IntegrationServicesFixture.cs | 4 +-- .../IntegrationServicesTests.cs | 1 - .../ManifestGenerationTests.cs | 36 +------------------ tests/testproject/Common/TestResourceNames.cs | 3 +- .../TestProject.AppHost/TestProgram.cs | 11 ------ .../TestProject.AppHost.csproj | 1 - .../Milvus/MilvusExtensions.cs | 25 ------------- .../Program.cs | 10 ------ .../TestProject.IntegrationServiceA.csproj | 1 - 9 files changed, 3 insertions(+), 89 deletions(-) delete mode 100644 tests/testproject/TestProject.IntegrationServiceA/Milvus/MilvusExtensions.cs diff --git a/tests/Aspire.EndToEnd.Tests/IntegrationServicesFixture.cs b/tests/Aspire.EndToEnd.Tests/IntegrationServicesFixture.cs index 1803ee9863e..fff3ef970f4 100644 --- a/tests/Aspire.EndToEnd.Tests/IntegrationServicesFixture.cs +++ b/tests/Aspire.EndToEnd.Tests/IntegrationServicesFixture.cs @@ -105,7 +105,6 @@ public Task DumpComponentLogsAsync(TestResourceNames resource, ITestOutputHelper TestResourceNames.cosmos or TestResourceNames.efcosmos => "cosmos", TestResourceNames.eventhubs => "eventhubs", TestResourceNames.garnet => "garnet", - TestResourceNames.milvus => "milvus", TestResourceNames.mongodb => "mongodb", TestResourceNames.oracledatabase => "oracledatabase", TestResourceNames.postgres or TestResourceNames.efnpgsql => "postgres", @@ -151,8 +150,7 @@ private static TestResourceNames GetResourcesToSkip() | TestResourceNames.postgres | TestResourceNames.efnpgsql | TestResourceNames.sqlserver - | TestResourceNames.efsqlserver - | TestResourceNames.milvus, + | TestResourceNames.efsqlserver, "" or null => TestResourceNames.All, _ => throw new ArgumentException($"Unknown test scenario '{TestScenario}'") }; diff --git a/tests/Aspire.EndToEnd.Tests/IntegrationServicesTests.cs b/tests/Aspire.EndToEnd.Tests/IntegrationServicesTests.cs index ae6ac7e03fb..e8d2393a257 100644 --- a/tests/Aspire.EndToEnd.Tests/IntegrationServicesTests.cs +++ b/tests/Aspire.EndToEnd.Tests/IntegrationServicesTests.cs @@ -31,7 +31,6 @@ public IntegrationServicesTests(ITestOutputHelper testOutput, IntegrationService [InlineData(TestResourceNames.garnet)] [InlineData(TestResourceNames.sqlserver)] [InlineData(TestResourceNames.efsqlserver)] - [InlineData(TestResourceNames.milvus)] public Task VerifyComponentWorks(TestResourceNames resourceName) => RunTestAsync(async () => { diff --git a/tests/Aspire.Hosting.Tests/ManifestGenerationTests.cs b/tests/Aspire.Hosting.Tests/ManifestGenerationTests.cs index f1269d79be6..ad9dc7e3e43 100644 --- a/tests/Aspire.Hosting.Tests/ManifestGenerationTests.cs +++ b/tests/Aspire.Hosting.Tests/ManifestGenerationTests.cs @@ -486,8 +486,7 @@ public void VerifyTestProgramFullManifest() "ConnectionStrings__mymongodb": "{mymongodb.connectionString}", "ConnectionStrings__freepdb1": "{freepdb1.connectionString}", "ConnectionStrings__cosmos": "{cosmos.connectionString}", - "ConnectionStrings__eventhubns": "{eventhubns.connectionString}", - "ConnectionStrings__milvus": "{milvus.connectionString}" + "ConnectionStrings__eventhubns": "{eventhubns.connectionString}" }, "bindings": { "http": { @@ -644,39 +643,6 @@ public void VerifyTestProgramFullManifest() "principalType": "" } }, - "milvusApiKey": { - "type": "parameter.v0", - "value": "{milvusApiKey.inputs.value}", - "inputs": { - "value": { - "type": "string" - } - } - }, - "milvus": { - "type": "container.v0", - "connectionString": "Endpoint={milvus.bindings.grpc.url};Key={milvusApiKey.value}", - "image": "{{TestConstants.AspireTestContainerRegistry}}/milvusdb/milvus:2.3-latest", - "args": [ - "milvus", - "run", - "standalone" - ], - "env": { - "COMMON_STORAGETYPE": "local", - "ETCD_USE_EMBED": "true", - "ETCD_DATA_DIR": "/var/lib/milvus/etcd", - "COMMON_SECURITY_AUTHORIZATIONENABLED": "true" - }, - "bindings": { - "grpc": { - "scheme": "http", - "protocol": "tcp", - "transport": "http2", - "targetPort": 19530 - } - } - }, "sqlserver-password": { "type": "parameter.v0", "value": "{sqlserver-password.inputs.value}", diff --git a/tests/testproject/Common/TestResourceNames.cs b/tests/testproject/Common/TestResourceNames.cs index bca25e6c6d7..5a83a638252 100644 --- a/tests/testproject/Common/TestResourceNames.cs +++ b/tests/testproject/Common/TestResourceNames.cs @@ -18,10 +18,9 @@ public enum TestResourceNames efnpgsql = 1 << 11, garnet = 1 << 12, eventhubs = 1 << 13, - milvus = 1 << 14, efsqlserver = 1 << 16, efcosmos = 1 << 17, - All = cosmos | dashboard | mongodb | oracledatabase | postgres | rabbitmq | redis | sqlserver | efnpgsql | garnet | eventhubs | milvus | efsqlserver | efcosmos + All = cosmos | dashboard | mongodb | oracledatabase | postgres | rabbitmq | redis | sqlserver | efnpgsql | garnet | eventhubs | efsqlserver | efcosmos } public static class TestResourceNamesExtensions diff --git a/tests/testproject/TestProject.AppHost/TestProgram.cs b/tests/testproject/TestProject.AppHost/TestProgram.cs index f6b193e69d3..2bdaaea2079 100644 --- a/tests/testproject/TestProject.AppHost/TestProgram.cs +++ b/tests/testproject/TestProject.AppHost/TestProgram.cs @@ -140,17 +140,6 @@ private TestProgram( var eventHub = AppBuilder.AddAzureEventHubs("eventhubns").RunAsEmulator().AddEventHub("hub"); IntegrationServiceABuilder = IntegrationServiceABuilder.WithReference(eventHub); } - - if (!resourcesToSkip.HasFlag(TestResourceNames.milvus)) - { - builder.Configuration["Parameters:milvusApiKey"] = "root:Milvus"; - - var milvusApiKey = builder.AddParameter("milvusApiKey"); - - var milvus = AppBuilder.AddMilvus("milvus", milvusApiKey) - .WithImageRegistry(AspireTestContainerRegistry); - IntegrationServiceABuilder = IntegrationServiceABuilder.WithReference(milvus); - } } AppBuilder.Services.AddLifecycleHook(); diff --git a/tests/testproject/TestProject.AppHost/TestProject.AppHost.csproj b/tests/testproject/TestProject.AppHost/TestProject.AppHost.csproj index 621c59d2fa7..c58d160e08d 100644 --- a/tests/testproject/TestProject.AppHost/TestProject.AppHost.csproj +++ b/tests/testproject/TestProject.AppHost/TestProject.AppHost.csproj @@ -14,7 +14,6 @@ - diff --git a/tests/testproject/TestProject.IntegrationServiceA/Milvus/MilvusExtensions.cs b/tests/testproject/TestProject.IntegrationServiceA/Milvus/MilvusExtensions.cs deleted file mode 100644 index 0e787680245..00000000000 --- a/tests/testproject/TestProject.IntegrationServiceA/Milvus/MilvusExtensions.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Milvus.Client; - -public static class MilvusExtensions -{ - public static void MapMilvusApi(this WebApplication app) - { - app.MapGet("/milvus/verify", VerifyMilvusAsync); - } - - private static async Task VerifyMilvusAsync(MilvusClient client) - { - try - { - var versionString = await client.GetVersionAsync(); - return Results.Ok($"Success! Milvus version: {versionString}"); - } - catch (Exception e) - { - return Results.Problem(e.ToString()); - } - } -} diff --git a/tests/testproject/TestProject.IntegrationServiceA/Program.cs b/tests/testproject/TestProject.IntegrationServiceA/Program.cs index a6c9bd50aee..82611b5f24b 100644 --- a/tests/testproject/TestProject.IntegrationServiceA/Program.cs +++ b/tests/testproject/TestProject.IntegrationServiceA/Program.cs @@ -74,11 +74,6 @@ }); } -if (!resourcesToSkip.HasFlag(TestResourceNames.milvus)) -{ - builder.AddMilvusClient("milvus"); -} - // Ensure healthChecks are added. Some components like Cosmos // don't add this builder.Services.AddHealthChecks(); @@ -150,9 +145,4 @@ app.MapEventHubsApi(); } -if (!resourcesToSkip.HasFlag(TestResourceNames.milvus)) -{ - app.MapMilvusApi(); -} - app.Run(); diff --git a/tests/testproject/TestProject.IntegrationServiceA/TestProject.IntegrationServiceA.csproj b/tests/testproject/TestProject.IntegrationServiceA/TestProject.IntegrationServiceA.csproj index 051d9f146f7..fa61d1ac211 100644 --- a/tests/testproject/TestProject.IntegrationServiceA/TestProject.IntegrationServiceA.csproj +++ b/tests/testproject/TestProject.IntegrationServiceA/TestProject.IntegrationServiceA.csproj @@ -15,7 +15,6 @@ -