Skip to content

Commit

Permalink
Merge pull request #17549 from geoand/#17519
Browse files Browse the repository at this point in the history
Allow extensions to suppress build time config change warnings
  • Loading branch information
geoand authored May 31, 2021
2 parents d42d422 + 81a04f6 commit c2801d4
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.quarkus.deployment.builditem;

import io.quarkus.builder.item.MultiBuildItem;

/**
* Allows extensions to suppress the runtime warning that Quarkus emits on startup when a non-runtime configuration
* options is different at runtime than build time.
* An example usage of this is when a user provides some test value in {@code application.properties}
* for a build-time only property and only provides the actual value on the command line when building Quarkus.
* In such a case we don't want the value set at build time to be revealed at runtime as it could be sensitive.
*/
public final class SuppressNonRuntimeConfigChangedWarningBuildItem extends MultiBuildItem {

private final String configKey;

public SuppressNonRuntimeConfigChangedWarningBuildItem(String configKey) {
this.configKey = configKey;
}

public String getConfigKey() {
return configKey;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import org.eclipse.microprofile.config.Config;
Expand All @@ -26,6 +28,7 @@
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
import io.quarkus.deployment.builditem.LiveReloadBuildItem;
import io.quarkus.deployment.builditem.RunTimeConfigurationDefaultBuildItem;
import io.quarkus.deployment.builditem.SuppressNonRuntimeConfigChangedWarningBuildItem;
import io.quarkus.deployment.configuration.BuildTimeConfigurationReader;
import io.quarkus.deployment.configuration.RunTimeConfigurationGenerator;
import io.quarkus.deployment.configuration.definition.ClassDefinition;
Expand Down Expand Up @@ -95,27 +98,37 @@ private List<String> getAdditionalBootstrapConfigSourceProviders(
return result;
}

@BuildStep
public SuppressNonRuntimeConfigChangedWarningBuildItem ignoreQuarkusProfileChange() {
return new SuppressNonRuntimeConfigChangedWarningBuildItem("quarkus.profile");
}

/**
* Warns if build time config properties have been changed at runtime.
*/
@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
public void checkForBuildTimeConfigChange(
ConfigChangeRecorder recorder, ConfigurationBuildItem configItem, LoggingSetupBuildItem loggingSetupBuildItem,
ConfigurationRuntimeConfig configurationConfig) {
ConfigurationRuntimeConfig configurationConfig,
List<SuppressNonRuntimeConfigChangedWarningBuildItem> suppressNonRuntimeConfigChangedWarningItems) {
BuildTimeConfigurationReader.ReadResult readResult = configItem.getReadResult();
Config config = ConfigProvider.getConfig();

Set<String> excludedConfigKeys = new HashSet<>(suppressNonRuntimeConfigChangedWarningItems.size());
for (SuppressNonRuntimeConfigChangedWarningBuildItem item : suppressNonRuntimeConfigChangedWarningItems) {
excludedConfigKeys.add(item.getConfigKey());
}

Map<String, String> values = new HashMap<>();
for (RootDefinition root : readResult.getAllRoots()) {
if (root.getConfigPhase() == ConfigPhase.BUILD_AND_RUN_TIME_FIXED ||
root.getConfigPhase() == ConfigPhase.BUILD_TIME) {

Iterable<ClassDefinition.ClassMember> members = root.getMembers();
handleMembers(config, values, members, "quarkus." + root.getRootName() + ".");
handleMembers(config, values, members, "quarkus." + root.getRootName() + ".", excludedConfigKeys);
}
}
values.remove("quarkus.profile");
recorder.handleConfigChange(configurationConfig, values);
}

Expand All @@ -133,11 +146,14 @@ public void setupConfigOverride(
}

private void handleMembers(Config config, Map<String, String> values, Iterable<ClassDefinition.ClassMember> members,
String prefix) {
String prefix, Set<String> excludedConfigKeys) {
for (ClassDefinition.ClassMember member : members) {
if (member instanceof ClassDefinition.ItemMember) {
ClassDefinition.ItemMember itemMember = (ClassDefinition.ItemMember) member;
String propertyName = prefix + member.getPropertyName();
if (excludedConfigKeys.contains(propertyName)) {
continue;
}
Optional<String> val = config.getOptionalValue(propertyName, String.class);
if (val.isPresent()) {
values.put(propertyName, val.get());
Expand All @@ -146,7 +162,7 @@ private void handleMembers(Config config, Map<String, String> values, Iterable<C
}
} else if (member instanceof ClassDefinition.GroupMember) {
handleMembers(config, values, ((ClassDefinition.GroupMember) member).getGroupDefinition().getMembers(),
prefix + member.getDescriptor().getName() + ".");
prefix + member.getDescriptor().getName() + ".", excludedConfigKeys);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.ApplicationInfoBuildItem;
import io.quarkus.deployment.builditem.SuppressNonRuntimeConfigChangedWarningBuildItem;
import io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem;
import io.quarkus.deployment.pkg.steps.NativeSourcesBuild;

Expand All @@ -22,7 +23,13 @@ public class ContainerImageProcessor {
@BuildStep(onlyIf = NativeSourcesBuild.class)
void failForNativeSources(BuildProducer<ArtifactResultBuildItem> artifactResultProducer) {
throw new IllegalArgumentException(
"The Container Imagee extensions are incompatible with the 'native-sources' package type.");
"The Container Image extensions are incompatible with the 'native-sources' package type.");
}

@BuildStep
public void ignoreCredentialsChange(BuildProducer<SuppressNonRuntimeConfigChangedWarningBuildItem> producer) {
producer.produce(new SuppressNonRuntimeConfigChangedWarningBuildItem("quarkus.container-image.username"));
producer.produce(new SuppressNonRuntimeConfigChangedWarningBuildItem("quarkus.container-image.password"));
}

@BuildStep
Expand Down

0 comments on commit c2801d4

Please sign in to comment.