From 95b833fb518ed8f2e259dbbe23e251b3bbafe91e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Muzik=C3=A1=C5=99?= Date: Thu, 25 Jan 2024 12:40:13 +0100 Subject: [PATCH] Supported option to specify site name for multi-site deployments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #26460 Signed-off-by: Václav Muzikář --- ...efaultInfinispanConnectionProviderFactory.java | 7 +++++-- .../connections/infinispan/TopologyInfo.java | 15 ++++++++++----- .../QuarkusInfinispanConnectionFactory.java | 15 +++++++++++++++ .../storage/database/ExternalInfinispanTest.java | 9 ++++++++- .../test/resources/META-INF/keycloak-server.json | 2 +- .../tests/base/src/test/resources/arquillian.xml | 8 ++++---- .../main/resources/META-INF/keycloak-server.json | 2 +- 7 files changed, 44 insertions(+), 14 deletions(-) diff --git a/model/infinispan/src/main/java/org/keycloak/connections/infinispan/DefaultInfinispanConnectionProviderFactory.java b/model/infinispan/src/main/java/org/keycloak/connections/infinispan/DefaultInfinispanConnectionProviderFactory.java index 06852af1064a..95a4652b8223 100755 --- a/model/infinispan/src/main/java/org/keycloak/connections/infinispan/DefaultInfinispanConnectionProviderFactory.java +++ b/model/infinispan/src/main/java/org/keycloak/connections/infinispan/DefaultInfinispanConnectionProviderFactory.java @@ -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; @@ -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); @@ -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)); diff --git a/model/infinispan/src/main/java/org/keycloak/connections/infinispan/TopologyInfo.java b/model/infinispan/src/main/java/org/keycloak/connections/infinispan/TopologyInfo.java index 25a6ad1afde7..cefe17d3675b 100644 --- a/model/infinispan/src/main/java/org/keycloak/connections/infinispan/TopologyInfo.java +++ b/model/infinispan/src/main/java/org/keycloak/connections/infinispan/TopologyInfo.java @@ -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; @@ -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; @@ -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; } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/storage/legacy/infinispan/QuarkusInfinispanConnectionFactory.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/storage/legacy/infinispan/QuarkusInfinispanConnectionFactory.java index 83c7a4f5d183..12dabba584f6 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/storage/legacy/infinispan/QuarkusInfinispanConnectionFactory.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/storage/legacy/infinispan/QuarkusInfinispanConnectionFactory.java @@ -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 Pedro Igor @@ -43,4 +47,15 @@ public int order() { public String getId() { return "quarkus"; } + + @Override + public List getConfigMetadata() { + return ProviderConfigurationBuilder.create() + .property() + .name("site-name") + .helpText("Site name for multi-site deployments") + .type("string") + .add() + .build(); + } } diff --git a/quarkus/tests/integration/src/test/java/org/keycloak/it/storage/database/ExternalInfinispanTest.java b/quarkus/tests/integration/src/test/java/org/keycloak/it/storage/database/ExternalInfinispanTest.java index c13cd8970386..a69d5e0514a6 100644 --- a/quarkus/tests/integration/src/test/java/org/keycloak/it/storage/database/ExternalInfinispanTest.java +++ b/quarkus/tests/integration/src/test/java/org/keycloak/it/storage/database/ExternalInfinispanTest.java @@ -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; @@ -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); @@ -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"); + } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/resources/META-INF/keycloak-server.json b/testsuite/integration-arquillian/tests/base/src/test/resources/META-INF/keycloak-server.json index e8831447fbd6..f950e18faed9 100755 --- a/testsuite/integration-arquillian/tests/base/src/test/resources/META-INF/keycloak-server.json +++ b/testsuite/integration-arquillian/tests/base/src/test/resources/META-INF/keycloak-server.json @@ -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}", diff --git a/testsuite/integration-arquillian/tests/base/src/test/resources/arquillian.xml b/testsuite/integration-arquillian/tests/base/src/test/resources/arquillian.xml index a872b16c1e20..54a0486a0518 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/resources/arquillian.xml +++ b/testsuite/integration-arquillian/tests/base/src/test/resources/arquillian.xml @@ -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} @@ -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} @@ -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} @@ -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} diff --git a/testsuite/utils/src/main/resources/META-INF/keycloak-server.json b/testsuite/utils/src/main/resources/META-INF/keycloak-server.json index ba420b26dc16..0bb1a4076371 100755 --- a/testsuite/utils/src/main/resources/META-INF/keycloak-server.json +++ b/testsuite/utils/src/main/resources/META-INF/keycloak-server.json @@ -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:}",