Updated Branches: refs/heads/trunk 38cd87d82 -> fdfe81086
AMBARI-4490. If Ganglia is not installed, server logs hundreds of error messages. (Dmytro Shkvyra via mahadev) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/fdfe8108 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/fdfe8108 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/fdfe8108 Branch: refs/heads/trunk Commit: fdfe81086b2a46d0977b77b0b94447f7261f1aff Parents: 38cd87d Author: Mahadev Konar <[email protected]> Authored: Thu Feb 13 12:54:27 2014 -0800 Committer: Mahadev Konar <[email protected]> Committed: Thu Feb 13 12:54:37 2014 -0800 ---------------------------------------------------------------------- .../internal/AbstractProviderModule.java | 55 +++++++++++++++++++- .../internal/JMXHostProviderTest.java | 3 +- 2 files changed, 55 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/fdfe8108/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java index f39893c..3053998 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java @@ -233,6 +233,41 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource return clusterJmxPorts.get(componentName); } + /**Post process property value. If value has one ore some substrings + * started with "${" and ended with "}" these substrings will replace + * with properties from current propertiesMap. It is doing recursively. + * @param key - properties name + * @param value - properties value + * @param properties - map with properties + */ + private String postProcessPropertyValue(String key, String value, Map<String, String> properties, Set<String> prevProps) { + if (value != null && key != null && value.contains("${")){ + if (prevProps == null) prevProps = new HashSet<String>(); + if (prevProps.contains(key)){ + return value; + } + prevProps.add(key); + String refValueString = value; + Map<String, String> refMap = new HashMap<String, String>(); + while(refValueString.contains("${")) { + int startValueRef = refValueString.indexOf("${") + 2; + int endValueRef = refValueString.indexOf("}"); + String valueRef = refValueString.substring(startValueRef, endValueRef); + refValueString = refValueString.substring(endValueRef+1); + String trueValue = (String) postProcessPropertyValue(valueRef, properties.get(valueRef), properties, prevProps); + if (trueValue != null){ + refMap.put("${"+valueRef+"}", trueValue); + } + } + for (String keyRef : refMap.keySet()){ + refValueString = refMap.get(keyRef); + value = ((String)value).replace(keyRef, refValueString); + } + properties.put(key, value); + } + return value; + } + // ----- GangliaHostProvider ----------------------------------------------- @Override @@ -581,12 +616,28 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource Map<String, String> mConfigs = new HashMap<String, String>(); if (configResources != null) { for (Resource res : configResources) { + Map<String, String> evalutedProperties = null; for (String key : keys.keySet()) { String value = (String) res.getPropertyValue (PropertyHelper.getPropertyId(PROPERTIES_CATEGORY, keys.get(key))); + if (value != null && value.contains("${")) + if (evalutedProperties == null){ + evalutedProperties = new HashMap<String, String>(); + Map<String, Object> properties = res.getPropertiesMap().get(PROPERTIES_CATEGORY); + for (Map.Entry<String, Object> entry : properties.entrySet()) { + String keyString = entry.getKey(); + Object object = entry.getValue(); + String valueString; + if (object != null && object instanceof String){ + valueString = (String)object; + evalutedProperties.put(keyString, valueString); + postProcessPropertyValue(keyString, valueString, evalutedProperties, null); + } + } + } + value = postProcessPropertyValue(keys.get(key), value, evalutedProperties, null); LOG.debug("PROPERTY -> key: " + keys.get(key) + ", " + - "value: " + value); - + "value: " + value); mConfigs.put(key, value); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/fdfe8108/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java index 1a1bad6..0b5f660 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java @@ -151,8 +151,9 @@ public class JMXHostProviderTest { // Create configs Map<String, String> configs = new HashMap<String, String>(); - configs.put(NAMENODE_PORT, "localhost:70070"); + configs.put(NAMENODE_PORT, "localhost:${ambari.dfs.datanode.http.port}"); configs.put(DATANODE_PORT, "localhost:70075"); + configs.put("ambari.dfs.datanode.http.port", "70070"); ConfigurationRequest cr = new ConfigurationRequest(clusterName, "hdfs-site", "version1", configs); controller.createConfiguration(cr);
