Skip to content

Commit d82f636

Browse files
committed
Add support for deployment to aca and ssl.
1 parent 8fd92af commit d82f636

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

src/Aspire.Hosting.Keycloak/KeycloakResourceBuilderExtensions.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using Aspire.Hosting.ApplicationModel;
55
using Aspire.Hosting.Keycloak;
6+
using System.Globalization;
67

78
namespace Aspire.Hosting;
89

@@ -14,8 +15,17 @@ public static class KeycloakResourceBuilderExtensions
1415
private const string AdminEnvVarName = "KC_BOOTSTRAP_ADMIN_USERNAME";
1516
private const string AdminPasswordEnvVarName = "KC_BOOTSTRAP_ADMIN_PASSWORD";
1617
private const string HealthCheckEnvVarName = "KC_HEALTH_ENABLED"; // As per https://www.keycloak.org/observability/health
18+
private const string ProxyEdgeEnvVarName = "KC_PROXY";
19+
private const string HttpPortEnvVarName = "KC_HTTP_PORT";
20+
private const string HttpEnabledEnvVarName = "KC_HTTP_ENABLED";
21+
private const string HostNamePortEnvVarName = "KC_HOSTNAME_PORT";
22+
private const string HostNameStrictBackchannelEnvVarName = "KC_HOSTNAME_STRICT_BACKCHANNEL";
23+
private const string ProxyHeadersEnvVarName = "KC_PROXY_HEADERS";
24+
private const string HostNameStrictEnvVarName = "KC_HOSTNAME_STRICT";
25+
private const string HostNameStrictHttpsEnvVarName = "KC_HOSTNAME_STRICT_HTTPS";
1726

1827
private const int DefaultContainerPort = 8080;
28+
private const int HttpsContainerPort = 8443;
1929
private const int ManagementInterfaceContainerPort = 9000; // As per https://www.keycloak.org/server/management-interface
2030
private const string ManagementEndpointName = "management";
2131
private const string RealmImportDirectory = "/opt/keycloak/data/import";
@@ -56,12 +66,14 @@ public static IResourceBuilder<KeycloakResource> AddKeycloak(
5666

5767
var resource = new KeycloakResource(name, adminUsername?.Resource, passwordParameter);
5868

69+
var targetPort = port == HttpsContainerPort ? HttpsContainerPort : DefaultContainerPort;
70+
5971
var keycloak = builder
6072
.AddResource(resource)
6173
.WithImage(KeycloakContainerImageTags.Image)
6274
.WithImageRegistry(KeycloakContainerImageTags.Registry)
6375
.WithImageTag(KeycloakContainerImageTags.Tag)
64-
.WithHttpEndpoint(port: port, targetPort: DefaultContainerPort)
76+
.WithHttpEndpoint(port: port, targetPort: targetPort)
6577
.WithHttpEndpoint(targetPort: ManagementInterfaceContainerPort, name: ManagementEndpointName)
6678
.WithHttpHealthCheck(endpointName: ManagementEndpointName, path: "/health/ready")
6779
.WithEnvironment(context =>

tests/Aspire.Hosting.Keycloak.Tests/KeycloakResourceBuilderTests.cs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public void AddAddKeycloakDoesNotAddGeneratedPasswordParameterWithUserSecretsPar
107107
}
108108

109109
[Fact]
110-
public async Task VerifyManifest()
110+
public async Task VerifyManifestForHttp()
111111
{
112112
using var builder = TestDistributedApplicationBuilder.Create();
113113
var keycloak = builder.AddKeycloak("keycloak");
@@ -145,4 +145,52 @@ public async Task VerifyManifest()
145145
""";
146146
Assert.Equal(expectedManifest, manifest.ToString());
147147
}
148+
149+
[Fact]
150+
public async Task VerifyManifestForHttps()
151+
{
152+
using var builder = TestDistributedApplicationBuilder.Create();
153+
var keycloak = builder.AddKeycloak("keycloak", 8443);
154+
155+
var manifest = await ManifestUtils.GetManifest(keycloak.Resource);
156+
157+
var expectedManifest = $$"""
158+
{
159+
"type": "container.v0",
160+
"image": "{{KeycloakContainerImageTags.Registry}}/{{KeycloakContainerImageTags.Image}}:{{KeycloakContainerImageTags.Tag}}",
161+
"args": [
162+
"start-dev",
163+
"--import-realm"
164+
],
165+
"env": {
166+
"KC_BOOTSTRAP_ADMIN_USERNAME": "admin",
167+
"KC_BOOTSTRAP_ADMIN_PASSWORD": "{keycloak-password.value}",
168+
"KC_HEALTH_ENABLED": "true",
169+
"KC_PROXY": "edge",
170+
"KC_HTTP_PORT": "8443",
171+
"KC_HTTP_ENABLED": "true",
172+
"KC_HOSTNAME_PORT": "8443",
173+
"KC_HOSTNAME_STRICT_BACKCHANNEL": "false",
174+
"KC_PROXY_HEADERS": "xforwarded",
175+
"KC_HOSTNAME_STRICT": "false",
176+
"KC_HOSTNAME_STRICT_HTTPS": "false"
177+
},
178+
"bindings": {
179+
"http": {
180+
"scheme": "http",
181+
"protocol": "tcp",
182+
"transport": "http",
183+
"targetPort": 8443
184+
},
185+
"management": {
186+
"scheme": "http",
187+
"protocol": "tcp",
188+
"transport": "http",
189+
"targetPort": 9000
190+
}
191+
}
192+
}
193+
""";
194+
Assert.Equal(expectedManifest, manifest.ToString());
195+
}
148196
}

0 commit comments

Comments
 (0)