Simply k8s client config it (6) (#1424)

This commit is contained in:
erabii
2023-09-11 15:29:15 +03:00
committed by GitHub
parent 01743fa0a9
commit 24760a5836

View File

@@ -17,8 +17,6 @@
package org.springframework.cloud.kubernetes.client.config.it;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -26,13 +24,10 @@ import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.V1ConfigMap;
import io.kubernetes.client.openapi.models.V1Deployment;
import io.kubernetes.client.openapi.models.V1EnvVar;
import io.kubernetes.client.openapi.models.V1EnvVarBuilder;
import io.kubernetes.client.openapi.models.V1Ingress;
import io.kubernetes.client.openapi.models.V1Secret;
import io.kubernetes.client.openapi.models.V1Service;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -49,12 +44,34 @@ import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import static org.awaitility.Awaitility.await;
import static org.springframework.cloud.kubernetes.integration.tests.commons.native_client.Util.patchWithReplace;
/**
* @author Ryan Baxter
*/
class ConfigMapAndSecretIT {
private static final String BODY = """
{
"spec": {
"template": {
"spec": {
"containers": [{
"name": "spring-cloud-kubernetes-client-config-it-deployment",
"image": "image_name_here",
"env": [
{
"name": "SPRING_CLOUD_KUBERNETES_RELOAD_MODE",
"value": "POLLING"
}
]
}]
}
}
}
}
""";
private static final String PROPERTY_URL = "http://localhost:80/myProperty";
private static final String SECRET_URL = "http://localhost:80/mySecret";
@@ -65,6 +82,8 @@ class ConfigMapAndSecretIT {
private static final String APP_NAME = "spring-cloud-kubernetes-client-config-it";
private static final String DOCKER_IMAGE = "docker.io/springcloud/" + APP_NAME + ":" + Commons.pomVersion();
private static final K3sContainer K3S = Commons.container();
private static Util util;
@@ -83,24 +102,22 @@ class ConfigMapAndSecretIT {
@AfterAll
static void afterAll() throws Exception {
configK8sClientIt(Phase.DELETE);
Commons.cleanUp(K8S_CONFIG_CLIENT_IT_SERVICE_NAME, K3S);
Commons.systemPrune();
}
@AfterEach
void after() {
configK8sClientIt(false, Phase.DELETE);
}
@Test
void testConfigMapAndSecretWatchRefresh() {
configK8sClientIt(false, Phase.CREATE);
configK8sClientIt(Phase.CREATE);
testConfigMapAndSecretRefresh();
testConfigMapAndSecretPollingRefresh();
}
@Test
void testConfigMapAndSecretPollingRefresh() {
configK8sClientIt(true, Phase.CREATE);
recreateConfigMapAndSecret();
patchForPollingReload();
testConfigMapAndSecretRefresh();
}
@@ -149,18 +166,25 @@ class ConfigMapAndSecretIT {
.method(HttpMethod.GET).retrieve().bodyToMono(String.class).block().equals("p455w1rd"));
}
private static void configK8sClientIt(boolean pooling, Phase phase) {
V1Deployment deployment = (V1Deployment) util.yaml("spring-cloud-kubernetes-client-config-it-deployment.yaml");
void recreateConfigMapAndSecret() {
try {
coreV1Api.deleteNamespacedConfigMap("spring-cloud-kubernetes-client-config-it", NAMESPACE,
null, null, null, null, null, null);
coreV1Api.deleteNamespacedSecret("spring-cloud-kubernetes-client-config-it", NAMESPACE,
null, null, null, null, null, null);
if (pooling) {
V1EnvVar one = new V1EnvVarBuilder().withName("SPRING_CLOUD_KUBERNETES_RELOAD_MODE").withValue("polling")
.build();
List<V1EnvVar> existing = new ArrayList<>(
deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv());
existing.add(one);
deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(existing);
V1ConfigMap configMap = (V1ConfigMap) util.yaml("spring-cloud-kubernetes-client-config-it-configmap.yaml");
V1Secret secret = (V1Secret) util.yaml("spring-cloud-kubernetes-client-config-it-secret.yaml");
util.createAndWait(NAMESPACE, configMap, secret);
}
catch (ApiException e) {
throw new RuntimeException(e);
}
}
private static void configK8sClientIt(Phase phase) {
V1Deployment deployment = (V1Deployment) util.yaml("spring-cloud-kubernetes-client-config-it-deployment.yaml");
V1Service service = (V1Service) util.yaml("spring-cloud-kubernetes-client-config-it-service.yaml");
V1Ingress ingress = (V1Ingress) util.yaml("spring-cloud-kubernetes-client-config-it-ingress.yaml");
@@ -185,4 +209,9 @@ class ConfigMapAndSecretIT {
return Retry.fixedDelay(15, Duration.ofSeconds(1)).filter(Objects::nonNull);
}
private static void patchForPollingReload() {
patchWithReplace(ConfigMapAndSecretIT.DOCKER_IMAGE, ConfigMapAndSecretIT.APP_NAME + "-deployment",
ConfigMapAndSecretIT.NAMESPACE, BODY);
}
}