From a4685812228936629662a18e9ddb5f0f2f81412b Mon Sep 17 00:00:00 2001 From: wind57 Date: Wed, 4 Oct 2023 22:00:47 +0300 Subject: [PATCH 01/26] fix --- .../event/reload/ConfigMapEventReloadIT.java | 206 +++++++++--------- .../configmap/event/reload/TestUtil.java | 134 ++++++++++++ .../src/test/resources/deployment.yaml | 6 +- 3 files changed, 244 insertions(+), 102 deletions(-) create mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java index 5029dbf8b6..9bf71fb026 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java @@ -18,18 +18,12 @@ import java.io.InputStream; import java.time.Duration; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.LockSupport; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; -import io.fabric8.kubernetes.api.model.EnvVar; -import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.apps.Deployment; @@ -53,6 +47,10 @@ import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchOne; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchThree; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchTwo; +import static org.springframework.cloud.kubernetes.integration.tests.commons.Commons.pomVersion; /** * @author wind57 @@ -61,6 +59,8 @@ class ConfigMapEventReloadIT { private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap-event-reload"; + private static final String DOCKER_IMAGE = "docker.io/springcloud/" + IMAGE_NAME + ":" + pomVersion(); + private static final String NAMESPACE = "default"; private static final K3sContainer K3S = Commons.container(); @@ -81,6 +81,8 @@ static void beforeAll() throws Exception { util.createNamespace("left"); util.createNamespace("right"); util.setUpClusterWide(NAMESPACE, Set.of("left", "right")); + + manifests(Phase.CREATE); } @AfterAll @@ -89,6 +91,8 @@ static void afterAll() throws Exception { util.deleteNamespace("right"); Commons.cleanUp(IMAGE_NAME, K3S); Commons.systemPrune(); + + manifests(Phase.DELETE); } /** @@ -101,7 +105,6 @@ static void afterAll() throws Exception { */ @Test void testInformFromOneNamespaceEventNotTriggered() { - manifests("one", Phase.CREATE, false); Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); @@ -124,28 +127,35 @@ void testInformFromOneNamespaceEventNotTriggered() { replaceConfigMap(rightConfigMapAfterChange); - // wait dummy for 5 seconds - LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(5)); - webClient = builder().baseUrl("http://localhost/left").build(); - result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()).block(); - // left configmap has not changed, no restart of app has happened - Assertions.assertEquals("left-initial", result); - manifests("one", Phase.DELETE, false); + WebClient finalWebClient = webClient; + await().pollInterval(Duration.ofSeconds(1)).atMost(Duration.ofSeconds(30)).until(() -> { + String innerResult = finalWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(retrySpec()).block(); + // left configmap has not changed, no restart of app has happened + return "left-initial".equals(innerResult); + }); + + testInformFromOneNamespaceEventTriggered(); + testInform(); + testInformFromOneNamespaceEventTriggeredSecretsDisabled(); } /** *
-	 *     - there are two namespaces : left and right
-	 *     - each of the namespaces has one configmap
-	 *     - we watch the "right" namespace and make a change in the configmap in the same namespace
-	 *     - as such, event is triggered and we see the updated value
+	 * - there are two namespaces : left and right
+	 * - each of the namespaces has one configmap
+	 * - we watch the "right" namespace and make a change in the configmap in the same
+	 * namespace
+	 * - as such, event is triggered and we see the updated value
 	 * 
*/ - @Test void testInformFromOneNamespaceEventTriggered() { - manifests("two", Phase.CREATE, false); + + reCreate(); + patchOne(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); @@ -171,22 +181,23 @@ void testInformFromOneNamespaceEventTriggered() { return innerResult != null; }); Assertions.assertEquals("right-after-change", resultAfterChange[0]); - - manifests("two", Phase.DELETE, false); } /** *
-	 *     - there are two namespaces : left and right (though we do not care about the left one)
-	 *     - left has one configmap : left-configmap
-	 *     - right has two configmaps: right-configmap, right-configmap-with-label
-	 *     - we watch the "right" namespace, but enable tagging; which means that only
-	 *       right-configmap-with-label triggers changes.
+	 * - there are two namespaces : left and right (though we do not care about the left
+	 * one)
+	 * - left has one configmap : left-configmap
+	 * - right has two configmaps: right-configmap, right-configmap-with-label
+	 * - we watch the "right" namespace, but enable tagging; which means that only
+	 * right-configmap-with-label triggers changes.
 	 * 
*/ - @Test void testInform() { - manifests("three", Phase.CREATE, false); + + reCreate(); + patchTwo(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); @@ -209,13 +220,12 @@ void testInform() { replaceConfigMap(rightConfigMapAfterChange); - // sleep for 5 seconds - LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(5)); - // nothing changes in our app, because we are watching only labeled configmaps - rightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - Assertions.assertEquals("right-initial", rightResult); + await().pollInterval(Duration.ofSeconds(1)).atMost(Duration.ofSeconds(30)).until(() -> { + String innerRightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(retrySpec()).block(); + return "right-initial".equals(innerRightResult); + }); // then deploy a new version of right-with-label-configmap ConfigMap rightWithLabelConfigMapAfterChange = new ConfigMapBuilder() @@ -242,52 +252,56 @@ void testInform() { rightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) .block(); Assertions.assertEquals("right-after-change", rightResult); - - manifests("three", Phase.DELETE, false); } - /** - *
-	 *     - there are two namespaces : left and right
-	 *     - each of the namespaces has one configmap
-	 *     - secrets are disabled
-	 *     - we watch the "right" namespace and make a change in the configmap in the same namespace
-	 *     - as such, event is triggered and we see the updated value
-	 * 
- */ - @Test - void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { - manifests("two", Phase.CREATE, true); - Commons.assertReloadLogStatements("added configmap informer for namespace", - "added secret informer for namespace", IMAGE_NAME); - - // read the value from the right-configmap - WebClient webClient = builder().baseUrl("http://localhost/right").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - Assertions.assertEquals("right-initial", result); - - // then deploy a new version of right-configmap - ConfigMap rightConfigMapAfterChange = new ConfigMapBuilder() - .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) - .withData(Map.of("right.value", "right-after-change")).build(); - - replaceConfigMap(rightConfigMapAfterChange); - - String[] resultAfterChange = new String[1]; - await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { - WebClient innerWebClient = builder().baseUrl("http://localhost/right").build(); - String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); - resultAfterChange[0] = innerResult; - return innerResult != null; - }); - Assertions.assertEquals("right-after-change", resultAfterChange[0]); - - manifests("two", Phase.DELETE, true); - } - - private static void manifests(String activeProfile, Phase phase, boolean secretsDisabled) { + /** + *
+	  * - there are two namespaces : left and right
+	  * - each of the namespaces has one configmap
+	  * - secrets are disabled
+	  * - we watch the "right" namespace and make a change in the configmap in the same
+	  namespace
+	  * - as such, event is triggered and we see the updated value
+	  * 
+ */ + void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { + + reCreate(); + patchThree(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + + Commons.assertReloadLogStatements("added configmap informer for namespace", + "added secret informer for namespace", IMAGE_NAME); + + // read the value from the right-configmap + WebClient webClient = builder().baseUrl("http://localhost/right").build(); + String result = + webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .block(); + Assertions.assertEquals("right-initial", result); + + // then deploy a new version of right-configmap + ConfigMap rightConfigMapAfterChange = new ConfigMapBuilder() + .withMetadata(new + ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) + .withData(Map.of("right.value", "right-after-change")).build(); + + replaceConfigMap(rightConfigMapAfterChange); + + String[] resultAfterChange = new String[1]; + await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() + -> { + WebClient innerWebClient = builder().baseUrl("http://localhost/right").build(); + String innerResult = + innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(retrySpec()).block(); + resultAfterChange[0] = innerResult; + return innerResult != null; + }); + Assertions.assertEquals("right-after-change", resultAfterChange[0]); + + } + + private static void manifests(Phase phase) { InputStream deploymentStream = util.inputStream("deployment.yaml"); InputStream serviceStream = util.inputStream("service.yaml"); @@ -298,21 +312,6 @@ private static void manifests(String activeProfile, Phase phase, boolean secrets Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); - List envVars = new ArrayList<>( - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv()); - EnvVar activeProfileProperty = new EnvVarBuilder().withName("SPRING_PROFILES_ACTIVE").withValue(activeProfile) - .build(); - envVars.add(activeProfileProperty); - - if (secretsDisabled) { - EnvVar secretsDisabledEnvVar = new EnvVarBuilder().withName("SPRING_CLOUD_KUBERNETES_SECRETS_ENABLED") - .withValue("FALSE").build(); - envVars.add(secretsDisabledEnvVar); - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(envVars); - } - - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(envVars); - Service service = Serialization.unmarshal(serviceStream, Service.class); Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class); ConfigMap leftConfigMap = Serialization.unmarshal(leftConfigMapStream, ConfigMap.class); @@ -322,22 +321,29 @@ private static void manifests(String activeProfile, Phase phase, boolean secrets if (phase.equals(Phase.CREATE)) { util.createAndWait("left", leftConfigMap, null); util.createAndWait("right", rightConfigMap, null); - if ("three".equals(activeProfile)) { - util.createAndWait("right", rightWithLabelConfigMap, null); - } + util.createAndWait("right", rightWithLabelConfigMap, null); util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); } else { util.deleteAndWait("left", leftConfigMap, null); util.deleteAndWait("right", rightConfigMap, null); - if ("three".equals(activeProfile)) { - util.deleteAndWait("right", rightWithLabelConfigMap, null); - } + util.deleteAndWait("right", rightWithLabelConfigMap, null); util.deleteAndWait(NAMESPACE, deployment, service, ingress); } } + private void reCreate() { + InputStream leftConfigMapStream = util.inputStream("left-configmap.yaml"); + InputStream rightConfigMapStream = util.inputStream("right-configmap.yaml"); + + ConfigMap leftConfigMap = Serialization.unmarshal(leftConfigMapStream, ConfigMap.class); + ConfigMap rightConfigMap = Serialization.unmarshal(rightConfigMapStream, ConfigMap.class); + + replaceConfigMap(leftConfigMap); + replaceConfigMap(rightConfigMap); + } + private WebClient.Builder builder() { return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java new file mode 100644 index 0000000000..0411773ab7 --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -0,0 +1,134 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; + +import java.util.Map; + +import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; + +/** + * @author wind57 + */ +final class TestUtil { + + private static final Map POD_LABELS = Map.of("app", + "spring-cloud-kubernetes-fabric8-client-configmap-event-reload"); + + private static final String BODY_ONE = """ + { + "spec": { + "template": { + "spec": { + "containers": [{ + "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", + "image": "image_name_here", + "env": [ + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_DISCOVERY", + "value": "DEBUG" + }, + { + "name": "SPRING_CLOUD_KUBERNETES_DISCOVERY_USE_ENDPOINT_SLICES", + "value": "TRUE" + }, + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "two" + } + ] + }] + } + } + } + } + """; + + private static final String BODY_TWO = """ + { + "spec": { + "template": { + "spec": { + "containers": [{ + "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", + "image": "image_name_here", + "env": [ + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_DISCOVERY", + "value": "DEBUG" + }, + { + "name": "SPRING_CLOUD_KUBERNETES_DISCOVERY_USE_ENDPOINT_SLICES", + "value": "TRUE" + }, + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "three" + } + ] + }] + } + } + } + } + """; + + private static final String BODY_THREE = """ + { + "spec": { + "template": { + "spec": { + "containers": [{ + "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", + "image": "image_name_here", + "env": [ + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_DISCOVERY", + "value": "DEBUG" + }, + { + "name": "SPRING_CLOUD_KUBERNETES_DISCOVERY_USE_ENDPOINT_SLICES", + "value": "TRUE" + }, + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "two" + } + ] + }] + } + } + } + } + """; + + private TestUtil() { + + } + + static void patchOne(Util util, String dockerImage, String deploymentName, String namespace) { + util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_ONE, POD_LABELS); + } + + static void patchTwo(Util util, String dockerImage, String deploymentName, String namespace) { + util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_TWO, POD_LABELS); + } + + static void patchThree(Util util, String dockerImage, String deploymentName, String namespace) { + util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_THREE, POD_LABELS); + } + +} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/deployment.yaml index a7fe7eaca3..d234ee8934 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/deployment.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/deployment.yaml @@ -1,7 +1,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: spring-cloud-kubernetes-fabric8-client-configmap-deployment-event-reload + name: spring-cloud-kubernetes-fabric8-client-configmap-event-reload spec: selector: matchLabels: @@ -28,4 +28,6 @@ spec: - containerPort: 8080 env: - name: LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_CONFIG_RELOAD - value: DEBUG + value: "DEBUG" + - name: SPRING_PROFILES_ACTIVE + value: "one" From fd54734d093835f97438ba247611d6a780a315b0 Mon Sep 17 00:00:00 2001 From: wind57 Date: Thu, 5 Oct 2023 08:10:31 +0300 Subject: [PATCH 02/26] checkstyle --- .../event/reload/ConfigMapEventReloadIT.java | 88 +++++++++---------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java index 9bf71fb026..ee3e4a0a92 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java @@ -254,52 +254,48 @@ void testInform() { Assertions.assertEquals("right-after-change", rightResult); } - /** - *
-	  * - there are two namespaces : left and right
-	  * - each of the namespaces has one configmap
-	  * - secrets are disabled
-	  * - we watch the "right" namespace and make a change in the configmap in the same
-	  namespace
-	  * - as such, event is triggered and we see the updated value
-	  * 
- */ - void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { - - reCreate(); - patchThree(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); - - Commons.assertReloadLogStatements("added configmap informer for namespace", - "added secret informer for namespace", IMAGE_NAME); - - // read the value from the right-configmap - WebClient webClient = builder().baseUrl("http://localhost/right").build(); - String result = - webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - Assertions.assertEquals("right-initial", result); - - // then deploy a new version of right-configmap - ConfigMap rightConfigMapAfterChange = new ConfigMapBuilder() - .withMetadata(new - ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) - .withData(Map.of("right.value", "right-after-change")).build(); - - replaceConfigMap(rightConfigMapAfterChange); - - String[] resultAfterChange = new String[1]; - await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() - -> { - WebClient innerWebClient = builder().baseUrl("http://localhost/right").build(); - String innerResult = - innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); - resultAfterChange[0] = innerResult; - return innerResult != null; - }); - Assertions.assertEquals("right-after-change", resultAfterChange[0]); - - } + /** + *
+	 * - there are two namespaces : left and right
+	 * - each of the namespaces has one configmap
+	 * - secrets are disabled
+	 * - we watch the "right" namespace and make a change in the configmap in the same
+	 * namespace
+	 * - as such, event is triggered and we see the updated value
+	 * 
+ */ + void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { + + reCreate(); + patchThree(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + + Commons.assertReloadLogStatements("added configmap informer for namespace", + "added secret informer for namespace", IMAGE_NAME); + + // read the value from the right-configmap + WebClient webClient = builder().baseUrl("http://localhost/right").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .block(); + Assertions.assertEquals("right-initial", result); + + // then deploy a new version of right-configmap + ConfigMap rightConfigMapAfterChange = new ConfigMapBuilder() + .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) + .withData(Map.of("right.value", "right-after-change")).build(); + + replaceConfigMap(rightConfigMapAfterChange); + + String[] resultAfterChange = new String[1]; + await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { + WebClient innerWebClient = builder().baseUrl("http://localhost/right").build(); + String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(retrySpec()).block(); + resultAfterChange[0] = innerResult; + return innerResult != null; + }); + Assertions.assertEquals("right-after-change", resultAfterChange[0]); + + } private static void manifests(Phase phase) { From cfacf3196411e98d52dde5c24871de0996947d00 Mon Sep 17 00:00:00 2001 From: wind57 Date: Thu, 5 Oct 2023 12:09:40 +0300 Subject: [PATCH 03/26] clean-up --- .../fabric8/configmap/event/reload/TestUtil.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java index 0411773ab7..457fdb5e64 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -41,10 +41,6 @@ final class TestUtil { "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_DISCOVERY", "value": "DEBUG" }, - { - "name": "SPRING_CLOUD_KUBERNETES_DISCOVERY_USE_ENDPOINT_SLICES", - "value": "TRUE" - }, { "name": "SPRING_PROFILES_ACTIVE", "value": "two" @@ -70,10 +66,6 @@ final class TestUtil { "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_DISCOVERY", "value": "DEBUG" }, - { - "name": "SPRING_CLOUD_KUBERNETES_DISCOVERY_USE_ENDPOINT_SLICES", - "value": "TRUE" - }, { "name": "SPRING_PROFILES_ACTIVE", "value": "three" @@ -99,10 +91,6 @@ final class TestUtil { "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_DISCOVERY", "value": "DEBUG" }, - { - "name": "SPRING_CLOUD_KUBERNETES_DISCOVERY_USE_ENDPOINT_SLICES", - "value": "TRUE" - }, { "name": "SPRING_PROFILES_ACTIVE", "value": "two" From ec05ccc53579260230f1dc0623618923a8405768 Mon Sep 17 00:00:00 2001 From: wind57 Date: Thu, 5 Oct 2023 12:15:37 +0300 Subject: [PATCH 04/26] clean-up --- .../kubernetes/fabric8/configmap/event/reload/TestUtil.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java index 457fdb5e64..0ada01d7d5 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -94,6 +94,10 @@ final class TestUtil { { "name": "SPRING_PROFILES_ACTIVE", "value": "two" + }, + { + "name": "SPRING_CLOUD_KUBERNETES_SECRETS_ENABLED", + "value": "FALSE" } ] }] From 8f2f2d9d7590195b4571b18b6604125c0e4b261b Mon Sep 17 00:00:00 2001 From: wind57 Date: Thu, 5 Oct 2023 12:24:23 +0300 Subject: [PATCH 05/26] started work --- .../event/reload/ConfigMapEventReloadIT.java | 9 +++ ...DataChangesInConfigMapReloadDelegate.java} | 77 ++----------------- .../configmap/event/reload/TestUtil.java | 37 +++++++++ 3 files changed, 51 insertions(+), 72 deletions(-) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/{DataChangesInConfigMapReloadIT.java => DataChangesInConfigMapReloadDelegate.java} (69%) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java index ee3e4a0a92..afabaa245b 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java @@ -47,6 +47,7 @@ import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchFour; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchOne; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchThree; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchTwo; @@ -140,6 +141,8 @@ void testInformFromOneNamespaceEventNotTriggered() { testInformFromOneNamespaceEventTriggered(); testInform(); testInformFromOneNamespaceEventTriggeredSecretsDisabled(); + + testDataChangesInConfigMap(); } /** @@ -297,6 +300,12 @@ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { } + void testDataChangesInConfigMap() { + reCreate(); + patchFour(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(); + } + private static void manifests(Phase phase) { InputStream deploymentStream = util.inputStream("deployment.yaml"); diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java similarity index 69% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadIT.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java index 032e32d0b7..f4b1cc1d01 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Set; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; @@ -34,10 +33,7 @@ import io.fabric8.kubernetes.api.model.networking.v1.Ingress; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.utils.Serialization; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; import org.testcontainers.containers.Container; import org.testcontainers.k3s.K3sContainer; import reactor.netty.http.client.HttpClient; @@ -53,7 +49,7 @@ import static org.awaitility.Awaitility.await; -class DataChangesInConfigMapReloadIT { +final class DataChangesInConfigMapReloadDelegate { private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap-event-reload"; @@ -67,26 +63,6 @@ class DataChangesInConfigMapReloadIT { private static KubernetesClient client; - @BeforeAll - static void beforeAll() throws Exception { - K3S.start(); - Commons.validateImage(IMAGE_NAME, K3S); - Commons.loadSpringCloudKubernetesImage(IMAGE_NAME, K3S); - - util = new Util(K3S); - client = util.client(); - - util.createNamespace(LEFT_NAMESPACE); - util.setUpClusterWide(NAMESPACE, Set.of(LEFT_NAMESPACE)); - } - - @AfterAll - static void afterAll() throws Exception { - util.deleteNamespace(LEFT_NAMESPACE); - Commons.cleanUp(IMAGE_NAME, K3S); - Commons.systemPrune(); - } - /** *
 	 *     - configMap with no labels and data: left.value = left-initial exists in namespace left
@@ -98,9 +74,7 @@ static void afterAll() throws Exception {
 	 *     - then we change data inside the config map, and we must see the updated value
 	 * 
*/ - @Test - void testSimple() { - manifests(Phase.CREATE); + static void testDataChangesInConfigMap() { Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); @@ -145,50 +119,9 @@ void testSimple() { return "left-after-change".equals(innerResult); }); - manifests(Phase.DELETE); - } - - private static void manifests(Phase phase) { - - InputStream deploymentStream = util.inputStream("deployment.yaml"); - InputStream serviceStream = util.inputStream("service.yaml"); - InputStream ingressStream = util.inputStream("ingress.yaml"); - InputStream configmapAsStream = util.inputStream("left-configmap.yaml"); - - Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); - - List envVars = new ArrayList<>( - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv()); - EnvVar activeProfileProperty = new EnvVarBuilder().withName("SPRING_PROFILES_ACTIVE").withValue("one").build(); - envVars.add(activeProfileProperty); - - EnvVar secretsDisabledEnvVar = new EnvVarBuilder().withName("SPRING_CLOUD_KUBERNETES_SECRETS_ENABLED") - .withValue("FALSE").build(); - - EnvVar debugLevel = new EnvVarBuilder() - .withName("LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_CLIENT_CONFIG_RELOAD").withName("DEBUG") - .build(); - envVars.add(debugLevel); - - envVars.add(secretsDisabledEnvVar); - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(envVars); - - Service service = Serialization.unmarshal(serviceStream, Service.class); - Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class); - ConfigMap configMap = Serialization.unmarshal(configmapAsStream, ConfigMap.class); - - if (phase.equals(Phase.CREATE)) { - util.createAndWait(LEFT_NAMESPACE, configMap, null); - util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); - } - else { - util.deleteAndWait(LEFT_NAMESPACE, configMap, null); - util.deleteAndWait(NAMESPACE, deployment, service, ingress); - } - } - private String logs() { + private static String logs() { try { String appPodName = K3S.execInContainer("sh", "-c", "kubectl get pods -l app=" + IMAGE_NAME + " -o=name --no-headers | tr -d '\n'").getStdout(); @@ -202,11 +135,11 @@ private String logs() { } } - private WebClient.Builder builder() { + private static WebClient.Builder builder() { return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); } - private RetryBackoffSpec retrySpec() { + private static RetryBackoffSpec retrySpec() { return Retry.fixedDelay(120, Duration.ofSeconds(2)).filter(Objects::nonNull); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java index 0ada01d7d5..6e32c15009 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -107,6 +107,39 @@ final class TestUtil { } """; + private static final String BODY_FOUR = """ + { + "spec": { + "template": { + "spec": { + "containers": [{ + "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", + "image": "image_name_here", + "env": [ + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_CONFIG_RELOAD", + "value": "DEBUG" + }, + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "one" + }, + { + "name": "SPRING_CLOUD_KUBERNETES_SECRETS_ENABLED", + "value": "FALSE" + }, + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_CLIENT_CONFIG_RELOAD", + "value": "DEBUG" + } + ] + }] + } + } + } + } + """; + private TestUtil() { } @@ -123,4 +156,8 @@ static void patchThree(Util util, String dockerImage, String deploymentName, Str util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_THREE, POD_LABELS); } + static void patchFour(Util util, String dockerImage, String deploymentName, String namespace) { + util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_FOUR, POD_LABELS); + } + } From 8ef893eaeb5404d9a953b4d7adea8e1bf35c5843 Mon Sep 17 00:00:00 2001 From: wind57 Date: Thu, 5 Oct 2023 12:36:42 +0300 Subject: [PATCH 06/26] clean-up --- .../event/reload/ConfigMapEventReloadIT.java | 48 +++++-------------- .../configmap/event/reload/TestUtil.java | 35 ++++++++++++++ 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java index ee3e4a0a92..8476daaaa3 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java @@ -19,7 +19,6 @@ import java.io.InputStream; import java.time.Duration; import java.util.Map; -import java.util.Objects; import java.util.Set; import io.fabric8.kubernetes.api.model.ConfigMap; @@ -35,21 +34,21 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; import org.springframework.http.HttpMethod; -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.fabric8.configmap.event.reload.TestUtil.builder; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchOne; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchThree; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchTwo; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.reCreateConfigMaps; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.replaceConfigMap; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; import static org.springframework.cloud.kubernetes.integration.tests.commons.Commons.pomVersion; /** @@ -125,7 +124,7 @@ void testInformFromOneNamespaceEventNotTriggered() { .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) .withData(Map.of("right.value", "right-after-change")).build(); - replaceConfigMap(rightConfigMapAfterChange); + replaceConfigMap(client, rightConfigMapAfterChange, "right"); webClient = builder().baseUrl("http://localhost/left").build(); @@ -153,7 +152,7 @@ void testInformFromOneNamespaceEventNotTriggered() { */ void testInformFromOneNamespaceEventTriggered() { - reCreate(); + reCreateConfigMaps(util, client); patchOne(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", @@ -170,7 +169,7 @@ void testInformFromOneNamespaceEventTriggered() { .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) .withData(Map.of("right.value", "right-after-change")).build(); - replaceConfigMap(rightConfigMapAfterChange); + replaceConfigMap(client, rightConfigMapAfterChange, "right"); String[] resultAfterChange = new String[1]; await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { @@ -195,7 +194,7 @@ void testInformFromOneNamespaceEventTriggered() { */ void testInform() { - reCreate(); + reCreateConfigMaps(util, client); patchTwo(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", @@ -218,7 +217,7 @@ void testInform() { .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) .withData(Map.of("right.value", "right-after-change")).build(); - replaceConfigMap(rightConfigMapAfterChange); + replaceConfigMap(client, rightConfigMapAfterChange, "right"); // nothing changes in our app, because we are watching only labeled configmaps await().pollInterval(Duration.ofSeconds(1)).atMost(Duration.ofSeconds(30)).until(() -> { @@ -233,7 +232,7 @@ void testInform() { new ObjectMetaBuilder().withNamespace("right").withName("right-configmap-with-label").build()) .withData(Map.of("right.with.label.value", "right-with-label-after-change")).build(); - replaceConfigMap(rightWithLabelConfigMapAfterChange); + replaceConfigMap(client, rightWithLabelConfigMapAfterChange, "right"); // since we have changed a labeled configmap, app will restart and pick up the new // value @@ -266,7 +265,7 @@ void testInform() { */ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { - reCreate(); + reCreateConfigMaps(util, client); patchThree(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", @@ -283,7 +282,7 @@ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) .withData(Map.of("right.value", "right-after-change")).build(); - replaceConfigMap(rightConfigMapAfterChange); + replaceConfigMap(client, rightConfigMapAfterChange, "right"); String[] resultAfterChange = new String[1]; await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { @@ -329,27 +328,4 @@ private static void manifests(Phase phase) { } - private void reCreate() { - InputStream leftConfigMapStream = util.inputStream("left-configmap.yaml"); - InputStream rightConfigMapStream = util.inputStream("right-configmap.yaml"); - - ConfigMap leftConfigMap = Serialization.unmarshal(leftConfigMapStream, ConfigMap.class); - ConfigMap rightConfigMap = Serialization.unmarshal(rightConfigMapStream, ConfigMap.class); - - replaceConfigMap(leftConfigMap); - replaceConfigMap(rightConfigMap); - } - - private WebClient.Builder builder() { - return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); - } - - private RetryBackoffSpec retrySpec() { - return Retry.fixedDelay(120, Duration.ofSeconds(2)).filter(Objects::nonNull); - } - - private static void replaceConfigMap(ConfigMap configMap) { - client.configMaps().inNamespace("right").resource(configMap).createOrReplace(); - } - } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java index 0ada01d7d5..992b242eac 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -16,9 +16,21 @@ package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +import java.io.InputStream; +import java.time.Duration; import java.util.Map; +import java.util.Objects; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.utils.Serialization; +import reactor.netty.http.client.HttpClient; +import reactor.util.retry.Retry; +import reactor.util.retry.RetryBackoffSpec; import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.client.WebClient; /** * @author wind57 @@ -111,6 +123,21 @@ private TestUtil() { } + static void reCreateConfigMaps(Util util, KubernetesClient client) { + InputStream leftConfigMapStream = util.inputStream("left-configmap.yaml"); + InputStream rightConfigMapStream = util.inputStream("right-configmap.yaml"); + + ConfigMap leftConfigMap = Serialization.unmarshal(leftConfigMapStream, ConfigMap.class); + ConfigMap rightConfigMap = Serialization.unmarshal(rightConfigMapStream, ConfigMap.class); + + replaceConfigMap(client, leftConfigMap, "left"); + replaceConfigMap(client, rightConfigMap, "right"); + } + + static void replaceConfigMap(KubernetesClient client, ConfigMap configMap, String namespace) { + client.configMaps().inNamespace(namespace).resource(configMap).createOrReplace(); + } + static void patchOne(Util util, String dockerImage, String deploymentName, String namespace) { util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_ONE, POD_LABELS); } @@ -123,4 +150,12 @@ static void patchThree(Util util, String dockerImage, String deploymentName, Str util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_THREE, POD_LABELS); } + static WebClient.Builder builder() { + return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); + } + + static RetryBackoffSpec retrySpec() { + return Retry.fixedDelay(120, Duration.ofSeconds(2)).filter(Objects::nonNull); + } + } From 446eee2513e2f3dad4b3e1a8bbf082c2a18a8f3a Mon Sep 17 00:00:00 2001 From: wind57 Date: Thu, 5 Oct 2023 15:44:52 +0300 Subject: [PATCH 07/26] started-work --- spring-cloud-kubernetes-integration-tests/pom.xml | 2 +- .../pom.xml | 2 +- .../cloud/kubernetes/fabric8/configmap/event/reload/App.java | 0 .../kubernetes/fabric8/configmap/event/reload/Controller.java | 0 .../fabric8/configmap/event/reload/LeftProperties.java | 0 .../fabric8/configmap/event/reload/RightProperties.java | 0 .../configmap/event/reload/RightWithLabelsProperties.java | 0 .../src/main/resources/application-one.yaml | 0 .../src/main/resources/application-three.yaml | 0 .../src/main/resources/application-two.yaml | 0 .../src/main/resources/bootstrap-one.yaml | 0 .../src/main/resources/bootstrap-three.yaml | 0 .../src/main/resources/bootstrap-two.yaml | 0 .../fabric8/configmap/event/reload/ConfigMapEventReloadIT.java | 0 .../event/reload/DataChangesInConfigMapReloadDelegate.java | 0 .../kubernetes/fabric8/configmap/event/reload/TestUtil.java | 0 .../src/test/resources/deployment.yaml | 0 .../src/test/resources/ingress.yaml | 0 .../src/test/resources/left-configmap.yaml | 0 .../src/test/resources/logback-test.xml | 0 .../src/test/resources/right-configmap-with-label.yaml | 0 .../src/test/resources/right-configmap.yaml | 0 .../src/test/resources/service.yaml | 0 23 files changed, 2 insertions(+), 2 deletions(-) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/pom.xml (97%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/LeftProperties.java (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightProperties.java (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightWithLabelsProperties.java (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/application-one.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/application-three.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/application-two.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/bootstrap-one.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/bootstrap-three.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/bootstrap-two.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/deployment.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/ingress.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/left-configmap.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/logback-test.xml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/right-configmap-with-label.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/right-configmap.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/service.yaml (100%) diff --git a/spring-cloud-kubernetes-integration-tests/pom.xml b/spring-cloud-kubernetes-integration-tests/pom.xml index 03363f509a..6db3fbf032 100644 --- a/spring-cloud-kubernetes-integration-tests/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/pom.xml @@ -54,7 +54,7 @@ spring-cloud-kubernetes-fabric8-client-loadbalancer spring-cloud-kubernetes-fabric8-client-configmap-polling-reload spring-cloud-kubernetes-fabric8-client-secrets-event-reload - spring-cloud-kubernetes-fabric8-client-configmap-event-reload + spring-cloud-kubernetes-fabric8-client-reload spring-cloud-kubernetes-discoveryclient-it spring-cloud-kubernetes-client-loadbalancer-it diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/pom.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/pom.xml similarity index 97% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/pom.xml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/pom.xml index a1ba8bb15b..5af09ed21d 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - spring-cloud-kubernetes-fabric8-client-configmap-event-reload + spring-cloud-kubernetes-fabric8-client-reload diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/LeftProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/LeftProperties.java similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/LeftProperties.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/LeftProperties.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightProperties.java similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightProperties.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightProperties.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightWithLabelsProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightWithLabelsProperties.java similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightWithLabelsProperties.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightWithLabelsProperties.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/application-one.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-one.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/application-one.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-one.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/application-three.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-three.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/application-three.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-three.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/application-two.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-two.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/application-two.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-two.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/bootstrap-one.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/bootstrap-one.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/bootstrap-one.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/bootstrap-one.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/bootstrap-three.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/bootstrap-three.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/bootstrap-three.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/bootstrap-three.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/bootstrap-two.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/bootstrap-two.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/main/resources/bootstrap-two.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/bootstrap-two.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/deployment.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/ingress.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/ingress.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/ingress.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/ingress.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/left-configmap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/left-configmap.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/left-configmap.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/left-configmap.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/logback-test.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/logback-test.xml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/logback-test.xml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/logback-test.xml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/right-configmap-with-label.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap-with-label.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/right-configmap-with-label.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap-with-label.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/right-configmap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/right-configmap.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/service.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/service.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/resources/service.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/service.yaml From 8c8370e0cee5c8d1b793b72e4c4887fc1d003577 Mon Sep 17 00:00:00 2001 From: wind57 Date: Thu, 5 Oct 2023 16:32:12 +0300 Subject: [PATCH 08/26] continue work --- .../pom.xml | 1 - .../pom.xml | 116 -------------- .../polling/reload/ConfigMapApp.java | 35 ----- .../polling/reload/ConfigMapController.java | 39 ----- .../reload/ConfigMapPollingReloadIT.java | 145 ------------------ .../src/test/resources/deployment.yaml | 28 ---- .../src/test/resources/ingress.yaml | 16 -- .../src/test/resources/logback-test.xml | 15 -- .../test/resources/mount/configmap-mount.yaml | 8 - .../resources/mount/deployment-mount.yaml | 37 ----- .../src/test/resources/service.yaml | 14 -- .../fabric8/configmap/event/reload/App.java | 3 +- .../event}/reload/ConfigMapProperties.java | 2 +- .../configmap/event/reload/Controller.java | 10 +- .../src/main/resources/application-mount.yaml | 0 .../main/resources/application-no-mount.yaml | 0 .../resources/application-with-bootstrap.yaml | 0 .../resources/bootstrap-with-bootstrap.yaml | 0 ...pEnabledPollingReloadConfigMapMountIT.java | 27 ++-- .../event/reload/ConfigMapEventReloadIT.java | 14 +- .../ConfigMapPollingReloadDelegate.java | 61 ++++++++ .../reload/PollingReloadConfigMapMountIT.java | 27 ++-- .../configmap/event/reload/TestUtil.java | 28 +++- .../src/test/resources/configmap.yaml | 0 .../src/test/resources/deployment.yaml | 10 +- .../src/test/resources/ingress.yaml | 4 +- .../src/test/resources/service.yaml | 6 +- 27 files changed, 148 insertions(+), 498 deletions(-) delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/pom.xml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapApp.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapController.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapPollingReloadIT.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/deployment.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/ingress.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/logback-test.xml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/mount/configmap-mount.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/mount/deployment-mount.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/service.yaml rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling => spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event}/reload/ConfigMapProperties.java (92%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-polling-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/application-mount.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-polling-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/application-no-mount.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-polling-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/application-with-bootstrap.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-polling-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/main/resources/bootstrap-with-bootstrap.yaml (100%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling => spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event}/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java (98%) create mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling => spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event}/reload/PollingReloadConfigMapMountIT.java (98%) rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-configmap-polling-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/configmap.yaml (100%) diff --git a/spring-cloud-kubernetes-integration-tests/pom.xml b/spring-cloud-kubernetes-integration-tests/pom.xml index 6db3fbf032..daae6f3637 100644 --- a/spring-cloud-kubernetes-integration-tests/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/pom.xml @@ -52,7 +52,6 @@ spring-cloud-kubernetes-fabric8-istio-it spring-cloud-kubernetes-fabric8-client-discovery spring-cloud-kubernetes-fabric8-client-loadbalancer - spring-cloud-kubernetes-fabric8-client-configmap-polling-reload spring-cloud-kubernetes-fabric8-client-secrets-event-reload spring-cloud-kubernetes-fabric8-client-reload diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/pom.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/pom.xml deleted file mode 100644 index c5b250af03..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/pom.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - org.springframework.cloud - spring-cloud-kubernetes-integration-tests - 3.0.5-SNAPSHOT - - 4.0.0 - - spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - - - - - org.springframework.cloud - spring-cloud-kubernetes-fabric8-config - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - org.springframework.cloud - spring-cloud-starter - - - - org.springframework.cloud - spring-cloud-kubernetes-test-support - - - - - - - - ../src/main/resources - true - - - src/main/resources - true - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - docker.io/springcloud/${project.artifactId}:${project.version} - - - - build-image - - ${skip.build.image} - - package - - build-image - - - - repackage - package - - repackage - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - - - - - - ${testsToRun} - - - - - - - - diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapApp.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapApp.java deleted file mode 100644 index 8594a99cc6..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapApp.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2013-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap.polling.reload; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; - -/** - * @author wind57 - */ - -@SpringBootApplication -@EnableConfigurationProperties(ConfigMapProperties.class) -public class ConfigMapApp { - - public static void main(String[] args) { - SpringApplication.run(ConfigMapApp.class, args); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapController.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapController.java deleted file mode 100644 index c59aa7fc93..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapController.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2013-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap.polling.reload; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author wind57 - */ -@RestController -public class ConfigMapController { - - private final ConfigMapProperties properties; - - public ConfigMapController(ConfigMapProperties properties) { - this.properties = properties; - } - - @GetMapping("/key") - public String key() { - return properties.getKey(); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapPollingReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapPollingReloadIT.java deleted file mode 100644 index 699e205863..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapPollingReloadIT.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2013-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap.polling.reload; - -import java.io.InputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import io.fabric8.kubernetes.api.model.ConfigMap; -import io.fabric8.kubernetes.api.model.ConfigMapBuilder; -import io.fabric8.kubernetes.api.model.EnvVar; -import io.fabric8.kubernetes.api.model.EnvVarBuilder; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.networking.v1.Ingress; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.utils.Serialization; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; - -import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; -import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; -import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.WebClient; - -import static org.awaitility.Awaitility.await; - -/** - * @author wind57 - */ -class ConfigMapPollingReloadIT { - - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap-polling-reload"; - - private static final String NAMESPACE = "default"; - - private static Util util; - - private static KubernetesClient client; - - private static final K3sContainer K3S = Commons.container(); - - @BeforeAll - static void beforeAll() throws Exception { - K3S.start(); - Commons.validateImage(IMAGE_NAME, K3S); - Commons.loadSpringCloudKubernetesImage(IMAGE_NAME, K3S); - util = new Util(K3S); - client = util.client(); - util.setUp(NAMESPACE); - manifests(Phase.CREATE); - } - - @AfterAll - static void after() throws Exception { - manifests(Phase.DELETE); - Commons.cleanUp(IMAGE_NAME, K3S); - Commons.systemPrune(); - } - - @Test - void test() { - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - - // we first read the initial value from the configmap - Assertions.assertEquals("initial", result); - - // then deploy a new version of configmap - // since we poll and have reload in place, the new property must be visible - ConfigMap map = new ConfigMapBuilder() - .withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("poll-reload").build()) - .withData(Map.of("application.properties", "from.properties.key=after-change")).build(); - - client.configMaps().inNamespace("default").resource(map).createOrReplace(); - - await().timeout(Duration.ofSeconds(60)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("after-change")); - - } - - private static void manifests(Phase phase) { - - InputStream deploymentStream = util.inputStream("deployment.yaml"); - InputStream serviceStream = util.inputStream("service.yaml"); - InputStream ingressStream = util.inputStream("ingress.yaml"); - InputStream configMapStream = util.inputStream("configmap.yaml"); - - Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); - Service service = Serialization.unmarshal(serviceStream, Service.class); - Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class); - ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); - - List existing = new ArrayList<>( - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv()); - existing.add(new EnvVarBuilder().withName("SPRING_PROFILES_ACTIVE").withValue("no-mount").build()); - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(existing); - - if (phase.equals(Phase.CREATE)) { - util.createAndWait(NAMESPACE, configMap, null); - util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); - } - else { - util.deleteAndWait(NAMESPACE, configMap, null); - util.deleteAndWait(NAMESPACE, deployment, service, ingress); - } - - } - - private WebClient.Builder builder() { - return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); - } - - private RetryBackoffSpec retrySpec() { - return Retry.fixedDelay(60, Duration.ofSeconds(1)).filter(Objects::nonNull); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/deployment.yaml deleted file mode 100644 index 39f4572c07..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/deployment.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: spring-cloud-kubernetes-fabric8-client-configmap-deployment-polling-reload -spec: - selector: - matchLabels: - app: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - template: - metadata: - labels: - app: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - spec: - serviceAccountName: spring-cloud-kubernetes-serviceaccount - containers: - - name: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - image: docker.io/springcloud/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - imagePullPolicy: IfNotPresent - readinessProbe: - httpGet: - port: 8080 - path: /actuator/health/readiness - livenessProbe: - httpGet: - port: 8080 - path: /actuator/health/liveness - ports: - - containerPort: 8080 diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/ingress.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/ingress.yaml deleted file mode 100644 index fd53e216c1..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/ingress.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: spring-cloud-kubernetes-fabric8-client-configmap-ingress-polling-reload - namespace: default -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - port: - number: 8080 diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/logback-test.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/logback-test.xml deleted file mode 100644 index ee24334373..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/logback-test.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n - - - - - - - - - - - diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/mount/configmap-mount.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/mount/configmap-mount.yaml deleted file mode 100644 index f2ea29a5c2..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/mount/configmap-mount.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: poll-reload-as-mount - namespace: default -data: - application.properties: | - from.properties.key=as-mount-initial diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/mount/deployment-mount.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/mount/deployment-mount.yaml deleted file mode 100644 index 4678398618..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/mount/deployment-mount.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: spring-cloud-kubernetes-fabric8-client-configmap-deployment-polling-reload -spec: - selector: - matchLabels: - app: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - template: - metadata: - labels: - app: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - spec: - serviceAccountName: spring-cloud-kubernetes-serviceaccount - containers: - - name: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - image: docker.io/springcloud/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - imagePullPolicy: IfNotPresent - readinessProbe: - httpGet: - port: 8080 - path: /actuator/health/readiness - livenessProbe: - httpGet: - port: 8080 - path: /actuator/health/liveness - ports: - - containerPort: 8080 - - volumeMounts: - - name: config-map-volume - mountPath: /tmp - - volumes: - - name: config-map-volume - configMap: - name: poll-reload-as-mount diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/service.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/service.yaml deleted file mode 100644 index 2995e2b6b0..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/service.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - app: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - name: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload -spec: - ports: - - name: http - port: 8080 - targetPort: 8080 - selector: - app: spring-cloud-kubernetes-fabric8-client-configmap-polling-reload - type: ClusterIP diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java index de569386f3..c76522c88b 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java @@ -24,7 +24,8 @@ * @author wind57 */ @SpringBootApplication -@EnableConfigurationProperties({ LeftProperties.class, RightProperties.class, RightWithLabelsProperties.class }) +@EnableConfigurationProperties({ LeftProperties.class, RightProperties.class, RightWithLabelsProperties.class, + ConfigMapProperties.class }) public class App { public static void main(String[] args) { diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapProperties.java similarity index 92% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapProperties.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapProperties.java index 0b6f7e61d7..02dd065eca 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/ConfigMapProperties.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.polling.reload; +package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java index ff3a8c851c..f9fef32a51 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java @@ -31,11 +31,14 @@ public class Controller { private final RightWithLabelsProperties rightWithLabelsProperties; + private final ConfigMapProperties configMapProperties; + public Controller(LeftProperties leftProperties, RightProperties rightProperties, - RightWithLabelsProperties rightWithLabelsProperties) { + RightWithLabelsProperties rightWithLabelsProperties, ConfigMapProperties configMapProperties) { this.leftProperties = leftProperties; this.rightProperties = rightProperties; this.rightWithLabelsProperties = rightWithLabelsProperties; + this.configMapProperties = configMapProperties; } @GetMapping("/left") @@ -53,4 +56,9 @@ public String witLabel() { return rightWithLabelsProperties.getValue(); } + @GetMapping("/key") + public String key() { + return configMapProperties.getKey(); + } + } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/resources/application-mount.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-mount.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/resources/application-mount.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-mount.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/resources/application-no-mount.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-no-mount.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/resources/application-no-mount.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-no-mount.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/resources/application-with-bootstrap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-with-bootstrap.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/resources/application-with-bootstrap.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-with-bootstrap.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/resources/bootstrap-with-bootstrap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/bootstrap-with-bootstrap.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/main/resources/bootstrap-with-bootstrap.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/bootstrap-with-bootstrap.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java similarity index 98% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java index 245ffaf4ff..20de6a40ea 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java @@ -14,14 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.polling.reload; - -import java.io.InputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.EnvVar; @@ -35,18 +28,24 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.testcontainers.containers.Container; -import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; - import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; import org.springframework.http.HttpMethod; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.client.WebClient; +import org.testcontainers.containers.Container; +import org.testcontainers.k3s.K3sContainer; +import reactor.netty.http.client.HttpClient; +import reactor.util.retry.Retry; +import reactor.util.retry.RetryBackoffSpec; + +import java.io.InputStream; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; import static org.awaitility.Awaitility.await; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java index 9ce9a8ab07..0f5228d579 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java @@ -43,6 +43,7 @@ import static org.awaitility.Awaitility.await; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchFive; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchFour; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchOne; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchThree; @@ -57,7 +58,7 @@ */ class ConfigMapEventReloadIT { - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap-event-reload"; + private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-reload"; private static final String DOCKER_IMAGE = "docker.io/springcloud/" + IMAGE_NAME + ":" + pomVersion(); @@ -141,6 +142,7 @@ void testInformFromOneNamespaceEventNotTriggered() { testInform(); testInformFromOneNamespaceEventTriggeredSecretsDisabled(); testDataChangesInConfigMap(); + testConfigMapPollingReload(); } /** @@ -304,6 +306,12 @@ void testDataChangesInConfigMap() { DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(client); } + void testConfigMapPollingReload() { + + patchFive(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + ConfigMapPollingReloadDelegate.testConfigMapPollingReload(client); + } + private static void manifests(Phase phase) { InputStream deploymentStream = util.inputStream("deployment.yaml"); @@ -312,6 +320,7 @@ private static void manifests(Phase phase) { InputStream leftConfigMapStream = util.inputStream("left-configmap.yaml"); InputStream rightConfigMapStream = util.inputStream("right-configmap.yaml"); InputStream rightWithLabelConfigMapStream = util.inputStream("right-configmap-with-label.yaml"); + InputStream configMapAsStream = util.inputStream("configmap.yaml"); Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); @@ -320,17 +329,20 @@ private static void manifests(Phase phase) { ConfigMap leftConfigMap = Serialization.unmarshal(leftConfigMapStream, ConfigMap.class); ConfigMap rightConfigMap = Serialization.unmarshal(rightConfigMapStream, ConfigMap.class); ConfigMap rightWithLabelConfigMap = Serialization.unmarshal(rightWithLabelConfigMapStream, ConfigMap.class); + ConfigMap configMap = Serialization.unmarshal(configMapAsStream, ConfigMap.class); if (phase.equals(Phase.CREATE)) { util.createAndWait("left", leftConfigMap, null); util.createAndWait("right", rightConfigMap, null); util.createAndWait("right", rightWithLabelConfigMap, null); + util.createAndWait(NAMESPACE, configMap, null); util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); } else { util.deleteAndWait("left", leftConfigMap, null); util.deleteAndWait("right", rightConfigMap, null); util.deleteAndWait("right", rightWithLabelConfigMap, null); + util.deleteAndWait(NAMESPACE, configMap, null); util.deleteAndWait(NAMESPACE, deployment, service, ingress); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java new file mode 100644 index 0000000000..933f358d7e --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; + +import java.time.Duration; +import java.util.Map; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import org.junit.jupiter.api.Assertions; + +import org.springframework.http.HttpMethod; +import org.springframework.web.reactive.function.client.WebClient; + +import static org.awaitility.Awaitility.await; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; + +/** + * @author wind57 + */ +final class ConfigMapPollingReloadDelegate { + + static void testConfigMapPollingReload(KubernetesClient client) { + WebClient webClient = builder().baseUrl("http://localhost/key").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .block(); + + // we first read the initial value from the configmap + Assertions.assertEquals("initial", result); + + // then deploy a new version of configmap + // since we poll and have reload in place, the new property must be visible + ConfigMap map = new ConfigMapBuilder() + .withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("poll-reload").build()) + .withData(Map.of("application.properties", "from.properties.key=after-change")).build(); + + client.configMaps().inNamespace("default").resource(map).createOrReplace(); + + await().timeout(Duration.ofSeconds(60)).until(() -> webClient.method(HttpMethod.GET).retrieve() + .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("after-change")); + + } + +} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/PollingReloadConfigMapMountIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/PollingReloadConfigMapMountIT.java similarity index 98% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/PollingReloadConfigMapMountIT.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/PollingReloadConfigMapMountIT.java index 0ab3bebc39..0ca0660fc7 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/polling/reload/PollingReloadConfigMapMountIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/PollingReloadConfigMapMountIT.java @@ -14,14 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.polling.reload; - -import java.io.InputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.EnvVar; @@ -35,18 +28,24 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.testcontainers.containers.Container; -import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; - import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; import org.springframework.http.HttpMethod; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.client.WebClient; +import org.testcontainers.containers.Container; +import org.testcontainers.k3s.K3sContainer; +import reactor.netty.http.client.HttpClient; +import reactor.util.retry.Retry; +import reactor.util.retry.RetryBackoffSpec; + +import java.io.InputStream; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; import static org.awaitility.Awaitility.await; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java index f0723aeb68..62f1bfc263 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -37,8 +37,7 @@ */ final class TestUtil { - private static final Map POD_LABELS = Map.of("app", - "spring-cloud-kubernetes-fabric8-client-configmap-event-reload"); + private static final Map POD_LABELS = Map.of("app", "spring-cloud-kubernetes-fabric8-client-reload"); private static final String BODY_ONE = """ { @@ -152,6 +151,27 @@ final class TestUtil { } """; + private static final String BODY_FIVE = """ + { + "spec": { + "template": { + "spec": { + "containers": [{ + "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", + "image": "image_name_here", + "env": [ + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "no-mount" + } + ] + }] + } + } + } + } + """; + private TestUtil() { } @@ -187,6 +207,10 @@ static void patchFour(Util util, String dockerImage, String deploymentName, Stri util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_FOUR, POD_LABELS); } + static void patchFive(Util util, String dockerImage, String deploymentName, String namespace) { + util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_FIVE, POD_LABELS); + } + static WebClient.Builder builder() { return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/configmap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/configmap.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-polling-reload/src/test/resources/configmap.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/configmap.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml index d234ee8934..48c1f638e8 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml @@ -1,20 +1,20 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: spring-cloud-kubernetes-fabric8-client-configmap-event-reload + name: spring-cloud-kubernetes-fabric8-client-reload spec: selector: matchLabels: - app: spring-cloud-kubernetes-fabric8-client-configmap-event-reload + app: spring-cloud-kubernetes-fabric8-client-reload template: metadata: labels: - app: spring-cloud-kubernetes-fabric8-client-configmap-event-reload + app: spring-cloud-kubernetes-fabric8-client-reload spec: serviceAccountName: spring-cloud-kubernetes-serviceaccount containers: - - name: spring-cloud-kubernetes-fabric8-client-configmap-event-reload - image: docker.io/springcloud/spring-cloud-kubernetes-fabric8-client-configmap-event-reload + - name: spring-cloud-kubernetes-fabric8-client-reload + image: docker.io/springcloud/spring-cloud-kubernetes-fabric8-client-reload imagePullPolicy: IfNotPresent readinessProbe: httpGet: diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/ingress.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/ingress.yaml index 1069481ee9..d6e9e49a9e 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/ingress.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/ingress.yaml @@ -1,7 +1,7 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - name: spring-cloud-kubernetes-fabric8-client-configmap-ingress-event-reload + name: spring-cloud-kubernetes-fabric8-client-reload-ingress namespace: default spec: rules: @@ -11,6 +11,6 @@ spec: pathType: Prefix backend: service: - name: spring-cloud-kubernetes-fabric8-client-configmap-event-reload + name: spring-cloud-kubernetes-fabric8-client-reload port: number: 8080 diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/service.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/service.yaml index bbaf7b1e4f..3f73ad0763 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/service.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/service.yaml @@ -2,13 +2,13 @@ apiVersion: v1 kind: Service metadata: labels: - app: spring-cloud-kubernetes-fabric8-client-configmap-event-reload - name: spring-cloud-kubernetes-fabric8-client-configmap-event-reload + app: spring-cloud-kubernetes-fabric8-client-reload + name: spring-cloud-kubernetes-fabric8-client-reload spec: ports: - name: http port: 8080 targetPort: 8080 selector: - app: spring-cloud-kubernetes-fabric8-client-configmap-event-reload + app: spring-cloud-kubernetes-fabric8-client-reload type: ClusterIP From 74c03f5a528e5319d8201619d87418c8d392e90d Mon Sep 17 00:00:00 2001 From: wind57 Date: Thu, 5 Oct 2023 21:02:40 +0300 Subject: [PATCH 09/26] dirty --- .../event/reload/ConfigMapEventReloadIT.java | 8 +- .../ConfigMapMountPollingReloadDelegate.java | 84 ++++++++ .../DataChangesInConfigMapReloadDelegate.java | 24 +-- .../reload/PollingReloadConfigMapMountIT.java | 197 ------------------ .../configmap/event/reload/TestUtil.java | 44 ++++ 5 files changed, 138 insertions(+), 219 deletions(-) create mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/PollingReloadConfigMapMountIT.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java index 0f5228d579..fea28c48d8 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java @@ -143,6 +143,7 @@ void testInformFromOneNamespaceEventNotTriggered() { testInformFromOneNamespaceEventTriggeredSecretsDisabled(); testDataChangesInConfigMap(); testConfigMapPollingReload(); + testConfigMapMountPollingReload(); } /** @@ -303,15 +304,18 @@ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { void testDataChangesInConfigMap() { reCreateConfigMaps(util, client); patchFour(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); - DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(client); + DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(client, K3S, IMAGE_NAME); } void testConfigMapPollingReload() { - patchFive(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); ConfigMapPollingReloadDelegate.testConfigMapPollingReload(client); } + void testConfigMapMountPollingReload() { + ConfigMapMountPollingReloadDelegate.testConfigMapMountPollingReload(client, util, K3S, IMAGE_NAME); + } + private static void manifests(Phase phase) { InputStream deploymentStream = util.inputStream("deployment.yaml"); diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java new file mode 100644 index 0000000000..3fa72b3d82 --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java @@ -0,0 +1,84 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; + +import java.io.InputStream; +import java.time.Duration; +import java.util.Map; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.utils.Serialization; +import org.junit.jupiter.api.Assertions; +import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; +import org.springframework.http.HttpMethod; +import org.springframework.web.reactive.function.client.WebClient; +import org.testcontainers.k3s.K3sContainer; + +import static org.awaitility.Awaitility.await; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.logs; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; + +/** + * @author wind57 + */ +final class ConfigMapMountPollingReloadDelegate { + + /** + *
+	 *     - we have "spring.config.import: kubernetes", which means we will 'locate' property sources
+	 *       from config maps.
+	 *     - the property above means that at the moment we will be searching for config maps that only
+	 *       match the application name, in this specific test there is no such config map.
+	 *     - what we will also read, is 'spring.cloud.kubernetes.config.paths', which we have set to
+	 *     	 '/tmp/application.properties'
+	 *       in this test. That is populated by the volumeMounts (see deployment-mount.yaml)
+	 *     - we first assert that we are actually reading the path based source via (1), (2) and (3).
+	 *
+	 *     - we then change the config map content, wait for k8s to pick it up and replace them
+	 *     - our polling will then detect that change, and trigger a reload.
+	 * 
+ */ + static void testConfigMapMountPollingReload(KubernetesClient client, Util util, K3sContainer container, + String appLabelValue) { + String logs = logs(container, appLabelValue); + // (1) + Assertions.assertTrue(logs.contains("paths property sources : [/tmp/application.properties]")); + // (2) + Assertions.assertTrue(logs.contains("will add file-based property source : /tmp/application.properties")); + // (3) + WebClient webClient = builder().baseUrl("http://localhost/key").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .block(); + + // we first read the initial value from the configmap + Assertions.assertEquals("as-mount-initial", result); + + // replace data in configmap and wait for k8s to pick it up + // our polling will detect that and restart the app + InputStream configMapStream = util.inputStream("mount/configmap-mount.yaml"); + ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); + configMap.setData(Map.of("application.properties", "from.properties.key=as-mount-changed")); + client.configMaps().inNamespace("default").resource(configMap).createOrReplace(); + + await().timeout(Duration.ofSeconds(360)).until(() -> webClient.method(HttpMethod.GET).retrieve() + .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("as-mount-changed")); + + } + +} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java index f9d0ac0e49..e679f28795 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java @@ -24,7 +24,6 @@ import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.KubernetesClient; import org.junit.jupiter.api.Assertions; -import org.testcontainers.containers.Container; import org.testcontainers.k3s.K3sContainer; import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; @@ -33,17 +32,16 @@ import static org.awaitility.Awaitility.await; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.logs; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.replaceConfigMap; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; final class DataChangesInConfigMapReloadDelegate { - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap-event-reload"; + private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-reload"; private static final String LEFT_NAMESPACE = "left"; - private static final K3sContainer K3S = Commons.container(); - /** *
 	 *     - configMap with no labels and data: left.value = left-initial exists in namespace left
@@ -55,7 +53,7 @@ final class DataChangesInConfigMapReloadDelegate {
 	 *     - then we change data inside the config map, and we must see the updated value
 	 * 
*/ - static void testDataChangesInConfigMap(KubernetesClient client) { + static void testDataChangesInConfigMap(KubernetesClient client, K3sContainer container, String appLabelValue) { Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); @@ -81,7 +79,7 @@ static void testDataChangesInConfigMap(KubernetesClient client) { return "left-initial".equals(innerResult); }); - String logs = logs(); + String logs = logs(container, appLabelValue); Assertions.assertTrue(logs.contains("ConfigMap left-configmap was updated in namespace left")); Assertions.assertTrue(logs.contains("data in configmap has not changed, will not reload")); @@ -102,18 +100,4 @@ static void testDataChangesInConfigMap(KubernetesClient client) { } - private static String logs() { - try { - String appPodName = K3S.execInContainer("sh", "-c", - "kubectl get pods -l app=" + IMAGE_NAME + " -o=name --no-headers | tr -d '\n'").getStdout(); - - Container.ExecResult execResult = K3S.execInContainer("sh", "-c", "kubectl logs " + appPodName.trim()); - return execResult.getStdout(); - } - catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/PollingReloadConfigMapMountIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/PollingReloadConfigMapMountIT.java deleted file mode 100644 index 0ca0660fc7..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/PollingReloadConfigMapMountIT.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; - -import io.fabric8.kubernetes.api.model.ConfigMap; -import io.fabric8.kubernetes.api.model.EnvVar; -import io.fabric8.kubernetes.api.model.EnvVarBuilder; -import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.networking.v1.Ingress; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.utils.Serialization; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; -import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; -import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.WebClient; -import org.testcontainers.containers.Container; -import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; - -import java.io.InputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static org.awaitility.Awaitility.await; - -/** - * @author wind57 - */ -class PollingReloadConfigMapMountIT { - - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap-polling-reload"; - - private static final String NAMESPACE = "default"; - - private static Util util; - - private static KubernetesClient client; - - private static final K3sContainer K3S = Commons.container(); - - @BeforeAll - static void beforeAll() throws Exception { - K3S.start(); - Commons.validateImage(IMAGE_NAME, K3S); - Commons.loadSpringCloudKubernetesImage(IMAGE_NAME, K3S); - util = new Util(K3S); - client = util.client(); - util.setUp(NAMESPACE); - manifests(Phase.CREATE); - } - - @AfterAll - static void after() throws Exception { - manifests(Phase.DELETE); - Commons.cleanUp(IMAGE_NAME, K3S); - Commons.systemPrune(); - } - - /** - *
-	 *     - we have "spring.config.import: kubernetes", which means we will 'locate' property sources
-	 *       from config maps.
-	 *     - the property above means that at the moment we will be searching for config maps that only
-	 *       match the application name, in this specific test there is no such config map.
-	 *     - what we will also read, is 'spring.cloud.kubernetes.config.paths', which we have set to
-	 *     	 '/tmp/application.properties'
-	 *       in this test. That is populated by the volumeMounts (see deployment-mount.yaml)
-	 *     - we first assert that we are actually reading the path based source via (1), (2) and (3).
-	 *
-	 *     - we then change the config map content, wait for k8s to pick it up and replace them
-	 *     - our polling will then detect that change, and trigger a reload.
-	 * 
- */ - @Test - void test() { - String logs = logs(); - // (1) - Assertions.assertTrue(logs.contains("paths property sources : [/tmp/application.properties]")); - // (2) - Assertions.assertTrue(logs.contains("will add file-based property source : /tmp/application.properties")); - // (3) - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - - // we first read the initial value from the configmap - Assertions.assertEquals("as-mount-initial", result); - - // replace data in configmap and wait for k8s to pick it up - // our polling will detect that and restart the app - InputStream configMapStream = util.inputStream("mount/configmap-mount.yaml"); - ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); - configMap.setData(Map.of("application.properties", "from.properties.key=as-mount-changed")); - client.configMaps().inNamespace("default").resource(configMap).createOrReplace(); - - await().timeout(Duration.ofSeconds(360)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("as-mount-changed")); - - } - - private static void manifests(Phase phase) { - - InputStream deploymentStream = util.inputStream("mount/deployment-mount.yaml"); - InputStream serviceStream = util.inputStream("service.yaml"); - InputStream ingressStream = util.inputStream("ingress.yaml"); - InputStream configMapStream = util.inputStream("mount/configmap-mount.yaml"); - - Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); - Service service = Serialization.unmarshal(serviceStream, Service.class); - Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class); - ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); - - List existing = new ArrayList<>( - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv()); - - // bootstrap is disabled, which means that in 'application-mount.yaml', - // config-data support is enabled. - EnvVar mountActiveProfile = new EnvVarBuilder().withName("SPRING_PROFILES_ACTIVE").withValue("mount").build(); - EnvVar disableBootstrap = new EnvVarBuilder().withName("SPRING_CLOUD_BOOTSTRAP_ENABLED").withValue("FALSE") - .build(); - - EnvVar debugLevelReloadCommons = new EnvVarBuilder() - .withName("LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG_RELOAD").withValue("DEBUG") - .build(); - EnvVar debugLevelConfig = new EnvVarBuilder() - .withName("LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG").withValue("DEBUG") - .build(); - EnvVar debugLevelCommons = new EnvVarBuilder() - .withName("LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS").withValue("DEBUG").build(); - - existing.add(mountActiveProfile); - existing.add(disableBootstrap); - existing.add(debugLevelReloadCommons); - existing.add(debugLevelCommons); - existing.add(debugLevelConfig); - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(existing); - - if (phase.equals(Phase.CREATE)) { - util.createAndWait(NAMESPACE, configMap, null); - util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); - } - else { - util.deleteAndWait(NAMESPACE, configMap, null); - util.deleteAndWait(NAMESPACE, deployment, service, ingress); - } - - } - - private WebClient.Builder builder() { - return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); - } - - private RetryBackoffSpec retrySpec() { - return Retry.fixedDelay(60, Duration.ofSeconds(1)).filter(Objects::nonNull); - } - - private String logs() { - try { - String appPodName = K3S.execInContainer("sh", "-c", - "kubectl get pods -l app=" + IMAGE_NAME + " -o=name --no-headers | tr -d '\n'").getStdout(); - - Container.ExecResult execResult = K3S.execInContainer("sh", "-c", "kubectl logs " + appPodName.trim()); - return execResult.getStdout(); - } - catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java index 62f1bfc263..4578f18010 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -24,6 +24,8 @@ import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.utils.Serialization; +import org.testcontainers.containers.Container; +import org.testcontainers.k3s.K3sContainer; import reactor.netty.http.client.HttpClient; import reactor.util.retry.Retry; import reactor.util.retry.RetryBackoffSpec; @@ -172,6 +174,31 @@ final class TestUtil { } """; + private static final String BODY_SIX = """ + { + "spec": { + "template": { + "spec": { + "containers": [{ + "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", + "image": "image_name_here", + "env": [ + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "mount" + }, + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "mount" + }, + ] + }] + } + } + } + } + """; + private TestUtil() { } @@ -211,6 +238,10 @@ static void patchFive(Util util, String dockerImage, String deploymentName, Stri util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_FIVE, POD_LABELS); } + static void patchSix(Util util, String dockerImage, String deploymentName, String namespace) { + util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_SIX, POD_LABELS); + } + static WebClient.Builder builder() { return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); } @@ -219,4 +250,17 @@ static RetryBackoffSpec retrySpec() { return Retry.fixedDelay(120, Duration.ofSeconds(2)).filter(Objects::nonNull); } + static String logs(K3sContainer container, String appLabelValue) { + try { + String appPodName = container.execInContainer("sh", "-c", + "kubectl get pods -l app=" + appLabelValue + " -o=name --no-headers | tr -d '\n'").getStdout(); + + Container.ExecResult execResult = container.execInContainer("sh", "-c", "kubectl logs " + appPodName.trim()); + return execResult.getStdout(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + } From 752d92e662e8ddee5c79dbf3dd7fcb0b72cec4cd Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 08:12:55 +0300 Subject: [PATCH 10/26] dirty --- .../pom.xml | 5 +- ...pEnabledPollingReloadConfigMapMountIT.java | 25 +++++----- .../event/reload/ConfigMapEventReloadIT.java | 13 +++-- .../ConfigMapMountPollingReloadDelegate.java | 3 +- .../ConfigMapPollingReloadDelegate.java | 4 +- .../configmap/event/reload/TestUtil.java | 48 ++++++++++++++++--- .../src/test/resources/deployment.yaml | 2 + .../integration/tests/commons/Commons.java | 2 +- 8 files changed, 75 insertions(+), 27 deletions(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/pom.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/pom.xml index 5af09ed21d..3164c0c275 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/pom.xml @@ -26,9 +26,12 @@ spring-boot-starter-actuator + + + org.springframework.cloud - spring-cloud-starter-bootstrap + spring-cloud-starter diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java index 20de6a40ea..0ba17151a0 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java @@ -16,6 +16,13 @@ package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +import java.io.InputStream; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.EnvVar; import io.fabric8.kubernetes.api.model.EnvVarBuilder; @@ -28,24 +35,18 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; -import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; -import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.WebClient; import org.testcontainers.containers.Container; import org.testcontainers.k3s.K3sContainer; import reactor.netty.http.client.HttpClient; import reactor.util.retry.Retry; import reactor.util.retry.RetryBackoffSpec; -import java.io.InputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; +import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; +import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; +import org.springframework.http.HttpMethod; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java index fea28c48d8..bc2e63c659 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java @@ -48,6 +48,7 @@ import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchOne; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchThree; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchTwo; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchSix; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.reCreateConfigMaps; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.replaceConfigMap; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; @@ -82,6 +83,7 @@ static void beforeAll() throws Exception { util.createNamespace("left"); util.createNamespace("right"); util.setUpClusterWide(NAMESPACE, Set.of("left", "right")); + util.setUp(NAMESPACE); manifests(Phase.CREATE); } @@ -138,11 +140,11 @@ void testInformFromOneNamespaceEventNotTriggered() { return "left-initial".equals(innerResult); }); - testInformFromOneNamespaceEventTriggered(); - testInform(); - testInformFromOneNamespaceEventTriggeredSecretsDisabled(); - testDataChangesInConfigMap(); - testConfigMapPollingReload(); + //testInformFromOneNamespaceEventTriggered(); + //testInform(); + //testInformFromOneNamespaceEventTriggeredSecretsDisabled(); + //testDataChangesInConfigMap(); + //testConfigMapPollingReload(); testConfigMapMountPollingReload(); } @@ -313,6 +315,7 @@ void testConfigMapPollingReload() { } void testConfigMapMountPollingReload() { + patchSix(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); ConfigMapMountPollingReloadDelegate.testConfigMapMountPollingReload(client, util, K3S, IMAGE_NAME); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java index 3fa72b3d82..954214d853 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java @@ -24,10 +24,11 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.utils.Serialization; import org.junit.jupiter.api.Assertions; +import org.testcontainers.k3s.K3sContainer; + import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; import org.springframework.http.HttpMethod; import org.springframework.web.reactive.function.client.WebClient; -import org.testcontainers.k3s.K3sContainer; import static org.awaitility.Awaitility.await; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java index 933f358d7e..e423451938 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java @@ -26,6 +26,7 @@ import org.junit.jupiter.api.Assertions; import org.springframework.http.HttpMethod; +import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; @@ -53,7 +54,8 @@ static void testConfigMapPollingReload(KubernetesClient client) { client.configMaps().inNamespace("default").resource(map).createOrReplace(); - await().timeout(Duration.ofSeconds(60)).until(() -> webClient.method(HttpMethod.GET).retrieve() + await().ignoreException(HttpServerErrorException.BadGateway.class) + .timeout(Duration.ofSeconds(120)).until(() -> webClient.method(HttpMethod.GET).retrieve() .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("after-change")); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java index 4578f18010..0df1cd06d9 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -39,7 +39,8 @@ */ final class TestUtil { - private static final Map POD_LABELS = Map.of("app", "spring-cloud-kubernetes-fabric8-client-reload"); + private static final Map POD_LABELS = Map.of("app", + "spring-cloud-kubernetes-fabric8-client-reload"); private static final String BODY_ONE = """ { @@ -57,6 +58,10 @@ final class TestUtil { { "name": "SPRING_PROFILES_ACTIVE", "value": "two" + }, + { + "name": "SPRING_CLOUD_BOOTSTRAP_ENABLED", + "value": "TRUE" } ] }] @@ -82,6 +87,10 @@ final class TestUtil { { "name": "SPRING_PROFILES_ACTIVE", "value": "three" + }, + { + "name": "SPRING_CLOUD_BOOTSTRAP_ENABLED", + "value": "TRUE" } ] }] @@ -111,6 +120,10 @@ final class TestUtil { { "name": "SPRING_CLOUD_KUBERNETES_SECRETS_ENABLED", "value": "FALSE" + }, + { + "name": "SPRING_CLOUD_BOOTSTRAP_ENABLED", + "value": "TRUE" } ] }] @@ -144,6 +157,10 @@ final class TestUtil { { "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_CLIENT_CONFIG_RELOAD", "value": "DEBUG" + }, + { + "name": "SPRING_CLOUD_BOOTSTRAP_ENABLED", + "value": "TRUE" } ] }] @@ -165,6 +182,10 @@ final class TestUtil { { "name": "SPRING_PROFILES_ACTIVE", "value": "no-mount" + }, + { + "name": "SPRING_CLOUD_BOOTSTRAP_ENABLED", + "value": "FALSE" } ] }] @@ -188,9 +209,21 @@ final class TestUtil { "value": "mount" }, { - "name": "SPRING_PROFILES_ACTIVE", - "value": "mount" + "name": "SPRING_CLOUD_BOOTSTRAP_ENABLED", + "value": "FALSE" + }, + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG_RELOAD", + "value": "DEBUG" }, + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG", + "value": "DEBUG" + }, + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS", + "value": "DEBUG" + } ] }] } @@ -252,10 +285,13 @@ static RetryBackoffSpec retrySpec() { static String logs(K3sContainer container, String appLabelValue) { try { - String appPodName = container.execInContainer("sh", "-c", - "kubectl get pods -l app=" + appLabelValue + " -o=name --no-headers | tr -d '\n'").getStdout(); + String appPodName = container + .execInContainer("sh", "-c", + "kubectl get pods -l app=" + appLabelValue + " -o=name --no-headers | tr -d '\n'") + .getStdout(); - Container.ExecResult execResult = container.execInContainer("sh", "-c", "kubectl logs " + appPodName.trim()); + Container.ExecResult execResult = container.execInContainer("sh", "-c", + "kubectl logs " + appPodName.trim()); return execResult.getStdout(); } catch (Exception e) { diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml index 48c1f638e8..aba13d5127 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/deployment.yaml @@ -31,3 +31,5 @@ spec: value: "DEBUG" - name: SPRING_PROFILES_ACTIVE value: "one" + - name: SPRING_CLOUD_BOOTSTRAP_ENABLED + value: "TRUE" diff --git a/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java b/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java index 1c802a7406..3ae02cfd26 100644 --- a/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java +++ b/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java @@ -116,7 +116,7 @@ public static void assertReloadLogStatements(String left, String right, String a LOG.info("appPodName : ->" + appPodName + "<-"); // we issue a pollDelay to let the logs sync in, otherwise the results are not // going to be correctly asserted - await().pollDelay(20, TimeUnit.SECONDS).pollInterval(Duration.ofSeconds(5)).atMost(Duration.ofSeconds(600)) + await().pollDelay(20, TimeUnit.SECONDS).pollInterval(Duration.ofSeconds(5)).atMost(Duration.ofSeconds(120)) .until(() -> { Container.ExecResult result = CONTAINER.execInContainer("sh", "-c", From ed96191c2fa8d4152ef4c03eb3886f8938e018a4 Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 14:14:23 +0300 Subject: [PATCH 11/26] fixed --- ...edPollingReloadConfigMapMountDelegate.java | 81 ++++++++ ...pEnabledPollingReloadConfigMapMountIT.java | 195 ------------------ .../event/reload/ConfigMapEventReloadIT.java | 22 +- .../ConfigMapMountPollingReloadDelegate.java | 10 +- .../ConfigMapPollingReloadDelegate.java | 8 +- .../configmap/event/reload/TestUtil.java | 74 +++++++ .../src/test/resources/configmap.yaml | 2 +- .../src/test/resources/left-configmap.yaml | 2 +- .../resources/right-configmap-with-label.yaml | 2 +- .../src/test/resources/right-configmap.yaml | 2 +- 10 files changed, 184 insertions(+), 214 deletions(-) create mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java new file mode 100644 index 0000000000..b46d23ccda --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java @@ -0,0 +1,81 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; + +import java.io.InputStream; +import java.time.Duration; +import java.util.Map; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.utils.Serialization; +import org.junit.jupiter.api.Assertions; +import org.testcontainers.k3s.K3sContainer; + +import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; +import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; +import org.springframework.http.HttpMethod; +import org.springframework.web.reactive.function.client.WebClient; + +import static org.awaitility.Awaitility.await; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; + +final class BootstrapEnabledPollingReloadConfigMapMountDelegate { + + /** + *
+	 *     - we have bootstrap enabled, which means we will 'locate' property sources
+	 *       from config maps.
+	 *     - there are no explicit config maps to search for, but what we will also read,
+	 *     	 is 'spring.cloud.kubernetes.config.paths', which we have set to
+	 *     	 '/tmp/application.properties'
+	 *       in this test. That is populated by the volumeMounts (see deployment-mount.yaml)
+	 *     - we first assert that we are actually reading the path based source via (1), (2) and (3).
+	 *
+	 *     - we then change the config map content, wait for k8s to pick it up and replace them
+	 *     - our polling will then detect that change, and trigger a reload.
+	 * 
+ */ + static void testPollingReloadConfigMapWithBootstrap(KubernetesClient client, Util util, K3sContainer container, + String appLabelValue) { + // (1) + Commons.waitForLogStatement("paths property sources : [/tmp/application.properties]", container, appLabelValue); + // (2) + Commons.waitForLogStatement("will add file-based property source : /tmp/application.properties", container, + appLabelValue); + // (3) + WebClient webClient = builder().baseUrl("http://localhost/key").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .block(); + + // we first read the initial value from the configmap + Assertions.assertEquals("as-mount-initial", result); + + // replace data in configmap and wait for k8s to pick it up + // our polling will detect that and restart the app + InputStream configMapStream = util.inputStream("configmap.yaml"); + ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); + configMap.setData(Map.of("application.properties", "from.properties.key=as-mount-changed")); + client.configMaps().inNamespace("default").resource(configMap).createOrReplace(); + + await().timeout(Duration.ofSeconds(360)).until(() -> webClient.method(HttpMethod.GET).retrieve() + .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("as-mount-changed")); + + } + +} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java deleted file mode 100644 index 0ba17151a0..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountIT.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; - -import java.io.InputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import io.fabric8.kubernetes.api.model.ConfigMap; -import io.fabric8.kubernetes.api.model.EnvVar; -import io.fabric8.kubernetes.api.model.EnvVarBuilder; -import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.networking.v1.Ingress; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.utils.Serialization; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.testcontainers.containers.Container; -import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; - -import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; -import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; -import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.WebClient; - -import static org.awaitility.Awaitility.await; - -public class BootstrapEnabledPollingReloadConfigMapMountIT { - - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap-polling-reload"; - - private static final String NAMESPACE = "default"; - - private static Util util; - - private static KubernetesClient client; - - private static final K3sContainer K3S = Commons.container(); - - @BeforeAll - static void beforeAll() throws Exception { - K3S.start(); - Commons.validateImage(IMAGE_NAME, K3S); - Commons.loadSpringCloudKubernetesImage(IMAGE_NAME, K3S); - util = new Util(K3S); - client = util.client(); - util.setUp(NAMESPACE); - manifests(Phase.CREATE); - } - - @AfterAll - static void after() throws Exception { - manifests(Phase.DELETE); - Commons.cleanUp(IMAGE_NAME, K3S); - Commons.systemPrune(); - } - - /** - *
-	 *     - we have bootstrap enabled, which means we will 'locate' property sources
-	 *       from config maps.
-	 *     - there are no explicit config maps to search for, but what we will also read,
-	 *     	 is 'spring.cloud.kubernetes.config.paths', which we have set to
-	 *     	 '/tmp/application.properties'
-	 *       in this test. That is populated by the volumeMounts (see deployment-mount.yaml)
-	 *     - we first assert that we are actually reading the path based source via (1), (2) and (3).
-	 *
-	 *     - we then change the config map content, wait for k8s to pick it up and replace them
-	 *     - our polling will then detect that change, and trigger a reload.
-	 * 
- */ - @Test - void test() { - String logs = logs(); - // (1) - Assertions.assertTrue(logs.contains("paths property sources : [/tmp/application.properties]")); - // (2) - Assertions.assertTrue(logs.contains("will add file-based property source : /tmp/application.properties")); - // (3) - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - - // we first read the initial value from the configmap - Assertions.assertEquals("as-mount-initial", result); - - // replace data in configmap and wait for k8s to pick it up - // our polling will detect that and restart the app - InputStream configMapStream = util.inputStream("mount/configmap-mount.yaml"); - ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); - configMap.setData(Map.of("application.properties", "from.properties.key=as-mount-changed")); - client.configMaps().inNamespace("default").resource(configMap).createOrReplace(); - - await().timeout(Duration.ofSeconds(360)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("as-mount-changed")); - - } - - private static void manifests(Phase phase) { - - InputStream deploymentStream = util.inputStream("mount/deployment-mount.yaml"); - InputStream serviceStream = util.inputStream("service.yaml"); - InputStream ingressStream = util.inputStream("ingress.yaml"); - InputStream configMapStream = util.inputStream("mount/configmap-mount.yaml"); - - Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); - Service service = Serialization.unmarshal(serviceStream, Service.class); - Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class); - ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); - - List existing = new ArrayList<>( - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv()); - - // bootstrap is enabled, which means that in 'application-with-bootstrap.yaml', - // config-data support is disabled. - EnvVar withBootstrapActiveProfile = new EnvVarBuilder().withName("SPRING_PROFILES_ACTIVE") - .withValue("with-bootstrap").build(); - EnvVar enabledBootstrap = new EnvVarBuilder().withName("SPRING_CLOUD_BOOTSTRAP_ENABLED").withValue("TRUE") - .build(); - - EnvVar debugLevelReloadCommons = new EnvVarBuilder() - .withName("LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG_RELOAD").withValue("DEBUG") - .build(); - EnvVar debugLevelConfig = new EnvVarBuilder() - .withName("LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG").withValue("DEBUG") - .build(); - EnvVar debugLevelCommons = new EnvVarBuilder() - .withName("LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS").withValue("DEBUG").build(); - - existing.add(withBootstrapActiveProfile); - existing.add(enabledBootstrap); - existing.add(debugLevelReloadCommons); - existing.add(debugLevelCommons); - existing.add(debugLevelConfig); - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(existing); - - if (phase.equals(Phase.CREATE)) { - util.createAndWait(NAMESPACE, configMap, null); - util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); - } - else { - util.deleteAndWait(NAMESPACE, configMap, null); - util.deleteAndWait(NAMESPACE, deployment, service, ingress); - } - - } - - private WebClient.Builder builder() { - return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); - } - - private RetryBackoffSpec retrySpec() { - return Retry.fixedDelay(60, Duration.ofSeconds(1)).filter(Objects::nonNull); - } - - private String logs() { - try { - String appPodName = K3S.execInContainer("sh", "-c", - "kubectl get pods -l app=" + IMAGE_NAME + " -o=name --no-headers | tr -d '\n'").getStdout(); - - Container.ExecResult execResult = K3S.execInContainer("sh", "-c", "kubectl logs " + appPodName.trim()); - return execResult.getStdout(); - } - catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java index bc2e63c659..7804d46243 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java @@ -46,9 +46,10 @@ import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchFive; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchFour; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchOne; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchSeven; +import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchSix; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchThree; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchTwo; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchSix; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.reCreateConfigMaps; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.replaceConfigMap; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; @@ -140,12 +141,13 @@ void testInformFromOneNamespaceEventNotTriggered() { return "left-initial".equals(innerResult); }); - //testInformFromOneNamespaceEventTriggered(); - //testInform(); - //testInformFromOneNamespaceEventTriggeredSecretsDisabled(); - //testDataChangesInConfigMap(); - //testConfigMapPollingReload(); + testInformFromOneNamespaceEventTriggered(); + testInform(); + testInformFromOneNamespaceEventTriggeredSecretsDisabled(); + testDataChangesInConfigMap(); + testConfigMapPollingReload(); testConfigMapMountPollingReload(); + testPollingReloadConfigMapWithBootstrap(); } /** @@ -315,10 +317,18 @@ void testConfigMapPollingReload() { } void testConfigMapMountPollingReload() { + reCreateConfigMaps(util, client); patchSix(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); ConfigMapMountPollingReloadDelegate.testConfigMapMountPollingReload(client, util, K3S, IMAGE_NAME); } + void testPollingReloadConfigMapWithBootstrap() { + reCreateConfigMaps(util, client); + patchSeven(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + BootstrapEnabledPollingReloadConfigMapMountDelegate.testPollingReloadConfigMapWithBootstrap(client, util, K3S, + IMAGE_NAME); + } + private static void manifests(Phase phase) { InputStream deploymentStream = util.inputStream("deployment.yaml"); diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java index 954214d853..64cc7fa48c 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java @@ -26,13 +26,13 @@ import org.junit.jupiter.api.Assertions; import org.testcontainers.k3s.K3sContainer; +import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; import org.springframework.http.HttpMethod; import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.logs; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; /** @@ -57,11 +57,11 @@ final class ConfigMapMountPollingReloadDelegate { */ static void testConfigMapMountPollingReload(KubernetesClient client, Util util, K3sContainer container, String appLabelValue) { - String logs = logs(container, appLabelValue); // (1) - Assertions.assertTrue(logs.contains("paths property sources : [/tmp/application.properties]")); + Commons.waitForLogStatement("paths property sources : [/tmp/application.properties]", container, appLabelValue); // (2) - Assertions.assertTrue(logs.contains("will add file-based property source : /tmp/application.properties")); + Commons.waitForLogStatement("will add file-based property source : /tmp/application.properties", container, + appLabelValue); // (3) WebClient webClient = builder().baseUrl("http://localhost/key").build(); String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) @@ -72,7 +72,7 @@ static void testConfigMapMountPollingReload(KubernetesClient client, Util util, // replace data in configmap and wait for k8s to pick it up // our polling will detect that and restart the app - InputStream configMapStream = util.inputStream("mount/configmap-mount.yaml"); + InputStream configMapStream = util.inputStream("configmap.yaml"); ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); configMap.setData(Map.of("application.properties", "from.properties.key=as-mount-changed")); client.configMaps().inNamespace("default").resource(configMap).createOrReplace(); diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java index e423451938..6b603028e4 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java @@ -44,7 +44,7 @@ static void testConfigMapPollingReload(KubernetesClient client) { .block(); // we first read the initial value from the configmap - Assertions.assertEquals("initial", result); + Assertions.assertEquals("as-mount-initial", result); // then deploy a new version of configmap // since we poll and have reload in place, the new property must be visible @@ -54,9 +54,9 @@ static void testConfigMapPollingReload(KubernetesClient client) { client.configMaps().inNamespace("default").resource(map).createOrReplace(); - await().ignoreException(HttpServerErrorException.BadGateway.class) - .timeout(Duration.ofSeconds(120)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("after-change")); + await().ignoreException(HttpServerErrorException.BadGateway.class).timeout(Duration.ofSeconds(120)) + .until(() -> webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .block().equals("after-change")); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java index 0df1cd06d9..934d328f26 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java @@ -200,7 +200,22 @@ final class TestUtil { "spec": { "template": { "spec": { + "volumes": [ + { + "configMap": { + "defaultMode": 420, + "name": "poll-reload" + }, + "name": "config-map-volume" + } + ], "containers": [{ + "volumeMounts": [ + { + "mountPath": "/tmp", + "name": "config-map-volume" + } + ], "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", "image": "image_name_here", "env": [ @@ -232,6 +247,58 @@ final class TestUtil { } """; + private static final String BODY_SEVEN = """ + { + "spec": { + "template": { + "spec": { + "volumes": [ + { + "configMap": { + "defaultMode": 420, + "name": "poll-reload" + }, + "name": "config-map-volume" + } + ], + "containers": [{ + "volumeMounts": [ + { + "mountPath": "/tmp", + "name": "config-map-volume" + } + ], + "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", + "image": "image_name_here", + "env": [ + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "with-bootstrap" + }, + { + "name": "SPRING_CLOUD_BOOTSTRAP_ENABLED", + "value": "TRUE" + }, + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG_RELOAD", + "value": "DEBUG" + }, + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG", + "value": "DEBUG" + }, + { + "name": "LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS", + "value": "DEBUG" + } + ] + }] + } + } + } + } + """; + private TestUtil() { } @@ -239,12 +306,15 @@ private TestUtil() { static void reCreateConfigMaps(Util util, KubernetesClient client) { InputStream leftConfigMapStream = util.inputStream("left-configmap.yaml"); InputStream rightConfigMapStream = util.inputStream("right-configmap.yaml"); + InputStream configMapStream = util.inputStream("configmap.yaml"); ConfigMap leftConfigMap = Serialization.unmarshal(leftConfigMapStream, ConfigMap.class); ConfigMap rightConfigMap = Serialization.unmarshal(rightConfigMapStream, ConfigMap.class); + ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); replaceConfigMap(client, leftConfigMap, "left"); replaceConfigMap(client, rightConfigMap, "right"); + replaceConfigMap(client, configMap, "default"); } static void replaceConfigMap(KubernetesClient client, ConfigMap configMap, String namespace) { @@ -275,6 +345,10 @@ static void patchSix(Util util, String dockerImage, String deploymentName, Strin util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_SIX, POD_LABELS); } + static void patchSeven(Util util, String dockerImage, String deploymentName, String namespace) { + util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_SEVEN, POD_LABELS); + } + static WebClient.Builder builder() { return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/configmap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/configmap.yaml index 194603083c..2c6c6d0839 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/configmap.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/configmap.yaml @@ -5,4 +5,4 @@ metadata: namespace: default data: application.properties: | - from.properties.key=initial + from.properties.key=as-mount-initial diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/left-configmap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/left-configmap.yaml index 560954befa..a72d8af5dc 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/left-configmap.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/left-configmap.yaml @@ -4,4 +4,4 @@ metadata: name: left-configmap namespace: left data: - left.value: left-initial + left.value: "left-initial" diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap-with-label.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap-with-label.yaml index 56531a6352..658ebca4c2 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap-with-label.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap-with-label.yaml @@ -6,4 +6,4 @@ metadata: labels: spring.cloud.kubernetes.config.informer.enabled: true data: - right.with.label.value: right-with-label-initial + right.with.label.value: "right-with-label-initial" diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap.yaml index a14273279b..0ede471da5 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/right-configmap.yaml @@ -4,4 +4,4 @@ metadata: name: right-configmap namespace: right data: - right.value: right-initial + right.value: "right-initial" From 37a6ee95de57171b8dfd723a62c3d6f92bea40db Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 15:46:31 +0300 Subject: [PATCH 12/26] fix merge --- .../DataChangesInConfigMapReloadDelegate.java | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java index c132a267ec..e679f28795 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java @@ -24,10 +24,6 @@ import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.KubernetesClient; import org.junit.jupiter.api.Assertions; -<<<<<<< HEAD:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java -======= -import org.testcontainers.containers.Container; ->>>>>>> 3.0.x:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java import org.testcontainers.k3s.K3sContainer; import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; @@ -36,28 +32,16 @@ import static org.awaitility.Awaitility.await; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; -<<<<<<< HEAD:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.logs; -======= ->>>>>>> 3.0.x:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.replaceConfigMap; import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; final class DataChangesInConfigMapReloadDelegate { -<<<<<<< HEAD:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-reload"; private static final String LEFT_NAMESPACE = "left"; -======= - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap-event-reload"; - - private static final String LEFT_NAMESPACE = "left"; - - private static final K3sContainer K3S = Commons.container(); - ->>>>>>> 3.0.x:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java /** *
 	 *     - configMap with no labels and data: left.value = left-initial exists in namespace left
@@ -69,11 +53,7 @@ final class DataChangesInConfigMapReloadDelegate {
 	 *     - then we change data inside the config map, and we must see the updated value
 	 * 
*/ -<<<<<<< HEAD:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java static void testDataChangesInConfigMap(KubernetesClient client, K3sContainer container, String appLabelValue) { -======= - static void testDataChangesInConfigMap(KubernetesClient client) { ->>>>>>> 3.0.x:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); @@ -99,11 +79,7 @@ static void testDataChangesInConfigMap(KubernetesClient client) { return "left-initial".equals(innerResult); }); -<<<<<<< HEAD:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java String logs = logs(container, appLabelValue); -======= - String logs = logs(); ->>>>>>> 3.0.x:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java Assertions.assertTrue(logs.contains("ConfigMap left-configmap was updated in namespace left")); Assertions.assertTrue(logs.contains("data in configmap has not changed, will not reload")); @@ -124,21 +100,4 @@ static void testDataChangesInConfigMap(KubernetesClient client) { } -<<<<<<< HEAD:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java -======= - private static String logs() { - try { - String appPodName = K3S.execInContainer("sh", "-c", - "kubectl get pods -l app=" + IMAGE_NAME + " -o=name --no-headers | tr -d '\n'").getStdout(); - - Container.ExecResult execResult = K3S.execInContainer("sh", "-c", "kubectl logs " + appPodName.trim()); - return execResult.getStdout(); - } - catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - ->>>>>>> 3.0.x:spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java } From bfc418d3f7db8925796da0602dbd57a616a474f3 Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 15:49:03 +0300 Subject: [PATCH 13/26] rename package --- .../{configmap/event => }/reload/App.java | 2 +- .../reload/ConfigMapProperties.java | 2 +- .../event => }/reload/Controller.java | 2 +- .../event => }/reload/LeftProperties.java | 2 +- .../event => }/reload/RightProperties.java | 2 +- .../reload/RightWithLabelsProperties.java | 2 +- ...edPollingReloadConfigMapMountDelegate.java | 10 +- .../reload/ConfigMapEventReloadIT.java | 93 ++++++++----------- .../ConfigMapMountPollingReloadDelegate.java | 10 +- .../ConfigMapPollingReloadDelegate.java | 10 +- .../DataChangesInConfigMapReloadDelegate.java | 10 +- .../event => }/reload/TestUtil.java | 2 +- 12 files changed, 65 insertions(+), 82 deletions(-) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/App.java (93%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/ConfigMapProperties.java (92%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/Controller.java (95%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/LeftProperties.java (92%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/RightProperties.java (92%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/RightWithLabelsProperties.java (92%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java (86%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/ConfigMapEventReloadIT.java (78%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/ConfigMapMountPollingReloadDelegate.java (87%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/ConfigMapPollingReloadDelegate.java (82%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/DataChangesInConfigMapReloadDelegate.java (89%) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/{configmap/event => }/reload/TestUtil.java (99%) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/App.java similarity index 93% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/App.java index c76522c88b..29771fb8dd 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/App.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/App.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapProperties.java similarity index 92% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapProperties.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapProperties.java index 02dd065eca..3310c27799 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapProperties.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/Controller.java similarity index 95% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/Controller.java index f9fef32a51..8087f875cb 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/Controller.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/Controller.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/LeftProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/LeftProperties.java similarity index 92% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/LeftProperties.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/LeftProperties.java index 4be53d9239..4d3d30d57d 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/LeftProperties.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/LeftProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/RightProperties.java similarity index 92% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightProperties.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/RightProperties.java index f4e28d2923..ac0355c6d1 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightProperties.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/RightProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightWithLabelsProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/RightWithLabelsProperties.java similarity index 92% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightWithLabelsProperties.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/RightWithLabelsProperties.java index e4a9c3409e..9c13bc1261 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/RightWithLabelsProperties.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/RightWithLabelsProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java similarity index 86% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java index b46d23ccda..24a5e0dc86 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import java.io.InputStream; import java.time.Duration; @@ -32,8 +32,6 @@ import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; final class BootstrapEnabledPollingReloadConfigMapMountDelegate { @@ -59,8 +57,8 @@ static void testPollingReloadConfigMapWithBootstrap(KubernetesClient client, Uti Commons.waitForLogStatement("will add file-based property source : /tmp/application.properties", container, appLabelValue); // (3) - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + WebClient webClient = TestUtil.builder().baseUrl("http://localhost/key").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) .block(); // we first read the initial value from the configmap @@ -74,7 +72,7 @@ static void testPollingReloadConfigMapWithBootstrap(KubernetesClient client, Uti client.configMaps().inNamespace("default").resource(configMap).createOrReplace(); await().timeout(Duration.ofSeconds(360)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("as-mount-changed")); + .bodyToMono(String.class).retryWhen(TestUtil.retrySpec()).block().equals("as-mount-changed")); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java similarity index 78% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java index a1d09d6dae..3a2fa92a9d 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import java.io.InputStream; import java.time.Duration; @@ -42,17 +42,6 @@ import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchFive; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchFour; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchOne; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchSeven; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchSix; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchThree; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.patchTwo; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.reCreateConfigMaps; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.replaceConfigMap; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; import static org.springframework.cloud.kubernetes.integration.tests.commons.Commons.pomVersion; /** @@ -112,16 +101,16 @@ void testInformFromOneNamespaceEventNotTriggered() { Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); - WebClient webClient = builder().baseUrl("http://localhost/left").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + WebClient webClient = TestUtil.builder().baseUrl("http://localhost/left").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) .block(); // we first read the initial value from the left-configmap Assertions.assertEquals("left-initial", result); // then read the value from the right-configmap - webClient = builder().baseUrl("http://localhost/right").build(); - result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()).block(); + webClient = TestUtil.builder().baseUrl("http://localhost/right").build(); + result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()).block(); Assertions.assertEquals("right-initial", result); // then deploy a new version of right-configmap @@ -129,14 +118,14 @@ void testInformFromOneNamespaceEventNotTriggered() { .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) .withData(Map.of("right.value", "right-after-change")).build(); - replaceConfigMap(client, rightConfigMapAfterChange, "right"); + TestUtil.replaceConfigMap(client, rightConfigMapAfterChange, "right"); - webClient = builder().baseUrl("http://localhost/left").build(); + webClient = TestUtil.builder().baseUrl("http://localhost/left").build(); WebClient finalWebClient = webClient; await().pollInterval(Duration.ofSeconds(1)).atMost(Duration.ofSeconds(30)).until(() -> { String innerResult = finalWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); + .retryWhen(TestUtil.retrySpec()).block(); // left configmap has not changed, no restart of app has happened return "left-initial".equals(innerResult); }); @@ -161,15 +150,15 @@ void testInformFromOneNamespaceEventNotTriggered() { */ void testInformFromOneNamespaceEventTriggered() { - reCreateConfigMaps(util, client); - patchOne(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + TestUtil.reCreateConfigMaps(util, client); + TestUtil.patchOne(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); // read the value from the right-configmap - WebClient webClient = builder().baseUrl("http://localhost/right").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + WebClient webClient = TestUtil.builder().baseUrl("http://localhost/right").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) .block(); Assertions.assertEquals("right-initial", result); @@ -178,13 +167,13 @@ void testInformFromOneNamespaceEventTriggered() { .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) .withData(Map.of("right.value", "right-after-change")).build(); - replaceConfigMap(client, rightConfigMapAfterChange, "right"); + TestUtil.replaceConfigMap(client, rightConfigMapAfterChange, "right"); String[] resultAfterChange = new String[1]; await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { - WebClient innerWebClient = builder().baseUrl("http://localhost/right").build(); + WebClient innerWebClient = TestUtil.builder().baseUrl("http://localhost/right").build(); String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); + .retryWhen(TestUtil.retrySpec()).block(); resultAfterChange[0] = innerResult; return innerResult != null; }); @@ -203,22 +192,22 @@ void testInformFromOneNamespaceEventTriggered() { */ void testInform() { - reCreateConfigMaps(util, client); - patchTwo(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + TestUtil.reCreateConfigMaps(util, client); + TestUtil.patchTwo(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); // read the initial value from the right-configmap - WebClient rightWebClient = builder().baseUrl("http://localhost/right").build(); + WebClient rightWebClient = TestUtil.builder().baseUrl("http://localhost/right").build(); String rightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); + .retryWhen(TestUtil.retrySpec()).block(); Assertions.assertEquals("right-initial", rightResult); // then read the initial value from the right-with-label-configmap - WebClient rightWithLabelWebClient = builder().baseUrl("http://localhost/with-label").build(); + WebClient rightWithLabelWebClient = TestUtil.builder().baseUrl("http://localhost/with-label").build(); String rightWithLabelResult = rightWithLabelWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); + .retryWhen(TestUtil.retrySpec()).block(); Assertions.assertEquals("right-with-label-initial", rightWithLabelResult); // then deploy a new version of right-configmap @@ -226,12 +215,12 @@ void testInform() { .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) .withData(Map.of("right.value", "right-after-change")).build(); - replaceConfigMap(client, rightConfigMapAfterChange, "right"); + TestUtil.replaceConfigMap(client, rightConfigMapAfterChange, "right"); // nothing changes in our app, because we are watching only labeled configmaps await().pollInterval(Duration.ofSeconds(1)).atMost(Duration.ofSeconds(30)).until(() -> { String innerRightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); + .retryWhen(TestUtil.retrySpec()).block(); return "right-initial".equals(innerRightResult); }); @@ -241,15 +230,15 @@ void testInform() { new ObjectMetaBuilder().withNamespace("right").withName("right-configmap-with-label").build()) .withData(Map.of("right.with.label.value", "right-with-label-after-change")).build(); - replaceConfigMap(client, rightWithLabelConfigMapAfterChange, "right"); + TestUtil.replaceConfigMap(client, rightWithLabelConfigMapAfterChange, "right"); // since we have changed a labeled configmap, app will restart and pick up the new // value String[] resultAfterChange = new String[1]; await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { - WebClient innerWebClient = builder().baseUrl("http://localhost/with-label").build(); + WebClient innerWebClient = TestUtil.builder().baseUrl("http://localhost/with-label").build(); String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); + .retryWhen(TestUtil.retrySpec()).block(); resultAfterChange[0] = innerResult; return innerResult != null; }); @@ -257,7 +246,7 @@ void testInform() { // right-configmap now will see the new value also, but only because the other // configmap has triggered the restart - rightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + rightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) .block(); Assertions.assertEquals("right-after-change", rightResult); } @@ -274,15 +263,15 @@ void testInform() { */ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { - reCreateConfigMaps(util, client); - patchThree(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + TestUtil.reCreateConfigMaps(util, client); + TestUtil.patchThree(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", "added secret informer for namespace", IMAGE_NAME); // read the value from the right-configmap - WebClient webClient = builder().baseUrl("http://localhost/right").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + WebClient webClient = TestUtil.builder().baseUrl("http://localhost/right").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) .block(); Assertions.assertEquals("right-initial", result); @@ -291,13 +280,13 @@ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { .withMetadata(new ObjectMetaBuilder().withNamespace("right").withName("right-configmap").build()) .withData(Map.of("right.value", "right-after-change")).build(); - replaceConfigMap(client, rightConfigMapAfterChange, "right"); + TestUtil.replaceConfigMap(client, rightConfigMapAfterChange, "right"); String[] resultAfterChange = new String[1]; await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { - WebClient innerWebClient = builder().baseUrl("http://localhost/right").build(); + WebClient innerWebClient = TestUtil.builder().baseUrl("http://localhost/right").build(); String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); + .retryWhen(TestUtil.retrySpec()).block(); resultAfterChange[0] = innerResult; return innerResult != null; }); @@ -306,25 +295,25 @@ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { } void testDataChangesInConfigMap() { - reCreateConfigMaps(util, client); - patchFour(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + TestUtil.reCreateConfigMaps(util, client); + TestUtil.patchFour(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(client, K3S, IMAGE_NAME); } void testConfigMapPollingReload() { - patchFive(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + TestUtil.patchFive(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); ConfigMapPollingReloadDelegate.testConfigMapPollingReload(client); } void testConfigMapMountPollingReload() { - reCreateConfigMaps(util, client); - patchSix(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + TestUtil.reCreateConfigMaps(util, client); + TestUtil.patchSix(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); ConfigMapMountPollingReloadDelegate.testConfigMapMountPollingReload(client, util, K3S, IMAGE_NAME); } void testPollingReloadConfigMapWithBootstrap() { - reCreateConfigMaps(util, client); - patchSeven(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + TestUtil.reCreateConfigMaps(util, client); + TestUtil.patchSeven(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); BootstrapEnabledPollingReloadConfigMapMountDelegate.testPollingReloadConfigMapWithBootstrap(client, util, K3S, IMAGE_NAME); DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(client, K3S, IMAGE_NAME); diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapMountPollingReloadDelegate.java similarity index 87% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapMountPollingReloadDelegate.java index 64cc7fa48c..d91978c670 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapMountPollingReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapMountPollingReloadDelegate.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import java.io.InputStream; import java.time.Duration; @@ -32,8 +32,6 @@ import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; /** * @author wind57 @@ -63,8 +61,8 @@ static void testConfigMapMountPollingReload(KubernetesClient client, Util util, Commons.waitForLogStatement("will add file-based property source : /tmp/application.properties", container, appLabelValue); // (3) - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + WebClient webClient = TestUtil.builder().baseUrl("http://localhost/key").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) .block(); // we first read the initial value from the configmap @@ -78,7 +76,7 @@ static void testConfigMapMountPollingReload(KubernetesClient client, Util util, client.configMaps().inNamespace("default").resource(configMap).createOrReplace(); await().timeout(Duration.ofSeconds(360)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("as-mount-changed")); + .bodyToMono(String.class).retryWhen(TestUtil.retrySpec()).block().equals("as-mount-changed")); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java similarity index 82% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java index 6b603028e4..6f5499cd79 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/ConfigMapPollingReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import java.time.Duration; import java.util.Map; @@ -30,8 +30,6 @@ import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; /** * @author wind57 @@ -39,8 +37,8 @@ final class ConfigMapPollingReloadDelegate { static void testConfigMapPollingReload(KubernetesClient client) { - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + WebClient webClient = TestUtil.builder().baseUrl("http://localhost/key").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) .block(); // we first read the initial value from the configmap @@ -55,7 +53,7 @@ static void testConfigMapPollingReload(KubernetesClient client) { client.configMaps().inNamespace("default").resource(map).createOrReplace(); await().ignoreException(HttpServerErrorException.BadGateway.class).timeout(Duration.ofSeconds(120)) - .until(() -> webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .until(() -> webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) .block().equals("after-change")); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/DataChangesInConfigMapReloadDelegate.java similarity index 89% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/DataChangesInConfigMapReloadDelegate.java index e679f28795..688b859dfb 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/DataChangesInConfigMapReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/DataChangesInConfigMapReloadDelegate.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import java.time.Duration; import java.util.Map; @@ -31,10 +31,10 @@ import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.builder; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.logs; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.replaceConfigMap; -import static org.springframework.cloud.kubernetes.fabric8.configmap.event.reload.TestUtil.retrySpec; +import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.builder; +import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.logs; +import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.replaceConfigMap; +import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.retrySpec; final class DataChangesInConfigMapReloadDelegate { diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java similarity index 99% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java index 934d328f26..50df50dd59 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/event/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.configmap.event.reload; +package org.springframework.cloud.kubernetes.fabric8.reload; import java.io.InputStream; import java.time.Duration; From 8680b1ed15749429b12437ba7de2cd206d40479a Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 16:51:39 +0300 Subject: [PATCH 14/26] increase --- .../cloud/kubernetes/integration/tests/commons/Commons.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java b/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java index 3ae02cfd26..f05b83ceaf 100644 --- a/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java +++ b/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java @@ -116,7 +116,7 @@ public static void assertReloadLogStatements(String left, String right, String a LOG.info("appPodName : ->" + appPodName + "<-"); // we issue a pollDelay to let the logs sync in, otherwise the results are not // going to be correctly asserted - await().pollDelay(20, TimeUnit.SECONDS).pollInterval(Duration.ofSeconds(5)).atMost(Duration.ofSeconds(120)) + await().pollDelay(20, TimeUnit.SECONDS).pollInterval(Duration.ofSeconds(5)).atMost(Duration.ofSeconds(240)) .until(() -> { Container.ExecResult result = CONTAINER.execInContainer("sh", "-c", From a95ad358bdc4c9240e8c5fb233d0cf06debe8d6c Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 17:42:53 +0300 Subject: [PATCH 15/26] fix --- .../fabric8/reload/ConfigMapEventReloadIT.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java index 3a2fa92a9d..6a50bbdf09 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java @@ -130,12 +130,12 @@ void testInformFromOneNamespaceEventNotTriggered() { return "left-initial".equals(innerResult); }); - testInformFromOneNamespaceEventTriggered(); - testInform(); - testInformFromOneNamespaceEventTriggeredSecretsDisabled(); - testDataChangesInConfigMap(); - testConfigMapPollingReload(); - testConfigMapMountPollingReload(); + //testInformFromOneNamespaceEventTriggered(); + //testInform(); + //testInformFromOneNamespaceEventTriggeredSecretsDisabled(); + //testDataChangesInConfigMap(); + //testConfigMapPollingReload(); + //testConfigMapMountPollingReload(); testPollingReloadConfigMapWithBootstrap(); } @@ -316,7 +316,6 @@ void testPollingReloadConfigMapWithBootstrap() { TestUtil.patchSeven(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); BootstrapEnabledPollingReloadConfigMapMountDelegate.testPollingReloadConfigMapWithBootstrap(client, util, K3S, IMAGE_NAME); - DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(client, K3S, IMAGE_NAME); } private static void manifests(Phase phase) { From d9f9be0ed200600a2d81ea827f0f2f0795861027 Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 17:43:12 +0300 Subject: [PATCH 16/26] fix --- .../cloud/kubernetes/integration/tests/commons/Commons.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java b/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java index f05b83ceaf..3ae02cfd26 100644 --- a/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java +++ b/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/integration/tests/commons/Commons.java @@ -116,7 +116,7 @@ public static void assertReloadLogStatements(String left, String right, String a LOG.info("appPodName : ->" + appPodName + "<-"); // we issue a pollDelay to let the logs sync in, otherwise the results are not // going to be correctly asserted - await().pollDelay(20, TimeUnit.SECONDS).pollInterval(Duration.ofSeconds(5)).atMost(Duration.ofSeconds(240)) + await().pollDelay(20, TimeUnit.SECONDS).pollInterval(Duration.ofSeconds(5)).atMost(Duration.ofSeconds(120)) .until(() -> { Container.ExecResult result = CONTAINER.execInContainer("sh", "-c", From 1d68777405e0c3b3cf4b44e6c1b36f78e18d491f Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 18:30:29 +0300 Subject: [PATCH 17/26] trigger From 81c0d41b49836ff37f0739d81cbdb93412bc243b Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 18:49:05 +0300 Subject: [PATCH 18/26] simplify + enable all tests --- ...ventReloadIT.java => Fabric8EventReloadIT.java} | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/{ConfigMapEventReloadIT.java => Fabric8EventReloadIT.java} (98%) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java similarity index 98% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java index 6a50bbdf09..a2974be446 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapEventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java @@ -47,7 +47,7 @@ /** * @author wind57 */ -class ConfigMapEventReloadIT { +class Fabric8EventReloadIT { private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-reload"; @@ -130,12 +130,12 @@ void testInformFromOneNamespaceEventNotTriggered() { return "left-initial".equals(innerResult); }); - //testInformFromOneNamespaceEventTriggered(); - //testInform(); - //testInformFromOneNamespaceEventTriggeredSecretsDisabled(); - //testDataChangesInConfigMap(); - //testConfigMapPollingReload(); - //testConfigMapMountPollingReload(); + testInformFromOneNamespaceEventTriggered(); + testInform(); + testInformFromOneNamespaceEventTriggeredSecretsDisabled(); + testDataChangesInConfigMap(); + testConfigMapPollingReload(); + testConfigMapMountPollingReload(); testPollingReloadConfigMapWithBootstrap(); } From d1f42c57a7adf84f136dc491e451789428a3dacd Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 18:51:07 +0300 Subject: [PATCH 19/26] remove overlaping test --- .../pom.xml | 1 - .../pom.xml | 105 --------------- .../fabric8/configmap/ConfigMapApp.java | 35 ----- .../configmap/ConfigMapController.java | 47 ------- .../configmap/ConfigMapProperties.java | 37 ------ .../fabric8/configmap/GreetingProperties.java | 27 ---- .../resources/application-kubernetes.yaml | 2 - .../src/main/resources/application.yaml | 5 - .../fabric8/configmap/Fabric8ConfigMapIT.java | 121 ------------------ .../src/test/resources/fabric8-configmap.yaml | 10 -- .../test/resources/fabric8-deployment.yaml | 28 ---- .../src/test/resources/fabric8-ingress.yaml | 16 --- .../src/test/resources/fabric8-service.yaml | 14 -- .../src/test/resources/logback-test.xml | 15 --- 14 files changed, 463 deletions(-) delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/pom.xml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapApp.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapController.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapProperties.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/GreetingProperties.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/resources/application-kubernetes.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/resources/application.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/Fabric8ConfigMapIT.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-configmap.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-deployment.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-ingress.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-service.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/logback-test.xml diff --git a/spring-cloud-kubernetes-integration-tests/pom.xml b/spring-cloud-kubernetes-integration-tests/pom.xml index daae6f3637..f905e5a68a 100644 --- a/spring-cloud-kubernetes-integration-tests/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/pom.xml @@ -48,7 +48,6 @@ - spring-cloud-kubernetes-fabric8-client-configmap spring-cloud-kubernetes-fabric8-istio-it spring-cloud-kubernetes-fabric8-client-discovery spring-cloud-kubernetes-fabric8-client-loadbalancer diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/pom.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/pom.xml deleted file mode 100644 index f95d31e806..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/pom.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - org.springframework.cloud - spring-cloud-kubernetes-integration-tests - 3.0.5-SNAPSHOT - - 4.0.0 - - spring-cloud-kubernetes-fabric8-client-configmap - - - - org.springframework.cloud - spring-cloud-starter-kubernetes-fabric8-all - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.cloud - spring-cloud-kubernetes-test-support - - - - - - - ../src/main/resources - true - - - src/main/resources - true - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - docker.io/springcloud/${project.artifactId}:${project.version} - - - - build-image - - ${skip.build.image} - - package - - build-image - - - - repackage - package - - repackage - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - - - - - - ${testsToRun} - - - - - - - diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapApp.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapApp.java deleted file mode 100644 index 4104749bd4..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapApp.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2013-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; - -/** - * @author wind57 - */ - -@SpringBootApplication -@EnableConfigurationProperties({ ConfigMapProperties.class, GreetingProperties.class }) -public class ConfigMapApp { - - public static void main(String[] args) { - SpringApplication.run(ConfigMapApp.class, args); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapController.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapController.java deleted file mode 100644 index 6adf0af2e6..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapController.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2013-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author wind57 - */ -@RestController -public class ConfigMapController { - - private final ConfigMapProperties properties; - - private final GreetingProperties greetingProperties; - - public ConfigMapController(ConfigMapProperties properties, GreetingProperties greetingProperties) { - this.properties = properties; - this.greetingProperties = greetingProperties; - } - - @GetMapping("/key1") - public String key1() { - return properties.getKey1(); - } - - @GetMapping("/greeting") - public String message() { - return greetingProperties.message(); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapProperties.java deleted file mode 100644 index 074c72500b..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/ConfigMapProperties.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2013-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * @author wind57 - */ -@ConfigurationProperties("from.yaml") -public class ConfigMapProperties { - - private String key1; - - public String getKey1() { - return key1; - } - - public void setKey1(String key1) { - this.key1 = key1; - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/GreetingProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/GreetingProperties.java deleted file mode 100644 index 458f9f964e..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/java/org/springframework/cloud/kubernetes/fabric8/configmap/GreetingProperties.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * @author wind57 - */ -@ConfigurationProperties("greeting") -public record GreetingProperties(String message) { - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/resources/application-kubernetes.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/resources/application-kubernetes.yaml deleted file mode 100644 index e2d4e521cf..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/resources/application-kubernetes.yaml +++ /dev/null @@ -1,2 +0,0 @@ -greeting: - message: Hello From kubernetes profile diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/resources/application.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/resources/application.yaml deleted file mode 100644 index ace4cb6b1f..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/main/resources/application.yaml +++ /dev/null @@ -1,5 +0,0 @@ -spring: - application: - name: my-configmap - config: - import: "kubernetes:" diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/Fabric8ConfigMapIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/Fabric8ConfigMapIT.java deleted file mode 100644 index 1c2236f059..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/java/org/springframework/cloud/kubernetes/fabric8/configmap/Fabric8ConfigMapIT.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2013-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.configmap; - -import java.io.InputStream; -import java.time.Duration; -import java.util.Objects; - -import io.fabric8.kubernetes.api.model.ConfigMap; -import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.networking.v1.Ingress; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.utils.Serialization; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; - -import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; -import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; -import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.WebClient; - -class Fabric8ConfigMapIT { - - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-configmap"; - - private static final String NAMESPACE = "default"; - - private static KubernetesClient client; - - private static final K3sContainer K3S = Commons.container(); - - private static Util util; - - @BeforeAll - static void beforeAll() throws Exception { - K3S.start(); - util = new Util(K3S); - client = util.client(); - - Commons.validateImage(IMAGE_NAME, K3S); - Commons.loadSpringCloudKubernetesImage(IMAGE_NAME, K3S); - - util.setUp(NAMESPACE); - manifests(Phase.CREATE); - } - - @AfterAll - static void afterAll() throws Exception { - manifests(Phase.DELETE); - Commons.cleanUp(IMAGE_NAME, K3S); - Commons.systemPrune(); - } - - @Test - void test() { - WebClient client = builder().baseUrl("http://localhost/key1").build(); - String result = client.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - Assertions.assertEquals("value1", result); - - client = builder().baseUrl("http://localhost/greeting").build(); - String greetingResult = client.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - Assertions.assertEquals("Hello From kubernetes profile", greetingResult); - } - - private static void manifests(Phase phase) { - - InputStream deploymentStream = util.inputStream("fabric8-deployment.yaml"); - InputStream serviceStream = util.inputStream("fabric8-service.yaml"); - InputStream ingressStream = util.inputStream("fabric8-ingress.yaml"); - InputStream configMapStream = util.inputStream("fabric8-configmap.yaml"); - - Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); - Service service = Serialization.unmarshal(serviceStream, Service.class); - Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class); - ConfigMap configMap = Serialization.unmarshal(configMapStream, ConfigMap.class); - - if (phase.equals(Phase.CREATE)) { - util.createAndWait(NAMESPACE, configMap, null); - util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); - } - else { - util.deleteAndWait(NAMESPACE, configMap, null); - util.deleteAndWait(NAMESPACE, deployment, service, ingress); - } - - } - - private WebClient.Builder builder() { - return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); - } - - private RetryBackoffSpec retrySpec() { - return Retry.fixedDelay(15, Duration.ofSeconds(1)).filter(Objects::nonNull); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-configmap.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-configmap.yaml deleted file mode 100644 index e0aea66b69..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-configmap.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-configmap - namespace: default -data: - application.yaml: | - from: - yaml: - key1: value1 diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-deployment.yaml deleted file mode 100644 index 8302565ac5..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-deployment.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: spring-cloud-kubernetes-fabric8-client-configmap-deployment -spec: - selector: - matchLabels: - app: spring-cloud-kubernetes-fabric8-client-configmap - template: - metadata: - labels: - app: spring-cloud-kubernetes-fabric8-client-configmap - spec: - serviceAccountName: spring-cloud-kubernetes-serviceaccount - containers: - - name: spring-cloud-kubernetes-fabric8-client-configmap - image: docker.io/springcloud/spring-cloud-kubernetes-fabric8-client-configmap - imagePullPolicy: IfNotPresent - readinessProbe: - httpGet: - port: 8080 - path: /actuator/health/readiness - livenessProbe: - httpGet: - port: 8080 - path: /actuator/health/liveness - ports: - - containerPort: 8080 diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-ingress.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-ingress.yaml deleted file mode 100644 index 51dc769bb2..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-ingress.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: spring-cloud-kubernetes-fabric8-client-configmap-ingress - namespace: default -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: spring-cloud-kubernetes-fabric8-client-configmap - port: - number: 8080 diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-service.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-service.yaml deleted file mode 100644 index 7b918dfc4e..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/fabric8-service.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - app: spring-cloud-kubernetes-fabric8-client-configmap - name: spring-cloud-kubernetes-fabric8-client-configmap -spec: - ports: - - name: http - port: 8080 - targetPort: 8080 - selector: - app: spring-cloud-kubernetes-fabric8-client-configmap - type: ClusterIP diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/logback-test.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/logback-test.xml deleted file mode 100644 index ee24334373..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-configmap/src/test/resources/logback-test.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n - - - - - - - - - - - From a0cd375070dafbf1b0653aa346acf40197d6c041 Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 19:21:11 +0300 Subject: [PATCH 20/26] dirty --- .../cloud/kubernetes/fabric8/reload/App.java | 2 +- .../kubernetes/fabric8/reload/Controller.java | 11 +- .../fabric8/reload/SecretProperties.java | 37 ++++ .../resources/application-with-secret.yaml} | 0 ...edPollingReloadConfigMapMountDelegate.java | 4 +- .../ConfigMapMountPollingReloadDelegate.java | 4 +- .../ConfigMapPollingReloadDelegate.java | 8 +- .../fabric8/reload/Fabric8EventReloadIT.java | 58 +++--- .../reload/SecretsEventsReloadDelegate.java | 67 +++++++ .../kubernetes/fabric8/reload/TestUtil.java | 27 ++- .../src/test/resources/secret.yaml | 4 +- .../event/reload/SecretsEventsReloadIT.java | 184 ------------------ 12 files changed, 185 insertions(+), 221 deletions(-) create mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretProperties.java rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/resources/application.yaml => spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-with-secret.yaml} (100%) create mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java rename spring-cloud-kubernetes-integration-tests/{spring-cloud-kubernetes-fabric8-client-secrets-event-reload => spring-cloud-kubernetes-fabric8-client-reload}/src/test/resources/secret.yaml (55%) delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsEventsReloadIT.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/App.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/App.java index 29771fb8dd..f6a855befd 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/App.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/App.java @@ -25,7 +25,7 @@ */ @SpringBootApplication @EnableConfigurationProperties({ LeftProperties.class, RightProperties.class, RightWithLabelsProperties.class, - ConfigMapProperties.class }) + ConfigMapProperties.class, SecretProperties.class }) public class App { public static void main(String[] args) { diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/Controller.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/Controller.java index 8087f875cb..e79c04ba06 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/Controller.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/Controller.java @@ -33,12 +33,16 @@ public class Controller { private final ConfigMapProperties configMapProperties; + private final SecretProperties secretProperties; + public Controller(LeftProperties leftProperties, RightProperties rightProperties, - RightWithLabelsProperties rightWithLabelsProperties, ConfigMapProperties configMapProperties) { + RightWithLabelsProperties rightWithLabelsProperties, ConfigMapProperties configMapProperties, + SecretProperties secretProperties) { this.leftProperties = leftProperties; this.rightProperties = rightProperties; this.rightWithLabelsProperties = rightWithLabelsProperties; this.configMapProperties = configMapProperties; + this.secretProperties = secretProperties; } @GetMapping("/left") @@ -61,4 +65,9 @@ public String key() { return configMapProperties.getKey(); } + @GetMapping("/key-from-secret") + public String keyFromSecret() { + return secretProperties.getKey(); + } + } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretProperties.java new file mode 100644 index 0000000000..3b9f3a10fa --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretProperties.java @@ -0,0 +1,37 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.fabric8.reload; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author wind57 + */ +@ConfigurationProperties("from.secret.properties") +public class SecretProperties { + + private String key; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + +} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/resources/application.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-with-secret.yaml similarity index 100% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/resources/application.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/main/resources/application-with-secret.yaml diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java index 24a5e0dc86..450494e445 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/BootstrapEnabledPollingReloadConfigMapMountDelegate.java @@ -58,8 +58,8 @@ static void testPollingReloadConfigMapWithBootstrap(KubernetesClient client, Uti appLabelValue); // (3) WebClient webClient = TestUtil.builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(TestUtil.retrySpec()).block(); // we first read the initial value from the configmap Assertions.assertEquals("as-mount-initial", result); diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapMountPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapMountPollingReloadDelegate.java index d91978c670..2642296b09 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapMountPollingReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapMountPollingReloadDelegate.java @@ -62,8 +62,8 @@ static void testConfigMapMountPollingReload(KubernetesClient client, Util util, appLabelValue); // (3) WebClient webClient = TestUtil.builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(TestUtil.retrySpec()).block(); // we first read the initial value from the configmap Assertions.assertEquals("as-mount-initial", result); diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java index 6f5499cd79..5e6861c816 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java @@ -38,8 +38,8 @@ final class ConfigMapPollingReloadDelegate { static void testConfigMapPollingReload(KubernetesClient client) { WebClient webClient = TestUtil.builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(TestUtil.retrySpec()).block(); // we first read the initial value from the configmap Assertions.assertEquals("as-mount-initial", result); @@ -53,8 +53,8 @@ static void testConfigMapPollingReload(KubernetesClient client) { client.configMaps().inNamespace("default").resource(map).createOrReplace(); await().ignoreException(HttpServerErrorException.BadGateway.class).timeout(Duration.ofSeconds(120)) - .until(() -> webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block().equals("after-change")); + .until(() -> webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(TestUtil.retrySpec()).block().equals("after-change")); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java index a2974be446..4d09997956 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java @@ -24,6 +24,7 @@ import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.fabric8.kubernetes.api.model.Secret; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.api.model.networking.v1.Ingress; @@ -102,15 +103,16 @@ void testInformFromOneNamespaceEventNotTriggered() { "added secret informer for namespace", IMAGE_NAME); WebClient webClient = TestUtil.builder().baseUrl("http://localhost/left").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(TestUtil.retrySpec()).block(); // we first read the initial value from the left-configmap Assertions.assertEquals("left-initial", result); // then read the value from the right-configmap webClient = TestUtil.builder().baseUrl("http://localhost/right").build(); - result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()).block(); + result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) + .block(); Assertions.assertEquals("right-initial", result); // then deploy a new version of right-configmap @@ -130,13 +132,14 @@ void testInformFromOneNamespaceEventNotTriggered() { return "left-initial".equals(innerResult); }); - testInformFromOneNamespaceEventTriggered(); - testInform(); - testInformFromOneNamespaceEventTriggeredSecretsDisabled(); - testDataChangesInConfigMap(); - testConfigMapPollingReload(); - testConfigMapMountPollingReload(); - testPollingReloadConfigMapWithBootstrap(); + // testInformFromOneNamespaceEventTriggered(); + // testInform(); + // testInformFromOneNamespaceEventTriggeredSecretsDisabled(); + // testDataChangesInConfigMap(); + // testConfigMapPollingReload(); + // testConfigMapMountPollingReload(); + // testPollingReloadConfigMapWithBootstrap(); + testSecretReload(); } /** @@ -150,7 +153,7 @@ void testInformFromOneNamespaceEventNotTriggered() { */ void testInformFromOneNamespaceEventTriggered() { - TestUtil.reCreateConfigMaps(util, client); + TestUtil.reCreateSources(util, client); TestUtil.patchOne(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", @@ -158,8 +161,8 @@ void testInformFromOneNamespaceEventTriggered() { // read the value from the right-configmap WebClient webClient = TestUtil.builder().baseUrl("http://localhost/right").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(TestUtil.retrySpec()).block(); Assertions.assertEquals("right-initial", result); // then deploy a new version of right-configmap @@ -192,7 +195,7 @@ void testInformFromOneNamespaceEventTriggered() { */ void testInform() { - TestUtil.reCreateConfigMaps(util, client); + TestUtil.reCreateSources(util, client); TestUtil.patchTwo(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", @@ -246,8 +249,8 @@ void testInform() { // right-configmap now will see the new value also, but only because the other // configmap has triggered the restart - rightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block(); + rightResult = rightWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(TestUtil.retrySpec()).block(); Assertions.assertEquals("right-after-change", rightResult); } @@ -263,7 +266,7 @@ void testInform() { */ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { - TestUtil.reCreateConfigMaps(util, client); + TestUtil.reCreateSources(util, client); TestUtil.patchThree(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); Commons.assertReloadLogStatements("added configmap informer for namespace", @@ -271,8 +274,8 @@ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { // read the value from the right-configmap WebClient webClient = TestUtil.builder().baseUrl("http://localhost/right").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(TestUtil.retrySpec()).block(); Assertions.assertEquals("right-initial", result); // then deploy a new version of right-configmap @@ -295,7 +298,7 @@ void testInformFromOneNamespaceEventTriggeredSecretsDisabled() { } void testDataChangesInConfigMap() { - TestUtil.reCreateConfigMaps(util, client); + TestUtil.reCreateSources(util, client); TestUtil.patchFour(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(client, K3S, IMAGE_NAME); } @@ -306,18 +309,23 @@ void testConfigMapPollingReload() { } void testConfigMapMountPollingReload() { - TestUtil.reCreateConfigMaps(util, client); + TestUtil.reCreateSources(util, client); TestUtil.patchSix(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); ConfigMapMountPollingReloadDelegate.testConfigMapMountPollingReload(client, util, K3S, IMAGE_NAME); } void testPollingReloadConfigMapWithBootstrap() { - TestUtil.reCreateConfigMaps(util, client); + TestUtil.reCreateSources(util, client); TestUtil.patchSeven(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); BootstrapEnabledPollingReloadConfigMapMountDelegate.testPollingReloadConfigMapWithBootstrap(client, util, K3S, IMAGE_NAME); } + void testSecretReload() { + TestUtil.patchEight(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); + SecretsEventsReloadDelegate.testSecretReload(client, IMAGE_NAME); + } + private static void manifests(Phase phase) { InputStream deploymentStream = util.inputStream("deployment.yaml"); @@ -327,6 +335,7 @@ private static void manifests(Phase phase) { InputStream rightConfigMapStream = util.inputStream("right-configmap.yaml"); InputStream rightWithLabelConfigMapStream = util.inputStream("right-configmap-with-label.yaml"); InputStream configMapAsStream = util.inputStream("configmap.yaml"); + InputStream secretAsStream = util.inputStream("secret.yaml"); Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); @@ -336,19 +345,20 @@ private static void manifests(Phase phase) { ConfigMap rightConfigMap = Serialization.unmarshal(rightConfigMapStream, ConfigMap.class); ConfigMap rightWithLabelConfigMap = Serialization.unmarshal(rightWithLabelConfigMapStream, ConfigMap.class); ConfigMap configMap = Serialization.unmarshal(configMapAsStream, ConfigMap.class); + Secret secret = Serialization.unmarshal(secretAsStream, Secret.class); if (phase.equals(Phase.CREATE)) { util.createAndWait("left", leftConfigMap, null); util.createAndWait("right", rightConfigMap, null); util.createAndWait("right", rightWithLabelConfigMap, null); - util.createAndWait(NAMESPACE, configMap, null); + util.createAndWait(NAMESPACE, configMap, secret); util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); } else { util.deleteAndWait("left", leftConfigMap, null); util.deleteAndWait("right", rightConfigMap, null); util.deleteAndWait("right", rightWithLabelConfigMap, null); - util.deleteAndWait(NAMESPACE, configMap, null); + util.deleteAndWait(NAMESPACE, configMap, secret); util.deleteAndWait(NAMESPACE, deployment, service, ingress); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java new file mode 100644 index 0000000000..c5b6fbcd41 --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java @@ -0,0 +1,67 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.fabric8.reload; + +import java.time.Duration; +import java.util.Base64; +import java.util.Map; + +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.SecretBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import org.junit.jupiter.api.Assertions; + +import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; +import org.springframework.http.HttpMethod; +import org.springframework.web.reactive.function.client.WebClient; + +import static org.awaitility.Awaitility.await; +import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.builder; +import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.retrySpec; + +/** + * @author wind57 + */ +final class SecretsEventsReloadDelegate { + + static void testSecretReload(KubernetesClient client, String appLabelValue) { + Commons.assertReloadLogStatements("added secret informer for namespace", + "added configmap informer for namespace", appLabelValue); + WebClient webClient = builder().baseUrl("http://localhost/key-from-secret").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .block(); + + // we first read the initial value from the secret + Assertions.assertEquals("initial", result); + + // then deploy a new version of the secret + // since we poll and have reload in place, the new property must be visible + Secret secret = new SecretBuilder() + .withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("event-reload").build()) + .withData(Map.of("application.properties", + Base64.getEncoder().encodeToString("from.secret.properties.key=after-change".getBytes()))) + .build(); + + client.secrets().inNamespace("default").resource(secret).createOrReplace(); + + await().timeout(Duration.ofSeconds(120)).until(() -> webClient.method(HttpMethod.GET).retrieve() + .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("after-change")); + + } + +} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java index 50df50dd59..0c3281925a 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java @@ -299,11 +299,32 @@ final class TestUtil { } """; + private static final String BODY_EIGHT = """ + { + "spec": { + "template": { + "spec": { + "containers": [{ + "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", + "image": "image_name_here", + "env": [ + { + "name": "SPRING_PROFILES_ACTIVE", + "value": "with-secret" + } + ] + }] + } + } + } + } + """; + private TestUtil() { } - static void reCreateConfigMaps(Util util, KubernetesClient client) { + static void reCreateSources(Util util, KubernetesClient client) { InputStream leftConfigMapStream = util.inputStream("left-configmap.yaml"); InputStream rightConfigMapStream = util.inputStream("right-configmap.yaml"); InputStream configMapStream = util.inputStream("configmap.yaml"); @@ -349,6 +370,10 @@ static void patchSeven(Util util, String dockerImage, String deploymentName, Str util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_SEVEN, POD_LABELS); } + static void patchEight(Util util, String dockerImage, String deploymentName, String namespace) { + util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_EIGHT, POD_LABELS); + } + static WebClient.Builder builder() { return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/secret.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/secret.yaml similarity index 55% rename from spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/secret.yaml rename to spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/secret.yaml index 9ad19aadfc..0464001312 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/secret.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/secret.yaml @@ -4,6 +4,6 @@ metadata: name: event-reload namespace: default data: - # from.properties.key=initial + # from.secret.properties.key=initial application.properties: | - ZnJvbS5wcm9wZXJ0aWVzLmtleT1pbml0aWFs + ZnJvbS5zZWNyZXQucHJvcGVydGllcy5rZXk9aW5pdGlhbA== diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsEventsReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsEventsReloadIT.java deleted file mode 100644 index 97bb53ecaf..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsEventsReloadIT.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright 2013-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.secrets.event.reload; - -import java.io.InputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Base64; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import io.fabric8.kubernetes.api.model.EnvVar; -import io.fabric8.kubernetes.api.model.EnvVarBuilder; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import io.fabric8.kubernetes.api.model.Secret; -import io.fabric8.kubernetes.api.model.SecretBuilder; -import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.networking.v1.Ingress; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.utils.Serialization; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; - -import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; -import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; -import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.WebClient; - -import static org.awaitility.Awaitility.await; - -/** - * @author wind57 - */ -class SecretsEventsReloadIT { - - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-secrets-event-reload"; - - private static final String NAMESPACE = "default"; - - private static KubernetesClient client; - - private static Util util; - - private static final K3sContainer K3S = Commons.container(); - - @BeforeAll - static void beforeAll() throws Exception { - K3S.start(); - Commons.validateImage(IMAGE_NAME, K3S); - Commons.loadSpringCloudKubernetesImage(IMAGE_NAME, K3S); - - util = new Util(K3S); - client = util.client(); - util.setUp(NAMESPACE); - } - - @AfterAll - static void after() throws Exception { - Commons.cleanUp(IMAGE_NAME, K3S); - Commons.systemPrune(); - } - - @Test - void testSimple() { - manifests(Phase.CREATE, false); - Commons.assertReloadLogStatements("added secret informer for namespace", - "added configmap informer for namespace", IMAGE_NAME); - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - - // we first read the initial value from the secret - Assertions.assertEquals("initial", result); - - // then deploy a new version of the secret - // since we poll and have reload in place, the new property must be visible - Secret secret = new SecretBuilder() - .withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("event-reload").build()) - .withData(Map.of("application.properties", - Base64.getEncoder().encodeToString("from.properties.key=after-change".getBytes()))) - .build(); - - client.secrets().inNamespace("default").resource(secret).createOrReplace(); - - await().timeout(Duration.ofSeconds(120)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("after-change")); - - manifests(Phase.DELETE, false); - } - - @Test - void testSimpleConfigMapsDisabled() { - manifests(Phase.CREATE, true); - Commons.assertReloadLogStatements("added secret informer for namespace", - "added configmap informer for namespace", IMAGE_NAME); - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - - // we first read the initial value from the secret - Assertions.assertEquals("initial", result); - - // then deploy a new version of the secret - // since we poll and have reload in place, the new property must be visible - Secret secret = new SecretBuilder() - .withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("event-reload").build()) - .withData(Map.of("application.properties", - Base64.getEncoder().encodeToString("from.properties.key=after-change".getBytes()))) - .build(); - - client.secrets().inNamespace("default").resource(secret).createOrReplace(); - - await().timeout(Duration.ofSeconds(120)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("after-change")); - - manifests(Phase.DELETE, true); - - } - - private static void manifests(Phase phase, boolean configMapsDisabled) { - - InputStream deploymentStream = util.inputStream("deployment.yaml"); - InputStream serviceStream = util.inputStream("service.yaml"); - InputStream ingressStream = util.inputStream("ingress.yaml"); - InputStream secretStream = util.inputStream("secret.yaml"); - - Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); - Service service = Serialization.unmarshal(serviceStream, Service.class); - Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class); - Secret secret = Serialization.unmarshal(secretStream, Secret.class); - - if (configMapsDisabled) { - List envVars = new ArrayList<>( - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv()); - EnvVar configMapsDisabledEnvVar = new EnvVarBuilder().withName("SPRING_CLOUD_KUBERNETES_CONFIG_ENABLED") - .withValue("FALSE").build(); - envVars.add(configMapsDisabledEnvVar); - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(envVars); - } - - if (phase.equals(Phase.CREATE)) { - util.createAndWait(NAMESPACE, null, secret); - util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); - } - else { - util.deleteAndWait(NAMESPACE, null, secret); - util.deleteAndWait(NAMESPACE, deployment, service, ingress); - } - - } - - private WebClient.Builder builder() { - return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); - } - - private RetryBackoffSpec retrySpec() { - return Retry.fixedDelay(120, Duration.ofSeconds(1)).filter(Objects::nonNull); - } - -} From 4964e36f1e2eccee6ea98c74ed458c18f414ed29 Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 22:05:46 +0300 Subject: [PATCH 21/26] dirty --- .../pom.xml | 1 - .../reload/SecretsEventsReloadDelegate.java | 62 ++++-- .../pom.xml | 108 --------- .../secrets/event/reload/SecretsApp.java | 35 --- .../event/reload/SecretsController.java | 39 ---- .../event/reload/SecretsProperties.java | 37 --- .../reload/DataChangesInSecretsReloadIT.java | 210 ------------------ .../src/test/resources/deployment.yaml | 31 --- .../src/test/resources/ingress.yaml | 16 -- .../src/test/resources/logback-test.xml | 15 -- .../src/test/resources/service.yaml | 14 -- 11 files changed, 48 insertions(+), 520 deletions(-) delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/pom.xml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsApp.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsController.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsProperties.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/DataChangesInSecretsReloadIT.java delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/deployment.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/ingress.yaml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/logback-test.xml delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/service.yaml diff --git a/spring-cloud-kubernetes-integration-tests/pom.xml b/spring-cloud-kubernetes-integration-tests/pom.xml index f905e5a68a..b8dd8d7a0e 100644 --- a/spring-cloud-kubernetes-integration-tests/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/pom.xml @@ -51,7 +51,6 @@ spring-cloud-kubernetes-fabric8-istio-it spring-cloud-kubernetes-fabric8-client-discovery spring-cloud-kubernetes-fabric8-client-loadbalancer - spring-cloud-kubernetes-fabric8-client-secrets-event-reload spring-cloud-kubernetes-fabric8-client-reload spring-cloud-kubernetes-discoveryclient-it diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java index c5b6fbcd41..bc9e0cc7ba 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java @@ -26,12 +26,14 @@ import io.fabric8.kubernetes.client.KubernetesClient; import org.junit.jupiter.api.Assertions; +import org.testcontainers.k3s.K3sContainer; import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; import org.springframework.http.HttpMethod; import org.springframework.web.reactive.function.client.WebClient; import static org.awaitility.Awaitility.await; import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.builder; +import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.logs; import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.retrySpec; /** @@ -39,28 +41,60 @@ */ final class SecretsEventsReloadDelegate { - static void testSecretReload(KubernetesClient client, String appLabelValue) { + /** + *
+	 *     - secret with no labels and data: from.properties.key = initial exists in namespace default
+	 *     - we assert that we can read it correctly first, by invoking localhost/key.
+	 *
+	 *     - then we change the secret by adding a label, this in turn does not
+	 *       change the result of localhost/key, because the data has not changed.
+	 *
+	 *     - then we change data inside the secret, and we must see the updated value.
+	 * 
+ */ + static void testSecretReload(KubernetesClient client, K3sContainer container, String appLabelValue) { Commons.assertReloadLogStatements("added secret informer for namespace", - "added configmap informer for namespace", appLabelValue); - WebClient webClient = builder().baseUrl("http://localhost/key-from-secret").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); + "added configmap informer for namespace", appLabelValue); - // we first read the initial value from the secret + WebClient webClient = builder().baseUrl("http://localhost/key").build(); + String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) + .block(); Assertions.assertEquals("initial", result); - // then deploy a new version of the secret - // since we poll and have reload in place, the new property must be visible Secret secret = new SecretBuilder() - .withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("event-reload").build()) - .withData(Map.of("application.properties", - Base64.getEncoder().encodeToString("from.secret.properties.key=after-change".getBytes()))) - .build(); + .withMetadata(new ObjectMetaBuilder().withLabels(Map.of("letter", "a")).withNamespace("default") + .withName("event-reload").build()) + .withData(Map.of("application.properties", + Base64.getEncoder().encodeToString("from.properties.key=initial".getBytes()))) + .build(); + client.secrets().inNamespace("default").resource(secret).createOrReplace(); + + await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { + WebClient innerWebClient = builder().baseUrl("http://localhost/key").build(); + String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(retrySpec()).block(); + return "initial".equals(innerResult); + }); + + String logs = logs(container, appLabelValue); + Assertions.assertTrue(logs.contains("Secret event-reload was updated in namespace default")); + Assertions.assertTrue(logs.contains("data in secret has not changed, will not reload")); + + // change data + secret = new SecretBuilder() + .withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("event-reload").build()) + .withData(Map.of("application.properties", + Base64.getEncoder().encodeToString("from.properties.key=initial-changed".getBytes()))) + .build(); client.secrets().inNamespace("default").resource(secret).createOrReplace(); - await().timeout(Duration.ofSeconds(120)).until(() -> webClient.method(HttpMethod.GET).retrieve() - .bodyToMono(String.class).retryWhen(retrySpec()).block().equals("after-change")); + await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { + WebClient innerWebClient = builder().baseUrl("http://localhost/key").build(); + String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) + .retryWhen(retrySpec()).block(); + return "initial-changed".equals(innerResult); + }); } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/pom.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/pom.xml deleted file mode 100644 index 0778446710..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/pom.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - org.springframework.cloud - spring-cloud-kubernetes-integration-tests - 3.0.5-SNAPSHOT - - 4.0.0 - - spring-cloud-kubernetes-fabric8-client-secrets-event-reload - - - - - org.springframework.cloud - spring-cloud-kubernetes-fabric8-config - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.cloud - spring-cloud-kubernetes-test-support - - - - - - - - ../src/main/resources - true - - - src/main/resources - true - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - docker.io/springcloud/${project.artifactId}:${project.version} - - - - build-image - - ${skip.build.image} - - package - - build-image - - - - repackage - package - - repackage - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - - - - - - ${testsToRun} - - - - - - - - diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsApp.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsApp.java deleted file mode 100644 index cc49b3e4bc..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsApp.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2013-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.secrets.event.reload; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; - -/** - * @author wind57 - */ - -@SpringBootApplication -@EnableConfigurationProperties(SecretsProperties.class) -public class SecretsApp { - - public static void main(String[] args) { - SpringApplication.run(SecretsApp.class, args); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsController.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsController.java deleted file mode 100644 index 5c3d3ddac7..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsController.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2013-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.secrets.event.reload; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author wind57 - */ -@RestController -public class SecretsController { - - private final SecretsProperties properties; - - public SecretsController(SecretsProperties properties) { - this.properties = properties; - } - - @GetMapping("/key") - public String key() { - return properties.getKey(); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsProperties.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsProperties.java deleted file mode 100644 index 99419fff5c..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/main/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/SecretsProperties.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2013-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.secrets.event.reload; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * @author wind57 - */ -@ConfigurationProperties("from.properties") -public class SecretsProperties { - - private String key; - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/DataChangesInSecretsReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/DataChangesInSecretsReloadIT.java deleted file mode 100644 index 25a681729a..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/secrets/event/reload/DataChangesInSecretsReloadIT.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.secrets.event.reload; - -import java.io.InputStream; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Base64; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import io.fabric8.kubernetes.api.model.EnvVar; -import io.fabric8.kubernetes.api.model.EnvVarBuilder; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import io.fabric8.kubernetes.api.model.Secret; -import io.fabric8.kubernetes.api.model.SecretBuilder; -import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.networking.v1.Ingress; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.utils.Serialization; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.testcontainers.containers.Container; -import org.testcontainers.k3s.K3sContainer; -import reactor.netty.http.client.HttpClient; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; - -import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; -import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; -import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.WebClient; - -import static org.awaitility.Awaitility.await; - -/** - * @author wind57 - */ -class DataChangesInSecretsReloadIT { - - private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-secrets-event-reload"; - - private static final String NAMESPACE = "default"; - - private static KubernetesClient client; - - private static Util util; - - private static final K3sContainer K3S = Commons.container(); - - @BeforeAll - static void beforeAll() throws Exception { - K3S.start(); - Commons.validateImage(IMAGE_NAME, K3S); - Commons.loadSpringCloudKubernetesImage(IMAGE_NAME, K3S); - - util = new Util(K3S); - client = util.client(); - util.setUp(NAMESPACE); - } - - @AfterAll - static void after() throws Exception { - Commons.cleanUp(IMAGE_NAME, K3S); - Commons.systemPrune(); - } - - /** - *
-	 *     - secret with no labels and data: from.properties.key = initial exists in namespace default
-	 *     - we assert that we can read it correctly first, by invoking localhost/key.
-	 *
-	 *     - then we change the secret by adding a label, this in turn does not
-	 *       change the result of localhost/key, because the data has not changed.
-	 *
-	 *     - then we change data inside the secret, and we must see the updated value.
-	 * 
- */ - @Test - void testSimple() { - manifests(Phase.CREATE); - Commons.assertReloadLogStatements("added secret informer for namespace", - "added configmap informer for namespace", IMAGE_NAME); - - WebClient webClient = builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec()) - .block(); - Assertions.assertEquals("initial", result); - - Secret secret = new SecretBuilder() - .withMetadata(new ObjectMetaBuilder().withLabels(Map.of("letter", "a")).withNamespace(NAMESPACE) - .withName("event-reload").build()) - .withData(Map.of("application.properties", - Base64.getEncoder().encodeToString("from.properties.key=initial".getBytes()))) - .build(); - client.secrets().inNamespace(NAMESPACE).resource(secret).createOrReplace(); - - await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { - WebClient innerWebClient = builder().baseUrl("http://localhost/key").build(); - String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); - return "initial".equals(innerResult); - }); - - String logs = logs(); - Assertions.assertTrue(logs.contains("Secret event-reload was updated in namespace default")); - Assertions.assertTrue(logs.contains("data in secret has not changed, will not reload")); - - // change data - secret = new SecretBuilder() - .withMetadata(new ObjectMetaBuilder().withNamespace(NAMESPACE).withName("event-reload").build()) - .withData(Map.of("application.properties", - Base64.getEncoder().encodeToString("from.properties.key=initial-changed".getBytes()))) - .build(); - - client.secrets().inNamespace(NAMESPACE).resource(secret).createOrReplace(); - - await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> { - WebClient innerWebClient = builder().baseUrl("http://localhost/key").build(); - String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class) - .retryWhen(retrySpec()).block(); - return "initial-changed".equals(innerResult); - }); - - manifests(Phase.DELETE); - } - - private static void manifests(Phase phase) { - - InputStream deploymentStream = util.inputStream("deployment.yaml"); - InputStream serviceStream = util.inputStream("service.yaml"); - InputStream ingressStream = util.inputStream("ingress.yaml"); - InputStream secretAsStream = util.inputStream("secret.yaml"); - - Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class); - - List envVars = new ArrayList<>( - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv()); - EnvVar activeProfileProperty = new EnvVarBuilder().withName("SPRING_PROFILES_ACTIVE").withValue("one").build(); - envVars.add(activeProfileProperty); - - EnvVar configMapsDisabledEnvVar = new EnvVarBuilder().withName("SPRING_CLOUD_KUBERNETES_CONFIG_ENABLED") - .withValue("FALSE").build(); - - EnvVar debugLevel = new EnvVarBuilder() - .withName("LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_CLIENT_CONFIG_RELOAD").withName("DEBUG") - .build(); - envVars.add(debugLevel); - - envVars.add(configMapsDisabledEnvVar); - deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(envVars); - - Service service = Serialization.unmarshal(serviceStream, Service.class); - Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class); - Secret secret = Serialization.unmarshal(secretAsStream, Secret.class); - - if (phase.equals(Phase.CREATE)) { - util.createAndWait(NAMESPACE, null, secret); - util.createAndWait(NAMESPACE, null, deployment, service, ingress, true); - } - else { - util.deleteAndWait(NAMESPACE, null, secret); - util.deleteAndWait(NAMESPACE, deployment, service, ingress); - } - - } - - private String logs() { - try { - String appPodName = K3S.execInContainer("sh", "-c", - "kubectl get pods -l app=" + IMAGE_NAME + " -o=name --no-headers | tr -d '\n'").getStdout(); - - Container.ExecResult execResult = K3S.execInContainer("sh", "-c", "kubectl logs " + appPodName.trim()); - return execResult.getStdout(); - } - catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - private WebClient.Builder builder() { - return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create())); - } - - private RetryBackoffSpec retrySpec() { - return Retry.fixedDelay(120, Duration.ofSeconds(2)).filter(Objects::nonNull); - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/deployment.yaml deleted file mode 100644 index ce3261817b..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/deployment.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: spring-cloud-kubernetes-fabric8-client-secrets-deployment-event-reload -spec: - selector: - matchLabels: - app: spring-cloud-kubernetes-fabric8-client-secrets-event-reload - template: - metadata: - labels: - app: spring-cloud-kubernetes-fabric8-client-secrets-event-reload - spec: - serviceAccountName: spring-cloud-kubernetes-serviceaccount - containers: - - name: spring-cloud-kubernetes-fabric8-client-secrets-event-reload - image: docker.io/springcloud/spring-cloud-kubernetes-fabric8-client-secrets-event-reload - imagePullPolicy: IfNotPresent - readinessProbe: - httpGet: - port: 8080 - path: /actuator/health/readiness - livenessProbe: - httpGet: - port: 8080 - path: /actuator/health/liveness - ports: - - containerPort: 8080 - env: - - name: LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_FABRIC8_CONFIG_RELOAD - value: DEBUG diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/ingress.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/ingress.yaml deleted file mode 100644 index 19e5d0df5c..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/ingress.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: spring-cloud-kubernetes-fabric8-client-secrets-ingress-event-reload - namespace: default -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: spring-cloud-kubernetes-fabric8-client-secrets-event-reload - port: - number: 8080 diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/logback-test.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/logback-test.xml deleted file mode 100644 index ee24334373..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/logback-test.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n - - - - - - - - - - - diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/service.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/service.yaml deleted file mode 100644 index 239bc00bbb..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-secrets-event-reload/src/test/resources/service.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - app: spring-cloud-kubernetes-fabric8-client-secrets-event-reload - name: spring-cloud-kubernetes-fabric8-client-secrets-event-reload -spec: - ports: - - name: http - port: 8080 - targetPort: 8080 - selector: - app: spring-cloud-kubernetes-fabric8-client-secrets-event-reload - type: ClusterIP From e3e0d04a528d791f5917d7aca50d953d9cd3dcbe Mon Sep 17 00:00:00 2001 From: wind57 Date: Fri, 6 Oct 2023 22:10:21 +0300 Subject: [PATCH 22/26] fix --- .../ConfigMapPollingReloadDelegate.java | 61 ------------------- .../fabric8/reload/Fabric8EventReloadIT.java | 6 -- .../kubernetes/fabric8/reload/TestUtil.java | 29 --------- 3 files changed, 96 deletions(-) delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java deleted file mode 100644 index 6f5499cd79..0000000000 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/ConfigMapPollingReloadDelegate.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2013-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.fabric8.reload; - -import java.time.Duration; -import java.util.Map; - -import io.fabric8.kubernetes.api.model.ConfigMap; -import io.fabric8.kubernetes.api.model.ConfigMapBuilder; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import io.fabric8.kubernetes.client.KubernetesClient; -import org.junit.jupiter.api.Assertions; - -import org.springframework.http.HttpMethod; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.reactive.function.client.WebClient; - -import static org.awaitility.Awaitility.await; - -/** - * @author wind57 - */ -final class ConfigMapPollingReloadDelegate { - - static void testConfigMapPollingReload(KubernetesClient client) { - WebClient webClient = TestUtil.builder().baseUrl("http://localhost/key").build(); - String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block(); - - // we first read the initial value from the configmap - Assertions.assertEquals("as-mount-initial", result); - - // then deploy a new version of configmap - // since we poll and have reload in place, the new property must be visible - ConfigMap map = new ConfigMapBuilder() - .withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("poll-reload").build()) - .withData(Map.of("application.properties", "from.properties.key=after-change")).build(); - - client.configMaps().inNamespace("default").resource(map).createOrReplace(); - - await().ignoreException(HttpServerErrorException.BadGateway.class).timeout(Duration.ofSeconds(120)) - .until(() -> webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(TestUtil.retrySpec()) - .block().equals("after-change")); - - } - -} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java index a2974be446..ad4ce1347f 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java @@ -134,7 +134,6 @@ void testInformFromOneNamespaceEventNotTriggered() { testInform(); testInformFromOneNamespaceEventTriggeredSecretsDisabled(); testDataChangesInConfigMap(); - testConfigMapPollingReload(); testConfigMapMountPollingReload(); testPollingReloadConfigMapWithBootstrap(); } @@ -300,11 +299,6 @@ void testDataChangesInConfigMap() { DataChangesInConfigMapReloadDelegate.testDataChangesInConfigMap(client, K3S, IMAGE_NAME); } - void testConfigMapPollingReload() { - TestUtil.patchFive(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); - ConfigMapPollingReloadDelegate.testConfigMapPollingReload(client); - } - void testConfigMapMountPollingReload() { TestUtil.reCreateConfigMaps(util, client); TestUtil.patchSix(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE); diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java index 50df50dd59..ecbad0b75a 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/TestUtil.java @@ -170,31 +170,6 @@ final class TestUtil { } """; - private static final String BODY_FIVE = """ - { - "spec": { - "template": { - "spec": { - "containers": [{ - "name": "spring-cloud-kubernetes-fabric8-client-configmap-event-reload", - "image": "image_name_here", - "env": [ - { - "name": "SPRING_PROFILES_ACTIVE", - "value": "no-mount" - }, - { - "name": "SPRING_CLOUD_BOOTSTRAP_ENABLED", - "value": "FALSE" - } - ] - }] - } - } - } - } - """; - private static final String BODY_SIX = """ { "spec": { @@ -337,10 +312,6 @@ static void patchFour(Util util, String dockerImage, String deploymentName, Stri util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_FOUR, POD_LABELS); } - static void patchFive(Util util, String dockerImage, String deploymentName, String namespace) { - util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_FIVE, POD_LABELS); - } - static void patchSix(Util util, String dockerImage, String deploymentName, String namespace) { util.patchWithReplace(dockerImage, deploymentName, namespace, BODY_SIX, POD_LABELS); } From 00738ea03dbed3cad176383fe37275d9e8205214 Mon Sep 17 00:00:00 2001 From: wind57 Date: Sat, 7 Oct 2023 11:09:25 +0300 Subject: [PATCH 23/26] fix --- .../reload/SecretsEventsReloadDelegate.java | 26 +++++++++---------- .../src/test/resources/secret.yaml | 4 +-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java index 7a20cd960f..20dbeceb56 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java @@ -33,7 +33,6 @@ import static org.awaitility.Awaitility.await; import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.builder; -import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.logs; import static org.springframework.cloud.kubernetes.fabric8.reload.TestUtil.retrySpec; /** @@ -43,7 +42,7 @@ final class SecretsEventsReloadDelegate { /** *
-	 *     - secret with no labels and data: from.properties.key = initial exists in namespace default
+	 *     - secret with no labels and data: from.secret.properties.key = secret-initial exists in namespace default
 	 *     - we assert that we can read it correctly first, by invoking localhost/key.
 	 *
 	 *     - then we change the secret by adding a label, this in turn does not
@@ -56,44 +55,45 @@ static void testSecretReload(KubernetesClient client, K3sContainer container, St
 		Commons.assertReloadLogStatements("added secret informer for namespace",
 				"added configmap informer for namespace", appLabelValue);
 
-		WebClient webClient = builder().baseUrl("http://localhost/key").build();
+		WebClient webClient = builder().baseUrl("http://localhost/key-from-secret").build();
 		String result = webClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class).retryWhen(retrySpec())
 				.block();
-		Assertions.assertEquals("initial", result);
+		Assertions.assertEquals("secret-initial", result);
 
 		Secret secret = new SecretBuilder()
 				.withMetadata(new ObjectMetaBuilder().withLabels(Map.of("letter", "a")).withNamespace("default")
 						.withName("event-reload").build())
 				.withData(Map.of("application.properties",
-						Base64.getEncoder().encodeToString("from.properties.key=initial".getBytes())))
+						Base64.getEncoder().encodeToString("from.secret.properties.key=secret-initial".getBytes())))
 				.build();
 		client.secrets().inNamespace("default").resource(secret).createOrReplace();
 
 		await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> {
-			WebClient innerWebClient = builder().baseUrl("http://localhost/key").build();
+			WebClient innerWebClient = builder().baseUrl("http://localhost/key-from-secret").build();
 			String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class)
 					.retryWhen(retrySpec()).block();
-			return "initial".equals(innerResult);
+			return "secret-initial".equals(innerResult);
 		});
 
-		String logs = logs(container, appLabelValue);
-		Assertions.assertTrue(logs.contains("Secret event-reload was updated in namespace default"));
-		Assertions.assertTrue(logs.contains("data in secret has not changed, will not reload"));
+		Commons.waitForLogStatement("Secret event-reload was updated in namespace default",
+			container, appLabelValue);
+		Commons.waitForLogStatement("data in secret has not changed, will not reload",
+			container, appLabelValue);
 
 		// change data
 		secret = new SecretBuilder()
 				.withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("event-reload").build())
 				.withData(Map.of("application.properties",
-						Base64.getEncoder().encodeToString("from.properties.key=initial-changed".getBytes())))
+						Base64.getEncoder().encodeToString("from.secret.properties.key=secret-initial-changed".getBytes())))
 				.build();
 
 		client.secrets().inNamespace("default").resource(secret).createOrReplace();
 
 		await().pollInterval(Duration.ofSeconds(3)).atMost(Duration.ofSeconds(90)).until(() -> {
-			WebClient innerWebClient = builder().baseUrl("http://localhost/key").build();
+			WebClient innerWebClient = builder().baseUrl("http://localhost/key-from-secret").build();
 			String innerResult = innerWebClient.method(HttpMethod.GET).retrieve().bodyToMono(String.class)
 					.retryWhen(retrySpec()).block();
-			return "initial-changed".equals(innerResult);
+			return "secret-initial-changed".equals(innerResult);
 		});
 
 	}
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/secret.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/secret.yaml
index 0464001312..260f79102c 100644
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/secret.yaml
+++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/resources/secret.yaml
@@ -4,6 +4,6 @@ metadata:
   name: event-reload
   namespace: default
 data:
-  # from.secret.properties.key=initial
+  # from.secret.properties.key=secret-initial
   application.properties: |
-    ZnJvbS5zZWNyZXQucHJvcGVydGllcy5rZXk9aW5pdGlhbA==
+    ZnJvbS5zZWNyZXQucHJvcGVydGllcy5rZXk9c2VjcmV0LWluaXRpYWw=

From 473f69fb00fb95c21872fd264ac8091e7b3b7742 Mon Sep 17 00:00:00 2001
From: wind57 
Date: Sat, 7 Oct 2023 17:13:36 +0300
Subject: [PATCH 24/26] format

---
 .../fabric8/reload/SecretsEventsReloadDelegate.java      | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java
index 20dbeceb56..8217d475fd 100644
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java
+++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/SecretsEventsReloadDelegate.java
@@ -75,16 +75,15 @@ static void testSecretReload(KubernetesClient client, K3sContainer container, St
 			return "secret-initial".equals(innerResult);
 		});
 
-		Commons.waitForLogStatement("Secret event-reload was updated in namespace default",
-			container, appLabelValue);
-		Commons.waitForLogStatement("data in secret has not changed, will not reload",
-			container, appLabelValue);
+		Commons.waitForLogStatement("Secret event-reload was updated in namespace default", container, appLabelValue);
+		Commons.waitForLogStatement("data in secret has not changed, will not reload", container, appLabelValue);
 
 		// change data
 		secret = new SecretBuilder()
 				.withMetadata(new ObjectMetaBuilder().withNamespace("default").withName("event-reload").build())
 				.withData(Map.of("application.properties",
-						Base64.getEncoder().encodeToString("from.secret.properties.key=secret-initial-changed".getBytes())))
+						Base64.getEncoder()
+								.encodeToString("from.secret.properties.key=secret-initial-changed".getBytes())))
 				.build();
 
 		client.secrets().inNamespace("default").resource(secret).createOrReplace();

From 8c4a6f03686880f35771d3d13c786ff8489ca3cb Mon Sep 17 00:00:00 2001
From: wind57 
Date: Sat, 7 Oct 2023 21:38:59 +0300
Subject: [PATCH 25/26] fix

---
 .../pom.xml                                   |   1 -
 .../pom.xml                                   | 105 -----------
 .../Fabric8ClientLoadbalancerApp.java         |  66 -------
 .../src/main/resources/application.yaml       |   3 -
 .../it/Fabric8ClientLoadbalancerIT.java       | 166 ------------------
 .../src/test/resources/logback-test.xml       |  15 --
 ...abric8-client-loadbalancer-deployment.yaml |  28 ---
 ...s-fabric8-client-loadbalancer-ingress.yaml |  19 --
 ...s-fabric8-client-loadbalancer-service.yaml |  14 --
 9 files changed, 417 deletions(-)
 delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/pom.xml
 delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/cliend/loadbalancer/Fabric8ClientLoadbalancerApp.java
 delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/main/resources/application.yaml
 delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/it/Fabric8ClientLoadbalancerIT.java
 delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/logback-test.xml
 delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-deployment.yaml
 delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-ingress.yaml
 delete mode 100644 spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-service.yaml

diff --git a/spring-cloud-kubernetes-integration-tests/pom.xml b/spring-cloud-kubernetes-integration-tests/pom.xml
index b8dd8d7a0e..1a9189e176 100644
--- a/spring-cloud-kubernetes-integration-tests/pom.xml
+++ b/spring-cloud-kubernetes-integration-tests/pom.xml
@@ -50,7 +50,6 @@
 	
 		spring-cloud-kubernetes-fabric8-istio-it
 		spring-cloud-kubernetes-fabric8-client-discovery
-		spring-cloud-kubernetes-fabric8-client-loadbalancer
 		spring-cloud-kubernetes-fabric8-client-reload
 
 		spring-cloud-kubernetes-discoveryclient-it
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/pom.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/pom.xml
deleted file mode 100644
index 9362129cb0..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/pom.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-	
-		org.springframework.cloud
-		spring-cloud-kubernetes-integration-tests
-		3.0.5-SNAPSHOT
-	
-	4.0.0
-
-	spring-cloud-kubernetes-fabric8-client-loadbalancer
-
-	
-		
-			org.springframework.cloud
-			spring-cloud-kubernetes-fabric8-loadbalancer
-		
-		
-			org.springframework.boot
-			spring-boot-starter-webflux
-		
-		
-			org.springframework.boot
-			spring-boot-starter-actuator
-		
-
-		
-			org.springframework.cloud
-			spring-cloud-kubernetes-test-support
-		
-
-	
-	
-		
-			
-				../src/main/resources
-				true
-			
-			
-				src/main/resources
-				true
-			
-		
-
-		
-			
-			
-			
-				org.springframework.boot
-				spring-boot-maven-plugin
-				
-					docker.io/springcloud/${project.artifactId}:${project.version}
-				
-				
-					
-						build-image
-						
-							${skip.build.image}
-						
-						package
-						
-							build-image
-						
-					
-					
-						repackage
-						package
-						
-							repackage
-						
-					
-				
-			
-
-			
-			
-				org.apache.maven.plugins
-				maven-surefire-plugin
-				
-					true
-				
-			
-
-			
-			
-				org.apache.maven.plugins
-				maven-failsafe-plugin
-				
-					
-						
-							integration-test
-						
-					
-				
-				
-					
-						${testsToRun}
-					
-				
-			
-		
-	
-
-
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/cliend/loadbalancer/Fabric8ClientLoadbalancerApp.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/cliend/loadbalancer/Fabric8ClientLoadbalancerApp.java
deleted file mode 100644
index 1ada611025..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/cliend/loadbalancer/Fabric8ClientLoadbalancerApp.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2013-2021 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.kubernetes.fabric8.cliend.loadbalancer;
-
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
-import reactor.core.publisher.Mono;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.client.discovery.DiscoveryClient;
-import org.springframework.cloud.client.loadbalancer.LoadBalanced;
-import org.springframework.context.annotation.Bean;
-import org.springframework.http.HttpMethod;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.reactive.function.client.WebClient;
-
-@SpringBootApplication
-@RestController
-public class Fabric8ClientLoadbalancerApp {
-
-	private final DiscoveryClient discoveryClient;
-
-	public Fabric8ClientLoadbalancerApp(DiscoveryClient discoveryClient) {
-		this.discoveryClient = discoveryClient;
-	}
-
-	public static void main(String[] args) {
-		SpringApplication.run(Fabric8ClientLoadbalancerApp.class, args);
-	}
-
-	@Bean
-	@LoadBalanced
-	WebClient.Builder builder() {
-		return WebClient.builder();
-	}
-
-	@GetMapping("/servicea")
-	public Mono greeting() {
-		return builder().build().method(HttpMethod.GET).uri(URI.create("http://service-wiremock/__admin/mappings"))
-				.retrieve().bodyToMono(Map.class);
-	}
-
-	@GetMapping("/services")
-	public List services() {
-		return discoveryClient.getServices();
-	}
-
-}
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/main/resources/application.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/main/resources/application.yaml
deleted file mode 100644
index c83b17d1a4..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/main/resources/application.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-spring:
-  webflux:
-    base-path: /loadbalancer-it
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/it/Fabric8ClientLoadbalancerIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/it/Fabric8ClientLoadbalancerIT.java
deleted file mode 100644
index 0c0ce855d1..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/it/Fabric8ClientLoadbalancerIT.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.kubernetes.client.loadbalancer.it;
-
-import java.io.InputStream;
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-import io.fabric8.kubernetes.api.model.EnvVar;
-import io.fabric8.kubernetes.api.model.EnvVarBuilder;
-import io.fabric8.kubernetes.api.model.Service;
-import io.fabric8.kubernetes.api.model.apps.Deployment;
-import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
-import io.fabric8.kubernetes.client.KubernetesClient;
-import io.fabric8.kubernetes.client.utils.Serialization;
-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.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.testcontainers.k3s.K3sContainer;
-import reactor.netty.http.client.HttpClient;
-import reactor.util.retry.Retry;
-import reactor.util.retry.RetryBackoffSpec;
-
-import org.springframework.cloud.kubernetes.integration.tests.commons.Commons;
-import org.springframework.cloud.kubernetes.integration.tests.commons.Phase;
-import org.springframework.cloud.kubernetes.integration.tests.commons.fabric8_client.Util;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.client.reactive.ReactorClientHttpConnector;
-import org.springframework.web.reactive.function.client.WebClient;
-
-/**
- * @author wind57
- */
-public class Fabric8ClientLoadbalancerIT {
-
-	private static final String NAMESPACE = "default";
-
-	private static final String IMAGE_NAME = "spring-cloud-kubernetes-fabric8-client-loadbalancer";
-
-	private static KubernetesClient client;
-
-	private static Util util;
-
-	private static final K3sContainer K3S = Commons.container();
-
-	@BeforeAll
-	static void beforeAll() throws Exception {
-		K3S.start();
-		Commons.validateImage(IMAGE_NAME, K3S);
-		Commons.loadSpringCloudKubernetesImage(IMAGE_NAME, K3S);
-
-		util = new Util(K3S);
-		client = util.client();
-		util.setUp(NAMESPACE);
-	}
-
-	@AfterAll
-	static void afterAll() throws Exception {
-		Commons.cleanUp(IMAGE_NAME, K3S);
-		Commons.systemPrune();
-	}
-
-	@BeforeEach
-	void beforeEach() {
-		util.wiremock(NAMESPACE, "/", Phase.CREATE, false);
-	}
-
-	@AfterEach
-	void afterEach() {
-		util.wiremock(NAMESPACE, "/", Phase.DELETE, false);
-	}
-
-	@Test
-	void testLoadBalancerServiceMode() {
-
-		manifests("SERVICE", Phase.CREATE);
-
-		WebClient client = builder().baseUrl("http://localhost/loadbalancer-it/servicea").build();
-
-		@SuppressWarnings("unchecked")
-		Map mapResult = (Map) client.method(HttpMethod.GET).retrieve()
-				.bodyToMono(Map.class).retryWhen(retrySpec()).block();
-
-		Assertions.assertTrue(mapResult.containsKey("mappings"));
-		Assertions.assertTrue(mapResult.containsKey("meta"));
-
-		manifests("SERVICE", Phase.DELETE);
-
-	}
-
-	@Test
-	public void testLoadBalancerPodMode() {
-
-		manifests("POD", Phase.CREATE);
-
-		WebClient client = builder().baseUrl("http://localhost/loadbalancer-it/servicea").build();
-
-		@SuppressWarnings("unchecked")
-		Map mapResult = (Map) client.method(HttpMethod.GET).retrieve()
-				.bodyToMono(Map.class).retryWhen(retrySpec()).block();
-
-		Assertions.assertTrue(mapResult.containsKey("mappings"));
-		Assertions.assertTrue(mapResult.containsKey("meta"));
-
-		manifests("SERVICE", Phase.DELETE);
-
-	}
-
-	private static void manifests(String type, Phase phase) {
-
-		InputStream deploymentStream = util
-				.inputStream("spring-cloud-kubernetes-fabric8-client-loadbalancer-deployment.yaml");
-		InputStream serviceStream = util
-				.inputStream("spring-cloud-kubernetes-fabric8-client-loadbalancer-service.yaml");
-		InputStream ingressStream = util
-				.inputStream("spring-cloud-kubernetes-fabric8-client-loadbalancer-ingress.yaml");
-
-		Deployment deployment = Serialization.unmarshal(deploymentStream, Deployment.class);
-		List envVars = new ArrayList<>(
-				deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getEnv());
-		EnvVar activeProfileProperty = new EnvVarBuilder().withName("SPRING_CLOUD_KUBERNETES_LOADBALANCER_MODE")
-				.withValue(type).build();
-		envVars.add(activeProfileProperty);
-		deployment.getSpec().getTemplate().getSpec().getContainers().get(0).setEnv(envVars);
-
-		Service service = Serialization.unmarshal(serviceStream, Service.class);
-		Ingress ingress = Serialization.unmarshal(ingressStream, Ingress.class);
-
-		if (phase.equals(Phase.CREATE)) {
-			util.createAndWait(NAMESPACE, null, deployment, service, ingress, true);
-		}
-		else {
-			util.deleteAndWait(NAMESPACE, deployment, service, ingress);
-		}
-
-	}
-
-	private WebClient.Builder builder() {
-		return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create()));
-	}
-
-	private RetryBackoffSpec retrySpec() {
-		return Retry.fixedDelay(15, Duration.ofSeconds(1)).filter(Objects::nonNull);
-	}
-
-}
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/logback-test.xml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/logback-test.xml
deleted file mode 100644
index ee24334373..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/logback-test.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-	
-		
-			%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
-		
-	
-
-	
-		
-	
-
-	
-	
-	
-
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-deployment.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-deployment.yaml
deleted file mode 100644
index ab0e659db1..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-deployment.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: spring-cloud-kubernetes-fabric8-client-loadbalancer-deployment
-spec:
-  selector:
-    matchLabels:
-      app: spring-cloud-kubernetes-fabric8-client-loadbalancer
-  template:
-    metadata:
-      labels:
-        app: spring-cloud-kubernetes-fabric8-client-loadbalancer
-    spec:
-      serviceAccountName: spring-cloud-kubernetes-serviceaccount
-      containers:
-        - name: spring-cloud-kubernetes-fabric8-client-loadbalancer
-          image: docker.io/springcloud/spring-cloud-kubernetes-fabric8-client-loadbalancer
-          imagePullPolicy: IfNotPresent
-          readinessProbe:
-            httpGet:
-              port: 8080
-              path: /loadbalancer-it/actuator/health/readiness
-          livenessProbe:
-            httpGet:
-              port: 8080
-              path: /loadbalancer-it/actuator/health/liveness
-          ports:
-            - containerPort: 8080
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-ingress.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-ingress.yaml
deleted file mode 100644
index 17aafe66ed..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-ingress.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: it-ingress
-  namespace: default
-spec:
-  rules:
-    - http:
-        paths:
-          - path: /loadbalancer-it
-            pathType: Prefix
-            backend:
-              service:
-                name: spring-cloud-kubernetes-fabric8-client-loadbalancer
-                port:
-                  number: 8080
-
-
-
diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-service.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-service.yaml
deleted file mode 100644
index 1ae3abc6ee..0000000000
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-loadbalancer/src/test/resources/spring-cloud-kubernetes-fabric8-client-loadbalancer-service.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    app: spring-cloud-kubernetes-fabric8-client-loadbalancer
-  name: spring-cloud-kubernetes-fabric8-client-loadbalancer
-spec:
-  ports:
-    - name: http
-      port: 8080
-      targetPort: 8080
-  selector:
-    app: spring-cloud-kubernetes-fabric8-client-loadbalancer
-  type: ClusterIP

From e0665582b8ea7f45cdb7d096cb3122b13deb8e65 Mon Sep 17 00:00:00 2001
From: wind57 
Date: Sat, 7 Oct 2023 22:56:50 +0300
Subject: [PATCH 26/26] fix test

---
 .../cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java
index 7a29db85f1..8e5a27522a 100644
--- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java
+++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-fabric8-client-reload/src/test/java/org/springframework/cloud/kubernetes/fabric8/reload/Fabric8EventReloadIT.java
@@ -304,13 +304,13 @@ void testDataChangesInConfigMap() {
 
 	void testConfigMapMountPollingReload() {
 		TestUtil.reCreateSources(util, client);
-		TestUtil.patchSix(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE);
+		TestUtil.patchFive(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE);
 		ConfigMapMountPollingReloadDelegate.testConfigMapMountPollingReload(client, util, K3S, IMAGE_NAME);
 	}
 
 	void testPollingReloadConfigMapWithBootstrap() {
 		TestUtil.reCreateSources(util, client);
-		TestUtil.patchSeven(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE);
+		TestUtil.patchSix(util, DOCKER_IMAGE, IMAGE_NAME, NAMESPACE);
 		BootstrapEnabledPollingReloadConfigMapMountDelegate.testPollingReloadConfigMapWithBootstrap(client, util, K3S,
 				IMAGE_NAME);
 	}