From 770105ee7a05e3ad19a5dbbf28642a48e14bc85a Mon Sep 17 00:00:00 2001 From: Paulo Morgado <470455+paulomorgado@users.noreply.github.com> Date: Fri, 21 Mar 2025 18:26:54 +0000 Subject: [PATCH 1/4] Refactor database explorer resource builders to not prefix their names the name of the first resource they are added to. --- src/Aspire.Hosting.Kafka/KafkaBuilderExtensions.cs | 2 +- src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs | 2 +- src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs | 2 +- src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs | 2 +- src/Aspire.Hosting.PostgreSQL/PostgresBuilderExtensions.cs | 4 ++-- src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Aspire.Hosting.Kafka/KafkaBuilderExtensions.cs b/src/Aspire.Hosting.Kafka/KafkaBuilderExtensions.cs index 3eb550f4256..6463d30b21c 100644 --- a/src/Aspire.Hosting.Kafka/KafkaBuilderExtensions.cs +++ b/src/Aspire.Hosting.Kafka/KafkaBuilderExtensions.cs @@ -100,7 +100,7 @@ public static IResourceBuilder WithKafkaUI(this IResourceBu } else { - containerName ??= $"{builder.Resource.Name}-kafka-ui"; + containerName ??= "kafka-ui"; var kafkaUi = new KafkaUIContainerResource(containerName); var kafkaUiBuilder = builder.ApplicationBuilder.AddResource(kafkaUi) diff --git a/src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs b/src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs index 9269f1bc38d..bade35f9419 100644 --- a/src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs +++ b/src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs @@ -131,7 +131,7 @@ public static IResourceBuilder WithAttu(this IResourceBuilder builder, { ArgumentNullException.ThrowIfNull(builder); - containerName ??= $"{builder.Resource.Name}-attu"; + containerName ??= "attu"; var attuContainer = new AttuResource(containerName); var resourceBuilder = builder.ApplicationBuilder.AddResource(attuContainer) diff --git a/src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs b/src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs index b411df699a7..6fb2b53a114 100644 --- a/src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs +++ b/src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs @@ -148,7 +148,7 @@ public static IResourceBuilder WithMongoExpress(this IResourceBuilder b { ArgumentNullException.ThrowIfNull(builder); - containerName ??= $"{builder.Resource.Name}-mongoexpress"; + containerName ??= "mongoexpress"; var mongoExpressContainer = new MongoExpressContainerResource(containerName); var resourceBuilder = builder.ApplicationBuilder.AddResource(mongoExpressContainer) diff --git a/src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs b/src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs index 6e751dd2fc1..6593833ac2b 100644 --- a/src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs +++ b/src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs @@ -100,7 +100,7 @@ public static IResourceBuilder WithPhpMyAdmin(this IResourceBuilder bui return builder; } - containerName ??= $"{builder.Resource.Name}-phpmyadmin"; + containerName ??= "phpmyadmin"; var configurationTempFileName = Path.GetTempFileName(); diff --git a/src/Aspire.Hosting.PostgreSQL/PostgresBuilderExtensions.cs b/src/Aspire.Hosting.PostgreSQL/PostgresBuilderExtensions.cs index e7af6de4826..66aae1e5f2f 100644 --- a/src/Aspire.Hosting.PostgreSQL/PostgresBuilderExtensions.cs +++ b/src/Aspire.Hosting.PostgreSQL/PostgresBuilderExtensions.cs @@ -142,7 +142,7 @@ public static IResourceBuilder WithPgAdmin(this IResourceBuilder builde } else { - containerName ??= $"{builder.Resource.Name}-pgadmin"; + containerName ??= "pgadmin"; var pgAdminContainer = new PgAdminContainerResource(containerName); var pgAdminContainerBuilder = builder.ApplicationBuilder.AddResource(pgAdminContainer) @@ -276,7 +276,7 @@ public static IResourceBuilder WithPgWeb(this IResourceB } else { - containerName ??= $"{builder.Resource.Name}-pgweb"; + containerName ??= "pgweb"; var dir = Directory.CreateTempSubdirectory().FullName; var pgwebContainer = new PgWebContainerResource(containerName); var pgwebContainerBuilder = builder.ApplicationBuilder.AddResource(pgwebContainer) diff --git a/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs b/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs index 9ae180aa3bf..62d834b1a67 100644 --- a/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs +++ b/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs @@ -86,7 +86,7 @@ public static IResourceBuilder WithRedisCommander(this IResourceB } else { - containerName ??= $"{builder.Resource.Name}-commander"; + containerName ??= "commander"; var resource = new RedisCommanderResource(containerName); var resourceBuilder = builder.ApplicationBuilder.AddResource(resource) @@ -153,7 +153,7 @@ public static IResourceBuilder WithRedisInsight(this IResourceBui } else { - containerName ??= $"{builder.Resource.Name}-insight"; + containerName ??= "insight"; var resource = new RedisInsightResource(containerName); var resourceBuilder = builder.ApplicationBuilder.AddResource(resource) From b337c02161b25a220c7de94b39cc60ff750766e5 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 12 May 2025 15:35:08 -0700 Subject: [PATCH 2/4] Revert Milvus and MongoDB changes --- Aspire.sln | 2 +- src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs | 2 +- src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs | 2 +- src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs | 4 +++- src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Aspire.sln b/Aspire.sln index bfcf8b6c2f0..c6f65e7fdff 100644 --- a/Aspire.sln +++ b/Aspire.sln @@ -3928,7 +3928,7 @@ Global {A3399DE9-AAB0-43EA-B99B-6A62ABBDD7BF}.Release|x64.Build.0 = Release|Any CPU {A3399DE9-AAB0-43EA-B99B-6A62ABBDD7BF}.Release|x86.ActiveCfg = Release|Any CPU {A3399DE9-AAB0-43EA-B99B-6A62ABBDD7BF}.Release|x86.Build.0 = Release|Any CPU - {6CBA29C8-FF78-4ABC-BEFA-2A53CB4DB2A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6CBA29C8-FF78-4ABC-BEFA-2A53CB4DB2A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6CBA29C8-FF78-4ABC-BEFA-2A53CB4DB2A3}.Debug|Any CPU.Build.0 = Debug|Any CPU {6CBA29C8-FF78-4ABC-BEFA-2A53CB4DB2A3}.Debug|x64.ActiveCfg = Debug|Any CPU {6CBA29C8-FF78-4ABC-BEFA-2A53CB4DB2A3}.Debug|x64.Build.0 = Debug|Any CPU diff --git a/src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs b/src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs index c8a0049f43a..f5f3e68ce79 100644 --- a/src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs +++ b/src/Aspire.Hosting.Milvus/MilvusBuilderExtensions.cs @@ -132,7 +132,7 @@ public static IResourceBuilder WithAttu(this IResourceBuilder builder, { ArgumentNullException.ThrowIfNull(builder); - containerName ??= "attu"; + containerName ??= $"{builder.Resource.Name}-attu"; var attuContainer = new AttuResource(containerName); var resourceBuilder = builder.ApplicationBuilder.AddResource(attuContainer) diff --git a/src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs b/src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs index 1cc9e33cdc9..c99666bb083 100644 --- a/src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs +++ b/src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs @@ -149,7 +149,7 @@ public static IResourceBuilder WithMongoExpress(this IResourceBuilder b { ArgumentNullException.ThrowIfNull(builder); - containerName ??= "mongoexpress"; + containerName ??= $"{builder.Resource.Name}-mongoexpress"; var mongoExpressContainer = new MongoExpressContainerResource(containerName); var resourceBuilder = builder.ApplicationBuilder.AddResource(mongoExpressContainer) diff --git a/src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs b/src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs index 4cc910088f0..cce1fb8bbc2 100644 --- a/src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs +++ b/src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs @@ -189,8 +189,10 @@ public static IResourceBuilder WithPhpMyAdmin(this IResourceBuilder bui { ArgumentNullException.ThrowIfNull(builder); - if (builder.ApplicationBuilder.Resources.OfType().Any()) + if (builder.ApplicationBuilder.Resources.OfType().SingleOrDefault() is { } existinghpMyAdminResource) { + var builderForExistingResource = builder.ApplicationBuilder.CreateResourceBuilder(existinghpMyAdminResource); + configureContainer?.Invoke(builderForExistingResource); return builder; } diff --git a/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs b/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs index edea97659ee..1883abfde5d 100644 --- a/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs +++ b/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs @@ -149,7 +149,7 @@ public static IResourceBuilder WithRedisCommander(this IResourceB } else { - containerName ??= "commander"; + containerName ??= "rediscommander"; var resource = new RedisCommanderResource(containerName); var resourceBuilder = builder.ApplicationBuilder.AddResource(resource) From 2c0eaf2e553a1c938a739c8f313ef4dd93e9e95b Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 12 May 2025 16:09:45 -0700 Subject: [PATCH 3/4] Fix some tests --- tests/Aspire.Hosting.Kafka.Tests/AddKafkaTests.cs | 4 ++-- tests/Aspire.Hosting.MySql.Tests/AddMySqlTests.cs | 8 ++++---- .../Aspire.Hosting.MySql.Tests/MySqlFunctionalTests.cs | 2 +- .../AddPostgresTests.cs | 10 +++++----- .../PostgresFunctionalTests.cs | 4 ++-- tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/Aspire.Hosting.Kafka.Tests/AddKafkaTests.cs b/tests/Aspire.Hosting.Kafka.Tests/AddKafkaTests.cs index 5f3565983f9..f0f55e9e930 100644 --- a/tests/Aspire.Hosting.Kafka.Tests/AddKafkaTests.cs +++ b/tests/Aspire.Hosting.Kafka.Tests/AddKafkaTests.cs @@ -150,9 +150,9 @@ public async Task WithDataBindConfigureCorrectEnvironment() return new() { { "kafka-ui", "kafka-ui", 8081 }, - { null, "kafka1-kafka-ui", 8081 }, + { null, "kafka-ui", 8081 }, { "kafka-ui", "kafka-ui", null }, - { null, "kafka1-kafka-ui", null }, + { null, "kafka-ui", null }, }; } diff --git a/tests/Aspire.Hosting.MySql.Tests/AddMySqlTests.cs b/tests/Aspire.Hosting.MySql.Tests/AddMySqlTests.cs index 4ec690bd66f..ee01ab43fae 100644 --- a/tests/Aspire.Hosting.MySql.Tests/AddMySqlTests.cs +++ b/tests/Aspire.Hosting.MySql.Tests/AddMySqlTests.cs @@ -226,7 +226,7 @@ public void WithMySqlTwiceEndsUpWithOneAdminContainer() builder.AddMySql("mySql").WithPhpMyAdmin(); builder.AddMySql("mySql2").WithPhpMyAdmin(); - Assert.Single(builder.Resources.OfType(), resource => resource.Name == "mySql-phpmyadmin"); + Assert.Single(builder.Resources.OfType(), resource => resource.Name == "phpmyadmin"); } [Fact] @@ -241,11 +241,11 @@ public async Task SingleMySqlInstanceProducesCorrectMySqlHostsVariable() await builder.Eventing.PublishAsync(new(app.Services, app.Services.GetRequiredService())); - var myAdmin = builder.Resources.Single(r => r.Name.EndsWith("-phpmyadmin")); + var myAdmin = builder.Resources.Single(r => r.Name.Equals("phpmyadmin")); var config = await EnvironmentVariableEvaluator.GetEnvironmentVariablesAsync(myAdmin, DistributedApplicationOperation.Run, TestServiceProvider.Instance); - var container = builder.Resources.Single(r => r.Name == "mySql-phpmyadmin"); + var container = builder.Resources.Single(r => r.Name == "phpmyadmin"); Assert.Empty(container.Annotations.OfType()); Assert.Equal($"{mysql.Resource.Name}:{mysql.Resource.PrimaryEndpoint.TargetPort}", config["PMA_HOST"]); @@ -273,7 +273,7 @@ public void WithPhpMyAdminProducesValidServerConfigFile() builder.Eventing.PublishAsync(new(app.Services, app.Services.GetRequiredService())); - var myAdmin = builder.Resources.Single(r => r.Name.EndsWith("-phpmyadmin")); + var myAdmin = builder.Resources.Single(r => r.Name.Equals("phpmyadmin")); var volume = myAdmin.Annotations.OfType().Single(); using var stream = File.OpenRead(volume.Source!); diff --git a/tests/Aspire.Hosting.MySql.Tests/MySqlFunctionalTests.cs b/tests/Aspire.Hosting.MySql.Tests/MySqlFunctionalTests.cs index 0cef5868b28..dd1e53fdf4e 100644 --- a/tests/Aspire.Hosting.MySql.Tests/MySqlFunctionalTests.cs +++ b/tests/Aspire.Hosting.MySql.Tests/MySqlFunctionalTests.cs @@ -508,7 +508,7 @@ public async Task MySql_WithPersistentLifetime_ReusesContainers(bool useMultiple mySqlId2 = GetContainerId(resourceEvent); } - resourceEvent = await rns.WaitForResourceHealthyAsync("resource-phpmyadmin", cts.Token); + resourceEvent = await rns.WaitForResourceHealthyAsync("phpmyadmin", cts.Token); var phpMyAdminId = GetContainerId(resourceEvent); await app.StopAsync(cts.Token).WaitAsync(cts.Token); diff --git a/tests/Aspire.Hosting.PostgreSQL.Tests/AddPostgresTests.cs b/tests/Aspire.Hosting.PostgreSQL.Tests/AddPostgresTests.cs index e98b239ff80..a02adf90e11 100644 --- a/tests/Aspire.Hosting.PostgreSQL.Tests/AddPostgresTests.cs +++ b/tests/Aspire.Hosting.PostgreSQL.Tests/AddPostgresTests.cs @@ -380,7 +380,7 @@ public async Task WithPgAdminAddsContainer() // The mount annotation is added in the AfterEndpointsAllocatedEvent. await builder.Eventing.PublishAsync(new(app.Services, app.Services.GetRequiredService())); - var container = builder.Resources.Single(r => r.Name == "mypostgres-pgadmin"); + var container = builder.Resources.Single(r => r.Name == "pgadmin"); var createFile = container.Annotations.OfType().Single(); Assert.Equal("/pgadmin4", createFile.DestinationPath); @@ -434,7 +434,7 @@ public void WithPgAdminWithCallbackMutatesImage() using var builder = TestDistributedApplicationBuilder.Create(); builder.AddPostgres("mypostgres").WithPgAdmin(pga => pga.WithImageTag("8.3")); - var container = builder.Resources.Single(r => r.Name == "mypostgres-pgadmin"); + var container = builder.Resources.Single(r => r.Name == "pgadmin"); var imageAnnotation = container.Annotations.OfType().Single(); Assert.Equal("8.3", imageAnnotation.Tag); @@ -447,7 +447,7 @@ public void WithPostgresTwiceEndsUpWithOneContainer() builder.AddPostgres("mypostgres1").WithPgAdmin(pga => pga.WithHostPort(8081)); builder.AddPostgres("mypostgres2").WithPgAdmin(pga => pga.WithHostPort(8081)); - Assert.Single(builder.Resources, r => r.Name.EndsWith("-pgadmin")); + Assert.Single(builder.Resources, r => r.Name.Equals("pgadmin")); } [Fact] @@ -470,7 +470,7 @@ public async Task WithPostgresProducesValidServersJsonFile() await builder.Eventing.PublishAsync(new(app.Services, app.Services.GetRequiredService())); - var pgadmin = builder.Resources.Single(r => r.Name.EndsWith("-pgadmin")); + var pgadmin = builder.Resources.Single(r => r.Name.Equals("pgadmin")); var createServers = pgadmin.Annotations.OfType().Single(); @@ -542,7 +542,7 @@ public async Task WithPgwebProducesValidBookmarkFiles() await builder.Eventing.PublishAsync(new(app.Services, app.Services.GetRequiredService())); - var pgweb = builder.Resources.Single(r => r.Name.EndsWith("-pgweb")); + var pgweb = builder.Resources.Single(r => r.Name.Equals("pgweb")); var createBookmarks = pgweb.Annotations.OfType().Single(); Assert.Equal("/", createBookmarks.DestinationPath); diff --git a/tests/Aspire.Hosting.PostgreSQL.Tests/PostgresFunctionalTests.cs b/tests/Aspire.Hosting.PostgreSQL.Tests/PostgresFunctionalTests.cs index 51b60953286..0b6a22a9b82 100644 --- a/tests/Aspire.Hosting.PostgreSQL.Tests/PostgresFunctionalTests.cs +++ b/tests/Aspire.Hosting.PostgreSQL.Tests/PostgresFunctionalTests.cs @@ -485,10 +485,10 @@ public async Task Postgres_WithPersistentLifetime_ReusesContainers() var resourceEvent = await rns.WaitForResourceHealthyAsync("resource", cts.Token); var postgresId = GetContainerId(resourceEvent); - resourceEvent = await rns.WaitForResourceHealthyAsync("resource-pgweb", cts.Token); + resourceEvent = await rns.WaitForResourceHealthyAsync("pgweb", cts.Token); var pgWebId = GetContainerId(resourceEvent); - resourceEvent = await rns.WaitForResourceHealthyAsync("resource-pgadmin", cts.Token); + resourceEvent = await rns.WaitForResourceHealthyAsync("pgadmin", cts.Token); var pgadminId = GetContainerId(resourceEvent); await app.StopAsync(cts.Token).WaitAsync(TimeSpan.FromMinutes(1), cts.Token); diff --git a/tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs b/tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs index 53c539abff0..1bba2ff30cc 100644 --- a/tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs +++ b/tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs @@ -425,7 +425,7 @@ public async Task SingleRedisInstanceWithoutPasswordProducesCorrectRedisHostsVar await builder.Eventing.PublishAsync(new(app.Services, app.Services.GetRequiredService())); - var commander = builder.Resources.Single(r => r.Name.EndsWith("-commander")); + var commander = builder.Resources.Single(r => r.Name.Equals("rediscommander")); var config = await EnvironmentVariableEvaluator.GetEnvironmentVariablesAsync( commander, @@ -449,7 +449,7 @@ public async Task SingleRedisInstanceWithPasswordProducesCorrectRedisHostsVariab await builder.Eventing.PublishAsync(new(app.Services, app.Services.GetRequiredService())); - var commander = builder.Resources.Single(r => r.Name.EndsWith("-commander")); + var commander = builder.Resources.Single(r => r.Name.Equals("rediscommander")); var config = await EnvironmentVariableEvaluator.GetEnvironmentVariablesAsync(commander); @@ -470,7 +470,7 @@ public async Task MultipleRedisInstanceProducesCorrectRedisHostsVariable() await builder.Eventing.PublishAsync(new(app.Services, app.Services.GetRequiredService())); - var commander = builder.Resources.Single(r => r.Name.EndsWith("-commander")); + var commander = builder.Resources.Single(r => r.Name.Equals("rediscommander")); var config = await EnvironmentVariableEvaluator.GetEnvironmentVariablesAsync( commander, From d96d831390ba2764123d9ce42351bc12e34aec98 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 12 May 2025 17:37:20 -0700 Subject: [PATCH 4/4] Rename redisinsight --- src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs | 2 +- tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs b/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs index 1883abfde5d..5de1cdacf4f 100644 --- a/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs +++ b/src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs @@ -220,7 +220,7 @@ public static IResourceBuilder WithRedisInsight(this IResourceBui } else { - containerName ??= "insight"; + containerName ??= "redisinsight"; var resource = new RedisInsightResource(containerName); var resourceBuilder = builder.ApplicationBuilder.AddResource(resource) diff --git a/tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs b/tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs index 1bba2ff30cc..cfef3a338dc 100644 --- a/tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs +++ b/tests/Aspire.Hosting.Redis.Tests/AddRedisTests.cs @@ -251,7 +251,9 @@ public void WithRedisInsightAddsWithRedisInsightResource() builder.AddRedis("myredis1").WithRedisInsight(); builder.AddRedis("myredis2").WithRedisInsight(); - Assert.Single(builder.Resources.OfType()); + var redisinsight = builder.Resources.Single(r => r.Name.Equals("redisinsight")); + + Assert.NotNull(redisinsight); } [Fact]