From 2f7fcb5c33b3d1a1cbb8ffe286ebb91b59f5dbf6 Mon Sep 17 00:00:00 2001 From: Ioannis Canellos Date: Tue, 5 Apr 2016 13:03:02 +0300 Subject: [PATCH] Fix potential NPEs in KubernetesDiscoveryClient. --- .../discovery/KubernetesDiscoveryClient.java | 33 +++++++++++-------- ...ubernetesDiscoveryClientConfiguration.java | 3 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/spring-cloud-kubernetes-discovery/src/main/java/io/fabric8/spring/cloud/discovery/KubernetesDiscoveryClient.java b/spring-cloud-kubernetes-discovery/src/main/java/io/fabric8/spring/cloud/discovery/KubernetesDiscoveryClient.java index 58fd2f75..a9b6dbea 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/io/fabric8/spring/cloud/discovery/KubernetesDiscoveryClient.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/io/fabric8/spring/cloud/discovery/KubernetesDiscoveryClient.java @@ -16,11 +16,16 @@ package io.fabric8.spring.cloud.discovery; +import io.fabric8.kubernetes.api.model.Endpoints; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.utils.Utils; +import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.util.Assert; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; public class KubernetesDiscoveryClient implements DiscoveryClient { @@ -28,11 +33,11 @@ public class KubernetesDiscoveryClient implements DiscoveryClient { private static final String HOSTNAME = "HOSTNAME"; private KubernetesClient client; - private String localServiceId; + private KubernetesDiscoveryProperties properties; - public KubernetesDiscoveryClient(KubernetesClient client, String localServiceId) { + public KubernetesDiscoveryClient(KubernetesClient client, KubernetesDiscoveryProperties properties) { this.client = client; - this.localServiceId = localServiceId; + this.properties = properties; } public KubernetesClient getClient() { @@ -43,14 +48,6 @@ public class KubernetesDiscoveryClient implements DiscoveryClient { this.client = client; } - public String getLocalServiceId() { - return localServiceId; - } - - public void setLocalServiceId(String localServiceId) { - this.localServiceId = localServiceId; - } - @Override public String description() { return "Kubernetes Discovery Client"; @@ -58,17 +55,25 @@ public class KubernetesDiscoveryClient implements DiscoveryClient { @Override public ServiceInstance getLocalServiceInstance() { + String serviceName = properties.getServiceName(); String podName = System.getenv(HOSTNAME); - return client.endpoints().withName(localServiceId).get().getSubsets() + + Endpoints endpoints = client.endpoints().withName(serviceName).get(); + if (Utils.isNullOrEmpty(podName) || endpoints == null) { + //TODO: Fallback to something more meaningful. + return new DefaultServiceInstance(serviceName, "localhost", 8080, false); + } + return endpoints.getSubsets() .stream() .filter(s -> s.getAddresses().iterator().next().getIp().equals(podName)) - .map(s -> new KubernetesServiceInstance(localServiceId, s.getPorts().iterator().next().getName(), s, false)) + .map(s -> new KubernetesServiceInstance(serviceName, s.getPorts().iterator().next().getName(), s, false)) .findFirst().get(); } @Override public List getInstances(String serviceId) { - return client.endpoints().withName(serviceId).get() + Assert.notNull(serviceId, "[Assertion failed] - the object argument must be null"); + return Optional.of(client.endpoints().withName(serviceId).get()).orElse(new Endpoints()) .getSubsets() .stream().map(s -> new KubernetesServiceInstance(serviceId, s.getPorts().iterator().next().getName(), s, false)) .collect(Collectors.toList()); diff --git a/spring-cloud-kubernetes-discovery/src/main/java/io/fabric8/spring/cloud/discovery/KubernetesDiscoveryClientConfiguration.java b/spring-cloud-kubernetes-discovery/src/main/java/io/fabric8/spring/cloud/discovery/KubernetesDiscoveryClientConfiguration.java index d9ac8591..e0d01fa1 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/io/fabric8/spring/cloud/discovery/KubernetesDiscoveryClientConfiguration.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/io/fabric8/spring/cloud/discovery/KubernetesDiscoveryClientConfiguration.java @@ -31,11 +31,12 @@ public class KubernetesDiscoveryClientConfiguration { @Bean @ConditionalOnMissingBean public KubernetesDiscoveryClient kubernetesDiscoveryClient(KubernetesClient client, KubernetesDiscoveryProperties properties) { - return new KubernetesDiscoveryClient(client, properties.getServiceName()); + return new KubernetesDiscoveryClient(client, properties); } @Bean public KubernetesDiscoveryLifecycle kubernetesDiscoveryLifecycle(KubernetesClient client, KubernetesDiscoveryProperties properties) { return new KubernetesDiscoveryLifecycle(client, properties); + } }