Fix potential NPEs in KubernetesDiscoveryClient.

This commit is contained in:
Ioannis Canellos
2016-04-05 13:03:02 +03:00
parent 0cde76dd40
commit 2f7fcb5c33
2 changed files with 21 additions and 15 deletions

View File

@@ -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<ServiceInstance> 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());

View File

@@ -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);
}
}