@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.github.tomakehurst.wiremock.WireMockServer;
|
||||
import com.github.tomakehurst.wiremock.client.WireMock;
|
||||
import com.github.tomakehurst.wiremock.stubbing.Scenario;
|
||||
import io.kubernetes.client.openapi.ApiClient;
|
||||
import io.kubernetes.client.openapi.Configuration;
|
||||
import io.kubernetes.client.openapi.JSON;
|
||||
@@ -60,8 +61,10 @@ import org.springframework.core.env.PropertySource;
|
||||
import org.springframework.mock.env.MockEnvironment;
|
||||
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.get;
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
|
||||
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
|
||||
|
||||
/**
|
||||
@@ -82,6 +85,10 @@ class EventReloadConfigMapTest {
|
||||
|
||||
private static final String NAMESPACE = "spring-k8s";
|
||||
|
||||
private static final String SCENARIO_NAME = "reload-test";
|
||||
|
||||
private static final String PATH = "/api/v1/namespaces/spring-k8s/configmaps";
|
||||
|
||||
private static final AtomicBoolean STRATEGY_CALLED = new AtomicBoolean(false);
|
||||
|
||||
private static CoreV1Api coreV1Api;
|
||||
@@ -99,6 +106,12 @@ class EventReloadConfigMapTest {
|
||||
wireMockServer.start();
|
||||
WireMock.configureFor("localhost", wireMockServer.port());
|
||||
|
||||
// something that the informer can work with. Since we do not care about this one
|
||||
// in the test, we mock it to return a 500 as it does not matter anyway.
|
||||
stubFor(get(urlPathMatching(PATH)).withQueryParam("resourceVersion", equalTo("0"))
|
||||
.withQueryParam("watch", equalTo("false"))
|
||||
.willReturn(aResponse().withStatus(500).withBody("Error From Informer")));
|
||||
|
||||
ApiClient client = new ClientBuilder().setBasePath("http://localhost:" + wireMockServer.port()).build();
|
||||
client.setDebugging(true);
|
||||
MOCK_STATIC.when(KubernetesClientUtils::createApiClientForInformerClient).thenReturn(client);
|
||||
@@ -108,30 +121,6 @@ class EventReloadConfigMapTest {
|
||||
.thenReturn(NAMESPACE);
|
||||
Configuration.setDefaultApiClient(client);
|
||||
coreV1Api = new CoreV1Api();
|
||||
|
||||
String path = "/api/v1/namespaces/spring-k8s/configmaps";
|
||||
V1ConfigMap configMapOne = configMap(CONFIG_MAP_NAME, Map.of());
|
||||
V1ConfigMapList listOne = new V1ConfigMapList().addItemsItem(configMapOne);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listOne)))
|
||||
.inScenario("mine-test")
|
||||
.willSetStateTo("go-to-fail"));
|
||||
|
||||
// first call will fail
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))
|
||||
.inScenario("mine-test")
|
||||
.whenScenarioStateIs("go-to-fail")
|
||||
.willSetStateTo("go-to-ok"));
|
||||
|
||||
// second call passes (change data so that reload is triggered)
|
||||
configMapOne = configMap(CONFIG_MAP_NAME, Map.of("a", "b"));
|
||||
listOne = new V1ConfigMapList().addItemsItem(configMapOne);
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listOne)))
|
||||
.inScenario("mine-test")
|
||||
.whenScenarioStateIs("go-to-ok")
|
||||
.willSetStateTo("done"));
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
@@ -150,6 +139,13 @@ class EventReloadConfigMapTest {
|
||||
*/
|
||||
@Test
|
||||
void test(CapturedOutput output) {
|
||||
|
||||
// first call will fail
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs("go-to-fail")
|
||||
.willSetStateTo("go-to-ok"));
|
||||
|
||||
V1ConfigMap configMapNotMine = configMap("not" + CONFIG_MAP_NAME, Map.of());
|
||||
kubernetesClientEventBasedConfigMapChangeDetector.onEvent(configMapNotMine);
|
||||
|
||||
@@ -163,6 +159,14 @@ class EventReloadConfigMapTest {
|
||||
return one && two && three && updateStrategyNotCalled;
|
||||
});
|
||||
|
||||
// second call passes (change data so that reload is triggered)
|
||||
V1ConfigMap configMap = configMap(CONFIG_MAP_NAME, Map.of("a", "b"));
|
||||
V1ConfigMapList configMapList = new V1ConfigMapList().addItemsItem(configMap);
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(configMapList)))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs("go-to-ok")
|
||||
.willSetStateTo("done"));
|
||||
|
||||
// trigger the call again
|
||||
V1ConfigMap configMapMine = configMap(CONFIG_MAP_NAME, Map.of());
|
||||
kubernetesClientEventBasedConfigMapChangeDetector.onEvent(configMapMine);
|
||||
@@ -194,6 +198,17 @@ class EventReloadConfigMapTest {
|
||||
@Bean
|
||||
@Primary
|
||||
AbstractEnvironment environment() {
|
||||
|
||||
V1ConfigMap configMap = configMap(CONFIG_MAP_NAME, Map.of());
|
||||
V1ConfigMapList configMapList = new V1ConfigMapList().addItemsItem(configMap);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(configMapList)))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs(Scenario.STARTED)
|
||||
.willSetStateTo("go-to-fail"));
|
||||
|
||||
MockEnvironment mockEnvironment = new MockEnvironment();
|
||||
mockEnvironment.setProperty("spring.cloud.kubernetes.client.namespace", NAMESPACE);
|
||||
|
||||
@@ -217,7 +232,7 @@ class EventReloadConfigMapTest {
|
||||
@Primary
|
||||
ConfigReloadProperties configReloadProperties() {
|
||||
return new ConfigReloadProperties(true, true, false, ConfigReloadProperties.ReloadStrategy.REFRESH,
|
||||
ConfigReloadProperties.ReloadDetectionMode.POLLING, Duration.ofMillis(2000), Set.of("non-default"),
|
||||
ConfigReloadProperties.ReloadDetectionMode.POLLING, Duration.ofMillis(2000), Set.of("spring-k8s"),
|
||||
false, Duration.ofSeconds(2));
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import com.github.tomakehurst.wiremock.WireMockServer;
|
||||
import com.github.tomakehurst.wiremock.client.WireMock;
|
||||
import com.github.tomakehurst.wiremock.stubbing.Scenario;
|
||||
import io.kubernetes.client.openapi.ApiClient;
|
||||
import io.kubernetes.client.openapi.Configuration;
|
||||
import io.kubernetes.client.openapi.JSON;
|
||||
@@ -62,8 +63,10 @@ import org.springframework.core.env.PropertySource;
|
||||
import org.springframework.mock.env.MockEnvironment;
|
||||
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.get;
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
|
||||
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
|
||||
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
|
||||
|
||||
/**
|
||||
@@ -84,6 +87,10 @@ class EventReloadSecretTest {
|
||||
|
||||
private static final String NAMESPACE = "spring-k8s";
|
||||
|
||||
private static final String PATH = "/api/v1/namespaces/spring-k8s/secrets";
|
||||
|
||||
private static final String SCENARIO_NAME = "reload-test";
|
||||
|
||||
private static final AtomicBoolean STRATEGY_CALLED = new AtomicBoolean(false);
|
||||
|
||||
private static CoreV1Api coreV1Api;
|
||||
@@ -101,6 +108,12 @@ class EventReloadSecretTest {
|
||||
wireMockServer.start();
|
||||
WireMock.configureFor("localhost", wireMockServer.port());
|
||||
|
||||
// something that the informer can work with. Since we do not care about this one
|
||||
// in the test, we mock it to return a 500 as it does not matter anyway.
|
||||
stubFor(get(urlPathMatching(PATH)).withQueryParam("resourceVersion", equalTo("0"))
|
||||
.withQueryParam("watch", equalTo("false"))
|
||||
.willReturn(aResponse().withStatus(500).withBody("Error From Informer")));
|
||||
|
||||
ApiClient client = new ClientBuilder().setBasePath("http://localhost:" + wireMockServer.port()).build();
|
||||
client.setDebugging(true);
|
||||
MOCK_STATIC.when(KubernetesClientUtils::createApiClientForInformerClient).thenReturn(client);
|
||||
@@ -110,30 +123,6 @@ class EventReloadSecretTest {
|
||||
.thenReturn(NAMESPACE);
|
||||
Configuration.setDefaultApiClient(client);
|
||||
coreV1Api = new CoreV1Api();
|
||||
|
||||
String path = "/api/v1/namespaces/spring-k8s/secrets";
|
||||
V1Secret secretOne = secret(SECRET_NAME, Map.of());
|
||||
V1SecretList listOne = new V1SecretList().addItemsItem(secretOne);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listOne)))
|
||||
.inScenario("mine-test")
|
||||
.willSetStateTo("go-to-fail"));
|
||||
|
||||
// first call will fail
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))
|
||||
.inScenario("mine-test")
|
||||
.whenScenarioStateIs("go-to-fail")
|
||||
.willSetStateTo("go-to-ok"));
|
||||
|
||||
// second call passes (change data so that reload is triggered)
|
||||
secretOne = secret(SECRET_NAME, Map.of("a", "b"));
|
||||
listOne = new V1SecretList().addItemsItem(secretOne);
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listOne)))
|
||||
.inScenario("mine-test")
|
||||
.whenScenarioStateIs("go-to-ok")
|
||||
.willSetStateTo("done"));
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
@@ -152,6 +141,12 @@ class EventReloadSecretTest {
|
||||
*/
|
||||
@Test
|
||||
void test(CapturedOutput output) {
|
||||
// first call will fail
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs("go-to-fail")
|
||||
.willSetStateTo("go-to-ok"));
|
||||
|
||||
V1Secret secretNotMine = secret("not" + SECRET_NAME, Map.of());
|
||||
kubernetesClientEventBasedSecretsChangeDetector.onEvent(secretNotMine);
|
||||
|
||||
@@ -165,6 +160,14 @@ class EventReloadSecretTest {
|
||||
return one && two && three && updateStrategyNotCalled;
|
||||
});
|
||||
|
||||
// second call passes (change data so that reload is triggered)
|
||||
V1Secret secret = secret(SECRET_NAME, Map.of("a", "b"));
|
||||
V1SecretList secretList = new V1SecretList().addItemsItem(secret);
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(secretList)))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs("go-to-ok")
|
||||
.willSetStateTo("done"));
|
||||
|
||||
// trigger the call again
|
||||
V1Secret secretMine = secret(SECRET_NAME, Map.of());
|
||||
kubernetesClientEventBasedSecretsChangeDetector.onEvent(secretMine);
|
||||
@@ -200,6 +203,17 @@ class EventReloadSecretTest {
|
||||
@Bean
|
||||
@Primary
|
||||
AbstractEnvironment environment() {
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
V1Secret secret = secret(SECRET_NAME, Map.of());
|
||||
V1SecretList secretList = new V1SecretList().addItemsItem(secret);
|
||||
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(secretList)))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs(Scenario.STARTED)
|
||||
.willSetStateTo("go-to-fail"));
|
||||
|
||||
MockEnvironment mockEnvironment = new MockEnvironment();
|
||||
mockEnvironment.setProperty("spring.cloud.kubernetes.client.namespace", NAMESPACE);
|
||||
|
||||
@@ -222,7 +236,7 @@ class EventReloadSecretTest {
|
||||
@Primary
|
||||
ConfigReloadProperties configReloadProperties() {
|
||||
return new ConfigReloadProperties(true, true, false, ConfigReloadProperties.ReloadStrategy.REFRESH,
|
||||
ConfigReloadProperties.ReloadDetectionMode.POLLING, Duration.ofMillis(2000), Set.of("non-default"),
|
||||
ConfigReloadProperties.ReloadDetectionMode.POLLING, Duration.ofMillis(2000), Set.of("spring-k8s"),
|
||||
false, Duration.ofSeconds(2));
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.github.tomakehurst.wiremock.WireMockServer;
|
||||
import com.github.tomakehurst.wiremock.client.WireMock;
|
||||
import com.github.tomakehurst.wiremock.stubbing.Scenario;
|
||||
import io.kubernetes.client.openapi.ApiClient;
|
||||
import io.kubernetes.client.openapi.Configuration;
|
||||
import io.kubernetes.client.openapi.JSON;
|
||||
@@ -72,18 +73,22 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options
|
||||
@ExtendWith(OutputCaptureExtension.class)
|
||||
class PollingReloadConfigMapTest {
|
||||
|
||||
private static WireMockServer wireMockServer;
|
||||
|
||||
private static final boolean FAIL_FAST = false;
|
||||
|
||||
private static final String CONFIG_MAP_NAME = "mine";
|
||||
|
||||
private static final String PATH = "/api/v1/namespaces/spring-k8s/configmaps";
|
||||
|
||||
private static final String NAMESPACE = "spring-k8s";
|
||||
|
||||
private static final String SCENARIO_NAME = "reload-test";
|
||||
|
||||
private static final AtomicBoolean STRATEGY_CALLED = new AtomicBoolean(false);
|
||||
|
||||
private static CoreV1Api coreV1Api;
|
||||
|
||||
private static WireMockServer wireMockServer;
|
||||
|
||||
@BeforeAll
|
||||
static void setup() {
|
||||
wireMockServer = new WireMockServer(options().dynamicPort());
|
||||
@@ -95,30 +100,6 @@ class PollingReloadConfigMapTest {
|
||||
client.setDebugging(true);
|
||||
Configuration.setDefaultApiClient(client);
|
||||
coreV1Api = new CoreV1Api();
|
||||
|
||||
String path = "/api/v1/namespaces/spring-k8s/configmaps";
|
||||
V1ConfigMap configMapOne = configMap(CONFIG_MAP_NAME, Map.of());
|
||||
V1ConfigMapList listOne = new V1ConfigMapList().addItemsItem(configMapOne);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listOne)))
|
||||
.inScenario("my-test")
|
||||
.willSetStateTo("go-to-fail"));
|
||||
|
||||
// first reload call fails
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))
|
||||
.inScenario("my-test")
|
||||
.whenScenarioStateIs("go-to-fail")
|
||||
.willSetStateTo("go-to-ok"));
|
||||
|
||||
// second reload call passes
|
||||
V1ConfigMap configMapTwo = configMap(CONFIG_MAP_NAME, Map.of("a", "b"));
|
||||
V1ConfigMapList listTwo = new V1ConfigMapList().addItemsItem(configMapTwo);
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listTwo)))
|
||||
.inScenario("my-test")
|
||||
.whenScenarioStateIs("go-to-ok"));
|
||||
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
@@ -135,17 +116,33 @@ class PollingReloadConfigMapTest {
|
||||
*/
|
||||
@Test
|
||||
void test(CapturedOutput output) {
|
||||
|
||||
// first reload call fails
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs("go-to-fail")
|
||||
.willSetStateTo("go-to-ok"));
|
||||
|
||||
// we fail while reading 'configMapOne'
|
||||
Awaitility.await().atMost(Duration.ofSeconds(20)).pollInterval(Duration.ofSeconds(1)).until(() -> {
|
||||
Awaitility.await().atMost(Duration.ofSeconds(10)).pollInterval(Duration.ofSeconds(1)).until(() -> {
|
||||
boolean one = output.getOut().contains("Failure in reading named sources");
|
||||
boolean two = output.getOut().contains("Failed to load source");
|
||||
boolean three = output.getOut()
|
||||
.contains("Reloadable condition was not satisfied, reload will not be triggered");
|
||||
boolean updateStrategyNotCalled = !STRATEGY_CALLED.get();
|
||||
System.out.println("one: " + one + " two: " + two + " three: " + three + " updateStrategyNotCalled: " + updateStrategyNotCalled);
|
||||
System.out.println("one: " + one + " two: " + two + " three: " + three + " updateStrategyNotCalled: "
|
||||
+ updateStrategyNotCalled);
|
||||
return one && two && three && updateStrategyNotCalled;
|
||||
});
|
||||
|
||||
// second reload call passes
|
||||
V1ConfigMap configMapTwo = configMap(CONFIG_MAP_NAME, Map.of("a", "b"));
|
||||
V1ConfigMapList listTwo = new V1ConfigMapList().addItemsItem(configMapTwo);
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listTwo)))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs("go-to-ok")
|
||||
.willSetStateTo("done"));
|
||||
|
||||
System.out.println("first assertion passed");
|
||||
|
||||
// it passes while reading 'configMapTwo'
|
||||
@@ -177,6 +174,17 @@ class PollingReloadConfigMapTest {
|
||||
@Bean
|
||||
@Primary
|
||||
AbstractEnvironment environment() {
|
||||
|
||||
V1ConfigMap configMapOne = configMap(CONFIG_MAP_NAME, Map.of());
|
||||
V1ConfigMapList listOne = new V1ConfigMapList().addItemsItem(configMapOne);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listOne)))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs(Scenario.STARTED)
|
||||
.willSetStateTo("go-to-fail"));
|
||||
|
||||
MockEnvironment mockEnvironment = new MockEnvironment();
|
||||
mockEnvironment.setProperty("spring.cloud.kubernetes.client.namespace", NAMESPACE);
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import com.github.tomakehurst.wiremock.WireMockServer;
|
||||
import com.github.tomakehurst.wiremock.client.WireMock;
|
||||
import com.github.tomakehurst.wiremock.stubbing.Scenario;
|
||||
import io.kubernetes.client.openapi.ApiClient;
|
||||
import io.kubernetes.client.openapi.Configuration;
|
||||
import io.kubernetes.client.openapi.JSON;
|
||||
@@ -74,18 +75,22 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options
|
||||
@ExtendWith(OutputCaptureExtension.class)
|
||||
class PollingReloadSecretTest {
|
||||
|
||||
private static WireMockServer wireMockServer;
|
||||
|
||||
private static final boolean FAIL_FAST = false;
|
||||
|
||||
private static final String SECRET_NAME = "mine";
|
||||
|
||||
private static final String PATH = "/api/v1/namespaces/spring-k8s/secrets";
|
||||
|
||||
private static final String NAMESPACE = "spring-k8s";
|
||||
|
||||
private static final String SCENARIO_NAME = "reload-test";
|
||||
|
||||
private static final AtomicBoolean STRATEGY_CALLED = new AtomicBoolean(false);
|
||||
|
||||
private static CoreV1Api coreV1Api;
|
||||
|
||||
private static WireMockServer wireMockServer;
|
||||
|
||||
@BeforeAll
|
||||
static void setup() {
|
||||
wireMockServer = new WireMockServer(options().dynamicPort());
|
||||
@@ -97,29 +102,6 @@ class PollingReloadSecretTest {
|
||||
client.setDebugging(true);
|
||||
Configuration.setDefaultApiClient(client);
|
||||
coreV1Api = new CoreV1Api();
|
||||
|
||||
String path = "/api/v1/namespaces/spring-k8s/secrets";
|
||||
V1Secret secretOne = secret(SECRET_NAME, Map.of());
|
||||
V1SecretList listOne = new V1SecretList().addItemsItem(secretOne);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listOne)))
|
||||
.inScenario("my-test")
|
||||
.willSetStateTo("go-to-fail"));
|
||||
|
||||
// first reload call fails
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))
|
||||
.inScenario("my-test")
|
||||
.whenScenarioStateIs("go-to-fail")
|
||||
.willSetStateTo("go-to-ok"));
|
||||
|
||||
V1Secret secretTwo = secret(SECRET_NAME, Map.of("a", "b"));
|
||||
V1SecretList listTwo = new V1SecretList().addItemsItem(secretTwo);
|
||||
stubFor(get(path).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listTwo)))
|
||||
.inScenario("my-test")
|
||||
.whenScenarioStateIs("go-to-ok"));
|
||||
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
@@ -136,8 +118,15 @@ class PollingReloadSecretTest {
|
||||
*/
|
||||
@Test
|
||||
void test(CapturedOutput output) {
|
||||
|
||||
// first reload call fails
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs("go-to-fail")
|
||||
.willSetStateTo("go-to-ok"));
|
||||
|
||||
// we fail while reading 'secretOne'
|
||||
Awaitility.await().atMost(Duration.ofSeconds(20)).pollInterval(Duration.ofSeconds(1)).until(() -> {
|
||||
Awaitility.await().atMost(Duration.ofSeconds(10)).pollInterval(Duration.ofSeconds(1)).until(() -> {
|
||||
boolean one = output.getOut().contains("Failure in reading named sources");
|
||||
boolean two = output.getOut().contains("Failed to load source");
|
||||
boolean three = output.getOut()
|
||||
@@ -146,6 +135,13 @@ class PollingReloadSecretTest {
|
||||
return one && two && three && updateStrategyNotCalled;
|
||||
});
|
||||
|
||||
V1Secret secretTwo = secret(SECRET_NAME, Map.of("a", "b"));
|
||||
V1SecretList listTwo = new V1SecretList().addItemsItem(secretTwo);
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listTwo)))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.willSetStateTo("done")
|
||||
.whenScenarioStateIs("go-to-ok"));
|
||||
|
||||
// it passes while reading 'secretTwo'
|
||||
Awaitility.await()
|
||||
.atMost(Duration.ofSeconds(20))
|
||||
@@ -180,6 +176,17 @@ class PollingReloadSecretTest {
|
||||
@Bean
|
||||
@Primary
|
||||
AbstractEnvironment environment() {
|
||||
|
||||
V1Secret secretOne = secret(SECRET_NAME, Map.of());
|
||||
V1SecretList listOne = new V1SecretList().addItemsItem(secretOne);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
stubFor(get(PATH).willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(listOne)))
|
||||
.inScenario(SCENARIO_NAME)
|
||||
.whenScenarioStateIs(Scenario.STARTED)
|
||||
.willSetStateTo("go-to-fail"));
|
||||
|
||||
MockEnvironment mockEnvironment = new MockEnvironment();
|
||||
mockEnvironment.setProperty("spring.cloud.kubernetes.client.namespace", NAMESPACE);
|
||||
|
||||
|
||||
@@ -70,6 +70,8 @@ class PollingReloadConfigMapTest {
|
||||
|
||||
private static final String NAMESPACE = "spring-k8s";
|
||||
|
||||
private static final String PATH = "/api/v1/namespaces/spring-k8s/configmaps";
|
||||
|
||||
private static KubernetesMockServer kubernetesMockServer;
|
||||
|
||||
private static KubernetesClient kubernetesClient;
|
||||
@@ -78,25 +80,7 @@ class PollingReloadConfigMapTest {
|
||||
|
||||
@BeforeAll
|
||||
static void beforeAll() {
|
||||
|
||||
kubernetesClient.getConfiguration().setRequestRetryBackoffLimit(0);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
ConfigMap configMapOne = configMap(CONFIG_MAP_NAME, Map.of());
|
||||
ConfigMap configMapTwo = configMap(CONFIG_MAP_NAME, Map.of("a", "b"));
|
||||
String path = "/api/v1/namespaces/spring-k8s/configmaps";
|
||||
kubernetesMockServer.expect()
|
||||
.withPath(path)
|
||||
.andReturn(200, new ConfigMapListBuilder().withItems(configMapOne).build())
|
||||
.once();
|
||||
|
||||
kubernetesMockServer.expect().withPath(path).andReturn(500, "Internal Server Error").once();
|
||||
|
||||
kubernetesMockServer.expect()
|
||||
.withPath(path)
|
||||
.andReturn(200, new ConfigMapListBuilder().withItems(configMapTwo).build())
|
||||
.once();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,6 +93,7 @@ class PollingReloadConfigMapTest {
|
||||
@Test
|
||||
void test(CapturedOutput output) {
|
||||
// we fail while reading 'configMapOne'
|
||||
kubernetesMockServer.expect().withPath(PATH).andReturn(500, "Internal Server Error").once();
|
||||
Awaitility.await().atMost(Duration.ofSeconds(20)).pollInterval(Duration.ofSeconds(1)).until(() -> {
|
||||
boolean one = output.getOut().contains("Failure in reading named sources");
|
||||
boolean two = output.getOut().contains("Failed to load source");
|
||||
@@ -118,6 +103,12 @@ class PollingReloadConfigMapTest {
|
||||
return one && two && three && updateStrategyNotCalled;
|
||||
});
|
||||
|
||||
ConfigMap configMapTwo = configMap(CONFIG_MAP_NAME, Map.of("a", "b"));
|
||||
kubernetesMockServer.expect()
|
||||
.withPath(PATH)
|
||||
.andReturn(200, new ConfigMapListBuilder().withItems(configMapTwo).build())
|
||||
.once();
|
||||
|
||||
// it passes while reading 'configMapTwo'
|
||||
Awaitility.await()
|
||||
.atMost(Duration.ofSeconds(20))
|
||||
@@ -146,6 +137,15 @@ class PollingReloadConfigMapTest {
|
||||
@Bean
|
||||
@Primary
|
||||
AbstractEnvironment environment() {
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
ConfigMap configMapOne = configMap(CONFIG_MAP_NAME, Map.of());
|
||||
kubernetesMockServer.expect()
|
||||
.withPath(PATH)
|
||||
.andReturn(200, new ConfigMapListBuilder().withItems(configMapOne).build())
|
||||
.once();
|
||||
|
||||
MockEnvironment mockEnvironment = new MockEnvironment();
|
||||
mockEnvironment.setProperty("spring.cloud.kubernetes.client.namespace", NAMESPACE);
|
||||
|
||||
|
||||
@@ -73,6 +73,8 @@ public class PollingReloadSecretTest {
|
||||
|
||||
private static final String NAMESPACE = "spring-k8s";
|
||||
|
||||
private static final String PATH = "/api/v1/namespaces/spring-k8s/secrets";
|
||||
|
||||
private static KubernetesMockServer kubernetesMockServer;
|
||||
|
||||
private static KubernetesClient kubernetesClient;
|
||||
@@ -81,25 +83,7 @@ public class PollingReloadSecretTest {
|
||||
|
||||
@BeforeAll
|
||||
static void beforeAll() {
|
||||
|
||||
kubernetesClient.getConfiguration().setRequestRetryBackoffLimit(0);
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
Secret secretOne = secret(SECRET_NAME, Map.of());
|
||||
Secret secretTwo = secret(SECRET_NAME, Map.of("a", "b"));
|
||||
String path = "/api/v1/namespaces/spring-k8s/secrets";
|
||||
kubernetesMockServer.expect()
|
||||
.withPath(path)
|
||||
.andReturn(200, new SecretListBuilder().withItems(secretOne).build())
|
||||
.once();
|
||||
|
||||
kubernetesMockServer.expect().withPath(path).andReturn(500, "Internal Server Error").once();
|
||||
|
||||
kubernetesMockServer.expect()
|
||||
.withPath(path)
|
||||
.andReturn(200, new SecretListBuilder().withItems(secretTwo).build())
|
||||
.once();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -112,6 +96,7 @@ public class PollingReloadSecretTest {
|
||||
@Test
|
||||
void test(CapturedOutput output) {
|
||||
// we fail while reading 'secretOne'
|
||||
kubernetesMockServer.expect().withPath(PATH).andReturn(500, "Internal Server Error").once();
|
||||
Awaitility.await().atMost(Duration.ofSeconds(20)).pollInterval(Duration.ofSeconds(1)).until(() -> {
|
||||
boolean one = output.getOut().contains("Failure in reading named sources");
|
||||
boolean two = output.getOut().contains("Failed to load source");
|
||||
@@ -121,6 +106,12 @@ public class PollingReloadSecretTest {
|
||||
return one && two && three && updateStrategyNotCalled;
|
||||
});
|
||||
|
||||
Secret secretTwo = secret(SECRET_NAME, Map.of("a", "b"));
|
||||
kubernetesMockServer.expect()
|
||||
.withPath(PATH)
|
||||
.andReturn(200, new SecretListBuilder().withItems(secretTwo).build())
|
||||
.once();
|
||||
|
||||
// it passes while reading 'secretTwo'
|
||||
Awaitility.await()
|
||||
.atMost(Duration.ofSeconds(20))
|
||||
@@ -153,6 +144,15 @@ public class PollingReloadSecretTest {
|
||||
@Bean
|
||||
@Primary
|
||||
AbstractEnvironment environment() {
|
||||
|
||||
// needed so that our environment is populated with 'something'
|
||||
// this call is done in the method that returns the AbstractEnvironment
|
||||
Secret secretOne = secret(SECRET_NAME, Map.of());
|
||||
kubernetesMockServer.expect()
|
||||
.withPath(PATH)
|
||||
.andReturn(200, new SecretListBuilder().withItems(secretOne).build())
|
||||
.once();
|
||||
|
||||
MockEnvironment mockEnvironment = new MockEnvironment();
|
||||
mockEnvironment.setProperty("spring.cloud.kubernetes.client.namespace", NAMESPACE);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user