[fixes #9133] - Allow setting JDBC driver and transaction type
This commit is contained in:
parent
93aeb572bb
commit
4f568dff63
9 changed files with 136 additions and 14 deletions
|
@ -23,10 +23,11 @@ final class DatabasePropertyMappers {
|
|||
.transformer((db, context) -> Database.getDialect(db).orElse(Database.getDialect("h2-file").get()))
|
||||
.hidden(true)
|
||||
.build(),
|
||||
builder().from("db-driver")
|
||||
builder().from("db.driver")
|
||||
.mapFrom("db")
|
||||
.defaultValue(Database.getDriver("h2-file").get())
|
||||
.to("quarkus.datasource.jdbc.driver")
|
||||
.transformer((db, context) -> Database.getDriver(db).orElse(Database.getDriver("h2-file").get()))
|
||||
.transformer((db, context) -> Database.getDriver(db).orElse(db))
|
||||
.hidden(true)
|
||||
.build(),
|
||||
builder().from("db").
|
||||
|
@ -37,10 +38,9 @@ final class DatabasePropertyMappers {
|
|||
.paramLabel("vendor")
|
||||
.expectedValues(asList(Database.getAliases()))
|
||||
.build(),
|
||||
builder().from("db-tx-type")
|
||||
.mapFrom("db")
|
||||
builder().from("db.tx-type")
|
||||
.defaultValue("xa")
|
||||
.to("quarkus.datasource.jdbc.transactions")
|
||||
.transformer((db, context) -> "xa")
|
||||
.hidden(true)
|
||||
.build(),
|
||||
builder().from("db.url")
|
||||
|
|
|
@ -121,10 +121,15 @@ public class PropertyMapper {
|
|||
}
|
||||
}
|
||||
|
||||
if (defaultValue != null) {
|
||||
return transformValue(defaultValue, context);
|
||||
}
|
||||
|
||||
// now tries any defaults from quarkus
|
||||
ConfigValue current = context.proceed(name);
|
||||
|
||||
if (current == null) {
|
||||
return transformValue(defaultValue, context);
|
||||
if (current != null) {
|
||||
return transformValue(current.getValue(), context);
|
||||
}
|
||||
|
||||
return current;
|
||||
|
|
|
@ -28,6 +28,7 @@ import java.util.Map;
|
|||
import java.util.Properties;
|
||||
|
||||
import io.quarkus.hibernate.orm.runtime.dialect.QuarkusH2Dialect;
|
||||
import io.quarkus.hibernate.orm.runtime.dialect.QuarkusPostgreSQL10Dialect;
|
||||
import io.quarkus.runtime.LaunchMode;
|
||||
import io.smallrye.config.SmallRyeConfig;
|
||||
import org.eclipse.microprofile.config.ConfigProvider;
|
||||
|
@ -44,6 +45,8 @@ import io.quarkus.runtime.configuration.ConfigUtils;
|
|||
import io.smallrye.config.SmallRyeConfigProviderResolver;
|
||||
import org.keycloak.quarkus.runtime.Environment;
|
||||
import org.keycloak.vault.FilesPlainTextVaultProviderFactory;
|
||||
import org.mariadb.jdbc.MySQLDataSource;
|
||||
import org.postgresql.xa.PGXADataSource;
|
||||
|
||||
public class ConfigurationTest {
|
||||
|
||||
|
@ -281,11 +284,25 @@ public class ConfigurationTest {
|
|||
SmallRyeConfig config = createConfig();
|
||||
assertEquals(QuarkusH2Dialect.class.getName(), config.getConfigValue("quarkus.hibernate-orm.dialect").getValue());
|
||||
assertEquals("jdbc:h2:file:test-dir" + File.separator + "data" + File.separator + "h2" + File.separator + "keycloakdb;;test=test;test1=test1", config.getConfigValue("quarkus.datasource.jdbc.url").getValue());
|
||||
assertEquals("xa", config.getConfigValue("quarkus.datasource.jdbc.transactions").getValue());
|
||||
|
||||
System.setProperty(CLI_ARGS, "");
|
||||
config = createConfig();
|
||||
assertEquals(QuarkusH2Dialect.class.getName(), config.getConfigValue("quarkus.hibernate-orm.dialect").getValue());
|
||||
assertEquals("jdbc:h2:file:test-dir" + File.separator + "data" + File.separator + "h2" + File.separator + "keycloakdb;;test=test;test1=test1", config.getConfigValue("quarkus.datasource.jdbc.url").getValue());
|
||||
|
||||
System.setProperty("kc.db.url.properties", "?test=test&test1=test1");
|
||||
System.setProperty(CLI_ARGS, "--db=mariadb");
|
||||
config = createConfig();
|
||||
assertEquals("jdbc:mariadb://localhost/keycloak?test=test&test1=test1", config.getConfigValue("quarkus.datasource.jdbc.url").getValue());
|
||||
assertEquals(MariaDBDialect.class.getName(), config.getConfigValue("quarkus.hibernate-orm.dialect").getValue());
|
||||
assertEquals(MySQLDataSource.class.getName(), config.getConfigValue("quarkus.datasource.jdbc.driver").getValue());
|
||||
|
||||
System.setProperty(CLI_ARGS, "--db=postgres");
|
||||
config = createConfig();
|
||||
assertEquals("jdbc:postgresql://localhost/keycloak?test=test&test1=test1", config.getConfigValue("quarkus.datasource.jdbc.url").getValue());
|
||||
assertEquals(QuarkusPostgreSQL10Dialect.class.getName(), config.getConfigValue("quarkus.hibernate-orm.dialect").getValue());
|
||||
assertEquals(PGXADataSource.class.getName(), config.getConfigValue("quarkus.datasource.jdbc.driver").getValue());
|
||||
}
|
||||
|
||||
// KEYCLOAK-15632
|
||||
|
@ -342,6 +359,19 @@ public class ConfigurationTest {
|
|||
assertEquals("http://foo.unittest", initConfig("hostname-default").get("frontend-url"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDatabaseDriverSetExplicitly() {
|
||||
System.setProperty(CLI_ARGS, "--db=mssql" + ARG_SEPARATOR + "--db-url=jdbc:sqlserver://localhost/keycloak");
|
||||
System.setProperty("kc.db.driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver");
|
||||
System.setProperty("kc.db.tx-type", "enabled");
|
||||
assertTrue(System.getProperty(CLI_ARGS, "").contains("mssql"));
|
||||
SmallRyeConfig config = createConfig();
|
||||
assertEquals("jdbc:sqlserver://localhost/keycloak", config.getConfigValue("quarkus.datasource.jdbc.url").getValue());
|
||||
assertEquals("mssql", config.getConfigValue("quarkus.datasource.db-kind").getValue());
|
||||
assertEquals("com.microsoft.sqlserver.jdbc.SQLServerDriver", config.getConfigValue("quarkus.datasource.jdbc.driver").getValue());
|
||||
assertEquals("enabled", config.getConfigValue("quarkus.datasource.jdbc.transactions").getValue());
|
||||
}
|
||||
|
||||
private Config.Scope initConfig(String... scope) {
|
||||
Config.init(new MicroProfileConfigProvider(createConfig()));
|
||||
return Config.scope(scope);
|
||||
|
|
|
@ -77,4 +77,8 @@ public interface CLIResult extends LaunchResult {
|
|||
default void assertMessage(String message) {
|
||||
assertTrue(getOutput().contains(message));
|
||||
}
|
||||
|
||||
default void assertBuild() {
|
||||
assertMessage("Server configuration updated and persisted");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ import io.quarkus.test.junit.QuarkusMainTestExtension;
|
|||
import io.quarkus.test.junit.main.Launch;
|
||||
import io.quarkus.test.junit.main.LaunchResult;
|
||||
import org.keycloak.quarkus.runtime.configuration.KeycloakPropertiesConfigSource;
|
||||
import org.keycloak.quarkus.runtime.configuration.test.TestConfigArgsConfigSource;
|
||||
|
||||
public class CLITestExtension extends QuarkusMainTestExtension {
|
||||
|
||||
|
@ -96,6 +97,7 @@ public class CLITestExtension extends QuarkusMainTestExtension {
|
|||
System.getProperties().remove(KeycloakPropertiesConfigSource.KEYCLOAK_CONFIG_FILE_PROP);
|
||||
System.getProperties().remove(Environment.PROFILE);
|
||||
System.getProperties().remove("quarkus.profile");
|
||||
TestConfigArgsConfigSource.setCliArgs(new String[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -35,12 +35,6 @@ public class OptionValidationTest {
|
|||
Assertions.assertTrue(result.getErrorOutput().contains("Missing required value for option '--db' (vendor). Expected values are: h2-file, h2-mem, mariadb, mssql, mssql-2012, mysql, oracle, postgres, postgres-95"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Launch({"build", "--db=invalid"})
|
||||
public void failInvalidOptionValue(LaunchResult result) {
|
||||
Assertions.assertTrue(result.getErrorOutput().contains("Invalid value for option '--db': invalid. Expected values are: h2-file, h2-mem, mariadb, mssql, mssql-2012, mysql, oracle, postgres, postgres-95"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Launch({"build", "--db", "foo", "bar"})
|
||||
public void failMultipleOptionValue(LaunchResult result) {
|
||||
|
|
36
quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/OptionValidationDistTest.java
vendored
Normal file
36
quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/OptionValidationDistTest.java
vendored
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright 2021 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.
|
||||
*/
|
||||
|
||||
package org.keycloak.it.cli.dist;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.keycloak.it.junit5.extension.CLITest;
|
||||
import org.keycloak.it.junit5.extension.DistributionTest;
|
||||
|
||||
import io.quarkus.test.junit.main.Launch;
|
||||
import io.quarkus.test.junit.main.LaunchResult;
|
||||
|
||||
@DistributionTest
|
||||
public class OptionValidationDistTest {
|
||||
|
||||
@Test
|
||||
@Launch({"build", "--db=invalid"})
|
||||
public void failInvalidOptionValue(LaunchResult result) {
|
||||
Assertions.assertTrue(result.getErrorOutput().contains("Invalid value for option '--db': invalid. Expected values are: h2-file, h2-mem, mariadb, mssql, mssql-2012, mysql, oracle, postgres, postgres-95"));
|
||||
}
|
||||
}
|
50
quarkus/tests/integration/src/test/java/org/keycloak/it/database/dist/CustomTransactionTest.java
vendored
Normal file
50
quarkus/tests/integration/src/test/java/org/keycloak/it/database/dist/CustomTransactionTest.java
vendored
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright 2021 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.
|
||||
*/
|
||||
|
||||
package org.keycloak.it.database.dist;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.keycloak.it.junit5.extension.CLIResult;
|
||||
import org.keycloak.it.junit5.extension.DistributionTest;
|
||||
|
||||
import io.quarkus.test.junit.main.Launch;
|
||||
import io.quarkus.test.junit.main.LaunchResult;
|
||||
|
||||
@DistributionTest
|
||||
public class CustomTransactionTest {
|
||||
|
||||
@Test
|
||||
@Launch({ "-Dkc.db.tx-type=enabled", "-Dkc.db.driver=org.postgresql.xa.PGXADataSource", "build", "--db=postgres" })
|
||||
void failNoXAUsingXADriver(LaunchResult result) {
|
||||
CLIResult cliResult = (CLIResult) result;
|
||||
cliResult.assertError("Driver org.postgresql.xa.PGXADataSource is an XA datasource, but XA transactions have not been enabled on the default datasource");
|
||||
}
|
||||
|
||||
@Test
|
||||
@Launch({ "-Dkc.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver", "build", "--db=mssql" })
|
||||
void failXAUsingNonXADriver(LaunchResult result) {
|
||||
CLIResult cliResult = (CLIResult) result;
|
||||
cliResult.assertError("Driver is not an XA dataSource, while XA has been enabled in the configuration of the default datasource");
|
||||
}
|
||||
|
||||
@Test
|
||||
@Launch({ "-Dkc.db.tx-type=enabled", "-Dkc.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver", "build", "--db=mssql" })
|
||||
void testNoXa(LaunchResult result) {
|
||||
CLIResult cliResult = (CLIResult) result;
|
||||
cliResult.assertBuild();
|
||||
}
|
||||
}
|
|
@ -5,8 +5,9 @@
|
|||
<echo>Re-augmenting...</echo>
|
||||
<exec osfamily="unix" dir="${auth.server.home}/bin" executable="./kc.sh" failonerror="true">
|
||||
<arg value="build"/>
|
||||
<arg value="-Dquarkus.http.root-path=/auth"/>
|
||||
<arg value="--http-enabled=true"/>
|
||||
<arg value="--http-relative-path=/auth"/>
|
||||
<arg value="--cache=local"/>
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
|
|
Loading…
Reference in a new issue