Skip to content

Commit

Permalink
Supported option to specify site name for multi-site deployments
Browse files Browse the repository at this point in the history
Closes keycloak#26460

Signed-off-by: Václav Muzikář <vmuzikar@redhat.com>
  • Loading branch information
vmuzikar committed Jan 29, 2024
1 parent eff289b commit 95b833f
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 14 deletions.
Expand Up @@ -46,9 +46,12 @@
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.models.utils.PostMigrationEvent;
import org.keycloak.provider.InvalidationHandler.ObjectType;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.provider.ProviderConfigurationBuilder;
import org.keycloak.provider.ProviderEvent;

import java.util.Iterator;
import java.util.List;
import java.util.ServiceLoader;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
Expand Down Expand Up @@ -225,7 +228,7 @@ protected EmbeddedCacheManager initContainerManaged(EmbeddedCacheManager cacheMa
cacheManager.defineConfiguration(InfinispanConnectionProvider.AUTHORIZATION_REVISIONS_CACHE_NAME, getRevisionCacheConfig(authzRevisionsMaxEntries));
cacheManager.getCache(InfinispanConnectionProvider.AUTHORIZATION_REVISIONS_CACHE_NAME, true);

this.topologyInfo = new TopologyInfo(cacheManager, config, false);
this.topologyInfo = new TopologyInfo(cacheManager, config, false, getId());

logger.debugv("Using container managed Infinispan cache container, lookup={0}", cacheManager);

Expand All @@ -239,7 +242,7 @@ protected EmbeddedCacheManager initEmbedded() {
boolean async = config.getBoolean("async", false);
boolean useKeycloakTimeService = config.getBoolean("useKeycloakTimeService", false);

this.topologyInfo = new TopologyInfo(cacheManager, config, true);
this.topologyInfo = new TopologyInfo(cacheManager, config, true, getId());

if (clustered) {
String jgroupsUdpMcastAddr = config.get("jgroupsUdpMcastAddr", System.getProperty(InfinispanConnectionProvider.JGROUPS_UDP_MCAST_ADDR));
Expand Down
Expand Up @@ -20,7 +20,6 @@
import java.net.InetSocketAddress;
import java.security.SecureRandom;
import java.util.Objects;
import java.util.Optional;

import org.infinispan.Cache;
import org.infinispan.distribution.DistributionManager;
Expand Down Expand Up @@ -55,22 +54,28 @@ public class TopologyInfo {
private final boolean isGeneratedNodeName;


public TopologyInfo(EmbeddedCacheManager cacheManager, Config.Scope config, boolean embedded) {
public TopologyInfo(EmbeddedCacheManager cacheManager, Config.Scope config, boolean embedded, String providerId) {
String siteName;
String nodeName;
boolean isGeneratedNodeName = false;

if (System.getProperty(InfinispanConnectionProvider.JBOSS_SITE_NAME) != null) {
throw new IllegalArgumentException(
String.format("System property %s is in use. Use --spi-connections-infinispan-%s-site-name config option instead",
InfinispanConnectionProvider.JBOSS_SITE_NAME, providerId));
}

if (!embedded) {
Transport transport = cacheManager.getTransport();
if (transport != null) {
nodeName = transport.getAddress().toString();
siteName = cacheManager.getCacheManagerConfiguration().transport().siteId();
if (siteName == null) {
siteName = System.getProperty(InfinispanConnectionProvider.JBOSS_SITE_NAME);
siteName = config.get("siteName");
}
} else {
nodeName = System.getProperty(InfinispanConnectionProvider.JBOSS_NODE_NAME);
siteName = System.getProperty(InfinispanConnectionProvider.JBOSS_SITE_NAME);
siteName = config.get("siteName");
}
if (nodeName == null || nodeName.equals("localhost")) {
isGeneratedNodeName = true;
Expand All @@ -84,7 +89,7 @@ public TopologyInfo(EmbeddedCacheManager cacheManager, Config.Scope config, bool
nodeName = null;
}

siteName = config.get("siteName", System.getProperty(InfinispanConnectionProvider.JBOSS_SITE_NAME));
siteName = config.get("siteName");
if (siteName != null && siteName.isEmpty()) {
siteName = null;
}
Expand Down
Expand Up @@ -19,6 +19,10 @@

import org.infinispan.manager.EmbeddedCacheManager;
import org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.provider.ProviderConfigurationBuilder;

import java.util.List;

/**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
Expand All @@ -43,4 +47,15 @@ public int order() {
public String getId() {
return "quarkus";
}

@Override
public List<ProviderConfigProperty> getConfigMetadata() {
return ProviderConfigurationBuilder.create()
.property()
.name("site-name")
.helpText("Site name for multi-site deployments")
.type("string")
.add()
.build();
}
}
Expand Up @@ -20,6 +20,7 @@
import io.quarkus.test.junit.main.Launch;
import org.junit.jupiter.api.Test;
import org.keycloak.common.util.Retry;
import org.keycloak.it.junit5.extension.CLIResult;
import org.keycloak.it.junit5.extension.DistributionTest;
import org.keycloak.it.junit5.extension.InfinispanContainer;
import org.keycloak.it.junit5.extension.WithExternalInfinispan;
Expand All @@ -31,7 +32,7 @@
public class ExternalInfinispanTest {

@Test
@Launch({ "start-dev", "--features=multi-site", "--cache=ispn", "--cache-config-file=../../../test-classes/ExternalInfinispan/kcb-infinispan-cache-remote-store-config.xml", "-Djboss.site.name=ISPN" })
@Launch({ "start-dev", "--features=multi-site", "--cache=ispn", "--cache-config-file=../../../test-classes/ExternalInfinispan/kcb-infinispan-cache-remote-store-config.xml", "--spi-connections-infinispan-quarkus-site-name=ISPN" })
void testLoadBalancerCheckFailure() {
when().get("/lb-check").then()
.statusCode(200);
Expand All @@ -45,4 +46,10 @@ void testLoadBalancerCheckFailure() {
.statusCode(503);
}, 10, 200);
}

@Test
@Launch({ "start-dev", "-Djboss.site.name=ISPN" })
void testSiteNameAsSystemProperty(CLIResult result) {
result.assertError("System property jboss.site.name is in use. Use --spi-connections-infinispan-quarkus-site-name config option instead");
}
}
Expand Up @@ -185,7 +185,7 @@
"default": {
"jgroupsUdpMcastAddr": "${keycloak.connectionsInfinispan.jgroupsUdpMcastAddr:234.56.78.90}",
"nodeName": "${keycloak.connectionsInfinispan.nodeName,jboss.node.name:}",
"siteName": "${keycloak.connectionsInfinispan.siteName,jboss.site.name:}",
"siteName": "${keycloak.connectionsInfinispan.siteName:}",
"clustered": "${keycloak.connectionsInfinispan.clustered:false}",
"async": "${keycloak.connectionsInfinispan.async:false}",
"sessionsOwners": "${keycloak.connectionsInfinispan.sessionsOwners:1}",
Expand Down
Expand Up @@ -519,7 +519,7 @@
-Djboss.socket.binding.port-offset=${auth.server.crossdc01.port.offset}
-Djboss.default.multicast.address=234.56.78.1
-Dremote.cache.port=12232
-Djboss.site.name=dc0
-Dkeycloak.connectionsInfinispan.siteName=dc0
-Djboss.node.name=auth-server-${node.name}-cross-dc-0_1
-Dauth.server.truststore=${auth.server.truststore}
-Dauth.server.truststore.password=${auth.server.truststore.password}
Expand Down Expand Up @@ -551,7 +551,7 @@
-Djboss.socket.binding.port-offset=${auth.server.crossdc02.port.offset}
-Djboss.default.multicast.address=234.56.78.1
-Dremote.cache.port=12232
-Djboss.site.name=dc0
-Dkeycloak.connectionsInfinispan.siteName=dc0
-Djboss.node.name=auth-server-${node.name}-cross-dc-0_2-manual
-Dauth.server.truststore=${auth.server.truststore}
-Dauth.server.truststore.password=${auth.server.truststore.password}
Expand Down Expand Up @@ -584,7 +584,7 @@
-Djboss.socket.binding.port-offset=${auth.server.crossdc11.port.offset}
-Djboss.default.multicast.address=234.56.78.2
-Dremote.cache.port=13232
-Djboss.site.name=dc1
-Dkeycloak.connectionsInfinispan.siteName=dc1
-Djboss.node.name=auth-server-${node.name}-cross-dc-1_1
-Dauth.server.truststore=${auth.server.truststore}
-Dauth.server.truststore.password=${auth.server.truststore.password}
Expand Down Expand Up @@ -616,7 +616,7 @@
-Djboss.socket.binding.port-offset=${auth.server.crossdc12.port.offset}
-Djboss.default.multicast.address=234.56.78.2
-Dremote.cache.port=13232
-Djboss.site.name=dc1
-Dkeycloak.connectionsInfinispan.siteName=dc1
-Djboss.node.name=auth-server-${node.name}-cross-dc-1_2-manual
-Dauth.server.truststore=${auth.server.truststore}
-Dauth.server.truststore.password=${auth.server.truststore.password}
Expand Down
Expand Up @@ -137,7 +137,7 @@
"default": {
"jgroupsUdpMcastAddr": "${keycloak.connectionsInfinispan.jgroupsUdpMcastAddr:234.56.78.90}",
"nodeName": "${keycloak.connectionsInfinispan.nodeName,jboss.node.name:}",
"siteName": "${keycloak.connectionsInfinispan.siteName,jboss.site.name:}",
"siteName": "${keycloak.connectionsInfinispan.siteName:}",
"clustered": "${keycloak.connectionsInfinispan.clustered:}",
"async": "${keycloak.connectionsInfinispan.async:}",
"sessionsOwners": "${keycloak.connectionsInfinispan.sessionsOwners:}",
Expand Down

0 comments on commit 95b833f

Please sign in to comment.