result = adapter.apply(client);
+ Assertions.assertEquals(result.size(), 1);
+ Assertions.assertEquals(result.get(0).getMetadata().getName(), "serviceB");
+ Assertions.assertEquals(result.get(0).getMetadata().getNamespace(), "namespaceA");
+ }
+
+ /**
+ *
+ * - all-namespaces = false
+ * - specific namespace = namespaceA
+ * - labels = {}
+ * - filter = "#root.metadata.labels.containsKey("number")"
+ * (namespaceA or namespaceB)
+ *
+ * - serviceA exists in namespaceA with labels = {color=red, number=1}
+ * - serviceB exists in namespaceA with labels = {color=purple, cycle=create}
+ * - serviceC exists in namespaceC with labels = {color=purple, number=1}
+ *
+ * - we get only serviceB as a result (because of the filter) even if such labels are also
+ * present on a different service (but it's in a different namespace).
+ *
+ */
+ @Test
+ void testSpecificNamespaceWithoutLabelsWithFilter() {
+ boolean allNamespaces = false;
+ Map labels = Map.of();
+ String spelFilter = """
+ #root.metadata.labels.containsKey("number")
+ """.stripLeading();
+
+ MockEnvironment environment = new MockEnvironment();
+
+ KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(false, allNamespaces, Set.of(),
+ true, 60L, false, spelFilter, Set.of(), labels, null, null, 0, false);
+
+ Fabric8DiscoveryServicesAdapter adapter = new Fabric8DiscoveryServicesAdapter(
+ new KubernetesDiscoveryClientAutoConfiguration().servicesFunction(properties, environment), properties,
+ null);
+
+ utils.when(() -> Fabric8Utils.getApplicationNamespace(Mockito.any(KubernetesClient.class),
+ Mockito.nullable(String.class), Mockito.anyString(), Mockito.any(KubernetesNamespaceProvider.class)))
+ .thenReturn("namespaceA");
+
+ service("namespaceA", "serviceA", Map.of("color", "red", "number", "1"));
+ service("namespaceA", "serviceB", Map.of("color", "purple", "cycle", "create"));
+ service("namespaceC", "serviceC", Map.of("color", "purple", "number", "1"));
+
+ List result = adapter.apply(client);
+ Assertions.assertEquals(result.size(), 1);
+ Assertions.assertEquals(result.get(0).getMetadata().getName(), "serviceA");
+ Assertions.assertEquals(result.get(0).getMetadata().getNamespace(), "namespaceA");
+ Assertions.assertEquals(result.get(0).getMetadata().getLabels(), Map.of("color", "red", "number", "1"));
+ }
+
+ /**
+ *
+ * - all-namespaces = false
+ * - some namespaces = [namespaceA, namespaceB]
+ * - labels = {}
+ * - filter = null
+ *
+ * - serviceA exists in namespaceA with labels = {}
+ * - serviceB exists in namespaceB with labels = {}
+ * - serviceC exists in namespaceC with labels = {}
+ *
+ * - we get serviceA and serviceB as a result, because their namespaces match.
+ *
+ */
+ @Test
+ void testSomeNamespacesWithoutLabelsWithoutFilter() {
+ boolean allNamespaces = false;
+ Set someNamespaces = Set.of("namespaceA", "namespaceB");
+ Map labels = Map.of();
+ String spelFilter = null;
+
+ MockEnvironment environment = new MockEnvironment();
+
+ KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(false, allNamespaces,
+ someNamespaces, true, 60L, false, spelFilter, Set.of(), labels, null, null, 0, false);
+
+ Fabric8DiscoveryServicesAdapter adapter = new Fabric8DiscoveryServicesAdapter(
+ new KubernetesDiscoveryClientAutoConfiguration().servicesFunction(properties, environment), properties,
+ null);
+
+ service("namespaceA", "serviceA", Map.of());
+ service("namespaceB", "serviceB", Map.of());
+ service("namespaceC", "serviceC", Map.of());
+
+ List result = adapter.apply(client);
+ Assertions.assertEquals(result.size(), 2);
+ result = result.stream().sorted(Comparator.comparing(x -> x.getMetadata().getName())).toList();
+ Assertions.assertEquals(result.get(0).getMetadata().getName(), "serviceA");
+ Assertions.assertEquals(result.get(0).getMetadata().getNamespace(), "namespaceA");
+ Assertions.assertEquals(result.get(1).getMetadata().getName(), "serviceB");
+ Assertions.assertEquals(result.get(1).getMetadata().getNamespace(), "namespaceB");
+ }
+
+ /**
+ *
+ * - all-namespaces = false
+ * - some namespaces = [namespaceA, namespaceB]
+ * - labels = {color=purple}
+ * - filter = null
+ *
+ * - serviceA exists in namespaceA with labels = {color=purple}
+ * - serviceB exists in namespaceB with labels = {color=red}
+ * - serviceC exists in namespaceC with labels = {color=purple}
+ *
+ * - we get serviceA as a result
+ *
+ */
+ @Test
+ void testSomeNamespacesWithLabelsWithoutFilter() {
+ boolean allNamespaces = false;
+ Set someNamespaces = Set.of("namespaceA", "namespaceB");
+ Map labels = Map.of("color", "purple");
+ String spelFilter = null;
+
+ MockEnvironment environment = new MockEnvironment();
+
+ KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(false, allNamespaces,
+ someNamespaces, true, 60L, false, spelFilter, Set.of(), labels, null, null, 0, false);
+
+ Fabric8DiscoveryServicesAdapter adapter = new Fabric8DiscoveryServicesAdapter(
+ new KubernetesDiscoveryClientAutoConfiguration().servicesFunction(properties, environment), properties,
+ null);
+
+ service("namespaceA", "serviceA", Map.of("color", "purple"));
+ service("namespaceB", "serviceB", Map.of("color", "red"));
+ service("namespaceC", "serviceC", Map.of("color", "purple"));
+
+ List result = adapter.apply(client);
+ Assertions.assertEquals(result.size(), 1);
+ Assertions.assertEquals(result.get(0).getMetadata().getName(), "serviceA");
+ Assertions.assertEquals(result.get(0).getMetadata().getNamespace(), "namespaceA");
+ }
+
+ /**
+ *
+ * - all-namespaces = false
+ * - some namespaces = [namespaceA, namespaceB]
+ * - labels = {color=purple}
+ * - filter = #root.metadata.labels.containsKey("number")
+ *
+ * - serviceA exists in namespaceA with labels = {color=purple}
+ * - serviceB exists in namespaceB with labels = {color=red}
+ * - serviceC exists in namespaceC with labels = {color=purple}
+ *
+ * - we get serviceA as a result
+ *
+ */
+ @Test
+ void testSomeNamespacesWithLabelsWithFilter() {
+ boolean allNamespaces = false;
+ Set someNamespaces = Set.of("namespaceA", "namespaceB");
+ Map labels = Map.of("color", "purple");
+ String spelFilter = """
+ #root.metadata.labels.containsKey("number")
+ """.stripLeading();
+
+ MockEnvironment environment = new MockEnvironment();
+
+ KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(false, allNamespaces,
+ someNamespaces, true, 60L, false, spelFilter, Set.of(), labels, null, null, 0, false);
+
+ Fabric8DiscoveryServicesAdapter adapter = new Fabric8DiscoveryServicesAdapter(
+ new KubernetesDiscoveryClientAutoConfiguration().servicesFunction(properties, environment), properties,
+ null);
+
+ service("namespaceA", "serviceA", Map.of("color", "purple", "number", "1"));
+ service("namespaceB", "serviceB", Map.of("color", "purple", "cycle", "create"));
+ service("namespaceC", "serviceC", Map.of("color", "purple", "number", "1"));
+
+ List result = adapter.apply(client);
+ Assertions.assertEquals(result.size(), 1);
+ Assertions.assertEquals(result.get(0).getMetadata().getName(), "serviceA");
+ Assertions.assertEquals(result.get(0).getMetadata().getNamespace(), "namespaceA");
+ }
+
+ private void service(String namespace, String name, Map labels) {
+ client.services().inNamespace(namespace)
+ .resource(new ServiceBuilder().withNewMetadata().withName(name).withLabels(labels).and().build())
+ .create();
+ }
+
+}
diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java
index 477436ba..4f041eb2 100644
--- a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java
+++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java
@@ -85,7 +85,7 @@ public class KubernetesDiscoveryClientTest {
mockClient.services().inNamespace("test").resource(service).create();
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient,
- KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services,
+ KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services, null,
new ServicePortSecureResolver(KubernetesDiscoveryProperties.DEFAULT));
final List instances = discoveryClient.getInstances("endpoint");
@@ -115,7 +115,7 @@ public class KubernetesDiscoveryClientTest {
60, false, null, Set.of(), labels, "http_tcp", Metadata.DEFAULT, 0, true);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List instances = discoveryClient.getInstances("endpoint");
@@ -137,7 +137,7 @@ public class KubernetesDiscoveryClientTest {
mockClient.endpoints().inNamespace("test").resource(endPoint).create();
final KubernetesDiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient,
- KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services,
+ KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services, null,
new ServicePortSecureResolver(KubernetesDiscoveryProperties.DEFAULT));
final List result_endpoints = discoveryClient.getEndPointsList("endpoint");
@@ -164,7 +164,7 @@ public class KubernetesDiscoveryClientTest {
60, false, null, Set.of(), Map.of(), null, KubernetesDiscoveryProperties.Metadata.DEFAULT, 0, false);
final KubernetesDiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List result_endpoints = discoveryClient.getEndPointsList("endpoint");
@@ -194,7 +194,7 @@ public class KubernetesDiscoveryClientTest {
KubernetesDiscoveryProperties.Metadata.DEFAULT, 0, false);
final KubernetesDiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List result_endpoints = discoveryClient.getEndPointsList("endpoint");
@@ -226,7 +226,7 @@ public class KubernetesDiscoveryClientTest {
60, false, null, Set.of(443, 8443), labels, null, metadata, 0, true);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List instances = discoveryClient.getInstances("endpoint");
@@ -254,7 +254,7 @@ public class KubernetesDiscoveryClientTest {
mockClient.services().inNamespace("test").resource(service3).create();
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient,
- KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services,
+ KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services, null,
new ServicePortSecureResolver(KubernetesDiscoveryProperties.DEFAULT));
final List services = discoveryClient.getServices();
@@ -280,7 +280,7 @@ public class KubernetesDiscoveryClientTest {
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient,
KubernetesDiscoveryProperties.DEFAULT,
- client -> client.services().withLabels(Collections.singletonMap("label", "value")),
+ client -> client.services().withLabels(Collections.singletonMap("label", "value")), null,
new ServicePortSecureResolver(KubernetesDiscoveryProperties.DEFAULT));
final List services = discoveryClient.getServices();
@@ -313,7 +313,7 @@ public class KubernetesDiscoveryClientTest {
KubernetesDiscoveryProperties.Metadata.DEFAULT, 0, false);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List services = discoveryClient.getServices();
@@ -346,7 +346,7 @@ public class KubernetesDiscoveryClientTest {
60, false, null, Set.of(), Map.of(), null, Metadata.DEFAULT, 0, true);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List instances = discoveryClient.getInstances("endpoint");
@@ -369,7 +369,7 @@ public class KubernetesDiscoveryClientTest {
mockClient.endpoints().inNamespace("test").resource(endPoint).create();
final KubernetesDiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient,
- KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services,
+ KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services, null,
new ServicePortSecureResolver(KubernetesDiscoveryProperties.DEFAULT));
final List instances = discoveryClient.getInstances("endpoint1");
@@ -398,7 +398,7 @@ public class KubernetesDiscoveryClientTest {
60, false, null, Set.of(443, 8443), Map.of(), null, Metadata.DEFAULT, 0, true);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List instances = discoveryClient.getInstances("endpoint2");
@@ -429,7 +429,7 @@ public class KubernetesDiscoveryClientTest {
60, false, null, Set.of(443, 8443), Map.of(), null, Metadata.DEFAULT, 0, true);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List instances = discoveryClient.getInstances("endpoint3");
@@ -459,7 +459,7 @@ public class KubernetesDiscoveryClientTest {
60, false, null, Set.of(443, 8443), Map.of(), "oops", Metadata.DEFAULT, 0, true);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List instances = discoveryClient.getInstances("endpoint4");
@@ -488,7 +488,7 @@ public class KubernetesDiscoveryClientTest {
60, false, null, Set.of(443, 8443), Map.of(), null, Metadata.DEFAULT, 0, true);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List instances = discoveryClient.getInstances("endpoint5");
@@ -515,7 +515,7 @@ public class KubernetesDiscoveryClientTest {
mockClient.services().inNamespace("test").resource(service).create();
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient,
- KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services,
+ KubernetesDiscoveryProperties.DEFAULT, KubernetesClient::services, null,
new ServicePortSecureResolver(KubernetesDiscoveryProperties.DEFAULT));
final List instances = discoveryClient.getInstances("endpoint5");
@@ -545,7 +545,7 @@ public class KubernetesDiscoveryClientTest {
60, true, null, Set.of(443, 8443), Map.of(), null, Metadata.DEFAULT, 0, true);
final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties,
- KubernetesClient::services, new ServicePortSecureResolver(properties));
+ KubernetesClient::services, null, new ServicePortSecureResolver(properties));
final List instances = discoveryClient.getInstances("endpoint5");