incorrect services returned due to wrong label filtering (#1388)

This commit is contained in:
erabii
2023-07-25 02:51:00 +03:00
committed by GitHub
parent 9b8872bfda
commit d520549884
3 changed files with 52 additions and 7 deletions

View File

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

View File

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

View File

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