Patch kubernetes stack with port_range=0

Fixes #39023

Fixes #39454

Signed-off-by: Pedro Ruivo <pruivo@redhat.com>
This commit is contained in:
Pedro Ruivo 2025-05-07 15:11:45 +01:00 committed by Alexander Schwartz
parent 36ef5c0959
commit 55998367d8
2 changed files with 59 additions and 1 deletions

View File

@ -19,6 +19,7 @@ package org.keycloak.quarkus.runtime.storage.infinispan.jgroups;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.keycloak.config.CachingOptions;
@ -29,6 +30,9 @@ import org.keycloak.quarkus.runtime.storage.infinispan.CacheManagerFactory;
import org.keycloak.quarkus.runtime.storage.infinispan.jgroups.impl.FileJGroupsTlsConfigurator;
import org.keycloak.quarkus.runtime.storage.infinispan.jgroups.impl.JGroupsJdbcPingStackConfigurator;
import org.keycloak.quarkus.runtime.storage.infinispan.jgroups.impl.JpaJGroupsTlsConfigurator;
import org.keycloak.quarkus.runtime.storage.infinispan.jgroups.impl.KubernetesPatchConfigurator;
import static org.keycloak.quarkus.runtime.storage.infinispan.jgroups.JGroupsUtil.transportStackOf;
/**
* Configures the JGroups stacks before starting Infinispan.
@ -76,6 +80,19 @@ public class JGroupsConfigurator {
configurator.add(FileJGroupsTlsConfigurator.INSTANCE);
}
/**
* Patch for <a href="https://github.com/keycloak/keycloak/issues/39023">GHI#39023</a> and <a
* href="https://github.com/keycloak/keycloak/issues/39454">GHI#39454</a>
*/
private static void createKubernetesPatchConfigurator(ConfigurationBuilderHolder holder, List<JGroupsStackConfigurator> configurator) {
var stackXmlAttribute = transportStackOf(holder);
if (!Objects.equals(KubernetesPatchConfigurator.KUBERNETES_STACK, stackXmlAttribute.get())) {
// not the kubernetes stack
return;
}
configurator.add(KubernetesPatchConfigurator.INSTANCE);
}
private static boolean isLocal(ConfigurationBuilderHolder holder) {
return JGroupsUtil.transportOf(holder) == null;
}
@ -87,9 +104,10 @@ public class JGroupsConfigurator {
}
// Configure stack from CLI options to Global Configuration
Configuration.getOptionalKcValue(CachingOptions.CACHE_STACK).ifPresent(JGroupsUtil.transportOf(holder)::stack);
var configurator = new ArrayList<JGroupsStackConfigurator>(2);
var configurator = new ArrayList<JGroupsStackConfigurator>(3);
createJdbcPingConfigurator(holder, configurator);
createTlsConfigurator(configurator);
createKubernetesPatchConfigurator(holder, configurator);
return new JGroupsConfigurator(holder, List.copyOf(configurator));
}

View File

@ -0,0 +1,40 @@
package org.keycloak.quarkus.runtime.storage.infinispan.jgroups.impl;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.remoting.transport.jgroups.EmbeddedJGroupsChannelConfigurator;
import org.jgroups.conf.ProtocolConfiguration;
import org.keycloak.models.KeycloakSession;
import org.keycloak.quarkus.runtime.storage.infinispan.CacheManagerFactory;
import org.keycloak.quarkus.runtime.storage.infinispan.jgroups.JGroupsStackConfigurator;
import java.util.List;
import java.util.Map;
import static org.keycloak.quarkus.runtime.storage.infinispan.jgroups.JGroupsUtil.transportOf;
/**
* Patch for <a href="https://github.com/keycloak/keycloak/issues/39023">GHI#39023</a> and <a
* href="https://github.com/keycloak/keycloak/issues/39454">GHI#39454</a>
*/
public class KubernetesPatchConfigurator implements JGroupsStackConfigurator {
public static final String KUBERNETES_STACK = "kubernetes";
private static final String KUBERNETES_PATCHED_STACK = "kubernetes-patched";
public static final KubernetesPatchConfigurator INSTANCE = new KubernetesPatchConfigurator();
@Override
public boolean requiresKeycloakSession() {
return false;
}
@Override
public void configure(ConfigurationBuilderHolder holder, KeycloakSession session) {
CacheManagerFactory.logger.info("[PATCH] Patching kubernetes stack.");
// patch port range
var attributes = Map.of("port_range", "0");
var patch = List.of(new ProtocolConfiguration("TCP", attributes));
holder.addJGroupsStack(new EmbeddedJGroupsChannelConfigurator(KUBERNETES_PATCHED_STACK, patch, null), KUBERNETES_STACK);
transportOf(holder).stack(KUBERNETES_PATCHED_STACK);
}
}