From 4f8ee218f64ab8009b0c9664368607e45652d0cf Mon Sep 17 00:00:00 2001 From: Bruce Yu <51087152+bruce-au@users.noreply.github.com> Date: Mon, 12 Oct 2020 11:13:39 -0400 Subject: [PATCH] ensure config map names are unique based on absolute path, allowing same file names to be specified in different places (#604) --- .../config/ConfigMapPropertySourceLocator.java | 2 +- .../config/ConfigMapsFromFilePathsTests.java | 18 ++++++++++++++++-- .../config/example/GreetingController.java | 6 ++++++ .../config/example/GreetingProperties.java | 10 ++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/ConfigMapPropertySourceLocator.java b/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/ConfigMapPropertySourceLocator.java index 39116614..beb5caf0 100644 --- a/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/ConfigMapPropertySourceLocator.java +++ b/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/ConfigMapPropertySourceLocator.java @@ -113,7 +113,7 @@ public class ConfigMapPropertySourceLocator implements PropertySourceLocator { }).filter(Files::isRegularFile).forEach(p -> { try { String content = new String(Files.readAllBytes(p)).trim(); - String filename = p.getFileName().toString().toLowerCase(); + String filename = p.toAbsolutePath().toString().toLowerCase(); if (filename.endsWith(".properties")) { addPropertySourceIfNeeded( c -> PROPERTIES_TO_MAP diff --git a/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/ConfigMapsFromFilePathsTests.java b/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/ConfigMapsFromFilePathsTests.java index 363e6425..fac9e9fa 100644 --- a/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/ConfigMapsFromFilePathsTests.java +++ b/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/ConfigMapsFromFilePathsTests.java @@ -45,11 +45,14 @@ import static org.springframework.cloud.kubernetes.config.ConfigMapTestUtil.crea "spring.cloud.kubernetes.config.enableApi=false", "spring.cloud.kubernetes.config.paths=" + ConfigMapsFromFilePathsTests.FIRST_FILE_NAME_FULL_PATH + "," - + ConfigMapsFromFilePathsTests.SECOND_FILE_NAME_FULL_PATH }) + + ConfigMapsFromFilePathsTests.SECOND_FILE_NAME_FULL_PATH + "," + + ConfigMapsFromFilePathsTests.FIRST_FILE_NAME_DUPLICATED_FULL_PATH}) public class ConfigMapsFromFilePathsTests { protected static final String FILES_ROOT_PATH = "/tmp/scktests"; + protected static final String FILES_SUB_PATH = "another-directory"; + protected static final String FIRST_FILE_NAME = "application.properties"; protected static final String SECOND_FILE_NAME = "extra.properties"; @@ -65,6 +68,10 @@ public class ConfigMapsFromFilePathsTests { protected static final String UNUSED_FILE_NAME_FULL_PATH = FILES_ROOT_PATH + "/" + UNUSED_FILE_NAME; + protected static final String FIRST_FILE_NAME_DUPLICATED_FULL_PATH = FILES_ROOT_PATH + "/" + + FILES_SUB_PATH + "/" + + FIRST_FILE_NAME; + @ClassRule public static KubernetesServer server = new KubernetesServer(); @@ -87,12 +94,13 @@ public class ConfigMapsFromFilePathsTests { System.setProperty(Config.KUBERNETES_NAMESPACE_SYSTEM_PROPERTY, "test"); System.setProperty(Config.KUBERNETES_HTTP2_DISABLE, "true"); - Files.createDirectories(Paths.get(FILES_ROOT_PATH)); + Files.createDirectories(Paths.get(FILES_ROOT_PATH + "/" + FILES_SUB_PATH)); createFileWithContent(FIRST_FILE_NAME_FULL_PATH, "bean.greeting=Hello from path!"); createFileWithContent(SECOND_FILE_NAME_FULL_PATH, "bean.farewell=Bye from path!"); createFileWithContent(UNUSED_FILE_NAME_FULL_PATH, "bean.morning=Morning from path!"); + createFileWithContent(FIRST_FILE_NAME_DUPLICATED_FULL_PATH, "bean.bonjour=Bonjour from path!"); } @AfterClass @@ -125,4 +133,10 @@ public class ConfigMapsFromFilePathsTests { .expectBody().jsonPath("content").isEqualTo("Good morning, World!"); } + @Test + public void bonjourInputShouldReturnPropertyFromDuplicatedFile() { + this.webClient.get().uri("/api/bonjour").exchange().expectStatus().isOk() + .expectBody().jsonPath("content").isEqualTo("Bonjour from path!"); + } + } diff --git a/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/example/GreetingController.java b/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/example/GreetingController.java index d3410409..cc5cf4c6 100644 --- a/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/example/GreetingController.java +++ b/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/example/GreetingController.java @@ -52,4 +52,10 @@ public class GreetingController { return new ResponseMessage(String.format(this.properties.getMorning(), name)); } + @RequestMapping("/api/bonjour") + public ResponseMessage bonjour( + @RequestParam(value = "name", defaultValue = "World") String name) { + return new ResponseMessage(String.format(this.properties.getBonjour(), name)); + } + } diff --git a/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/example/GreetingProperties.java b/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/example/GreetingProperties.java index e8c613ee..0c47e8dc 100644 --- a/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/example/GreetingProperties.java +++ b/spring-cloud-kubernetes-config/src/test/java/org/springframework/cloud/kubernetes/config/example/GreetingProperties.java @@ -27,6 +27,8 @@ public class GreetingProperties { private String morning = "Good morning, %s!"; + private String bonjour = "Bonjour, %s!"; + public String getGreeting() { return this.greeting; } @@ -51,4 +53,12 @@ public class GreetingProperties { this.morning = morning; } + public String getBonjour() { + return this.bonjour; + } + + public void setBonjour(String bonjour) { + this.bonjour = bonjour; + } + }