AMBARI-22297. Fix configurations import/export issues (adoroszlai)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ff29752c Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ff29752c Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ff29752c Branch: refs/heads/branch-feature-AMBARI-14714-blueprintv2 Commit: ff29752c93c065bd9334dc23be56edefb315f21b Parents: 7d2cc8e Author: Attila Doroszlai <adorosz...@hortonworks.com> Authored: Mon Nov 20 08:43:46 2017 +0100 Committer: Doroszlai, Attila <adorosz...@hortonworks.com> Committed: Fri Dec 8 20:24:25 2017 +0100 ---------------------------------------------------------------------- .../ambari/server/topology/Configurable.java | 24 +++++++----- .../ambari/server/topology/Configuration.java | 4 ++ .../server/topology/BlueprintV2FactoryTest.java | 40 ++++++++++++-------- .../test/resources/blueprintv2/blueprintv2.json | 24 ++++++++---- 4 files changed, 58 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/ff29752c/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 bab7da6..af91e40 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,13 +18,16 @@ 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; + import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.stream.Collectors; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.collect.Lists; public interface Configurable { void setConfiguration(Configuration configuration); @@ -34,10 +37,10 @@ public interface Configurable { default void setConfigs(Collection<Map<String, Map<String, Map<String, String>>>> configs) { if (null != configs) { Map<String, Map<String, String>> allProps = configs.stream(). - filter( map -> map != null && !map.isEmpty() && map.values().iterator().next().get("properties ") != null). - collect(Collectors.toMap( + 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("properties") + config -> config.values().iterator().next().get(Configuration.PROPERTIES_KEY) )); setConfiguration(new Configuration(allProps, new HashMap<>())); } @@ -45,11 +48,12 @@ public interface Configurable { @JsonProperty("configurations") default Collection<Map<String, Map<String, Map<String, String>>>> getConfigs() { - Map<String, Map<String, Map<String, String>>> configAsMap = new HashMap<>(); - if (null != getConfiguration()) { - configAsMap.put("properties", getConfiguration().getProperties()); - } - return Lists.newArrayList(configAsMap); // TODO replace with Collections.singletonList? + 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(); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/ff29752c/ambari-server/src/main/java/org/apache/ambari/server/topology/Configuration.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/Configuration.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/Configuration.java index 6adcf18..123237f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/topology/Configuration.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/Configuration.java @@ -30,6 +30,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore; * Configuration for a topology entity such as a blueprint, hostgroup or cluster. */ public class Configuration { + + public static final String PROPERTIES_KEY = "properties"; + public static final String ATTRIBUTES_KEY = "properties_attributes"; + /** * properties for this configuration instance */ http://git-wip-us.apache.org/repos/asf/ambari/blob/ff29752c/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintV2FactoryTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintV2FactoryTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintV2FactoryTest.java index 6ae8039..78aa98c 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintV2FactoryTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintV2FactoryTest.java @@ -17,7 +17,6 @@ */ package org.apache.ambari.server.topology; -import static org.easymock.EasyMock.anyString; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; @@ -56,7 +55,7 @@ public class BlueprintV2FactoryTest { @Before public void setUp() throws Exception { StackV2Factory stackFactory = mock(StackV2Factory.class); - when(stackFactory.create(any(StackId.class), anyString())).thenAnswer(invocation -> { + when(stackFactory.create(any(StackId.class), any(String.class))).thenAnswer(invocation -> { StackId stackId = invocation.getArgumentAt(0, StackId.class); return new StackV2(stackId.getStackName(), stackId.getStackVersion(), invocation.getArgumentAt(1, String.class), new HashMap<>(), new HashMap<>(), new HashMap<>(), @@ -69,12 +68,26 @@ public class BlueprintV2FactoryTest { @Test public void testSerialization_parseJsonAsBlueprint() throws Exception { - BlueprintV2 bp = blueprintFactory.convertFromJson(BLUEPRINTV2_JSON); + verifyBlueprintStructure1(blueprintFactory.convertFromJson(BLUEPRINTV2_JSON)); + } + + private void verifyBlueprintStructure1(BlueprintV2 bp) { // for "blueprintv2.json" assertEquals(new StackId("HDPCORE", "3.0.0"), bp.getServiceGroups().iterator().next().getServices().iterator().next().getStack().getStackId()); assertEquals(2, bp.getStackIds().size()); assertEquals(7, bp.getAllServiceIds().size()); assertEquals(2, bp.getServiceGroups().size()); + + Service zk1 = bp.getServiceGroup("CoreSG").getServiceByName("ZK1"); + Map<String, Map<String, String>> expectedProperties = new HashMap<>(); + Map<String, String> zooCfg = new HashMap<>(); + zooCfg.put("dataDir", "/zookeeper1"); + expectedProperties.put("zoo.cfg", zooCfg); + Map<String, String> zookeeperEnv = new HashMap<>(); + zookeeperEnv.put("zk_user", "zkuser1"); + zookeeperEnv.put("zk_server_heapsize", "256MB"); + expectedProperties.put("zookeeper-env", zookeeperEnv); + assertEquals(expectedProperties, zk1.getConfiguration().getProperties()); } @Test @@ -92,23 +105,22 @@ public class BlueprintV2FactoryTest { assertEquals(1, getAsList(blueprintAsMap, "host_groups").size()); assertEquals("host_group_1", getByPath(blueprintAsMap, ImmutableList.of("host_groups", 0, "name"))); - System.out.println(blueprintAsMap); } @Test public void testSerialization_serializeBlueprint() throws Exception { - BlueprintV2 bp = blueprintFactory.convertFromJson(BLUEPRINTV2_JSON); - String serialized = blueprintFactory.convertToJson(bp); + BlueprintV2 bp1 = blueprintFactory.convertFromJson(BLUEPRINTV2_JSON); + String serialized = blueprintFactory.convertToJson(bp1); // Test that serialized blueprint can be read again - bp = blueprintFactory.convertFromJson(serialized); - assertEquals(2, bp.getStackIds().size()); - assertEquals(7, bp.getAllServiceIds().size()); - assertEquals(2, bp.getServiceGroups().size()); + verifyBlueprintStructure1(blueprintFactory.convertFromJson(serialized)); } @Test public void testSerialization2_parseJsonAsBlueprint() throws Exception { - BlueprintV2 bp = blueprintFactory.convertFromJson(BLUEPRINTV2_2_JSON); + verifyBlueprintStructure2(blueprintFactory.convertFromJson(BLUEPRINTV2_2_JSON)); + } + + private void verifyBlueprintStructure2(BlueprintV2 bp) { assertEquals(new StackId("HDP", "3.0.0"), bp.getServiceGroups().iterator().next().getServices().iterator().next().getStack().getStackId()); assertEquals(1, bp.getStackIds().size()); @@ -131,7 +143,6 @@ public class BlueprintV2FactoryTest { assertEquals(1, getAsList(blueprintAsMap, "host_groups").size()); assertEquals("host_group_1", getByPath(blueprintAsMap, ImmutableList.of("host_groups", 0, "name"))); - System.out.println(blueprintAsMap); } @Test @@ -139,10 +150,7 @@ public class BlueprintV2FactoryTest { BlueprintV2 bp = blueprintFactory.convertFromJson(BLUEPRINTV2_2_JSON); String serialized = blueprintFactory.convertToJson(bp); // Test that serialized blueprint can be read again - bp = blueprintFactory.convertFromJson(serialized); - assertEquals(1, bp.getStackIds().size()); - assertEquals(4, bp.getAllServiceIds().size()); - assertEquals(1, bp.getServiceGroups().size()); + verifyBlueprintStructure2(blueprintFactory.convertFromJson(serialized)); } private static Map<String, Object> getAsMap(Map<String, Object> parentMap, String key) { http://git-wip-us.apache.org/repos/asf/ambari/blob/ff29752c/ambari-server/src/test/resources/blueprintv2/blueprintv2.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/blueprintv2/blueprintv2.json b/ambari-server/src/test/resources/blueprintv2/blueprintv2.json index c5e2541..013b8d7 100644 --- a/ambari-server/src/test/resources/blueprintv2/blueprintv2.json +++ b/ambari-server/src/test/resources/blueprintv2/blueprintv2.json @@ -34,9 +34,17 @@ "stack_id": "HDPCORE-3.0.0", "configurations": [ { - "zoo.cfg" : { - "properties" : { - "dataDir" : "/zookeeper1" + "zoo.cfg": { + "properties": { + "dataDir": "/zookeeper1" + } + } + }, + { + "zookeeper-env": { + "properties": { + "zk_user": "zkuser1", + "zk_server_heapsize": "256MB" } } } @@ -48,9 +56,9 @@ "stack_id": "HDPCORE-3.0.0", "configurations": [ { - "zoo.cfg" : { - "properties" : { - "dataDir" : "/zookeeper2" + "zoo.cfg": { + "properties": { + "dataDir": "/zookeeper2" } } } @@ -78,8 +86,8 @@ "stack_id": "HDPCORE-3.0.0", "dependencies": [ { - "service_group" : "CoreSG", - "service_name" : "ZK2" + "service_group": "CoreSG", + "service_name": "ZK2" } ] },