Skip to content

Commit 6a31777

Browse files
shawkinsahus1
andauthored
fix: adding the jgroups bind address for ipv6 support (keycloak#36504)
* fix: adding the jgroups bind address closes: keycloak#36383 Signed-off-by: Steve Hawkins <[email protected]> * Update operator/src/main/java/org/keycloak/operator/controllers/KeycloakDeploymentDependentResource.java Co-authored-by: Alexander Schwartz <[email protected]> Signed-off-by: Steven Hawkins <[email protected]> --------- Signed-off-by: Steve Hawkins <[email protected]> Signed-off-by: Steven Hawkins <[email protected]> Co-authored-by: Alexander Schwartz <[email protected]>
1 parent b12a073 commit 6a31777

File tree

3 files changed

+13
-3
lines changed

3 files changed

+13
-3
lines changed

operator/src/main/java/org/keycloak/operator/controllers/KeycloakDeploymentDependentResource.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@
7575

7676
public class KeycloakDeploymentDependentResource extends CRUDKubernetesDependentResource<StatefulSet, Keycloak> {
7777

78+
public static final String POD_IP = "POD_IP";
79+
7880
private static final List<String> COPY_ENV = Arrays.asList("HTTP_PROXY", "HTTPS_PROXY", "NO_PROXY");
7981

8082
private static final String ZONE_KEY = "topology.kubernetes.io/zone";
@@ -296,6 +298,8 @@ private StatefulSet createBaseDeployment(Keycloak keycloakCR, Context<Keycloak>
296298
&& (customImage.isPresent() || operatorConfig.keycloak().startOptimized())) {
297299
containerBuilder.addToArgs(OPTIMIZED_ARG);
298300
}
301+
// Set bind address as this is required for JGroups to form a cluster in IPv6 envionments
302+
containerBuilder.addToArgs(0, "-Djgroups.bind.address=$(%s)".formatted(POD_IP));
299303
containerBuilder.addToArgs(0, getJGroupsParameter(keycloakCR));
300304

301305
// probes
@@ -500,6 +504,9 @@ private List<EnvVar> getDefaultAndAdditionalEnvVars(Keycloak keycloakCR) {
500504
}
501505
}
502506

507+
envVars.add(new EnvVarBuilder().withName(POD_IP).withNewValueFrom().withNewFieldRef()
508+
.withFieldPath("status.podIP").endFieldRef().endValueFrom().build());
509+
503510
return envVars;
504511
}
505512

operator/src/test/java/org/keycloak/operator/testsuite/unit/PodTemplateTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,8 @@ public void testCommandsAndArgsAreMerged() {
218218
// Assert
219219
assertEquals(1, podTemplate.getSpec().getContainers().get(0).getCommand().size());
220220
assertEquals(command, podTemplate.getSpec().getContainers().get(0).getCommand().get(0));
221-
assertEquals(2, podTemplate.getSpec().getContainers().get(0).getArgs().size());
222-
assertEquals(arg, podTemplate.getSpec().getContainers().get(0).getArgs().get(1));
221+
assertEquals(3, podTemplate.getSpec().getContainers().get(0).getArgs().size());
222+
assertEquals(arg, podTemplate.getSpec().getContainers().get(0).getArgs().get(2));
223223
}
224224

225225
@Test
@@ -402,11 +402,13 @@ public void testDefaults() {
402402
// Assert
403403
assertNotNull(container);
404404
assertThat(container.getArgs()).doesNotContain(KeycloakDeploymentDependentResource.OPTIMIZED_ARG);
405+
assertThat(container.getArgs()).contains("-Djgroups.bind.address=$(POD_IP)");
405406

406407
var envVars = container.getEnv();
407408
assertThat(envVars.stream()).anyMatch(envVar -> envVar.getName().equals(KeycloakDeploymentDependentResource.KC_TRUSTSTORE_PATHS));
408409
assertThat(envVars.stream()).anyMatch(envVar -> envVar.getName().equals(KeycloakDeploymentDependentResource.KC_TRACING_SERVICE_NAME));
409410
assertThat(envVars.stream()).anyMatch(envVar -> envVar.getName().equals(KeycloakDeploymentDependentResource.KC_TRACING_RESOURCE_ATTRIBUTES));
411+
assertThat(envVars.stream()).anyMatch(envVar -> envVar.getName().equals(KeycloakDeploymentDependentResource.POD_IP));
410412

411413
var readiness = container.getReadinessProbe().getHttpGet();
412414
assertNotNull(readiness);

operator/src/test/java/org/keycloak/operator/testsuite/utils/CRAssert.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.fabric8.kubernetes.api.model.networking.v1.NetworkPolicyPort;
3636
import io.fabric8.kubernetes.client.KubernetesClient;
3737
import io.fabric8.kubernetes.client.utils.Serialization;
38+
import io.netty.util.NetUtil;
3839
import io.quarkus.logging.Log;
3940
import org.assertj.core.api.ObjectAssert;
4041
import org.awaitility.Awaitility;
@@ -197,7 +198,7 @@ public static void assertConnection(KubernetesClient client, String hostname, in
197198
"--connect-timeout",
198199
"2",
199200
"-s",
200-
"telnet://%s:%s".formatted(hostname, port));
201+
"telnet://%s:%s".formatted(NetUtil.isValidIpV6Address(hostname)?"["+hostname+"]":hostname, port));
201202
// Relevant exit codes:
202203
// 28-Operation timeout.
203204
// 48-Unknown option specified to libcurl (BOGUS=1 is not a valid option, but the connection is successful).

0 commit comments

Comments
 (0)