From 888031daf759528bbcb8bf0e0a6cada4f2b25e28 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 16 Aug 2021 08:52:46 -0400 Subject: [PATCH] Reconnect Watch For ConfigMaps And Secrets (#842) * Add reconnect logic when watch is closed * Fix version numbers in deployment files --- .../k8s/deployment.yaml | 2 +- .../reload/EventBasedConfigMapChangeDetector.java | 11 ++++++++++- .../reload/EventBasedSecretsChangeDetector.java | 11 ++++++++++- .../k8s/deployment-it.yaml | 2 +- .../k8s/deployment-polling-it.yaml | 2 +- .../k8s/deployment-it.yaml | 2 +- .../k8s/deployment-it.yaml | 2 +- .../deployment-it.yaml | 2 +- .../k8s/deployment-it.yaml | 2 +- 9 files changed, 27 insertions(+), 9 deletions(-) diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/k8s/deployment.yaml b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/k8s/deployment.yaml index f7f78295..58c200f4 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/k8s/deployment.yaml +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/k8s/deployment.yaml @@ -60,7 +60,7 @@ items: serviceAccount: spring-cloud-kubernetes-configuration-watcher containers: - name: spring-cloud-kubernetes-configuration-watcher - image: springcloud/spring-cloud-kubernetes-configuration-watcher:2.0.3-SNAPSHOT + image: springcloud/spring-cloud-kubernetes-configuration-watcher:2.0.4-SNAPSHOT imagePullPolicy: IfNotPresent readinessProbe: httpGet: diff --git a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/reload/EventBasedConfigMapChangeDetector.java b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/reload/EventBasedConfigMapChangeDetector.java index 256d28cd..37db617a 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/reload/EventBasedConfigMapChangeDetector.java +++ b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/reload/EventBasedConfigMapChangeDetector.java @@ -16,13 +16,16 @@ package org.springframework.cloud.kubernetes.fabric8.config.reload; +import java.net.HttpURLConnection; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.Status; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientException; import io.fabric8.kubernetes.client.Watch; @@ -84,7 +87,13 @@ public class EventBasedConfigMapChangeDetector extends ConfigurationChangeDetect } @Override - public void onClose(KubernetesClientException e) { + public void onClose(KubernetesClientException exception) { + log.warn("ConfigMaps watch closed", exception); + Optional.ofNullable(exception).map(e -> { + log.debug("Exception received during watch", e); + return exception; + }).map(KubernetesClientException::getStatus).map(Status::getCode) + .filter(c -> c.equals(HttpURLConnection.HTTP_GONE)).ifPresent(c -> watch()); } })); activated = true; diff --git a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/reload/EventBasedSecretsChangeDetector.java b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/reload/EventBasedSecretsChangeDetector.java index e710c814..46590aa1 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/reload/EventBasedSecretsChangeDetector.java +++ b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/reload/EventBasedSecretsChangeDetector.java @@ -16,13 +16,16 @@ package org.springframework.cloud.kubernetes.fabric8.config.reload; +import java.net.HttpURLConnection; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.Status; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientException; import io.fabric8.kubernetes.client.Watch; @@ -85,7 +88,13 @@ public class EventBasedSecretsChangeDetector extends ConfigurationChangeDetector } @Override - public void onClose(KubernetesClientException e) { + public void onClose(KubernetesClientException exception) { + log.warn("Secrects watch closed", exception); + Optional.ofNullable(exception).map(e -> { + log.debug("Exception received during watch", e); + return exception; + }).map(KubernetesClientException::getStatus).map(Status::getCode) + .filter(c -> c.equals(HttpURLConnection.HTTP_GONE)).ifPresent(c -> watch()); } })); activated = true; diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-config-it/k8s/deployment-it.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-config-it/k8s/deployment-it.yaml index e8ad280f..bc0f0ba5 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-config-it/k8s/deployment-it.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-config-it/k8s/deployment-it.yaml @@ -19,7 +19,7 @@ spec: spec: serviceAccountName: spring-cloud-kubernetes-serviceaccount containers: - - image: springcloud/spring-cloud-kubernetes-client-config-it:2.0.3-SNAPSHOT + - image: springcloud/spring-cloud-kubernetes-client-config-it:2.0.4-SNAPSHOT imagePullPolicy: IfNotPresent name: spring-cloud-kubernetes-client-config-it resources: {} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-config-it/k8s/deployment-polling-it.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-config-it/k8s/deployment-polling-it.yaml index 45a11cee..b09b0ff9 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-config-it/k8s/deployment-polling-it.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-config-it/k8s/deployment-polling-it.yaml @@ -19,7 +19,7 @@ spec: spec: serviceAccountName: spring-cloud-kubernetes-serviceaccount containers: - - image: springcloud/spring-cloud-kubernetes-client-config-it:2.0.3-SNAPSHOT + - image: springcloud/spring-cloud-kubernetes-client-config-it:2.0.4-SNAPSHOT imagePullPolicy: IfNotPresent name: spring-cloud-kubernetes-client-config-it resources: {} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-loadbalancer-it/k8s/deployment-it.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-loadbalancer-it/k8s/deployment-it.yaml index 21a1b5b6..3e9121b9 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-loadbalancer-it/k8s/deployment-it.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-loadbalancer-it/k8s/deployment-it.yaml @@ -19,7 +19,7 @@ spec: spec: serviceAccountName: spring-cloud-kubernetes-serviceaccount containers: - - image: springcloud/spring-cloud-kubernetes-client-loadbalancer-it:2.0.3-SNAPSHOT + - image: springcloud/spring-cloud-kubernetes-client-loadbalancer-it:2.0.4-SNAPSHOT imagePullPolicy: IfNotPresent name: spring-cloud-kubernetes-client-loadbalancer-it resources: {} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-reactive-discovery-client-it/k8s/deployment-it.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-reactive-discovery-client-it/k8s/deployment-it.yaml index c9304b40..6d6598e5 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-reactive-discovery-client-it/k8s/deployment-it.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-client-reactive-discovery-client-it/k8s/deployment-it.yaml @@ -19,7 +19,7 @@ spec: spec: serviceAccountName: spring-cloud-kubernetes-serviceaccount containers: - - image: springcloud/spring-cloud-kubernetes-client-reactive-discovery-it:2.0.3-SNAPSHOT + - image: springcloud/spring-cloud-kubernetes-client-reactive-discovery-it:2.0.4-SNAPSHOT imagePullPolicy: IfNotPresent name: spring-cloud-kubernetes-client-reactive-discovery-it resources: {} diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-configuration-watcher-it/deployment-it.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-configuration-watcher-it/deployment-it.yaml index aa6187b6..b7504113 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-configuration-watcher-it/deployment-it.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-configuration-watcher-it/deployment-it.yaml @@ -18,7 +18,7 @@ spec: app: k8s-demo-app spec: containers: - - image: docker.io/springcloud/spring-cloud-kubernetes-configuration-watcher-it:2.0.3-SNAPSHOT + - image: docker.io/springcloud/spring-cloud-kubernetes-configuration-watcher-it:2.0.4-SNAPSHOT name: spring-cloud-kubernetes-configuration-watcher-it resources: {} env: diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-core-k8s-client-it/k8s/deployment-it.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-core-k8s-client-it/k8s/deployment-it.yaml index a8cca50e..4467aed0 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-core-k8s-client-it/k8s/deployment-it.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-core-k8s-client-it/k8s/deployment-it.yaml @@ -19,7 +19,7 @@ spec: spec: serviceAccountName: spring-cloud-kubernetes-serviceaccount containers: - - image: springcloud/spring-cloud-kubernetes-core-k8s-client-it:2.0.3-SNAPSHOT + - image: springcloud/spring-cloud-kubernetes-core-k8s-client-it:2.0.4-SNAPSHOT imagePullPolicy: IfNotPresent name: spring-cloud-kubernetes-core-k8s-client-it resources: {}