diff --git a/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateBuilderExtensions.cs index 66b6ed886..e013a05eb 100644 --- a/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateBuilderExtensions.cs @@ -57,13 +57,13 @@ public static IResourceBuilder WithDataBindMount(this I /// Adds a DbGate container resource to the application. /// /// The resource builder. - /// The name of the resource. This name will be used as the connection string name when referenced in a dependency. + /// The name of the resource. This name will be used as the connection string name when referenced in a dependency. Optional; defaults to dbgate. /// The host port to bind the underlying container to. /// /// Multiple calls will return the same resource builder instance. /// /// A reference to the . - public static IResourceBuilder AddDbGate(this IDistributedApplicationBuilder builder, [ResourceName] string name, int? port = null) + public static IResourceBuilder AddDbGate(this IDistributedApplicationBuilder builder, [ResourceName] string name = "dbgate", int? port = null) { ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(name); diff --git a/src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/MongoDBBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/MongoDBBuilderExtensions.cs index 30bd7777b..4b605cc6c 100644 --- a/src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/MongoDBBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/MongoDBBuilderExtensions.cs @@ -1,4 +1,5 @@ using Aspire.Hosting.ApplicationModel; +using System.Diagnostics.Metrics; using System.Text; namespace Aspire.Hosting; @@ -37,57 +38,45 @@ public static IResourceBuilder WithDbGate(this IResourceB { ArgumentNullException.ThrowIfNull(builder); - containerName ??= $"{builder.Resource.Name}-dbgate"; + containerName ??= "dbgate"; - var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); + var dbGateBuilder = builder.ApplicationBuilder.AddDbGate(containerName); dbGateBuilder - .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder)) + .WaitFor(builder); configureContainer?.Invoke(dbGateBuilder); return builder; } - private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IResourceBuilder builder) { - var mongoDBInstances = applicationBuilder.Resources.OfType(); + var mongoDBServer = builder.Resource; - var counter = 1; + var name = mongoDBServer.Name; + var label = $"LABEL_{name}"; // Multiple WithDbGate calls will be ignored - if (context.EnvironmentVariables.ContainsKey($"LABEL_mongodb{counter}")) + if (context.EnvironmentVariables.ContainsKey(label)) { return; } - foreach (var mongoDBServer in mongoDBInstances) - { - // DbGate assumes MongoDB 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_mongodb{counter}", mongoDBServer.Name); - context.EnvironmentVariables.Add($"URL_mongodb{counter}", mongoDBServer.ConnectionStringExpression); - context.EnvironmentVariables.Add($"ENGINE_mongodb{counter}", "mongo@dbgate-plugin-mongo"); + // DbGate assumes MongoDB 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, name); + context.EnvironmentVariables.Add($"URL_{name}", mongoDBServer.ConnectionStringExpression); + context.EnvironmentVariables.Add($"ENGINE_{name}", "mongo@dbgate-plugin-mongo"); - counter++; + if (context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS") is string { Length: > 0 } connections) + { + context.EnvironmentVariables["CONNECTIONS"] = $"{connections},{name}"; } - - var instancesCount = mongoDBInstances.Count(); - if (instancesCount > 0) + else { - var strBuilder = new StringBuilder(); - strBuilder.AppendJoin(',', Enumerable.Range(1, instancesCount).Select(i => $"mongodb{i}")); - var connections = strBuilder.ToString(); - - string CONNECTIONS = context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS")?.ToString() ?? string.Empty; - if (string.IsNullOrEmpty(CONNECTIONS)) - { - context.EnvironmentVariables["CONNECTIONS"] = connections; - } - else - { - context.EnvironmentVariables["CONNECTIONS"] += $",{connections}"; - } + context.EnvironmentVariables["CONNECTIONS"] = name; } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs index 332d69b7d..06cb7e77e 100644 --- a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs @@ -79,59 +79,47 @@ public static IResourceBuilder WithDbGate(this IResourceBui { ArgumentNullException.ThrowIfNull(builder); - containerName ??= $"{builder.Resource.Name}-dbgate"; + containerName ??= "dbgate"; var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); dbGateBuilder - .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder)) + .WaitFor(builder); configureContainer?.Invoke(dbGateBuilder); return builder; } - private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IResourceBuilder builder) { - var mysqlInstances = applicationBuilder.Resources.OfType(); + var mySqlServer = builder.Resource; - var counter = 1; + var name = mySqlServer.Name; + var label = $"LABEL_{name}"; // Multiple WithDbGate calls will be ignored - if (context.EnvironmentVariables.ContainsKey($"LABEL_mysql{counter}")) + if (context.EnvironmentVariables.ContainsKey(label)) { return; } - foreach (var mySqlServerResource in mysqlInstances) + // DbGate assumes MySql is being accessed over a default Aspire container network and hardcodes the resource address + context.EnvironmentVariables.Add(label, name); + context.EnvironmentVariables.Add($"SERVER_{name}", name); + context.EnvironmentVariables.Add($"USER_{name}", "root"); + context.EnvironmentVariables.Add($"PASSWORD_{name}", mySqlServer.PasswordParameter); + context.EnvironmentVariables.Add($"PORT_{name}", mySqlServer.PrimaryEndpoint.TargetPort!.ToString()!); + context.EnvironmentVariables.Add($"ENGINE_{name}", "mysql@dbgate-plugin-mysql"); + + if (context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS") is string { Length: > 0 } connections) { - // DbGate assumes MySql is being accessed over a default Aspire container network and hardcodes the resource address - 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); - context.EnvironmentVariables.Add($"PORT_mysql{counter}", mySqlServerResource.PrimaryEndpoint.TargetPort!.ToString()!); - context.EnvironmentVariables.Add($"ENGINE_mysql{counter}", "mysql@dbgate-plugin-mysql"); - - counter++; + context.EnvironmentVariables["CONNECTIONS"] = $"{connections},{name}"; } - - var instancesCount = mysqlInstances.Count(); - if (instancesCount > 0) + else { - var strBuilder = new StringBuilder(); - strBuilder.AppendJoin(',', Enumerable.Range(1, instancesCount).Select(i => $"mysql{i}")); - var connections = strBuilder.ToString(); - - string CONNECTIONS = context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS")?.ToString() ?? string.Empty; - if (string.IsNullOrEmpty(CONNECTIONS)) - { - context.EnvironmentVariables["CONNECTIONS"] = connections; - } - else - { - context.EnvironmentVariables["CONNECTIONS"] += $",{connections}"; - } + context.EnvironmentVariables["CONNECTIONS"] = name; } } diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs index dbe6ea34b..8b6b585ab 100644 --- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs @@ -39,12 +39,13 @@ public static IResourceBuilder WithDbGate(this IResource { ArgumentNullException.ThrowIfNull(builder); - containerName ??= $"{builder.Resource.Name}-dbgate"; + containerName ??= "dbgate"; var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); dbGateBuilder - .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder)) + .WaitFor(builder); configureContainer?.Invoke(dbGateBuilder); @@ -91,52 +92,39 @@ public static IResourceBuilder WithAdminer(this IResourc return builder; } - private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IResourceBuilder builder) { - var postgresInstances = applicationBuilder.Resources.OfType(); + var postgresServer = builder.Resource; - var counter = 1; + var name = postgresServer.Name; + var label = $"LABEL_{name}"; // Multiple WithDbGate calls will be ignored - if (context.EnvironmentVariables.ContainsKey($"LABEL_postgres{counter}")) + if (context.EnvironmentVariables.ContainsKey(label)) { return; } - foreach (var postgresServer in postgresInstances) + 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 + context.EnvironmentVariables.Add($"LABEL_{name}", postgresServer.Name); + context.EnvironmentVariables.Add($"SERVER_{name}", postgresServer.Name); + context.EnvironmentVariables.Add($"USER_{name}", userParameter); + context.EnvironmentVariables.Add($"PASSWORD_{name}", postgresServer.PasswordParameter); + context.EnvironmentVariables.Add($"PORT_{name}", postgresServer.PrimaryEndpoint.TargetPort!.ToString()!); + context.EnvironmentVariables.Add($"ENGINE_{name}", "postgres@dbgate-plugin-postgres"); + + if (context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS") is string { Length: > 0 } connections) { - 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 - context.EnvironmentVariables.Add($"LABEL_postgres{counter}", postgresServer.Name); - context.EnvironmentVariables.Add($"SERVER_postgres{counter}", postgresServer.Name); - 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"); - - counter++; + context.EnvironmentVariables["CONNECTIONS"] = $"{connections},{name}"; } - - var instancesCount = postgresInstances.Count(); - if (instancesCount > 0) + else { - var strBuilder = new StringBuilder(); - strBuilder.AppendJoin(',', Enumerable.Range(1, instancesCount).Select(i => $"postgres{i}")); - var connections = strBuilder.ToString(); - - string CONNECTIONS = context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS")?.ToString() ?? string.Empty; - if (string.IsNullOrEmpty(CONNECTIONS)) - { - context.EnvironmentVariables["CONNECTIONS"] = connections; - } - else - { - context.EnvironmentVariables["CONNECTIONS"] += $",{connections}"; - } + context.EnvironmentVariables["CONNECTIONS"] = name; } } diff --git a/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs index d921c9bef..49ea3ae85 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs @@ -36,61 +36,42 @@ public static IResourceBuilder WithDbGate(this IResourceBuilder ConfigureDbGateContainer(context, builder.ApplicationBuilder)); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder)) + .WaitFor(builder); configureContainer?.Invoke(dbGateBuilder); return builder; } - private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IResourceBuilder builder) { - var reidsInstances = applicationBuilder.Resources.OfType(); + var redisResource = builder.Resource; - var counter = 1; + var name = redisResource.Name; + var lalbel = $"LABEL_{name}"; - // Multiple WithDbGate calls will be ignored - if (context.EnvironmentVariables.ContainsKey($"LABEL_redis{counter}")) - { - return; - } - - foreach (var redisResource in reidsInstances) - { + // 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}@{name}:{redisResource.PrimaryEndpoint.TargetPort?.ToString()}") : + ReferenceExpression.Create($"redis://{name}:{redisResource.PrimaryEndpoint.TargetPort?.ToString()}"); - // 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?.ToString()}") : - ReferenceExpression.Create($"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort?.ToString()}"); + context.EnvironmentVariables.Add(lalbel, name); + context.EnvironmentVariables.Add($"URL_{name}", redisUrl); + context.EnvironmentVariables.Add($"ENGINE_{name}", "redis@dbgate-plugin-redis"); - context.EnvironmentVariables.Add($"LABEL_redis{counter}", redisResource.Name); - context.EnvironmentVariables.Add($"URL_redis{counter}", redisUrl); - context.EnvironmentVariables.Add($"ENGINE_redis{counter}", "redis@dbgate-plugin-redis"); - - counter++; + if (context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS") is string { Length: > 0 } connections) + { + context.EnvironmentVariables["CONNECTIONS"] = $"{connections},{name}"; } - - var instancesCount = reidsInstances.Count(); - if (instancesCount > 0) + else { - var strBuilder = new StringBuilder(); - strBuilder.AppendJoin(',', Enumerable.Range(1, instancesCount).Select(i => $"redis{i}")); - var connections = strBuilder.ToString(); - - string CONNECTIONS = context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS")?.ToString() ?? string.Empty; - if (string.IsNullOrEmpty(CONNECTIONS)) - { - context.EnvironmentVariables["CONNECTIONS"] = connections; - } - else - { - context.EnvironmentVariables["CONNECTIONS"] += $",{connections}"; - } + context.EnvironmentVariables["CONNECTIONS"] = name; } } } \ 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 03573e9e5..c7eb3082b 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs @@ -38,12 +38,13 @@ public static IResourceBuilder WithDbGate(this IResourc { ArgumentNullException.ThrowIfNull(builder); - containerName ??= $"{builder.Resource.Name}-dbgate"; + containerName ??= "dbgate"; var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); dbGateBuilder - .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder)) + .WaitFor(builder); configureContainer?.Invoke(dbGateBuilder); @@ -90,48 +91,35 @@ public static IResourceBuilder WithAdminer(this IResour return builder; } - private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IResourceBuilder builder) { - var sqlServerInstances = applicationBuilder.Resources.OfType(); + var sqlServerResource = builder.Resource; - var counter = 1; + var name = sqlServerResource.Name; + var label = $"LABEL_{name}"; // Multiple WithDbGate calls will be ignored - if (context.EnvironmentVariables.ContainsKey($"LABEL_sqlserver{counter}")) + if (context.EnvironmentVariables.ContainsKey(label)) { return; } - foreach (var sqlServerResource in sqlServerInstances) + // DbGate assumes SqlServer 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, sqlServerResource.Name); + context.EnvironmentVariables.Add($"SERVER_{name}", sqlServerResource.Name); + context.EnvironmentVariables.Add($"USER_{name}", "sa"); + context.EnvironmentVariables.Add($"PASSWORD_{name}", sqlServerResource.PasswordParameter); + context.EnvironmentVariables.Add($"PORT_{name}", sqlServerResource.PrimaryEndpoint.TargetPort!.ToString()!); + context.EnvironmentVariables.Add($"ENGINE_{name}", "mssql@dbgate-plugin-mssql"); + + if (context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS") is string { Length: > 0 } connections) { - // DbGate assumes SqlServer 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_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); - context.EnvironmentVariables.Add($"PORT_sqlserver{counter}", sqlServerResource.PrimaryEndpoint.TargetPort!.ToString()!); - context.EnvironmentVariables.Add($"ENGINE_sqlserver{counter}", "mssql@dbgate-plugin-mssql"); - - counter++; + context.EnvironmentVariables["CONNECTIONS"] = $"{connections},{name}"; } - - var instancesCount = sqlServerInstances.Count(); - if (instancesCount > 0) + else { - var strBuilder = new StringBuilder(); - strBuilder.AppendJoin(',', Enumerable.Range(1, instancesCount).Select(i => $"sqlserver{i}")); - var connections = strBuilder.ToString(); - - string CONNECTIONS = context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS")?.ToString() ?? string.Empty; - if (string.IsNullOrEmpty(CONNECTIONS)) - { - context.EnvironmentVariables["CONNECTIONS"] = connections; - } - else - { - context.EnvironmentVariables["CONNECTIONS"] += $",{connections}"; - } + context.EnvironmentVariables["CONNECTIONS"] = name; } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs index ec0cbd1a1..b93716bf1 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs @@ -13,7 +13,7 @@ public void AddDbGateContainerWithDefaultsAddsAnnotationMetadata() { var appBuilder = DistributedApplication.CreateBuilder(); - var dbgate = appBuilder.AddDbGate("dbgate"); + var dbgate = appBuilder.AddDbGate(); using var app = appBuilder.Build(); @@ -49,7 +49,7 @@ public void AddDbGateContainerWithPort() { var appBuilder = DistributedApplication.CreateBuilder(); - var dbgate = appBuilder.AddDbGate("dbgate", 9090); + var dbgate = appBuilder.AddDbGate(port: 9090); using var app = appBuilder.Build(); @@ -85,15 +85,15 @@ public void MultipleAddDbGateCallsShouldAddOneDbGateResource() { var appBuilder = DistributedApplication.CreateBuilder(); - appBuilder.AddDbGate("dbgate1"); - appBuilder.AddDbGate("dbgate2"); + appBuilder.AddDbGate(); + appBuilder.AddDbGate(); using var app = appBuilder.Build(); var appModel = app.Services.GetRequiredService(); var containerResource = Assert.Single(appModel.Resources.OfType()); - Assert.Equal("dbgate1", containerResource.Name); + Assert.Equal("dbgate", containerResource.Name); } [Fact] @@ -101,7 +101,7 @@ public void VerifyWithHostPort() { var appBuilder = DistributedApplication.CreateBuilder(); - var dbgate = appBuilder.AddDbGate("dbgate").WithHostPort(9090); + var dbgate = appBuilder.AddDbGate().WithHostPort(9090); using var app = appBuilder.Build(); @@ -139,7 +139,7 @@ public void VerifyWithData(bool useVolume) { var appBuilder = DistributedApplication.CreateBuilder(); - var dbgate = appBuilder.AddDbGate("dbgate"); + var dbgate = appBuilder.AddDbGate(); if (useVolume) { @@ -241,11 +241,17 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.NotNull(dbGateResource); - Assert.Equal("mongodb1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); Assert.NotEmpty(envs); + + var CONNECTIONS = envs["CONNECTIONS"]; + envs.Remove("CONNECTIONS"); + + Assert.Equal("mongodb1,mongodb2,postgres1,postgres2,redis1,redis2,sqlserver1,sqlserver2,mysql1,mysql2", CONNECTIONS); + Assert.Collection(envs, item => { @@ -278,11 +284,6 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("mongo@dbgate-plugin-mongo", item.Value); }, item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("mongodb1,mongodb2,postgres1,postgres2,redis1,redis2,sqlserver1,sqlserver2,mysql1,mysql2", item.Value); - }, - item => { Assert.Equal("LABEL_postgres1", item.Key); Assert.Equal(postgresResource1.Name, item.Value); @@ -394,21 +395,23 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("SERVER_sqlserver1", item.Key); Assert.Equal(sqlserverResource1.Name, item.Value); }, - item => + async item => { Assert.Equal("USER_sqlserver1", item.Key); - Assert.Equal("sa", item.Value); + var username = await ((IValueProvider)sqlserverResource1.UserNameReference).GetValueAsync(default)!; + Assert.Equal(username, item.Value); }, async item => { Assert.Equal("PASSWORD_sqlserver1", item.Key); - var expectedPassword = await sqlserverResource1.PasswordParameter.GetValueAsync(default); - Assert.Equal(expectedPassword, item.Value); + var password = await ((IValueProvider)sqlserverResource1.PasswordParameter).GetValueAsync(default)!; + Assert.Equal(password, item.Value); }, - item => + async item => { Assert.Equal("PORT_sqlserver1", item.Key); - Assert.Equal(sqlserverResource1.PrimaryEndpoint.TargetPort.ToString(), item.Value); + var port = await ((IValueProvider)sqlserverResource1.Port).GetValueAsync(default)!; + Assert.Equal(port, item.Value); }, item => { @@ -425,21 +428,23 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("SERVER_sqlserver2", item.Key); Assert.Equal(sqlserverResource2.Name, item.Value); }, - item => + async item => { Assert.Equal("USER_sqlserver2", item.Key); - Assert.Equal("sa", item.Value); + var username = await ((IValueProvider)sqlserverResource2.UserNameReference).GetValueAsync(default)!; + Assert.Equal(username, item.Value); }, async item => { Assert.Equal("PASSWORD_sqlserver2", item.Key); - var expectedPassword = await sqlserverResource2.PasswordParameter.GetValueAsync(default); - Assert.Equal(expectedPassword, item.Value); + var password = await ((IValueProvider)sqlserverResource2.PasswordParameter).GetValueAsync(default)!; + Assert.Equal(password, item.Value); }, - item => + async item => { Assert.Equal("PORT_sqlserver2", item.Key); - Assert.Equal(sqlserverResource2.PrimaryEndpoint.TargetPort.ToString(), item.Value); + var port = await ((IValueProvider)sqlserverResource2.Port).GetValueAsync(default); + Assert.Equal(port!, item.Value); }, item => { @@ -552,7 +557,7 @@ public void WithDbGateShouldShouldAddOneDbGateResourceForMultipleDatabaseTypes() var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); var containerResource = Assert.Single(appModel.Resources.OfType()); - Assert.Equal("mongodb1-dbgate", containerResource.Name); + Assert.Equal("dbgate", containerResource.Name); } [Fact] diff --git a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AppHostTests.cs index 25c4250ec..07a552232 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AppHostTests.cs @@ -9,7 +9,7 @@ public class AppHostTests(AspireIntegrationTestFixture builder.AddDbGate(name); + var action = () => builder.AddDbGate(); var exception = Assert.Throws(action); Assert.Equal(nameof(builder), exception.ParamName); } - [Fact] - public void AddDbGateContainerShouldThrowWhenNameIsNull() - { - IDistributedApplicationBuilder builder = new DistributedApplicationBuilder([]); - string name = null!; - - var action = () => builder.AddDbGate(name); - - var exception = Assert.Throws(action); - Assert.Equal(nameof(name), exception.ParamName); - } - [Theory] [InlineData(false)] [InlineData(true)] @@ -56,7 +43,7 @@ public void WithDataShouldThrowWhenBuilderIsNull(bool useVolume) public void WithDataBindMountShouldThrowWhenSourceIsNull() { var builder = new DistributedApplicationBuilder([]); - var resourceBuilder = builder.AddDbGate("dbgate"); + var resourceBuilder = builder.AddDbGate(); string source = null!; diff --git a/tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/AppHostTests.cs index ecb50be9c..d5c35e4b2 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/AppHostTests.cs @@ -9,7 +9,7 @@ public class AppHostTests(AspireIntegrationTestFixture { - Assert.Equal("LABEL_mongodb1", item.Key); + Assert.Equal("LABEL_mongodb", item.Key); Assert.Equal(mongodbResource.Name, item.Value); }, async item => { - Assert.Equal("URL_mongodb1", item.Key); + Assert.Equal("URL_mongodb", item.Key); Assert.Equal(await mongodbResource.ConnectionStringExpression.GetValueAsync(default), item.Value); }, item => { - Assert.Equal("ENGINE_mongodb1", item.Key); + Assert.Equal("ENGINE_mongodb", item.Key); Assert.Equal("mongo@dbgate-plugin-mongo", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("mongodb1", item.Value); }); } @@ -65,7 +66,7 @@ public void MultipleWithDbGateCallsAddsOneDbGateResource() var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); Assert.NotNull(dbGateResource); - Assert.Equal("mongodb1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); } [Fact] @@ -128,11 +129,17 @@ public async Task WithDbGateAddsAnnotationsForMultipleMongoDBResource() Assert.NotNull(dbGateResource); - Assert.Equal("mongodb1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); Assert.NotEmpty(envs); + + var CONNECTIONS = envs["CONNECTIONS"]; + envs.Remove("CONNECTIONS"); + + Assert.Equal("mongodb1,mongodb2", CONNECTIONS); + Assert.Collection(envs, item => { @@ -163,11 +170,6 @@ public async Task WithDbGateAddsAnnotationsForMultipleMongoDBResource() { Assert.Equal("ENGINE_mongodb2", item.Key); Assert.Equal("mongo@dbgate-plugin-mongo", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("mongodb1,mongodb2", item.Value); }); } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs index 55ddce346..8b337684a 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs @@ -178,7 +178,7 @@ public async Task WithDbGateAddsAnnotations() Assert.NotNull(dbGateResource); - Assert.Equal("mysql-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); @@ -186,38 +186,38 @@ public async Task WithDbGateAddsAnnotations() Assert.Collection(envs, item => { - Assert.Equal("LABEL_mysql1", item.Key); + Assert.Equal("LABEL_mysql", item.Key); Assert.Equal(mysqlResource.Name, item.Value); }, item => { - Assert.Equal("SERVER_mysql1", item.Key); + Assert.Equal("SERVER_mysql", item.Key); Assert.Equal(mysqlResource.Name, item.Value); }, item => { - Assert.Equal("USER_mysql1", item.Key); + Assert.Equal("USER_mysql", item.Key); Assert.Equal("root", item.Value); }, async item => { - Assert.Equal("PASSWORD_mysql1", item.Key); + Assert.Equal("PASSWORD_mysql", item.Key); Assert.Equal(await mysqlResource.PasswordParameter.GetValueAsync(default), item.Value); }, item => { - Assert.Equal("PORT_mysql1", item.Key); + Assert.Equal("PORT_mysql", item.Key); Assert.Equal(mysqlResource.PrimaryEndpoint.TargetPort.ToString(), item.Value); }, item => { - Assert.Equal("ENGINE_mysql1", item.Key); + Assert.Equal("ENGINE_mysql", item.Key); Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); }, item => { Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("mysql1", item.Value); + Assert.Equal("mysql", item.Value); }); } @@ -235,7 +235,7 @@ public void MultipleWithDbGateCallsAddsOneDbGateResource() var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); Assert.NotNull(dbGateResource); - Assert.Equal("mysql1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); } [Fact] @@ -296,7 +296,7 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() Assert.NotNull(dbGateResource); - Assert.Equal("mysql1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); @@ -333,6 +333,11 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); }, item => + { + Assert.Equal("CONNECTIONS", item.Key); + Assert.Equal("mysql1,mysql2", item.Value); + }, + item => { Assert.Equal("LABEL_mysql2", item.Key); Assert.Equal(mysqlResource2.Name, item.Value); @@ -361,11 +366,6 @@ public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() { Assert.Equal("ENGINE_mysql2", item.Key); Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("mysql1,mysql2", item.Value); }); } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/AppHostTests.cs index 1cc33f664..af8fa8e97 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/AppHostTests.cs @@ -9,7 +9,7 @@ public class AppHostTests(AspireIntegrationTestFixture { - Assert.Equal("LABEL_postgres1", item.Key); + Assert.Equal("LABEL_postgres", item.Key); Assert.Equal(postgresResource.Name, item.Value); }, item => { - Assert.Equal("SERVER_postgres1", item.Key); + Assert.Equal("SERVER_postgres", item.Key); Assert.Equal(postgresResource.Name, item.Value); }, item => { - Assert.Equal("USER_postgres1", item.Key); + Assert.Equal("USER_postgres", item.Key); Assert.Equal("postgres", item.Value); }, async item => { - Assert.Equal("PASSWORD_postgres1", item.Key); + Assert.Equal("PASSWORD_postgres", item.Key); Assert.Equal(await postgresResource.PasswordParameter.GetValueAsync(default), item.Value); }, item => { - Assert.Equal("PORT_postgres1", item.Key); + Assert.Equal("PORT_postgres", item.Key); Assert.Equal(postgresResource.PrimaryEndpoint.TargetPort.ToString(), item.Value); }, item => { - Assert.Equal("ENGINE_postgres1", item.Key); + Assert.Equal("ENGINE_postgres", item.Key); Assert.Equal("postgres@dbgate-plugin-postgres", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("postgres1", item.Value); }); } @@ -80,7 +81,7 @@ public void MultipleWithDbGateCallsAddsOneDbGateResource() var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); Assert.NotNull(dbGateResource); - Assert.Equal("postgres1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); } [Fact] @@ -141,11 +142,17 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() Assert.NotNull(dbGateResource); - Assert.Equal("postgres1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); Assert.NotEmpty(envs); + + var CONNECTIONS = envs["CONNECTIONS"]; + envs.Remove("CONNECTIONS"); + + Assert.Equal("postgres1,postgres2", CONNECTIONS); + Assert.Collection(envs, item => { @@ -206,11 +213,6 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() { Assert.Equal("ENGINE_postgres2", item.Key); Assert.Equal("postgres@dbgate-plugin-postgres", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("postgres1,postgres2", item.Value); }); } @@ -237,46 +239,47 @@ public async Task WithDbGateAddsAnnotationsForProvidedUsernamePassword() Assert.NotNull(dbGateResource); - Assert.Equal("postgres-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); Assert.NotEmpty(envs); + + var CONNECTIONS = envs["CONNECTIONS"]; + envs.Remove("CONNECTIONS"); + + Assert.Equal("postgres", CONNECTIONS); + Assert.Collection(envs, item => { - Assert.Equal("LABEL_postgres1", item.Key); + Assert.Equal("LABEL_postgres", item.Key); Assert.Equal(postgresResource.Name, item.Value); }, item => { - Assert.Equal("SERVER_postgres1", item.Key); + Assert.Equal("SERVER_postgres", item.Key); Assert.Equal(postgresResource.Name, item.Value); }, item => { - Assert.Equal("USER_postgres1", item.Key); + Assert.Equal("USER_postgres", item.Key); Assert.Equal(username, item.Value); }, item => { - Assert.Equal("PASSWORD_postgres1", item.Key); + Assert.Equal("PASSWORD_postgres", item.Key); Assert.Equal(password, item.Value); }, item => { - Assert.Equal("PORT_postgres1", item.Key); + Assert.Equal("PORT_postgres", item.Key); Assert.Equal(postgresResource.PrimaryEndpoint.TargetPort.ToString(), item.Value); }, item => { - Assert.Equal("ENGINE_postgres1", item.Key); + Assert.Equal("ENGINE_postgres", item.Key); Assert.Equal("postgres@dbgate-plugin-postgres", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("postgres1", item.Value); }); } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/AppHostTests.cs index 997403e46..9d0e2c2eb 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/AppHostTests.cs @@ -9,7 +9,7 @@ public class AppHostTests(AspireIntegrationTestFixture { - Assert.Equal("LABEL_redis1", item.Key); + Assert.Equal("LABEL_redis", item.Key); Assert.Equal(redisResource.Name, item.Value); }, async item => @@ -43,13 +49,8 @@ public async Task WithDbGateAddsAnnotations() }, item => { - Assert.Equal("ENGINE_redis1", item.Key); + Assert.Equal("ENGINE_redis", item.Key); Assert.Equal("redis@dbgate-plugin-redis", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("redis1", item.Value); }); } @@ -67,7 +68,7 @@ public void MultipleWithDbGateCallsAddsOneDbGateResource() var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); Assert.NotNull(dbGateResource); - Assert.Equal("redis1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); } [Fact] @@ -130,11 +131,17 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() Assert.NotNull(dbGateResource); - Assert.Equal("redis1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); Assert.NotEmpty(envs); + + var CONNECTIONS = envs["CONNECTIONS"]; + envs.Remove("CONNECTIONS"); + + Assert.Equal("redis1,redis2", CONNECTIONS); + Assert.Collection(envs, item => { @@ -171,11 +178,6 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() { Assert.Equal("ENGINE_redis2", item.Key); Assert.Equal("redis@dbgate-plugin-redis", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("redis1,redis2", item.Value); }); } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/AppHostTests.cs index bd11cbcbb..ffdcb5180 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/AppHostTests.cs @@ -9,7 +9,7 @@ public class AppHostTests(AspireIntegrationTestFixture { - Assert.Equal("LABEL_sqlserver1", item.Key); + Assert.Equal("LABEL_sqlserver", item.Key); Assert.Equal(sqlserverResource.Name, item.Value); }, item => { - Assert.Equal("SERVER_sqlserver1", item.Key); + Assert.Equal("SERVER_sqlserver", item.Key); Assert.Equal(sqlserverResource.Name, item.Value); }, item => { - Assert.Equal("USER_sqlserver1", item.Key); + Assert.Equal("USER_sqlserver", item.Key); Assert.Equal("sa", item.Value); }, async item => @@ -51,18 +57,13 @@ public async Task WithDbGateAddsAnnotations() }, item => { - Assert.Equal("PORT_sqlserver1", item.Key); + Assert.Equal("PORT_sqlserver", item.Key); Assert.Equal(sqlserverResource.PrimaryEndpoint.TargetPort.ToString(), item.Value); }, item => { - Assert.Equal("ENGINE_sqlserver1", item.Key); + Assert.Equal("ENGINE_sqlserver", item.Key); Assert.Equal("mssql@dbgate-plugin-mssql", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("sqlserver1", item.Value); }); } @@ -80,7 +81,7 @@ public void MultipleWithDbGateCallsAddsOneDbGateResource() var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); Assert.NotNull(dbGateResource); - Assert.Equal("sqlserver1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); } [Fact] @@ -141,11 +142,17 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() Assert.NotNull(dbGateResource); - Assert.Equal("sqlserver1-dbgate", dbGateResource.Name); + Assert.Equal("dbgate", dbGateResource.Name); var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); Assert.NotEmpty(envs); + + var CONNECTIONS = envs["CONNECTIONS"]; + envs.Remove("CONNECTIONS"); + + Assert.Equal("sqlserver1,sqlserver2", CONNECTIONS); + Assert.Collection(envs, item => { @@ -206,11 +213,6 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() { Assert.Equal("ENGINE_sqlserver2", item.Key); Assert.Equal("mssql@dbgate-plugin-mssql", item.Value); - }, - item => - { - Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("sqlserver1,sqlserver2", item.Value); }); }