| Server | ';
+ return $out;
+ }
+ }
+}
+
+return new AdminerLoginServers();
diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj
index dcd84100b..6654fe6d9 100644
--- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj
+++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj
@@ -11,7 +11,12 @@
+
+
+
+
+
diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs
index 0c990e177..3f965313d 100644
--- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs
+++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs
@@ -1,5 +1,7 @@
using Aspire.Hosting.ApplicationModel;
using System.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
namespace Aspire.Hosting;
@@ -50,6 +52,46 @@ public static IResourceBuilder WithDbGate(this IResource
return builder;
}
+ ///
+ /// Adds an administration and development platform for PostgreSQL to the application model using Adminer.
+ ///
+ ///
+ /// This version of the package defaults to the tag of the container image.
+ /// The Postgres server resource builder.
+ /// Configuration callback for Adminer container resource.
+ /// The name of the container (Optional).
+ ///
+ /// Use in application host with a Postgres resource
+ ///
+ /// var builder = DistributedApplication.CreateBuilder(args);
+ ///
+ /// var postgres = builder.AddPostgres("postgres")
+ /// .WithAdminer();
+ /// var db = postgres.AddDatabase("db");
+ ///
+ /// var api = builder.AddProject<Projects.Api>("api")
+ /// .WithReference(db);
+ ///
+ /// builder.Build().Run();
+ ///
+ ///
+ ///
+ /// A reference to the .
+ public static IResourceBuilder WithAdminer(this IResourceBuilder builder, Action>? configureContainer = null, string? containerName = null)
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ containerName ??= $"{builder.Resource.Name}-adminer";
+ var adminerBuilder = AdminerBuilderExtensions.AddAdminer(builder.ApplicationBuilder, containerName);
+
+ adminerBuilder
+ .WithEnvironment(context => ConfigureAdminerContainer(context, builder.ApplicationBuilder));
+
+ configureContainer?.Invoke(adminerBuilder);
+
+ return builder;
+ }
+
private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder)
{
var postgresInstances = applicationBuilder.Resources.OfType();
@@ -96,4 +138,46 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context,
}
}
}
+
+
+ internal static void ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder)
+ {
+ var postgresInstances = applicationBuilder.Resources.OfType();
+
+ string ADMINER_SERVERS = context.EnvironmentVariables.GetValueOrDefault("ADMINER_SERVERS")?.ToString() ?? string.Empty;
+
+ var new_servers = postgresInstances.ToDictionary(
+ postgresServer => postgresServer.Name,
+ postgresServer =>
+ {
+ var user = postgresServer.UserNameParameter?.Value ?? "postgres";
+ return new AdminerLoginServer
+ {
+ Server = postgresServer.Name,
+ UserName = user,
+ Password = postgresServer.PasswordParameter.Value,
+ Driver = "pgsql"
+ };
+ });
+
+ if (string.IsNullOrEmpty(ADMINER_SERVERS))
+ {
+ string servers_json = JsonSerializer.Serialize(new_servers);
+ context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json;
+ }
+ 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)
+ {
+ if (!servers.ContainsKey(server.Key))
+ {
+ servers!.Add(server.Key, server.Value);
+ }
+ }
+ 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.PostgreSQL.Extensions/README.md b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md
index d8f59eeed..a62613970 100644
--- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md
+++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md
@@ -2,7 +2,7 @@
This integration contains extensions for the [PostgreSQL hosting package](https://nuget.org/packages/Aspire.Hosting.PostgreSQL) for .NET Aspire.
-The integration provides support for running [DbGate](https://github.com/dbgate/dbgate) to interact with the PostgreSQL database.
+The integration provides support for running [DbGate](https://github.com/dbgate/dbgate) and [Adminer](https://github.com/vrana/adminer) to interact with the PostgreSQL database.
## Getting Started
@@ -20,7 +20,8 @@ Then, in the _Program.cs_ file of `AppHost`, define an Postgres resource, then c
```csharp
var postgres = builder.AddPostgres("postgres")
- .WithDbGate();
+ .WithDbGate()
+ .WithAdminer();
```
## Additional Information
diff --git a/src/Shared/Adminer/AdminerLoginServer.cs b/src/Shared/Adminer/AdminerLoginServer.cs
new file mode 100644
index 000000000..83d3eda95
--- /dev/null
+++ b/src/Shared/Adminer/AdminerLoginServer.cs
@@ -0,0 +1,16 @@
+using System.Text.Json.Serialization;
+
+internal class AdminerLoginServer
+{
+ [JsonPropertyName("server")]
+ public string? Server { get; set; }
+
+ [JsonPropertyName("username")]
+ public string? UserName { get; set; }
+
+ [JsonPropertyName("password")]
+ public string? Password { get; set; }
+
+ [JsonPropertyName("driver")]
+ public string? Driver { get; set; }
+}
\ No newline at end of file
diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs
new file mode 100644
index 000000000..80dd3e01f
--- /dev/null
+++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs
@@ -0,0 +1,211 @@
+using System.Net.Sockets;
+using System.Text.Json;
+using Aspire.Hosting;
+
+namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests;
+public class AddAdminerTests
+{
+ [Fact]
+ public void AddAdminerContainerWithDefaultsAddsAnnotationMetadata()
+ {
+ var appBuilder = DistributedApplication.CreateBuilder();
+
+ var adminer = appBuilder.AddAdminer("adminer");
+
+ using var app = appBuilder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var containerResource = Assert.Single(appModel.Resources.OfType());
+ Assert.Equal("adminer", containerResource.Name);
+
+ var endpoints = containerResource.Annotations.OfType();
+ Assert.Single(endpoints);
+
+ var primaryEndpoint = Assert.Single(endpoints, e => e.Name == "http");
+ Assert.Equal(8080, primaryEndpoint.TargetPort);
+ Assert.False(primaryEndpoint.IsExternal);
+ Assert.Equal("http", primaryEndpoint.Name);
+ Assert.Null(primaryEndpoint.Port);
+ Assert.Equal(ProtocolType.Tcp, primaryEndpoint.Protocol);
+ Assert.Equal("http", primaryEndpoint.Transport);
+ Assert.Equal("http", primaryEndpoint.UriScheme);
+
+ var containerAnnotation = Assert.Single(containerResource.Annotations.OfType());
+ Assert.Equal(AdminerContainerImageTags.Tag, containerAnnotation.Tag);
+ Assert.Equal(AdminerContainerImageTags.Image, containerAnnotation.Image);
+ Assert.Equal(AdminerContainerImageTags.Registry, containerAnnotation.Registry);
+
+ var annotations = adminer.Resource.Annotations;
+
+ Assert.Contains(ManifestPublishingCallbackAnnotation.Ignore, annotations);
+ }
+
+ [Fact]
+ public void AddAdminerContainerWithPort()
+ {
+ var appBuilder = DistributedApplication.CreateBuilder();
+
+ var adminer = appBuilder.AddAdminer("adminer", 9090);
+
+ using var app = appBuilder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var containerResource = Assert.Single(appModel.Resources.OfType());
+ Assert.Equal("adminer", containerResource.Name);
+
+ var endpoints = containerResource.Annotations.OfType();
+ Assert.Single(endpoints);
+
+ var primaryEndpoint = Assert.Single(endpoints, e => e.Name == "http");
+ Assert.Equal(8080, primaryEndpoint.TargetPort);
+ Assert.False(primaryEndpoint.IsExternal);
+ Assert.Equal("http", primaryEndpoint.Name);
+ Assert.Equal(9090, primaryEndpoint.Port);
+ Assert.Equal(ProtocolType.Tcp, primaryEndpoint.Protocol);
+ Assert.Equal("http", primaryEndpoint.Transport);
+ Assert.Equal("http", primaryEndpoint.UriScheme);
+
+ var containerAnnotation = Assert.Single(containerResource.Annotations.OfType());
+ Assert.Equal(AdminerContainerImageTags.Tag, containerAnnotation.Tag);
+ Assert.Equal(AdminerContainerImageTags.Image, containerAnnotation.Image);
+ Assert.Equal(AdminerContainerImageTags.Registry, containerAnnotation.Registry);
+
+ var annotations = adminer.Resource.Annotations;
+
+ Assert.Contains(ManifestPublishingCallbackAnnotation.Ignore, annotations);
+ }
+
+ [Fact]
+ public void MultipleAddAdminerCallsShouldAddOneAdminerResource()
+ {
+ var appBuilder = DistributedApplication.CreateBuilder();
+
+ appBuilder.AddAdminer("adminer1");
+ appBuilder.AddAdminer("adminer2");
+
+ using var app = appBuilder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var containerResource = Assert.Single(appModel.Resources.OfType());
+ Assert.Equal("adminer1", containerResource.Name);
+ }
+
+ [Fact]
+ public void VerifyWithHostPort()
+ {
+ var appBuilder = DistributedApplication.CreateBuilder();
+
+ var adminer = appBuilder.AddAdminer("adminer").WithHostPort(9090);
+
+ using var app = appBuilder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var containerResource = Assert.Single(appModel.Resources.OfType());
+ Assert.Equal("adminer", containerResource.Name);
+
+ var endpoints = containerResource.Annotations.OfType();
+ Assert.Single(endpoints);
+
+ var primaryEndpoint = Assert.Single(endpoints, e => e.Name == "http");
+ Assert.Equal(8080, primaryEndpoint.TargetPort);
+ Assert.False(primaryEndpoint.IsExternal);
+ Assert.Equal("http", primaryEndpoint.Name);
+ Assert.Equal(9090, primaryEndpoint.Port);
+ Assert.Equal(ProtocolType.Tcp, primaryEndpoint.Protocol);
+ Assert.Equal("http", primaryEndpoint.Transport);
+ Assert.Equal("http", primaryEndpoint.UriScheme);
+
+ var containerAnnotation = Assert.Single(containerResource.Annotations.OfType());
+ Assert.Equal(AdminerContainerImageTags.Tag, containerAnnotation.Tag);
+ Assert.Equal(AdminerContainerImageTags.Image, containerAnnotation.Image);
+ Assert.Equal(AdminerContainerImageTags.Registry, containerAnnotation.Registry);
+
+ var annotations = adminer.Resource.Annotations;
+
+ Assert.Contains(ManifestPublishingCallbackAnnotation.Ignore, annotations);
+ }
+
+ [Fact]
+ public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes()
+ {
+ var builder = DistributedApplication.CreateBuilder();
+
+ var postgresResourceBuilder1 = builder.AddPostgres("postgres1")
+ .WithAdminer();
+
+ var postgresResource1 = postgresResourceBuilder1.Resource;
+
+ var postgresResourceBuilder2 = builder.AddPostgres("postgres2")
+ .WithAdminer();
+
+ var postgresResource2 = postgresResourceBuilder2.Resource;
+
+ using var app = builder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var adminerContainerResource = appModel.Resources.OfType().SingleOrDefault();
+
+ Assert.NotNull(adminerContainerResource);
+
+ Assert.Equal("postgres1-adminer", adminerContainerResource.Name);
+
+ var envs = await adminerContainerResource.GetEnvironmentVariableValuesAsync();
+
+ Assert.NotEmpty(envs);
+
+ var servers = new Dictionary
+ {
+ {
+ "postgres1",
+ new AdminerLoginServer
+ {
+ Driver = "pgsql",
+ Server = postgresResource1.Name,
+ Password = postgresResource1.PasswordParameter.Value,
+ UserName = postgresResource1.UserNameParameter?.Value ?? "postgres"
+ }
+ },
+ {
+ "postgres2",
+ new AdminerLoginServer
+ {
+ Driver = "pgsql",
+ Server = postgresResource2.Name,
+ Password = postgresResource2.PasswordParameter.Value,
+ UserName = postgresResource2.UserNameParameter?.Value ?? "postgres"
+ }
+ }
+ };
+
+ var envValue = JsonSerializer.Serialize(servers);
+ var item = Assert.Single(envs);
+ Assert.Equal("ADMINER_SERVERS", item.Key);
+ Assert.Equal(envValue, item.Value);
+ }
+
+ [Fact]
+ public void WithAdminerShouldShouldAddOneAdminerResourceForMultipleDatabaseTypes()
+ {
+ var builder = DistributedApplication.CreateBuilder();
+
+ builder.AddPostgres("postgres1")
+ .WithAdminer();
+
+ builder.AddPostgres("postgres2")
+ .WithAdminer();
+
+ using var app = builder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var adminerResource = appModel.Resources.OfType().SingleOrDefault();
+
+ var containerResource = Assert.Single(appModel.Resources.OfType());
+ Assert.Equal("postgres1-adminer", containerResource.Name);
+ }
+}
diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AdminerPublicApiTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AdminerPublicApiTests.cs
new file mode 100644
index 000000000..56acbd042
--- /dev/null
+++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AdminerPublicApiTests.cs
@@ -0,0 +1,43 @@
+using Aspire.Hosting;
+
+namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests;
+
+public class AdminerPublicApiTests
+{
+ [Fact]
+ public void AddAdminerContainerShouldThrowWhenBuilderIsNull()
+ {
+ IDistributedApplicationBuilder builder = null!;
+ const string name = "adminer";
+
+ var action = () => builder.AddAdminer(name);
+
+ var exception = Assert.Throws(action);
+ Assert.Equal(nameof(builder), exception.ParamName);
+ }
+
+ [Fact]
+ public void AddAdminerContainerShouldThrowWhenNameIsNull()
+ {
+ IDistributedApplicationBuilder builder = new DistributedApplicationBuilder([]);
+ string name = null!;
+
+ var action = () => builder.AddAdminer(name);
+
+ var exception = Assert.Throws(action);
+ Assert.Equal(nameof(name), exception.ParamName);
+ }
+
+ [Fact]
+ public void WithHostPortShouldThrowWhenBuilderIsNull()
+ {
+ IResourceBuilder builder = null!;
+
+ Func>? action = null;
+
+ action = () => builder.WithHostPort(9090);
+
+ var exception = Assert.Throws(action);
+ Assert.Equal(nameof(builder), exception.ParamName);
+ }
+}
diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AppHostTests.cs
new file mode 100644
index 000000000..556bddaf6
--- /dev/null
+++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AppHostTests.cs
@@ -0,0 +1,20 @@
+using CommunityToolkit.Aspire.Testing;
+using Aspire.Components.Common.Tests;
+
+namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests;
+
+[RequiresDocker]
+public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture>
+{
+ [Fact]
+ public async Task ResourceStartsAndRespondsOk()
+ {
+ var resourceName = "postgres1-adminer";
+ await fixture.ResourceNotificationService.WaitForResourceHealthyAsync(resourceName).WaitAsync(TimeSpan.FromMinutes(5));
+ var httpClient = fixture.CreateHttpClient(resourceName);
+
+ var response = await httpClient.GetAsync("/");
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ }
+}
\ No newline at end of file
diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests.csproj
new file mode 100644
index 000000000..e113bc4d3
--- /dev/null
+++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests.csproj
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj
index 326f2c0e4..fcac4a6f0 100644
--- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj
+++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj
@@ -4,4 +4,7 @@
+
+
+
diff --git a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs
index 7492a1a29..6c442c495 100644
--- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs
+++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs
@@ -1,4 +1,5 @@
using Aspire.Hosting;
+using System.Text.Json;
namespace CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests;
@@ -278,4 +279,159 @@ public async Task WithDbGateAddsAnnotationsForProvidedUsernamePassword()
Assert.Equal("postgres1", item.Value);
});
}
+
+ [Fact]
+ public async Task WithAdminerAddsAnnotations()
+ {
+ var builder = DistributedApplication.CreateBuilder();
+
+ var postgresResourceBuilder = builder.AddPostgres("postgres")
+ .WithAdminer();
+
+ var postgresResource = postgresResourceBuilder.Resource;
+
+ using var app = builder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var adminerResource = appModel.Resources.OfType().SingleOrDefault();
+
+ Assert.NotNull(adminerResource);
+
+ Assert.Equal("postgres-adminer", adminerResource.Name);
+
+ var envs = await adminerResource.GetEnvironmentVariableValuesAsync();
+
+ Assert.NotEmpty(envs);
+
+ var servers = new Dictionary
+ {
+ {
+ "postgres",
+ new AdminerLoginServer
+ {
+ Driver = "pgsql",
+ Server = postgresResource.Name,
+ Password = postgresResource.PasswordParameter.Value,
+ UserName = postgresResource.UserNameParameter?.Value ?? "postgres"
+ }
+ },
+ };
+
+ var envValue = JsonSerializer.Serialize(servers);
+ var item = Assert.Single(envs);
+ Assert.Equal("ADMINER_SERVERS", item.Key);
+ Assert.Equal(envValue, item.Value);
+ }
+
+ [Fact]
+ public void MultipleWithAdminerCallsAddsOneDbGateResource()
+ {
+ var builder = DistributedApplication.CreateBuilder();
+ builder.AddPostgres("postgres1").WithAdminer();
+ builder.AddPostgres("postgres2").WithAdminer();
+
+ using var app = builder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var adminerContainer = appModel.Resources.OfType().SingleOrDefault();
+ Assert.NotNull(adminerContainer);
+
+ Assert.Equal("postgres1-adminer", adminerContainer.Name);
+ }
+
+ [Fact]
+ public void WithAdminerShouldChangeAdminerHostPort()
+ {
+ var builder = DistributedApplication.CreateBuilder();
+ var postgresResourceBuilder = builder.AddPostgres("postgres")
+ .WithAdminer(c => c.WithHostPort(8068));
+
+ using var app = builder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var adminerContainer = appModel.Resources.OfType().SingleOrDefault();
+ Assert.NotNull(adminerContainer);
+
+ var primaryEndpoint = adminerContainer.Annotations.OfType().Single();
+ Assert.Equal(8068, primaryEndpoint.Port);
+ }
+
+ [Fact]
+ public void WithAdminerShouldChangeAdminerContainerImageTag()
+ {
+ var builder = DistributedApplication.CreateBuilder();
+ var postgresResourceBuilder = builder.AddPostgres("postgres")
+ .WithAdminer(c => c.WithImageTag("manualTag"));
+ using var app = builder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var adminerContainer = appModel.Resources.OfType().SingleOrDefault();
+ Assert.NotNull(adminerContainer);
+
+ var containerImageAnnotation = adminerContainer.Annotations.OfType().Single();
+ Assert.Equal("manualTag", containerImageAnnotation.Tag);
+ }
+
+ [Fact]
+ public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource()
+ {
+ var builder = DistributedApplication.CreateBuilder();
+
+ var postgresResourceBuilder1 = builder.AddPostgres("postgres1")
+ .WithAdminer();
+
+ var postgresResource1 = postgresResourceBuilder1.Resource;
+
+ var postgresResourceBuilder2 = builder.AddPostgres("postgres2")
+ .WithDbGate();
+
+ var postgresResource2 = postgresResourceBuilder2.Resource;
+
+ using var app = builder.Build();
+
+ var appModel = app.Services.GetRequiredService();
+
+ var adminerContainer = appModel.Resources.OfType().SingleOrDefault();
+
+ Assert.NotNull(adminerContainer);
+
+ Assert.Equal("postgres1-adminer", adminerContainer.Name);
+
+ var envs = await adminerContainer.GetEnvironmentVariableValuesAsync();
+
+ Assert.NotEmpty(envs);
+
+ var servers = new Dictionary
+ {
+ {
+ "postgres1",
+ new AdminerLoginServer
+ {
+ Driver = "pgsql",
+ Server = postgresResource1.Name,
+ Password = postgresResource1.PasswordParameter.Value,
+ UserName = postgresResource1.UserNameParameter?.Value ?? "postgres"
+ }
+ },
+ {
+ "postgres2",
+ new AdminerLoginServer
+ {
+ Driver = "pgsql",
+ Server = postgresResource2.Name,
+ Password = postgresResource2.PasswordParameter.Value,
+ UserName = postgresResource2.UserNameParameter?.Value ?? "postgres"
+ }
+ }
+ };
+
+ var envValue = JsonSerializer.Serialize(servers);
+ var item = Assert.Single(envs);
+ Assert.Equal("ADMINER_SERVERS", item.Key);
+ Assert.Equal(envValue, item.Value);
+ }
}
|
|---|