Resolve default values for runtime options when running re-aug
Closes #10818
This commit is contained in:
parent
b34f46155c
commit
5e5cfff4e2
8 changed files with 59 additions and 23 deletions
|
@ -16,6 +16,7 @@
|
||||||
*/
|
*/
|
||||||
package org.keycloak.quarkus.runtime.configuration.mappers;
|
package org.keycloak.quarkus.runtime.configuration.mappers;
|
||||||
|
|
||||||
|
import static org.keycloak.quarkus.runtime.Environment.isRebuild;
|
||||||
import static org.keycloak.quarkus.runtime.configuration.Configuration.OPTION_PART_SEPARATOR;
|
import static org.keycloak.quarkus.runtime.configuration.Configuration.OPTION_PART_SEPARATOR;
|
||||||
import static org.keycloak.quarkus.runtime.configuration.Configuration.OPTION_PART_SEPARATOR_CHAR;
|
import static org.keycloak.quarkus.runtime.configuration.Configuration.OPTION_PART_SEPARATOR_CHAR;
|
||||||
import static org.keycloak.quarkus.runtime.configuration.Configuration.toCliFormat;
|
import static org.keycloak.quarkus.runtime.configuration.Configuration.toCliFormat;
|
||||||
|
@ -109,6 +110,11 @@ public class PropertyMapper<T> {
|
||||||
from = name.replace(to.substring(0, to.lastIndexOf('.')), from.substring(0, from.lastIndexOf(OPTION_PART_SEPARATOR_CHAR)));
|
from = name.replace(to.substring(0, to.lastIndexOf('.')), from.substring(0, from.lastIndexOf(OPTION_PART_SEPARATOR_CHAR)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isRebuild() && isRunTime() && name.startsWith(MicroProfileConfigProvider.NS_KEYCLOAK_PREFIX)) {
|
||||||
|
// during re-aug do not resolve the server runtime properties and avoid they included by quarkus in the default value config source
|
||||||
|
return ConfigValue.builder().withName(name).build();
|
||||||
|
}
|
||||||
|
|
||||||
// try to obtain the value for the property we want to map first
|
// try to obtain the value for the property we want to map first
|
||||||
ConfigValue config = context.proceed(from);
|
ConfigValue config = context.proceed(from);
|
||||||
|
|
||||||
|
@ -186,6 +192,10 @@ public class PropertyMapper<T> {
|
||||||
return this.option.isBuildTime();
|
return this.option.isBuildTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isRunTime() {
|
||||||
|
return !this.option.isBuildTime();
|
||||||
|
}
|
||||||
|
|
||||||
public String getTo() {
|
public String getTo() {
|
||||||
return to;
|
return to;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ import org.keycloak.it.junit5.extension.approvalTests.KcNamerFactory;
|
||||||
|
|
||||||
public interface CLIResult extends LaunchResult {
|
public interface CLIResult extends LaunchResult {
|
||||||
|
|
||||||
static Object create(List<String> outputStream, List<String> errStream, int exitCode) {
|
static CLIResult create(List<String> outputStream, List<String> errStream, int exitCode) {
|
||||||
return new CLIResult() {
|
return new CLIResult() {
|
||||||
@Override
|
@Override
|
||||||
public List<String> getOutputStream() {
|
public List<String> getOutputStream() {
|
||||||
|
|
|
@ -55,6 +55,7 @@ public class CLITestExtension extends QuarkusMainTestExtension {
|
||||||
private KeycloakDistribution dist;
|
private KeycloakDistribution dist;
|
||||||
private final Set<String> testSysProps = new HashSet<>();
|
private final Set<String> testSysProps = new HashSet<>();
|
||||||
private DatabaseContainer databaseContainer;
|
private DatabaseContainer databaseContainer;
|
||||||
|
private CLIResult result;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeEach(ExtensionContext context) throws Exception {
|
public void beforeEach(ExtensionContext context) throws Exception {
|
||||||
|
@ -95,7 +96,7 @@ public class CLITestExtension extends QuarkusMainTestExtension {
|
||||||
onBeforeStartDistribution(context.getRequiredTestClass().getAnnotation(BeforeStartDistribution.class));
|
onBeforeStartDistribution(context.getRequiredTestClass().getAnnotation(BeforeStartDistribution.class));
|
||||||
onBeforeStartDistribution(context.getRequiredTestMethod().getAnnotation(BeforeStartDistribution.class));
|
onBeforeStartDistribution(context.getRequiredTestMethod().getAnnotation(BeforeStartDistribution.class));
|
||||||
|
|
||||||
dist.start(Arrays.asList(launch.value()));
|
result = dist.run(Arrays.asList(launch.value()));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
configureProfile(context);
|
configureProfile(context);
|
||||||
|
@ -154,6 +155,7 @@ public class CLITestExtension extends QuarkusMainTestExtension {
|
||||||
databaseContainer.stop();
|
databaseContainer.stop();
|
||||||
databaseContainer = null;
|
databaseContainer = null;
|
||||||
}
|
}
|
||||||
|
result = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -190,23 +192,17 @@ public class CLITestExtension extends QuarkusMainTestExtension {
|
||||||
Class<?> type = parameterContext.getParameter().getType();
|
Class<?> type = parameterContext.getParameter().getType();
|
||||||
|
|
||||||
if (type == LaunchResult.class) {
|
if (type == LaunchResult.class) {
|
||||||
List<String> outputStream;
|
|
||||||
List<String> errStream;
|
|
||||||
int exitCode;
|
|
||||||
|
|
||||||
boolean isDistribution = getDistributionConfig(context) != null;
|
boolean isDistribution = getDistributionConfig(context) != null;
|
||||||
|
|
||||||
if (isDistribution) {
|
if (isDistribution) {
|
||||||
outputStream = dist.getOutputStream();
|
return result;
|
||||||
errStream = dist.getErrorStream();
|
|
||||||
exitCode = dist.getExitCode();
|
|
||||||
} else {
|
|
||||||
LaunchResult result = (LaunchResult) super.resolveParameter(parameterContext, context);
|
|
||||||
outputStream = result.getOutputStream();
|
|
||||||
errStream = result.getErrorStream();
|
|
||||||
exitCode = result.exitCode();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LaunchResult result = (LaunchResult) super.resolveParameter(parameterContext, context);
|
||||||
|
List<String> outputStream = result.getOutputStream();
|
||||||
|
List<String> errStream = result.getErrorStream();
|
||||||
|
int exitCode = result.exitCode();
|
||||||
|
|
||||||
return CLIResult.create(outputStream, errStream, exitCode);
|
return CLIResult.create(outputStream, errStream, exitCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,6 +211,13 @@ public class CLITestExtension extends QuarkusMainTestExtension {
|
||||||
return getDistPath();
|
return getDistPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (type.equals(KeycloakDistribution.class)) {
|
||||||
|
if (dist == null) {
|
||||||
|
throw new RuntimeException("Only tests annotated with " + DistributionTest.class + " can inject a distribution instance");
|
||||||
|
}
|
||||||
|
return dist;
|
||||||
|
}
|
||||||
|
|
||||||
// for now, no support for manual launching using QuarkusMainLauncher
|
// for now, no support for manual launching using QuarkusMainLauncher
|
||||||
throw new RuntimeException("Parameter type [" + type + "] not supported");
|
throw new RuntimeException("Parameter type [" + type + "] not supported");
|
||||||
}
|
}
|
||||||
|
@ -223,7 +226,7 @@ public class CLITestExtension extends QuarkusMainTestExtension {
|
||||||
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
|
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
|
||||||
throws ParameterResolutionException {
|
throws ParameterResolutionException {
|
||||||
Class<?> type = parameterContext.getParameter().getType();
|
Class<?> type = parameterContext.getParameter().getType();
|
||||||
return type == LaunchResult.class || type == RawDistRootPath.class;
|
return type == LaunchResult.class || type == RawDistRootPath.class || (dist != null && type == KeycloakDistribution.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureProfile(ExtensionContext context) {
|
private void configureProfile(ExtensionContext context) {
|
||||||
|
@ -257,7 +260,7 @@ public class CLITestExtension extends QuarkusMainTestExtension {
|
||||||
dist.setProperty("db-password", databaseContainer.getPassword());
|
dist.setProperty("db-password", databaseContainer.getPassword());
|
||||||
dist.setProperty("db-url", databaseContainer.getJdbcUrl());
|
dist.setProperty("db-url", databaseContainer.getJdbcUrl());
|
||||||
|
|
||||||
dist.start(List.of("build"));
|
dist.run("build");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// This is for re-creating the H2 database instead of using the default in home
|
// This is for re-creating the H2 database instead of using the default in home
|
||||||
|
|
|
@ -28,7 +28,7 @@ import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
|
||||||
* is only enabled when running tests using the {@link DistributionType#RAW}
|
* is only enabled when running tests using the {@link DistributionType#RAW}
|
||||||
* or running tests in whitebox mode in the same jvm using {@link CLITest}
|
* or running tests in whitebox mode in the same jvm using {@link CLITest}
|
||||||
*/
|
*/
|
||||||
@Target(ElementType.TYPE)
|
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@EnabledIfSystemProperty(named = "kc.quarkus.tests.dist", matches = "^$|raw")
|
@EnabledIfSystemProperty(named = "kc.quarkus.tests.dist", matches = "^$|raw")
|
||||||
public @interface RawDistOnly {
|
public @interface RawDistOnly {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package org.keycloak.it.utils;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
import org.keycloak.common.Version;
|
import org.keycloak.common.Version;
|
||||||
|
import org.keycloak.it.junit5.extension.CLIResult;
|
||||||
import org.testcontainers.containers.GenericContainer;
|
import org.testcontainers.containers.GenericContainer;
|
||||||
import org.testcontainers.containers.output.OutputFrame;
|
import org.testcontainers.containers.output.OutputFrame;
|
||||||
import org.testcontainers.containers.output.ToStringConsumer;
|
import org.testcontainers.containers.output.ToStringConsumer;
|
||||||
|
@ -57,7 +58,7 @@ public final class DockerKeycloakDistribution implements KeycloakDistribution {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(List<String> arguments) {
|
public CLIResult run(List<String> arguments) {
|
||||||
stop();
|
stop();
|
||||||
try {
|
try {
|
||||||
this.exitCode = -1;
|
this.exitCode = -1;
|
||||||
|
@ -86,6 +87,8 @@ public final class DockerKeycloakDistribution implements KeycloakDistribution {
|
||||||
keycloakContainer = null;
|
keycloakContainer = null;
|
||||||
LOGGER.warn("Failed to start Keycloak container", cause);
|
LOGGER.warn("Failed to start Keycloak container", cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return CLIResult.create(getOutputStream(), getErrorStream(), getExitCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
// After the web server is responding we are still producing some logs that got checked in the tests
|
// After the web server is responding we are still producing some logs that got checked in the tests
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.keycloak.it.utils;
|
package org.keycloak.it.utils;
|
||||||
|
|
||||||
|
import org.keycloak.it.junit5.extension.CLIResult;
|
||||||
import org.keycloak.quarkus.runtime.Environment;
|
import org.keycloak.quarkus.runtime.Environment;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -9,7 +10,10 @@ public interface KeycloakDistribution {
|
||||||
String SCRIPT_CMD = Environment.isWindows() ? "kc.bat" : "kc.sh";
|
String SCRIPT_CMD = Environment.isWindows() ? "kc.bat" : "kc.sh";
|
||||||
String SCRIPT_CMD_INVOKABLE = Environment.isWindows() ? SCRIPT_CMD : "./"+SCRIPT_CMD;
|
String SCRIPT_CMD_INVOKABLE = Environment.isWindows() ? SCRIPT_CMD : "./"+SCRIPT_CMD;
|
||||||
|
|
||||||
void start(List<String> arguments);
|
CLIResult run(List<String> arguments);
|
||||||
|
default CLIResult run(String... arguments) {
|
||||||
|
return run(List.of(arguments));
|
||||||
|
}
|
||||||
|
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
|
@ -47,7 +51,7 @@ public interface KeycloakDistribution {
|
||||||
throw new RuntimeException("Not implemented");
|
throw new RuntimeException("Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
default void removeProperty(String db) {
|
default void removeProperty(String name) {
|
||||||
throw new RuntimeException("Not implemented");
|
throw new RuntimeException("Not implemented");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@ import io.quarkus.fs.util.ZipUtils;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
|
|
||||||
import org.keycloak.common.Version;
|
import org.keycloak.common.Version;
|
||||||
|
import org.keycloak.it.junit5.extension.CLIResult;
|
||||||
import org.keycloak.quarkus.runtime.Environment;
|
import org.keycloak.quarkus.runtime.Environment;
|
||||||
import org.keycloak.quarkus.runtime.cli.command.Build;
|
import org.keycloak.quarkus.runtime.cli.command.Build;
|
||||||
import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper;
|
import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper;
|
||||||
|
@ -86,7 +87,7 @@ public final class RawKeycloakDistribution implements KeycloakDistribution {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(List<String> arguments) {
|
public CLIResult run(List<String> arguments) {
|
||||||
reset();
|
reset();
|
||||||
if (manualStop && isRunning()) {
|
if (manualStop && isRunning()) {
|
||||||
throw new IllegalStateException("Server already running. You should manually stop the server before starting it again.");
|
throw new IllegalStateException("Server already running. You should manually stop the server before starting it again.");
|
||||||
|
@ -113,6 +114,8 @@ public final class RawKeycloakDistribution implements KeycloakDistribution {
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return CLIResult.create(getOutputStream(), getErrorStream(), getExitCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -423,11 +426,11 @@ public final class RawKeycloakDistribution implements KeycloakDistribution {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeProperty(String key) {
|
public void removeProperty(String name) {
|
||||||
updateProperties(new Consumer<Properties>() {
|
updateProperties(new Consumer<Properties>() {
|
||||||
@Override
|
@Override
|
||||||
public void accept(Properties properties) {
|
public void accept(Properties properties) {
|
||||||
properties.remove(key);
|
properties.remove(name);
|
||||||
}
|
}
|
||||||
}, distPath.resolve("conf").resolve("keycloak.conf").toFile());
|
}, distPath.resolve("conf").resolve("keycloak.conf").toFile());
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,8 @@ import org.keycloak.it.junit5.extension.DistributionTest;
|
||||||
|
|
||||||
import io.quarkus.test.junit.main.Launch;
|
import io.quarkus.test.junit.main.Launch;
|
||||||
import io.quarkus.test.junit.main.LaunchResult;
|
import io.quarkus.test.junit.main.LaunchResult;
|
||||||
|
|
||||||
|
import org.keycloak.it.junit5.extension.RawDistOnly;
|
||||||
import org.keycloak.it.utils.KeycloakDistribution;
|
import org.keycloak.it.utils.KeycloakDistribution;
|
||||||
|
|
||||||
@DistributionTest
|
@DistributionTest
|
||||||
|
@ -62,4 +64,15 @@ class BuildCommandDistTest {
|
||||||
CLIResult cliResult = (CLIResult) result;
|
CLIResult cliResult = (CLIResult) result;
|
||||||
cliResult.assertError("Unknown option: '--db-username'");
|
cliResult.assertError("Unknown option: '--db-username'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@RawDistOnly(reason = "Containers are immutable")
|
||||||
|
void testDoNotRecordRuntimeOptionsDuringBuild(KeycloakDistribution distribution) {
|
||||||
|
distribution.setProperty("proxy", "edge");
|
||||||
|
distribution.run("build", "--cache=local");
|
||||||
|
distribution.removeProperty("proxy");
|
||||||
|
|
||||||
|
CLIResult result = distribution.run("start", "--hostname=mykeycloak");
|
||||||
|
result.assertMessage("Key material not provided to setup HTTPS");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue