/***************************************************************************
* Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/
package com.vmware.bdd.plugin.clouderamgr.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import mockit.Mockit;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.vmware.bdd.software.mgmt.plugin.exception.ValidationException;
import com.vmware.bdd.software.mgmt.plugin.model.ClusterBlueprint;
import com.vmware.bdd.software.mgmt.plugin.model.HadoopStack;
import com.vmware.bdd.software.mgmt.plugin.model.NodeGroupInfo;
import com.vmware.bdd.software.mgmt.plugin.model.NodeInfo;
/**
* Author: Xiaoding Bian
* Date: 7/11/14
* Time: 3:19 PM
*/
public class TestCmClusterValidator {
@BeforeClass(groups = {"TestCmClusterValidator"})
public static void setUp() {
Mockit.tearDownMocks();
}
@Test(groups = {"TestCmClusterValidator"})
public void testSuccess() {
try {
ClusterBlueprint blueprint = generateBlueprint();
CmClusterValidator validator = new CmClusterValidator();
Assert.assertTrue(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testUnrecogRolesOfDistro() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getHadoopStack().setDistro("CDH-4.0.0");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testUnrecogRoles() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getNodeGroups().get(0).getRoles().add("FAKE_ROLE01");
blueprint.getNodeGroups().get(1).getRoles().add("FAKE_ROLE02");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testUnrecogConfigTypes() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getConfiguration().put("FAKE_CONFIG", new HashMap<String, String>());
CmClusterValidator validator = new CmClusterValidator();
Assert.assertTrue(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testBadConfigItems() {
try {
ClusterBlueprint blueprint = generateBlueprint();
Map<String, String> hdfsConfig = (Map<String, String>) blueprint.getConfiguration().get("HDFS");
hdfsConfig.put("fake_config_01", "value");
Map<String, String> nnConfig = (Map<String, String>) blueprint.getNodeGroups().get(0).getConfiguration().get("HDFS_NAMENODE");
nnConfig.put("fake_config_02", "value");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testMissedRoles() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getNodeGroups().get(1).getRoles().remove("HDFS_DATANODE");
blueprint.getNodeGroups().get(0).getRoles().remove("YARN_RESOURCE_MANAGER");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testNnHA() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getNodeGroups().get(0).getRoles().remove("HDFS_SECONDARY_NAMENODE");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testNnFederation() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getNodeGroups().get(1).getRoles().add("HDFS_NAMENODE");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testServiceDependency01() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getNodeGroups().get(0).getRoles().remove("HDFS_NAMENODE");
blueprint.getNodeGroups().get(0).getRoles().remove("HDFS_SECONDARY_NAMENODE");
blueprint.getNodeGroups().get(1).getRoles().remove("HDFS_DATANODE");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testServiceDependency02() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getNodeGroups().get(0).getRoles().add("HIVE_METASTORE");
blueprint.getNodeGroups().get(0).getRoles().remove("YARN_RESOURCE_MANAGER");
blueprint.getNodeGroups().get(0).getRoles().remove("YARN_JOB_HISTORY");
blueprint.getNodeGroups().get(1).getRoles().add("HIVE_SERVER2");
blueprint.getNodeGroups().get(1).getRoles().remove("YARN_NODE_MANAGER");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testBadInstanceNum01() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getNodeGroups().get(0).getRoles().add("ZOOKEEPER_SERVER");
blueprint.getNodeGroups().get(0).getRoles().add("HDFS_JOURNALNODE");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
@Test(groups = {"TestCmClusterValidator"})
public void testBadInstanceNum02() {
try {
ClusterBlueprint blueprint = generateBlueprint();
blueprint.getNodeGroups().get(0).getRoles().add("ZOOKEEPER_SERVER");
blueprint.getNodeGroups().get(1).getRoles().add("ZOOKEEPER_SERVER");
blueprint.getNodeGroups().get(0).getRoles().add("HDFS_JOURNALNODE");
blueprint.getNodeGroups().get(1).getRoles().add("HDFS_JOURNALNODE");
blueprint.getNodeGroups().get(1).getRoles().add("YARN_RESOURCE_MANAGER");
CmClusterValidator validator = new CmClusterValidator();
Assert.assertFalse(validator.validateBlueprint(blueprint));
} catch (ValidationException e) {
System.out.println("warning_msg_list: " + e.getWarningMsgList());
System.out.println("error_msg_list: " + e.getFailedMsgList());
}
}
private ClusterBlueprint generateBlueprint() {
//return SerialUtils.getObjectByJsonString(ClusterBlueprint.class, CommonUtil.readJsonFile("simple_blueprint.json"));
ClusterBlueprint blueprint = new ClusterBlueprint();
blueprint.setName("cluster01");
HadoopStack hadoopStack = new HadoopStack();
hadoopStack.setDistro("CDH-5.0.2");
blueprint.setHadoopStack(hadoopStack);
List<NodeGroupInfo> groups = new ArrayList<NodeGroupInfo>();
NodeGroupInfo group01 = new NodeGroupInfo();
group01.setName("master");
List<String> roles01 = new ArrayList<String>();
roles01.add("HDFS_NAMENODE");
roles01.add("HDFS_SECONDARY_NAMENODE");
roles01.add("YARN_RESOURCE_MANAGER");
roles01.add("YARN_JOB_HISTORY");
group01.setRoles(roles01);
group01.setInstanceNum(1);
Map<String, Object> configs = new HashMap<String, Object>();
Map<String, String> nnConfig = new HashMap<String, String>();
nnConfig.put("namenode_java_heapsize", "1024");
configs.put("HDFS_NAMENODE", nnConfig);
Map<String, String> snnConfig = new HashMap<String, String>();
snnConfig.put("secondary_namenode_java_heapsize", "1024");
configs.put("HDFS_SECONDARY_NAMENODE", snnConfig);
group01.setConfiguration(configs);
NodeInfo node01 = new NodeInfo();
node01.setRack("/rack01");
List<NodeInfo> nodes01 = new ArrayList<>();
nodes01.add(node01);
group01.setNodes(nodes01);
NodeGroupInfo group02 = new NodeGroupInfo();
group02.setName("worker");
List<String> roles02 = new ArrayList<>();
roles02.add("HDFS_DATANODE");
roles02.add("YARN_NODE_MANAGER");
group02.setRoles(roles02);
Map<String, Object> configs02 = new HashMap<String, Object>();
Map<String, String> dnConfig = new HashMap<String, String>();
dnConfig.put("dfs_datanode_failed_volumes_tolerated", "2");
configs02.put("HDFS_DATANODE", dnConfig);
group02.setConfiguration(configs02);
NodeInfo node02 = new NodeInfo();
node02.setRack("/rack02");
List<NodeInfo> nodes02 = new ArrayList<>();
nodes02.add(node02);
group02.setNodes(nodes02);
group02.setInstanceNum(3);
groups.add(group01);
groups.add(group02);
blueprint.setNodeGroups(groups);
Map<String, Object> clusterConfig = new HashMap<String, Object>();
Map<String, String> hdfsConfig = new HashMap<String, String>();
hdfsConfig.put("hdfs_namenode_health_enabled", "true");
clusterConfig.put("HDFS", hdfsConfig);
Map<String, String> snnConfig02 = new HashMap<String, String>();
snnConfig02.put("secondarynamenode_java_opts", "-XX:+UseParNewGC");
clusterConfig.put("HDFS_SECONDARY_NAMENODE", snnConfig02);
blueprint.setConfiguration(clusterConfig);
return blueprint;
}
@Test(groups = {"TestCmClusterValidator"})
public void testComputeOnly() {
ClusterBlueprint blueprint = generateBlueprint();
CmClusterValidator validator = new CmClusterValidator();
Assert.assertTrue(validator.validateBlueprint(blueprint));
}
private ClusterBlueprint generateBluprintForComputeOnly() {
ClusterBlueprint blueprint = new ClusterBlueprint();
blueprint.setName("cluster01");
HadoopStack hadoopStack = new HadoopStack();
hadoopStack.setDistro("CDH-5.2.0");
blueprint.setHadoopStack(hadoopStack);
List<NodeGroupInfo> groups = new ArrayList<NodeGroupInfo>();
NodeGroupInfo group01 = new NodeGroupInfo();
group01.setName("master");
List<String> roles01 = new ArrayList<String>();
roles01.add("YARN_RESOURCE_MANAGER");
roles01.add("YARN_JOB_HISTORY");
group01.setRoles(roles01);
group01.setInstanceNum(1);
NodeInfo node01 = new NodeInfo();
node01.setRack("/rack01");
List<NodeInfo> nodes01 = new ArrayList<>();
nodes01.add(node01);
group01.setNodes(nodes01);
NodeGroupInfo group02 = new NodeGroupInfo();
group02.setName("worker");
List<String> roles02 = new ArrayList<>();
roles02.add("YARN_NODE_MANAGER");
roles02.add("GATEWAY");
group02.setRoles(roles02);
NodeInfo node02 = new NodeInfo();
node02.setRack("/rack02");
List<NodeInfo> nodes02 = new ArrayList<>();
nodes02.add(node02);
group02.setNodes(nodes02);
group02.setInstanceNum(3);
groups.add(group01);
groups.add(group02);
blueprint.setNodeGroups(groups);
Map<String, Object> clusterConfig = new HashMap<String, Object>();
Map<String, String> isilonConfig = new HashMap<String, String>();
isilonConfig.put("default_fs_name", "hdfs://FQDN:8020");
isilonConfig.put("webhdfs_url", "hdfs://FQDN:8020/webhdfs/v1");
clusterConfig.put("ISILON", isilonConfig);
blueprint.setConfiguration(clusterConfig);
return blueprint;
}
}