diff --git a/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigUtils.java b/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigUtils.java index 21bc92b9ee..f4be4ef88e 100644 --- a/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigUtils.java +++ b/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigUtils.java @@ -147,7 +147,7 @@ private static List strippedConfigMaps(CoreV1Api coreV1 private static List strippedSecrets(CoreV1Api coreV1Api, String namespace) { List strippedSecrets = KubernetesClientSecretsCache.byNamespace(coreV1Api, namespace); if (strippedSecrets.isEmpty()) { - LOG.debug("No configmaps in namespace '" + namespace + "'"); + LOG.debug("No secrets in namespace '" + namespace + "'"); } return strippedSecrets; } diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySourceLocator.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySourceLocator.java index 7c2688472b..f299629309 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySourceLocator.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySourceLocator.java @@ -82,7 +82,11 @@ public PropertySource locate(Environment environment) { if (this.properties.enableApi()) { Set sources = new LinkedHashSet<>(this.properties.determineSources(environment)); LOG.debug("Config Map normalized sources : " + sources); - sources.forEach(s -> composite.addFirstPropertySource(getMapPropertySource(s, env))); + sources.forEach(s -> { + MapPropertySource propertySource = getMapPropertySource(s, env); + LOG.debug("Adding config map property source " + propertySource.getName()); + composite.addFirstPropertySource(propertySource); + }); } addPropertySourcesFromPaths(environment, composite); diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigUtils.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigUtils.java index ed5f889e8f..886e9e7b2f 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigUtils.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigUtils.java @@ -210,7 +210,7 @@ public static MultipleSourcesContainer processNamedData(List { StrippedSourceContainer stripped = hashByName.get(sourceName); if (stripped != null) { - LOG.debug("Found source with name : '" + sourceName + " in namespace: '" + namespace + "'"); + LOG.debug("Found source with name : '" + sourceName + "' in namespace: '" + namespace + "'"); foundSourceNames.add(sourceName); // see if data is a single yaml/properties file and if it needs decoding Map rawData = stripped.data(); @@ -229,6 +229,9 @@ public static MultipleSourcesContainer processNamedData(List labels, ConfigUtils.Prefix p data = dataSupplier(labels, profiles); // need this check because when there is no data, the name of the property - // source - // is using provided labels, + // source is using provided labels, // unlike when the data is present: when we use secret names if (data.names().isEmpty()) { String names = labels.keySet() diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/NamedSourceData.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/NamedSourceData.java index f98464650c..c198e43316 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/NamedSourceData.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/NamedSourceData.java @@ -17,9 +17,11 @@ package org.springframework.cloud.kubernetes.commons.config; import java.util.LinkedHashSet; -import java.util.Map; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import static org.springframework.cloud.kubernetes.commons.config.ConfigUtils.onException; import static org.springframework.cloud.kubernetes.commons.config.Constants.PROPERTY_SOURCE_NAME_SEPARATOR; @@ -31,6 +33,8 @@ */ public abstract class NamedSourceData { + private static final Log LOG = LogFactory.getLog(NamedSourceData.class); + public final SourceData compute(String sourceName, ConfigUtils.Prefix prefix, String target, boolean profileSources, boolean failFast, String namespace, String[] activeProfiles) { @@ -51,7 +55,9 @@ public final SourceData compute(String sourceName, ConfigUtils.Prefix prefix, St data = dataSupplier(sourceNames); if (data.names().isEmpty()) { - return new SourceData(ConfigUtils.sourceName(target, sourceName, namespace), Map.of()); + String emptySourceName = ConfigUtils.sourceName(target, sourceName, namespace); + LOG.debug("Will return empty source with name : " + emptySourceName); + return SourceData.emptyRecord(emptySourceName); } if (prefix != ConfigUtils.Prefix.DEFAULT) { diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsPropertySourceLocator.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsPropertySourceLocator.java index ca954a6ef0..f35e40e0e6 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsPropertySourceLocator.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsPropertySourceLocator.java @@ -42,6 +42,7 @@ import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; +import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.PropertySource; /** @@ -87,8 +88,11 @@ public PropertySource locate(Environment environment) { putPathConfig(composite); if (this.properties.enableApi()) { - uniqueSources - .forEach(s -> composite.addPropertySource(getSecretsPropertySourceForSingleSecret(env, s))); + uniqueSources.forEach(s -> { + MapPropertySource propertySource = getSecretsPropertySourceForSingleSecret(env, s); + LOG.debug("Adding secret property source " + propertySource.getName()); + composite.addFirstPropertySource(propertySource); + }); } cache.discardAll(); diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SourceData.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SourceData.java index 29b4280e22..b9eb46c0b2 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SourceData.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SourceData.java @@ -16,7 +16,6 @@ package org.springframework.cloud.kubernetes.commons.config; -import java.util.Collections; import java.util.Map; /** @@ -25,10 +24,10 @@ * * @author wind57 */ -public final record SourceData(String sourceName, Map sourceData) { +public record SourceData(String sourceName, Map sourceData) { public static SourceData emptyRecord(String sourceName) { - return new SourceData(sourceName, Collections.emptyMap()); + return new SourceData(sourceName, Map.of()); } } diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SourceDataEntriesProcessor.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SourceDataEntriesProcessor.java index 7e313b70d1..5f51e9700d 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SourceDataEntriesProcessor.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SourceDataEntriesProcessor.java @@ -48,7 +48,7 @@ public class SourceDataEntriesProcessor extends MapPropertySource { private static final Log LOG = LogFactory.getLog(SourceDataEntriesProcessor.class); - private static Predicate ENDS_IN_EXTENSION = x -> x.endsWith(".yml") || x.endsWith(".yaml") + private static final Predicate ENDS_IN_EXTENSION = x -> x.endsWith(".yml") || x.endsWith(".yaml") || x.endsWith(".properties"); public SourceDataEntriesProcessor(SourceData sourceData) { diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/reload/ConfigReloadUtil.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/reload/ConfigReloadUtil.java index 9044815080..c0be3d8caf 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/reload/ConfigReloadUtil.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/reload/ConfigReloadUtil.java @@ -141,25 +141,25 @@ else if (propertySource instanceof CompositePropertySource source) { return result; } - static boolean changed(List left, List right) { - if (left.size() != right.size()) { + static boolean changed(List k8sSources, List appSources) { + if (k8sSources.size() != appSources.size()) { if (LOG.isDebugEnabled()) { - LOG.debug("left size: " + left.size()); - left.forEach(item -> LOG.debug(item.toString())); + LOG.debug("k8s property sources size: " + k8sSources.size()); + k8sSources.forEach(item -> LOG.debug(item.toString())); - LOG.debug("right size: " + right.size()); - right.forEach(item -> LOG.debug(item.toString())); + LOG.debug("app property sources size size: " + appSources.size()); + appSources.forEach(item -> LOG.debug(item.toString())); } - LOG.warn(() -> "The current number of ConfigMap PropertySources does not match " + LOG.warn(() -> "The current number of PropertySources does not match " + "the ones loaded from Kubernetes - No reload will take place"); return false; } - for (int i = 0; i < left.size(); i++) { - MapPropertySource leftPropertySource = left.get(i); - MapPropertySource rightPropertySource = right.get(i); - if (changed(leftPropertySource, rightPropertySource)) { - LOG.debug(() -> "found change in : " + leftPropertySource); + for (int i = 0; i < k8sSources.size(); i++) { + MapPropertySource k8sSource = k8sSources.get(i); + MapPropertySource appSource = appSources.get(i); + if (changed(k8sSource, appSource)) { + LOG.debug(() -> "found change in : " + k8sSource); return true; } } @@ -169,20 +169,20 @@ static boolean changed(List left, List leftMap = left.getSource(); - Map rightMap = right.getSource(); - return !Objects.equals(leftMap, rightMap); + Map k8sMap = k8sSource.getSource(); + Map appMap = appSource.getSource(); + return !Objects.equals(k8sMap, appMap); } } diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-reload/src/main/resources/application-with-secret.yaml b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-reload/src/main/resources/application-with-secret.yaml index fb84489801..2208fa1ad3 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-reload/src/main/resources/application-with-secret.yaml +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-reload/src/main/resources/application-with-secret.yaml @@ -1,6 +1,9 @@ logging: level: - root: DEBUG + org: + springframework: + cloud: + kubernetes: debug spring: application: @@ -18,3 +21,6 @@ spring: secrets: enabled: true enable-api: true + + config: + enabled: false