Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -162,14 +162,14 @@ List<SharedIndexInformer<V1Endpoints>> endpointsSharedIndexInformers(
@Bean
@ConditionalOnMissingBean(value = V1Endpoints.class, parameterizedContainer = { List.class, Lister.class })
List<Lister<V1Endpoints>> endpointsListers(List<String> selectiveNamespaces,
List<SharedIndexInformer<V1Endpoints>> serviceSharedIndexInformers) {
List<SharedIndexInformer<V1Endpoints>> endpointsSharedIndexInformers) {

int howManyNamespaces = selectiveNamespaces.size();
List<Lister<V1Endpoints>> endpointsListers = new ArrayList<>(howManyNamespaces);

for (int i = 0; i < howManyNamespaces; ++i) {
String namespace = selectiveNamespaces.get(i);
Lister<V1Endpoints> lister = new Lister<>(serviceSharedIndexInformers.get(i).getIndexer());
Lister<V1Endpoints> lister = new Lister<>(endpointsSharedIndexInformers.get(i).getIndexer());
LOG.debug(() -> "registering lister (for endpoints) in namespace : " + namespace);
endpointsListers.add(lister);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@

package org.springframework.cloud.kubernetes.client.discovery;

import java.io.StringReader;
import java.util.List;

import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.util.Config;
import org.junit.jupiter.api.AfterAll;
import io.kubernetes.client.util.ClientBuilder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.k3s.K3sContainer;
import org.junit.jupiter.api.extension.RegisterExtension;

import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.health.contributor.HealthIndicator;
Expand All @@ -35,14 +36,15 @@
import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryClientHealthIndicatorInitializer;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.integration.tests.commons.Commons;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertInformerBeansMissing;
import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertInformerBeansPresent;
import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.mockEndpointsAndServices;

/**
* Test various conditionals for
Expand All @@ -54,15 +56,21 @@ class KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContext

private ApplicationContextRunner applicationContextRunner;

private static K3sContainer container;
@RegisterExtension
private static final WireMockExtension API_SERVER = WireMockExtension.newInstance()
.options(options().dynamicPort())
.build();

@AfterAll
static void afterAll() {
container.stop();
@AfterEach
void afterEach() {
API_SERVER.resetAll();
}

@Test
void discoveryEnabledDefault() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.client.namespace=default");
applicationContextRunner.run(context -> {
Expand All @@ -82,6 +90,9 @@ void discoveryEnabledDefault() {

@Test
void discoveryEnabledDefaultWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("a", "b", "c"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.namespaces=a,b,c");
applicationContextRunner.run(context -> {
Expand All @@ -102,6 +113,9 @@ void discoveryEnabledDefaultWithSelectiveNamespaces() {

@Test
void discoveryEnabled() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=true", "spring.cloud.kubernetes.client.namespace=default");
applicationContextRunner.run(context -> {
Expand All @@ -121,6 +135,9 @@ void discoveryEnabled() {

@Test
void discoveryEnabledWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("a", "b"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=true", "spring.cloud.kubernetes.discovery.namespaces=a,b");
applicationContextRunner.run(context -> {
Expand Down Expand Up @@ -155,6 +172,7 @@ void discoveryDisabled() {

@Test
void discoveryDisabledWithSelectiveNamespaces() {

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=false", "spring.cloud.kubernetes.discovery.namespaces=a,b");
applicationContextRunner.run(context -> {
Expand Down Expand Up @@ -185,6 +203,9 @@ void kubernetesDiscoveryEnabled() {

@Test
void kubernetesDiscoveryEnabledWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("a", "b", "c", "d"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.enabled=true",
"spring.cloud.kubernetes.discovery.namespaces=a,b,c,d");
Expand Down Expand Up @@ -239,6 +260,9 @@ void kubernetesDiscoveryDisabledWithSelectiveNamespaces() {

@Test
void kubernetesDiscoveryBlockingEnabled() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=true", "spring.cloud.kubernetes.client.namespace=default");
applicationContextRunner.run(context -> {
Expand All @@ -259,6 +283,9 @@ void kubernetesDiscoveryBlockingEnabled() {

@Test
void kubernetesDiscoveryBlockingEnabledWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("a"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=true", "spring.cloud.kubernetes.discovery.namespaces=a");
applicationContextRunner.run(context -> {
Expand All @@ -279,6 +306,9 @@ void kubernetesDiscoveryBlockingEnabledWithSelectiveNamespaces() {

@Test
void kubernetesDiscoveryBlockingDisabled() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.client.namespace=default");
applicationContextRunner.run(context -> {
Expand All @@ -298,6 +328,9 @@ void kubernetesDiscoveryBlockingDisabled() {

@Test
void kubernetesDiscoveryBlockingDisabledWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("a", "b"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.discovery.namespaces=a,b");
applicationContextRunner.run(context -> {
Expand All @@ -317,6 +350,9 @@ void kubernetesDiscoveryBlockingDisabledWithSelectiveNamespaces() {

@Test
void kubernetesDiscoveryHealthIndicatorEnabled() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.client.health-indicator.enabled=true",
"spring.cloud.kubernetes.client.namespace=default");
Expand All @@ -337,6 +373,9 @@ void kubernetesDiscoveryHealthIndicatorEnabled() {

@Test
void kubernetesDiscoveryHealthIndicatorEnabledWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("b"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.client.health-indicator.enabled=true",
"spring.cloud.kubernetes.discovery.namespaces=b");
Expand All @@ -357,6 +396,9 @@ void kubernetesDiscoveryHealthIndicatorEnabledWithSelectiveNamespaces() {

@Test
void kubernetesDiscoveryHealthIndicatorDisabled() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.client.health-indicator.enabled=false",
"spring.cloud.kubernetes.client.namespace=default");
Expand All @@ -373,6 +415,9 @@ void kubernetesDiscoveryHealthIndicatorDisabled() {

@Test
void kubernetesDiscoveryHealthIndicatorDisabledWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("b"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.client.health-indicator.enabled=false",
"spring.cloud.kubernetes.discovery.namespaces=b");
Expand All @@ -389,6 +434,9 @@ void kubernetesDiscoveryHealthIndicatorDisabledWithSelectiveNamespaces() {

@Test
void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissing() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setupWithFilteredClassLoader(HealthIndicator.class, "spring.main.cloud-platform=KUBERNETES",
"spring.cloud.config.enabled=false", "spring.cloud.discovery.client.health-indicator.enabled=true",
"spring.cloud.kubernetes.client.namespace=default");
Expand All @@ -411,6 +459,9 @@ void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissing() {

@Test
void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissingWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("a", "b", "c", "d", "e"), API_SERVER);

setupWithFilteredClassLoader(HealthIndicator.class, "spring.main.cloud-platform=KUBERNETES",
"spring.cloud.config.enabled=false", "spring.cloud.discovery.client.health-indicator.enabled=true",
"spring.cloud.kubernetes.discovery.namespaces=a,b,c,d,e");
Expand All @@ -437,6 +488,9 @@ void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissingWithSelectiv
*/
@Test
void kubernetesDiscoveryReactiveCacheableEnabledBlockingDisabled() {

mockEndpointsAndServices(List.of("a", "b"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=false",
"spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=true",
Expand All @@ -462,6 +516,9 @@ void kubernetesDiscoveryReactiveCacheableEnabledBlockingDisabled() {
*/
@Test
void reactiveDisabled() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.reactive.enabled=false", "spring.cloud.kubernetes.client.namespace=default");
applicationContextRunner.run(context -> {
Expand All @@ -480,6 +537,9 @@ void reactiveDisabled() {
*/
@Test
void reactiveDisabledWithSelectiveNamespaces() {

mockEndpointsAndServices(List.of("a", "b", "c", "d", "e"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.reactive.enabled=false",
"spring.cloud.kubernetes.discovery.namespaces=a,b,c,d,e");
Expand All @@ -503,6 +563,9 @@ void reactiveDisabledWithSelectiveNamespaces() {
*/
@Test
void blockingCacheableDefault() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.client.namespace=default");
applicationContextRunner.run(context -> {
Expand All @@ -520,6 +583,9 @@ void blockingCacheableDefault() {
*/
@Test
void blockingCacheableDisabled() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.cacheable.blocking.enabled=false",
"spring.cloud.kubernetes.client.namespace=default");
Expand All @@ -538,6 +604,9 @@ void blockingCacheableDisabled() {
*/
@Test
void blockingCacheableEnabled() {

mockEndpointsAndServices(List.of("default"), API_SERVER);

setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.cacheable.blocking.enabled=true",
"spring.cloud.kubernetes.client.namespace=default");
Expand Down Expand Up @@ -585,10 +654,7 @@ static class ApiClientConfig {
@Bean
@Primary
ApiClient apiClient() throws Exception {
container = Commons.container();
container.start();

return Config.fromConfig(new StringReader(container.getKubeConfigYaml()));
return new ClientBuilder().setBasePath("http://localhost:" + API_SERVER.getPort()).build();
}

}
Expand Down
Loading
Loading