Rename remote-cache Feature

Renamed to "clusterless"

Closes #32596

Signed-off-by: Pedro Ruivo <pruivo@redhat.com>
This commit is contained in:
Pedro Ruivo 2024-09-09 18:41:41 +01:00 committed by Alexander Schwartz
parent b3b9e40e40
commit f67bec0417
15 changed files with 26 additions and 32 deletions

View file

@ -373,7 +373,7 @@ jobs:
timeout-minutes: 150 timeout-minutes: 150
strategy: strategy:
matrix: matrix:
variant: [ "remote-cache,multi-site" ] variant: [ "clusterless,multi-site" ]
fail-fast: false fail-fast: false
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@ -384,7 +384,7 @@ jobs:
- name: Run base tests without cache - name: Run base tests without cache
run: | run: |
TESTS=`testsuite/integration-arquillian/tests/base/testsuites/suite.sh remote-cache` TESTS=`testsuite/integration-arquillian/tests/base/testsuites/suite.sh clusterless`
echo "Tests: $TESTS" echo "Tests: $TESTS"
./mvnw test ${{ env.SUREFIRE_RETRY }} -Pauth-server-quarkus -Pinfinispan-server -Dauth.server.feature=${{ matrix.variant }} -Dauth.server.feature.disable=persistent-user-sessions -Dtest=$TESTS -pl testsuite/integration-arquillian/tests/base 2>&1 | misc/log/trimmer.sh ./mvnw test ${{ env.SUREFIRE_RETRY }} -Pauth-server-quarkus -Pinfinispan-server -Dauth.server.feature=${{ matrix.variant }} -Dauth.server.feature.disable=persistent-user-sessions -Dtest=$TESTS -pl testsuite/integration-arquillian/tests/base 2>&1 | misc/log/trimmer.sh

View file

@ -104,7 +104,7 @@ public class Profile {
MULTI_SITE("Multi-site support", Type.DISABLED_BY_DEFAULT), MULTI_SITE("Multi-site support", Type.DISABLED_BY_DEFAULT),
REMOTE_CACHE("Remote caches support. Requires Multi-site support to be enabled as well.", Type.EXPERIMENTAL), CLUSTERLESS("Store all session data, work cache and login failure data in an external Infinispan cluster.", Type.EXPERIMENTAL),
CLIENT_TYPES("Client Types", Type.EXPERIMENTAL), CLIENT_TYPES("Client Types", Type.EXPERIMENTAL),

View file

@ -29,6 +29,6 @@ public class MultiSiteUtils {
* @return true when user sessions are stored in the database. In multi-site setup this is false when REMOTE_CACHE feature is enabled * @return true when user sessions are stored in the database. In multi-site setup this is false when REMOTE_CACHE feature is enabled
*/ */
public static boolean isPersistentSessionsEnabled() { public static boolean isPersistentSessionsEnabled() {
return Profile.isFeatureEnabled(Profile.Feature.PERSISTENT_USER_SESSIONS) || (isMultiSiteEnabled() && !Profile.isFeatureEnabled(Profile.Feature.REMOTE_CACHE)); return Profile.isFeatureEnabled(Profile.Feature.PERSISTENT_USER_SESSIONS) || (isMultiSiteEnabled() && !Profile.isFeatureEnabled(Profile.Feature.CLUSTERLESS));
} }
} }

View file

