Merge branch '3.1.x'

This commit is contained in:
Ryan Baxter
2024-11-06 10:29:53 -05:00
10 changed files with 55 additions and 34 deletions

View File

@@ -147,7 +147,7 @@ public final class KubernetesClientConfigUtils {
private static List<StrippedSourceContainer> strippedSecrets(CoreV1Api coreV1Api, String namespace) {
List<StrippedSourceContainer> strippedSecrets = KubernetesClientSecretsCache.byNamespace(coreV1Api, namespace);
if (strippedSecrets.isEmpty()) {
LOG.debug("No configmaps in namespace '" + namespace + "'");
LOG.debug("No secrets in namespace '" + namespace + "'");
}
return strippedSecrets;
}

View File

@@ -82,7 +82,11 @@ public abstract class ConfigMapPropertySourceLocator implements PropertySourceLo
if (this.properties.enableApi()) {
Set<NormalizedSource> 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);

View File

@@ -210,7 +210,7 @@ public final class ConfigUtils {
sourceNames.forEach(sourceName -> {
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<String, String> rawData = stripped.data();
@@ -229,6 +229,9 @@ public final class ConfigUtils {
environment, includeDefaultProfileData));
}
}
else {
LOG.warn("sourceName : " + sourceName + " was requested, but not found in namespace : " + namespace);
}
});
return new MultipleSourcesContainer(foundSourceNames, data);

View File

@@ -45,8 +45,7 @@ public abstract class LabeledSourceData {
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()

View File

@@ -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 @@ import static org.springframework.cloud.kubernetes.commons.config.Constants.PROP
*/
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 abstract class NamedSourceData {
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) {

View File

@@ -42,6 +42,7 @@ import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
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 abstract class SecretsPropertySourceLocator implements PropertySourceLoca
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();

View File

@@ -16,7 +16,6 @@
package org.springframework.cloud.kubernetes.commons.config;
import java.util.Collections;
import java.util.Map;
/**
@@ -25,10 +24,10 @@ import java.util.Map;
*
* @author wind57
*/
public final record SourceData(String sourceName, Map<String, Object> sourceData) {
public record SourceData(String sourceName, Map<String, Object> sourceData) {
public static SourceData emptyRecord(String sourceName) {
return new SourceData(sourceName, Collections.emptyMap());
return new SourceData(sourceName, Map.of());
}
}

View File

@@ -48,7 +48,7 @@ public class SourceDataEntriesProcessor extends MapPropertySource {
private static final Log LOG = LogFactory.getLog(SourceDataEntriesProcessor.class);
private static Predicate<String> ENDS_IN_EXTENSION = x -> x.endsWith(".yml") || x.endsWith(".yaml")
private static final Predicate<String> ENDS_IN_EXTENSION = x -> x.endsWith(".yml") || x.endsWith(".yaml")
|| x.endsWith(".properties");
public SourceDataEntriesProcessor(SourceData sourceData) {

View File

@@ -141,25 +141,25 @@ public final class ConfigReloadUtil {
return result;
}
static boolean changed(List<? extends MapPropertySource> left, List<? extends MapPropertySource> right) {
if (left.size() != right.size()) {
static boolean changed(List<? extends MapPropertySource> k8sSources, List<? extends MapPropertySource> 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 @@ public final class ConfigReloadUtil {
/**
* Determines if two property sources are different.
* @param left left map property sources
* @param right right map property sources
* @param k8sSource left map property sources
* @param appSource right map property sources
* @return {@code true} if source has changed
*/
static boolean changed(MapPropertySource left, MapPropertySource right) {
if (left == right) {
static boolean changed(MapPropertySource k8sSource, MapPropertySource appSource) {
if (k8sSource == appSource) {
return false;
}
if (left == null || right == null) {
if (k8sSource == null || appSource == null) {
return true;
}
Map<String, Object> leftMap = left.getSource();
Map<String, Object> rightMap = right.getSource();
return !Objects.equals(leftMap, rightMap);
Map<String, Object> k8sMap = k8sSource.getSource();
Map<String, Object> appMap = appSource.getSource();
return !Objects.equals(k8sMap, appMap);
}
}

View File

@@ -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