Skip to content

Commit 37656d3

Browse files
Ryan Baxterryanjbaxter
andauthored
Add logic to be more specific about when mark a property source to be profile specific (#2437)
Fixes #2417 Co-authored-by: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com>
1 parent dbfc5d2 commit 37656d3

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.springframework.web.client.ResourceAccessException;
5656
import org.springframework.web.client.RestTemplate;
5757

58+
import static org.springframework.cloud.config.client.ConfigClientProperties.DEFAULT_PROFILE;
5859
import static org.springframework.cloud.config.client.ConfigClientProperties.STATE_HEADER;
5960
import static org.springframework.cloud.config.client.ConfigClientProperties.TOKEN_HEADER;
6061

@@ -67,6 +68,8 @@ public class ConfigServerConfigDataLoader implements ConfigDataLoader<ConfigServ
6768

6869
private static final EnumSet<Option> ALL_OPTIONS = EnumSet.allOf(Option.class);
6970

71+
private static final String OVERRIDES_NAME = "configserver:overrides";
72+
7073
protected final Log logger;
7174

7275
public ConfigServerConfigDataLoader(DeferredLogFactory logFactory) {
@@ -168,7 +171,13 @@ else if (ALL_OPTIONS.size() > 2) {
168171
// - is the default profile-separator for property sources
169172
// TODO This is error prone logic see
170173
// https://github.com/spring-cloud/spring-cloud-config/issues/2291
171-
if (propertySourceName.matches(".*[-,]" + profile + ".*")) {
174+
// When we see the overrides property source name we
175+
// should always prioritize those
176+
// properties over everything else, even profile specific
177+
// property sources so also
178+
// label this property source profile specific.
179+
if (OVERRIDES_NAME.equals(propertySourceName) || (!DEFAULT_PROFILE.equals(profile)
180+
&& propertySourceName.matches(".*[-,]" + profile + "\\b.*"))) {
172181
// // TODO: switch to Options.with() when implemented
173182
options.add(Option.PROFILE_SPECIFIC);
174183
}

spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoaderTests.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,70 @@ void filterPropertySourcesWithDocuments() {
506506

507507
}
508508

509+
@Test
510+
void testProfileSpecificPropertySources() {
511+
PropertySource p1 = new PropertySource("overrides", Collections.singletonMap("foo", "bar"));
512+
PropertySource p2 = new PropertySource("classpath:/test-default/config-client/application.yaml",
513+
Collections.singletonMap("foo", "baroverride"));
514+
PropertySource p3 = new PropertySource(
515+
"git@github.com:demo/support-configuration-repo.git/Config resource 'file [/var/folders/k3/zv8hzdm17vv69j485fv3cf9r0000gp/T/config-repo-14772121892716396795/commons/application.properties' via location 'commons/' (document #0)",
516+
Collections.singletonMap("hello", "world"));
517+
PropertySource p4 = new PropertySource("aws:secrets:/secret/application-name_profile",
518+
Collections.singletonMap("hello", "world"));
519+
Map<String, Object> activatesOnProfileCamelCase = new HashMap<>();
520+
activatesOnProfileCamelCase.put("spring.config.activate.onProfile", "foo");
521+
PropertySource p5 = new PropertySource(
522+
"git@github.com:demo/support-configuration-repo.git/Config resource 'file [/var/folders/k3/zv8hzdm17vv69j485fv3cf9r0000gp/T/config-repo-14772121892716396795/commons/application.properties' via location 'commons/' (document #1)",
523+
activatesOnProfileCamelCase);
524+
Map<String, Object> activatesOnProfile = new HashMap<>();
525+
activatesOnProfile.put("spring.config.activate.on-profile", "foo");
526+
PropertySource p6 = new PropertySource(
527+
"ssh://git@stash.int.openbet.com:7999/dbs/environments.git/Config resource 'file [/tmp/config-repo-16512912790018624282/platform/pinnacle-def.yaml' via location 'platform/' (document#0)",
528+
activatesOnProfile);
529+
ConfigData configData = setupConfigServerConfigDataLoader(Arrays.asList(p6, p5, p4, p3, p2, p1),
530+
"application-slash", "def");
531+
assertThat(configData.getPropertySources()).hasSize(7);
532+
assertThat(configData.getOptions(configData.getPropertySources().get(0))
533+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
534+
assertThat(configData.getOptions(configData.getPropertySources().get(1))
535+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isTrue();
536+
assertThat(configData.getOptions(configData.getPropertySources().get(2))
537+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
538+
assertThat(configData.getOptions(configData.getPropertySources().get(3))
539+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
540+
assertThat(configData.getOptions(configData.getPropertySources().get(4))
541+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
542+
assertThat(configData.getOptions(configData.getPropertySources().get(5))
543+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
544+
assertThat(configData.getOptions(configData.getPropertySources().get(6))
545+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isTrue();
546+
}
547+
548+
@Test
549+
void testProfileSpecificPropertySourcesWithDefaultProfile() {
550+
PropertySource p1 = new PropertySource("overrides", Collections.singletonMap("foo", "bar"));
551+
PropertySource p2 = new PropertySource("classpath:/test-default/config-client/application.yaml",
552+
Collections.singletonMap("foo", "baroverride"));
553+
PropertySource p3 = new PropertySource(
554+
"git@github.com:demo/support-configuration-repo.git/Config resource 'file [/var/folders/k3/zv8hzdm17vv69j485fv3cf9r0000gp/T/config-repo-14772121892716396795/commons/application.properties' via location 'commons/' (document #0)",
555+
Collections.singletonMap("hello", "world"));
556+
PropertySource p4 = new PropertySource("aws:secrets:/secret/application-name_profile",
557+
Collections.singletonMap("hello", "world"));
558+
ConfigData configData = setupConfigServerConfigDataLoader(Arrays.asList(p4, p3, p2, p1), "application-slash",
559+
"default");
560+
assertThat(configData.getPropertySources()).hasSize(5);
561+
assertThat(configData.getOptions(configData.getPropertySources().get(0))
562+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
563+
assertThat(configData.getOptions(configData.getPropertySources().get(1))
564+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isTrue();
565+
assertThat(configData.getOptions(configData.getPropertySources().get(2))
566+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
567+
assertThat(configData.getOptions(configData.getPropertySources().get(3))
568+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
569+
assertThat(configData.getOptions(configData.getPropertySources().get(4))
570+
.contains(ConfigData.Option.PROFILE_SPECIFIC)).isFalse();
571+
}
572+
509573
private ConfigData setupConfigServerConfigDataLoader(List<PropertySource> propertySources, String applicationName,
510574
String... profileList) {
511575
RestTemplate rest = mock(RestTemplate.class);

0 commit comments

Comments
 (0)