@ -115,7 +115,7 @@ public class TokenVerifier<T extends JsonWebToken> {
return true; return true;
} }
}; }
public static class TokenTypeCheck implements Predicate<JsonWebToken> { public static class TokenTypeCheck implements Predicate<JsonWebToken> {
@ -134,7 +134,7 @@ public class TokenVerifier<T extends JsonWebToken> {
} }
throw new VerificationException("Token type is incorrect. Expected '" + tokenTypes.toString() + "' but was '" + t.getType() + "'"); throw new VerificationException("Token type is incorrect. Expected '" + tokenTypes.toString() + "' but was '" + t.getType() + "'");
} }
}; }
public static class AudienceCheck implements Predicate<JsonWebToken> { public static class AudienceCheck implements Predicate<JsonWebToken> {
@ -162,7 +162,7 @@ public class TokenVerifier<T extends JsonWebToken> {
throw new VerificationException("Expected audience not available in the token"); throw new VerificationException("Expected audience not available in the token");
} }
}; }
public static class IssuedForCheck implements Predicate<JsonWebToken> { public static class IssuedForCheck implements Predicate<JsonWebToken> {
@ -317,7 +317,7 @@ public class TokenVerifier<T extends JsonWebToken> {
/** /**
* Sets the key for verification of HMAC-based signature. * Sets the key for verification of HMAC-based signature.
* @param secretKey * @param secretKey
* @return * @return
*/ */
public TokenVerifier<T> secretKey(SecretKey secretKey) { public TokenVerifier<T> secretKey(SecretKey secretKey) {
this.secretKey = secretKey; this.secretKey = secretKey;

View file

@ -24,7 +24,7 @@ import org.keycloak.common.Profile;
import org.keycloak.common.util.MultiSiteUtils; import org.keycloak.common.util.MultiSiteUtils;
import org.keycloak.provider.ProviderConfigurationBuilder; import org.keycloak.provider.ProviderConfigurationBuilder;
import static org.keycloak.common.Profile.Feature.REMOTE_CACHE; import static org.keycloak.common.Profile.Feature.CLUSTERLESS;
public final class InfinispanUtils { public final class InfinispanUtils {
@ -42,7 +42,7 @@ public final class InfinispanUtils {
// true if running with external infinispan mode only // true if running with external infinispan mode only
public static boolean isRemoteInfinispan() { public static boolean isRemoteInfinispan() {
return MultiSiteUtils.isMultiSiteEnabled() || Profile.isFeatureEnabled(REMOTE_CACHE); return MultiSiteUtils.isMultiSiteEnabled() || Profile.isFeatureEnabled(CLUSTERLESS);
} }
// true if running with embedded caches. // true if running with embedded caches.

View file

@ -299,7 +299,7 @@ public class CacheManagerFactory {
logger.debug("Removing all distributed caches."); logger.debug("Removing all distributed caches.");
for (String cacheName : CLUSTERED_CACHE_NAMES) { for (String cacheName : CLUSTERED_CACHE_NAMES) {
if (hasRemoteStore(builders.get(cacheName))) { if (hasRemoteStore(builders.get(cacheName))) {
logger.warnf("remote-store configuration detected for cache '%s'. Explicit cache configuration ignored when using '%s' or '%s' Features.", cacheName, Profile.Feature.REMOTE_CACHE.getKey(), Profile.Feature.MULTI_SITE.getKey()); logger.warnf("remote-store configuration detected for cache '%s'. Explicit cache configuration ignored when using '%s' or '%s' Features.", cacheName, Profile.Feature.CLUSTERLESS.getKey(), Profile.Feature.MULTI_SITE.getKey());
} }
builders.remove(cacheName); builders.remove(cacheName);
} }
@ -456,10 +456,10 @@ public class CacheManagerFactory {
Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE.getKey(), Profile.Feature.MULTI_SITE.getKey()); Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE.getKey(), Profile.Feature.MULTI_SITE.getKey());
throw new RuntimeException("The features " + Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE.getKey() + " and " + Profile.Feature.MULTI_SITE.getKey() + " must not be enabled at the same time."); throw new RuntimeException("The features " + Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE.getKey() + " and " + Profile.Feature.MULTI_SITE.getKey() + " must not be enabled at the same time.");
} }
if (Profile.isFeatureEnabled(Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE) && Profile.isFeatureEnabled(Profile.Feature.REMOTE_CACHE)) { if (Profile.isFeatureEnabled(Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE) && Profile.isFeatureEnabled(Profile.Feature.CLUSTERLESS)) {
logger.fatalf("Feature %s is now deprecated.%nFor multi-site (cross-dc) support, enable only %s.", logger.fatalf("Feature %s is now deprecated.%nFor multi-site (cross-dc) support, enable only %s.",
Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE.getKey(), Profile.Feature.REMOTE_CACHE.getKey()); Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE.getKey(), Profile.Feature.CLUSTERLESS.getKey());
throw new RuntimeException("The features " + Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE.getKey() + " and " + Profile.Feature.REMOTE_CACHE.getKey() + " must not be enabled at the same time."); throw new RuntimeException("The features " + Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE.getKey() + " and " + Profile.Feature.CLUSTERLESS.getKey() + " must not be enabled at the same time.");
} }
if (!Profile.isFeatureEnabled(Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE)) { if (!Profile.isFeatureEnabled(Profile.Feature.CACHE_EMBEDDED_REMOTE_STORE)) {
if (builder.getNamedConfigurationBuilders().values().stream().anyMatch(CacheManagerFactory::hasRemoteStore)) { if (builder.getNamedConfigurationBuilders().values().stream().anyMatch(CacheManagerFactory::hasRemoteStore)) {

View file

@ -54,7 +54,7 @@ public class ExternalInfinispanTest {
@Test @Test
@Launch({ @Launch({
"start-dev", "start-dev",
"--features=multi-site,remote-cache", "--features=multi-site,clusterless",
"--cache=ispn", "--cache=ispn",
"--cache-remote-host=127.0.0.1", "--cache-remote-host=127.0.0.1",
"--cache-remote-username=keycloak", "--cache-remote-username=keycloak",

View file

@ -29,7 +29,7 @@ public interface ManagedCacheManagerProvider {
<C> C getEmbeddedCacheManager(Config.Scope config); <C> C getEmbeddedCacheManager(Config.Scope config);
/** /**
* @return A RemoteCacheManager if the features {@link org.keycloak.common.Profile.Feature#REMOTE_CACHE} or {@link org.keycloak.common.Profile.Feature#MULTI_SITE} is enabled, {@code null} otherwise. * @return A RemoteCacheManager if the features {@link org.keycloak.common.Profile.Feature#CLUSTERLESS} or {@link org.keycloak.common.Profile.Feature#MULTI_SITE} is enabled, {@code null} otherwise.
*/ */
<C> C getRemoteCacheManager(Config.Scope config); <C> C getRemoteCacheManager(Config.Scope config);
} }

View file

@ -100,7 +100,6 @@ import java.io.UnsupportedEncodingException;
import java.net.URI; import java.net.URI;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -172,7 +171,7 @@ public class AuthenticationManager {
// Parameter of LogoutEndpoint // Parameter of LogoutEndpoint
public static final String INITIATING_IDP_PARAM = "initiating_idp"; public static final String INITIATING_IDP_PARAM = "initiating_idp";
private static final TokenTypeCheck VALIDATE_IDENTITY_COOKIE = new TokenTypeCheck(Arrays.asList(TokenUtil.TOKEN_TYPE_KEYCLOAK_ID)); private static final TokenTypeCheck VALIDATE_IDENTITY_COOKIE = new TokenTypeCheck(List.of(TokenUtil.TOKEN_TYPE_KEYCLOAK_ID));
public static boolean isSessionValid(RealmModel realm, UserSessionModel userSession) { public static boolean isSessionValid(RealmModel realm, UserSessionModel userSession) {
if (userSession == null) { if (userSession == null) {
@ -186,7 +185,7 @@ public class AuthenticationManager {
userSession.isRememberMe(), TimeUnit.SECONDS.toMillis(userSession.getLastSessionRefresh()), realm); userSession.isRememberMe(), TimeUnit.SECONDS.toMillis(userSession.getLastSessionRefresh()), realm);
boolean sessionIdleOk = idle > currentTime - boolean sessionIdleOk = idle > currentTime -
((Profile.isFeatureEnabled(Profile.Feature.PERSISTENT_USER_SESSIONS) || Profile.isFeatureEnabled(Profile.Feature.REMOTE_CACHE)) ? 0 : TimeUnit.SECONDS.toMillis(SessionTimeoutHelper.IDLE_TIMEOUT_WINDOW_SECONDS)); ((Profile.isFeatureEnabled(Profile.Feature.PERSISTENT_USER_SESSIONS) || Profile.isFeatureEnabled(Profile.Feature.CLUSTERLESS)) ? 0 : TimeUnit.SECONDS.toMillis(SessionTimeoutHelper.IDLE_TIMEOUT_WINDOW_SECONDS));
boolean sessionMaxOk = lifespan == -1L || lifespan > currentTime; boolean sessionMaxOk = lifespan == -1L || lifespan > currentTime;
return sessionIdleOk && sessionMaxOk; return sessionIdleOk && sessionMaxOk;
} }
@ -205,7 +204,7 @@ public class AuthenticationManager {
userSession.isRememberMe(), TimeUnit.SECONDS.toMillis(clientSession.getTimestamp()), realm, client); userSession.isRememberMe(), TimeUnit.SECONDS.toMillis(clientSession.getTimestamp()), realm, client);
boolean sessionIdleOk = idle > currentTime - boolean sessionIdleOk = idle > currentTime -
((Profile.isFeatureEnabled(Profile.Feature.PERSISTENT_USER_SESSIONS) || Profile.isFeatureEnabled(Profile.Feature.REMOTE_CACHE)) ? 0 : TimeUnit.SECONDS.toMillis(SessionTimeoutHelper.IDLE_TIMEOUT_WINDOW_SECONDS)); ((Profile.isFeatureEnabled(Profile.Feature.PERSISTENT_USER_SESSIONS) || Profile.isFeatureEnabled(Profile.Feature.CLUSTERLESS)) ? 0 : TimeUnit.SECONDS.toMillis(SessionTimeoutHelper.IDLE_TIMEOUT_WINDOW_SECONDS));
boolean sessionMaxOk = lifespan == -1L || lifespan > currentTime; boolean sessionMaxOk = lifespan == -1L || lifespan > currentTime;
return sessionIdleOk && sessionMaxOk; return sessionIdleOk && sessionMaxOk;
} }

View file

@ -212,7 +212,7 @@ public abstract class AbstractQuarkusDeployableContainer implements DeployableCo
addFeaturesOption(commands); addFeaturesOption(commands);
var features = getDefaultFeatures(); var features = getDefaultFeatures();
if (features.contains("remote-cache") || features.contains("multi-site")) { if (features.contains("clusterless") || features.contains("multi-site")) {
commands.add("--cache-remote-host=127.0.0.1"); commands.add("--cache-remote-host=127.0.0.1");
commands.add("--cache-remote-username=keycloak"); commands.add("--cache-remote-username=keycloak");
commands.add("--cache-remote-password=Password1!"); commands.add("--cache-remote-password=Password1!");

View file

@ -391,7 +391,7 @@ public class AccessTokenTest extends AbstractKeycloakTest {
@Test @Test
public void accessTokenCodeExpired() { public void accessTokenCodeExpired() {
ProfileAssume.assumeFeatureDisabled(Profile.Feature.REMOTE_CACHE); ProfileAssume.assumeFeatureDisabled(Profile.Feature.CLUSTERLESS);
ProfileAssume.assumeFeatureDisabled(Profile.Feature.MULTI_SITE); ProfileAssume.assumeFeatureDisabled(Profile.Feature.MULTI_SITE);
getTestingClient().testing().setTestingInfinispanTimeService(); getTestingClient().testing().setTestingInfinispanTimeService();

View file

@ -65,7 +65,7 @@ public class LastSessionRefreshUnitTest extends AbstractKeycloakTest {
@Test @Test
public void testLastSessionRefreshCounters() { public void testLastSessionRefreshCounters() {
ProfileAssume.assumeFeatureDisabled(Profile.Feature.REMOTE_CACHE); ProfileAssume.assumeFeatureDisabled(Profile.Feature.CLUSTERLESS);
ProfileAssume.assumeFeatureDisabled(Profile.Feature.MULTI_SITE); ProfileAssume.assumeFeatureDisabled(Profile.Feature.MULTI_SITE);
testingClient.server().run(new LastSessionRefreshServerCounterTest()); testingClient.server().run(new LastSessionRefreshServerCounterTest());
@ -112,7 +112,7 @@ public class LastSessionRefreshUnitTest extends AbstractKeycloakTest {
@Test @Test
public void testLastSessionRefreshIntervals() { public void testLastSessionRefreshIntervals() {
ProfileAssume.assumeFeatureDisabled(Profile.Feature.REMOTE_CACHE); ProfileAssume.assumeFeatureDisabled(Profile.Feature.CLUSTERLESS);
ProfileAssume.assumeFeatureDisabled(Profile.Feature.MULTI_SITE); ProfileAssume.assumeFeatureDisabled(Profile.Feature.MULTI_SITE);
testingClient.server().run(new LastSessionRefreshServerIntervalsTest()); testingClient.server().run(new LastSessionRefreshServerIntervalsTest());

View file

@ -37,7 +37,7 @@ public class EmbeddedInfinispanSplitBrainTest extends KeycloakModelTest {
public static final TestRule SKIPPED_PROFILES = (base, description) -> { public static final TestRule SKIPPED_PROFILES = (base, description) -> {
// We skip split-brain tests for the REMOTE_CACHE and MULTI_SITE features as neither of these architectures // We skip split-brain tests for the REMOTE_CACHE and MULTI_SITE features as neither of these architectures
// utilise embedded distributed/replicated caches // utilise embedded distributed/replicated caches
Assume.assumeFalse(Profile.isFeatureEnabled(Profile.Feature.REMOTE_CACHE)); Assume.assumeFalse(Profile.isFeatureEnabled(Profile.Feature.CLUSTERLESS));
Assume.assumeFalse(Profile.isFeatureEnabled(Profile.Feature.MULTI_SITE)); Assume.assumeFalse(Profile.isFeatureEnabled(Profile.Feature.MULTI_SITE));
return base; return base;
}; };

View file

@ -18,7 +18,6 @@
package org.keycloak.testsuite.model.infinispan; package org.keycloak.testsuite.model.infinispan;
import java.util.Arrays; import java.util.Arrays;
import java.util.function.Predicate;
import org.infinispan.commons.CacheConfigurationException; import org.infinispan.commons.CacheConfigurationException;
import org.junit.Test; import org.junit.Test;
@ -36,12 +35,8 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.ACTION_TOKEN_CACHE;
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.AUTHENTICATION_SESSIONS_CACHE_NAME;
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.CLUSTERED_CACHE_NAMES; import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.CLUSTERED_CACHE_NAMES;
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.LOCAL_CACHE_NAMES; import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.LOCAL_CACHE_NAMES;
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.LOGIN_FAILURE_CACHE_NAME;
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.WORK_CACHE_NAME;
/** /**
* Checks if the correct embedded or remote cache is started based on {@link org.keycloak.common.Profile.Feature}. * Checks if the correct embedded or remote cache is started based on {@link org.keycloak.common.Profile.Feature}.
@ -61,7 +56,7 @@ public class FeatureEnabledTest extends KeycloakModelTest {
@Test @Test
public void testRemoteCachesOnly() { public void testRemoteCachesOnly() {
assumeTrue("Remote-Cache Feature disabled", Profile.isFeatureEnabled(Profile.Feature.REMOTE_CACHE) || MultiSiteUtils.isMultiSiteEnabled()); assumeTrue("Clusterless Feature disabled", Profile.isFeatureEnabled(Profile.Feature.CLUSTERLESS) || MultiSiteUtils.isMultiSiteEnabled());
assertTrue(InfinispanUtils.isRemoteInfinispan()); assertTrue(InfinispanUtils.isRemoteInfinispan());
assertFalse(InfinispanUtils.isEmbeddedInfinispan()); assertFalse(InfinispanUtils.isEmbeddedInfinispan());
inComittedTransaction(session -> { inComittedTransaction(session -> {
@ -75,7 +70,7 @@ public class FeatureEnabledTest extends KeycloakModelTest {
@Test @Test
public void testEmbeddedCachesOnly() { public void testEmbeddedCachesOnly() {
assumeFalse("Multi-Site Feature enabled", MultiSiteUtils.isMultiSiteEnabled()); assumeFalse("Multi-Site Feature enabled", MultiSiteUtils.isMultiSiteEnabled());
assumeFalse("Remote-Cache Feature enabled", Profile.isFeatureEnabled(Profile.Feature.REMOTE_CACHE)); assumeFalse("Clusterless Feature enabled", Profile.isFeatureEnabled(Profile.Feature.CLUSTERLESS));
assertFalse(InfinispanUtils.isRemoteInfinispan()); assertFalse(InfinispanUtils.isRemoteInfinispan());
assertTrue(InfinispanUtils.isEmbeddedInfinispan()); assertTrue(InfinispanUtils.isEmbeddedInfinispan());
inComittedTransaction(session -> { inComittedTransaction(session -> {