From 6350a0b2f4fa8bfe036b2e4f60272532725d1797 Mon Sep 17 00:00:00 2001 From: erabii Date: Tue, 27 Jul 2021 11:02:55 -0400 Subject: [PATCH] Config map func improvements 2 (#835) * some refactor * some change in k8s-client * trigger * re-trigger * lazy compute sources * re-trigger * re-trigger again * more changes * more polishing * checkstyle * remove unused method * trigger * minor logging improvements * trigger --- .../config/ConfigMapConfigProperties.java | 11 +++++-- .../config/ConfigMapPropertySource.java | 13 ++------ .../ConfigMapPropertySourceLocator.java | 1 + .../Fabric8ConfigMapPropertySource.java | 30 +++++-------------- .../fabric8/config/Fabric8ConfigUtils.java | 26 ++++++++++++---- 5 files changed, 41 insertions(+), 40 deletions(-) diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigProperties.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigProperties.java index fed95bfa..29577822 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigProperties.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigProperties.java @@ -62,12 +62,12 @@ public class ConfigMapConfigProperties extends AbstractConfigProperties { } /** - * @return A list of Source to use If the user has not specified any Source + * @return A list of Source to use. If the user has not specified any Source * properties, then a single Source is constructed based on the supplied name and - * namespace + * namespace. * * These are the actual name/namespace pairs that are used to create a - * ConfigMapPropertySource + * ConfigMapPropertySource. */ public List determineSources() { if (this.sources.isEmpty()) { @@ -153,6 +153,11 @@ public class ConfigMapConfigProperties extends AbstractConfigProperties { return this.namespace; } + @Override + public String toString() { + return "{ config-map name : '" + name + "', namespace : '" + namespace + "' }"; + } + } } diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySource.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySource.java index 878aa2a6..55d7eff0 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySource.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySource.java @@ -27,7 +27,6 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.env.Environment; import org.springframework.core.env.MapPropertySource; -import org.springframework.core.env.StandardEnvironment; import static org.springframework.cloud.kubernetes.commons.config.Constants.APPLICATION_PROPERTIES; import static org.springframework.cloud.kubernetes.commons.config.Constants.APPLICATION_YAML; @@ -54,14 +53,8 @@ public abstract class ConfigMapPropertySource extends MapPropertySource { super(name, source); } - protected static Environment createEnvironmentWithActiveProfiles(String[] activeProfiles) { - StandardEnvironment environment = new StandardEnvironment(); - environment.setActiveProfiles(activeProfiles); - return environment; - } - - protected static String getName(String name, String namespace) { - return PREFIX + PROPERTY_SOURCE_NAME_SEPARATOR + name + PROPERTY_SOURCE_NAME_SEPARATOR + namespace; + protected static String getName(String applicationName, String namespace) { + return PREFIX + PROPERTY_SOURCE_NAME_SEPARATOR + applicationName + PROPERTY_SOURCE_NAME_SEPARATOR + namespace; } protected static Map processAllEntries(Map input, Environment environment) { @@ -89,7 +82,7 @@ public abstract class ConfigMapPropertySource extends MapPropertySource { protected static Map defaultProcessAllEntries(Map input, Environment environment) { return input.entrySet().stream().map(e -> extractProperties(e.getKey(), e.getValue(), environment)) - .filter(m -> !m.isEmpty()).flatMap(m -> m.entrySet().stream()) + .flatMap(m -> m.entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, throwingMerger(), HashMap::new)); } 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 ec8f4dd9..99da08c2 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 @@ -68,6 +68,7 @@ public abstract class ConfigMapPropertySourceLocator implements PropertySourceLo CompositePropertySource composite = new CompositePropertySource("composite-configmap"); if (this.properties.isEnableApi()) { List sources = this.properties.determineSources(); + LOG.debug("Config Map normalized sources : " + sources); sources.forEach(s -> composite.addFirstPropertySource(getMapPropertySourceForSingleConfigMap(env, s))); } diff --git a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigMapPropertySource.java b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigMapPropertySource.java index 28842249..142009f2 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigMapPropertySource.java +++ b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigMapPropertySource.java @@ -20,7 +20,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.client.KubernetesClient; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -28,9 +27,9 @@ import org.apache.commons.logging.LogFactory; import org.springframework.cloud.kubernetes.commons.config.ConfigMapPropertySource; import org.springframework.core.env.Environment; import org.springframework.core.env.MapPropertySource; -import org.springframework.util.StringUtils; -import static org.springframework.cloud.kubernetes.fabric8.config.Fabric8ConfigUtils.getNamespace; +import static org.springframework.cloud.kubernetes.fabric8.config.Fabric8ConfigUtils.getApplicationNamespace; +import static org.springframework.cloud.kubernetes.fabric8.config.Fabric8ConfigUtils.getConfigMapData; /** * A {@link MapPropertySource} that uses Kubernetes config maps. @@ -49,34 +48,21 @@ public class Fabric8ConfigMapPropertySource extends ConfigMapPropertySource { public Fabric8ConfigMapPropertySource(KubernetesClient client, String applicationName, String namespace, Environment environment) { - super(getName(applicationName, getNamespace(client, namespace)), - getData(client, applicationName, getNamespace(client, namespace), environment)); + super(getName(applicationName, getApplicationNamespace(client, namespace)), + getData(client, applicationName, getApplicationNamespace(client, namespace), environment)); } private static Map getData(KubernetesClient client, String applicationName, String namespace, Environment environment) { try { - Map result = new HashMap<>(); - ConfigMap map = !StringUtils.hasLength(namespace) ? client.configMaps().withName(applicationName).get() - : client.configMaps().inNamespace(namespace).withName(applicationName).get(); - - if (map != null) { - result.putAll(processAllEntries(map.getData(), environment)); - } + Map data = getConfigMapData(client, namespace, applicationName); + Map result = new HashMap<>(processAllEntries(data, environment)); if (environment != null) { for (String activeProfile : environment.getActiveProfiles()) { - String mapNameWithProfile = applicationName + "-" + activeProfile; - - ConfigMap mapWithProfile = !StringUtils.hasLength(namespace) - ? client.configMaps().withName(mapNameWithProfile).get() - : client.configMaps().inNamespace(namespace).withName(mapNameWithProfile).get(); - - if (mapWithProfile != null) { - result.putAll(processAllEntries(mapWithProfile.getData(), environment)); - } - + Map dataWithProfile = getConfigMapData(client, namespace, mapNameWithProfile); + result.putAll(processAllEntries(dataWithProfile, environment)); } } diff --git a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigUtils.java b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigUtils.java index 384da72c..005ba697 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigUtils.java +++ b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigUtils.java @@ -16,6 +16,10 @@ package org.springframework.cloud.kubernetes.fabric8.config; +import java.util.Collections; +import java.util.Map; + +import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.client.KubernetesClient; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -34,19 +38,31 @@ public final class Fabric8ConfigUtils { private Fabric8ConfigUtils() { } - public static String getApplicationNamespace(KubernetesClient client, String configNamespace, + public static String getApplicationNamespace(KubernetesClient client, String namespace, String configurationTarget) { - if (!StringUtils.hasLength(configNamespace)) { + if (!StringUtils.hasLength(namespace)) { LOG.debug(configurationTarget + " namespace has not been set, taking it from client (ns=" + client.getNamespace() + ")"); - configNamespace = client.getNamespace(); + namespace = client.getNamespace(); } - return configNamespace; + return namespace; } - static String getNamespace(KubernetesClient client, String namespace) { + public static String getApplicationNamespace(KubernetesClient client, String namespace) { return !StringUtils.hasLength(namespace) ? client.getNamespace() : namespace; } + public static Map getConfigMapData(KubernetesClient client, String namespace, String name) { + ConfigMap configMap = !StringUtils.hasLength(namespace) ? client.configMaps().withName(name).get() + : client.configMaps().inNamespace(namespace).withName(name).get(); + + if (configMap == null) { + LOG.warn("config-map with name : '" + name + "' not present in namespace : '" + namespace + "'"); + return Collections.emptyMap(); + } + + return configMap.getData(); + } + }