Repository: ambari Updated Branches: refs/heads/trunk 4fb4d677d -> 65f010567
AMBARI-18179: Ambari Blueprint - Namenode HA should check for ZKFC (Amruta Borkar via dili) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/65f01056 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/65f01056 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/65f01056 Branch: refs/heads/trunk Commit: 65f010567dd3dc211575a86754ad5b064041078f Parents: 4fb4d67 Author: Di Li <[email protected]> Authored: Fri Aug 26 14:57:52 2016 -0400 Committer: Di Li <[email protected]> Committed: Fri Aug 26 14:57:52 2016 -0400 ---------------------------------------------------------------------- .../server/topology/BlueprintValidatorImpl.java | 3 + .../server/topology/BlueprintImplTest.java | 62 ++++++++++++++++++-- 2 files changed, 59 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/65f01056/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java index dbf736f..398772e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java @@ -135,6 +135,9 @@ public class BlueprintValidatorImpl implements BlueprintValidator { } } if (ClusterTopologyImpl.isNameNodeHAEnabled(clusterConfigurations) && component.equals("NAMENODE")) { + if(!hostGroup.getComponentNames().contains("ZKFC")){ + throw new InvalidTopologyException("Compoenent ZKFC is mandatory for hostgroup " + hostGroup+" when NAMENODE HA is enabled"); + } Map<String, String> hadoopEnvConfig = clusterConfigurations.get("hadoop-env"); if(hadoopEnvConfig != null && !hadoopEnvConfig.isEmpty() && hadoopEnvConfig.containsKey("dfs_ha_initial_namenode_active") && hadoopEnvConfig.containsKey("dfs_ha_initial_namenode_standby")) { ArrayList<HostGroup> hostGroupsForComponent = new ArrayList<HostGroup>( blueprint.getHostGroupsForComponent(component)); http://git-wip-us.apache.org/repos/asf/ambari/blob/65f01056/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java index a5acc42..ff9af17 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintImplTest.java @@ -181,15 +181,59 @@ public class BlueprintImplTest { expect(group2.getConfiguration()).andReturn(group2Configuration).atLeastOnce(); expect(group1.getCardinality()).andReturn("1").atLeastOnce(); - expect(group1.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"))).atLeastOnce(); + expect(group1.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"),new Component("ZKFC"))).atLeastOnce(); expect(group2.getCardinality()).andReturn("1").atLeastOnce(); - expect(group2.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"))).atLeastOnce(); + expect(group2.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"),new Component("ZKFC"))).atLeastOnce(); + Map<String, String> category2Props = new HashMap<>(); + properties.put("category2", category2Props); + category2Props.put("prop2", "val"); + group1Components.add("NAMENODE"); + group1Components.add("ZKFC"); + group2Components.add("NAMENODE"); + group2Components.add("ZKFC"); + expect(stack.getServiceForComponent("NAMENODE")).andReturn("SERVICE2").atLeastOnce(); + expect(stack.getServiceForComponent("ZKFC")).andReturn("SERVICE2").atLeastOnce(); + Map<String, String> hdfsProps = new HashMap<String, String>(); + properties.put("hdfs-site", hdfsProps); + hdfsProps.put("foo", "val"); + hdfsProps.put("bar", "val"); + hdfsProps.put("dfs.nameservices", "val"); + Map<String, String> hadoopProps = new HashMap<String, String>(); + properties.put("hadoop-env", hadoopProps); + hadoopProps.put("dfs_ha_initial_namenode_active", "%HOSTGROUP::group1%"); + hadoopProps.put("dfs_ha_initial_namenode_standby", "%HOSTGROUP::group2%"); + replay(stack, group1, group2); + + Blueprint blueprint = new BlueprintImpl("test", hostGroups, stack, configuration, null); + blueprint.validateRequiredProperties(); + BlueprintEntity entity = blueprint.toEntity(); + + verify(stack, group1, group2); + assertTrue(entity.getSecurityType() == SecurityType.NONE); + assertTrue(entity.getSecurityDescriptorReference() == null); + } + @Test(expected = InvalidTopologyException.class) + public void testValidateConfigurations__hostGroupConfigForNameNodeHANOZKFC() throws Exception { + Map<String, Map<String, String>> group2Props = new HashMap<>(); + Map<String, String> group2Category2Props = new HashMap<>(); + group2Props.put("category2", group2Category2Props); + group2Category2Props.put("prop2", "val"); + // set config for group2 which contains a required property + Configuration group2Configuration = new Configuration(group2Props, EMPTY_ATTRIBUTES, configuration); + expect(group2.getConfiguration()).andReturn(group2Configuration).atLeastOnce(); + + expect(group1.getCardinality()).andReturn("1").atLeastOnce(); + expect(group1.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"),new Component("ZKFC"))).atLeastOnce(); + expect(group2.getCardinality()).andReturn("1").atLeastOnce(); + expect(group2.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"),new Component("ZKFC"))).atLeastOnce(); Map<String, String> category2Props = new HashMap<>(); properties.put("category2", category2Props); category2Props.put("prop2", "val"); group1Components.add("NAMENODE"); + group1Components.add("ZKFC"); group2Components.add("NAMENODE"); expect(stack.getServiceForComponent("NAMENODE")).andReturn("SERVICE2").atLeastOnce(); + expect(stack.getServiceForComponent("ZKFC")).andReturn("SERVICE2").atLeastOnce(); Map<String, String> hdfsProps = new HashMap<String, String>(); properties.put("hdfs-site", hdfsProps); hdfsProps.put("foo", "val"); @@ -220,15 +264,18 @@ public class BlueprintImplTest { Configuration group2Configuration = new Configuration(group2Props, EMPTY_ATTRIBUTES, configuration); expect(group2.getConfiguration()).andReturn(group2Configuration).atLeastOnce(); expect(group1.getCardinality()).andReturn("1").atLeastOnce(); - expect(group1.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"))).atLeastOnce(); + expect(group1.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"),new Component("ZKFC"))).atLeastOnce(); expect(group2.getCardinality()).andReturn("1").atLeastOnce(); - expect(group2.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"))).atLeastOnce(); + expect(group2.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"),new Component("ZKFC"))).atLeastOnce(); Map<String, String> category2Props = new HashMap<>(); properties.put("category2", category2Props); category2Props.put("prop2", "val"); group1Components.add("NAMENODE"); + group1Components.add("ZKFC"); group2Components.add("NAMENODE"); + group2Components.add("ZKFC"); expect(stack.getServiceForComponent("NAMENODE")).andReturn("SERVICE2").atLeastOnce(); + expect(stack.getServiceForComponent("ZKFC")).andReturn("SERVICE2").atLeastOnce(); Map<String, String> hdfsProps = new HashMap<String, String>(); properties.put("hdfs-site", hdfsProps); hdfsProps.put("foo", "val"); @@ -253,15 +300,18 @@ public class BlueprintImplTest { Configuration group2Configuration = new Configuration(group2Props, EMPTY_ATTRIBUTES, configuration); expect(group2.getConfiguration()).andReturn(group2Configuration).atLeastOnce(); expect(group1.getCardinality()).andReturn("1").atLeastOnce(); - expect(group1.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"))).atLeastOnce(); + expect(group1.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"),new Component("ZKFC"))).atLeastOnce(); expect(group2.getCardinality()).andReturn("1").atLeastOnce(); - expect(group2.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"))).atLeastOnce(); + expect(group2.getComponents()).andReturn(Arrays.asList(new Component("NAMENODE"),new Component("ZKFC"))).atLeastOnce(); Map<String, String> category2Props = new HashMap<>(); properties.put("category2", category2Props); category2Props.put("prop2", "val"); group1Components.add("NAMENODE"); + group1Components.add("ZKFC"); group2Components.add("NAMENODE"); + group2Components.add("ZKFC"); expect(stack.getServiceForComponent("NAMENODE")).andReturn("SERVICE2").atLeastOnce(); + expect(stack.getServiceForComponent("ZKFC")).andReturn("SERVICE2").atLeastOnce(); Map<String, String> hdfsProps = new HashMap<String, String>(); properties.put("hdfs-site", hdfsProps); hdfsProps.put("foo", "val");
