Skip to content

Commit f293d06

Browse files
authored
added support for secured k8s service annotations and labels (v. 2.1.x) (#1151)
1 parent a368f05 commit f293d06

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ public class KubernetesInformerDiscoveryClient implements DiscoveryClient, Initi
5656

5757
private static final String PRIMARY_PORT_NAME_LABEL_KEY = "primary-port-name";
5858

59+
private static final String SECURED_KEY = "secured";
60+
5961
private static final String HTTPS_PORT_NAME = "https";
6062

6163
private static final String HTTP_PORT_NAME = "http";
@@ -145,6 +147,8 @@ public List<ServiceInstance> getInstances(String serviceId) {
145147
}
146148
final String primaryPortName = discoveredPrimaryPortName.orElse(this.properties.getPrimaryPortName());
147149

150+
final boolean secured = isSecured(service);
151+
148152
return ep.getSubsets().stream().filter(subset -> subset.getPorts() != null && subset.getPorts().size() > 0) // safeguard
149153
.flatMap(subset -> {
150154
Map<String, String> metadata = new HashMap<>(svcMetadata);
@@ -167,11 +171,22 @@ public List<ServiceInstance> getInstances(String serviceId) {
167171
return addresses.stream()
168172
.map(addr -> new KubernetesServiceInstance(
169173
addr.getTargetRef() != null ? addr.getTargetRef().getUid() : "", serviceId,
170-
addr.getIp(), port, metadata, false, service.getMetadata().getNamespace(),
174+
addr.getIp(), port, metadata, secured, service.getMetadata().getNamespace(),
171175
service.getMetadata().getClusterName()));
172176
}).collect(Collectors.toList());
173177
}
174178

179+
private static boolean isSecured(V1Service service) {
180+
Optional<String> securedOpt = Optional.empty();
181+
if (service.getMetadata() != null && service.getMetadata().getAnnotations() != null) {
182+
securedOpt = Optional.ofNullable(service.getMetadata().getAnnotations().get(SECURED_KEY));
183+
}
184+
if (securedOpt.isEmpty() && service.getMetadata() != null && service.getMetadata().getLabels() != null) {
185+
securedOpt = Optional.ofNullable(service.getMetadata().getLabels().get(SECURED_KEY));
186+
}
187+
return Boolean.parseBoolean(securedOpt.orElse("false"));
188+
}
189+
175190
private int findEndpointPort(List<V1EndpointPort> endpointPorts, String primaryPortName, String serviceId) {
176191
if (endpointPorts.size() == 1) {
177192
return endpointPorts.get(0).getPort();

spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClientTests.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.mockito.Mock;
3636
import org.mockito.junit.MockitoJUnitRunner;
3737

38+
import org.springframework.cloud.client.ServiceInstance;
3839
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
3940
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance;
4041

@@ -56,6 +57,15 @@ public class KubernetesInformerDiscoveryClientTests {
5657
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1"))
5758
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
5859

60+
private static final V1Service testServiceSecuredAnnotation1 = new V1Service()
61+
.metadata(
62+
new V1ObjectMeta().name("test-svc-1").namespace("namespace1").putAnnotationsItem("secured", "true"))
63+
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
64+
65+
private static final V1Service testServiceSecuredLabel1 = new V1Service()
66+
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1").putLabelsItem("secured", "true"))
67+
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
68+
5969
private static final V1Service testService2 = new V1Service()
6070
.metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace2"))
6171
.spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus());
@@ -177,6 +187,35 @@ public void testDiscoveryInstancesWithServiceLabels() {
177187
"test-svc-3", "2.2.2.2", 8080, new HashMap<>(), false, "namespace1", null));
178188
}
179189

190+
@Test
191+
public void testDiscoveryInstancesWithSecuredServiceByAnnotations() {
192+
Lister<V1Service> serviceLister = setupServiceLister(testServiceSecuredAnnotation1);
193+
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpoints1);
194+
when(kubernetesDiscoveryProperties.getMetadata()).thenReturn(new KubernetesDiscoveryProperties.Metadata());
195+
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
196+
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
197+
assertThat(discoveryClient.getServices().toArray())
198+
.containsOnly(testServiceSecuredAnnotation1.getMetadata().getName());
199+
ServiceInstance serviceInstance = discoveryClient
200+
.getInstances(testServiceSecuredAnnotation1.getMetadata().getName()).get(0);
201+
assertThat(serviceInstance.isSecure()).isTrue();
202+
}
203+
204+
@Test
205+
public void testDiscoveryInstancesWithSecuredServiceByLabels() {
206+
Lister<V1Service> serviceLister = setupServiceLister(testServiceSecuredLabel1);
207+
Lister<V1Endpoints> endpointsLister = setupEndpointsLister(testEndpoints1);
208+
when(kubernetesDiscoveryProperties.getMetadata()).thenReturn(new KubernetesDiscoveryProperties.Metadata());
209+
KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1",
210+
sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties);
211+
212+
assertThat(discoveryClient.getServices().toArray())
213+
.containsOnly(testServiceSecuredLabel1.getMetadata().getName());
214+
ServiceInstance serviceInstance = discoveryClient.getInstances(testServiceSecuredLabel1.getMetadata().getName())
215+
.get(0);
216+
assertThat(serviceInstance.isSecure()).isTrue();
217+
}
218+
180219
@Test
181220
public void testDiscoveryGetServicesOneNamespaceShouldWork() {
182221
Lister<V1Service> serviceLister = setupServiceLister(testService1, testService2);

0 commit comments

Comments
 (0)