From ec8dea27c8a67ff8354d20dc4899d0051ebd560f Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Sat, 25 Mar 2023 09:09:54 +0200 Subject: [PATCH] Add support for specifying custom profiles in Spring Cloud Config client Closes: #32097 --- .../SpringCloudConfigClientConfig.java | 6 +++ ...gCloudConfigClientConfigSourceFactory.java | 9 +++- .../spring-cloud-config-client/pom.xml | 29 +++++++++++++ ...st.java => CommonAndTestProfilesTest.java} | 5 ++- .../client/runtime/OnlyTestProfileTest.java | 42 +++++++++++++++++++ .../runtime/SpringCloudConfigClientIT.java | 2 +- 6 files changed, 90 insertions(+), 3 deletions(-) rename integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/{SpringCloudConfigClientTest.java => CommonAndTestProfilesTest.java} (93%) create mode 100644 integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/OnlyTestProfileTest.java diff --git a/extensions/spring-cloud-config-client/runtime/src/main/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientConfig.java b/extensions/spring-cloud-config-client/runtime/src/main/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientConfig.java index d81b372dbd353..6dc7f665c392e 100644 --- a/extensions/spring-cloud-config-client/runtime/src/main/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientConfig.java +++ b/extensions/spring-cloud-config-client/runtime/src/main/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientConfig.java @@ -2,6 +2,7 @@ import java.nio.file.Path; import java.time.Duration; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -110,6 +111,11 @@ public interface SpringCloudConfigClientConfig { */ Map headers(); + /** + * The profiles to use for lookup + */ + Optional> profiles(); + /** */ default boolean usernameAndPasswordSet() { return username().isPresent() && password().isPresent(); diff --git a/extensions/spring-cloud-config-client/runtime/src/main/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientConfigSourceFactory.java b/extensions/spring-cloud-config-client/runtime/src/main/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientConfigSourceFactory.java index e3c3e7a85f394..81f764071275b 100644 --- a/extensions/spring-cloud-config-client/runtime/src/main/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientConfigSourceFactory.java +++ b/extensions/spring-cloud-config-client/runtime/src/main/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientConfigSourceFactory.java @@ -46,7 +46,7 @@ public Iterable getConfigSources(final ConfigSourceContext context VertxSpringCloudConfigGateway client = new VertxSpringCloudConfigGateway(config); try { List responses = new ArrayList<>(); - for (String profile : context.getProfiles()) { + for (String profile : determineProfiles(context, config)) { Response response; if (connectionTimeoutIsGreaterThanZero || readTimeoutIsGreaterThanZero) { response = client.exchange(applicationName.getValue(), profile).await() @@ -88,6 +88,13 @@ public Iterable getConfigSources(final ConfigSourceContext context } } + private static List determineProfiles(ConfigSourceContext context, SpringCloudConfigClientConfig config) { + if (config.profiles().isPresent()) { + return config.profiles().get(); + } + return context.getProfiles(); + } + private static class SpringCloudPropertySource extends MapBackedConfigSource { private SpringCloudPropertySource(final String name, final Map propertyMap, final int defaultOrdinal) { super(name, propertyMap, defaultOrdinal); diff --git a/integration-tests/spring-cloud-config-client/pom.xml b/integration-tests/spring-cloud-config-client/pom.xml index eb6a84b7b5edc..487775244dd79 100644 --- a/integration-tests/spring-cloud-config-client/pom.xml +++ b/integration-tests/spring-cloud-config-client/pom.xml @@ -79,6 +79,35 @@ + + maven-surefire-plugin + + + default-test + + + common,test + + test-only + + + + + profiles-test + test + + test + + + + test + + + test-only + + + + diff --git a/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientTest.java b/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/CommonAndTestProfilesTest.java similarity index 93% rename from integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientTest.java rename to integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/CommonAndTestProfilesTest.java index 717200e00f432..c577f996119e1 100644 --- a/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientTest.java +++ b/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/CommonAndTestProfilesTest.java @@ -4,6 +4,7 @@ import static jakarta.ws.rs.core.Response.Status.OK; import static org.hamcrest.Matchers.equalTo; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import io.quarkus.test.common.QuarkusTestResource; @@ -11,7 +12,9 @@ @QuarkusTest @QuarkusTestResource(SpringCloudConfigServerResource.class) -public class SpringCloudConfigClientTest { +@Tag("common") +@Tag("test") +public class CommonAndTestProfilesTest { @Test void config() { given() diff --git a/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/OnlyTestProfileTest.java b/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/OnlyTestProfileTest.java new file mode 100644 index 0000000000000..4956e277950bb --- /dev/null +++ b/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/OnlyTestProfileTest.java @@ -0,0 +1,42 @@ +package io.quarkus.spring.cloud.config.client.runtime; + +import static io.restassured.RestAssured.given; +import static jakarta.ws.rs.core.Response.Status.OK; +import static org.hamcrest.Matchers.equalTo; + +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +@QuarkusTestResource(SpringCloudConfigServerResource.class) +@Tag("test") +@Tag("test-only") +public class OnlyTestProfileTest { + @Test + void config() { + given() + .get("/config/{name}", "greeting.message") + .then() + .statusCode(OK.getStatusCode()) + .body("value", equalTo("hello from spring cloud config server")); + } + + @Test + void ordinal() { + given() + .get("/config/{name}", "foo") + .then() + .statusCode(OK.getStatusCode()) + .body("value", equalTo("from foo development")) + .body("sourceName", equalTo("https://github.com/spring-cloud-samples/config-repo/testapp-prod.yml")); + + given() + .get("/config/{name}", "info.description") + .then() + .statusCode(OK.getStatusCode()) + .body("value", equalTo("Sample")); + } +} diff --git a/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientIT.java b/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientIT.java index bacfd270afed5..4f2a2f2f544cf 100644 --- a/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientIT.java +++ b/integration-tests/spring-cloud-config-client/src/test/java/io/quarkus/spring/cloud/config/client/runtime/SpringCloudConfigClientIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class SpringCloudConfigClientIT extends SpringCloudConfigClientTest { +public class SpringCloudConfigClientIT extends CommonAndTestProfilesTest { }