KEYCLOAK-15631 Disable clustering for 'dev' profile. Remove cluster.xml file from quarkus distribution packaging

This commit is contained in:
mposolda 2020-09-25 16:50:58 +02:00 committed by Pedro Igor
parent 12576e339d
commit 10859ebfc3
11 changed files with 93 additions and 146 deletions

View file

@ -96,6 +96,16 @@
<outputDirectory/> <outputDirectory/>
<filtered>true</filtered> <filtered>true</filtered>
</file> </file>
<file>
<source>target/keycloak-quarkus-server/default-clustered-cache.xml</source>
<outputDirectory>conf</outputDirectory>
<destName>clustered-cache.xml</destName>
</file>
<file>
<source>target/keycloak-quarkus-server/default-local-cache.xml</source>
<outputDirectory>conf</outputDirectory>
<destName>local-cache.xml</destName>
</file>
</files> </files>
</assembly> </assembly>

View file

@ -64,6 +64,12 @@
<type>zip</type> <type>zip</type>
<outputDirectory>target/</outputDirectory> <outputDirectory>target/</outputDirectory>
</artifactItem> </artifactItem>
<artifactItem>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-quarkus-server</artifactId>
<type>jar</type>
<outputDirectory>target/keycloak-quarkus-server</outputDirectory>
</artifactItem>
</artifactItems> </artifactItems>
</configuration> </configuration>
</execution> </execution>

View file

@ -1,105 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2019 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<infinispan
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:10.1 http://www.infinispan.org/schemas/infinispan-config-10.1.xsd"
xmlns="urn:infinispan:config:10.1">
<!-- Distributed Cache Container Configuration-->
<cache-container name="keycloak">
<transport lock-timeout="60000"/>
<local-cache name="realms">
<memory>
<object size="10000"/>
</memory>
</local-cache>
<local-cache name="users">
<memory>
<object size="10000"/>
</memory>
</local-cache>
<distributed-cache name="sessions" owners="1"/>
<distributed-cache name="authenticationSessions" owners="1"/>
<distributed-cache name="offlineSessions" owners="1"/>
<distributed-cache name="clientSessions" owners="1"/>
<distributed-cache name="offlineClientSessions" owners="1"/>
<distributed-cache name="loginFailures" owners="1"/>
<local-cache name="authorization">
<memory>
<object size="10000"/>
</memory>
</local-cache>
<replicated-cache name="work"/>
<local-cache name="keys">
<expiration max-idle="3600000"/>
<memory>
<object size="1000"/>
</memory>
</local-cache>
<distributed-cache name="actionTokens" owners="2">
<expiration max-idle="-1" interval="300000"/>
<memory>
<object size="-1"/>
</memory>
</distributed-cache>
</cache-container>
<!-- Local Cache Container Configuration -->
<!--
<cache-container name="keycloak">
<local-cache name="default">
<transaction transaction-manager-lookup="org.infinispan.transaction.lookup.JBossStandaloneJTAManagerLookup"/>
</local-cache>
<local-cache name="realms">
<memory>
<object size="10000"/>
</memory>
</local-cache>
<local-cache name="users">
<memory>
<object size="10000"/>
</memory>
</local-cache>
<local-cache name="sessions"/>
<local-cache name="authenticationSessions"/>
<local-cache name="offlineSessions"/>
<local-cache name="clientSessions"/>
<local-cache name="offlineClientSessions"/>
<local-cache name="loginFailures"/>
<local-cache name="work"/>
<local-cache name="authorization">
<memory>
<object size="10000"/>
</memory>
</local-cache>
<local-cache name="keys">
<expiration max-idle="3600000"/>
<memory>
<object size="10000"/>
</memory>
</local-cache>
<local-cache name="actionTokens">
<expiration max-idle="-1" interval="300000"/>
<memory>
<object size="-1"/>
</memory>
</local-cache>
</cache-container>
-->
</infinispan>

26
pom.xml
View file

@ -1227,6 +1227,23 @@
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- Quarkus -->
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-quarkus-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-quarkus-server-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-quarkus-server-app</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Openshift --> <!-- Openshift -->
<dependency> <dependency>
<groupId>com.openshift</groupId> <groupId>com.openshift</groupId>
@ -1798,15 +1815,6 @@
<modules> <modules>
<module>quarkus</module> <module>quarkus</module>
</modules> </modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-quarkus-server</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</profile> </profile>
</profiles> </profiles>

View file

@ -17,7 +17,6 @@
<dependency> <dependency>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<artifactId>keycloak-quarkus-server</artifactId> <artifactId>keycloak-quarkus-server</artifactId>
<version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.quarkus</groupId> <groupId>io.quarkus</groupId>

View file

