Merge branch '3.1.x'
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user