Skip to content

Commit 5e5cfff

Browse files
committed
Resolve default values for runtime options when running re-aug
Closes keycloak#10818
1 parent b34f461 commit 5e5cfff

File tree

8 files changed

+59
-23
lines changed

8 files changed

+59
-23
lines changed

quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/PropertyMapper.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.keycloak.quarkus.runtime.configuration.mappers;
1818

19+
import static org.keycloak.quarkus.runtime.Environment.isRebuild;
1920
import static org.keycloak.quarkus.runtime.configuration.Configuration.OPTION_PART_SEPARATOR;
2021
import static org.keycloak.quarkus.runtime.configuration.Configuration.OPTION_PART_SEPARATOR_CHAR;
2122
import static org.keycloak.quarkus.runtime.configuration.Configuration.toCliFormat;
@@ -109,6 +110,11 @@ ConfigValue getConfigValue(String name, ConfigSourceInterceptorContext context)
109110
from = name.replace(to.substring(0, to.lastIndexOf('.')), from.substring(0, from.lastIndexOf(OPTION_PART_SEPARATOR_CHAR)));
110111
}
111112

113+
if (isRebuild() && isRunTime() && name.startsWith(MicroProfileConfigProvider.NS_KEYCLOAK_PREFIX)) {
114+
// during re-aug do not resolve the server runtime properties and avoid they included by quarkus in the default value config source
115+
return ConfigValue.builder().withName(name).build();
116+
}
117+
112118
// try to obtain the value for the property we want to map first
113119
ConfigValue config = context.proceed(from);
114120

@@ -186,6 +192,10 @@ public boolean isBuildTime() {
186192
return this.option.isBuildTime();
187193
}
188194

195+
public boolean isRunTime() {
196+
return !this.option.isBuildTime();
197+
}
198+
189199
public String getTo() {
190200
return to;
191201
}

