From a368f05a3dfc0cb959ff31df81b6a3936646e2e2 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 29 Nov 2022 15:17:40 +0000 Subject: [PATCH 1/3] Bumping versions --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0262314f..374b3c73 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ 3.1.6-SNAPSHOT 3.1.6-SNAPSHOT - 3.1.2 + 3.1.3-SNAPSHOT 3.1.6-SNAPSHOT From f293d06600b81c6fd7d7a64ec5be3b5850fc9317 Mon Sep 17 00:00:00 2001 From: fgapito <70958010+fgapito@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:04:36 +0100 Subject: [PATCH 2/3] added support for secured k8s service annotations and labels (v. 2.1.x) (#1151) --- .../KubernetesInformerDiscoveryClient.java | 17 +++++++- ...ubernetesInformerDiscoveryClientTests.java | 39 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java index 9f14c458..107853cd 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java @@ -56,6 +56,8 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi private static final String PRIMARY_PORT_NAME_LABEL_KEY = "primary-port-name"; + private static final String SECURED_KEY = "secured"; + private static final String HTTPS_PORT_NAME = "https"; private static final String HTTP_PORT_NAME = "http"; @@ -145,6 +147,8 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi } final String primaryPortName = discoveredPrimaryPortName.orElse(this.properties.getPrimaryPortName()); + final boolean secured = isSecured(service); + return ep.getSubsets().stream().filter(subset -> subset.getPorts() != null && subset.getPorts().size() > 0) // safeguard .flatMap(subset -> { Map metadata = new HashMap<>(svcMetadata); @@ -167,11 +171,22 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi return addresses.stream() .map(addr -> new KubernetesServiceInstance( addr.getTargetRef() != null ? addr.getTargetRef().getUid() : "", serviceId, - addr.getIp(), port, metadata, false, service.getMetadata().getNamespace(), + addr.getIp(), port, metadata, secured, service.getMetadata().getNamespace(), service.getMetadata().getClusterName())); }).collect(Collectors.toList()); } + private static boolean isSecured(V1Service service) { + Optional securedOpt = Optional.empty(); + if (service.getMetadata() != null && service.getMetadata().getAnnotations() != null) { + securedOpt = Optional.ofNullable(service.getMetadata().getAnnotations().get(SECURED_KEY)); + } + if (securedOpt.isEmpty() && service.getMetadata() != null && service.getMetadata().getLabels() != null) { + securedOpt = Optional.ofNullable(service.getMetadata().getLabels().get(SECURED_KEY)); + } + return Boolean.parseBoolean(securedOpt.orElse("false")); + } + private int findEndpointPort(List endpointPorts, String primaryPortName, String serviceId) { if (endpointPorts.size() == 1) { return endpointPorts.get(0).getPort(); diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClientTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClientTests.java index 18a1e4ab..d2db62d2 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClientTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClientTests.java @@ -35,6 +35,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; @@ -56,6 +57,15 @@ public class KubernetesInformerDiscoveryClientTests { .metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1")) .spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus()); + private static final V1Service testServiceSecuredAnnotation1 = new V1Service() + .metadata( + new V1ObjectMeta().name("test-svc-1").namespace("namespace1").putAnnotationsItem("secured", "true")) + .spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus()); + + private static final V1Service testServiceSecuredLabel1 = new V1Service() + .metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1").putLabelsItem("secured", "true")) + .spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus()); + private static final V1Service testService2 = new V1Service() .metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace2")) .spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus()); @@ -177,6 +187,35 @@ public class KubernetesInformerDiscoveryClientTests { "test-svc-3", "2.2.2.2", 8080, new HashMap<>(), false, "namespace1", null)); } + @Test + public void testDiscoveryInstancesWithSecuredServiceByAnnotations() { + Lister serviceLister = setupServiceLister(testServiceSecuredAnnotation1); + Lister endpointsLister = setupEndpointsLister(testEndpoints1); + when(kubernetesDiscoveryProperties.getMetadata()).thenReturn(new KubernetesDiscoveryProperties.Metadata()); + KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1", + sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties); + assertThat(discoveryClient.getServices().toArray()) + .containsOnly(testServiceSecuredAnnotation1.getMetadata().getName()); + ServiceInstance serviceInstance = discoveryClient + .getInstances(testServiceSecuredAnnotation1.getMetadata().getName()).get(0); + assertThat(serviceInstance.isSecure()).isTrue(); + } + + @Test + public void testDiscoveryInstancesWithSecuredServiceByLabels() { + Lister serviceLister = setupServiceLister(testServiceSecuredLabel1); + Lister endpointsLister = setupEndpointsLister(testEndpoints1); + when(kubernetesDiscoveryProperties.getMetadata()).thenReturn(new KubernetesDiscoveryProperties.Metadata()); + KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1", + sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties); + + assertThat(discoveryClient.getServices().toArray()) + .containsOnly(testServiceSecuredLabel1.getMetadata().getName()); + ServiceInstance serviceInstance = discoveryClient.getInstances(testServiceSecuredLabel1.getMetadata().getName()) + .get(0); + assertThat(serviceInstance.isSecure()).isTrue(); + } + @Test public void testDiscoveryGetServicesOneNamespaceShouldWork() { Lister serviceLister = setupServiceLister(testService1, testService2); From 2e93b694cd1b2c7d17d7296651d61f2ab73f5817 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 5 Dec 2022 10:44:32 -0500 Subject: [PATCH 3/3] use isPresent for Java 8 compatibility --- .../client/discovery/KubernetesInformerDiscoveryClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java index 107853cd..0e73586b 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java @@ -181,7 +181,7 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi if (service.getMetadata() != null && service.getMetadata().getAnnotations() != null) { securedOpt = Optional.ofNullable(service.getMetadata().getAnnotations().get(SECURED_KEY)); } - if (securedOpt.isEmpty() && service.getMetadata() != null && service.getMetadata().getLabels() != null) { + if (!securedOpt.isPresent() && service.getMetadata() != null && service.getMetadata().getLabels() != null) { securedOpt = Optional.ofNullable(service.getMetadata().getLabels().get(SECURED_KEY)); } return Boolean.parseBoolean(securedOpt.orElse("false"));