You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ad...@apache.org on 2017/11/24 12:40:15 UTC

[33/39] ambari git commit: AMBARI-22325 Support for attributes in configuration (benyoka)

AMBARI-22325 Support for attributes in configuration (benyoka)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a4c9e6b3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a4c9e6b3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a4c9e6b3

Branch: refs/heads/branch-feature-AMBARI-14714-blueprintv2
Commit: a4c9e6b3e3075745744f43bbecb581c3b30125d4
Parents: d9a4cab
Author: Balazs Bence Sari <be...@apache.org>
Authored: Tue Nov 21 23:05:57 2017 +0100
Committer: Doroszlai, Attila <ad...@hortonworks.com>
Committed: Fri Nov 24 13:30:46 2017 +0100

----------------------------------------------------------------------
 .../ambari/server/topology/Configurable.java    |  40 +++++--
 .../server/topology/ConfigurableTest.java       | 120 +++++++++++++++++++
 2 files changed, 150 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a4c9e6b3/ambari-server/src/main/java/org/apache/ambari/server/topology/Configurable.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/Configurable.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/Configurable.java
index af91e40..dca16e0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/Configurable.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/Configurable.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.topology;
 
-import static java.util.Collections.singletonMap;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
 
@@ -26,34 +25,55 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 
 public interface Configurable {
   void setConfiguration(Configuration configuration);
   Configuration getConfiguration();
 
   @JsonProperty("configurations")
-  default void setConfigs(Collection<Map<String, Map<String, Map<String, String>>>> configs) {
+  default void setConfigs(Collection<Map<String, Map<String, Map<String, ? extends Object>>>> configs) {
     if (null != configs) {
       Map<String, Map<String, String>> allProps = configs.stream().
         filter(map -> map != null && !map.isEmpty() && map.values().iterator().next().get(Configuration.PROPERTIES_KEY) != null).
         collect(toMap(
           config -> config.keySet().iterator().next(),
-          config -> config.values().iterator().next().get(Configuration.PROPERTIES_KEY)
+          config -> (Map<String, String>)config.values().iterator().next().get(Configuration.PROPERTIES_KEY)
         ));
-      setConfiguration(new Configuration(allProps, new HashMap<>()));
+      Map<String, Map<String, Map<String, String>>> allAttributes = configs.stream().
+        filter(map -> map != null && !map.isEmpty() && map.values().iterator().next().get(Configuration.ATTRIBUTES_KEY) != null).
+        collect(toMap(
+          config -> config.keySet().iterator().next(),
+          config -> (Map<String, Map<String, String>>)
+            config.values().iterator().next().get(Configuration.ATTRIBUTES_KEY)
+        ));
+      setConfiguration(new Configuration(allProps, allAttributes));
     }
   }
 
   @JsonProperty("configurations")
-  default Collection<Map<String, Map<String, Map<String, String>>>> getConfigs() {
+  default Collection<Map<String, Map<String, Map<String, ? extends Object>>>> getConfigs() {
     Configuration config = getConfiguration();
-    return config != null
-      ? config.getProperties().entrySet().stream()
-        .map(e -> singletonMap(e.getKey(), singletonMap(Configuration.PROPERTIES_KEY, e.getValue())))
-        .collect(toList())
-      : Collections.emptyList();
+    if (config != null) {
+      Set<String> keys = Sets.union(config.getProperties().keySet(), config.getAttributes().keySet());
+      return keys.stream().map(key -> {
+        Map<String, Map<String, ? extends Object>> map = new HashMap<>(2);
+        if (config.getProperties().containsKey(key)) {
+          map.put(Configuration.PROPERTIES_KEY, config.getProperties().get(key));
+        }
+        if (config.getAttributes().containsKey(key)) {
+          map.put(Configuration.ATTRIBUTES_KEY, config.getAttributes().get(key));
+        }
+        return ImmutableMap.of(key, map);
+      }).collect(toList());
+    }
+    else {
+      return Collections.emptyList();
+    }
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4c9e6b3/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigurableTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigurableTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigurableTest.java
new file mode 100644
index 0000000..2c74dc5
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ConfigurableTest.java
@@ -0,0 +1,120 @@
+package org.apache.ambari.server.topology;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableMap;
+
+public class ConfigurableTest {
+  public static final String CONFIG_JSON;
+  // TODO: This crazy initialization is needed to work around a suspected Eclipse java compiler bug.
+  //       It will be removed once unit test compilation will have been fixed and IDE will be able to use javac.
+  static {
+    String str1 =
+      "[" +
+        "  {" +
+        "    'hdfs-site': {" +
+        "      'properties': {" +
+        "        'dfs.block.access.token.enable': 'true'," +
+        "        'dfs.blocksize': '134217728'" +
+        "      }," +
+        "      'properties_attributes': {" +
+        "        'final': {" +
+        "          'fs.webhdfs.enabled': 'true'," +
+        "          'dfs.namenode.http-address': 'true'" +
+        "        }" +
+        "      }" +
+        "    }" +
+        "  }," +
+        "  {" +
+        "    'core-site': {" +
+        "      'properties': {" +
+        "        'fs.defaultFS': 'hdfs://mycluster'," +
+        "        'fs.trash.interval': '360'" +
+        "      }," +
+        "      'properties_attributes': {" +
+        "        'final': {" +
+        "          'fs.defaultFS': 'true'" +
+        "        }" +
+        "      }" +
+        "    }" +
+        "  }" +
+        "]";
+    String str2 = str1.replace('\'', '"');
+    CONFIG_JSON = str2;
+  }
+
+  private List<Map<String, Map<String, Map<String, ? extends Object>>>> rawConfig;
+  private Map<String, Map<String, String>> expectedProperties;
+  private Map<String, Map<String, Map<String, String>>>expectedAttributes;
+  private SimpleConfigurable configurable;
+
+  @Before
+  public void setUp() throws Exception {
+    // TODO: Remove this check of static field initialization correctness once IDE can use javac
+    assertEquals(CONFIG_JSON.replace('\'', '"'), CONFIG_JSON);
+
+    configurable = new SimpleConfigurable();
+    rawConfig = new ObjectMapper().readValue(CONFIG_JSON,
+      new TypeReference<List<Map<String, Map<String, Map<String, ? extends Object>>>>>() {});
+
+    expectedProperties = ImmutableMap.of(
+      "hdfs-site", ImmutableMap.of(
+        "dfs.block.access.token.enable", "true",
+        "dfs.blocksize", "134217728"
+      ),
+      "core-site", ImmutableMap.of(
+        "fs.defaultFS", "hdfs://mycluster",
+        "fs.trash.interval", "360"
+      )
+    );
+
+    expectedAttributes = ImmutableMap.of(
+      "hdfs-site", ImmutableMap.of(
+        "final", ImmutableMap.of(
+          "fs.webhdfs.enabled", "true",
+          "dfs.namenode.http-address", "true"
+        )
+      ),
+      "core-site", ImmutableMap.of(
+        "final", ImmutableMap.of("fs.defaultFS", "true")
+      )
+    );
+  }
+
+  @Test
+  public void setConfigs() throws Exception {
+    configurable.setConfigs(rawConfig);
+    assertEquals(expectedProperties, configurable.getConfiguration().getProperties());
+    assertEquals(expectedAttributes, configurable.getConfiguration().getAttributes());
+  }
+
+  @Test
+  public void getConfigs() throws Exception {
+    Configuration conf = new Configuration(expectedProperties, expectedAttributes);
+    configurable.setConfiguration(conf);
+    assertEquals(rawConfig, configurable.getConfigs());
+  }
+
+  static class SimpleConfigurable implements Configurable {
+
+    private Configuration configuration;
+
+    @Override
+    public void setConfiguration(Configuration configuration) {
+      this.configuration = configuration;
+    }
+
+    @Override
+    public Configuration getConfiguration() {
+      return this.configuration;
+    }
+  }
+}
\ No newline at end of file