quarkus/tests/integration/src/main/java/org/keycloak/it/junit5/extension/CLIResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
public interface CLIResult extends LaunchResult {
3737

38-
static Object create(List<String> outputStream, List<String> errStream, int exitCode) {
38+
static CLIResult create(List<String> outputStream, List<String> errStream, int exitCode) {
3939
return new CLIResult() {
4040
@Override
4141
public List<String> getOutputStream() {

quarkus/tests/integration/src/main/java/org/keycloak/it/junit5/extension/CLITestExtension.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public class CLITestExtension extends QuarkusMainTestExtension {
5555
private KeycloakDistribution dist;
5656
private final Set<String> testSysProps = new HashSet<>();
5757
private DatabaseContainer databaseContainer;
58+
private CLIResult result;
5859

5960
@Override
6061
public void beforeEach(ExtensionContext context) throws Exception {
@@ -95,7 +96,7 @@ public void beforeEach(ExtensionContext context) throws Exception {
9596
onBeforeStartDistribution(context.getRequiredTestClass().getAnnotation(BeforeStartDistribution.class));
9697
onBeforeStartDistribution(context.getRequiredTestMethod().getAnnotation(BeforeStartDistribution.class));
9798

98-
dist.start(Arrays.asList(launch.value()));
99+
result = dist.run(Arrays.asList(launch.value()));
99100
}
100101
} else {
101102
configureProfile(context);
@@ -154,6 +155,7 @@ private void reset() {
154155
databaseContainer.stop();
155156
databaseContainer = null;
156157
}
158+
result = null;
157159
}
158160

159161
@Override
@@ -190,23 +192,17 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte
190192
Class<?> type = parameterContext.getParameter().getType();
191193

192194
if (type == LaunchResult.class) {
193-
List<String> outputStream;
194-
List<String> errStream;
195-
int exitCode;
196-
197195
boolean isDistribution = getDistributionConfig(context) != null;
198196

199197
if (isDistribution) {
200-
outputStream = dist.getOutputStream();
201-
errStream = dist.getErrorStream();
202-
exitCode = dist.getExitCode();
203-
} else {
204-
LaunchResult result = (LaunchResult) super.resolveParameter(parameterContext, context);
205-
outputStream = result.getOutputStream();
206-
errStream = result.getErrorStream();
207-
exitCode = result.exitCode();
198+
return result;
208199
}
209200

201+
LaunchResult result = (LaunchResult) super.resolveParameter(parameterContext, context);
202+
List<String> outputStream = result.getOutputStream();
203+
List<String> errStream = result.getErrorStream();
204+
int exitCode = result.exitCode();
205+
210206
return CLIResult.create(outputStream, errStream, exitCode);
211207
}
212208

@@ -215,6 +211,13 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte
215211
return getDistPath();
216212
}
217213

214+
if (type.equals(KeycloakDistribution.class)) {
215+
if (dist == null) {
216+
throw new RuntimeException("Only tests annotated with " + DistributionTest.class + " can inject a distribution instance");
217+
}
218+
return dist;
219+
}
220+
218221
// for now, no support for manual launching using QuarkusMainLauncher
219222
throw new RuntimeException("Parameter type [" + type + "] not supported");
220223
}
@@ -223,7 +226,7 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte
223226
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
224227
throws ParameterResolutionException {
225228
Class<?> type = parameterContext.getParameter().getType();
226-
return type == LaunchResult.class || type == RawDistRootPath.class;
229+
return type == LaunchResult.class || type == RawDistRootPath.class || (dist != null && type == KeycloakDistribution.class);
227230
}
228231

229232
private void configureProfile(ExtensionContext context) {
@@ -257,7 +260,7 @@ private void configureDatabase(ExtensionContext context) {
257260
dist.setProperty("db-password", databaseContainer.getPassword());
258261
dist.setProperty("db-url", databaseContainer.getJdbcUrl());
259262

260-
dist.start(List.of("build"));
263+
dist.run("build");
261264
}
262265
} else {
263266
// This is for re-creating the H2 database instead of using the default in home

quarkus/tests/integration/src/main/java/org/keycloak/it/junit5/extension/RawDistOnly.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
* is only enabled when running tests using the {@link DistributionType#RAW}
2929
* or running tests in whitebox mode in the same jvm using {@link CLITest}
3030
*/
31-
@Target(ElementType.TYPE)
31+
@Target({ElementType.TYPE, ElementType.METHOD})
3232
@Retention(RetentionPolicy.RUNTIME)
3333
@EnabledIfSystemProperty(named = "kc.quarkus.tests.dist", matches = "^$|raw")
3434
public @interface RawDistOnly {

quarkus/tests/integration/src/main/java/org/keycloak/it/utils/DockerKeycloakDistribution.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.jboss.logging.Logger;
44
import org.keycloak.common.Version;
5+
import org.keycloak.it.junit5.extension.CLIResult;
56
import org.testcontainers.containers.GenericContainer;
67
import org.testcontainers.containers.output.OutputFrame;
78
import org.testcontainers.containers.output.ToStringConsumer;
@@ -57,7 +58,7 @@ private GenericContainer getKeycloakContainer() {
5758
}
5859

5960
@Override
60-
public void start(List<String> arguments) {
61+
public CLIResult run(List<String> arguments) {
6162
stop();
6263
try {
6364
this.exitCode = -1;
@@ -86,6 +87,8 @@ public void start(List<String> arguments) {
8687
keycloakContainer = null;
8788
LOGGER.warn("Failed to start Keycloak container", cause);
8889
}
90+
91+
return CLIResult.create(getOutputStream(), getErrorStream(), getExitCode());
8992
}
9093

9194
// After the web server is responding we are still producing some logs that got checked in the tests

quarkus/tests/integration/src/main/java/org/keycloak/it/utils/KeycloakDistribution.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.keycloak.it.utils;
22

3+
import org.keycloak.it.junit5.extension.CLIResult;
34
import org.keycloak.quarkus.runtime.Environment;
45
import java.nio.file.Path;
56
import java.util.List;
@@ -9,7 +10,10 @@ public interface KeycloakDistribution {
910
String SCRIPT_CMD = Environment.isWindows() ? "kc.bat" : "kc.sh";
1011
String SCRIPT_CMD_INVOKABLE = Environment.isWindows() ? SCRIPT_CMD : "./"+SCRIPT_CMD;
1112

12-
void start(List<String> arguments);
13+
CLIResult run(List<String> arguments);
14+
default CLIResult run(String... arguments) {
15+
return run(List.of(arguments));
16+
}
1317

1418
void stop();
1519

@@ -47,7 +51,7 @@ default void copyOrReplaceFileFromClasspath(String file, Path distDir) {
4751
throw new RuntimeException("Not implemented");
4852
}
4953

50-
default void removeProperty(String db) {
54+
default void removeProperty(String name) {
5155
throw new RuntimeException("Not implemented");
5256
}
5357
}

quarkus/tests/integration/src/main/java/org/keycloak/it/utils/RawKeycloakDistribution.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.apache.commons.io.FileUtils;
5555

5656
import org.keycloak.common.Version;
57+
import org.keycloak.it.junit5.extension.CLIResult;
5758
import org.keycloak.quarkus.runtime.Environment;
5859
import org.keycloak.quarkus.runtime.cli.command.Build;
5960
import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper;
@@ -86,7 +87,7 @@ public RawKeycloakDistribution(boolean debug, boolean manualStop, boolean reCrea
8687
}
8788

8889
@Override
89-
public void start(List<String> arguments) {
90+
public CLIResult run(List<String> arguments) {
9091
reset();
9192
if (manualStop && isRunning()) {
9293
throw new IllegalStateException("Server already running. You should manually stop the server before starting it again.");
@@ -113,6 +114,8 @@ public void start(List<String> arguments) {
113114
stop();
114115
}
115116
}
117+
118+
return CLIResult.create(getOutputStream(), getErrorStream(), getExitCode());
116119
}
117120

118121
@Override
@@ -423,11 +426,11 @@ public void setProperty(String key, String value) {
423426
}
424427

425428
@Override
426-
public void removeProperty(String key) {
429+
public void removeProperty(String name) {
427430
updateProperties(new Consumer<Properties>() {
428431
@Override
429432
public void accept(Properties properties) {
430-
properties.remove(key);
433+
properties.remove(name);
431434
}
432435
}, distPath.resolve("conf").resolve("keycloak.conf").toFile());
433436
}

quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/BuildCommandDistTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
import io.quarkus.test.junit.main.Launch;
2828
import io.quarkus.test.junit.main.LaunchResult;
29+
30+
import org.keycloak.it.junit5.extension.RawDistOnly;
2931
import org.keycloak.it.utils.KeycloakDistribution;
3032

3133
@DistributionTest
@@ -62,4 +64,15 @@ void testFailRuntimeOptions(LaunchResult result) {
6264
CLIResult cliResult = (CLIResult) result;
6365
cliResult.assertError("Unknown option: '--db-username'");
6466
}
67+
68+
@Test
69+
@RawDistOnly(reason = "Containers are immutable")
70+
void testDoNotRecordRuntimeOptionsDuringBuild(KeycloakDistribution distribution) {
71+
distribution.setProperty("proxy", "edge");
72+
distribution.run("build", "--cache=local");
73+
distribution.removeProperty("proxy");
74+
75+
CLIResult result = distribution.run("start", "--hostname=mykeycloak");
76+
result.assertMessage("Key material not provided to setup HTTPS");
77+
}
6578
}

0 commit comments

Comments
 (0)