diff --git a/CommunityToolkit.Aspire.slnx b/CommunityToolkit.Aspire.slnx index 2ca0360e0..a1c768323 100644 --- a/CommunityToolkit.Aspire.slnx +++ b/CommunityToolkit.Aspire.slnx @@ -81,6 +81,11 @@ + + + + + @@ -161,6 +166,7 @@ + @@ -181,6 +187,7 @@ + @@ -208,6 +215,7 @@ + @@ -228,6 +236,7 @@ + diff --git a/Directory.Build.props b/Directory.Build.props index d125e0932..c4a10bc5b 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,7 +12,7 @@ enable 9 - $(AspireMajorVersion).3.1 + $(AspireMajorVersion).4.0 $(AspireVersion) 9.0.0 9.0.4 @@ -37,8 +37,8 @@ - 6 - 1 + 7 + 0 preview.1 $(AspireMajorVersion).$(ToolkitMinorVersion).$(ToolkitPatchVersion) diff --git a/Directory.Packages.props b/Directory.Packages.props index 965c646b7..93a899dd3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -17,7 +17,7 @@ - + @@ -42,7 +42,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -109,7 +109,7 @@ - - + + \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs index 6bf359ae7..f8575b96c 100644 --- a/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQBuilderExtensions.cs @@ -154,10 +154,10 @@ private static IResourceBuilder WithJolokiaHealthCheck( const int statusCode = 200; const string endpointName = "web"; const string scheme = "http"; - EndpointReference endpoint = builder.Resource.GetEndpoint(endpointName); - builder.ApplicationBuilder.Eventing.Subscribe((_, _) => + builder.OnResourceEndpointsAllocated((resource, @event, ct) => { + var endpoint = resource.GetEndpoint(endpointName); if (!endpoint.Exists) { throw new DistributedApplicationException($"The endpoint '{endpointName}' does not exist on the resource '{builder.Resource.Name}'."); @@ -173,11 +173,12 @@ private static IResourceBuilder WithJolokiaHealthCheck( Uri? uri = null; string basicAuthentication = string.Empty; - builder.ApplicationBuilder.Eventing.Subscribe(builder.Resource, async (_, ct) => + builder.OnBeforeResourceStarted(async (resource, _, ct) => { - Uri baseUri = new Uri(endpoint.Url, UriKind.Absolute); - string userName = (await builder.Resource.UserNameReference.GetValueAsync(ct))!; - string password = (await ((IValueProvider)builder.Resource.PasswordParameter).GetValueAsync(ct))!; + var endpoint = resource.GetEndpoint(endpointName); + Uri baseUri = new (endpoint.Url, UriKind.Absolute); + string userName = (await resource.UserNameReference.GetValueAsync(ct))!; + string password = (await resource.PasswordParameter.GetValueAsync(ct))!; basicAuthentication = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}")); uri = new UriBuilder(baseUri) { diff --git a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs index 1ec6f3e02..332d69b7d 100644 --- a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs @@ -135,7 +135,7 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, } } - internal static void ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + internal static async Task ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) { var mysqlInstances = applicationBuilder.Resources.OfType(); @@ -143,35 +143,31 @@ internal static void ConfigureAdminerContainer(EnvironmentCallbackContext contex var new_servers = mysqlInstances.ToDictionary( mysqlServer => mysqlServer.Name, - mysqlServer => + async mysqlServer => { return new AdminerLoginServer { Server = mysqlServer.Name, UserName = "root", - Password = mysqlServer.PasswordParameter.Value, + Password = await mysqlServer.PasswordParameter.GetValueAsync(context.CancellationToken), Driver = "server" // driver for MySQL is called 'server' }; }); if (string.IsNullOrEmpty(ADMINER_SERVERS)) { - string servers_json = JsonSerializer.Serialize(new_servers); - context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + ADMINER_SERVERS = "{}"; // Initialize with an empty JSON object if not set } - else + + var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); + foreach (var server in new_servers) { - var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); - foreach (var server in new_servers) + if (!servers.ContainsKey(server.Key)) { - if (!servers.ContainsKey(server.Key)) - { - servers!.Add(server.Key, server.Value); - } + servers!.Add(server.Key, await server.Value); } - string servers_json = JsonSerializer.Serialize(servers); - context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; } - + string servers_json = JsonSerializer.Serialize(servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Ngrok/NgrokExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Ngrok/NgrokExtensions.cs index dc05ade6b..1baabac51 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Ngrok/NgrokExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Ngrok/NgrokExtensions.cs @@ -34,7 +34,7 @@ public static IResourceBuilder AddNgrok( ArgumentNullException.ThrowIfNull(builder); if (configurationFolder is not null) ArgumentException.ThrowIfNullOrWhiteSpace(configurationFolder); - + if (endpointPort is not null) { ArgumentOutOfRangeException.ThrowIfLessThan(endpointPort.Value, 1, nameof(endpointPort)); @@ -49,28 +49,27 @@ public static IResourceBuilder AddNgrok( configurationFolder ??= Path.Combine(builder.AppHostDirectory, ".ngrok"); if (!Directory.Exists(configurationFolder)) Directory.CreateDirectory(configurationFolder); - - var resource = new NgrokResource(name); - var resourceBuilder = builder.AddResource(resource) + + var resourceBuilder = builder.AddResource(new NgrokResource(name)) .WithImage(NgrokContainerValues.Image, NgrokContainerValues.Tag) .WithImageRegistry(NgrokContainerValues.Registry) .WithBindMount(configurationFolder, "/var/tmp/ngrok") .WithHttpEndpoint(targetPort: 4040, port: endpointPort, name: endpointName); - builder.Eventing.Subscribe(async (e, ct) => + resourceBuilder.OnResourceEndpointsAllocated(async (resource, e, ct) => { var endpointTuples = resource.Annotations .OfType() .SelectMany(annotation => annotation.Endpoints.Select(ngrokEndpoint => (endpointRefernce: annotation.Resource.GetEndpoint(ngrokEndpoint.EndpointName), ngrokEndpoint))) .ToList(); await CreateNgrokConfigurationFileAsync(configurationFolder, name, endpointTuples, configurationVersion ?? 3); - + resourceBuilder.WithArgs( - "start", endpointTuples.Count > 0 ? "--all" : "--none", + "start", endpointTuples.Count > 0 ? "--all" : "--none", "--config", $"/var/tmp/ngrok/{name}.yml"); }); return resourceBuilder; } - + /// /// Adds a ngrok auth token to a ngrok resource. /// @@ -86,7 +85,7 @@ public static IResourceBuilder WithAuthToken( return builder.WithEnvironment(NgrokContainerValues.AuthTokenEnvName, ngrokAuthToken); } - + /// /// Adds a ngrok auth token to a ngrok resource. /// @@ -102,13 +101,13 @@ public static IResourceBuilder WithAuthToken( return builder.WithEnvironment(NgrokContainerValues.AuthTokenEnvName, ngrokAuthToken); } - + /// /// Configures a resource with endpoints as a ngrok tunnel endpoint. /// /// The resource type. public static IResourceBuilder WithTunnelEndpoint( - this IResourceBuilder builder, + this IResourceBuilder builder, IResourceBuilder resource, string endpointName, string? ngrokUrl = null, @@ -136,7 +135,7 @@ public static IResourceBuilder WithTunnelEndpoint( return builder; } - + private static async Task CreateNgrokConfigurationFileAsync( string configurationFolder, string name, @@ -165,7 +164,7 @@ private static async Task CreateNgrokConfigurationFileAsync( break; case 3: ngrokConfig.AppendLine("agent:"); - ngrokConfig.AppendLine( " log: stdout"); + ngrokConfig.AppendLine(" log: stdout"); if (endpointTuples.Count > 0) { ngrokConfig.AppendLine(); @@ -190,7 +189,7 @@ private static async Task CreateNgrokConfigurationFileAsync( private static string GetUpstreamUrl(EndpointReference endpoint) { var isLocal = endpoint.Host.Equals("localhost", StringComparison.InvariantCultureIgnoreCase); - var host = (IsWindows || IsOsx) && isLocal? "host.docker.internal" : endpoint.Host; + var host = (IsWindows || IsOsx) && isLocal ? "host.docker.internal" : endpoint.Host; return $"{endpoint.Scheme}://{host}:{endpoint.Port}"; } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs index 2c85ba65d..dbe6ea34b 100644 --- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs @@ -44,7 +44,7 @@ public static IResourceBuilder WithDbGate(this IResource var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); dbGateBuilder - .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); configureContainer?.Invoke(dbGateBuilder); @@ -105,9 +105,9 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, foreach (var postgresServer in postgresInstances) { - var userParameter = postgresServer.UserNameParameter is null - ? ReferenceExpression.Create($"postgres") - : ReferenceExpression.Create($"{postgresServer.UserNameParameter}"); + 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 @@ -141,7 +141,7 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, } - internal static void ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + internal static async Task ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) { var postgresInstances = applicationBuilder.Resources.OfType(); @@ -149,36 +149,37 @@ internal static void ConfigureAdminerContainer(EnvironmentCallbackContext contex var new_servers = postgresInstances.ToDictionary( postgresServer => postgresServer.Name, - postgresServer => + async postgresServer => { - var user = postgresServer.UserNameParameter?.Value ?? "postgres"; + var user = postgresServer.UserNameParameter switch + { + null => "postgres", + _ => await postgresServer.UserNameParameter.GetValueAsync(context.CancellationToken) + }; return new AdminerLoginServer { Server = postgresServer.Name, UserName = user, - Password = postgresServer.PasswordParameter.Value, + Password = await postgresServer.PasswordParameter.GetValueAsync(context.CancellationToken), Driver = "pgsql" }; }); if (string.IsNullOrEmpty(ADMINER_SERVERS)) { - string servers_json = JsonSerializer.Serialize(new_servers); - context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + ADMINER_SERVERS = "{}"; // Initialize with an empty JSON object if not set } - else + + var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); + foreach (var server in new_servers) { - var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); - foreach (var server in new_servers) + if (!servers.ContainsKey(server.Key)) { - if (!servers.ContainsKey(server.Key)) - { - servers!.Add(server.Key, server.Value); - } + servers.Add(server.Key, await server.Value); } - string servers_json = JsonSerializer.Serialize(servers); - context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; } + string servers_json = JsonSerializer.Serialize(servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs index d7e930c66..03573e9e5 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs @@ -135,7 +135,7 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, } } - private static void ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + private static async Task ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) { var sqlServerInstances = applicationBuilder.Resources.OfType(); @@ -143,36 +143,31 @@ private static void ConfigureAdminerContainer(EnvironmentCallbackContext context var new_servers = sqlServerInstances.ToDictionary( sqlServerServerResource => sqlServerServerResource.Name, - sqlServerServerResource => + async sqlServerServerResource => { return new AdminerLoginServer { Server = sqlServerServerResource.Name, UserName = "sa", - Password = sqlServerServerResource.PasswordParameter.Value, + Password = await sqlServerServerResource.PasswordParameter.GetValueAsync(context.CancellationToken), Driver = "mssql" }; }); if (string.IsNullOrEmpty(ADMINER_SERVERS)) { - string servers_json = JsonSerializer.Serialize(new_servers); - context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + ADMINER_SERVERS = "{}"; // Initialize with an empty JSON object if not set } - else + + var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); + foreach (var server in new_servers) { - var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); - foreach (var server in new_servers) + if (!servers.ContainsKey(server.Key)) { - if (!servers.ContainsKey(server.Key)) - { - servers!.Add(server.Key, server.Value); - } + servers!.Add(server.Key, await server.Value); } - string servers_json = JsonSerializer.Serialize(servers); - context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; } - + string servers_json = JsonSerializer.Serialize(servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; } - } \ No newline at end of file diff --git a/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs b/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs index 5017c16c3..c42ae6727 100644 --- a/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs +++ b/src/Shared/Dapr/Core/DaprDistributedApplicationLifecycleHook.cs @@ -82,7 +82,7 @@ public async Task BeforeStartAsync(DistributedApplicationModel appModel, Cancell { foreach (var secretAnnotation in secretAnnotations) { - secrets[secretAnnotation.Key] = (await ((IValueProvider)secretAnnotation).GetValueAsync(cancellationToken))!; + secrets[secretAnnotation.Key] = (await secretAnnotation.Value.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 219edde4a..7944bb871 100644 --- a/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs +++ b/src/Shared/Dapr/Core/DaprMetadataResourceBuilderExtensions.cs @@ -74,7 +74,7 @@ public static IResourceBuilder WithMetadata(this IResour schema.Spec.Metadata.Add(new DaprComponentSpecMetadataValue { Name = name, - Value = (await ((IValueProvider)parameterResource).GetValueAsync(default))! + Value = (await parameterResource.GetValueAsync(default))! }); })); } diff --git a/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs index 2afb8adee..dad97e593 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests/ContainerResourceCreationTests.cs @@ -29,7 +29,7 @@ public void AddActiveMqApiBuilderSchemeShouldNotBeNullOrWhiteSpace() } [Fact] - public void AddActiveMqApiBuilderContainerDetailsSetOnResource() + public async Task AddActiveMqApiBuilderContainerDetailsSetOnResource() { IDistributedApplicationBuilder builder = DistributedApplication.CreateBuilder(); @@ -44,8 +44,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("admin", await resource.UserNameParameter!.GetValueAsync(default)); + Assert.Equal("admin", await resource.PasswordParameter.GetValueAsync(default)); Assert.Equal("ACTIVEMQ_CONNECTION_PASSWORD", resource.ActiveMqSettings.EnvironmentVariablePassword); Assert.Equal("ACTIVEMQ_CONNECTION_USER", resource.ActiveMqSettings.EnvironmentVariableUsername); @@ -59,7 +59,7 @@ public void AddActiveMqApiBuilderContainerDetailsSetOnResource() } [Fact] - public void AddActiveMqArtemisApiBuilderContainerDetailsSetOnResource() + public async Task AddActiveMqArtemisApiBuilderContainerDetailsSetOnResource() { IDistributedApplicationBuilder builder = DistributedApplication.CreateBuilder(); @@ -74,8 +74,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("admin", await resource.UserNameParameter!.GetValueAsync(default)); + Assert.Equal("admin", await resource.PasswordParameter.GetValueAsync(default)); 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 dbf2bd902..963891292 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs @@ -5,6 +5,7 @@ using Aspire.Hosting.Utils; namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests; + public class AddAdminerTests { [Fact] @@ -189,8 +190,11 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "pgsql", Server = postgresResource1.Name, - Password = postgresResource1.PasswordParameter.Value, - UserName = postgresResource1.UserNameParameter?.Value ?? "postgres" + Password = await postgresResource1.PasswordParameter.GetValueAsync(default), + UserName = postgresResource1.UserNameParameter switch { + null => "postgres", + _ => await postgresResource1.UserNameParameter.GetValueAsync(default) + } } }, { @@ -199,8 +203,11 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "pgsql", Server = postgresResource2.Name, - Password = postgresResource2.PasswordParameter.Value, - UserName = postgresResource2.UserNameParameter?.Value ?? "postgres" + Password = await postgresResource2.PasswordParameter.GetValueAsync(default), + UserName = postgresResource2.UserNameParameter switch { + null => "postgres", + _ => await postgresResource2.UserNameParameter.GetValueAsync(default) + } } }, { @@ -209,7 +216,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "mssql", Server = sqlserverResource1.Name, - Password = sqlserverResource1.PasswordParameter.Value, + Password = await sqlserverResource1.PasswordParameter.GetValueAsync(default), UserName = "sa" } }, @@ -219,7 +226,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "mssql", Server = sqlserverResource2.Name, - Password = sqlserverResource2.PasswordParameter.Value, + Password = await sqlserverResource2.PasswordParameter.GetValueAsync(default), UserName = "sa" } }, @@ -229,7 +236,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "server", Server = mysqlResource1.Name, - Password = mysqlResource1.PasswordParameter.Value, + Password = await mysqlResource1.PasswordParameter.GetValueAsync(default), UserName = "root" } }, @@ -239,7 +246,7 @@ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() { Driver = "server", Server = mysqlResource2.Name, - Password = mysqlResource2.PasswordParameter.Value, + Password = await mysqlResource2.PasswordParameter.GetValueAsync(default), UserName = "root" } } @@ -294,7 +301,7 @@ public async Task AddAdminerWithDefaultsAddsUrlAnnotations() var adminer = builder.AddAdminer("adminer"); var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - builder.Eventing.Subscribe((e, ct) => + adminer.OnResourceEndpointsAllocated((resource, @event, ct) => { tcs.SetResult(); return Task.CompletedTask; diff --git a/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests/ResourceCreationTests.cs index f6b76d04b..df47fd4dc 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests/ResourceCreationTests.cs @@ -29,56 +29,56 @@ public void WithReference_WhenAADDisabled_UsesPasswordSecret() string redisBicep = redisCache.GetBicepTemplateString(); string expectedRedisBicep = $$""" - @description('The location for the resource(s) to be deployed.') - param location string = resourceGroup().location - - param keyVaultName string - - resource redisState 'Microsoft.Cache/redis@2024-03-01' = { - name: take('redisState-${uniqueString(resourceGroup().id)}', 63) - location: location - properties: { - sku: { - name: 'Basic' - family: 'C' - capacity: 1 - } - enableNonSslPort: false - minimumTlsVersion: '1.2' - } - tags: { - 'aspire-resource-name': 'redisState' - } - } +@description('The location for the resource(s) to be deployed.') +param location string = resourceGroup().location + +param redisstate_kv_outputs_name string + +resource redisState 'Microsoft.Cache/redis@2024-11-01' = { + name: take('redisState-${uniqueString(resourceGroup().id)}', 63) + location: location + properties: { + sku: { + name: 'Basic' + family: 'C' + capacity: 1 + } + enableNonSslPort: false + minimumTlsVersion: '1.2' + } + tags: { + 'aspire-resource-name': 'redisState' + } +} - resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = { - name: keyVaultName - } +resource keyVault 'Microsoft.KeyVault/vaults@2024-11-01' existing = { + name: redisstate_kv_outputs_name +} - resource connectionString 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = { - name: 'connectionstrings--redisState' - properties: { - value: '${redisState.properties.hostName},ssl=true,password=${redisState.listKeys().primaryKey}' - } - parent: keyVault - } +resource connectionString 'Microsoft.KeyVault/vaults/secrets@2024-11-01' = { + name: 'connectionstrings--redisState' + properties: { + value: '${redisState.properties.hostName},ssl=true,password=${redisState.listKeys().primaryKey}' + } + parent: keyVault +} - resource redisPassword 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = { - name: 'redis-password' - properties: { - value: redisState.listKeys().primaryKey - } - parent: keyVault - } +resource redisPassword 'Microsoft.KeyVault/vaults/secrets@2024-11-01' = { + name: 'redis-password' + properties: { + value: redisState.listKeys().primaryKey + } + parent: keyVault +} - output name string = redisState.name +output name string = redisState.name - output daprConnectionString string = '${redisState.properties.hostName}:${redisState.properties.sslPort}' +output daprConnectionString string = '${redisState.properties.hostName}:${redisState.properties.sslPort}' - output redisKeyVaultName string = keyVaultName - """; +output redisKeyVaultName string = redisstate_kv_outputs_name +"""; - Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); + Assert.Equal(expectedRedisBicep.ReplaceLineEndings(), redisBicep.ReplaceLineEndings()); var componentResources = appModel.Resources.OfType(); var daprResource = Assert.Single(componentResources, _ => _.Name == "redisDaprComponent"); @@ -86,48 +86,48 @@ param keyVaultName string string daprBicep = daprResource.GetBicepTemplateString(); string expectedDaprBicep = $$""" - @description('The location for the resource(s) to be deployed.') - param location string = resourceGroup().location +@description('The location for the resource(s) to be deployed.') +param location string = resourceGroup().location - param redisHost string +param redisHost string - param secretStoreComponent string +param secretStoreComponent string - var resourceToken = uniqueString(resourceGroup().id) +var resourceToken = uniqueString(resourceGroup().id) - resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2024-03-01' existing = { - name: 'cae-${resourceToken}' - } +resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2025-01-01' existing = { + name: 'cae-${resourceToken}' +} - resource redisDaprComponent 'Microsoft.App/managedEnvironments/daprComponents@2024-03-01' = { - name: 'statestore' - properties: { - componentType: 'state.redis' - metadata: [ - { - name: 'redisHost' - value: redisHost - } - { - name: 'enableTLS' - value: 'true' - } - { - name: 'actorStateStore' - value: 'true' - } - { - name: 'redisPassword' - secretRef: 'redis-password' - } - ] - secretStoreComponent: secretStoreComponent - version: 'v1' - } - parent: containerAppEnvironment - } - """; - Assert.Equal(NormalizeLineEndings(expectedDaprBicep), NormalizeLineEndings(daprBicep)); +resource redisDaprComponent 'Microsoft.App/managedEnvironments/daprComponents@2025-01-01' = { + name: 'statestore' + properties: { + componentType: 'state.redis' + metadata: [ + { + name: 'redisHost' + value: redisHost + } + { + name: 'enableTLS' + value: 'true' + } + { + name: 'actorStateStore' + value: 'true' + } + { + name: 'redisPassword' + secretRef: 'redis-password' + } + ] + secretStoreComponent: secretStoreComponent + version: 'v1' + } + parent: containerAppEnvironment +} +"""; + Assert.Equal(expectedDaprBicep.ReplaceLineEndings(), daprBicep.ReplaceLineEndings()); } @@ -154,7 +154,7 @@ public void WithReference_WhenAADEnabled_SkipsPasswordSecret() @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location - resource redisState 'Microsoft.Cache/redis@2024-03-01' = { + resource redisState 'Microsoft.Cache/redis@2024-11-01' = { name: take('redisState-${uniqueString(resourceGroup().id)}', 63) location: location properties: { @@ -182,7 +182,7 @@ public void WithReference_WhenAADEnabled_SkipsPasswordSecret() output daprConnectionString string = '${redisState.properties.hostName}:${redisState.properties.sslPort}' """; - Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); + Assert.Equal(expectedRedisBicep.ReplaceLineEndings(), redisBicep.ReplaceLineEndings()); var componentResources = appModel.Resources.OfType(); @@ -200,11 +200,11 @@ param principalId string var resourceToken = uniqueString(resourceGroup().id) - resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2024-03-01' existing = { + resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2025-01-01' existing = { name: 'cae-${resourceToken}' } - resource redisDaprComponent 'Microsoft.App/managedEnvironments/daprComponents@2024-03-01' = { + resource redisDaprComponent 'Microsoft.App/managedEnvironments/daprComponents@2025-01-01' = { name: 'statestore' properties: { componentType: 'state.redis' @@ -237,7 +237,7 @@ param principalId string """; - Assert.Equal(NormalizeLineEndings(expectedDaprBicep), NormalizeLineEndings(daprBicep)); + Assert.Equal(expectedDaprBicep.ReplaceLineEndings(), daprBicep.ReplaceLineEndings()); } @@ -270,7 +270,7 @@ public void WithReference_WhenTLSDisabled_UsesNonSslPort() @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location - resource redisState 'Microsoft.Cache/redis@2024-03-01' = { + resource redisState 'Microsoft.Cache/redis@2024-11-01' = { name: take('redisState-${uniqueString(resourceGroup().id)}', 63) location: location properties: { @@ -299,7 +299,7 @@ public void WithReference_WhenTLSDisabled_UsesNonSslPort() """; - Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); + Assert.Equal(expectedRedisBicep.ReplaceLineEndings(), redisBicep.ReplaceLineEndings()); } [Fact] @@ -316,9 +316,4 @@ public void WithReference_WhenNonStateType_ThrowsException() Assert.Contains("Unsupported Dapr component type: pubsub", ex.Message); } - public static string NormalizeLineEndings(string input) - { - return input.Replace("\r\n", "\n"); - } - } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests/AzureDaprPublishingHelperTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests/AzureDaprPublishingHelperTests.cs index 065ff160b..df9cbc3e3 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests/AzureDaprPublishingHelperTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests/AzureDaprPublishingHelperTests.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; namespace CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests; + public class AzureDaprPublishingHelperTests { [Fact] @@ -22,9 +23,11 @@ public async Task ExecuteProviderSpecificRequirements_AddsAzureContainerAppCusto .WithReference(daprState) .WithDaprSidecar(); + builder.AddAzureContainerAppEnvironment("name-env"); + using var app = builder.Build(); - await ExecuteBeforeStartHooksAsync(app, default); + await ExecuteBeforeStartHooksAsync(app, default); var appModel = app.Services.GetRequiredService(); diff --git a/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests/ResourceCreationTests.cs index 44bd20c21..d6323a30a 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests/ResourceCreationTests.cs @@ -8,61 +8,61 @@ namespace CommunityToolkit.Aspire.Hosting.Dapr.AzureExtensions.Tests; public class ResourceCreationTests { - [Fact] - public void AddAzureDaprResource_AddsToAppBuilder() - { - var builder = DistributedApplication.CreateBuilder(); + [Fact] + public void AddAzureDaprResource_AddsToAppBuilder() + { + var builder = DistributedApplication.CreateBuilder(); - var daprStateBuilder = builder.AddDaprStateStore("statestore") - .AddAzureDaprResource("AzureDaprResource", _ => - { - // no-op - }); + var daprStateBuilder = builder.AddDaprStateStore("statestore") + .AddAzureDaprResource("AzureDaprResource", _ => + { + // no-op + }); - using var app = builder.Build(); + using var app = builder.Build(); - var appModel = app.Services.GetRequiredService(); + var appModel = app.Services.GetRequiredService(); - var resource = Assert.Single(appModel.Resources.OfType()); + var resource = Assert.Single(appModel.Resources.OfType()); - } + } - [Fact] - public void CreateDaprComponent_ReturnsPopulatedComponent() - { - var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); + [Fact] + public void CreateDaprComponent_ReturnsPopulatedComponent() + { + var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); - Assert.NotNull(daprResource); - Assert.Equal("daprComponent", daprResource.BicepIdentifier); - Assert.Equal("state.redis", daprResource.ComponentType.Value); - Assert.Equal("v1", daprResource.Version.Value); - } + Assert.NotNull(daprResource); + Assert.Equal("daprComponent", daprResource.BicepIdentifier); + Assert.Equal("state.redis", daprResource.ComponentType.Value); + Assert.Equal("v1", daprResource.Version.Value); + } - [Fact] - public void GetInfrastructureConfigurationAction_ComponentNameCanBeOverwritten() - { - using var builder = TestDistributedApplicationBuilder.Create(); + [Fact] + public void GetInfrastructureConfigurationAction_ComponentNameCanBeOverwritten() + { + using var builder = TestDistributedApplicationBuilder.Create(); - var redisHost = new ProvisioningParameter("daprConnectionString", typeof(string)); - var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); + var redisHost = new ProvisioningParameter("daprConnectionString", typeof(string)); + var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); - daprResource.Name = "myDaprComponent"; + daprResource.Name = "myDaprComponent"; - var azureDaprResourceBuilder = builder.AddDaprStateStore("daprState"); + var azureDaprResourceBuilder = builder.AddDaprStateStore("daprState"); - var configureInfrastructure = azureDaprResourceBuilder.GetInfrastructureConfigurationAction(daprResource, [redisHost]); + var configureInfrastructure = azureDaprResourceBuilder.GetInfrastructureConfigurationAction(daprResource, [redisHost]); - azureDaprResourceBuilder.AddAzureDaprResource("AzureDaprResource", configureInfrastructure); + azureDaprResourceBuilder.AddAzureDaprResource("AzureDaprResource", configureInfrastructure); - using var app = builder.Build(); + using var app = builder.Build(); - var appModel = app.Services.GetRequiredService(); + var appModel = app.Services.GetRequiredService(); - var resource = Assert.Single(appModel.Resources.OfType()); + var resource = Assert.Single(appModel.Resources.OfType()); - string bicepTemplate = resource.GetBicepTemplateString(); + string bicepTemplate = resource.GetBicepTemplateString(); - string expectedBicep = $$""" + string expectedBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location @@ -70,11 +70,11 @@ param daprConnectionString string var resourceToken = uniqueString(resourceGroup().id) - resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2024-03-01' existing = { + resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2025-01-01' existing = { name: 'cae-${resourceToken}' } - resource daprComponent 'Microsoft.App/managedEnvironments/daprComponents@2024-03-01' = { + resource daprComponent 'Microsoft.App/managedEnvironments/daprComponents@2025-01-01' = { name: 'myDaprComponent' properties: { componentType: 'state.redis' @@ -84,32 +84,32 @@ param daprConnectionString string } """; - Assert.Equal(expectedBicep, bicepTemplate); - } + Assert.Equal(expectedBicep.ReplaceLineEndings(), bicepTemplate.ReplaceLineEndings()); + } - [Fact] - public void GetInfrastructureConfigurationAction_AddsContainerAppEnv_AndDaprComponent_AndParametersAsync() - { - using var builder = TestDistributedApplicationBuilder.Create(); + [Fact] + public void GetInfrastructureConfigurationAction_AddsContainerAppEnv_AndDaprComponent_AndParametersAsync() + { + using var builder = TestDistributedApplicationBuilder.Create(); - var redisHost = new ProvisioningParameter("daprConnectionString", typeof(string)); - var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); + var redisHost = new ProvisioningParameter("daprConnectionString", typeof(string)); + var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); - var azureDaprResourceBuilder = builder.AddDaprStateStore("daprState"); + var azureDaprResourceBuilder = builder.AddDaprStateStore("daprState"); - var configureInfrastructure = azureDaprResourceBuilder.GetInfrastructureConfigurationAction(daprResource, [redisHost]); + var configureInfrastructure = azureDaprResourceBuilder.GetInfrastructureConfigurationAction(daprResource, [redisHost]); - azureDaprResourceBuilder.AddAzureDaprResource("AzureDaprResource", configureInfrastructure); + azureDaprResourceBuilder.AddAzureDaprResource("AzureDaprResource", configureInfrastructure); - using var app = builder.Build(); + using var app = builder.Build(); - var appModel = app.Services.GetRequiredService(); + var appModel = app.Services.GetRequiredService(); - var resource = Assert.Single(appModel.Resources.OfType()); + var resource = Assert.Single(appModel.Resources.OfType()); - string bicepTemplate = resource.GetBicepTemplateString(); + string bicepTemplate = resource.GetBicepTemplateString(); - string expectedBicep = $$""" + string expectedBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location @@ -117,11 +117,11 @@ param daprConnectionString string var resourceToken = uniqueString(resourceGroup().id) - resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2024-03-01' existing = { + resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2025-01-01' existing = { name: 'cae-${resourceToken}' } - resource daprComponent 'Microsoft.App/managedEnvironments/daprComponents@2024-03-01' = { + resource daprComponent 'Microsoft.App/managedEnvironments/daprComponents@2025-01-01' = { name: 'componentName' properties: { componentType: 'state.redis' @@ -131,41 +131,41 @@ param daprConnectionString string } """; - Assert.Equal(expectedBicep, bicepTemplate); - } + Assert.Equal(expectedBicep.ReplaceLineEndings(), bicepTemplate.ReplaceLineEndings()); + } - [Fact] - public void GetInfrastructureConfigurationAction_HandlesNullParameters() - { - using var builder = TestDistributedApplicationBuilder.Create(); + [Fact] + public void GetInfrastructureConfigurationAction_HandlesNullParameters() + { + using var builder = TestDistributedApplicationBuilder.Create(); - var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); + var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); - var azureDaprResourceBuilder = builder.AddDaprStateStore("statestore"); + var azureDaprResourceBuilder = builder.AddDaprStateStore("statestore"); - var configureInfrastructure = azureDaprResourceBuilder.GetInfrastructureConfigurationAction(daprResource); + var configureInfrastructure = azureDaprResourceBuilder.GetInfrastructureConfigurationAction(daprResource); - azureDaprResourceBuilder.AddAzureDaprResource("AzureDaprResource", configureInfrastructure); + azureDaprResourceBuilder.AddAzureDaprResource("AzureDaprResource", configureInfrastructure); - using var app = builder.Build(); + using var app = builder.Build(); - var appModel = app.Services.GetRequiredService(); + var appModel = app.Services.GetRequiredService(); - var resource = Assert.Single(appModel.Resources.OfType()); + var resource = Assert.Single(appModel.Resources.OfType()); - string bicepTemplate = resource.GetBicepTemplateString(); + string bicepTemplate = resource.GetBicepTemplateString(); - string expectedBicep = $$""" + string expectedBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location var resourceToken = uniqueString(resourceGroup().id) - resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2024-03-01' existing = { + resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2025-01-01' existing = { name: 'cae-${resourceToken}' } - resource daprComponent 'Microsoft.App/managedEnvironments/daprComponents@2024-03-01' = { + resource daprComponent 'Microsoft.App/managedEnvironments/daprComponents@2025-01-01' = { name: 'componentName' properties: { componentType: 'state.redis' @@ -175,32 +175,32 @@ public void GetInfrastructureConfigurationAction_HandlesNullParameters() } """; - Assert.Equal(expectedBicep, bicepTemplate); - } + Assert.Equal(expectedBicep.ReplaceLineEndings(), bicepTemplate.ReplaceLineEndings()); + } - [Fact] - public void ConfigureKeyVaultSecretsComponent_AddsKeyVaultSecretsComponent() - { - using var builder = TestDistributedApplicationBuilder.Create(); + [Fact] + public void ConfigureKeyVaultSecretsComponent_AddsKeyVaultSecretsComponent() + { + using var builder = TestDistributedApplicationBuilder.Create(); - var redisHost = new ProvisioningParameter("daprConnectionString", typeof(string)); - var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); + var redisHost = new ProvisioningParameter("daprConnectionString", typeof(string)); + var daprResource = AzureDaprHostingExtensions.CreateDaprComponent("daprComponent", "componentName", "state.redis", "v1"); - var keyVaultName = new ProvisioningParameter(AzureBicepResource.KnownParameters.KeyVaultName, typeof(string)); + var keyVaultName = new ProvisioningParameter("keyVaultName", typeof(string)); - var azureDaprResourceBuilder = builder.AddDaprStateStore("statestore") - .ConfigureKeyVaultSecretsComponent(keyVaultName); + var azureDaprResourceBuilder = builder.AddDaprStateStore("statestore") + .ConfigureKeyVaultSecretsComponent(keyVaultName); - using var app = builder.Build(); + using var app = builder.Build(); - var appModel = app.Services.GetRequiredService(); + var appModel = app.Services.GetRequiredService(); - var resource = Assert.Single(appModel.Resources.OfType()); + var resource = Assert.Single(appModel.Resources.OfType()); - string bicepTemplate = resource.GetBicepTemplateString(); + string bicepTemplate = resource.GetBicepTemplateString(); - string expectedBicep = $$""" + string expectedBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location @@ -210,11 +210,11 @@ param keyVaultName string var resourceToken = uniqueString(resourceGroup().id) - resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2024-03-01' existing = { + resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2025-01-01' existing = { name: 'cae-${resourceToken}' } - resource secretStore 'Microsoft.App/managedEnvironments/daprComponents@2024-03-01' = { + resource secretStore 'Microsoft.App/managedEnvironments/daprComponents@2025-01-01' = { name: 'statestore-secretstore' properties: { componentType: 'secretstores.azure.keyvault' @@ -236,8 +236,8 @@ param keyVaultName string output secretStoreComponent string = 'statestore-secretstore' """; - Assert.Equal(expectedBicep, bicepTemplate); - } + Assert.Equal(expectedBicep.ReplaceLineEndings(), bicepTemplate.ReplaceLineEndings()); + } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs index 3bbb31a75..ec0cbd1a1 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs @@ -168,7 +168,7 @@ public void VerifyWithData(bool useVolume) } else { - Assert.Equal(Path.GetFullPath("/data/dbgate", appBuilder.AppHostDirectory), mountAnnotation.Source); + Assert.Equal("/data/dbgate", mountAnnotation.Source); Assert.Equal(ContainerMountType.BindMount, mountAnnotation.Type); Assert.False(mountAnnotation.IsReadOnly); } @@ -331,7 +331,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_postgres2", item.Key); - var expectedPassword = await ((IValueProvider)postgresResource2.PasswordParameter).GetValueAsync(default); + var expectedPassword = await postgresResource2.PasswordParameter.GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -402,7 +402,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - var expectedPassword = await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(default); + var expectedPassword = await sqlserverResource1.PasswordParameter.GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -433,7 +433,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_sqlserver2", item.Key); - var expectedPassword = await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(default); + var expectedPassword = await sqlserverResource2.PasswordParameter.GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -464,7 +464,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_mysql1", item.Key); - var expectedPassword = await ((IValueProvider)mysqlResource1.PasswordParameter).GetValueAsync(default); + var expectedPassword = await mysqlResource1.PasswordParameter.GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -495,7 +495,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() async item => { Assert.Equal("PASSWORD_mysql2", item.Key); - var expectedPassword = await ((IValueProvider)mysqlResource2.PasswordParameter).GetValueAsync(default); + var expectedPassword = await mysqlResource2.PasswordParameter.GetValueAsync(default); Assert.Equal(expectedPassword, item.Value); }, item => @@ -564,7 +564,7 @@ public async Task AddDbGateWithDefaultsAddsUrlAnnotations() var dbgate = builder.AddDbGate("dbgate"); var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - builder.Eventing.Subscribe((e, ct) => + dbgate.OnResourceEndpointsAllocated((resource, @event, ct) => { tcs.SetResult(); return Task.CompletedTask; diff --git a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs index 86ee3deb5..1037d13cd 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/AddMeilisearchTests.cs @@ -5,6 +5,7 @@ using Aspire.Hosting; namespace CommunityToolkit.Aspire.Hosting.Meilisearch.Tests; + public class AddMeilisearchTests { [Fact] @@ -51,7 +52,7 @@ public async Task AddMeilisearchContainerAddsAnnotationMetadata() var appBuilder = DistributedApplication.CreateBuilder(); var masterKey = ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(appBuilder, $"masterKey"); - appBuilder.Configuration["Parameters:masterkey"] = masterKey.Value; + appBuilder.Configuration["Parameters:masterkey"] = await masterKey.GetValueAsync(default); var masterKeyParameter = appBuilder.AddParameter(masterKey.Name); var meilisearch = appBuilder.AddMeilisearch("meilisearch", masterKeyParameter); @@ -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 meilisearch.Resource.MasterKeyParameter.GetValueAsync(default)}", 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 c54143930..f8ec90e33 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/MeilisearchFunctionalTests.cs @@ -69,7 +69,7 @@ public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) var meilisearch1 = builder1.AddMeilisearch("meilisearch"); - var masterKey = meilisearch1.Resource.MasterKeyParameter.Value; + var masterKey = await meilisearch1.Resource.MasterKeyParameter.GetValueAsync(default); if (useVolume) { diff --git a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioFunctionalTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioFunctionalTests.cs index 26d0ddcfb..1ccdc8641 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioFunctionalTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioFunctionalTests.cs @@ -19,7 +19,7 @@ public async Task StorageGetsCreatedAndUsable() var passwordParameter = ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(distributedApplicationBuilder, $"rootPassword"); - distributedApplicationBuilder.Configuration["Parameters:rootPassword"] = passwordParameter.Value; + distributedApplicationBuilder.Configuration["Parameters:rootPassword"] = await passwordParameter.GetValueAsync(default); var rootPasswordParameter = distributedApplicationBuilder.AddParameter(passwordParameter.Name); var minio = distributedApplicationBuilder @@ -39,9 +39,9 @@ public async Task StorageGetsCreatedAndUsable() var webApplicationBuilder = Host.CreateApplicationBuilder(); - webApplicationBuilder.Services.AddMinio(configureClient => configureClient + webApplicationBuilder.Services.AddMinio(async configureClient => configureClient .WithEndpoint("localhost", minioEndpoint.Port) - .WithCredentials(rootUser, passwordParameter.Value) + .WithCredentials(rootUser, await passwordParameter.GetValueAsync(default)) .WithSSL(false) .Build()); @@ -70,7 +70,7 @@ public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) var passwordParameter = ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(builder1, $"rootPassword"); - builder1.Configuration["Parameters:rootPassword"] = passwordParameter.Value; + builder1.Configuration["Parameters:rootPassword"] = await passwordParameter.GetValueAsync(default); var rootPasswordParameter = builder1.AddParameter(passwordParameter.Name); var minio1 = builder1.AddMinioContainer("minio", @@ -106,9 +106,9 @@ public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) { var webApplicationBuilder = Host.CreateApplicationBuilder(); - webApplicationBuilder.Services.AddMinio(configureClient => configureClient + webApplicationBuilder.Services.AddMinio(async configureClient => configureClient .WithEndpoint("localhost", minio1Endpoint.Port) - .WithCredentials(rootUser, passwordParameter.Value) + .WithCredentials(rootUser, await passwordParameter.GetValueAsync(default)) .WithSSL(false) .Build()); @@ -127,7 +127,7 @@ public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) } using var builder2 = TestDistributedApplicationBuilder.Create(testOutputHelper); - builder2.Configuration["Parameters:rootPassword"] = passwordParameter.Value; + builder2.Configuration["Parameters:rootPassword"] = await passwordParameter.GetValueAsync(default); var rootPasswordParameter2 = builder2.AddParameter(passwordParameter.Name); @@ -159,9 +159,9 @@ public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) { var webApplicationBuilder = Host.CreateApplicationBuilder(); - webApplicationBuilder.Services.AddMinio(configureClient => configureClient + webApplicationBuilder.Services.AddMinio(async configureClient => configureClient .WithEndpoint("localhost", minio2Endpoint.Port) - .WithCredentials(rootUser, passwordParameter.Value) + .WithCredentials(rootUser, await passwordParameter.GetValueAsync(default)) .WithSSL(false) .Build()); diff --git a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioPublicApiTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioPublicApiTests.cs index fa0ccda43..ff4ebc97e 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioPublicApiTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioPublicApiTests.cs @@ -106,6 +106,6 @@ public async Task VerifyMinioContainerResourceWithUserName() .WithEndpoint("http", e => e.AllocatedEndpoint = new AllocatedEndpoint(e, "localhost", 2000)); var connectionString = await postgres.Resource.GetConnectionStringAsync(); - Assert.Equal($"Endpoint=http://localhost:2000;AccessKey=user1;SecretKey={postgres.Resource.PasswordParameter.Value}", connectionString); + Assert.Equal($"Endpoint=http://localhost:2000;AccessKey=user1;SecretKey={await postgres.Resource.PasswordParameter.GetValueAsync(default)}", connectionString); } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs index de7b08fd3..55ddce346 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs @@ -37,7 +37,7 @@ public async Task WithAdminerAddsAnnotations() { Driver = "server", Server = mysqlResource.Name, - Password = mysqlResource.PasswordParameter.Value, + Password = await mysqlResource.PasswordParameter.GetValueAsync(default), UserName = "root" } }, @@ -138,7 +138,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleMySqlResource() { Driver = "server", Server = mysqlResource1.Name, - Password = mysqlResource1.PasswordParameter.Value, + Password = await mysqlResource1.PasswordParameter.GetValueAsync(default), UserName = "root" } }, @@ -148,7 +148,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleMySqlResource() { Driver = "server", Server = mysqlResource2.Name, - Password = mysqlResource2.PasswordParameter.Value, + Password = await mysqlResource2.PasswordParameter.GetValueAsync(default), UserName = "root" } } @@ -199,10 +199,10 @@ public async Task WithDbGateAddsAnnotations() Assert.Equal("USER_mysql1", item.Key); Assert.Equal("root", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_mysql1", item.Key); - Assert.Equal(mysqlResource.PasswordParameter.Value, item.Value); + Assert.Equal(await mysqlResource.PasswordParameter.GetValueAsync(default), item.Value); }, item => { @@ -317,10 +317,10 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() 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); + Assert.Equal(await mysqlResource1.PasswordParameter.GetValueAsync(default), item.Value); }, item => { @@ -347,10 +347,10 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() 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); + Assert.Equal(await mysqlResource2.PasswordParameter.GetValueAsync(default), 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 6c442c495..73c699796 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs @@ -44,10 +44,10 @@ public async Task WithDbGateAddsAnnotations() Assert.Equal("USER_postgres1", item.Key); Assert.Equal("postgres", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_postgres1", item.Key); - Assert.Equal(postgresResource.PasswordParameter.Value, item.Value); + Assert.Equal(await postgresResource.PasswordParameter.GetValueAsync(default), item.Value); }, item => { @@ -162,10 +162,10 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() 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); + Assert.Equal(await postgresResource1.PasswordParameter.GetValueAsync(default), item.Value); }, item => { @@ -192,10 +192,10 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() 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); + Assert.Equal(await postgresResource2.PasswordParameter.GetValueAsync(default), item.Value); }, item => { @@ -312,8 +312,8 @@ public async Task WithAdminerAddsAnnotations() { Driver = "pgsql", Server = postgresResource.Name, - Password = postgresResource.PasswordParameter.Value, - UserName = postgresResource.UserNameParameter?.Value ?? "postgres" + Password = await postgresResource.PasswordParameter.GetValueAsync(default), + UserName = postgresResource.UserNameParameter is null ? "postgres" : await postgresResource.UserNameParameter.GetValueAsync(default) } }, }; @@ -413,8 +413,8 @@ public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource() { Driver = "pgsql", Server = postgresResource1.Name, - Password = postgresResource1.PasswordParameter.Value, - UserName = postgresResource1.UserNameParameter?.Value ?? "postgres" + Password = await postgresResource1.PasswordParameter.GetValueAsync(default), + UserName = postgresResource1.UserNameParameter is null ? "postgres" : await postgresResource1.UserNameParameter.GetValueAsync(default) } }, { @@ -423,8 +423,8 @@ public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource() { Driver = "pgsql", Server = postgresResource2.Name, - Password = postgresResource2.PasswordParameter.Value, - UserName = postgresResource2.UserNameParameter?.Value ?? "postgres" + Password = await postgresResource2.PasswordParameter.GetValueAsync(default), + UserName = postgresResource2.UserNameParameter is null ? "postgres" : await postgresResource2.UserNameParameter.GetValueAsync(default) } } }; diff --git a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs index 6b2caf915..6da1cbf18 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs @@ -34,10 +34,10 @@ public async Task WithDbGateAddsAnnotations() Assert.Equal("LABEL_redis1", item.Key); Assert.Equal(redisResource.Name, item.Value); }, - item => + async 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 redisResource.PasswordParameter.GetValueAsync(default)}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); Assert.Equal(redisUrl, item.Value); }, @@ -141,10 +141,10 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() 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}"; + $"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); @@ -159,10 +159,10 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() 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}"; + $"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); diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs index 6ed2589af..121154e25 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs @@ -44,10 +44,10 @@ public async Task WithDbGateAddsAnnotations() Assert.Equal("USER_sqlserver1", item.Key); Assert.Equal("sa", item.Value); }, - item => + async item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - Assert.Equal(sqlserverResource.PasswordParameter.Value, item.Value); + Assert.Equal(await sqlserverResource.PasswordParameter.GetValueAsync(default), item.Value); }, item => { @@ -162,10 +162,10 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() 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); + Assert.Equal(await sqlserverResource1.PasswordParameter.GetValueAsync(default), item.Value); }, item => { @@ -192,10 +192,10 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() 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); + Assert.Equal(await sqlserverResource2.PasswordParameter.GetValueAsync(default), item.Value); }, item => { @@ -246,7 +246,7 @@ public async Task WithAdminerAddsAnnotations() { Driver = "mssql", Server = sqlserverResource.Name, - Password = sqlserverResource.PasswordParameter.Value, + Password = await sqlserverResource.PasswordParameter.GetValueAsync(default), UserName = "sa" } }, @@ -347,7 +347,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleSqlServerResource() { Driver = "mssql", Server = sqlserverResource1.Name, - Password = sqlserverResource1.PasswordParameter.Value, + Password = await sqlserverResource1.PasswordParameter.GetValueAsync(default), UserName = "sa" } }, @@ -357,7 +357,7 @@ public async Task WithAdminerAddsAnnotationsForMultipleSqlServerResource() { Driver = "mssql", Server = sqlserverResource2.Name, - Password = sqlserverResource2.PasswordParameter.Value, + Password = await sqlserverResource2.PasswordParameter.GetValueAsync(default), UserName = "sa" } }