Fix potential NPEs in KubernetesDiscoveryClient.
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user