Fabric8 discovery cleanup 5 (#1218)

This commit is contained in:
erabii
2023-02-09 21:46:46 +02:00
committed by GitHub
parent 0abbdefba0
commit fe50304968

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2019 the original author or authors.
* Copyright 2013-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@
package org.springframework.cloud.kubernetes.client.discovery;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@@ -29,12 +28,8 @@ import io.kubernetes.client.openapi.models.V1EndpointSubset;
import io.kubernetes.client.openapi.models.V1Endpoints;
import io.kubernetes.client.openapi.models.V1ObjectMeta;
import io.kubernetes.client.openapi.models.V1Service;
import io.kubernetes.client.openapi.models.V1ServiceSpec;
import io.kubernetes.client.openapi.models.V1ServiceStatus;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance;
@@ -42,404 +37,313 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscover
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(MockitoJUnitRunner.class)
public class KubernetesInformerDiscoveryClientTests {
class KubernetesInformerDiscoveryClientTests {
@Mock
private SharedInformerFactory sharedInformerFactory;
private static final V1Service SERVICE_1 = service("test-svc-1", "namespace1", Map.of());
private static final V1Service testService1 = new V1Service()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
private static final V1Service SERVICE_2 = service("test-svc-1", "namespace2", Map.of());
private static final V1Service testServiceSecuredAnnotation1 = new V1Service()
.metadata(
new V1ObjectMeta().name("test-svc-1").namespace("namespace1").putAnnotationsItem("secured", "true"))
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
private static final V1Service SERVICE_3 = service("test-svc-3", "namespace1",
Map.of("spring", "true", "k8s", "true"));
private static final V1Service testServiceSecuredLabel1 = new V1Service()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1").putLabelsItem("secured", "true"))
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
private static final V1Service SERVICE_4 = service("test-svc-1", "namespace1", Map.of("secured", "true"));
private static final V1Service testService2 = new V1Service()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace2"))
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
private static final V1Service SERVICE_5 = service("test-svc-1", "namespace1", Map.of("primary-port-name", "oops"));
private static final V1Service testService3 = new V1Service()
.metadata(new V1ObjectMeta().name("test-svc-3").namespace("namespace1").putLabelsItem("spring", "true")
.putLabelsItem("k8s", "true"))
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
private static final V1Service SERVICE_6 = service("test-svc-1", "namespace1",
Map.of("primary-port-name", "https"));
private static final V1Endpoints testEndpoints1 = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().port(8080))
.addAddressesItem(new V1EndpointAddress().ip("2.2.2.2")));
private static final SharedInformerFactory SHARED_INFORMER_FACTORY = Mockito.mock(SharedInformerFactory.class);
private static final V1Endpoints testEndpoints2 = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace2"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().port(8080))
.addAddressesItem(new V1EndpointAddress().ip("2.2.2.2")));
private static final V1Endpoints ENDPOINTS_1 = endpointsReadyAddress("test-svc-1", "namespace1");
private static final V1Endpoints testEndpointWithoutReadyAddresses = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().port(8080))
.addNotReadyAddressesItem(new V1EndpointAddress().ip("2.2.2.2")));
private static final V1Endpoints ENDPOINTS_2 = endpointsReadyAddress("test-svc-1", "namespace2");
private static final V1Endpoints testEndpointWithoutPorts = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
private static final V1Endpoints ENDPOINTS_3 = endpointsReadyAddress("test-svc-3", "namespace1");
private static final V1Endpoints testEndpointWithUnsetPortName = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().port(80))
.addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
private static final V1Endpoints ENDPOINTS_NOT_READY_ADDRESS = endpointsNotReadyAddress();
private static final V1Endpoints testEndpointWithMultiplePorts = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().name("http").port(80))
.addPortsItem(new CoreV1EndpointPort().name("https").port(443))
.addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
private static final V1Endpoints ENDPOINTS_NO_PORTS = endpointsNoPorts();
private static final V1Endpoints testEndpointWithMultiplePortsWithoutHttps = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().name("http").port(80))
.addPortsItem(new CoreV1EndpointPort().name("tcp").port(443))
.addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
private static final V1Endpoints ENDPOINTS_NO_UNSET_PORT_NAME = endpointsNoUnsetPortName();
private static final V1Endpoints testEndpointWithMultiplePortsWithoutSupportedPortNames = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().name("tcp1").port(80))
.addPortsItem(new CoreV1EndpointPort().name("tcp2").port(443))
.addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
private static final V1Endpoints ENDPOINTS_WITH = endpointsWithMultiplePorts();
private static final V1Endpoints testEndpoints3 = new V1Endpoints()
.metadata(new V1ObjectMeta().name("test-svc-3").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().port(8080))
.addAddressesItem(new V1EndpointAddress().ip("2.2.2.2")));
private static final V1Endpoints ENDPOINTS_WITH_MULTIPLE_PORTS_NO_HTTPS = endpointsWithMultiplePortsNoHttps();
private static final V1Endpoints ENDPOINTS_MULTIPLE_PORTS_WITHOUT_SUPPORTED_PORT_NAMES = endpointsMultiplePortsWithoutSupportedPortNames();
private static final KubernetesDiscoveryProperties ALL_NAMESPACES = properties(true, Map.of());
private static final KubernetesDiscoveryProperties NOT_ALL_NAMESPACES = properties(false, Map.of());
@Test
public void testServiceWithUnsetPortNames() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointWithUnsetPortName);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, true,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null,
KubernetesDiscoveryProperties.Metadata.DEFAULT, 0, true);
void testServiceWithUnsetPortNames() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_NO_UNSET_PORT_NAME);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, ALL_NAMESPACES);
Map<String, String> ports = new HashMap<>();
ports.put("<unset>", "80");
assertThat(discoveryClient.getInstances("test-svc-1").toArray())
.containsOnly(new DefaultKubernetesServiceInstance("", "test-svc-1", "1.1.1.1", 80, ports, false,
"namespace1", null));
.containsOnly(new DefaultKubernetesServiceInstance("", "test-svc-1", "1.1.1.1", 80,
Map.of("<unset>", "80"), false, "namespace1", null));
}
@Test
public void testDiscoveryGetServicesAllNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2);
void testDiscoveryGetServicesAllNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1, SERVICE_2);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("",
sharedInformerFactory, serviceLister, null, null, null, KubernetesDiscoveryProperties.DEFAULT);
SHARED_INFORMER_FACTORY, serviceLister, null, null, null, KubernetesDiscoveryProperties.DEFAULT);
assertThat(discoveryClient.getServices().toArray()).containsOnly(testService1.getMetadata().getName(),
testService2.getMetadata().getName());
assertThat(discoveryClient.getServices().toArray()).containsOnly(SERVICE_1.getMetadata().getName(),
SERVICE_2.getMetadata().getName());
}
@Test
public void testDiscoveryWithServiceLabels() {
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2, testService3);
void testDiscoveryWithServiceLabels() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1, SERVICE_2, SERVICE_3);
Map<String, String> labels = new HashMap<>();
labels.put("k8s", "true");
labels.put("spring", "true");
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, true,
Set.of(), true, 60, false, null, Set.of(), labels, null, null, 0, true);
Map<String, String> labels = Map.of("k8s", "true", "spring", "true");
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = properties(true, labels);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("",
sharedInformerFactory, serviceLister, null, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, null, null, null, kubernetesDiscoveryProperties);
assertThat(discoveryClient.getServices().toArray()).containsOnly(testService3.getMetadata().getName());
assertThat(discoveryClient.getServices().toArray()).containsOnly(SERVICE_3.getMetadata().getName());
}
@Test
public void testDiscoveryInstancesWithServiceLabels() {
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2, testService3);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpoints1, testEndpoints3);
void testDiscoveryInstancesWithServiceLabels() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1, SERVICE_2, SERVICE_3);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_1, ENDPOINTS_3);
Map<String, String> labels = new HashMap<>();
labels.put("k8s", "true");
labels.put("spring", "true");
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, true,
Set.of(), true, 60, false, null, Set.of(), labels, null, null, 0, true);
Map<String, String> labels = Map.of("k8s", "true", "spring", "true");
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = properties(true, labels);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
assertThat(discoveryClient.getInstances("test-svc-1").toArray()).isEmpty();
assertThat(discoveryClient.getInstances("test-svc-3").toArray())
.containsOnly(new DefaultKubernetesServiceInstance("", "test-svc-3", "2.2.2.2", 8080, new HashMap<>(),
false, "namespace1", null));
.containsOnly(new DefaultKubernetesServiceInstance("", "test-svc-3", "2.2.2.2", 8080,
Map.of("spring", "true", "<unset>", "8080", "k8s", "true"), false, "namespace1", null));
}
@Test
public void testDiscoveryInstancesWithSecuredServiceByAnnotations() {
Lister<V1Service> serviceLister = setupServiceLister(testServiceSecuredAnnotation1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpoints1);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, true,
Set.of(), true, 60, false, null, Set.of(), new HashMap<>(), null, null, 0, false);
void testDiscoveryInstancesWithSecuredServiceByAnnotations() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_4);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_1);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
assertThat(discoveryClient.getServices().toArray())
.containsOnly(testServiceSecuredAnnotation1.getMetadata().getName());
ServiceInstance serviceInstance = discoveryClient
.getInstances(testServiceSecuredAnnotation1.getMetadata().getName()).get(0);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, ALL_NAMESPACES);
assertThat(discoveryClient.getServices().toArray()).containsOnly(SERVICE_4.getMetadata().getName());
ServiceInstance serviceInstance = discoveryClient.getInstances(SERVICE_4.getMetadata().getName()).get(0);
assertThat(serviceInstance.isSecure()).isTrue();
}
@Test
public void testDiscoveryInstancesWithSecuredServiceByLabels() {
Lister<V1Service> serviceLister = setupServiceLister(testServiceSecuredLabel1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpoints1);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, true,
Set.of(), true, 60, false, null, Set.of(), new HashMap<>(), null, null, 0, false);
void testDiscoveryInstancesWithSecuredServiceByLabels() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_4);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_1);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, ALL_NAMESPACES);
assertThat(discoveryClient.getServices().toArray())
.containsOnly(testServiceSecuredLabel1.getMetadata().getName());
ServiceInstance serviceInstance = discoveryClient.getInstances(testServiceSecuredLabel1.getMetadata().getName())
.get(0);
assertThat(discoveryClient.getServices().toArray()).containsOnly(SERVICE_4.getMetadata().getName());
ServiceInstance serviceInstance = discoveryClient.getInstances(SERVICE_4.getMetadata().getName()).get(0);
assertThat(serviceInstance.isSecure()).isTrue();
}
@Test
public void testDiscoveryGetServicesOneNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2);
void testDiscoveryGetServicesOneNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1, SERVICE_2);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, null, null, null, KubernetesDiscoveryProperties.DEFAULT);
SHARED_INFORMER_FACTORY, serviceLister, null, null, null, KubernetesDiscoveryProperties.DEFAULT);
assertThat(discoveryClient.getServices().toArray()).containsOnly(testService1.getMetadata().getName());
assertThat(discoveryClient.getServices().toArray()).containsOnly(SERVICE_1.getMetadata().getName());
}
@Test
public void testDiscoveryGetInstanceAllNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpoints1);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, true,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null, null, 0, true);
void testDiscoveryGetInstanceAllNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1, SERVICE_2);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_1);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "2.2.2.2", 8080, new HashMap<>(), false, "namespace1", null));
"test-svc-1", "2.2.2.2", 8080, Map.of("<unset>", "8080"), false, "namespace1", null));
}
@Test
public void testDiscoveryGetInstanceOneNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpoints1);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null, null, 0, true);
void testDiscoveryGetInstanceOneNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1, SERVICE_2);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_1);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, NOT_ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "2.2.2.2", 8080, new HashMap<>(), false, "namespace1", null));
"test-svc-1", "2.2.2.2", 8080, Map.of("<unset>", "8080"), false, "namespace1", null));
}
@Test
public void testDiscoveryGetInstanceWithoutReadyAddressesShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointWithoutReadyAddresses);
void testDiscoveryGetInstanceWithoutReadyAddressesShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_NOT_READY_ADDRESS);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null,
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null,
KubernetesDiscoveryProperties.DEFAULT);
assertThat(discoveryClient.getInstances("test-svc-1")).isEmpty();
}
@Test
public void testDiscoveryGetInstanceWithNotReadyAddressesIncludedShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointWithoutReadyAddresses);
void testDiscoveryGetInstanceWithNotReadyAddressesIncludedShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_NOT_READY_ADDRESS);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, true, null, Set.of(), Map.of(), null, null, 0, true);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "2.2.2.2", 8080, new HashMap<>(), false, "namespace1", null));
"test-svc-1", "2.2.2.2", 8080, Map.of(), false, "namespace1", null));
}
@Test
public void instanceWithoutEndpointsShouldBeSkipped() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
void instanceWithoutEndpointsShouldBeSkipped() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister();
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null,
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null,
KubernetesDiscoveryProperties.DEFAULT);
assertThat(discoveryClient.getInstances("test-svc-1")).isEmpty();
}
@Test
public void instanceWithoutPortsShouldBeSkipped() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointWithoutPorts);
void instanceWithoutPortsShouldBeSkipped() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_NO_PORTS);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null,
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null,
KubernetesDiscoveryProperties.DEFAULT);
assertThat(discoveryClient.getInstances("test-svc-1")).isEmpty();
}
@Test
public void instanceWithMultiplePortsAndPrimaryPortNameConfiguredWithLabelShouldWork() {
V1ObjectMeta oldMetadata = testService1.getMetadata();
Lister<V1Service> serviceLister = setupServiceLister(testService1.metadata(new V1ObjectMeta().name("test-svc-1")
.namespace("namespace1").putLabelsItem("primary-port-name", "https")));
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointWithMultiplePorts);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null, null, 0, true);
void instanceWithMultiplePortsAndPrimaryPortNameConfiguredWithLabelShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_6);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_WITH);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, NOT_ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "1.1.1.1", 443, new HashMap<>(), false, "namespace1", null));
testService1.metadata(oldMetadata);
assertThat(discoveryClient.getInstances("test-svc-1"))
.containsOnly(new DefaultKubernetesServiceInstance("", "test-svc-1", "1.1.1.1", 443,
Map.of("http", "80", "primary-port-name", "https", "https", "443"), false, "namespace1", null));
}
@Test
public void instanceWithMultiplePortsAndMisconfiguredPrimaryPortNameInLabelShouldReturnFirstPortAndLogWarning() {
V1ObjectMeta oldMetadata = testService1.getMetadata();
Lister<V1Service> serviceLister = setupServiceLister(testService1.metadata(new V1ObjectMeta().name("test-svc-1")
.namespace("namespace1").putLabelsItem("primary-port-name", "oops")));
void instanceWithMultiplePortsAndMisconfiguredPrimaryPortNameInLabelShouldReturnFirstPortAndLogWarning() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_5);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(
testEndpointWithMultiplePortsWithoutSupportedPortNames);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null, null, 0, true);
ENDPOINTS_MULTIPLE_PORTS_WITHOUT_SUPPORTED_PORT_NAMES);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, NOT_ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "1.1.1.1", 80, new HashMap<>(), false, "namespace1", null));
testService1.metadata(oldMetadata);
assertThat(discoveryClient.getInstances("test-svc-1"))
.containsOnly(new DefaultKubernetesServiceInstance("", "test-svc-1", "1.1.1.1", 80,
Map.of("tcp1", "80", "primary-port-name", "oops", "tcp2", "443"), false, "namespace1", null));
}
@Test
public void instanceWithMultiplePortsAndGenericPrimaryPortNameConfiguredShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointWithMultiplePorts);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, false, null, Set.of(), Map.of(), "https", null, 0, true);
void instanceWithMultiplePortsAndGenericPrimaryPortNameConfiguredShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_WITH);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, NOT_ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "1.1.1.1", 443, new HashMap<>(), false, "namespace1", null));
"test-svc-1", "1.1.1.1", 443, Map.of("http", "80", "https", "443"), false, "namespace1", null));
}
@Test
public void instanceWithMultiplePortsAndMisconfiguredGenericPrimaryPortNameShouldReturnFirstPortAndLogWarning() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
void instanceWithMultiplePortsAndMisconfiguredGenericPrimaryPortNameShouldReturnFirstPortAndLogWarning() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(
testEndpointWithMultiplePortsWithoutSupportedPortNames);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, false, null, Set.of(), Map.of(), "oops", null, 0, true);
ENDPOINTS_MULTIPLE_PORTS_WITHOUT_SUPPORTED_PORT_NAMES);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, NOT_ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "1.1.1.1", 80, new HashMap<>(), false, "namespace1", null));
"test-svc-1", "1.1.1.1", 80, Map.of("tcp1", "80", "tcp2", "443"), false, "namespace1", null));
}
@Test
public void instanceWithMultiplePortsAndWithoutPrimaryPortNameSpecifiedShouldFallBackToHttpsPort() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointWithMultiplePorts);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null, null, 0, true);
void instanceWithMultiplePortsAndWithoutPrimaryPortNameSpecifiedShouldFallBackToHttpsPort() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_WITH);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, NOT_ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "1.1.1.1", 443, new HashMap<>(), false, "namespace1", null));
"test-svc-1", "1.1.1.1", 443, Map.of("http", "80", "https", "443"), false, "namespace1", null));
}
@Test
public void instanceWithMultiplePortsAndWithoutPrimaryPortNameSpecifiedOrHttpsPortShouldFallBackToHttpPort() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpointWithMultiplePortsWithoutHttps);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null, null, 0, true);
void instanceWithMultiplePortsAndWithoutPrimaryPortNameSpecifiedOrHttpsPortShouldFallBackToHttpPort() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_WITH_MULTIPLE_PORTS_NO_HTTPS);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, NOT_ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "1.1.1.1", 80, new HashMap<>(), false, "namespace1", null));
"test-svc-1", "1.1.1.1", 80, Map.of("http", "80", "tcp", "443"), false, "namespace1", null));
}
@Test
public void instanceWithMultiplePortsAndWithoutAnyConfigurationShouldPickTheFirstPort() {
Lister<V1Service> serviceLister = setupServiceLister(testService1);
void instanceWithMultiplePortsAndWithoutAnyConfigurationShouldPickTheFirstPort() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(
testEndpointWithMultiplePortsWithoutSupportedPortNames);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, false,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null, null, 0, true);
ENDPOINTS_MULTIPLE_PORTS_WITHOUT_SUPPORTED_PORT_NAMES);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, NOT_ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(new DefaultKubernetesServiceInstance("",
"test-svc-1", "1.1.1.1", 80, new HashMap<>(), false, "namespace1", null));
"test-svc-1", "1.1.1.1", 80, Map.of("tcp1", "80", "tcp2", "443"), false, "namespace1", null));
}
@Test
public void getInstancesShouldReturnInstancesWithTheSameServiceIdFromNamespaces() {
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpoints1, testEndpoints2);
KubernetesDiscoveryProperties kubernetesDiscoveryProperties = new KubernetesDiscoveryProperties(true, true,
Set.of(), true, 60, false, null, Set.of(), Map.of(), null, null, 0, false);
void getInstancesShouldReturnInstancesWithTheSameServiceIdFromNamespaces() {
Lister<V1Service> serviceLister = setupServiceLister(SERVICE_1, SERVICE_2);
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(ENDPOINTS_1, ENDPOINTS_2);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient(null,
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, ALL_NAMESPACES);
assertThat(discoveryClient.getInstances("test-svc-1")).containsOnly(
new DefaultKubernetesServiceInstance("", "test-svc-1", "2.2.2.2", 8080, new HashMap<>(), false,
"namespace1", null),
new DefaultKubernetesServiceInstance("", "test-svc-1", "2.2.2.2", 8080, new HashMap<>(), false,
"namespace2", null));
new DefaultKubernetesServiceInstance("", "test-svc-1", "2.2.2.2", 8080, Map.of("<unset>", "8080"),
false, "namespace1", null),
new DefaultKubernetesServiceInstance("", "test-svc-1", "2.2.2.2", 8080, Map.of("<unset>", "8080"),
false, "namespace2", null));
}
private Lister<V1Service> setupServiceLister(V1Service... services) {
@@ -460,4 +364,57 @@ public class KubernetesInformerDiscoveryClientTests {
return endpointsLister;
}
private static V1Service service(String name, String namespace, Map<String, String> labels) {
return new V1Service().metadata(new V1ObjectMeta().name(name).namespace(namespace).labels(labels));
}
private static V1Endpoints endpointsReadyAddress(String name, String namespace) {
return new V1Endpoints().metadata(new V1ObjectMeta().name(name).namespace(namespace))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().port(8080))
.addAddressesItem(new V1EndpointAddress().ip("2.2.2.2")));
}
private static V1Endpoints endpointsNotReadyAddress() {
return new V1Endpoints().metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().port(8080))
.addNotReadyAddressesItem(new V1EndpointAddress().ip("2.2.2.2")));
}
private static V1Endpoints endpointsNoPorts() {
return new V1Endpoints().metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
}
private static V1Endpoints endpointsNoUnsetPortName() {
return new V1Endpoints().metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().port(80))
.addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
}
private static V1Endpoints endpointsWithMultiplePorts() {
return new V1Endpoints().metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().name("http").port(80))
.addPortsItem(new CoreV1EndpointPort().name("https").port(443))
.addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
}
private static V1Endpoints endpointsWithMultiplePortsNoHttps() {
return new V1Endpoints().metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().name("http").port(80))
.addPortsItem(new CoreV1EndpointPort().name("tcp").port(443))
.addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
}
private static V1Endpoints endpointsMultiplePortsWithoutSupportedPortNames() {
return new V1Endpoints().metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.addSubsetsItem(new V1EndpointSubset().addPortsItem(new CoreV1EndpointPort().name("tcp1").port(80))
.addPortsItem(new CoreV1EndpointPort().name("tcp2").port(443))
.addAddressesItem(new V1EndpointAddress().ip("1.1.1.1")));
}
private static KubernetesDiscoveryProperties properties(boolean allNamespaces, Map<String, String> labels) {
return new KubernetesDiscoveryProperties(false, allNamespaces, Set.of(), true, 60, false, null, Set.of(),
labels, null, KubernetesDiscoveryProperties.Metadata.DEFAULT, 0, true);
}
}