Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add health check support for Keycloak container #7122

Merged
merged 9 commits into from
Jan 19, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ public static class KeycloakResourceBuilderExtensions
{
private const string AdminEnvVarName = "KC_BOOTSTRAP_ADMIN_USERNAME";
private const string AdminPasswordEnvVarName = "KC_BOOTSTRAP_ADMIN_PASSWORD";
private const string HealthCheckEnvVarName = "KC_HEALTH_ENABLED"; // As per https://www.keycloak.org/observability/health

private const int DefaultContainerPort = 8080;
private const int ManagementInterfaceContainerPort = 9000; // As per https://www.keycloak.org/server/management-interface
private const string ManagementEndpointName = "management";
private const string RealmImportDirectory = "/opt/keycloak/data/import";

/// <summary>
Expand Down Expand Up @@ -59,10 +63,13 @@ public static IResourceBuilder<KeycloakResource> AddKeycloak(
.WithImageRegistry(KeycloakContainerImageTags.Registry)
.WithImageTag(KeycloakContainerImageTags.Tag)
.WithHttpEndpoint(port: port, targetPort: DefaultContainerPort)
.WithHttpEndpoint(targetPort: ManagementInterfaceContainerPort, name: ManagementEndpointName)
.WithHttpHealthCheck(endpointName: ManagementEndpointName, path: "/health/ready")
.WithEnvironment(context =>
{
context.EnvironmentVariables[AdminEnvVarName] = resource.AdminReference;
context.EnvironmentVariables[AdminPasswordEnvVarName] = resource.AdminPasswordParameter;
context.EnvironmentVariables[HealthCheckEnvVarName] = "true";
});

if (builder.ExecutionContext.IsRunMode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,28 @@ public void AddKeycloakWithDefaultsAddsAnnotationMetadata()
var containerResource = Assert.Single(appModel.Resources.OfType<KeycloakResource>());
Assert.Equal(resourceName, containerResource.Name);

var endpoint = Assert.Single(containerResource.Annotations.OfType<EndpointAnnotation>());
const string defaultEndpointName = "http";

var endpoint = Assert.Single(containerResource.Annotations.OfType<EndpointAnnotation>().Where(e => e.Name == defaultEndpointName));
Assert.Equal(8080, endpoint.TargetPort);
Assert.False(endpoint.IsExternal);
Assert.Equal("http", endpoint.Name);
Assert.Equal(defaultEndpointName, endpoint.Name);
Assert.Null(endpoint.Port);
Assert.Equal(ProtocolType.Tcp, endpoint.Protocol);
Assert.Equal("http", endpoint.Transport);
Assert.Equal("http", endpoint.UriScheme);

const string managementEndpointName = "management";

var healthEndpoint = Assert.Single(containerResource.Annotations.OfType<EndpointAnnotation>().Where(e => e.Name == managementEndpointName));
Assert.Equal(9000, healthEndpoint.TargetPort);
Assert.False(healthEndpoint.IsExternal);
Assert.Equal(managementEndpointName, healthEndpoint.Name);
Assert.Null(healthEndpoint.Port);
Assert.Equal(ProtocolType.Tcp, healthEndpoint.Protocol);
Assert.Equal("http", healthEndpoint.Transport);
Assert.Equal("http", healthEndpoint.UriScheme);

var containerAnnotation = Assert.Single(containerResource.Annotations.OfType<ContainerImageAnnotation>());
Assert.Equal(KeycloakContainerImageTags.Tag, containerAnnotation.Tag);
Assert.Equal(KeycloakContainerImageTags.Image, containerAnnotation.Image);
Expand Down Expand Up @@ -142,14 +155,21 @@ public async Task VerifyManifest()
],
"env": {
"KC_BOOTSTRAP_ADMIN_USERNAME": "admin",
"KC_BOOTSTRAP_ADMIN_PASSWORD": "{keycloak-password.value}"
"KC_BOOTSTRAP_ADMIN_PASSWORD": "{keycloak-password.value}",
"KC_HEALTH_ENABLED": "true"
},
"bindings": {
"http": {
"scheme": "http",
"protocol": "tcp",
"transport": "http",
"targetPort": 8080
},
"management": {
"scheme": "http",
"protocol": "tcp",
"transport": "http",
"targetPort": 9000
}
}
}
Expand Down
Loading