incorrect services returned due to wrong label filtering (#1388)
This commit is contained in:
@@ -75,10 +75,10 @@ final class KubernetesDiscoveryClientUtils {
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG.debug(() -> "Service labels from properties : " + properties.serviceLabels());
|
||||
LOG.debug(() -> "Service labels from service : " + service.getMetadata().getLabels());
|
||||
LOG.debug(() -> "Service labels from properties : " + propertiesServiceLabels);
|
||||
LOG.debug(() -> "Service labels from service : " + serviceLabels);
|
||||
|
||||
return serviceLabels.keySet().containsAll(propertiesServiceLabels.keySet());
|
||||
return serviceLabels.entrySet().containsAll(propertiesServiceLabels.entrySet());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -132,10 +132,7 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient {
|
||||
|
||||
List<V1Service> services = serviceListers.stream().flatMap(x -> x.list().stream())
|
||||
.filter(scv -> scv.getMetadata() != null).filter(svc -> serviceId.equals(svc.getMetadata().getName()))
|
||||
.filter(filter).toList();
|
||||
if (services.size() == 0 || services.stream().noneMatch(service -> matchesServiceLabels(service, properties))) {
|
||||
return List.of();
|
||||
}
|
||||
.filter(scv -> matchesServiceLabels(scv, properties)).filter(filter).toList();
|
||||
return services.stream().flatMap(service -> getServiceInstanceDetails(service, serviceId)).toList();
|
||||
}
|
||||
|
||||
|
||||
@@ -448,6 +448,54 @@ class KubernetesInformerDiscoveryClientTests {
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
void testServicesWithDifferentMetadataLabels() {
|
||||
V1Service serviceA = service("serviceX", "namespaceA", Map.of("shape", "round"));
|
||||
V1Service serviceB = service("serviceX", "namespaceB", Map.of("shape", "triangle"));
|
||||
|
||||
V1Endpoints endpointsA = endpointsReadyAddress("serviceX", "namespaceA");
|
||||
V1Endpoints endpointsB = endpointsReadyAddress("serviceX", "namespaceB");
|
||||
|
||||
Lister<V1Service> serviceLister = setupServiceLister(serviceA, serviceB);
|
||||
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(endpointsA, endpointsB);
|
||||
|
||||
KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(false, true, Set.of(), true, 60L,
|
||||
false, null, Set.of(), Map.of("shape", "round"), null, KubernetesDiscoveryProperties.Metadata.DEFAULT,
|
||||
0, false);
|
||||
|
||||
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient(
|
||||
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, properties);
|
||||
|
||||
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("serviceX");
|
||||
assertThat(serviceInstances.size()).isEqualTo(1);
|
||||
assertThat(serviceInstances.get(0).getMetadata().get("k8s_namespace")).isEqualTo("namespaceA");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testServicesWithSameMetadataLabels() {
|
||||
V1Service serviceA = service("serviceX", "namespaceA", Map.of("shape", "round"));
|
||||
V1Service serviceB = service("serviceX", "namespaceB", Map.of("shape", "round"));
|
||||
|
||||
V1Endpoints endpointsA = endpointsReadyAddress("serviceX", "namespaceA");
|
||||
V1Endpoints endpointsB = endpointsReadyAddress("serviceX", "namespaceB");
|
||||
|
||||
Lister<V1Service> serviceLister = setupServiceLister(serviceA, serviceB);
|
||||
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(endpointsA, endpointsB);
|
||||
|
||||
KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(false, true, Set.of(), true, 60L,
|
||||
false, null, Set.of(), Map.of("shape", "round"), null, KubernetesDiscoveryProperties.Metadata.DEFAULT,
|
||||
0, false);
|
||||
|
||||
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient(
|
||||
SHARED_INFORMER_FACTORY, serviceLister, endpointsLister, null, null, properties);
|
||||
|
||||
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("serviceX").stream()
|
||||
.sorted(Comparator.comparing(x -> x.getMetadata().get("k8s_namespace"))).toList();
|
||||
assertThat(serviceInstances.size()).isEqualTo(2);
|
||||
assertThat(serviceInstances.get(0).getMetadata().get("k8s_namespace")).isEqualTo("namespaceA");
|
||||
assertThat(serviceInstances.get(1).getMetadata().get("k8s_namespace")).isEqualTo("namespaceB");
|
||||
}
|
||||
|
||||
private Lister<V1Service> setupServiceLister(V1Service... services) {
|
||||
Cache<V1Service> serviceCache = new Cache<>();
|
||||
Lister<V1Service> serviceLister = new Lister<>(serviceCache);
|
||||
|
||||
Reference in New Issue
Block a user