Add clustering tests to new test framework

Closes #39962

Signed-off-by: Michal Hajas <mhajas@redhat.com>
Co-authored-by: Pedro Ruivo <pruivo@redhat.com>
This commit is contained in:
Michal Hajas
2025-06-13 20:26:07 +02:00
committed by GitHub
parent 7736ca20e9
commit d2f4635ea0
21 changed files with 569 additions and 41 deletions

View File

@@ -53,9 +53,13 @@ public abstract class AbstractContainerTestDatabase implements TestDatabase {
@Override
public Map<String, String> serverConfig() {
return serverConfig(false);
}
public Map<String, String> serverConfig(boolean internal) {
return Map.of(
"db", getDatabaseVendor(),
"db-url", getJdbcUrl(),
"db-url", getJdbcUrl(internal),
"db-username", getUsername(),
"db-password", getPassword()
);
@@ -79,8 +83,13 @@ public abstract class AbstractContainerTestDatabase implements TestDatabase {
return "keycloak";
}
public String getJdbcUrl() {
return container.getJdbcUrl();
public String getJdbcUrl(boolean internal) {
var url = container.getJdbcUrl();
if (internal) {
var ip = container.getContainerInfo().getNetworkSettings().getNetworks().values().iterator().next().getIpAddress();
return url.replace(container.getHost() + ":" + container.getFirstMappedPort(), ip + ":" + container.getExposedPorts().get(0));
}
return url;
}
public abstract String getDatabaseVendor();

View File

@@ -1,11 +1,13 @@
package org.keycloak.testframework.database;
import org.keycloak.testframework.annotations.InjectTestDatabase;
import org.keycloak.testframework.config.Config;
import org.keycloak.testframework.injection.InstanceContext;
import org.keycloak.testframework.injection.LifeCycle;
import org.keycloak.testframework.injection.RequestedInstance;
import org.keycloak.testframework.injection.Supplier;
import org.keycloak.testframework.injection.SupplierOrder;
import org.keycloak.testframework.server.KeycloakServer;
import org.keycloak.testframework.server.KeycloakServerConfigBuilder;
import org.keycloak.testframework.server.KeycloakServerConfigInterceptor;
@@ -37,7 +39,17 @@ public abstract class AbstractDatabaseSupplier implements Supplier<TestDatabase,
@Override
public KeycloakServerConfigBuilder intercept(KeycloakServerConfigBuilder serverConfig, InstanceContext<TestDatabase, InjectTestDatabase> instanceContext) {
return serverConfig.options(instanceContext.getValue().serverConfig());
String kcServerType = Config.getSelectedSupplier(KeycloakServer.class);
TestDatabase database = instanceContext.getValue();
// If both KeycloakServer and TestDatabase run in container, we need to configure Keycloak with internal
// url that is accessible within docker network
if ("cluster".equals(kcServerType) &&
database instanceof AbstractContainerTestDatabase containerDatabase) {
return serverConfig.options(containerDatabase.serverConfig(true));
}
return serverConfig.options(database.serverConfig());
}
@Override

View File

@@ -21,7 +21,7 @@ public abstract class AbstractKeycloakServerSupplier implements Supplier<Keycloa
KeycloakServerConfig serverConfig = SupplierHelpers.getInstance(annotation.config());
KeycloakServerConfigBuilder command = KeycloakServerConfigBuilder.startDev()
.cache("local")
.cache(cache())
.bootstrapAdminClient(Config.getAdminClientId(), Config.getAdminClientSecret())
.bootstrapAdminUser(Config.getAdminUsername(), Config.getAdminPassword());
@@ -74,6 +74,10 @@ public abstract class AbstractKeycloakServerSupplier implements Supplier<Keycloa
public abstract Logger getLogger();
protected String cache() {
return "local";
}
@Override
public int order() {
return SupplierOrder.KEYCLOAK_SERVER;