endpointNames = result.stream().map(EndpointNameAndNamespace::endpointName).toList();
+ assertThat(endpointNames.get(0)).contains("service-wiremock-deployment");
+ assertThat(endpointNames.get(1)).contains("service-wiremock-deployment");
+ }
+
+}
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/java/org/springframework/cloud/kubernetes/discoveryclient/it/DiscoveryServerClientIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/java/org/springframework/cloud/kubernetes/discoveryclient/it/DiscoveryServerClientIT.java
new file mode 100644
index 0000000000..ab3de7a6bb
--- /dev/null
+++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/java/org/springframework/cloud/kubernetes/discoveryclient/it/DiscoveryServerClientIT.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2013-2024 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.discoveryclient.it;
+
+import java.util.List;
+import java.util.Set;
+
+import io.kubernetes.client.openapi.ApiClient;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.boot.test.system.CapturedOutput;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
+import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance;
+import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
+import org.springframework.cloud.kubernetes.integration.tests.commons.Commons;
+import org.springframework.cloud.kubernetes.integration.tests.commons.Images;
+import org.springframework.cloud.kubernetes.integration.tests.commons.Phase;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.test.context.TestPropertySource;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author wind57
+ */
+@SpringBootTest(classes = { App.class, DiscoveryServerClientIT.TestConfig.class },
+ webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@TestPropertySource(properties = { "spring.main.cloud-platform=kubernetes",
+ "logging.level.org.springframework.cloud.kubernetes.discovery=debug",
+ "spring.cloud.kubernetes.discovery.catalogServicesWatchDelay=3000",
+ "spring.cloud.kubernetes.http.discovery.catalog.watcher.enabled=true" })
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+class DiscoveryServerClientIT extends DiscoveryServerClientBase {
+
+ @Autowired
+ private DiscoveryClient discoveryClient;
+
+ @Autowired
+ private ReactiveDiscoveryClient reactiveDiscoveryClient;
+
+ @Autowired
+ private HeartbeatListener heartbeatListener;
+
+ @BeforeAll
+ static void beforeAllLocal() throws Exception {
+ util.createNamespace(NAMESPACE_LEFT);
+ util.createNamespace(NAMESPACE_RIGHT);
+
+ Commons.validateImage(DISCOVERY_SERVER_APP_NAME, K3S);
+ Commons.loadSpringCloudKubernetesImage(DISCOVERY_SERVER_APP_NAME, K3S);
+ util.setUp(NAMESPACE);
+ serviceAccount(Phase.CREATE);
+ discoveryServer(Phase.CREATE);
+
+ Images.loadWiremock(K3S);
+ util.wiremock(NAMESPACE_LEFT, "/wiremock-" + NAMESPACE_LEFT, Phase.CREATE, false);
+ util.wiremock(NAMESPACE_RIGHT, "/wiremock-" + NAMESPACE_RIGHT, Phase.CREATE, false);
+ }
+
+ @AfterAll
+ static void afterAllLocal() {
+ serviceAccount(Phase.DELETE);
+ discoveryServer(Phase.DELETE);
+
+ util.wiremock(NAMESPACE_LEFT, "/wiremock-" + NAMESPACE_LEFT, Phase.DELETE, false);
+ util.wiremock(NAMESPACE_RIGHT, "/wiremock-" + NAMESPACE_RIGHT, Phase.DELETE, false);
+
+ util.deleteNamespace(NAMESPACE_LEFT);
+ util.deleteNamespace(NAMESPACE_RIGHT);
+ }
+
+ /**
+ *
+ * - searching is enabled in two namespaces : left and right
+ *
+ */
+ @Test
+ @Order(1)
+ void testBlocking(CapturedOutput output) {
+ List services = reactiveDiscoveryClient.getServices().collectList().block();
+ assertThat(services).hasSize(1);
+ assertThat(services).contains("service-wiremock");
+
+ List serviceInstances = reactiveDiscoveryClient.getInstances("service-wiremock")
+ .collectList()
+ .block();
+ List defaultKubernetesServiceInstances = serviceInstances.stream()
+ .map(x -> (DefaultKubernetesServiceInstance) x)
+ .toList();
+ assertThat(defaultKubernetesServiceInstances).hasSize(2);
+
+ List namespaces = defaultKubernetesServiceInstances.stream()
+ .map(DefaultKubernetesServiceInstance::getNamespace)
+ .toList();
+ assertThat(namespaces).containsExactlyInAnyOrder(NAMESPACE_LEFT, NAMESPACE_RIGHT);
+
+ testHeartBeat(heartbeatListener, output);
+ }
+
+ /**
+ *
+ * - searching is enabled in two namespaces : left and right
+ *
+ */
+ @Test
+ @Order(2)
+ void testReactive() {
+ List services = discoveryClient.getServices();
+ assertThat(services).hasSize(1);
+ assertThat(services).contains("service-wiremock");
+
+ List serviceInstances = discoveryClient.getInstances("service-wiremock");
+ List defaultKubernetesServiceInstances = serviceInstances.stream()
+ .map(x -> (DefaultKubernetesServiceInstance) x)
+ .toList();
+ assertThat(defaultKubernetesServiceInstances).hasSize(2);
+
+ List namespaces = defaultKubernetesServiceInstances.stream()
+ .map(DefaultKubernetesServiceInstance::getNamespace)
+ .toList();
+ assertThat(namespaces).containsExactlyInAnyOrder(NAMESPACE_LEFT, NAMESPACE_RIGHT);
+ }
+
+ @TestConfiguration
+ static class TestConfig {
+
+ @Bean
+ @Primary
+ ApiClient client() {
+ return apiClient();
+ }
+
+ @Bean
+ @Primary
+ KubernetesDiscoveryProperties kubernetesDiscoveryProperties() {
+ return discoveryProperties(Set.of(NAMESPACE_LEFT, NAMESPACE_RIGHT));
+ }
+
+ }
+
+}
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/client/spring-cloud-kubernetes-discoveryclient-it-deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/client/spring-cloud-kubernetes-discoveryclient-it-deployment.yaml
deleted file mode 100644
index 21ce9fd42b..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/client/spring-cloud-kubernetes-discoveryclient-it-deployment.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: spring-cloud-kubernetes-k8s-client-discovery-server-deployment
-spec:
- selector:
- matchLabels:
- app: spring-cloud-kubernetes-k8s-client-discovery-server
- template:
- metadata:
- labels:
- app: spring-cloud-kubernetes-k8s-client-discovery-server
- spec:
- serviceAccountName: spring-cloud-kubernetes-serviceaccount
- containers:
- - name: spring-cloud-kubernetes-k8s-client-discovery-server
- image: docker.io/springcloud/spring-cloud-kubernetes-k8s-client-discovery-server
- imagePullPolicy: IfNotPresent
- readinessProbe:
- httpGet:
- port: 8080
- path: /discoveryclient-it/actuator/health/readiness
- initialDelaySeconds: 10
- periodSeconds: 2
- failureThreshold: 3
- livenessProbe:
- httpGet:
- port: 8080
- path: /discoveryclient-it/actuator/health/liveness
- initialDelaySeconds: 10
- periodSeconds: 2
- failureThreshold: 3
- env:
- - name: SPRING_CLOUD_KUBERNETES_DISCOVERY_CATALOGSERVICESWATCHDELAY
- value: "3000"
- ports:
- - containerPort: 8080
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/client/spring-cloud-kubernetes-discoveryclient-it-service.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/client/spring-cloud-kubernetes-discoveryclient-it-service.yaml
deleted file mode 100644
index 306edf2ba0..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/client/spring-cloud-kubernetes-discoveryclient-it-service.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- labels:
- app: spring-cloud-kubernetes-k8s-client-discovery-server
- name: spring-cloud-kubernetes-k8s-client-discovery-server
-spec:
- ports:
- - name: http
- port: 8080
- targetPort: 8080
- selector:
- app: spring-cloud-kubernetes-k8s-client-discovery-server
- type: ClusterIP
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/ingress.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/ingress.yaml
deleted file mode 100644
index 9635d979b7..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/ingress.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
- name: it-ingress
- namespace: default
-spec:
- rules:
- - http:
- paths:
- - path: /discoveryclient-it
- pathType: Prefix
- backend:
- service:
- name: spring-cloud-kubernetes-k8s-client-discovery-server
- port:
- number: 8080
-
- - path: /
- pathType: Prefix
- backend:
- service:
- name: spring-cloud-kubernetes-discoveryserver
- port:
- number: 80
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/namespace-filter/cluster-admin-serviceaccount-role.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/manifests/cluster-role.yaml
similarity index 100%
rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/namespace-filter/cluster-admin-serviceaccount-role.yaml
rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/manifests/cluster-role.yaml
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/server/spring-cloud-kubernetes-discoveryserver-deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/manifests/discoveryserver-deployment.yaml
similarity index 72%
rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/server/spring-cloud-kubernetes-discoveryserver-deployment.yaml
rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/manifests/discoveryserver-deployment.yaml
index 522f92bae6..a0d46268d5 100644
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/server/spring-cloud-kubernetes-discoveryserver-deployment.yaml
+++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/manifests/discoveryserver-deployment.yaml
@@ -18,20 +18,28 @@ spec:
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
- port: 8761
+ port: 32321
path: /actuator/health/readiness
livenessProbe:
httpGet:
- port: 8761
+ port: 32321
path: /actuator/health/liveness
env:
- name: LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_DISCOVERYSERVER
value: "DEBUG"
- name: SPRING_CLOUD_KUBERNETES_DISCOVERY_CATALOGSERVICESWATCHDELAY
value: "3000"
+ - name: SPRING_CLOUD_KUBERNETES_HTTP_DISCOVERY_CATALOG_WATCHER_ENABLED
+ value: "TRUE"
- name: MANAGEMENT_ENDPOINT_HEALTH_SHOWCOMPONENTS
value: "ALWAYS"
- name: MANAGEMENT_ENDPOINT_HEALTH_SHOWDETAILS
value: "ALWAYS"
+ - name: SPRING_CLOUD_KUBERNETES_DISCOVERY_NAMESPACES_0
+ value: left
+ - name: SPRING_CLOUD_KUBERNETES_DISCOVERY_NAMESPACES_1
+ value: right
+ - name: SERVER_PORT
+ value: "32321"
ports:
- - containerPort: 8761
+ - containerPort: 32321
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/server/spring-cloud-kubernetes-discoveryserver-service.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/manifests/discoveryserver-service.yaml
similarity index 74%
rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/server/spring-cloud-kubernetes-discoveryserver-service.yaml
rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/manifests/discoveryserver-service.yaml
index ba99611826..430026b2ab 100644
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/server/spring-cloud-kubernetes-discoveryserver-service.yaml
+++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery-server/src/test/resources/manifests/discoveryserver-service.yaml
@@ -7,8 +7,9 @@ metadata:
spec:
ports:
- name: http
- port: 80
- targetPort: 8761
+ port: 32321
+ targetPort: 32321
+ nodePort: 32321
selector:
app: spring-cloud-kubernetes-discoveryserver
- type: ClusterIP
+ type: NodePort
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java
index cf609142ef..2f00f4f198 100644
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java
+++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java
@@ -28,7 +28,7 @@
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.web.server.LocalManagementPort;
-import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
import org.springframework.cloud.kubernetes.integration.tests.commons.Images;
import org.springframework.cloud.kubernetes.integration.tests.commons.Phase;
@@ -55,7 +55,7 @@ class KubernetesClientReactiveIT extends KubernetesClientDiscoveryBase {
private int port;
@Autowired
- private DiscoveryClient discoveryClient;
+ private ReactiveDiscoveryClient discoveryClient;
@BeforeEach
void beforeEach() {
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/TestAssertions.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/TestAssertions.java
index dd86ad7437..8c0a8c62d7 100644
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/TestAssertions.java
+++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/TestAssertions.java
@@ -24,6 +24,7 @@
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance;
import org.springframework.http.HttpMethod;
import org.springframework.web.reactive.function.client.WebClient;
@@ -137,4 +138,18 @@ static void assertPodMetadata(DiscoveryClient discoveryClient) {
}
+ static void assertPodMetadata(ReactiveDiscoveryClient discoveryClient) {
+
+ List serviceInstances = discoveryClient.getInstances("service-wiremock").collectList().block();
+ assertThat(serviceInstances).hasSize(1);
+ DefaultKubernetesServiceInstance wiremockInstance = (DefaultKubernetesServiceInstance) serviceInstances.get(0);
+
+ assertThat(wiremockInstance.getServiceId()).isEqualTo("service-wiremock");
+ assertThat(wiremockInstance.getInstanceId()).isNotNull();
+ assertThat(wiremockInstance.getHost()).isNotNull();
+ assertThat(wiremockInstance.getMetadata()).isEqualTo(Map.of("k8s_namespace", "default", "type", "ClusterIP",
+ "port.http", "8080", "app", "service-wiremock"));
+
+ }
+
}