diff --git a/spring-cloud-kubernetes-fabric8-autoconfig/src/main/java/org/springframework/cloud/kubernetes/fabric8/Fabric8Utils.java b/spring-cloud-kubernetes-fabric8-autoconfig/src/main/java/org/springframework/cloud/kubernetes/fabric8/Fabric8Utils.java index 0e65a87e..dbc0ddd1 100644 --- a/spring-cloud-kubernetes-fabric8-autoconfig/src/main/java/org/springframework/cloud/kubernetes/fabric8/Fabric8Utils.java +++ b/spring-cloud-kubernetes-fabric8-autoconfig/src/main/java/org/springframework/cloud/kubernetes/fabric8/Fabric8Utils.java @@ -40,8 +40,8 @@ public final class Fabric8Utils { private static final LogAccessor LOG = new LogAccessor(LogFactory.getLog(Fabric8Utils.class)); /** - * this method does the namespace resolution. Namespace is being searched according to - * the order below. + * this method does the namespace resolution. Namespace is being searched according to the + * order below. * *
 	 *     1. from incoming namespace, which can be null.
diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java
index e8b3afd9..6d3c3f99 100644
--- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java
+++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java
@@ -36,7 +36,6 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscover
 import org.springframework.core.log.LogAccessor;
 import org.springframework.util.CollectionUtils;
 
-import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.NAMESPACE_METADATA_KEY;
 import static org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientUtils.endpoints;
 import static org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientUtils.endpointsPort;
 import static org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientUtils.serviceMetadata;
@@ -141,14 +140,9 @@ public class KubernetesDiscoveryClient implements DiscoveryClient {
 		List instances = new ArrayList<>();
 
 		Service service = client.services().inNamespace(namespace).withName(serviceId).get();
-		Map serviceMetadata = serviceMetadata(serviceId, service, properties, subsets);
+		Map serviceMetadata = serviceMetadata(serviceId, service, properties, subsets, namespace);
 
 		for (EndpointSubset endpointSubset : subsets) {
-
-			if (properties.allNamespaces()) {
-				serviceMetadata.put(NAMESPACE_METADATA_KEY, namespace);
-			}
-
 			List addresses = endpointSubset.getAddresses();
 
 			if (properties.includeNotReadyAddresses()
diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtils.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtils.java
index 688c1291..586e2358 100644
--- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtils.java
+++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtils.java
@@ -40,6 +40,7 @@ import static java.util.stream.Collectors.toMap;
 import static org.springframework.cloud.kubernetes.commons.config.ConfigUtils.keysWithPrefix;
 import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.HTTP;
 import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.HTTPS;
+import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.NAMESPACE_METADATA_KEY;
 import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.PRIMARY_PORT_NAME_LABEL_KEY;
 
 /**
@@ -123,10 +124,10 @@ final class KubernetesDiscoveryClientUtils {
 	}
 
 	/**
-	 * labels, annotations and ports metadata.
+	 * labels, annotations, ports metadata and namespace metadata.
 	 */
 	static Map serviceMetadata(String serviceId, Service service,
-			KubernetesDiscoveryProperties properties, List endpointSubsets) {
+			KubernetesDiscoveryProperties properties, List endpointSubsets, String namespace) {
 		Map serviceMetadata = new HashMap<>();
 		KubernetesDiscoveryProperties.Metadata metadataProps = properties.metadata();
 		if (metadataProps.addLabels()) {
@@ -152,6 +153,7 @@ final class KubernetesDiscoveryClientUtils {
 			serviceMetadata.putAll(portMetadata);
 		}
 
+		serviceMetadata.put(NAMESPACE_METADATA_KEY, namespace);
 		return serviceMetadata;
 	}
 
diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterMetadataTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterMetadataTest.java
index f802cdf8..a18f6858 100644
--- a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterMetadataTest.java
+++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterMetadataTest.java
@@ -88,7 +88,7 @@ class KubernetesDiscoveryClientFilterMetadataTest {
 
 		List instances = discoveryClient.getInstances(serviceId);
 		assertThat(instances).hasSize(1);
-		assertThat(instances.get(0).getMetadata()).isEmpty();
+		assertThat(instances.get(0).getMetadata()).isEqualTo(Map.of("k8s_namespace", "ns"));
 	}
 
 	@Test
@@ -106,7 +106,8 @@ class KubernetesDiscoveryClientFilterMetadataTest {
 
 		List instances = discoveryClient.getInstances(serviceId);
 		assertThat(instances).hasSize(1);
-		assertThat(instances.get(0).getMetadata()).containsOnly(entry("l1", "v1"), entry("l2", "v2"));
+		assertThat(instances.get(0).getMetadata()).containsOnly(entry("l1", "v1"), entry("l2", "v2"),
+				entry("k8s_namespace", "ns"));
 	}
 
 	@Test
@@ -124,7 +125,8 @@ class KubernetesDiscoveryClientFilterMetadataTest {
 
 		List instances = discoveryClient.getInstances(serviceId);
 		assertThat(instances).hasSize(1);
-		assertThat(instances.get(0).getMetadata()).containsOnly(entry("l_l1", "v1"), entry("l_l2", "v2"));
+		assertThat(instances.get(0).getMetadata()).containsOnly(entry("l_l1", "v1"), entry("l_l2", "v2"),
+				entry("k8s_namespace", "ns"));
 	}
 
 	@Test
@@ -142,7 +144,8 @@ class KubernetesDiscoveryClientFilterMetadataTest {
 
 		List instances = discoveryClient.getInstances(serviceId);
 		assertThat(instances).hasSize(1);
-		assertThat(instances.get(0).getMetadata()).containsOnly(entry("a1", "v1"), entry("a2", "v2"));
+		assertThat(instances.get(0).getMetadata()).containsOnly(entry("a1", "v1"), entry("a2", "v2"),
+				entry("k8s_namespace", "ns"));
 	}
 
 	@Test
@@ -160,7 +163,8 @@ class KubernetesDiscoveryClientFilterMetadataTest {
 
 		List instances = discoveryClient.getInstances(serviceId);
 		assertThat(instances).hasSize(1);
-		assertThat(instances.get(0).getMetadata()).containsOnly(entry("a_a1", "v1"), entry("a_a2", "v2"));
+		assertThat(instances.get(0).getMetadata()).containsOnly(entry("a_a1", "v1"), entry("a_a2", "v2"),
+				entry("k8s_namespace", "ns"));
 	}
 
 	@Test
@@ -178,7 +182,7 @@ class KubernetesDiscoveryClientFilterMetadataTest {
 
 		List instances = discoveryClient.getInstances(serviceId);
 		assertThat(instances).hasSize(1);
-		assertThat(instances.get(0).getMetadata()).containsOnly(entry("http", "80"));
+		assertThat(instances.get(0).getMetadata()).containsOnly(entry("http", "80"), entry("k8s_namespace", "ns"));
 	}
 
 	@Test
@@ -196,7 +200,7 @@ class KubernetesDiscoveryClientFilterMetadataTest {
 
 		List instances = discoveryClient.getInstances(serviceId);
 		assertThat(instances).hasSize(1);
-		assertThat(instances.get(0).getMetadata()).containsOnly(entry("p_http", "80"));
+		assertThat(instances.get(0).getMetadata()).containsOnly(entry("p_http", "80"), entry("k8s_namespace", "ns"));
 	}
 
 	@Test
@@ -215,7 +219,7 @@ class KubernetesDiscoveryClientFilterMetadataTest {
 		List instances = discoveryClient.getInstances(serviceId);
 		assertThat(instances).hasSize(1);
 		assertThat(instances.get(0).getMetadata()).containsOnly(entry("a_a1", "an1"), entry("a_a2", "an2"),
-				entry("l_l1", "la1"), entry("p_http", "80"));
+				entry("l_l1", "la1"), entry("p_http", "80"), entry("k8s_namespace", "ns"));
 	}
 
 	private void setupServiceWithLabelsAndAnnotationsAndPorts(String serviceId, String namespace,
diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtilsTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtilsTests.java
index 15f0eaf6..d3ff17bd 100644
--- a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtilsTests.java
+++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtilsTests.java
@@ -336,6 +336,8 @@ class KubernetesDiscoveryClientUtilsTests {
 		boolean addPorts = false;
 		String portsPrefix = "";
 
+		String namespace = "default";
+
 		KubernetesDiscoveryProperties.Metadata metadata = new KubernetesDiscoveryProperties.Metadata(addLabels,
 				labelsPrefix, addAnnotations, annotationsPrefix, addPorts, portsPrefix);
 		KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(true, true, Set.of(), true, 60L,
@@ -343,8 +345,9 @@ class KubernetesDiscoveryClientUtilsTests {
 		Service service = new ServiceBuilder().build();
 
 		Map result = KubernetesDiscoveryClientUtils.serviceMetadata("my-service", service, properties,
-				List.of());
-		Assertions.assertEquals(result.size(), 0);
+				List.of(), namespace);
+		Assertions.assertEquals(result.size(), 1);
+		Assertions.assertEquals(result, Map.of("k8s_namespace", "default"));
 	}
 
 	/**
@@ -362,6 +365,8 @@ class KubernetesDiscoveryClientUtilsTests {
 		boolean addPorts = false;
 		String portsPrefix = "";
 
+		String namespace = "default";
+
 		KubernetesDiscoveryProperties.Metadata metadata = new KubernetesDiscoveryProperties.Metadata(addLabels,
 				labelsPrefix, addAnnotations, annotationsPrefix, addPorts, portsPrefix);
 		KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(true, true, Set.of(), true, 60L,
@@ -370,10 +375,12 @@ class KubernetesDiscoveryClientUtilsTests {
 				.withMetadata(new ObjectMetaBuilder().withLabels(Map.of("a", "b")).build()).build();
 
 		Map result = KubernetesDiscoveryClientUtils.serviceMetadata("my-service", service, properties,
-				List.of());
-		Assertions.assertEquals(result.size(), 1);
-		Assertions.assertEquals(result, Map.of("a", "b"));
-		Assertions.assertTrue(output.getOut().contains("Adding labels metadata: {a=b} for serviceId: my-service"));
+				List.of(), namespace);
+		Assertions.assertEquals(result.size(), 2);
+		Assertions.assertEquals(result, Map.of("a", "b", "k8s_namespace", "default"));
+		String labelsMetadata = filterOnK8sNamespace(result);
+		Assertions.assertTrue(
+				output.getOut().contains("Adding labels metadata: " + labelsMetadata + " for serviceId: my-service"));
 	}
 
 	/**
@@ -391,6 +398,8 @@ class KubernetesDiscoveryClientUtilsTests {
 		boolean addPorts = false;
 		String portsPrefix = "";
 
+		String namespace = "default";
+
 		KubernetesDiscoveryProperties.Metadata metadata = new KubernetesDiscoveryProperties.Metadata(addLabels,
 				labelsPrefix, addAnnotations, annotationsPrefix, addPorts, portsPrefix);
 		KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(true, true, Set.of(), true, 60L,
@@ -399,13 +408,13 @@ class KubernetesDiscoveryClientUtilsTests {
 				.withMetadata(new ObjectMetaBuilder().withLabels(Map.of("a", "b", "c", "d")).build()).build();
 
 		Map result = KubernetesDiscoveryClientUtils.serviceMetadata("my-service", service, properties,
-				List.of());
-		Assertions.assertEquals(result.size(), 2);
-		Assertions.assertEquals(result, Map.of("prefix-a", "b", "prefix-c", "d"));
+				List.of(), namespace);
+		Assertions.assertEquals(result.size(), 3);
+		Assertions.assertEquals(result, Map.of("prefix-a", "b", "prefix-c", "d", "k8s_namespace", "default"));
 		// so that result is deterministic in assertion
-		String labels = result.toString();
+		String labelsMetadata = filterOnK8sNamespace(result);
 		Assertions.assertTrue(
-				output.getOut().contains("Adding labels metadata: " + labels + " for serviceId: my-service"));
+				output.getOut().contains("Adding labels metadata: " + labelsMetadata + " for serviceId: my-service"));
 	}
 
 	/**
@@ -423,6 +432,8 @@ class KubernetesDiscoveryClientUtilsTests {
 		boolean addPorts = false;
 		String portsPrefix = "";
 
+		String namespace = "default";
+
 		KubernetesDiscoveryProperties.Metadata metadata = new KubernetesDiscoveryProperties.Metadata(addLabels,
 				labelsPrefix, addAnnotations, annotationsPrefix, addPorts, portsPrefix);
 		KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(true, true, Set.of(), true, 60L,
@@ -432,9 +443,9 @@ class KubernetesDiscoveryClientUtilsTests {
 				.build();
 
 		Map result = KubernetesDiscoveryClientUtils.serviceMetadata("my-service", service, properties,
-				List.of());
-		Assertions.assertEquals(result.size(), 1);
-		Assertions.assertEquals(result, Map.of("aa", "bb"));
+				List.of(), namespace);
+		Assertions.assertEquals(result.size(), 2);
+		Assertions.assertEquals(result, Map.of("aa", "bb", "k8s_namespace", "default"));
 		Assertions
 				.assertTrue(output.getOut().contains("Adding annotations metadata: {aa=bb} for serviceId: my-service"));
 	}
@@ -454,6 +465,8 @@ class KubernetesDiscoveryClientUtilsTests {
 		boolean addPorts = false;
 		String portsPrefix = "";
 
+		String namespace = "default";
+
 		KubernetesDiscoveryProperties.Metadata metadata = new KubernetesDiscoveryProperties.Metadata(addLabels,
 				labelsPrefix, addAnnotations, annotationsPrefix, addPorts, portsPrefix);
 		KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(true, true, Set.of(), true, 60L,
@@ -462,11 +475,11 @@ class KubernetesDiscoveryClientUtilsTests {
 				.withAnnotations(Map.of("aa", "bb", "cc", "dd")).withLabels(Map.of("a", "b")).build()).build();
 
 		Map result = KubernetesDiscoveryClientUtils.serviceMetadata("my-service", service, properties,
-				List.of());
-		Assertions.assertEquals(result.size(), 2);
-		Assertions.assertEquals(result, Map.of("prefix-aa", "bb", "prefix-cc", "dd"));
+				List.of(), namespace);
+		Assertions.assertEquals(result.size(), 3);
+		Assertions.assertEquals(result, Map.of("prefix-aa", "bb", "prefix-cc", "dd", "k8s_namespace", "default"));
 		// so that result is deterministic in assertion
-		String annotations = result.toString();
+		String annotations = filterOnK8sNamespace(result);
 		Assertions.assertTrue(
 				output.getOut().contains("Adding annotations metadata: " + annotations + " for serviceId: my-service"));
 	}
@@ -486,6 +499,8 @@ class KubernetesDiscoveryClientUtilsTests {
 		boolean addPorts = false;
 		String portsPrefix = "";
 
+		String namespace = "default";
+
 		KubernetesDiscoveryProperties.Metadata metadata = new KubernetesDiscoveryProperties.Metadata(addLabels,
 				labelsPrefix, addAnnotations, annotationsPrefix, addPorts, portsPrefix);
 		KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(true, true, Set.of(), true, 60L,
@@ -495,10 +510,10 @@ class KubernetesDiscoveryClientUtilsTests {
 				.build();
 
 		Map result = KubernetesDiscoveryClientUtils.serviceMetadata("my-service", service, properties,
-				List.of());
-		Assertions.assertEquals(result.size(), 4);
-		Assertions.assertEquals(result,
-				Map.of("annotation-aa", "bb", "annotation-cc", "dd", "label-a", "b", "label-c", "d"));
+				List.of(), namespace);
+		Assertions.assertEquals(result.size(), 5);
+		Assertions.assertEquals(result, Map.of("annotation-aa", "bb", "annotation-cc", "dd", "label-a", "b", "label-c",
+				"d", "k8s_namespace", "default"));
 		// so that result is deterministic in assertion
 		String labels = result.entrySet().stream().filter(en -> en.getKey().contains("label"))
 				.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)).toString();
@@ -524,6 +539,8 @@ class KubernetesDiscoveryClientUtilsTests {
 		boolean addPorts = true;
 		String portsPrefix = "";
 
+		String namespace = "default";
+
 		KubernetesDiscoveryProperties.Metadata metadata = new KubernetesDiscoveryProperties.Metadata(addLabels,
 				labelsPrefix, addAnnotations, annotationsPrefix, addPorts, portsPrefix);
 		KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(true, true, Set.of(), true, 60L,
@@ -538,9 +555,9 @@ class KubernetesDiscoveryClientUtilsTests {
 						.withPorts(new EndpointPortBuilder().withPort(8080).withName("https").build()).build());
 
 		Map result = KubernetesDiscoveryClientUtils.serviceMetadata("my-service", service, properties,
-				endpointSubsets);
-		Assertions.assertEquals(result.size(), 1);
-		Assertions.assertEquals(result, Map.of("https", "8080"));
+				endpointSubsets, namespace);
+		Assertions.assertEquals(result.size(), 2);
+		Assertions.assertEquals(result, Map.of("https", "8080", "k8s_namespace", "default"));
 		Assertions
 				.assertTrue(output.getOut().contains("Adding port metadata: {https=8080} for serviceId : my-service"));
 	}
@@ -559,6 +576,8 @@ class KubernetesDiscoveryClientUtilsTests {
 		boolean addPorts = true;
 		String portsPrefix = "prefix-";
 
+		String namespace = "default";
+
 		KubernetesDiscoveryProperties.Metadata metadata = new KubernetesDiscoveryProperties.Metadata(addLabels,
 				labelsPrefix, addAnnotations, annotationsPrefix, addPorts, portsPrefix);
 		KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(true, true, Set.of(), true, 60L,
@@ -573,11 +592,17 @@ class KubernetesDiscoveryClientUtilsTests {
 						.withPorts(new EndpointPortBuilder().withPort(8080).withName("https").build()).build());
 
 		Map result = KubernetesDiscoveryClientUtils.serviceMetadata("my-service", service, properties,
-				endpointSubsets);
-		Assertions.assertEquals(result.size(), 2);
-		Assertions.assertEquals(result, Map.of("prefix-https", "8080", "prefix-http", "8081"));
+				endpointSubsets, namespace);
+		Assertions.assertEquals(result.size(), 3);
+		Assertions.assertEquals(result,
+				Map.of("prefix-https", "8080", "prefix-http", "8081", "k8s_namespace", "default"));
 		Assertions.assertTrue(output.getOut()
 				.contains("Adding port metadata: {prefix-http=8081, prefix-https=8080} for serviceId : my-service"));
 	}
 
+	private String filterOnK8sNamespace(Map result) {
+		return result.entrySet().stream().filter(en -> !en.getKey().contains("k8s_namespace"))
+				.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)).toString();
+	}
+
 }
diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/test/resources/logback-test.xml b/spring-cloud-kubernetes-fabric8-discovery/src/test/resources/logback-test.xml
new file mode 100644
index 00000000..d43090e7
--- /dev/null
+++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/resources/logback-test.xml
@@ -0,0 +1,18 @@
+
+	
+		
+			%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
+		
+	
+
+	
+		
+	
+
+	
+	
+
+	
+	
+
+