diff --git a/extensions/kubernetes/openshift/deployment/pom.xml b/extensions/kubernetes/openshift/deployment/pom.xml index d4c4f315d6628..ab20a93dc5f28 100644 --- a/extensions/kubernetes/openshift/deployment/pom.xml +++ b/extensions/kubernetes/openshift/deployment/pom.xml @@ -49,6 +49,10 @@ quarkus-junit5-internal test + + io.smallrye.config + smallrye-config-source-yaml + diff --git a/extensions/kubernetes/openshift/deployment/src/test/java/io/quarkus/openshift/deployment/config/OpenshiftConfigFallbackTest.java b/extensions/kubernetes/openshift/deployment/src/test/java/io/quarkus/openshift/deployment/config/OpenshiftConfigFallbackTest.java new file mode 100644 index 0000000000000..dabca1dacb383 --- /dev/null +++ b/extensions/kubernetes/openshift/deployment/src/test/java/io/quarkus/openshift/deployment/config/OpenshiftConfigFallbackTest.java @@ -0,0 +1,47 @@ +package io.quarkus.openshift.deployment.config; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.ProdBuildResults; +import io.quarkus.test.ProdModeTestResults; +import io.quarkus.test.QuarkusProdModeTest; +import io.smallrye.config.source.yaml.YamlConfigSource; + +public class OpenshiftConfigFallbackTest { + @RegisterExtension + static final QuarkusProdModeTest TEST = new QuarkusProdModeTest() + .setApplicationName("config") + .setApplicationVersion("0.1-SNAPSHOT") + .overrideConfigKey("quarkus.kubernetes.replicas", "10") + .overrideConfigKey("quarkus.openshift.version", "999-SNAPSHOT") + .overrideConfigKey("quarkus.openshift.labels.app", "openshift") + .setRun(true); + + @ProdBuildResults + private ProdModeTestResults prodModeTestResults; + + @Test + void configFallback() throws Exception { + Path kubernetesDir = prodModeTestResults.getBuildDir().resolve("kubernetes"); + YamlConfigSource kubernetes = new YamlConfigSource(kubernetesDir.resolve("kubernetes.yml").toUri().toURL()); + YamlConfigSource openshift = new YamlConfigSource(kubernetesDir.resolve("openshift.yml").toUri().toURL()); + + // Only in Kubernetes, must fallback to Openshift + assertEquals("10", kubernetes.getValue("spec.replicas")); + assertEquals("10", openshift.getValue("spec.replicas")); + + // In both, each should retain the value + assertEquals("0.1-SNAPSHOT", kubernetes.getValue("spec.template.metadata.labels.\"app.kubernetes.io/version\"")); + assertEquals("999-SNAPSHOT", openshift.getValue("spec.template.metadata.labels.\"app.kubernetes.io/version\"")); + + // Only in Openshift + assertNull(kubernetes.getValue("spec.template.metadata.labels.app")); + assertEquals("openshift", openshift.getValue("spec.template.metadata.labels.app")); + } +} diff --git a/extensions/kubernetes/vanilla/runtime/src/main/java/io/quarkus/kubernetes/runtime/config/KubernetesConfigFallback.java b/extensions/kubernetes/vanilla/runtime/src/main/java/io/quarkus/kubernetes/runtime/config/KubernetesConfigFallback.java new file mode 100644 index 0000000000000..17adedbd8c2f7 --- /dev/null +++ b/extensions/kubernetes/vanilla/runtime/src/main/java/io/quarkus/kubernetes/runtime/config/KubernetesConfigFallback.java @@ -0,0 +1,23 @@ +package io.quarkus.kubernetes.runtime.config; + +import java.util.function.Function; + +import io.smallrye.config.FallbackConfigSourceInterceptor; + +public class KubernetesConfigFallback extends FallbackConfigSourceInterceptor { + public KubernetesConfigFallback() { + super(new Function() { + @Override + public String apply(final String name) { + if (name.startsWith("quarkus.openshift.")) { + return "quarkus.kubernetes." + name.substring(18); + } else if (name.startsWith("quarkus.knative.")) { + return "quarkus.kubernetes." + name.substring(16); + } else if (name.startsWith("quarkus.minikube.")) { + return "quarkus.kubernetes." + name.substring(17); + } + return name; + } + }); + } +} diff --git a/extensions/kubernetes/vanilla/runtime/src/main/resources/META-INF/services/io.smallrye.config.ConfigSourceInterceptor b/extensions/kubernetes/vanilla/runtime/src/main/resources/META-INF/services/io.smallrye.config.ConfigSourceInterceptor new file mode 100644 index 0000000000000..9928c53030f95 --- /dev/null +++ b/extensions/kubernetes/vanilla/runtime/src/main/resources/META-INF/services/io.smallrye.config.ConfigSourceInterceptor @@ -0,0 +1 @@ +io.quarkus.kubernetes.runtime.config.KubernetesConfigFallback