Catch NPE when subset has no ready adresses (#746)

This commit is contained in:
Tim Ysewyn
2021-02-24 22:34:37 +01:00
committed by GitHub
parent 77fac841b2
commit 2b0d244be4
2 changed files with 44 additions and 3 deletions

View File

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

View File

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