@ -21,11 +21,8 @@ import static org.keycloak.configuration.PropertyMapper.createWithDefault;
import static org.keycloak.configuration.PropertyMapper.forBuildTimeProperty; import static org.keycloak.configuration.PropertyMapper.forBuildTimeProperty;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.google.common.base.Ascii;
import io.quarkus.runtime.configuration.ProfileManager; import io.quarkus.runtime.configuration.ProfileManager;
import io.smallrye.config.ConfigSourceInterceptorContext; import io.smallrye.config.ConfigSourceInterceptorContext;
import io.smallrye.config.ConfigValue; import io.smallrye.config.ConfigValue;
@ -40,6 +37,7 @@ public final class PropertyMappers {
configureDatabasePropertyMappers(); configureDatabasePropertyMappers();
configureHttpPropertyMappers(); configureHttpPropertyMappers();
configureProxyMappers(); configureProxyMappers();
configureClustering();
} }
private static void configureHttpPropertyMappers() { private static void configureHttpPropertyMappers() {
@ -133,6 +131,19 @@ public final class PropertyMappers {
createWithDefault("db.pool.max-size", "quarkus.datasource.jdbc.max-size", String.valueOf(100), "The maximum size of the connection pool."); createWithDefault("db.pool.max-size", "quarkus.datasource.jdbc.max-size", String.valueOf(100), "The maximum size of the connection pool.");
} }
private static void configureClustering() {
createWithDefault("cluster.enabled", "kc.spi.connections-infinispan.default.clustered", "placeholder", (value, context) -> {
if ("true".equals(value) || "false".equals(value)) {
return value;
}
// Clustering is disabled by default for the "dev" profile. Otherwise enabled
value = ("dev".equalsIgnoreCase(ProfileManager.getActiveProfile())) ? "false" : "true";
return value;
}, "Enables Clustering. Possible values are 'true' or 'false'.");
}
static ConfigValue getValue(ConfigSourceInterceptorContext context, String name) { static ConfigValue getValue(ConfigSourceInterceptorContext context, String name) {
return PropertyMapper.MAPPERS.getOrDefault(name, PropertyMapper.IDENTITY) return PropertyMapper.MAPPERS.getOrDefault(name, PropertyMapper.IDENTITY)
.getOrDefault(name, context, context.proceed(name)); .getOrDefault(name, context, context.proceed(name));

View file

@ -41,8 +41,10 @@ import org.keycloak.util.Environment;
public final class QuarkusCacheManagerProvider implements ManagedCacheManagerProvider { public final class QuarkusCacheManagerProvider implements ManagedCacheManagerProvider {
private static final Logger log = Logger.getLogger(QuarkusCacheManagerProvider.class); private static final Logger log = Logger.getLogger(QuarkusCacheManagerProvider.class);
private static final String DEFAULT_CONFIGURATION_FILE_NAME = "cluster.xml"; // Configuration files from the distribution
private static final String DEFAULT_CLUSTER_CONFIGURATION_FILE = "clustered-cache.xml";
private static final String DEFAULT_LOCAL_CONFIGURATION_FILE = "local-cache.xml";
@Override @Override
public <C> C getCacheManager(Config.Scope config) { public <C> C getCacheManager(Config.Scope config) {
@ -70,38 +72,39 @@ public final class QuarkusCacheManagerProvider implements ManagedCacheManagerPro
if (homeDir == null) { if (homeDir == null) {
log.warn("Keycloak home directory not set."); log.warn("Keycloak home directory not set.");
return loadDefaultConfiguration(config); return loadDefaultConfiguration(config, "default-clustered-cache.xml", "default-local-cache.xml");
} }
Path configPath = Paths.get(homeDir + "/conf/" + getConfigFileName(config)); String pathPrefix = homeDir + "/conf/";
if (configPath.toFile().exists()) { // Always try to use "configFile" if explicitly specified
log.debugf("Loading cluster configuration from %s", configPath); String configFile = config.get("configFile");
return FileLookupFactory.newInstance() if (configFile != null) {
.lookupFileStrict(configPath.toUri(), Thread.currentThread().getContextClassLoader()); Path configPath = Paths.get(pathPrefix + configFile);
if (configPath.toFile().exists()) {
log.infof("Loading cache configuration from %s", configPath);
return FileLookupFactory.newInstance()
.lookupFileStrict(configPath.toUri(), Thread.currentThread().getContextClassLoader());
} else {
log.warnf("Cache configuration file does not exists at %s . Fallback to the default configuration file", configPath);
}
} }
log.infof("Clustering configuration file not found at %s.", configPath); return loadDefaultConfiguration(config, pathPrefix + DEFAULT_CLUSTER_CONFIGURATION_FILE, pathPrefix + DEFAULT_LOCAL_CONFIGURATION_FILE);
return loadDefaultConfiguration(config);
} }
private InputStream loadDefaultConfiguration(Config.Scope config) throws FileNotFoundException { private InputStream loadDefaultConfiguration(Config.Scope config, String defaultClusterConfigFile, String defaultLocalConfigFile) throws FileNotFoundException {
if (config.getBoolean("clustered", false)) { if (config.getBoolean("clustered", false)) {
log.debugf("Using default clustered cache configuration."); log.infof("Using default clustered cache configuration from file %s", defaultClusterConfigFile);
return FileLookupFactory.newInstance() return FileLookupFactory.newInstance()
.lookupFileStrict("default-clustered-cache.xml", Thread.currentThread().getContextClassLoader()); .lookupFileStrict(defaultClusterConfigFile, Thread.currentThread().getContextClassLoader());
} }
log.debug("Using default local cache configuration."); log.infof("Using default local cache configuration from file %s", defaultLocalConfigFile);
return FileLookupFactory.newInstance() return FileLookupFactory.newInstance()
.lookupFileStrict("default-local-cache.xml", Thread.currentThread().getContextClassLoader()); .lookupFileStrict(defaultLocalConfigFile, Thread.currentThread().getContextClassLoader());
}
private String getConfigFileName(Config.Scope config) {
String configFile = config.get("configFile");
return configFile == null ? DEFAULT_CONFIGURATION_FILE_NAME : configFile;
} }
private void configureTransportStack(Config.Scope config, ConfigurationBuilderHolder builder) { private void configureTransportStack(Config.Scope config, ConfigurationBuilderHolder builder) {

View file

@ -18,8 +18,8 @@
<infinispan <infinispan
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:9.4 http://www.infinispan.org/schemas/infinispan-config-9.4.xsd" xsi:schemaLocation="urn:infinispan:config:10.1 http://www.infinispan.org/schemas/infinispan-config-10.1.xsd"
xmlns="urn:infinispan:config:9.4"> xmlns="urn:infinispan:config:10.1">
<cache-container name="keycloak"> <cache-container name="keycloak">
<transport lock-timeout="60000"/> <transport lock-timeout="60000"/>

View file

@ -18,8 +18,8 @@
<infinispan <infinispan
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:9.4 http://www.infinispan.org/schemas/infinispan-config-9.4.xsd" xsi:schemaLocation="urn:infinispan:config:10.1 http://www.infinispan.org/schemas/infinispan-config-10.1.xsd"
xmlns="urn:infinispan:config:9.4"> xmlns="urn:infinispan:config:10.1">
<cache-container name="keycloak"> <cache-container name="keycloak">
<local-cache name="default"> <local-cache name="default">

View file

@ -234,6 +234,23 @@ public class ConfigurationTest {
Assert.assertEquals("foo-val3", config.getConfigValue("quarkus.datasource.bar").getValue()); Assert.assertEquals("foo-val3", config.getConfigValue("quarkus.datasource.bar").getValue());
} }
@Test
public void testClusterConfig() {
// Cluster enabled by default, but disabled for the "dev" profile
Assert.assertTrue(initConfig("connectionsInfinispan", "default").getBoolean("clustered"));
System.setProperty("kc.profile", "dev");
Assert.assertFalse(initConfig("connectionsInfinispan", "default").getBoolean("clustered"));
// If explicitly set, then it is always used regardless of the profile
System.clearProperty("kc.profile");
System.setProperty("kc.config.args", "--cluster-enabled=true");
Assert.assertTrue(initConfig("connectionsInfinispan", "default").getBoolean("clustered"));
System.setProperty("kc.profile", "dev");
Assert.assertTrue(initConfig("connectionsInfinispan", "default").getBoolean("clustered"));
}
private Config.Scope initConfig(String... scope) { private Config.Scope initConfig(String... scope) {
Config.init(new MicroProfileConfigProvider(createConfig())); Config.init(new MicroProfileConfigProvider(createConfig()));
return Config.scope(scope); return Config.scope(scope);

View file

@ -18,7 +18,6 @@
<dependency> <dependency>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<artifactId>keycloak-quarkus-server</artifactId> <artifactId>keycloak-quarkus-server</artifactId>
<version>${project.version}</version>
</dependency> </dependency>
<!-- This dependency should not be here but due to the structure of the modules we need to make sure it is built <!-- This dependency should not be here but due to the structure of the modules we need to make sure it is built
@ -26,7 +25,6 @@
<dependency> <dependency>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<artifactId>keycloak-quarkus-server-deployment</artifactId> <artifactId>keycloak-quarkus-server-deployment</artifactId>
<version>${project.version}</version>
<scope>compile</scope> <scope>compile</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>