Catch NPE when subset has no ready adresses (#746)
This commit is contained in:
@@ -133,11 +133,11 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi
|
||||
.filter(p -> p.getName().equalsIgnoreCase(this.properties.getPrimaryPortName())).findFirst()
|
||||
.orElseThrow(IllegalStateException::new);
|
||||
List<V1EndpointAddress> addresses = subset.getAddresses();
|
||||
if (addresses == null) {
|
||||
addresses = new ArrayList<>();
|
||||
}
|
||||
if (this.properties.isIncludeNotReadyAddresses()
|
||||
&& !CollectionUtils.isEmpty(subset.getNotReadyAddresses())) {
|
||||
if (addresses == null) {
|
||||
addresses = new ArrayList<>();
|
||||
}
|
||||
addresses.addAll(subset.getNotReadyAddresses());
|
||||
}
|
||||
|
||||
|
||||
@@ -64,6 +64,15 @@ public class KubernetesInformerDiscoveryClientTests {
|
||||
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new V1EndpointPort().port(8080))
|
||||
.addAddressesItem(new V1EndpointAddress().ip("2.2.2.2")));
|
||||
|
||||
private static final V1Service testServiceWithoutReadyAddresses = new V1Service()
|
||||
.metadata(new V1ObjectMeta().name("test-svc-without-ready-addresses").namespace("namespace1"))
|
||||
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
|
||||
|
||||
private static final V1Endpoints testEndpointsWithoutReadyAddresses = new V1Endpoints()
|
||||
.metadata(new V1ObjectMeta().name("test-svc-without-ready-addresses").namespace("namespace1"))
|
||||
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new V1EndpointPort().port(8080))
|
||||
.addNotReadyAddressesItem(new V1EndpointAddress().ip("2.2.2.2")));
|
||||
|
||||
@Test
|
||||
public void testDiscoveryGetServicesAllNamespaceShouldWork() {
|
||||
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2);
|
||||
@@ -124,6 +133,38 @@ public class KubernetesInformerDiscoveryClientTests {
|
||||
verify(kubernetesDiscoveryProperties, times(1)).isAllNamespaces();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDiscoveryGetInstanceWithoutReadyAddressesShouldWork() {
|
||||
Lister<V1Service> serviceLister = setupServiceLister(testServiceWithoutReadyAddresses);
|
||||
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointsWithoutReadyAddresses);
|
||||
|
||||
when(kubernetesDiscoveryProperties.isAllNamespaces()).thenReturn(false);
|
||||
|
||||
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
|
||||
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
|
||||
|
||||
assertThat(discoveryClient.getInstances("test-svc-without-ready-addresses")).isEmpty();
|
||||
verify(kubernetesDiscoveryProperties, times(1)).isAllNamespaces();
|
||||
verify(kubernetesDiscoveryProperties, times(1)).isIncludeNotReadyAddresses();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDiscoveryGetInstanceWithNotReadyAddressesIncludedShouldWork() {
|
||||
Lister<V1Service> serviceLister = setupServiceLister(testServiceWithoutReadyAddresses);
|
||||
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointsWithoutReadyAddresses);
|
||||
|
||||
when(kubernetesDiscoveryProperties.isAllNamespaces()).thenReturn(false);
|
||||
when(kubernetesDiscoveryProperties.isIncludeNotReadyAddresses()).thenReturn(true);
|
||||
|
||||
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
|
||||
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
|
||||
|
||||
assertThat(discoveryClient.getInstances("test-svc-without-ready-addresses"))
|
||||
.containsOnly(new KubernetesServiceInstance("", "test-svc-without-ready-addresses", "2.2.2.2", 8080, new HashMap<>(), false));
|
||||
verify(kubernetesDiscoveryProperties, times(1)).isAllNamespaces();
|
||||
verify(kubernetesDiscoveryProperties, times(1)).isIncludeNotReadyAddresses();
|
||||
}
|
||||
|
||||
private Lister<V1Service> setupServiceLister(V1Service... services) {
|
||||
Cache<V1Service> serviceCache = new Cache<>();
|
||||
Lister<V1Service> serviceLister = new Lister<>(serviceCache);
|
||||
|
||||
Reference in New Issue
Block a user