Skip to content

Commit

Permalink
Merge pull request #18104 from radcortez/fix-17892
Browse files Browse the repository at this point in the history
Do not record Env values in the runtime defaults
  • Loading branch information
gsmet authored Jun 28, 2021
2 parents a2729a3 + 1ded5a3 commit 6bead1f
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,10 @@
import io.quarkus.runtime.configuration.HyphenateEnumConverter;
import io.quarkus.runtime.configuration.NameIterator;
import io.smallrye.config.Converters;
import io.smallrye.config.EnvConfigSource;
import io.smallrye.config.Expressions;
import io.smallrye.config.SmallRyeConfig;
import io.smallrye.config.SmallRyeConfigBuilder;

/**
* A configuration reader.
Expand Down Expand Up @@ -296,6 +298,7 @@ ReadResult run() {
nameBuilder.setLength(len);
}
// sweep-up
SmallRyeConfig runtimeDefaultsConfig = getConfigForRuntimeDefaults();
for (String propertyName : getAllProperties()) {
if (propertyName.equals(ConfigSource.CONFIG_ORDINAL)) {
continue;
Expand Down Expand Up @@ -380,12 +383,12 @@ ReadResult run() {
if (matched != null) {
// it's a specified run-time default (record for later)
specifiedRunTimeDefaultValues.put(propertyName, Expressions.withoutExpansion(
() -> config.getOptionalValue(propertyName, String.class).orElse("")));
() -> runtimeDefaultsConfig.getOptionalValue(propertyName, String.class).orElse("")));
}
} else {
// it's not managed by us; record it
specifiedRunTimeDefaultValues.put(propertyName, Expressions.withoutExpansion(
() -> config.getOptionalValue(propertyName, String.class).orElse("")));
() -> runtimeDefaultsConfig.getOptionalValue(propertyName, String.class).orElse("")));
}
}
return new ReadResult(objectsByRootClass, specifiedRunTimeDefaultValues, buildTimeRunTimeVisibleValues,
Expand Down Expand Up @@ -734,6 +737,28 @@ private Set<String> getAllProperties() {
}
return properties;
}

/**
* Use this Config instance to record the specified runtime default values. We cannot use the main Config
* instance because it may record values coming from the EnvSource in build time. We do exclude the properties
* coming from the EnvSource, but a call to getValue may still provide values coming from the EnvSource, so we
* need to exclude it from sources when recoding values.
*
* We also do not want to completely exclude the EnvSource, because it may provide values for the build. This
* is only specific when recording the defaults.
*
* @return a new SmallRye instance without the EnvSources.
*/
private SmallRyeConfig getConfigForRuntimeDefaults() {
SmallRyeConfigBuilder builder = ConfigUtils.emptyConfigBuilder();
for (ConfigSource configSource : config.getConfigSources()) {
if (configSource instanceof EnvConfigSource) {
continue;
}
builder.withSources(configSource);
}
return builder.build();
}
}

public static final class ReadResult {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,6 @@ QUARKUS_HTTP_NON_APPLICATION_ROOT_PATH=/1234
quarkus.http.non.application.root.path=/1234
QUARKUS_HTTP_SSL_PORT=4443
quarkus.http.ssl.port=4443

### Do not record env values in build time
bt.do.not.record=properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.quarkus.extest;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import javax.inject.Inject;

import org.eclipse.microprofile.config.Config;
import org.eclipse.microprofile.config.spi.ConfigSource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.test.QuarkusUnitTest;

public class RuntimeDefaultsTest {
@RegisterExtension
static final QuarkusUnitTest TEST = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
// Don't change this to types, because of classloader class cast exception.
.addAsServiceProvider("org.eclipse.microprofile.config.spi.ConfigSource",
"io.quarkus.extest.runtime.config.EnvBuildTimeConfigSource")
.addAsResource("application.properties"));

@Inject
Config config;

@Test
void doNotRecordEnvRuntimeDefaults() {
ConfigSource defaultValues = null;
for (ConfigSource configSource : config.getConfigSources()) {
if (configSource.getName().contains("PropertiesConfigSource[source=Specified default values]")) {
defaultValues = configSource;
break;
}
}
assertNotNull(defaultValues);

assertEquals("properties", defaultValues.getValue("bt.do.not.record"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.quarkus.extest.runtime.config;

import java.util.HashMap;

import io.smallrye.config.EnvConfigSource;

public class EnvBuildTimeConfigSource extends EnvConfigSource {
public EnvBuildTimeConfigSource() {
super(new HashMap<String, String>() {
{
put("BT_DO_NOT_RECORD", "env-source");
}
}, Integer.MAX_VALUE);
}
}

0 comments on commit 6bead1f

Please sign in to comment.