diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepository.java index e497b8b7..2dce7d92 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepository.java @@ -101,29 +101,37 @@ public class AwsSecretsManagerEnvironmentRepository implements EnvironmentReposi environment.add(new PropertySource("overrides", overrides)); } + List labels; + if (StringUtils.hasText(label) && label.contains(",")) { + labels = Arrays.asList(StringUtils.commaDelimitedListToStringArray(label)); + Collections.reverse(labels); + } + else { + labels = Collections.singletonList(label); + } + List reversedProfiles = new ArrayList<>(Arrays.asList(profiles)); Collections.reverse(reversedProfiles); - for (String profile : reversedProfiles) { - addPropertySource(environment, application, profile, label); - if (!defaultApplication.equals(application)) { - addPropertySource(environment, defaultApplication, profile, label); + for (String l : labels) { + for (String profile : reversedProfiles) { + addPropertySource(environment, application, profile, l); + if (!defaultApplication.equals(application)) { + addPropertySource(environment, defaultApplication, profile, l); + } + } + if (!Arrays.asList(profiles).contains(defaultProfile)) { + addPropertySource(environment, application, defaultProfile, l); + } + if (!Arrays.asList(profiles).contains(defaultProfile) && !defaultApplication.equals(application)) { + addPropertySource(environment, defaultApplication, defaultProfile, l); } - } - if (!Arrays.asList(profiles).contains(defaultProfile)) { - addPropertySource(environment, application, defaultProfile, label); + if (!defaultApplication.equals(application)) { + addPropertySource(environment, application, null, l); + } + addPropertySource(environment, defaultApplication, null, l); } - if (!Arrays.asList(profiles).contains(defaultProfile) && !defaultApplication.equals(application)) { - addPropertySource(environment, defaultApplication, defaultProfile, label); - } - - if (!defaultApplication.equals(application)) { - addPropertySource(environment, application, null, label); - } - - addPropertySource(environment, defaultApplication, null, label); - return environment; } diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepositoryTests.java index d819f01f..7df4e7f2 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepositoryTests.java @@ -18,6 +18,7 @@ package org.springframework.cloud.config.server.environment; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -1595,6 +1596,41 @@ public class AwsSecretsManagerEnvironmentRepositoryTests { assertThat(resultEnv).usingRecursiveComparison().withStrictTypeChecking().isEqualTo(expectedEnv); } + @Test + public void testFindOneWithExistingApplicationAndDefaultProfileAndExistingLabelWhenMultipleLabelIsSet() { + String application = "foo"; + String profile = configServerProperties.getDefaultProfile(); + String label = "release,test"; + String[] profiles = StringUtils.commaDelimitedListToStringArray(profile); + + String fooPropertiesName = "aws:secrets:/secret/foo/"; + PropertySource fooProperties = new PropertySource(fooPropertiesName, getFooReleaseProperties()); + + String fooDefaultPropertiesName = "aws:secrets:/secret/foo-default/"; + PropertySource fooDefaultProperties = new PropertySource(fooDefaultPropertiesName, + getFooDefaultReleaseProperties()); + + String applicationDefaultPropertiesName = "aws:secrets:/secret/application-default/"; + PropertySource applicationDefaultProperties = new PropertySource(applicationDefaultPropertiesName, + getApplicationDefaultReleaseProperties()); + + String applicationPropertiesName = "aws:secrets:/secret/application/"; + PropertySource applicationProperties = new PropertySource(applicationPropertiesName, + getApplicationReleaseProperties()); + + Environment expectedEnv = new Environment(application, profiles, label, null, null); + expectedEnv.addAll(Arrays.asList(applicationDefaultProperties, fooProperties)); + + putSecrets("release", Collections.singletonList(fooProperties)); + putSecrets("dev", Collections.singletonList(fooDefaultProperties)); + putSecrets("test", Collections.singletonList(applicationDefaultProperties)); + putSecrets("", Collections.singletonList(applicationProperties)); + + Environment resultEnv = labeledRepository.findOne(application, profile, label); + + assertThat(resultEnv).usingRecursiveComparison().withStrictTypeChecking().isEqualTo(expectedEnv); + } + @Test public void testFindOneWithExistingApplicationAndNonExistingProfileAndExistingLabelWhenDefaultLabelIsSet() { String application = "foo"; @@ -2640,7 +2676,11 @@ public class AwsSecretsManagerEnvironmentRepositoryTests { private void putSecrets(Environment environment) { String label = environment.getLabel() != null ? environment.getLabel() : environmentProperties.getDefaultLabel(); - for (PropertySource ps : environment.getPropertySources()) { + putSecrets(label, environment.getPropertySources()); + } + + private void putSecrets(String label, List propertySources) { + for (PropertySource ps : propertySources) { String path = StringUtils.delete(ps.getName(), environmentProperties.getOrigin()); String secrets = getSecrets(ps); CreateSecretResponse response = smClient