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");

Reply via email to