diff --git a/pom.xml b/pom.xml index 20ef3f7d..2aa54454 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ spring-cloud-consul-config spring-cloud-consul-discovery spring-cloud-consul-binder - spring-cloud-consul-sample + spring-cloud-consul-integration-tests spring-cloud-starter-consul spring-cloud-starter-consul-bus spring-cloud-starter-consul-config diff --git a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java index ca4bb53c..d17d1b98 100644 --- a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java +++ b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java @@ -38,6 +38,7 @@ import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.cloud.consul.ConsulAutoConfiguration; import org.springframework.cloud.consul.ConsulProperties; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -153,8 +154,11 @@ public class ConsulConfigDataLocationResolver implements ConfigDataLocationResol registerBean(context, type, supplier); context.getBootstrapContext().addCloseListener(event -> { T instance = event.getBootstrapContext().get(type); - event.getApplicationContext().getBeanFactory().registerSingleton("configData" + type.getSimpleName(), - instance); + String name = "configData" + type.getSimpleName(); + ConfigurableApplicationContext appCtxt = event.getApplicationContext(); + if (!appCtxt.containsBean(name)) { + appCtxt.getBeanFactory().registerSingleton(name, instance); + } }); } diff --git a/spring-cloud-consul-integration-tests/pom.xml b/spring-cloud-consul-integration-tests/pom.xml new file mode 100644 index 00000000..4a576842 --- /dev/null +++ b/spring-cloud-consul-integration-tests/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + org.springframework.cloud + spring-cloud-consul + 3.0.0-SNAPSHOT + .. + + spring-cloud-consul-integration-tests + spring-cloud-consul-integration-tests + spring-cloud-consul-integration-tests + pom + + + spring-cloud-consul-bootstrap-tests + spring-cloud-consul-configdata-tests + + diff --git a/spring-cloud-consul-sample/pom.xml b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/pom.xml similarity index 79% rename from spring-cloud-consul-sample/pom.xml rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/pom.xml index 0cac69f2..23ac7321 100644 --- a/spring-cloud-consul-sample/pom.xml +++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/pom.xml @@ -4,14 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-cloud-consul-sample + spring-cloud-consul-bootstrap-tests jar - Spring Cloud Consul Sample - Spring Cloud Consul Sample + Spring Cloud Consul Bootstrap Integration Tests + Spring Cloud Consul Bootstrap Integration Tests org.springframework.cloud - spring-cloud-consul + spring-cloud-consul-integration-tests 3.0.0-SNAPSHOT .. @@ -44,6 +44,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.cloud + spring-cloud-starter-bootstrap + org.springframework.cloud spring-cloud-starter-consul-all diff --git a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleConsulApplication.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/ConsulBootstrapApplication.java similarity index 94% rename from spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleConsulApplication.java rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/ConsulBootstrapApplication.java index 43bb6bbd..f08aaafe 100644 --- a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleConsulApplication.java +++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/ConsulBootstrapApplication.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.consul.sample; +package org.springframework.cloud.consul.bootstraptests; import java.util.List; @@ -50,10 +50,7 @@ import org.springframework.web.client.RestTemplate; @EnableConfigurationProperties @EnableFeignClients @Slf4j -public class SampleConsulApplication /* - * implements - * ApplicationListener - */ { +public class ConsulBootstrapApplication { @Autowired private LoadBalancerClient loadBalancer; @@ -77,7 +74,7 @@ public class SampleConsulApplication /* private String appName; public static void main(String[] args) { - SpringApplication.run(SampleConsulApplication.class, args); + SpringApplication.run(ConsulBootstrapApplication.class, args); } @RequestMapping("/me") diff --git a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleProperties.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/SampleProperties.java similarity index 93% rename from spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleProperties.java rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/SampleProperties.java index 8cd7729e..1fa3e4d1 100644 --- a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleProperties.java +++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/SampleProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.consul.sample; +package org.springframework.cloud.consul.bootstraptests; import lombok.Data; diff --git a/spring-cloud-consul-sample/src/main/resources/application.yml b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/resources/application.yml similarity index 100% rename from spring-cloud-consul-sample/src/main/resources/application.yml rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/resources/application.yml diff --git a/spring-cloud-consul-sample/src/main/resources/bootstrap.yml b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/resources/bootstrap.yml similarity index 100% rename from spring-cloud-consul-sample/src/main/resources/bootstrap.yml rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/resources/bootstrap.yml diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/pom.xml b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/pom.xml new file mode 100644 index 00000000..a50c0a9c --- /dev/null +++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + spring-cloud-consul-configdata-tests + jar + Spring Cloud Consul ConfigData Integration Tests + Spring Cloud Consul ConfigData Integration Tests + + + org.springframework.cloud + spring-cloud-consul-integration-tests + 3.0.0-SNAPSHOT + .. + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + maven-deploy-plugin + + true + + + + + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-starter-consul-all + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.projectlombok + lombok + + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.testcontainers + testcontainers + test + + + org.springframework.cloud + spring-cloud-consul-core + ${project.version} + test-jar + test + + + + diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplication.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplication.java new file mode 100644 index 00000000..a7913b13 --- /dev/null +++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplication.java @@ -0,0 +1,117 @@ +/* + * Copyright 2013-2020 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.consul.configdatatests; + +import java.util.List; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +/** + * @author Spencer Gibb + */ +@SpringBootApplication +@RestController +@EnableConfigurationProperties +@Slf4j +public class ConsulConfigDataApplication { + + @Autowired + private LoadBalancerClient loadBalancer; + + @Autowired + private DiscoveryClient discoveryClient; + + @Autowired + private Environment env; + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private Registration registration; + + @Value("${spring.application.name:testConsulApp}") + private String appName; + + public static void main(String[] args) { + SpringApplication.run(ConsulConfigDataApplication.class, args); + } + + @RequestMapping("/me") + public ServiceInstance me() { + return this.registration; + } + + @RequestMapping("/") + public ServiceInstance lb() { + return this.loadBalancer.choose(this.appName); + } + + @RequestMapping("/rest") + public String rest() { + return this.restTemplate.getForObject("http://" + this.appName + "/me", String.class); + } + + @RequestMapping("/choose") + public String choose() { + return this.loadBalancer.choose(this.appName).getUri().toString(); + } + + @RequestMapping("/myenv") + public String env(@RequestParam("prop") String prop) { + return this.env.getProperty(prop, "Not Found"); + } + + @RequestMapping("/prop") + public String prop() { + return sampleProperties().getProp(); + } + + @RequestMapping("/instances") + public List instances() { + return this.discoveryClient.getInstances(this.appName); + } + + @Bean + public SampleProperties sampleProperties() { + return new SampleProperties(); + } + + @Bean + @LoadBalanced + public RestTemplate restTemplate() { + return new RestTemplate(); + } + +} diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/SampleProperties.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/SampleProperties.java new file mode 100644 index 00000000..75c0ef5e --- /dev/null +++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/SampleProperties.java @@ -0,0 +1,32 @@ +/* + * Copyright 2013-2019 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.consul.configdatatests; + +import lombok.Data; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Spencer Gibb + */ +@ConfigurationProperties("sample") +@Data +public class SampleProperties { + + private String prop = "default value"; + +} diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/resources/application.yml b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/resources/application.yml new file mode 100644 index 00000000..ebbee05b --- /dev/null +++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 0 + +spring: + application: + name: testConsulConfigDataIntegrationTestApp + config: + import: 'optional:consul:' + +logging: + level: + org.springframework.cloud.consul: DEBUG diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/test/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplicationTests.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/test/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplicationTests.java new file mode 100644 index 00000000..d4c547f9 --- /dev/null +++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/test/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplicationTests.java @@ -0,0 +1,64 @@ +/* + * Copyright 2013-2020 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.consul.configdatatests; + +import java.util.UUID; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import org.springframework.boot.SpringApplication; +import org.springframework.cloud.consul.test.ConsulTestcontainers; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.test.annotation.DirtiesContext; + +@DirtiesContext +public class ConsulConfigDataApplicationTests { + + private static final String APP_NAME = "testConsulConfigDataIntegration"; + + private static final String PREFIX = "_configDataIntegrationTests_config__"; + + private static final String ROOT = PREFIX + UUID.randomUUID(); + + private static ConfigurableApplicationContext context; + + @BeforeAll + public static void setup() { + ConsulTestcontainers.start(); + + SpringApplication application = new SpringApplication(ConsulConfigDataApplication.class); + context = application.run("--spring.application.name=" + APP_NAME, + "--spring.config.import=consul:" + ConsulTestcontainers.getHost() + ":" + + ConsulTestcontainers.getPort(), + "--spring.cloud.consul.config.prefix=" + ROOT, "--spring.cloud.consul.config.watch.delay=10"); + + } + + @AfterAll + public static void teardown() { + if (context != null) { + context.close(); + } + } + + @Test + public void contextLoads() { + } + +}