From 3443416a1fbef2c1f9738f789e5783826023a72d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 28 Jul 2025 01:58:36 +0000 Subject: [PATCH 01/11] Initial plan From 8cf6931002dc1f81e99293c2a91da9195ff1e744 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 28 Jul 2025 02:09:37 +0000 Subject: [PATCH 02/11] Fix DbGate ParameterResource.Value blocking calls Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../ActiveMQBuilderExtensions.cs | 2 +- .../MinioBuilderExtensions.cs | 4 ++-- .../MySqlBuilderExtensions.cs | 2 +- .../PostgresBuilderExtensions.cs | 6 +++--- .../RedisBuilderExtensions.cs | 3 ++- .../SqlServerBuilderExtensions.cs | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs index db540e9b..3cc6d29b 100644 --- a/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs @@ -177,7 +177,7 @@ private static IResourceBuilder WithJolokiaHealthCheck( { Uri baseUri = new Uri(endpoint.Url, UriKind.Absolute); string userName = (await builder.Resource.UserNameReference.GetValueAsync(ct))!; - string password = builder.Resource.PasswordParameter.Value; + string password = (await builder.Resource.PasswordParameter.GetValueAsync(ct))!; basicAuthentication = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}")); uri = new UriBuilder(baseUri) { diff --git a/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs index 0b97e8e3..bc3a7f77 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs @@ -46,8 +46,8 @@ public static IResourceBuilder AddMinioContainer( .WithImageRegistry(MinioContainerImageTags.Registry) .WithHttpEndpoint(targetPort: 9000, port: port, name: MinioContainerResource.PrimaryEndpointName) .WithHttpEndpoint(targetPort: consoleTargetPort, name: MinioContainerResource.ConsoleEndpointName) - .WithEnvironment(RootUserEnvVarName, resource.RootUser.Value) - .WithEnvironment(RootPasswordEnvVarName, resource.PasswordParameter.Value) + .WithEnvironment(RootUserEnvVarName, resource.RootUser) + .WithEnvironment(RootPasswordEnvVarName, resource.PasswordParameter) .WithArgs("server", "/data", "--console-address", $":{consoleTargetPort}"); var endpoint = builderWithResource.Resource.GetEndpoint(MinioContainerResource.PrimaryEndpointName); diff --git a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs index f8c052cd..1ec6f3e0 100644 --- a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs @@ -109,7 +109,7 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, context.EnvironmentVariables.Add($"LABEL_mysql{counter}", mySqlServerResource.Name); context.EnvironmentVariables.Add($"SERVER_mysql{counter}", mySqlServerResource.Name); context.EnvironmentVariables.Add($"USER_mysql{counter}", "root"); - context.EnvironmentVariables.Add($"PASSWORD_mysql{counter}", mySqlServerResource.PasswordParameter.Value); + context.EnvironmentVariables.Add($"PASSWORD_mysql{counter}", mySqlServerResource.PasswordParameter); context.EnvironmentVariables.Add($"PORT_mysql{counter}", mySqlServerResource.PrimaryEndpoint.TargetPort!.ToString()!); context.EnvironmentVariables.Add($"ENGINE_mysql{counter}", "mysql@dbgate-plugin-mysql"); diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs index 7aaea327..db696822 100644 --- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs @@ -105,14 +105,14 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, foreach (var postgresServer in postgresInstances) { - var user = postgresServer.UserNameParameter?.Value ?? "postgres"; + var userParameter = postgresServer.UserNameParameter ?? ReferenceExpression.Create("postgres"); // DbGate assumes Postgres is being accessed over a default Aspire container network and hardcodes the resource address // This will need to be refactored once updated service discovery APIs are available context.EnvironmentVariables.Add($"LABEL_postgres{counter}", postgresServer.Name); context.EnvironmentVariables.Add($"SERVER_postgres{counter}", postgresServer.Name); - context.EnvironmentVariables.Add($"USER_postgres{counter}", user); - context.EnvironmentVariables.Add($"PASSWORD_postgres{counter}", postgresServer.PasswordParameter.Value); + context.EnvironmentVariables.Add($"USER_postgres{counter}", userParameter); + context.EnvironmentVariables.Add($"PASSWORD_postgres{counter}", postgresServer.PasswordParameter); context.EnvironmentVariables.Add($"PORT_postgres{counter}", postgresServer.PrimaryEndpoint.TargetPort!.ToString()!); context.EnvironmentVariables.Add($"ENGINE_postgres{counter}", "postgres@dbgate-plugin-postgres"); diff --git a/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs index 51902f82..7d11ed5a 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs @@ -65,7 +65,8 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, // DbGate assumes Redis is being accessed over a default Aspire container network and hardcodes the resource address var redisUrl = redisResource.PasswordParameter is not null ? - $"redis://:{redisResource.PasswordParameter.Value}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"; + ReferenceExpression.Create($"redis://:{redisResource.PasswordParameter}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}") : + ReferenceExpression.Create($"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"); context.EnvironmentVariables.Add($"LABEL_redis{counter}", redisResource.Name); context.EnvironmentVariables.Add($"URL_redis{counter}", redisUrl); diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs index 56fd49ad..d7e930c6 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs @@ -109,7 +109,7 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, context.EnvironmentVariables.Add($"LABEL_sqlserver{counter}", sqlServerResource.Name); context.EnvironmentVariables.Add($"SERVER_sqlserver{counter}", sqlServerResource.Name); context.EnvironmentVariables.Add($"USER_sqlserver{counter}", "sa"); - context.EnvironmentVariables.Add($"PASSWORD_sqlserver{counter}", sqlServerResource.PasswordParameter.Value); + context.EnvironmentVariables.Add($"PASSWORD_sqlserver{counter}", sqlServerResource.PasswordParameter); context.EnvironmentVariables.Add($"PORT_sqlserver{counter}", sqlServerResource.PrimaryEndpoint.TargetPort!.ToString()!); context.EnvironmentVariables.Add($"ENGINE_sqlserver{counter}", "mssql@dbgate-plugin-mssql"); From 48a452ea40b12b26628fc13a296273446fb0fed9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 28 Jul 2025 02:15:53 +0000 Subject: [PATCH 03/11] Update tests to use async GetValueAsync instead of blocking .Value calls Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../AddDbGateTests.cs | 46 +++++++++++-------- .../WithAuthTokenTests.cs | 5 +- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs index ea6c7490..ab4141bc 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs @@ -295,10 +295,11 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("USER_postgres1", item.Key); Assert.Equal("postgres", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_postgres1", item.Key); - Assert.Equal(postgresResource1.PasswordParameter.Value, item.Value); + var expectedPassword = await postgresResource1.PasswordParameter.GetValueAsync(default); + Assert.Equal(expectedPassword, item.Value); }, item => { @@ -325,10 +326,11 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("USER_postgres2", item.Key); Assert.Equal("postgres", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_postgres2", item.Key); - Assert.Equal(postgresResource2.PasswordParameter.Value, item.Value); + var expectedPassword = await postgresResource2.PasswordParameter.GetValueAsync(default); + Assert.Equal(expectedPassword, item.Value); }, item => { @@ -345,12 +347,12 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("LABEL_redis1", item.Key); Assert.Equal(redisResource1.Name, item.Value); }, - item => + async item => { - var redisUrl = redisResource1.PasswordParameter is not null ? - $"redis://:{redisResource1.PasswordParameter.Value}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; + var expectedRedisUrl = redisResource1.PasswordParameter is not null ? + $"redis://:{await redisResource1.PasswordParameter.GetValueAsync(default)}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); - Assert.Equal(redisUrl, item.Value); + Assert.Equal(expectedRedisUrl, item.Value); }, item => { @@ -362,12 +364,12 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("LABEL_redis2", item.Key); Assert.Equal(redisResource2.Name, item.Value); }, - item => + async item => { - var redisUrl = redisResource2.PasswordParameter is not null ? - $"redis://:{redisResource2.PasswordParameter.Value}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; + var expectedRedisUrl = redisResource2.PasswordParameter is not null ? + $"redis://:{await redisResource2.PasswordParameter.GetValueAsync(default)}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis2", item.Key); - Assert.Equal(redisUrl, item.Value); + Assert.Equal(expectedRedisUrl, item.Value); }, item => { @@ -389,10 +391,11 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("USER_sqlserver1", item.Key); Assert.Equal("sa", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - Assert.Equal(sqlserverResource1.PasswordParameter.Value, item.Value); + var expectedPassword = await sqlserverResource1.PasswordParameter.GetValueAsync(default); + Assert.Equal(expectedPassword, item.Value); }, item => { @@ -419,10 +422,11 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("USER_sqlserver2", item.Key); Assert.Equal("sa", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_sqlserver2", item.Key); - Assert.Equal(sqlserverResource2.PasswordParameter.Value, item.Value); + var expectedPassword = await sqlserverResource2.PasswordParameter.GetValueAsync(default); + Assert.Equal(expectedPassword, item.Value); }, item => { @@ -449,10 +453,11 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("USER_mysql1", item.Key); Assert.Equal("root", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_mysql1", item.Key); - Assert.Equal(mysqlResource1.PasswordParameter.Value, item.Value); + var expectedPassword = await mysqlResource1.PasswordParameter.GetValueAsync(default); + Assert.Equal(expectedPassword, item.Value); }, item => { @@ -479,10 +484,11 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("USER_mysql2", item.Key); Assert.Equal("root", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_mysql2", item.Key); - Assert.Equal(mysqlResource2.PasswordParameter.Value, item.Value); + var expectedPassword = await mysqlResource2.PasswordParameter.GetValueAsync(default); + Assert.Equal(expectedPassword, item.Value); }, item => { diff --git a/tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/WithAuthTokenTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/WithAuthTokenTests.cs index ed1c805c..a8afd486 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/WithAuthTokenTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/WithAuthTokenTests.cs @@ -44,7 +44,10 @@ public void WithAuthTokenStringParameterEnvironmentVariable() var context = new EnvironmentCallbackContext(new DistributedApplicationExecutionContext(new DistributedApplicationExecutionContextOptions(DistributedApplicationOperation.Run))); environment.Callback(context); - Assert.Equal("your-ngrok-auth-token", ((ParameterResource)context.EnvironmentVariables["NGROK_AUTHTOKEN"]).Value); + var parameterResource = (ParameterResource)context.EnvironmentVariables["NGROK_AUTHTOKEN"]; + Assert.NotNull(parameterResource); + // Verify it's the expected parameter resource without calling .Value + Assert.Equal("ngrok-authtoken", parameterResource.Name); } [Fact] From f16b0f395cbc36dc3f574a2a30ba01d885dda6c4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 28 Jul 2025 02:58:11 +0000 Subject: [PATCH 04/11] Apply IValueProvider cast pattern for GetValueAsync calls as requested Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com> --- .../ActiveMQBuilderExtensions.cs | 2 +- .../AddDbGateTests.cs | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs index 3cc6d29b..6bf359ae 100644 --- a/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs @@ -177,7 +177,7 @@ private static IResourceBuilder WithJolokiaHealthCheck( { Uri baseUri = new Uri(endpoint.Url, UriKind.Absolute); string userName = (await builder.Resource.UserNameReference.GetValueAsync(ct))!; - string password = (await builder.Resource.PasswordParameter.GetValueAsync(ct))!; + string password = (await ((IValueProvider)builder.Resource.PasswordParameter).GetValueAsync(ct))!; basicAuthentication = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}")); uri = new UriBuilder(baseUri) { diff --git a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs index ab4141bc..d939eecf 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs @@ -1,6 +1,7 @@ using System.Net.Sockets; using Aspire.Components.Common.Tests; using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Utils; namespace CommunityToolkit.Aspire.Hosting.DbGate.Tests; @@ -298,7 +299,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_postgres1", item.Key); - var expectedPassword = await postgresResource1.PasswordParameter.GetValueAsync(default); + var expectedPassword = await ((IValueProvider)postgresResource1.PasswordParameter).GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -329,7 +330,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_postgres2", item.Key); - var expectedPassword = await postgresResource2.PasswordParameter.GetValueAsync(default); + var expectedPassword = await ((IValueProvider)postgresResource2.PasswordParameter).GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -350,7 +351,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { var expectedRedisUrl = redisResource1.PasswordParameter is not null ? - $"redis://:{await redisResource1.PasswordParameter.GetValueAsync(default)}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; + $"redis://:{await ((IValueProvider)redisResource1.PasswordParameter).GetValueAsync(default)}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); Assert.Equal(expectedRedisUrl, item.Value); }, @@ -367,7 +368,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { var expectedRedisUrl = redisResource2.PasswordParameter is not null ? - $"redis://:{await redisResource2.PasswordParameter.GetValueAsync(default)}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; + $"redis://:{await ((IValueProvider)redisResource2.PasswordParameter).GetValueAsync(default)}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis2", item.Key); Assert.Equal(expectedRedisUrl, item.Value); }, @@ -394,7 +395,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - var expectedPassword = await sqlserverResource1.PasswordParameter.GetValueAsync(default); + var expectedPassword = await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -425,7 +426,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_sqlserver2", item.Key); - var expectedPassword = await sqlserverResource2.PasswordParameter.GetValueAsync(default); + var expectedPassword = await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -456,7 +457,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_mysql1", item.Key); - var expectedPassword = await mysqlResource1.PasswordParameter.GetValueAsync(default); + var expectedPassword = await ((IValueProvider)mysqlResource1.PasswordParameter).GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -487,7 +488,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_mysql2", item.Key); - var expectedPassword = await mysqlResource2.PasswordParameter.GetValueAsync(default); + var expectedPassword = await ((IValueProvider)mysqlResource2.PasswordParameter).GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => From 668913104a7e3deecb5e848297ac08a9268f162e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 27 Jul 2025 20:31:55 -0700 Subject: [PATCH 05/11] Apply suggestions from code review --- .../MinioBuilderExtensions.cs | 4 ++-- .../RedisBuilderExtensions.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs index bc3a7f77..45b714d8 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs @@ -46,8 +46,8 @@ public static IResourceBuilder AddMinioContainer( .WithImageRegistry(MinioContainerImageTags.Registry) .WithHttpEndpoint(targetPort: 9000, port: port, name: MinioContainerResource.PrimaryEndpointName) .WithHttpEndpoint(targetPort: consoleTargetPort, name: MinioContainerResource.ConsoleEndpointName) - .WithEnvironment(RootUserEnvVarName, resource.RootUser) - .WithEnvironment(RootPasswordEnvVarName, resource.PasswordParameter) + .WithEnvironment(RootUserEnvVarName, $"{resource.RootUser}") + .WithEnvironment(RootPasswordEnvVarName, $"{resource.PasswordParameter}") .WithArgs("server", "/data", "--console-address", $":{consoleTargetPort}"); var endpoint = builderWithResource.Resource.GetEndpoint(MinioContainerResource.PrimaryEndpointName); diff --git a/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs index 7d11ed5a..d921c9be 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs @@ -65,8 +65,8 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, // DbGate assumes Redis is being accessed over a default Aspire container network and hardcodes the resource address var redisUrl = redisResource.PasswordParameter is not null ? - ReferenceExpression.Create($"redis://:{redisResource.PasswordParameter}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}") : - ReferenceExpression.Create($"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"); + ReferenceExpression.Create($"redis://:{redisResource.PasswordParameter}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort?.ToString()}") : + ReferenceExpression.Create($"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort?.ToString()}"); context.EnvironmentVariables.Add($"LABEL_redis{counter}", redisResource.Name); context.EnvironmentVariables.Add($"URL_redis{counter}", redisUrl); From 02242a221b93fdaf813a934425d96704f2efd780 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 27 Jul 2025 20:34:53 -0700 Subject: [PATCH 06/11] Apply suggestions from code review --- .../PostgresBuilderExtensions.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs index db696822..2c85ba65 100644 --- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs @@ -105,7 +105,9 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, foreach (var postgresServer in postgresInstances) { - var userParameter = postgresServer.UserNameParameter ?? ReferenceExpression.Create("postgres"); + var userParameter = postgresServer.UserNameParameter is null + ? ReferenceExpression.Create($"postgres") + : ReferenceExpression.Create($"{postgresServer.UserNameParameter}"); // DbGate assumes Postgres is being accessed over a default Aspire container network and hardcodes the resource address // This will need to be refactored once updated service discovery APIs are available From c5fd189f967b99a2b0b6646de12ee1949438f954 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Mon, 28 Jul 2025 04:36:24 +0000 Subject: [PATCH 07/11] Working around a compiler bug --- .../AddDbGateTests.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs index d939eecf..3bbb31a7 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs @@ -5,6 +5,7 @@ using Aspire.Hosting.Utils; namespace CommunityToolkit.Aspire.Hosting.DbGate.Tests; + public class AddDbGateTests { [Fact] @@ -227,7 +228,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() var mysqlResource1 = mysqlResourceBuilder1.Resource; - var mysqlResourceBuilder2 =builder.AddMySql("mysql2") + var mysqlResourceBuilder2 = builder.AddMySql("mysql2") .WithDbGate(); var mysqlResource2 = mysqlResourceBuilder2.Resource; @@ -350,8 +351,11 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() }, async item => { - var expectedRedisUrl = redisResource1.PasswordParameter is not null ? - $"redis://:{await ((IValueProvider)redisResource1.PasswordParameter).GetValueAsync(default)}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; + var expectedRedisUrl = redisResource1.PasswordParameter switch + { + IValueProvider parameter => $"redis://:{await parameter.GetValueAsync(default)}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}", + _ => $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" + }; Assert.Equal("URL_redis1", item.Key); Assert.Equal(expectedRedisUrl, item.Value); }, @@ -367,8 +371,11 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() }, async item => { - var expectedRedisUrl = redisResource2.PasswordParameter is not null ? - $"redis://:{await ((IValueProvider)redisResource2.PasswordParameter).GetValueAsync(default)}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; + var expectedRedisUrl = redisResource2.PasswordParameter switch + { + IValueProvider parameter => $"redis://:{await parameter.GetValueAsync(default)}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}", + _ => $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" + }; Assert.Equal("URL_redis2", item.Key); Assert.Equal(expectedRedisUrl, item.Value); }, From cc185c956a7074aa0445bc9a39a5a835e138bdb1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 29 Jul 2025 05:22:13 +0000 Subject: [PATCH 08/11] Migrate remaining ParameterResource.Value calls to async GetValueAsync pattern Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../ContainerResourceCreationTests.cs | 13 +++++++------ .../AddAdminerTests.cs | 17 +++++++++-------- .../AddMeilisearchTests.cs | 3 ++- .../MeilisearchFunctionalTests.cs | 3 ++- .../ResourceCreationTests.cs | 13 +++++++------ .../ResourceCreationTests.cs | 19 ++++++++++--------- .../ResourceCreationTests.cs | 7 ++++--- .../ResourceCreationTests.cs | 13 +++++++------ 8 files changed, 48 insertions(+), 40 deletions(-) diff --git a/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs index 2afb8ade..3881bc34 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; namespace CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests; @@ -29,7 +30,7 @@ public void AddActiveMqApiBuilderSchemeShouldNotBeNullOrWhiteSpace() } [Fact] - public void AddActiveMqApiBuilderContainerDetailsSetOnResource() + public async Task AddActiveMqApiBuilderContainerDetailsSetOnResource() { IDistributedApplicationBuilder builder = DistributedApplication.CreateBuilder(); @@ -44,8 +45,8 @@ public void AddActiveMqApiBuilderContainerDetailsSetOnResource() Assert.NotNull(resource); Assert.Equal("amq", resource.Name); - Assert.Equal("admin", resource.UserNameParameter!.Value); - Assert.Equal("admin", resource.PasswordParameter.Value); + Assert.Equal(await ((IValueProvider)resource.UserNameParameter!).GetValueAsync(CancellationToken.None), "admin"); + Assert.Equal(await ((IValueProvider)resource.PasswordParameter).GetValueAsync(CancellationToken.None), "admin"); Assert.Equal("ACTIVEMQ_CONNECTION_PASSWORD", resource.ActiveMqSettings.EnvironmentVariablePassword); Assert.Equal("ACTIVEMQ_CONNECTION_USER", resource.ActiveMqSettings.EnvironmentVariableUsername); @@ -59,7 +60,7 @@ public void AddActiveMqApiBuilderContainerDetailsSetOnResource() } [Fact] - public void AddActiveMqArtemisApiBuilderContainerDetailsSetOnResource() + public async Task AddActiveMqArtemisApiBuilderContainerDetailsSetOnResource() { IDistributedApplicationBuilder builder = DistributedApplication.CreateBuilder(); @@ -74,8 +75,8 @@ public void AddActiveMqArtemisApiBuilderContainerDetailsSetOnResource() Assert.NotNull(resource); Assert.Equal("amq", resource.Name); - Assert.Equal("admin", resource.UserNameParameter!.Value); - Assert.Equal("admin", resource.PasswordParameter.Value); + Assert.Equal(await ((IValueProvider)resource.UserNameParameter!).GetValueAsync(CancellationToken.None), "admin"); + Assert.Equal(await ((IValueProvider)resource.PasswordParameter).GetValueAsync(CancellationToken.None), "admin"); Assert.Equal("ARTEMIS_PASSWORD", resource.ActiveMqSettings.EnvironmentVariablePassword); Assert.Equal("ARTEMIS_USER", resource.ActiveMqSettings.EnvironmentVariableUsername); diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs index dbf2bd90..9179ca2a 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs @@ -2,6 +2,7 @@ using System.Text.Json; using Aspire.Components.Common.Tests; using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Utils; namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests; @@ -189,8 +190,8 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "pgsql", Server = postgresResource1.Name, - Password = postgresResource1.PasswordParameter.Value, - UserName = postgresResource1.UserNameParameter?.Value ?? "postgres" + Password = await ((IValueProvider)postgresResource1.PasswordParameter).GetValueAsync(CancellationToken.None), + UserName = postgresResource1.UserNameParameter is not null ? await ((IValueProvider)postgresResource1.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" } }, { @@ -199,8 +200,8 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "pgsql", Server = postgresResource2.Name, - Password = postgresResource2.PasswordParameter.Value, - UserName = postgresResource2.UserNameParameter?.Value ?? "postgres" + Password = await ((IValueProvider)postgresResource2.PasswordParameter).GetValueAsync(CancellationToken.None), + UserName = postgresResource2.UserNameParameter is not null ? await ((IValueProvider)postgresResource2.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" } }, { @@ -209,7 +210,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "mssql", Server = sqlserverResource1.Name, - Password = sqlserverResource1.PasswordParameter.Value, + Password = await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "sa" } }, @@ -219,7 +220,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "mssql", Server = sqlserverResource2.Name, - Password = sqlserverResource2.PasswordParameter.Value, + Password = await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "sa" } }, @@ -229,7 +230,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "server", Server = mysqlResource1.Name, - Password = mysqlResource1.PasswordParameter.Value, + Password = await ((IValueProvider)mysqlResource1.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "root" } }, @@ -239,7 +240,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "server", Server = mysqlResource2.Name, - Password = mysqlResource2.PasswordParameter.Value, + Password = await ((IValueProvider)mysqlResource2.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "root" } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs index 86ee3deb..f0790e58 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs @@ -3,6 +3,7 @@ using System.Net.Sockets; using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; namespace CommunityToolkit.Aspire.Hosting.Meilisearch.Tests; public class AddMeilisearchTests @@ -101,7 +102,7 @@ public async Task MeilisearchCreatesConnectionString() var connectionStringResource = Assert.Single(appModel.Resources.OfType()) as IResourceWithConnectionString; var connectionString = await connectionStringResource.GetConnectionStringAsync(); - Assert.Equal($"Endpoint=http://localhost:27020;MasterKey={meilisearch.Resource.MasterKeyParameter.Value}", connectionString); + Assert.Equal($"Endpoint=http://localhost:27020;MasterKey={await ((IValueProvider)meilisearch.Resource.MasterKeyParameter).GetValueAsync(CancellationToken.None)}", connectionString); Assert.Equal("Endpoint=http://{meilisearch.bindings.http.host}:{meilisearch.bindings.http.port};MasterKey={meilisearch-masterKey.value}", connectionStringResource.ConnectionStringExpression.ValueExpression); } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs index c5414393..51a011d3 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs @@ -3,6 +3,7 @@ using Aspire.Components.Common.Tests; using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Hosting; using Polly; @@ -69,7 +70,7 @@ public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) var meilisearch1 = builder1.AddMeilisearch("meilisearch"); - var masterKey = meilisearch1.Resource.MasterKeyParameter.Value; + var masterKey = await ((IValueProvider)meilisearch1.Resource.MasterKeyParameter).GetValueAsync(CancellationToken.None); if (useVolume) { diff --git a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs index de7b08fd..8c53c966 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; using System.Text.Json; namespace CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests; @@ -37,7 +38,7 @@ public async Task WithAdminerAddsAnnotations() { Driver = "server", Server = mysqlResource.Name, - Password = mysqlResource.PasswordParameter.Value, + Password = await ((IValueProvider)mysqlResource.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "root" } }, @@ -138,7 +139,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleMySqlResource() { Driver = "server", Server = mysqlResource1.Name, - Password = mysqlResource1.PasswordParameter.Value, + Password = await ((IValueProvider)mysqlResource1.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "root" } }, @@ -148,7 +149,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleMySqlResource() { Driver = "server", Server = mysqlResource2.Name, - Password = mysqlResource2.PasswordParameter.Value, + Password = await ((IValueProvider)mysqlResource2.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "root" } } @@ -202,7 +203,7 @@ public async Task WithDbGateAddsAnnotations() item => { Assert.Equal("PASSWORD_mysql1", item.Key); - Assert.Equal(mysqlResource.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)mysqlResource.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { @@ -320,7 +321,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() item => { Assert.Equal("PASSWORD_mysql1", item.Key); - Assert.Equal(mysqlResource1.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)mysqlResource1.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { @@ -350,7 +351,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() item => { Assert.Equal("PASSWORD_mysql2", item.Key); - Assert.Equal(mysqlResource2.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)mysqlResource2.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { diff --git a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs index 6c442c49..a348e976 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; using System.Text.Json; namespace CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests; @@ -47,7 +48,7 @@ public async Task WithDbGateAddsAnnotations() item => { Assert.Equal("PASSWORD_postgres1", item.Key); - Assert.Equal(postgresResource.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)postgresResource.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { @@ -165,7 +166,7 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() item => { Assert.Equal("PASSWORD_postgres1", item.Key); - Assert.Equal(postgresResource1.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)postgresResource1.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { @@ -195,7 +196,7 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() item => { Assert.Equal("PASSWORD_postgres2", item.Key); - Assert.Equal(postgresResource2.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)postgresResource2.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { @@ -312,8 +313,8 @@ public async Task WithAdminerAddsAnnotations() { Driver = "pgsql", Server = postgresResource.Name, - Password = postgresResource.PasswordParameter.Value, - UserName = postgresResource.UserNameParameter?.Value ?? "postgres" + Password = await ((IValueProvider)postgresResource.PasswordParameter).GetValueAsync(CancellationToken.None), + UserName = postgresResource.UserNameParameter is not null ? await ((IValueProvider)postgresResource.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" } }, }; @@ -413,8 +414,8 @@ public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource() { Driver = "pgsql", Server = postgresResource1.Name, - Password = postgresResource1.PasswordParameter.Value, - UserName = postgresResource1.UserNameParameter?.Value ?? "postgres" + Password = await ((IValueProvider)postgresResource1.PasswordParameter).GetValueAsync(CancellationToken.None), + UserName = postgresResource1.UserNameParameter is not null ? await ((IValueProvider)postgresResource1.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" } }, { @@ -423,8 +424,8 @@ public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource() { Driver = "pgsql", Server = postgresResource2.Name, - Password = postgresResource2.PasswordParameter.Value, - UserName = postgresResource2.UserNameParameter?.Value ?? "postgres" + Password = await ((IValueProvider)postgresResource2.PasswordParameter).GetValueAsync(CancellationToken.None), + UserName = postgresResource2.UserNameParameter is not null ? await ((IValueProvider)postgresResource2.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" } } }; diff --git a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs index 6b2caf91..94038bed 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; namespace CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests; @@ -37,7 +38,7 @@ public async Task WithDbGateAddsAnnotations() item => { var redisUrl = redisResource.PasswordParameter is not null ? - $"redis://:{redisResource.PasswordParameter.Value}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"; + $"redis://:{await ((IValueProvider)redisResource.PasswordParameter).GetValueAsync(CancellationToken.None)}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); Assert.Equal(redisUrl, item.Value); }, @@ -144,7 +145,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() item => { var redisUrl = redisResource1.PasswordParameter is not null ? - $"redis://:{redisResource1.PasswordParameter.Value}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; + $"redis://:{await ((IValueProvider)redisResource1.PasswordParameter).GetValueAsync(CancellationToken.None)}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); Assert.Equal(redisUrl, item.Value); @@ -162,7 +163,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() item => { var redisUrl = redisResource2.PasswordParameter is not null ? - $"redis://:{redisResource2.PasswordParameter.Value}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; + $"redis://:{await ((IValueProvider)redisResource2.PasswordParameter).GetValueAsync(CancellationToken.None)}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis2", item.Key); Assert.Equal(redisUrl, item.Value); diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs index 6ed2589a..465790b2 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; using System.Text.Json; namespace CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests; @@ -47,7 +48,7 @@ public async Task WithDbGateAddsAnnotations() item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - Assert.Equal(sqlserverResource.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)sqlserverResource.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { @@ -165,7 +166,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - Assert.Equal(sqlserverResource1.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { @@ -195,7 +196,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() item => { Assert.Equal("PASSWORD_sqlserver2", item.Key); - Assert.Equal(sqlserverResource2.PasswordParameter.Value, item.Value); + Assert.Equal(await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); }, item => { @@ -246,7 +247,7 @@ public async Task WithAdminerAddsAnnotations() { Driver = "mssql", Server = sqlserverResource.Name, - Password = sqlserverResource.PasswordParameter.Value, + Password = await ((IValueProvider)sqlserverResource.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "sa" } }, @@ -347,7 +348,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleSqlServerResource() { Driver = "mssql", Server = sqlserverResource1.Name, - Password = sqlserverResource1.PasswordParameter.Value, + Password = await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "sa" } }, @@ -357,7 +358,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleSqlServerResource() { Driver = "mssql", Server = sqlserverResource2.Name, - Password = sqlserverResource2.PasswordParameter.Value, + Password = await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(CancellationToken.None), UserName = "sa" } } From 7eaf60d46925ccfa08273bba32d40246597e43ba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 29 Jul 2025 05:53:28 +0000 Subject: [PATCH 09/11] Revert test file migrations to async GetValueAsync pattern Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../ContainerResourceCreationTests.cs | 13 ++++++------- .../AddAdminerTests.cs | 17 ++++++++--------- .../AddMeilisearchTests.cs | 3 +-- .../MeilisearchFunctionalTests.cs | 3 +-- .../ResourceCreationTests.cs | 13 ++++++------- .../ResourceCreationTests.cs | 19 +++++++++---------- .../ResourceCreationTests.cs | 7 +++---- .../ResourceCreationTests.cs | 13 ++++++------- 8 files changed, 40 insertions(+), 48 deletions(-) diff --git a/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs index 3881bc34..2afb8ade 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs @@ -1,5 +1,4 @@ using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; namespace CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests; @@ -30,7 +29,7 @@ public void AddActiveMqApiBuilderSchemeShouldNotBeNullOrWhiteSpace() } [Fact] - public async Task AddActiveMqApiBuilderContainerDetailsSetOnResource() + public void AddActiveMqApiBuilderContainerDetailsSetOnResource() { IDistributedApplicationBuilder builder = DistributedApplication.CreateBuilder(); @@ -45,8 +44,8 @@ public async Task AddActiveMqApiBuilderContainerDetailsSetOnResource() Assert.NotNull(resource); Assert.Equal("amq", resource.Name); - Assert.Equal(await ((IValueProvider)resource.UserNameParameter!).GetValueAsync(CancellationToken.None), "admin"); - Assert.Equal(await ((IValueProvider)resource.PasswordParameter).GetValueAsync(CancellationToken.None), "admin"); + Assert.Equal("admin", resource.UserNameParameter!.Value); + Assert.Equal("admin", resource.PasswordParameter.Value); Assert.Equal("ACTIVEMQ_CONNECTION_PASSWORD", resource.ActiveMqSettings.EnvironmentVariablePassword); Assert.Equal("ACTIVEMQ_CONNECTION_USER", resource.ActiveMqSettings.EnvironmentVariableUsername); @@ -60,7 +59,7 @@ public async Task AddActiveMqApiBuilderContainerDetailsSetOnResource() } [Fact] - public async Task AddActiveMqArtemisApiBuilderContainerDetailsSetOnResource() + public void AddActiveMqArtemisApiBuilderContainerDetailsSetOnResource() { IDistributedApplicationBuilder builder = DistributedApplication.CreateBuilder(); @@ -75,8 +74,8 @@ public async Task AddActiveMqArtemisApiBuilderContainerDetailsSetOnResource() Assert.NotNull(resource); Assert.Equal("amq", resource.Name); - Assert.Equal(await ((IValueProvider)resource.UserNameParameter!).GetValueAsync(CancellationToken.None), "admin"); - Assert.Equal(await ((IValueProvider)resource.PasswordParameter).GetValueAsync(CancellationToken.None), "admin"); + Assert.Equal("admin", resource.UserNameParameter!.Value); + Assert.Equal("admin", resource.PasswordParameter.Value); Assert.Equal("ARTEMIS_PASSWORD", resource.ActiveMqSettings.EnvironmentVariablePassword); Assert.Equal("ARTEMIS_USER", resource.ActiveMqSettings.EnvironmentVariableUsername); diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs index 9179ca2a..dbf2bd90 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs @@ -2,7 +2,6 @@ using System.Text.Json; using Aspire.Components.Common.Tests; using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Utils; namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests; @@ -190,8 +189,8 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "pgsql", Server = postgresResource1.Name, - Password = await ((IValueProvider)postgresResource1.PasswordParameter).GetValueAsync(CancellationToken.None), - UserName = postgresResource1.UserNameParameter is not null ? await ((IValueProvider)postgresResource1.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" + Password = postgresResource1.PasswordParameter.Value, + UserName = postgresResource1.UserNameParameter?.Value ?? "postgres" } }, { @@ -200,8 +199,8 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "pgsql", Server = postgresResource2.Name, - Password = await ((IValueProvider)postgresResource2.PasswordParameter).GetValueAsync(CancellationToken.None), - UserName = postgresResource2.UserNameParameter is not null ? await ((IValueProvider)postgresResource2.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" + Password = postgresResource2.PasswordParameter.Value, + UserName = postgresResource2.UserNameParameter?.Value ?? "postgres" } }, { @@ -210,7 +209,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "mssql", Server = sqlserverResource1.Name, - Password = await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = sqlserverResource1.PasswordParameter.Value, UserName = "sa" } }, @@ -220,7 +219,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "mssql", Server = sqlserverResource2.Name, - Password = await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = sqlserverResource2.PasswordParameter.Value, UserName = "sa" } }, @@ -230,7 +229,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "server", Server = mysqlResource1.Name, - Password = await ((IValueProvider)mysqlResource1.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = mysqlResource1.PasswordParameter.Value, UserName = "root" } }, @@ -240,7 +239,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "server", Server = mysqlResource2.Name, - Password = await ((IValueProvider)mysqlResource2.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = mysqlResource2.PasswordParameter.Value, UserName = "root" } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs index f0790e58..86ee3deb 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs @@ -3,7 +3,6 @@ using System.Net.Sockets; using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; namespace CommunityToolkit.Aspire.Hosting.Meilisearch.Tests; public class AddMeilisearchTests @@ -102,7 +101,7 @@ public async Task MeilisearchCreatesConnectionString() var connectionStringResource = Assert.Single(appModel.Resources.OfType()) as IResourceWithConnectionString; var connectionString = await connectionStringResource.GetConnectionStringAsync(); - Assert.Equal($"Endpoint=http://localhost:27020;MasterKey={await ((IValueProvider)meilisearch.Resource.MasterKeyParameter).GetValueAsync(CancellationToken.None)}", connectionString); + Assert.Equal($"Endpoint=http://localhost:27020;MasterKey={meilisearch.Resource.MasterKeyParameter.Value}", connectionString); Assert.Equal("Endpoint=http://{meilisearch.bindings.http.host}:{meilisearch.bindings.http.port};MasterKey={meilisearch-masterKey.value}", connectionStringResource.ConnectionStringExpression.ValueExpression); } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs index 51a011d3..c5414393 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs @@ -3,7 +3,6 @@ using Aspire.Components.Common.Tests; using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Hosting; using Polly; @@ -70,7 +69,7 @@ public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) var meilisearch1 = builder1.AddMeilisearch("meilisearch"); - var masterKey = await ((IValueProvider)meilisearch1.Resource.MasterKeyParameter).GetValueAsync(CancellationToken.None); + var masterKey = meilisearch1.Resource.MasterKeyParameter.Value; if (useVolume) { diff --git a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs index 8c53c966..de7b08fd 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs @@ -1,5 +1,4 @@ using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; using System.Text.Json; namespace CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests; @@ -38,7 +37,7 @@ public async Task WithAdminerAddsAnnotations() { Driver = "server", Server = mysqlResource.Name, - Password = await ((IValueProvider)mysqlResource.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = mysqlResource.PasswordParameter.Value, UserName = "root" } }, @@ -139,7 +138,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleMySqlResource() { Driver = "server", Server = mysqlResource1.Name, - Password = await ((IValueProvider)mysqlResource1.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = mysqlResource1.PasswordParameter.Value, UserName = "root" } }, @@ -149,7 +148,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleMySqlResource() { Driver = "server", Server = mysqlResource2.Name, - Password = await ((IValueProvider)mysqlResource2.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = mysqlResource2.PasswordParameter.Value, UserName = "root" } } @@ -203,7 +202,7 @@ public async Task WithDbGateAddsAnnotations() item => { Assert.Equal("PASSWORD_mysql1", item.Key); - Assert.Equal(await ((IValueProvider)mysqlResource.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(mysqlResource.PasswordParameter.Value, item.Value); }, item => { @@ -321,7 +320,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() item => { Assert.Equal("PASSWORD_mysql1", item.Key); - Assert.Equal(await ((IValueProvider)mysqlResource1.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(mysqlResource1.PasswordParameter.Value, item.Value); }, item => { @@ -351,7 +350,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() item => { Assert.Equal("PASSWORD_mysql2", item.Key); - Assert.Equal(await ((IValueProvider)mysqlResource2.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(mysqlResource2.PasswordParameter.Value, item.Value); }, item => { diff --git a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs index a348e976..6c442c49 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs @@ -1,5 +1,4 @@ using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; using System.Text.Json; namespace CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests; @@ -48,7 +47,7 @@ public async Task WithDbGateAddsAnnotations() item => { Assert.Equal("PASSWORD_postgres1", item.Key); - Assert.Equal(await ((IValueProvider)postgresResource.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(postgresResource.PasswordParameter.Value, item.Value); }, item => { @@ -166,7 +165,7 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() item => { Assert.Equal("PASSWORD_postgres1", item.Key); - Assert.Equal(await ((IValueProvider)postgresResource1.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(postgresResource1.PasswordParameter.Value, item.Value); }, item => { @@ -196,7 +195,7 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() item => { Assert.Equal("PASSWORD_postgres2", item.Key); - Assert.Equal(await ((IValueProvider)postgresResource2.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(postgresResource2.PasswordParameter.Value, item.Value); }, item => { @@ -313,8 +312,8 @@ public async Task WithAdminerAddsAnnotations() { Driver = "pgsql", Server = postgresResource.Name, - Password = await ((IValueProvider)postgresResource.PasswordParameter).GetValueAsync(CancellationToken.None), - UserName = postgresResource.UserNameParameter is not null ? await ((IValueProvider)postgresResource.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" + Password = postgresResource.PasswordParameter.Value, + UserName = postgresResource.UserNameParameter?.Value ?? "postgres" } }, }; @@ -414,8 +413,8 @@ public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource() { Driver = "pgsql", Server = postgresResource1.Name, - Password = await ((IValueProvider)postgresResource1.PasswordParameter).GetValueAsync(CancellationToken.None), - UserName = postgresResource1.UserNameParameter is not null ? await ((IValueProvider)postgresResource1.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" + Password = postgresResource1.PasswordParameter.Value, + UserName = postgresResource1.UserNameParameter?.Value ?? "postgres" } }, { @@ -424,8 +423,8 @@ public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource() { Driver = "pgsql", Server = postgresResource2.Name, - Password = await ((IValueProvider)postgresResource2.PasswordParameter).GetValueAsync(CancellationToken.None), - UserName = postgresResource2.UserNameParameter is not null ? await ((IValueProvider)postgresResource2.UserNameParameter).GetValueAsync(CancellationToken.None) : "postgres" + Password = postgresResource2.PasswordParameter.Value, + UserName = postgresResource2.UserNameParameter?.Value ?? "postgres" } } }; diff --git a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs index 94038bed..6b2caf91 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs @@ -1,5 +1,4 @@ using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; namespace CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests; @@ -38,7 +37,7 @@ public async Task WithDbGateAddsAnnotations() item => { var redisUrl = redisResource.PasswordParameter is not null ? - $"redis://:{await ((IValueProvider)redisResource.PasswordParameter).GetValueAsync(CancellationToken.None)}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"; + $"redis://:{redisResource.PasswordParameter.Value}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); Assert.Equal(redisUrl, item.Value); }, @@ -145,7 +144,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() item => { var redisUrl = redisResource1.PasswordParameter is not null ? - $"redis://:{await ((IValueProvider)redisResource1.PasswordParameter).GetValueAsync(CancellationToken.None)}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; + $"redis://:{redisResource1.PasswordParameter.Value}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); Assert.Equal(redisUrl, item.Value); @@ -163,7 +162,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() item => { var redisUrl = redisResource2.PasswordParameter is not null ? - $"redis://:{await ((IValueProvider)redisResource2.PasswordParameter).GetValueAsync(CancellationToken.None)}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; + $"redis://:{redisResource2.PasswordParameter.Value}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis2", item.Key); Assert.Equal(redisUrl, item.Value); diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs index 465790b2..6ed2589a 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs @@ -1,5 +1,4 @@ using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; using System.Text.Json; namespace CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests; @@ -48,7 +47,7 @@ public async Task WithDbGateAddsAnnotations() item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - Assert.Equal(await ((IValueProvider)sqlserverResource.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(sqlserverResource.PasswordParameter.Value, item.Value); }, item => { @@ -166,7 +165,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - Assert.Equal(await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(sqlserverResource1.PasswordParameter.Value, item.Value); }, item => { @@ -196,7 +195,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() item => { Assert.Equal("PASSWORD_sqlserver2", item.Key); - Assert.Equal(await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(CancellationToken.None), item.Value); + Assert.Equal(sqlserverResource2.PasswordParameter.Value, item.Value); }, item => { @@ -247,7 +246,7 @@ public async Task WithAdminerAddsAnnotations() { Driver = "mssql", Server = sqlserverResource.Name, - Password = await ((IValueProvider)sqlserverResource.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = sqlserverResource.PasswordParameter.Value, UserName = "sa" } }, @@ -348,7 +347,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleSqlServerResource() { Driver = "mssql", Server = sqlserverResource1.Name, - Password = await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = sqlserverResource1.PasswordParameter.Value, UserName = "sa" } }, @@ -358,7 +357,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleSqlServerResource() { Driver = "mssql", Server = sqlserverResource2.Name, - Password = await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(CancellationToken.None), + Password = sqlserverResource2.PasswordParameter.Value, UserName = "sa" } } From 6946e060bf2fe010451697ef936be62c6a74f9af Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Wed, 30 Jul 2025 01:06:07 +0000 Subject: [PATCH 10/11] Adding another place where we need to await the parameter resource value --- src/Shared/Dapr/Core/DaprComponentSecretAnnotation.cs | 2 +- .../Dapr/Core/DaprDistributedApplicationLifecycleHook.cs | 2 +- src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Shared/Dapr/Core/DaprComponentSecretAnnotation.cs b/src/Shared/Dapr/Core/DaprComponentSecretAnnotation.cs index ac8ed197..c82f4445 100644 --- a/src/Shared/Dapr/Core/DaprComponentSecretAnnotation.cs +++ b/src/Shared/Dapr/Core/DaprComponentSecretAnnotation.cs @@ -2,4 +2,4 @@ namespace CommunityToolkit.Aspire.Hosting.Dapr; -internal record DaprComponentSecretAnnotation(string Key, string Value) : IResourceAnnotation; +internal record DaprComponentSecretAnnotation(string Key, ParameterResource Value) : IResourceAnnotation; diff --git a/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs b/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs index a5877b31..abd9233f 100644 --- a/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs +++ b/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs @@ -81,7 +81,7 @@ public async Task BeforeStartAsync(DistributedApplicationModel appModel, Cancell { foreach (var secretAnnotation in secretAnnotations) { - secrets[secretAnnotation.Key] = secretAnnotation.Value; + secrets[secretAnnotation.Key] = (await ((IValueProvider)secretAnnotation).GetValueAsync(cancellationToken))!; } // We need to append the secret store path to the resources path onDemandResourcesPaths.TryGetValue("secretstore", out var secretStorePath); diff --git a/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs b/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs index ab6cd930..f4e17121 100644 --- a/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs +++ b/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs @@ -42,7 +42,7 @@ public static IResourceBuilder WithMetadata(this IResour { if (parameterResource.Secret) { - return builder.WithAnnotation(new DaprComponentSecretAnnotation(parameterResource.Name, parameterResource.Value)) + return builder.WithAnnotation(new DaprComponentSecretAnnotation(parameterResource.Name, parameterResource)) .WithAnnotation(new DaprComponentConfigurationAnnotation(schema => { var existing = schema.Spec.Metadata.Find(m => m.Name == name); @@ -62,6 +62,6 @@ public static IResourceBuilder WithMetadata(this IResour })); } - return builder.WithMetadata(name, parameterResource.Value); + return builder.WithMetadata(name, parameterResource); } } From 8af6ebd77601f8318b00f9bd2b6ef9771544cef8 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Wed, 30 Jul 2025 02:14:38 +0000 Subject: [PATCH 11/11] Whoops, stack overflowgit add -A --- .../Dapr/Core/DaprComponentMetadataAnnotation.cs | 2 +- .../DaprDistributedApplicationLifecycleHook.cs | 13 +++++++------ .../DaprMetadataResourceBuilderExtensions.cs | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/Shared/Dapr/Core/DaprComponentMetadataAnnotation.cs b/src/Shared/Dapr/Core/DaprComponentMetadataAnnotation.cs index 1ab611e0..7edadc55 100644 --- a/src/Shared/Dapr/Core/DaprComponentMetadataAnnotation.cs +++ b/src/Shared/Dapr/Core/DaprComponentMetadataAnnotation.cs @@ -1,4 +1,4 @@ using Aspire.Hosting.ApplicationModel; namespace CommunityToolkit.Aspire.Hosting.Dapr; -internal sealed record DaprComponentConfigurationAnnotation(Action Configure) : IResourceAnnotation; +internal sealed record DaprComponentConfigurationAnnotation(Func Configure) : IResourceAnnotation; diff --git a/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs b/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs index abd9233f..5017c16c 100644 --- a/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs +++ b/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs @@ -12,6 +12,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Net.Sockets; +using System.Threading.Tasks; using static CommunityToolkit.Aspire.Hosting.Dapr.CommandLineArgs; namespace CommunityToolkit.Aspire.Hosting.Dapr; @@ -491,7 +492,7 @@ private async Task GetComponentAsync(DaprComponentResource component, Fu { // We should try to read content from a known location (such as aspire root directory) logger.LogInformation("Unvalidated configuration {specType} for component '{ComponentName}'.", component.Type, component.Name); - return await contentWriter(GetDaprComponent(component, component.Type)).ConfigureAwait(false); + return await contentWriter(await GetDaprComponent(component, component.Type)).ConfigureAwait(false); } private async Task GetBuildingBlockComponentAsync(DaprComponentResource component, Func> contentWriter, string defaultProvider, CancellationToken cancellationToken) { @@ -544,19 +545,19 @@ private static async Task GetDefaultContent(DaprComponentResource compon string defaultContent = await File.ReadAllTextAsync(defaultContentPath, cancellationToken).ConfigureAwait(false); string yaml = defaultContent.Replace($"name: {component.Type}", $"name: {component.Name}"); DaprComponentSchema content = DaprComponentSchema.FromYaml(yaml); - ConfigureDaprComponent(component, content); + await ConfigureDaprComponent(component, content); return content.ToString(); } - private static string GetDaprComponent(DaprComponentResource component, string type) + private static async Task GetDaprComponent(DaprComponentResource component, string type) { var content = new DaprComponentSchema(component.Name, type); - ConfigureDaprComponent(component, content); + await ConfigureDaprComponent(component, content); return content.ToString(); } - private static void ConfigureDaprComponent(DaprComponentResource component, DaprComponentSchema content) + private static async Task ConfigureDaprComponent(DaprComponentResource component, DaprComponentSchema content) { if (component.TryGetAnnotationsOfType(out var secrets) && secrets.Any()) { @@ -566,7 +567,7 @@ private static void ConfigureDaprComponent(DaprComponentResource component, Dapr { foreach (var annotation in annotations) { - annotation.Configure(content); + await annotation.Configure(content); } } } diff --git a/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs b/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs index f4e17121..219edde4 100644 --- a/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs +++ b/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs @@ -28,6 +28,7 @@ public static IResourceBuilder WithMetadata(this IResour Name = name, Value = value }); + return Task.CompletedTask; })); @@ -59,9 +60,22 @@ public static IResourceBuilder WithMetadata(this IResour Key = parameterResource.Name } }); + return Task.CompletedTask; })); } - return builder.WithMetadata(name, parameterResource); + return builder.WithAnnotation(new DaprComponentConfigurationAnnotation(async schema => + { + var existing = schema.Spec.Metadata.Find(m => m.Name == name); + if (existing is not null) + { + schema.Spec.Metadata.Remove(existing); + } + schema.Spec.Metadata.Add(new DaprComponentSpecMetadataValue + { + Name = name, + Value = (await ((IValueProvider)parameterResource).GetValueAsync(default))! + }); + })); } }