Merge branch '2.1.x'

This commit is contained in:
Ryan Baxter
2022-12-05 17:47:39 -05:00
2 changed files with 59 additions and 1 deletions

View File

@@ -60,6 +60,10 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi
private static final Log log = LogFactory.getLog(KubernetesInformerDiscoveryClient.class);
private static final String PRIMARY_PORT_NAME_LABEL_KEY = "primary-port-name";
private static final String SECURED_KEY = "secured";
private final SharedInformerFactory sharedInformerFactory;
private final Lister<V1Service> serviceLister;
@@ -146,6 +150,8 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi
}
final String primaryPortName = discoveredPrimaryPortName.orElse(this.properties.primaryPortName());
final boolean secured = isSecured(service);
return ep.getSubsets().stream().filter(subset -> subset.getPorts() != null && subset.getPorts().size() > 0) // safeguard
.flatMap(subset -> {
Map<String, String> metadata = new HashMap<>(svcMetadata);
@@ -168,11 +174,22 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi
return addresses.stream()
.map(addr -> new DefaultKubernetesServiceInstance(
addr.getTargetRef() != null ? addr.getTargetRef().getUid() : "", serviceId,
addr.getIp(), port, metadata, false, service.getMetadata().getNamespace(),
addr.getIp(), port, metadata, secured, service.getMetadata().getNamespace(),
service.getMetadata().getClusterName()));
});
}
private static boolean isSecured(V1Service service) {
Optional<String> securedOpt = Optional.empty();
if (service.getMetadata() != null && service.getMetadata().getAnnotations() != null) {
securedOpt = Optional.ofNullable(service.getMetadata().getAnnotations().get(SECURED_KEY));
}
if (!securedOpt.isPresent() && service.getMetadata() != null && service.getMetadata().getLabels() != null) {
securedOpt = Optional.ofNullable(service.getMetadata().getLabels().get(SECURED_KEY));
}
return Boolean.parseBoolean(securedOpt.orElse("false"));
}
private int findEndpointPort(List<V1EndpointPort> endpointPorts, String primaryPortName, String serviceId) {
if (endpointPorts.size() == 1) {
return endpointPorts.get(0).getPort();

View File

@@ -36,6 +36,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
@@ -51,6 +52,15 @@ public class KubernetesInformerDiscoveryClientTests {
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
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 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 testService2 = new V1Service()
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace2"))
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
@@ -177,6 +187,37 @@ public class KubernetesInformerDiscoveryClientTests {
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);
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);
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);
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
assertThat(discoveryClient.getServices().toArray())
.containsOnly(testServiceSecuredLabel1.getMetadata().getName());
ServiceInstance serviceInstance = discoveryClient.getInstances(testServiceSecuredLabel1.getMetadata().getName())
.get(0);
assertThat(serviceInstance.isSecure()).isTrue();
}
@Test
public void testDiscoveryGetServicesOneNamespaceShouldWork() {
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2);