/***************************************************************************
* Copyright (c) 2012-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.manager;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mockit;
import org.apache.log4j.Logger;
import org.mockito.Mockito;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.vmware.bdd.apitypes.*;
import com.vmware.bdd.apitypes.Datastore.DatastoreType;
import com.vmware.bdd.apitypes.NetConfigInfo.NetTrafficType;
import com.vmware.bdd.apitypes.PlacementPolicy.GroupAssociation;
import com.vmware.bdd.apitypes.PlacementPolicy.GroupAssociation.GroupAssociationType;
import com.vmware.bdd.dal.IServerInfoDAO;
import com.vmware.bdd.entity.ClusterEntity;
import com.vmware.bdd.entity.ServerInfoEntity;
import com.vmware.bdd.exception.BddException;
import com.vmware.bdd.manager.intf.IClusterEntityManager;
import com.vmware.bdd.plugin.ironfan.impl.DistroManager;
import com.vmware.bdd.plugin.ironfan.impl.DistroManager.PackagesExistStatus;
import com.vmware.bdd.plugin.ironfan.utils.ChefServerUtils;
import com.vmware.bdd.service.MockVcVmUtil;
import com.vmware.bdd.service.impl.ClusteringService;
import com.vmware.bdd.service.resmgmt.IDatastoreService;
import com.vmware.bdd.service.resmgmt.INetworkService;
import com.vmware.bdd.service.resmgmt.IResourcePoolService;
import com.vmware.bdd.service.resmgmt.impl.NodeTemplateService;
import com.vmware.bdd.service.resmgmt.impl.ResourceInitializerService;
import com.vmware.bdd.specpolicy.ClusterSpecFactory;
import com.vmware.bdd.spectypes.HadoopRole;
import com.vmware.bdd.utils.Constants;
import com.vmware.bdd.utils.TestResourceCleanupUtils;
public class TestClusterConfigManager {
private static final Logger logger = Logger
.getLogger(TestClusterConfigManager.class);
private static ClusterConfigManager clusterConfigMgr;
private static TestResourceCleanupUtils cleanUpUtils;
private static IClusterEntityManager clusterEntityMgr;
private static Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation().create();
private ResourceInitializerService service;
private IServerInfoDAO serverInfoDao;
@BeforeClass
public void beforeClass() {
service = new ResourceInitializerService();
serverInfoDao = new MockUp<IServerInfoDAO>() {
@Mock
List<ServerInfoEntity> findAll() {
List<ServerInfoEntity> serverInfos =
new ArrayList<ServerInfoEntity>();
ServerInfoEntity serverInfo = new ServerInfoEntity();
serverInfo.setResourceInitialized(true);
serverInfos.add(serverInfo);
return serverInfos;
}
}.getMockInstance();
service.setServerInfoDao(serverInfoDao);
}
@AfterMethod(groups = { "TestClusterConfigManager" })
public void tearDownMockup() {
Mockit.tearDownMocks();
}
@BeforeMethod(groups = { "TestClusterConfigManager" })
public void setMockup() {
Mockit.setUpMock(MockResourceManager.class);
Mockit.setUpMock(MockVcVmUtil.class);
Mockit.setUpMock(MockVcResourceUtils.class);
Mockit.setUpMock(MockNodeTemplateService.class);
}
@AfterClass(groups = { "TestClusterConfigManager" })
public static void tearDown() {
cleanupResources();
}
public static void mockChefServerRoles() {
List<String> rolesList =
Arrays.asList("hadoop", "hadoop_client", "hadoop_datanode",
"hadoop_initial_bootstrap", "hadoop_jobtracker",
"hadoop_journalnode", "hadoop_master", "hadoop_namenode",
"hadoop_nodemanager", "hadoop_resourcemanager",
"hadoop_secondarynamenode", "hadoop_tasktracker",
"hadoop_worker", "hawq-cluster", "hawq-master-facet",
"hawq-worker-facet", "hawq_master", "hawq_worker",
"hbase_client", "hbase_master", "hbase_regionserver", "hive",
"hive_server", "mapr", "mapr_cldb", "mapr_client",
"mapr_fileserver", "mapr_hbase_client", "mapr_hbase_master",
"mapr_hbase_regionserver", "mapr_hive", "mapr_hive_server",
"mapr_jobtracker", "mapr_metrics", "mapr_mysql_server",
"mapr_nfs", "mapr_pig", "mapr_tasktracker", "mapr_webserver",
"mapr_zookeeper", "pig", "postgresql_server",
"tempfs_client", "tempfs_server", "zookeeper");
HashSet<String> roles = new HashSet<String>();
roles.addAll(rolesList);
ChefServerUtils.setAllRoles(roles);
}
@BeforeClass(groups = { "TestClusterConfigManager" }, dependsOnGroups = { "TestClusteringService" })
public static void setup() {
Mockit.setUpMock(MockResourceManager.class);
ApplicationContext context =
new FileSystemXmlApplicationContext(
"../serengeti/WebContent/WEB-INF/spring/root-context.xml",
"../serengeti/WebContent/WEB-INF/spring/datasource-context.xml",
"../serengeti/WebContent/WEB-INF/spring/spring-batch-context.xml",
"../serengeti/WebContent/WEB-INF/spring/tx-context.xml",
"src/test/resources/spring/serengeti-jobs-context.xml",
"../serengeti/WebContent/WEB-INF/spring/manager-context.xml");
context.getBean(SoftwareManagerCollector.class).loadSoftwareManagers();
clusterConfigMgr = context.getBean(ClusterConfigManager.class);
DistroManager distroMgr = Mockito.mock(DistroManager.class);
ClusteringService clusteringService =
Mockito.mock(ClusteringService.class);
mockChefServerRoles();
clusterConfigMgr.setClusteringService(clusteringService);
clusterEntityMgr =
context
.getBean("clusterEntityManager", IClusterEntityManager.class);
NodeTemplateService nodeTemplateService = Mockito.mock(NodeTemplateService.class);
DistroRead distro = new DistroRead();
List<String> roles = new ArrayList<String>();
roles.add("hadoop_namenode");
roles.add("hadoop_jobtracker");
roles.add("hadoop_datanode");
roles.add("hadoop_tasktracker");
roles.add("hadoop_client");
roles.add("hive");
roles.add("hive_server");
roles.add("pig");
distro.setRoles(roles);
Mockito.when(nodeTemplateService.getNodeTemplateIdByName("node-template")).thenReturn("vm-1234");
Mockito.when(nodeTemplateService.getNodeTemplateNameByMoid("vm-1234")).thenReturn("node-template");
Mockito.when(distroMgr.getDistroByName("apache")).thenReturn(distro);
Mockito.when(distroMgr.checkPackagesExistStatus("apache")).thenReturn(
PackagesExistStatus.TARBALL);
Mockito.when(
distroMgr.getPackageUrlByDistroRole("apache",
HadoopRole.HADOOP_NAMENODE_ROLE.toString())).thenReturn(
"http://localhost/distros/apache/1.0.1/hadoop-1.0.1.tar.gz");
Mockito.when(
distroMgr.getPackageUrlByDistroRole("apache",
HadoopRole.HIVE_ROLE.toString())).thenReturn(
"http://localhost/distros/apache/1.0.1/hive-0.8.1.tar.gz");
Mockito.when(
distroMgr.getPackageUrlByDistroRole("apache",
HadoopRole.PIG_ROLE.toString())).thenReturn(
"http://localhost/distros/apache/1.0.1/pig-0.9.2.tar.gz");
Mockito.when(
distroMgr.getPackageUrlByDistroRole("apache",
HadoopRole.HBASE_MASTER_ROLE.toString())).thenReturn(
"http://localhost/distros/apache/1.0.1/hbase-0.94.0.tar.gz");
Mockito.when(
distroMgr.getPackageUrlByDistroRole("apache",
HadoopRole.ZOOKEEPER_ROLE.toString())).thenReturn(
"http://localhost/distros/apache/1.0.1/zookeeper-3.4.3.tar.gz");
IResourcePoolService resPoolSvc =
context.getBean("resourcePoolService", IResourcePoolService.class);
IDatastoreService dsSvc =
context.getBean("datastoreService", IDatastoreService.class);
INetworkService netSvc =
context.getBean("networkService", INetworkService.class);
cleanUpUtils = new TestResourceCleanupUtils();
cleanUpUtils.setDsSvc(dsSvc);
cleanUpUtils.setNetSvc(netSvc);
cleanUpUtils.setResPoolSvc(resPoolSvc);
cleanupResources();
try {
Set<String> rpNames = resPoolSvc.getAllRPNames();
logger.info("available resource pools: " + rpNames);
resPoolSvc.addResourcePool("myRp1", "cluster1", "rp1");
} catch (Exception e) {
logger.error("ignore create resource pool myRp1 exception. ", e);
}
try {
resPoolSvc.addResourcePool("myRp2", "cluster1", "rp2");
} catch (Exception e) {
logger.error("ignore create resource pool myRp2 exception. ", e);
}
try {
resPoolSvc.addResourcePool("myRp3", "cluster2", "rp1");
} catch (Exception e) {
logger.error("ignore create resource pool myRp3 exception. ", e);
}
try {
resPoolSvc.addResourcePool("myRp4", "cluster2", "rp2");
} catch (Exception e) {
logger.error("ignore create resource pool myRp4 exception. ", e);
}
try {
resPoolSvc.addResourcePool("myRp5", "cluster4", "rp1");
} catch (Exception e) {
logger.error("ignore create resource pool myRp5 exception. ", e);
}
try {
resPoolSvc.addResourcePool("myRp6", "cluster4", "rp2");
} catch (Exception e) {
logger.error("ignore create resource pool myRp6 exception. ", e);
}
try {
netSvc.addDhcpNetwork("dhcpNet1", "CFNetwork", NetworkDnsType.NORMAL);
} catch (Exception e) {
logger.error("ignore create network dhcpNet1 exception. ", e);
}
List<String> sharedStores = new ArrayList<String>();
sharedStores.add("share1");
sharedStores.add("share2");
try {
clusterConfigMgr.getDatastoreMgr().addDatastores("testSharedStore",
DatastoreType.SHARED, sharedStores, false);
} catch (Exception e) {
logger.error("ignore create datastore testSharedStore exception. ", e);
}
List<String> localStores = new ArrayList<String>();
localStores.add("local1");
localStores.add("vmfs*");
try {
clusterConfigMgr.getDatastoreMgr().addDatastores("testLocalStore",
DatastoreType.LOCAL, localStores, false);
} catch (Exception e) {
logger.error("ignore create datastore testLocalStore exception. ", e);
}
List<IpBlock> ipBlocks = new ArrayList<IpBlock>();
IpBlock ip1 = new IpBlock();
ip1.setBeginIp("192.168.1.1");
ip1.setEndIp("192.168.1.3");
ipBlocks.add(ip1);
IpBlock ip2 = new IpBlock();
ip2.setBeginIp("192.168.1.102");
ip2.setEndIp("192.168.1.102");
ipBlocks.add(ip2);
IpBlock ip3 = new IpBlock();
ip3.setBeginIp("192.168.1.104");
ip3.setEndIp("192.168.1.204");
ipBlocks.add(ip3);
try {
netSvc.addIpPoolNetwork("ipPool1", "CFNetwork1", "255.255.0.0",
"192.168.1.254", "2.2.2.2", null, ipBlocks, NetworkDnsType.NORMAL);
} catch (Exception e) {
logger.error("ignore create network ipPool1 exception. ", e);
}
}
private static void cleanupResources() {
cleanUpUtils.removeClusters(clusterEntityMgr, "my-cluster.*");
cleanUpUtils.removeRPs("myRp.");
cleanUpUtils.removeDatastore("testSharedStore");
cleanUpUtils.removeDatastore("testLocalStore");
cleanUpUtils.removeNetwork("dhcpNet1");
cleanUpUtils.removeNetwork("ipPool1");
}
@Test(groups = { "TestClusterConfigManager" })
public void testString() {
String s1 =
"{\"name\":\"my-cluster\",\"groups\":[{\"name\":\"master\",\"roles\":[\"hadoop_namenode\",\"hadoop_jobtracker\"],\"instance_num\":1,\"cpu\":2,\"memory\":7500,\"storage\":{\"type\":\"shared\",\"size\":50},\"ha\":\"on\"},{\"name\":\"worker\",\"roles\":[\"hadoop_datanode\",\"hadoop_tasktracker\"],\"instance_num\":3,\"cpu\":1,\"memory\":3748,\"storage\":{\"type\":\"local\",\"size\":50},\"ha\":\"off\"},{\"name\":\"client\",\"roles\":[\"hive\",\"hadoop_client\",\"pig\"],\"instance_num\":1,\"cpu\":1,\"memory\":3748,\"storage\":{\"type\":\"shared\",\"size\":50},\"ha\":\"off\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork\",\"type\":\"dhcp\"}],\"distro_map\":{\"hadoop\":\"http://localhost/distros/apache/1.0.1/hadoop-1.0.1.tar.gz\",\"pig\":\"http://localhost/distros/apache/1.0.1/pig-0.9.2.tar.gz\",\"hive\":\"http://localhost/distros/apache/1.0.1/hive-0.8.1.tar.gz\"},\"vc_shared_datastore_pattern\":[\"share1\",\"share2\"],\"vc_local_datastore_pattern\":[\"vmfs*\",\"local1\"]}";
String s2 =
"{\"name\":\"my-cluster\",\"groups\":[{\"name\":\"master\",\"roles\":[\"hadoop_namenode\",\"hadoop_jobtracker\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":2,\"memory\":7500,\"ha\":\"on\"},{\"name\":\"worker\",\"roles\":[\"hadoop_datanode\",\"hadoop_tasktracker\"],\"instance_num\":3,\"storage\":{\"type\":\"local\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\"},{\"name\":\"client\",\"roles\":[\"hive\",\"hadoop_client\",\"pig\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork\",\"type\":\"dhcp\"}],\"distro_map\":{\"hadoop\":\"http://localhost/distros/apache/1.0.1/hadoop-1.0.1.tar.gz\",\"pig\":\"http://localhost/distros/apache/1.0.1/pig-0.9.2.tar.gz\",\"hive\":\"http://localhost/distros/apache/1.0.1/hive-0.8.1.tar.gz\"},\"vc_shared_datastore_pattern\":[\"share1\",\"share2\"],\"vc_local_datastore_pattern\":[\"vmfs*\",\"local1\"]}";
System.out.println("string length: " + s1.length());
int i = 0;
for (; i < s1.length(); i++) {
if (s1.charAt(i) != s2.charAt(i)) {
System.out.println("different at " + i);
break;
}
}
System.out.println("sub string: " + s1.substring(i));
}
private Map<NetTrafficType, List<String>> createNetConfigs() {
Map<NetTrafficType, List<String>> netConfigs =
new HashMap<NetTrafficType, List<String>>();
List<String> netConfig = new ArrayList<String>();
netConfig.add("dhcpNet1");
netConfigs.put(NetTrafficType.MGT_NETWORK, netConfig);
return netConfigs;
}
@Test(groups = { "TestClusterConfigManager" })
public void testCreateClusterConfigWithInfraConfig() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster10");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
spec.setType(ClusterType.HDFS_MAPRED);
spec = ClusterSpecFactory.getCustomizedSpec(spec, null);
Map<String, Map<String, String>> infraConfigArrayList = new HashMap<String, Map<String, String>>();
Map<String, String> userMgmtConfig = new HashMap<String, String>();
userMgmtConfig.put("admin_group_name", "admgroup");
userMgmtConfig.put("user_group_name", "usrgroup");
infraConfigArrayList.put("user_management", userMgmtConfig);
spec.setInfrastructure_config(infraConfigArrayList);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findClusterById(1l);
List<ClusterEntity> cs = clusterEntityMgr.findAllClusters();
for (ClusterEntity c : cs) {
System.out.println(c.getId());
}
cluster = clusterEntityMgr.findByName("my-cluster10");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster10");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(manifest.indexOf("master") != -1,
"manifest should contains nodegroups");
}
@Test(groups = { "TestClusterConfigManager" })
public void testClusterConfig() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
spec.setType(ClusterType.HDFS_MAPRED);
spec = ClusterSpecFactory.getCustomizedSpec(spec, null);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findClusterById(1l);
List<ClusterEntity> cs = clusterEntityMgr.findAllClusters();
for (ClusterEntity c : cs) {
System.out.println(c.getId());
}
cluster = clusterEntityMgr.findByName("my-cluster");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(manifest.indexOf("master") != -1,
"manifest should contains nodegroups");
}
@Test(groups = { "TestClusterConfigManager" })
public void testCDHMapReduceV2CreateDefaultSpec() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("cdh4");
spec.setDistroVendor(Constants.CDH_VENDOR);
spec.setDistroVersion("4.4.0");
spec.setType(ClusterType.HDFS_MAPRED);
ClusterCreate newSpec = ClusterSpecFactory.getCustomizedSpec(spec, null);
Assert.assertTrue(newSpec.getNodeGroups().length == 3);
List<String> masterRoles = newSpec.getNodeGroups()[0].getRoles();
Assert.assertTrue(
masterRoles.contains(HadoopRole.HADOOP_JOBTRACKER_ROLE.toString()),
"expected role " + HadoopRole.HADOOP_JOBTRACKER_ROLE.toString()
+ ", but got " + masterRoles);
spec.setDistro("cdh5");
spec.setDistroVersion("5.0.0");
newSpec = ClusterSpecFactory.getCustomizedSpec(spec, null);
Assert.assertTrue(newSpec.getNodeGroups().length == 3);
masterRoles = newSpec.getNodeGroups()[0].getRoles();
Assert.assertTrue(
masterRoles.contains(HadoopRole.HADOOP_RESOURCEMANAGER_ROLE.toString()),
"expected role " + HadoopRole.HADOOP_RESOURCEMANAGER_ROLE.toString()
+ ", but got " + masterRoles);
}
@Test(groups = { "TestClusterConfigManager" })
public void testHDPMapReduceV2CreateDefaultSpec() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("hdp1");
spec.setDistroVendor(Constants.HDP_VENDOR);
spec.setDistroVersion("1.3");
spec.setType(ClusterType.HDFS_MAPRED);
ClusterCreate newSpec = ClusterSpecFactory.getCustomizedSpec(spec, null);
Assert.assertTrue(newSpec.getNodeGroups().length == 3);
List<String> masterRoles = newSpec.getNodeGroups()[0].getRoles();
Assert.assertTrue(
masterRoles.contains(HadoopRole.HADOOP_JOBTRACKER_ROLE.toString()),
"expected role " + HadoopRole.HADOOP_JOBTRACKER_ROLE.toString()
+ ", but got " + masterRoles);
spec.setDistro("hdp2");
spec.setDistroVersion("2.0");
newSpec = ClusterSpecFactory.getCustomizedSpec(spec, null);
Assert.assertTrue(newSpec.getNodeGroups().length == 3);
masterRoles = newSpec.getNodeGroups()[0].getRoles();
Assert.assertTrue(
masterRoles.contains(HadoopRole.HADOOP_RESOURCEMANAGER_ROLE.toString()),
"expected role " + HadoopRole.HADOOP_RESOURCEMANAGER_ROLE.toString()
+ ", but got " + masterRoles);
}
@Test(groups = { "TestClusterConfigManager" })
public void testBigTopMapReduceV2CreateDefaultSpec() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.BIGTOP_VENDOR);
spec.setDistroVersion("0.7");
spec.setType(ClusterType.HDFS_MAPRED);
ClusterCreate newSpec = ClusterSpecFactory.getCustomizedSpec(spec, null);
Assert.assertTrue(newSpec.getNodeGroups().length == 3);
List<String> masterRoles = newSpec.getNodeGroups()[0].getRoles();
Assert.assertTrue(
masterRoles.contains(HadoopRole.HADOOP_RESOURCEMANAGER_ROLE.toString()),
"expected role " + HadoopRole.HADOOP_RESOURCEMANAGER_ROLE.toString()
+ ", but got " + masterRoles);
}
@Test(groups = { "TestClusterConfigManager" })
public void testIntelMapReduceV2CreateDefaultSpec() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("intel2");
spec.setDistroVendor(Constants.INTEL_VENDOR);
spec.setDistroVersion("2.6");
spec.setType(ClusterType.HDFS_MAPRED);
ClusterCreate newSpec = ClusterSpecFactory.getCustomizedSpec(spec, null);
Assert.assertTrue(newSpec.getNodeGroups().length == 3);
List<String> masterRoles = newSpec.getNodeGroups()[0].getRoles();
Assert.assertTrue(
masterRoles.contains(HadoopRole.HADOOP_JOBTRACKER_ROLE.toString()),
"expected role " + HadoopRole.HADOOP_JOBTRACKER_ROLE.toString()
+ ", but got " + masterRoles);
spec.setDistro("intel3");
spec.setDistroVersion("3.1");
newSpec = ClusterSpecFactory.getCustomizedSpec(spec, null);
Assert.assertTrue(newSpec.getNodeGroups().length == 3);
masterRoles = newSpec.getNodeGroups()[0].getRoles();
Assert.assertTrue(
masterRoles.contains(HadoopRole.HADOOP_RESOURCEMANAGER_ROLE.toString()),
"expected role " + HadoopRole.HADOOP_RESOURCEMANAGER_ROLE.toString()
+ ", but got " + masterRoles);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test(groups = { "TestClusterConfigManager" })
public void testClusterConfigWithExternalHDFS() throws Exception {
String[] hdfsArray =
new String[] { "hdfs://168.192.0.70:8020",
"hdfs://168.192.0.71:8020", "hdfs://168.192.0.72:8020",
"hdfs://168.192.0.73:8020" };
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster-external-hdfs");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
spec.setExternalHDFS(hdfsArray[0]);
String clusterConfigJson =
"{\"configuration\":{\"hadoop\":{\"core-site.xml\":{\"fs.default.name\":\""
+ hdfsArray[1] + "\"}}}}";
Map clusterConfig = (new Gson()).fromJson(clusterConfigJson, Map.class);
spec.setConfiguration((Map<String, Object>) (clusterConfig
.get("configuration")));
//build a jobtracker group, two compute node groups.
NodeGroupCreate ng0 = new NodeGroupCreate();
List<String> computerMasterRoles = new ArrayList<String>();
computerMasterRoles.add("hadoop_resourcemanager");
ng0.setRoles(computerMasterRoles);
ng0.setName("resourcemanager");
ng0.setInstanceNum(1);
ng0.setInstanceType(InstanceType.LARGE);
String ng0ConfigJson =
"{\"configuration\":{\"hadoop\":{\"core-site.xml\":{\"fs.default.name\":\""
+ hdfsArray[2] + "\"}}}}";
Map ng0Config = (new Gson()).fromJson(ng0ConfigJson, Map.class);
ng0.setConfiguration((Map<String, Object>) (ng0Config
.get("configuration")));
NodeGroupCreate ng1 = new NodeGroupCreate();
List<String> computeWorkerRoles = new ArrayList<String>();
computeWorkerRoles.add("hadoop_nodemanager");
ng1.setRoles(computeWorkerRoles);
ng1.setName("compute1");
ng1.setInstanceNum(4);
ng1.setInstanceType(InstanceType.MEDIUM);
StorageRead storage = new StorageRead();
storage.setType("LOCAL");
storage.setSizeGB(10);
ng1.setStorage(storage);
String ng1ConfigJson =
"{\"configuration\":{\"hadoop\":{\"core-site.xml\":{\"fs.default.name\":\""
+ hdfsArray[3] + "\"}}}}";
Map ng1Config = (new Gson()).fromJson(ng1ConfigJson, Map.class);
ng1.setConfiguration((Map<String, Object>) (ng1Config
.get("configuration")));
NodeGroupCreate ng2 = new NodeGroupCreate();
ng2.setRoles(computeWorkerRoles);
ng2.setName("compute2");
ng2.setInstanceNum(2);
ng2.setInstanceType(InstanceType.MEDIUM);
StorageRead storageCompute = new StorageRead();
storageCompute.setType("LOCAL");
storageCompute.setSizeGB(10);
ng2.setStorage(storageCompute);
NodeGroupCreate[] ngs = new NodeGroupCreate[] { ng0, ng1, ng2 };
spec.setNodeGroups(ngs);
spec = ClusterSpecFactory.getCustomizedSpec(spec, null);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findClusterById(1l);
List<ClusterEntity> cs = clusterEntityMgr.findAllClusters();
for (ClusterEntity c : cs) {
System.out.println(c.getId());
}
cluster = clusterEntityMgr.findByName("my-cluster-external-hdfs");
Assert.assertTrue(cluster != null);
Assert.assertEquals(cluster.getAdvancedProperties(), "{\"ExternalHDFS\":\"hdfs://168.192.0.70:8020\"}");
ClusterRead clusterRead = clusterEntityMgr.toClusterRead("my-cluster-external-hdfs", true);
Assert.assertEquals(clusterRead.getExternalHDFS(), "hdfs://168.192.0.70:8020");
ClusterCreate attrs =
clusterConfigMgr.getClusterConfig("my-cluster-external-hdfs");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(
Pattern.compile("([\\s\\S]*" + hdfsArray[0] + "[\\s\\S]*){3}")
.matcher(manifest).matches(),
"\"fs.default.name\" must be coved with external HDFS uri in both of cluster and group configuration.");
Assert.assertTrue(manifest.indexOf(hdfsArray[1]) == -1,
"\"fs.default.name\" must be coved under the cluster level");
Assert.assertTrue(manifest.indexOf(hdfsArray[2]) == -1,
"\"fs.default.name\" must be coved under the node group 1 level");
Assert.assertTrue(manifest.indexOf(hdfsArray[3]) == -1,
"\"fs.default.name\" must be coved under the node group 2 level");
}
@Test(groups = { "TestClusterConfigManager" })
public void testClusterConfigWithExternalMapReduce() throws Exception {
String externalMR = "192.168.0.1:8021";
String externalHDFS = "hdfs://192.168.0.2:8020";
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster-external-mr");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
spec.setExternalMapReduce(externalMR);
spec.setExternalHDFS(externalHDFS);
String clusterConfigJson =
"{\"configuration\":{\"hadoop\":{\"mapred-site.xml\":{\"mapred.job.tracker\":\""
+ externalMR
+ "\"}, \"core-site.xml\":{\"fs.default.name\":\""
+ externalHDFS + "\"}}}}";
Map clusterConfig = (new Gson()).fromJson(clusterConfigJson, Map.class);
spec.setConfiguration((Map<String, Object>) (clusterConfig
.get("configuration")));
// build 3 worker groups
NodeGroupCreate worker = new NodeGroupCreate();
List<String> computeRoles = new ArrayList<String>();
computeRoles.add("hadoop_nodemanager");
worker.setRoles(computeRoles);
worker.setName("compute1");
worker.setInstanceNum(2);
worker.setInstanceType(InstanceType.MEDIUM);
StorageRead storage = new StorageRead();
storage.setType("LOCAL");
storage.setSizeGB(10);
worker.setStorage(storage);
spec.setNodeGroups(new NodeGroupCreate[] { worker });
spec = ClusterSpecFactory.getCustomizedSpec(spec, null);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster =
clusterEntityMgr.findByName("my-cluster-external-mr");
Assert.assertTrue(cluster != null);
Assert.assertEquals(
cluster.getAdvancedProperties(),
"{\"ExternalMapReduce\":\"192.168.0.1:8021\",\"ExternalHDFS\":\"hdfs://192.168.0.2:8020\"}");
ClusterRead clusterRead =
clusterEntityMgr.toClusterRead("my-cluster-external-mr", true);
Assert.assertEquals(clusterRead.getExternalHDFS(),
"hdfs://192.168.0.2:8020");
Assert.assertEquals(clusterRead.getExternalMapReduce(),
"192.168.0.1:8021");
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test(groups = { "TestClusterConfigManager" })
public void testClusterConfigWithExternalHDFSFailure() throws Exception {
String[] hdfsArray =
new String[] { "hdfs://168.192.0.70:8020",
"hdfs://168.192.0.71:8020", "hdfs://168.192.0.72:8020",
"hdfs://168.192.0.73:8020" };
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster-external-hdfs-failure");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
String clusterConfigJson =
"{\"configuration\":{\"hadoop\":{\"core-site.xml\":{\"fs.default.name\":\""
+ hdfsArray[1] + "\"}}}}";
Map clusterConfig = (new Gson()).fromJson(clusterConfigJson, Map.class);
spec.setConfiguration((Map<String, Object>) (clusterConfig
.get("configuration")));
//build a master group, a compute node group and a datanode.
NodeGroupCreate ng0 = new NodeGroupCreate();
List<String> masterRole = new ArrayList<String>();
masterRole.add("hadoop_namenode");
masterRole.add("hadoop_resourcemanager");
ng0.setRoles(masterRole);
ng0.setName("master");
ng0.setInstanceNum(1);
ng0.setInstanceType(InstanceType.LARGE);
String ng0ConfigJson =
"{\"configuration\":{\"hadoop\":{\"core-site.xml\":{\"fs.default.name\":\""
+ hdfsArray[2] + "\"}}}}";
Map ng0Config = (new Gson()).fromJson(ng0ConfigJson, Map.class);
ng0.setConfiguration((Map<String, Object>) (ng0Config
.get("configuration")));
NodeGroupCreate ng1 = new NodeGroupCreate();
List<String> computeRoles = new ArrayList<String>();
computeRoles.add("hadoop_nodemanager");
ng1.setRoles(computeRoles);
ng1.setName("compute1");
ng1.setInstanceNum(4);
ng1.setCpuNum(2);
ng1.setMemCapacityMB(7500);
ng1.setInstanceType(InstanceType.MEDIUM);
StorageRead storage = new StorageRead();
storage.setType("LOCAL");
storage.setSizeGB(10);
ng1.setStorage(storage);
String ng1ConfigJson =
"{\"configuration\":{\"hadoop\":{\"core-site.xml\":{\"fs.default.name\":\""
+ hdfsArray[3] + "\"}}}}";
Map ng1Config = (new Gson()).fromJson(ng1ConfigJson, Map.class);
ng1.setConfiguration((Map<String, Object>) (ng1Config
.get("configuration")));
NodeGroupCreate ng2 = new NodeGroupCreate();
List<String> dataRoles = new ArrayList<String>();
dataRoles.add("hadoop_datanode");
ng2.setRoles(dataRoles);
ng2.setName("data1");
ng2.setInstanceNum(2);
ng2.setInstanceType(InstanceType.MEDIUM);
StorageRead storageCompute = new StorageRead();
storageCompute.setType("LOCAL");
storageCompute.setSizeGB(10);
ng2.setStorage(storageCompute);
NodeGroupCreate[] ngs = new NodeGroupCreate[] { ng0, ng1, ng2 };
spec.setNodeGroups(ngs);
spec = ClusterSpecFactory.getCustomizedSpec(spec, null);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findClusterById(1l);
List<ClusterEntity> cs = clusterEntityMgr.findAllClusters();
for (ClusterEntity c : cs) {
System.out.println(c.getId());
}
cluster = clusterEntityMgr.findByName("my-cluster-external-hdfs-failure");
Assert.assertTrue(cluster != null);
ClusterCreate attrs =
clusterConfigMgr
.getClusterConfig("my-cluster-external-hdfs-failure");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(
Pattern.compile("([\\s\\S]*" + hdfsArray[0] + "[\\s\\S]*){3}")
.matcher(manifest).matches() == false,
"\"fs.default.name\" must be coved with external HDFS uri in both of cluster and group configuration.");
Assert.assertTrue(manifest.indexOf(hdfsArray[1]) != -1,
"\"fs.default.name\" must be coved under the cluster level");
Assert.assertTrue(manifest.indexOf(hdfsArray[2]) != -1,
"\"fs.default.name\" must be coved under the node group 1 level");
Assert.assertTrue(manifest.indexOf(hdfsArray[3]) != -1,
"\"fs.default.name\" must be coved under the node group 2 level");
}
@Test(groups = { "TestClusterConfigManager" }, enabled = false)
public void testClusterConfigWithTempfs() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster-dc-tempfs");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setDistro("apache");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
//build a master group, a datanode group, a compute node group with strict association and tempfs.
NodeGroupCreate[] ngs = new NodeGroupCreate[3];
NodeGroupCreate ng0 = new NodeGroupCreate();
ngs[0] = ng0;
List<String> masterRoles = new ArrayList<String>();
masterRoles.add("hadoop_namenode");
masterRoles.add("hadoop_jobtracker");
ngs[0].setRoles(masterRoles);
ngs[0].setName("master");
ngs[0].setInstanceNum(1);
ngs[0].setInstanceType(InstanceType.LARGE);
NodeGroupCreate ng1 = new NodeGroupCreate();
ngs[1] = ng1;
List<String> dataNodeRoles = new ArrayList<String>();
dataNodeRoles.add("hadoop_datanode");
ngs[1].setRoles(dataNodeRoles);
ngs[1].setName("data");
ngs[1].setInstanceNum(4);
ngs[1].setInstanceType(InstanceType.MEDIUM);
StorageRead storage = new StorageRead();
storage.setType("LOCAL");
storage.setSizeGB(50);
ngs[1].setStorage(storage);
NodeGroupCreate ng2 = new NodeGroupCreate();
ngs[2] = ng2;
List<String> computeNodeRoles = new ArrayList<String>();
computeNodeRoles.add("hadoop_tasktracker");
ngs[2].setRoles(computeNodeRoles);
ngs[2].setName("compute");
ngs[2].setInstanceNum(8);
ngs[2].setInstanceType(InstanceType.MEDIUM);
StorageRead storageCompute = new StorageRead();
storageCompute.setType("TEMPFS");
storageCompute.setSizeGB(50);
ngs[2].setStorage(storageCompute);
PlacementPolicy policy = new PlacementPolicy();
policy.setInstancePerHost(2);
List<GroupAssociation> associates = new ArrayList<GroupAssociation>();
GroupAssociation associate = new GroupAssociation();
associate.setReference("data");
associate.setType(GroupAssociationType.STRICT);
associates.add(associate);
policy.setGroupAssociations(associates);
ngs[2].setPlacementPolicies(policy);
spec.setNodeGroups(ngs);
spec = ClusterSpecFactory.getCustomizedSpec(spec, null);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findClusterById(1l);
List<ClusterEntity> cs = clusterEntityMgr.findAllClusters();
for (ClusterEntity c : cs) {
System.out.println(c.getId());
}
cluster = clusterEntityMgr.findByName("my-cluster-dc-tempfs");
Assert.assertTrue(cluster != null);
ClusterCreate attrs =
clusterConfigMgr.getClusterConfig("my-cluster-dc-tempfs");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(manifest.indexOf("master") != -1,
"manifest should contains nodegroups");
Assert.assertTrue(
manifest.indexOf("[\"tempfs_server\",\"hadoop_datanode\"]") != -1,
"manifest is inconsistent");
Assert.assertTrue(
manifest.indexOf("[\"tempfs_client\",\"hadoop_tasktracker\"]") != -1,
"manifest is inconsistent");
}
public void testClusterConfigWithGroupSlave() {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster1");
spec.setNetworkConfig(createNetConfigs());
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[1];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(10);
group.setInstanceType(InstanceType.SMALL);
group.setHaFlag("off");
group.setName("slave");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_datanode");
group.setRoles(roles);
spec.setNodeGroups(nodegroups);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster1");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster1");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(
manifest.indexOf("master") != -1 && manifest.indexOf("slave") != -1,
"manifest should contains nodegroups");
Assert.assertTrue(
manifest
.indexOf("{\"name\":\"my-cluster1\",\"groups\":[{\"name\":\"expanded_master\",\"roles\":[\"hadoop_namenode\",\"hadoop_jobtracker\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":2,\"memory\":7500,\"ha\":\"on\",\"vm_folder_path\":\"SERENGETI-null/my-cluster1/expanded_master\"},{\"name\":\"slave\",\"roles\":[\"hadoop_datanode\",\"hadoop_tasktracker\"],\"instance_num\":10,\"storage\":{\"type\":\"local\",\"size\":50},\"cpu\":3,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster1/slave\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp2\"]},{\"name\":\"cluster2\",\"vc_rps\":[\"rp1\",\"rp2\"]},{\"name\":\"cluster4\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork1\",\"type\":\"static\",\"gateway\":\"192.168.1.254\",\"netmask\":\"255.255.0.0\",\"dns\":[\"2.2.2.2\"],\"ip\":[\"192.168.1.1-192.168.1.3\",\"192.168.1.102\",\"192.168.1.104-192.168.1.110\"]}]") != -1,
"manifest is inconsistent.");
}
public void testClusterConfigWithGroupSlave2() {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster-slave2");
spec.setNetworkConfig(createNetConfigs());
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[1];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(10);
group.setInstanceType(InstanceType.SMALL);
group.setHaFlag("off");
group.setName("slave");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_tasktracker");
group.setRoles(roles);
spec.setNodeGroups(nodegroups);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster-slave2");
Assert.assertTrue(cluster != null);
ClusterCreate attrs =
clusterConfigMgr.getClusterConfig("my-cluster-slave2");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(
manifest.indexOf("master") != -1 && manifest.indexOf("slave") != -1,
"manifest should contains nodegroups");
Assert.assertTrue(
manifest
.indexOf("{\"name\":\"my-cluster-slave2\",\"groups\":[{\"name\":\"expanded_master\",\"roles\":[\"hadoop_namenode\",\"hadoop_jobtracker\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":2,\"memory\":7500,\"ha\":\"on\",\"vm_folder_path\":\"SERENGETI-null/my-cluster-slave2/expanded_master\"},{\"name\":\"slave\",\"roles\":[\"hadoop_tasktracker\",\"hadoop_datanode\"],\"instance_num\":10,\"storage\":{\"type\":\"local\",\"size\":50},\"cpu\":3,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster-slave2/slave\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp2\"]},{\"name\":\"cluster2\",\"vc_rps\":[\"rp1\",\"rp2\"]},{\"name\":\"cluster4\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork\",\"type\":\"dhcp\"}]") != -1,
"manifest is inconsistent.");
}
public void testClusterCreateWithGroupMaster() {
ClusterCreate spec = new ClusterCreate();
spec.setNetworkConfig(createNetConfigs());
spec.setName("my-cluster2");
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[1];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(1);
group.setInstanceType(InstanceType.LARGE);
group.setHaFlag("off");
group.setName("main_group");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_namenode");
group.setRoles(roles);
spec.setNodeGroups(nodegroups);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster2");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster2");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(
manifest.indexOf("main_group") != -1
&& manifest.indexOf("expanded_master") != -1
&& manifest.indexOf("expanded_worker") != -1,
"manifest should contains nodegroups");
Assert.assertTrue(
manifest
.indexOf("{\"name\":\"my-cluster2\",\"groups\":[{\"name\":\"main_group\",\"roles\":[\"hadoop_namenode\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":100},\"cpu\":3,\"memory\":15000,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster2/main_group\"},{\"name\":\"expanded_master\",\"roles\":[\"hadoop_jobtracker\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":2,\"memory\":7500,\"ha\":\"on\",\"vm_folder_path\":\"SERENGETI-null/my-cluster2/expanded_master\"},{\"name\":\"expanded_worker\",\"roles\":[\"hadoop_datanode\",\"hadoop_tasktracker\"],\"instance_num\":3,\"storage\":{\"type\":\"local\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster2/expanded_worker\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp2\"]},{\"name\":\"cluster2\",\"vc_rps\":[\"rp1\",\"rp2\"]},{\"name\":\"cluster4\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork\",\"type\":\"dhcp\"}]") != -1,
"manifest is inconsistent");
}
public void testClusterConfigWithGroupMasterNeg() {
ClusterCreate spec = new ClusterCreate();
spec.setNetworkConfig(createNetConfigs());
spec.setName("my-cluster3");
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[1];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(10);
group.setInstanceType(InstanceType.LARGE);
group.setName("main_group");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_namenode");
group.setRoles(roles);
spec.setNodeGroups(nodegroups);
try {
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster3");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster3");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(false, "should get exception");
} catch (BddException e) {
Assert.assertTrue(true, "get expected exception.");
}
}
public void testClusterConfigWithGroupMasterNeg1() {
ClusterCreate spec = new ClusterCreate();
spec.setNetworkConfig(createNetConfigs());
spec.setName("my-cluster3");
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[2];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(1);
group.setInstanceType(InstanceType.LARGE);
group.setName("main_group");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_namenode");
group.setRoles(roles);
group = new NodeGroupCreate();
nodegroups[1] = group;
group.setCpuNum(3);
group.setInstanceNum(1);
group.setInstanceType(InstanceType.LARGE);
group.setName("main_group1");
roles = new ArrayList<String>();
roles.add("hadoop_namenode");
group.setRoles(roles);
spec.setNodeGroups(nodegroups);
try {
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster3");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster3");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(false, "should get exception");
} catch (BddException e) {
Assert.assertTrue(e.getErrorId()
.equals("MORE_THAN_ONE_NAMENODE_GROUP")
&& e.getSection().equals("CLUSTER_CONFIG"),
"should get ClusterConfigException.MORE_THAN_ONE_NAMENODE_GROUP exception");
Assert.assertTrue(true, "get expected exception.");
}
}
@Test(groups = { "TestClusterConfigManager" })
public void testClusterConfigWithClusterStorage() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster4");
spec.setNetworkConfig(createNetConfigs());
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
List<String> dsNames = new ArrayList<String>();
dsNames.add("testSharedStore");
dsNames.add("testLocalStore");
spec.setDsNames(dsNames);
spec.setType(ClusterType.HDFS_MAPRED);
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
spec = ClusterSpecFactory.getCustomizedSpec(spec, null);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findClusterById(1l);
List<ClusterEntity> cs = clusterEntityMgr.findAllClusters();
for (ClusterEntity c : cs) {
System.out.println(c.getId());
}
cluster = clusterEntityMgr.findByName("my-cluster4");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster4");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(manifest.indexOf("master") != -1,
"manifest should contains nodegroups");
// Assert.assertTrue("manifest is inconsistent",
// manifest.indexOf("{\"name\":\"my-cluster4\",\"groups\":[{\"name\":\"master\",\"roles\":[\"hadoop_namenode\",\"hadoop_jobtracker\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":2,\"memory\":7500,\"ha\":\"on\",\"vm_folder_path\":\"SERENGETI-null/my-cluster4/master\"},{\"name\":\"worker\",\"roles\":[\"hadoop_datanode\",\"hadoop_tasktracker\"],\"instance_num\":3,\"storage\":{\"type\":\"local\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster4/worker\"},{\"name\":\"client\",\"roles\":[\"hadoop_client\",\"pig\",\"hive\",\"hive_server\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster4/client\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork\",\"type\":\"dhcp\"}]") != -1);
}
@Test(groups = { "TestClusterConfigManager" })
public void testClusterConfigWithGroupStorage() {
ClusterCreate spec = new ClusterCreate();
spec.setNetworkConfig(createNetConfigs());
spec.setName("my-cluster5");
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[1];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(1);
group.setInstanceType(InstanceType.LARGE);
group.setHaFlag("off");
group.setName("main_group");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_namenode");
roles.add("hadoop_resourcemanager");
roles.add("hadoop_datanode");
roles.add("hadoop_nodemanager");
group.setRoles(roles);
StorageRead storage = new StorageRead();
storage.setSizeGB(50);
storage.setType(DatastoreType.LOCAL.toString());
storage.setDiskNum(2);
storage.setShareDatastore(false);
group.setStorage(storage);
spec.setNodeGroups(nodegroups);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster5");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster5");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(
manifest
.indexOf("\"groups\":[{\"name\":\"main_group\",\"roles\":[\"hadoop_namenode\",\"hadoop_resourcemanager\",\"hadoop_datanode\",\"hadoop_nodemanager\"],\"instance_num\":1,\"storage\":{\"type\":\"local\",\"shares\":\"NORMAL\",\"sizeGB\":50,\"diskNum\":2,\"shareDatastore\":false},\"cpu\":3,\"memory\":15000") >= 0,
"manifest is inconsistent");
}
@Test(groups = { "TestClusterConfigManager" })
public void testClusterConfigWithGroupStoragePattern() {
ClusterCreate spec = new ClusterCreate();
spec.setNetworkConfig(createNetConfigs());
spec.setName("my-cluster6");
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[1];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(1);
group.setInstanceType(InstanceType.LARGE);
group.setHaFlag("off");
group.setName("main_group");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_namenode");
roles.add("hadoop_resourcemanager");
roles.add("hadoop_datanode");
roles.add("hadoop_nodemanager");
group.setRoles(roles);
StorageRead storage = new StorageRead();
storage.setType(DatastoreType.LOCAL.toString());
List<String> dsNames = new ArrayList<String>();
dsNames.add("testSharedStore");
dsNames.add("testLocalStore");
storage.setDsNames(dsNames);
group.setStorage(storage);
spec.setNodeGroups(nodegroups);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster6");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster6");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertEquals(attrs.getNodeGroup("main_group").getStorage().getDiskstoreNamePattern().toString(),
"[share1, share2, local1, vmfs.*]");
}
public void testClusterConfigWithNoSlave() {
ClusterCreate spec = new ClusterCreate();
spec.setNetworkConfig(createNetConfigs());
spec.setName("my-cluster7");
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[1];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(1);
group.setInstanceType(InstanceType.LARGE);
group.setHaFlag("off");
group.setName("main_group");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_namenode");
roles.add("hadoop_jobtracker");
group.setRoles(roles);
spec.setNodeGroups(nodegroups);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster7");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster7");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(
manifest.indexOf("main_group") != -1
&& manifest.indexOf("expanded_worker") != -1,
"manifest should contains nodegroups");
Assert.assertTrue(
manifest
.indexOf("{\"name\":\"my-cluster7\",\"groups\":[{\"name\":\"main_group\",\"roles\":[\"hadoop_namenode\",\"hadoop_jobtracker\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":100},\"cpu\":3,\"memory\":15000,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster7/main_group\"},{\"name\":\"expanded_worker\",\"roles\":[\"hadoop_datanode\",\"hadoop_tasktracker\"],\"instance_num\":3,\"storage\":{\"type\":\"local\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster7/expanded_worker\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp2\"]},{\"name\":\"cluster2\",\"vc_rps\":[\"rp1\",\"rp2\"]},{\"name\":\"cluster4\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork\",\"type\":\"dhcp\"}]") != -1,
"manifest is inconsistent");
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test(groups = { "TestClusterConfigManager" })
public void testClusterAppConfig() throws Exception {
ClusterCreate spec = new ClusterCreate();
spec.setName("my-cluster8");
List<String> rps = new ArrayList<String>();
rps.add("myRp1");
spec.setRpNames(rps);
spec.setNetworkConfig(createNetConfigs());
spec.setType(ClusterType.HDFS_MAPRED);
spec.setDistro("bigtop");
spec.setDistroVendor(Constants.DEFAULT_VENDOR);
spec = ClusterSpecFactory.getCustomizedSpec(spec, null);
spec.setType(null);
String configJson =
"{\"cluster_configuration\":{\"hadoop\":{\"core-site.xml\":{\"hadoop.security.group.mapping\":\"xyz\",\"hadoop.security.authorization\":true}}}}";
Map config = (new Gson()).fromJson(configJson, Map.class);
spec.setConfiguration((Map<String, Object>) (config
.get("cluster_configuration")));
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findClusterById(1l);
List<ClusterEntity> cs = clusterEntityMgr.findAllClusters();
for (ClusterEntity c : cs) {
System.out.println(c.getId());
}
cluster = clusterEntityMgr.findByName("my-cluster8");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster8");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(manifest.indexOf("master") != -1,
"manifest should contains nodegroups");
Assert.assertTrue(
// manifest.indexOf("{\"name\":\"my-cluster8\",\"groups\":[{\"name\":\"master\",\"roles\":[\"hadoop_namenode\",\"hadoop_jobtracker\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":2,\"memory\":7500,\"ha\":\"on\",\"vm_folder_path\":\"SERENGETI-null/my-cluster8/master\"},{\"name\":\"worker\",\"roles\":[\"hadoop_datanode\",\"hadoop_tasktracker\"],\"instance_num\":3,\"storage\":{\"type\":\"local\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster8/worker\"},{\"name\":\"client\",\"roles\":[\"hadoop_client\",\"pig\",\"hive\",\"hive_server\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster8/client\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork\",\"type\":\"dhcp\"}]") != -1 &&
manifest
.indexOf("\"cluster_configuration\":{\"hadoop\":{\"core-site.xml\":{\"hadoop.security.group.mapping\":\"xyz\",\"hadoop.security.authorization\":true}}}") != -1,
"manifest is inconsistent");
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public void testGroupMasterWithGroupAppConfig() {
ClusterCreate spec = new ClusterCreate();
spec.setNetworkConfig(createNetConfigs());
spec.setName("my-cluster9");
List<String> rps = new ArrayList<String>();
rps.add("myRp2");
rps.add("myRp3");
rps.add("myRp4");
rps.add("myRp5");
spec.setRpNames(rps);
NodeGroupCreate[] nodegroups = new NodeGroupCreate[1];
NodeGroupCreate group = new NodeGroupCreate();
nodegroups[0] = group;
group.setCpuNum(3);
group.setInstanceNum(1);
group.setInstanceType(InstanceType.LARGE);
group.setHaFlag("off");
group.setName("main_group");
List<String> roles = new ArrayList<String>();
roles.add("hadoop_namenode");
group.setRoles(roles);
String configJson =
"{\"cluster_configuration\":{\"hadoop\":{\"core-site.xml\":{\"hadoop.security.group.mapping\":\"xxx\",\"hadoop.security.authorization\":false}}}}";
Map config = (new Gson()).fromJson(configJson, Map.class);
group.setConfiguration((Map<String, Object>) (config
.get("cluster_configuration")));
spec.setNodeGroups(nodegroups);
clusterConfigMgr.createClusterConfig(spec);
ClusterEntity cluster = clusterEntityMgr.findByName("my-cluster9");
Assert.assertTrue(cluster != null);
ClusterCreate attrs = clusterConfigMgr.getClusterConfig("my-cluster9");
String manifest = gson.toJson(attrs);
System.out.println(manifest);
Assert.assertTrue(
manifest.indexOf("main_group") != -1
&& manifest.indexOf("expanded_master") != -1
&& manifest.indexOf("expanded_worker") != -1,
"manifest should contains nodegroups");
Assert.assertTrue(
manifest
.indexOf("{\"name\":\"my-cluster9\",\"groups\":[{\"name\":\"main_group\",\"roles\":[\"hadoop_namenode\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":100},\"cpu\":3,\"memory\":15000,\"ha\":\"off\",\"cluster_configuration\":{\"hadoop\":{\"core-site.xml\":{\"hadoop.security.group.mapping\":\"xxx\",\"hadoop.security.authorization\":false}}},\"vm_folder_path\":\"SERENGETI-null/my-cluster9/main_group\"},{\"name\":\"expanded_master\",\"roles\":[\"hadoop_jobtracker\"],\"instance_num\":1,\"storage\":{\"type\":\"shared\",\"size\":50},\"cpu\":2,\"memory\":7500,\"ha\":\"on\",\"vm_folder_path\":\"SERENGETI-null/my-cluster9/expanded_master\"},{\"name\":\"expanded_worker\",\"roles\":[\"hadoop_datanode\",\"hadoop_tasktracker\"],\"instance_num\":3,\"storage\":{\"type\":\"local\",\"size\":50},\"cpu\":1,\"memory\":3748,\"ha\":\"off\",\"vm_folder_path\":\"SERENGETI-null/my-cluster9/expanded_worker\"}],\"distro\":\"apache\",\"vc_clusters\":[{\"name\":\"cluster1\",\"vc_rps\":[\"rp2\"]},{\"name\":\"cluster2\",\"vc_rps\":[\"rp1\",\"rp2\"]},{\"name\":\"cluster4\",\"vc_rps\":[\"rp1\"]}],\"template_id\":\"vm-001\",\"networking\":[{\"port_group\":\"CFNetwork\",\"type\":\"dhcp\"}]") != -1,
"manifest is inconsistent");
}
}