diff --git a/pom.xml b/pom.xml index b7b44a04..f9553412 100644 --- a/pom.xml +++ b/pom.xml @@ -62,6 +62,7 @@ 2.1.0.BUILD-SNAPSHOT 2.1.0.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT 3.5 diff --git a/spring-cloud-kubernetes-discovery/pom.xml b/spring-cloud-kubernetes-discovery/pom.xml index fad015b3..f8ffea10 100644 --- a/spring-cloud-kubernetes-discovery/pom.xml +++ b/spring-cloud-kubernetes-discovery/pom.xml @@ -108,6 +108,18 @@ ${groovy.version} test + + org.springframework.cloud + spring-cloud-test-support + ${spring-cloud-commons.version} + test + + + org.springframework.cloud + spring-cloud-config-client + ${spring-cloud-config.version} + test + diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfiguration.java index a11c7e46..2a79e363 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfiguration.java @@ -32,6 +32,7 @@ import org.springframework.context.annotation.Primary; public class KubernetesDiscoveryClientAutoConfiguration { @Bean + @ConditionalOnMissingBean @ConditionalOnProperty(name = "spring.cloud.kubernetes.discovery.enabled",matchIfMissing = true) public DiscoveryClient discoveryClient(KubernetesClient client, KubernetesDiscoveryProperties properties) { diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientBootstrapConfiguration.java b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientBootstrapConfiguration.java new file mode 100644 index 00000000..5c248d33 --- /dev/null +++ b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientBootstrapConfiguration.java @@ -0,0 +1,29 @@ +/* + * Copyright 2013-2018 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 + * + * http://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.kubernetes.discovery; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.kubernetes.KubernetesAutoConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@ConditionalOnProperty(value = "spring.cloud.kubernetes.discovery.enabled", + matchIfMissing = false) +@Import({KubernetesDiscoveryClientAutoConfiguration.class, + KubernetesAutoConfiguration.class}) +public class KubernetesDiscoveryClientBootstrapConfiguration {} diff --git a/spring-cloud-kubernetes-discovery/src/main/resources/META-INF/spring.factories b/spring-cloud-kubernetes-discovery/src/main/resources/META-INF/spring.factories index a82e049f..3c7e81b6 100644 --- a/spring-cloud-kubernetes-discovery/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-kubernetes-discovery/src/main/resources/META-INF/spring.factories @@ -1,2 +1,4 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryClientAutoConfiguration +org.springframework.cloud.bootstrap.BootstrapConfiguration=\ +org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryClientBootstrapConfiguration diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryAutoConfigurationTests.java b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryAutoConfigurationTests.java new file mode 100644 index 00000000..43cc80ca --- /dev/null +++ b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryAutoConfigurationTests.java @@ -0,0 +1,109 @@ +/* + * Copyright 2013-2018 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 + * + * http://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.kubernetes.discovery; + +import static junit.framework.TestCase.assertEquals; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import java.util.Arrays; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.commons.util.UtilAutoConfiguration; +import org.springframework.cloud.config.client.ConfigClientProperties; +import org.springframework.cloud.config.client.DiscoveryClientConfigServiceBootstrapConfiguration; +import org.springframework.cloud.kubernetes.KubernetesAutoConfiguration; +import org.springframework.cloud.test.ClassPathExclusions; +import org.springframework.cloud.test.ModifiedClassPathRunner; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author Zhanwei Wang + */ +@RunWith(ModifiedClassPathRunner.class) +public class KubernetesDiscoveryAutoConfigurationTests { + private AnnotationConfigApplicationContext context; + + @After + public void close() { + if (this.context != null) { + if (this.context.getParent() != null) { + ((AnnotationConfigApplicationContext) this.context.getParent()).close(); + } + this.context.close(); + } + } + + @Test + public void onWhenRequested() throws Exception { + setup("server.port=7000", "spring.cloud.config.discovery.enabled=true", + "spring.cloud.kubernetes.discovery.enabled:true", + "spring.cloud.kubernetes.enabled:true", + "spring.application.name:test", + "spring.cloud.config.discovery.service-id:configserver"); + assertEquals( 1, this.context.getParent() + .getBeanNamesForType(DiscoveryClient.class).length); + DiscoveryClient client = this.context.getParent().getBean( + DiscoveryClient.class); + verify(client, atLeast(2)).getInstances("configserver"); + ConfigClientProperties locator = this.context + .getBean(ConfigClientProperties.class); + assertEquals("http://fake:8888/", locator.getUri()[0]); + } + + private void setup(String... env) { + AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext(); + TestPropertyValues.of(env).applyTo(parent); + parent.register(UtilAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class, EnvironmentKnobbler.class, + KubernetesDiscoveryClientBootstrapConfiguration.class, + DiscoveryClientConfigServiceBootstrapConfiguration.class, + ConfigClientProperties.class); + parent.refresh(); + this.context = new AnnotationConfigApplicationContext(); + this.context.setParent(parent); + this.context.register(PropertyPlaceholderAutoConfiguration.class, + KubernetesAutoConfiguration.class, + KubernetesDiscoveryClientAutoConfiguration.class); + this.context.refresh(); + } + + @Configuration + protected static class EnvironmentKnobbler { + + @Bean + public DiscoveryClient kubernetesDiscoveryClient( + KubernetesDiscoveryProperties properties) { + KubernetesDiscoveryClient client = mock(KubernetesDiscoveryClient.class); + ServiceInstance instance = new DefaultServiceInstance("configserver", + "fake", 8888, false); + given(client.getInstances("configserver")) + .willReturn(Arrays.asList(instance)); + return client; + } + } +}