From a57b46563853b68bd66cc2d13e6463ae7f795541 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 31 Mar 2021 07:01:24 -0400 Subject: [PATCH] Take into account config data in list format (#1853) --- ...igDataMissingEnvironmentPostProcessor.java | 39 ++----- ...aMissingEnvironmentPostProcessorTests.java | 106 ++++++++++++++++++ ...verConfigDataNoImportIntegrationTests.java | 16 ++- 3 files changed, 128 insertions(+), 33 deletions(-) create mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessorTests.java diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessor.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessor.java index b4e740fd..c96bc3c2 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessor.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessor.java @@ -16,20 +16,17 @@ package org.springframework.cloud.config.client; -import org.springframework.boot.SpringApplication; import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; import org.springframework.boot.diagnostics.FailureAnalysis; -import org.springframework.boot.env.EnvironmentPostProcessor; -import org.springframework.core.Ordered; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.util.StringUtils; +import org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor; +import org.springframework.core.env.Environment; import static org.springframework.cloud.config.client.ConfigServerConfigDataLocationResolver.PREFIX; import static org.springframework.cloud.util.PropertyUtils.bootstrapEnabled; import static org.springframework.cloud.util.PropertyUtils.useLegacyProcessing; -public class ConfigServerConfigDataMissingEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered { +public class ConfigServerConfigDataMissingEnvironmentPostProcessor extends ConfigDataMissingEnvironmentPostProcessor { /** * Order of post processor, set to run after @@ -43,36 +40,24 @@ public class ConfigServerConfigDataMissingEnvironmentPostProcessor implements En } @Override - public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + protected String getPrefix() { + return PREFIX; + } + + @Override + protected boolean shouldProcessEnvironment(Environment environment) { // don't run if using bootstrap or legacy processing if (bootstrapEnabled(environment) || useLegacyProcessing(environment)) { - return; + return false; } boolean configEnabled = environment.getProperty(ConfigClientProperties.PREFIX + ".enabled", Boolean.class, true); boolean importCheckEnabled = environment.getProperty(ConfigClientProperties.PREFIX + ".import-check.enabled", Boolean.class, true); if (!configEnabled || !importCheckEnabled) { - return; + return false; } - String property = environment.getProperty("spring.config.import"); - if (!StringUtils.hasText(property)) { - throw new ImportException("No spring.config.import set", false); - } - if (!property.contains(PREFIX)) { - throw new ImportException("spring.config.import missing " + PREFIX, true); - } - } - - static class ImportException extends RuntimeException { - - final boolean missingPrefix; - - ImportException(String message, boolean missingPrefix) { - super(message); - this.missingPrefix = missingPrefix; - } - + return true; } static class ImportExceptionFailureAnalyzer extends AbstractFailureAnalyzer { diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessorTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessorTests.java new file mode 100644 index 00000000..3931c54a --- /dev/null +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessorTests.java @@ -0,0 +1,106 @@ +/* + * Copyright 2015-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.config.client; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.SpringApplication; +import org.springframework.mock.env.MockEnvironment; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; + +/** + * @author Ryan Baxter + */ +class ConfigServerConfigDataMissingEnvironmentPostProcessorTests { + + @Test + void noSpringConfigImport() { + MockEnvironment environment = new MockEnvironment(); + SpringApplication app = mock(SpringApplication.class); + ConfigServerConfigDataMissingEnvironmentPostProcessor processor = new ConfigServerConfigDataMissingEnvironmentPostProcessor(); + assertThatThrownBy(() -> processor.postProcessEnvironment(environment, app)) + .isInstanceOf(ConfigServerConfigDataMissingEnvironmentPostProcessor.ImportException.class); + } + + @Test + void boostrap() { + MockEnvironment environment = new MockEnvironment(); + environment.setProperty("spring.cloud.bootstrap.enabled", "true"); + SpringApplication app = mock(SpringApplication.class); + ConfigServerConfigDataMissingEnvironmentPostProcessor processor = new ConfigServerConfigDataMissingEnvironmentPostProcessor(); + assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); + } + + @Test + void legacy() { + MockEnvironment environment = new MockEnvironment(); + environment.setProperty("spring.config.use-legacy-processing", "true"); + SpringApplication app = mock(SpringApplication.class); + ConfigServerConfigDataMissingEnvironmentPostProcessor processor = new ConfigServerConfigDataMissingEnvironmentPostProcessor(); + assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); + } + + @Test + void configNotEnabled() { + MockEnvironment environment = new MockEnvironment(); + environment.setProperty("spring.cloud.config.enabled", "false"); + SpringApplication app = mock(SpringApplication.class); + ConfigServerConfigDataMissingEnvironmentPostProcessor processor = new ConfigServerConfigDataMissingEnvironmentPostProcessor(); + assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); + } + + @Test + void importCheckNotEnabled() { + MockEnvironment environment = new MockEnvironment(); + environment.setProperty("spring.cloud.config.import-check.enabled", "false"); + SpringApplication app = mock(SpringApplication.class); + ConfigServerConfigDataMissingEnvironmentPostProcessor processor = new ConfigServerConfigDataMissingEnvironmentPostProcessor(); + assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); + } + + @Test + void importSinglePropertySource() { + MockEnvironment environment = new MockEnvironment(); + environment.setProperty("spring.config.import", "configserver:http://localhost:8888"); + SpringApplication app = mock(SpringApplication.class); + ConfigServerConfigDataMissingEnvironmentPostProcessor processor = new ConfigServerConfigDataMissingEnvironmentPostProcessor(); + assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); + } + + @Test + void importMultiplePropertySource() { + MockEnvironment environment = new MockEnvironment(); + environment.setProperty("spring.config.import", "configserver:http://localhost:8888,file:./app.properties"); + SpringApplication app = mock(SpringApplication.class); + ConfigServerConfigDataMissingEnvironmentPostProcessor processor = new ConfigServerConfigDataMissingEnvironmentPostProcessor(); + assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); + } + + @Test + void importMultiplePropertySourceAsList() { + MockEnvironment environment = new MockEnvironment(); + environment.setProperty("spring.config.import[0]", "configserver:http://localhost:8888"); + environment.setProperty("spring.config.import[1]", "file:./app.properties"); + SpringApplication app = mock(SpringApplication.class); + ConfigServerConfigDataMissingEnvironmentPostProcessor processor = new ConfigServerConfigDataMissingEnvironmentPostProcessor(); + assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); + } + +} diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataNoImportIntegrationTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataNoImportIntegrationTests.java index 5db795e6..c816688c 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataNoImportIntegrationTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataNoImportIntegrationTests.java @@ -25,7 +25,7 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; -import org.springframework.cloud.config.client.ConfigServerConfigDataMissingEnvironmentPostProcessor.ImportException; +import org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; @@ -42,8 +42,10 @@ public class ConfigServerConfigDataNoImportIntegrationTests { @Test public void exceptionThrownIfNoImport(CapturedOutput output) { - Assertions.assertThatThrownBy(() -> new SpringApplicationBuilder(Config.class).web(WebApplicationType.NONE) - .run("--spring.application.name=" + APP_NAME)).isInstanceOf(ImportException.class); + Assertions + .assertThatThrownBy(() -> new SpringApplicationBuilder(Config.class).web(WebApplicationType.NONE) + .run("--spring.application.name=" + APP_NAME)) + .isInstanceOf(ConfigDataMissingEnvironmentPostProcessor.ImportException.class); assertThat(output).contains("No spring.config.import property has been defined") .contains("Add a spring.config.import=configserver: property to your configuration"); @@ -51,9 +53,11 @@ public class ConfigServerConfigDataNoImportIntegrationTests { @Test public void exceptionThrownIfImportMissing(CapturedOutput output) { - Assertions.assertThatThrownBy(() -> new SpringApplicationBuilder(Config.class).web(WebApplicationType.NONE).run( - "--spring.config.import=optional:file:somefile.properties", "--spring.application.name=" + APP_NAME)) - .isInstanceOf(ImportException.class); + Assertions + .assertThatThrownBy(() -> new SpringApplicationBuilder(Config.class).web(WebApplicationType.NONE).run( + "--spring.config.import=optional:file:somefile.properties", + "--spring.application.name=" + APP_NAME)) + .isInstanceOf(ConfigDataMissingEnvironmentPostProcessor.ImportException.class); assertThat(output).contains("spring.config.import property is missing a " + PREFIX) .contains("Add a spring.config.import=configserver: property to your configuration");