diff --git a/spring-cloud-kubernetes-core/src/main/java/org/springframework/cloud/kubernetes/KubernetesAutoConfiguration.java b/spring-cloud-kubernetes-core/src/main/java/org/springframework/cloud/kubernetes/KubernetesAutoConfiguration.java index b9dd95c6..9ccdacd1 100644 --- a/spring-cloud-kubernetes-core/src/main/java/org/springframework/cloud/kubernetes/KubernetesAutoConfiguration.java +++ b/spring-cloud-kubernetes-core/src/main/java/org/springframework/cloud/kubernetes/KubernetesAutoConfiguration.java @@ -130,7 +130,7 @@ public class KubernetesAutoConfiguration { base.getHttpsProxy())) .withProxyUsername(or(kubernetesClientProperties.getProxyUsername(), base.getProxyUsername())) - .withPassword(or(kubernetesClientProperties.getProxyPassword(), + .withProxyPassword(or(kubernetesClientProperties.getProxyPassword(), base.getProxyPassword())) .withNoProxy( or(kubernetesClientProperties.getNoProxy(), base.getNoProxy())) diff --git a/spring-cloud-kubernetes-core/src/test/java/org/springframework/cloud/kubernetes/KubernetesAutoConfigurationTests.java b/spring-cloud-kubernetes-core/src/test/java/org/springframework/cloud/kubernetes/KubernetesAutoConfigurationTests.java new file mode 100644 index 00000000..2810f9e4 --- /dev/null +++ b/spring-cloud-kubernetes-core/src/test/java/org/springframework/cloud/kubernetes/KubernetesAutoConfigurationTests.java @@ -0,0 +1,77 @@ +/* + * 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.kubernetes; + +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.server.mock.KubernetesServer; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.kubernetes.example.App; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = App.class, properties = { + "spring.cloud.kubernetes.client.password=mypassword", + "spring.cloud.kubernetes.client.proxy-password=myproxypassword" }) +public class KubernetesAutoConfigurationTests { + + @ClassRule + public static KubernetesServer server = new KubernetesServer(); + + @Autowired + ConfigurableApplicationContext context; + + @BeforeClass + public static void setUpBeforeClass() { + KubernetesClient mockClient = server.getClient(); + + // Configure the kubernetes master url to point to the mock server + System.setProperty(Config.KUBERNETES_MASTER_SYSTEM_PROPERTY, + mockClient.getConfiguration().getMasterUrl()); + System.setProperty(Config.KUBERNETES_TRUST_CERT_SYSTEM_PROPERTY, "true"); + System.setProperty(Config.KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY, "false"); + System.setProperty(Config.KUBERNETES_AUTH_TRYSERVICEACCOUNT_SYSTEM_PROPERTY, + "false"); + System.setProperty(Config.KUBERNETES_NAMESPACE_SYSTEM_PROPERTY, "test"); + System.setProperty(Config.KUBERNETES_HTTP2_DISABLE, "true"); + } + + @Test + public void beansAreCreated() { + assertThat(context.getBeanNamesForType(Config.class)).hasSize(1); + assertThat(context.getBeanNamesForType(KubernetesClient.class)).hasSize(1); + assertThat(context.getBeanNamesForType(StandardPodUtils.class)).hasSize(1); + assertThat(context.getBeanNamesForType(KubernetesHealthIndicator.class)) + .hasSize(1); + assertThat(context.getBeanNamesForType(KubernetesInfoContributor.class)) + .hasSize(1); + + Config config = context.getBean(Config.class); + assertThat(config.getPassword()).isEqualTo("mypassword"); + assertThat(config.getProxyPassword()).isEqualTo("myproxypassword"); + } + +} diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java index c1747f55..3479a602 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java @@ -41,6 +41,7 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; import static java.util.stream.Collectors.toMap; +import static org.springframework.cloud.kubernetes.discovery.KubernetesServiceInstance.NAMESPACE_METADATA_KEY; /** * Kubeneretes implementation of {@link DiscoveryClient}. @@ -153,6 +154,10 @@ public class KubernetesDiscoveryClient implements DiscoveryClient { endpointMetadata.putAll(portMetadata); } + if (this.properties.isAllNamespaces()) { + endpointMetadata.put(NAMESPACE_METADATA_KEY, namespace); + } + List addresses = s.getAddresses(); for (EndpointAddress endpointAddress : addresses) { String instanceId = null; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java index d11ad1c9..28043269 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java @@ -28,6 +28,11 @@ import org.springframework.cloud.client.ServiceInstance; */ public class KubernetesServiceInstance implements ServiceInstance { + /** + * Key of the namespace metadata. + */ + public static final String NAMESPACE_METADATA_KEY = "k8s_namespace"; + private static final String HTTP_PREFIX = "http"; private static final String HTTPS_PREFIX = "https"; @@ -115,4 +120,8 @@ public class KubernetesServiceInstance implements ServiceInstance { return URI.create(sb.toString()); } + public String getNamespace() { + return this.metadata != null ? this.metadata.get(NAMESPACE_METADATA_KEY) : null; + } + } diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTest.java b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTest.java index 85a77231..a70aa292 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTest.java +++ b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTest.java @@ -377,6 +377,14 @@ public class KubernetesDiscoveryClientTest { .hasSize(1); assertThat(instances).filteredOn(s -> s.getHost().equals("ip2") && !s.isSecure()) .hasSize(1); + assertThat(instances) + .filteredOn(s -> s.getServiceId().contains("endpoint") + && ((KubernetesServiceInstance) s).getNamespace().equals("test")) + .hasSize(1); + assertThat(instances) + .filteredOn(s -> s.getServiceId().contains("endpoint") + && ((KubernetesServiceInstance) s).getNamespace().equals("test2")) + .hasSize(1); assertThat(instances).filteredOn(s -> s.getInstanceId().equals("60")).hasSize(1); assertThat(instances).filteredOn(s -> s.getInstanceId().equals("70")).hasSize(1); }