/***************************************************************************
* 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.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import com.cloudera.api.model.ApiCluster;
import com.cloudera.api.model.ApiClusterList;
import com.cloudera.api.model.ApiCommand;
import com.cloudera.api.model.ApiHostRef;
import com.cloudera.api.model.ApiRoleState;
import com.cloudera.api.model.ApiService;
import com.cloudera.api.model.ApiServiceList;
import com.cloudera.api.model.ApiServiceState;
import com.cloudera.api.v1.CommandsResource;
import com.cloudera.api.v6.ClustersResourceV6;
import com.cloudera.api.v6.RolesResourceV6;
import com.cloudera.api.v6.ServicesResourceV6;
import com.vmware.bdd.exception.SoftwareManagerCollectorException;
import com.vmware.bdd.plugin.clouderamgr.service.cm.FakeClustersResource;
import com.vmware.bdd.plugin.clouderamgr.service.cm.FakeHostsResource;
import com.vmware.bdd.plugin.clouderamgr.service.cm.FakeRolesResource;
import com.vmware.bdd.software.mgmt.plugin.model.NodeInfo;
import mockit.Mock;
import mockit.MockClass;
import mockit.Mockit;
import org.apache.log4j.Logger;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.cloudera.api.ApiRootResource;
import com.cloudera.api.DataView;
import com.cloudera.api.model.ApiHealthSummary;
import com.cloudera.api.model.ApiHost;
import com.cloudera.api.model.ApiHostList;
import com.cloudera.api.model.ApiRole;
import com.cloudera.api.model.ApiRoleList;
import com.cloudera.api.model.ApiRoleRef;
import com.cloudera.api.v6.RootResourceV6;
import com.cloudera.api.v7.RootResourceV7;
import com.vmware.bdd.plugin.clouderamgr.poller.host.HostInstallPoller;
import com.vmware.bdd.plugin.clouderamgr.service.cm.FakeRootResource;
import com.vmware.bdd.plugin.clouderamgr.service.cm.FakeRootResourceV7;
import com.vmware.bdd.software.mgmt.plugin.exception.SoftwareManagementPluginException;
import com.vmware.bdd.software.mgmt.plugin.intf.PreStartServices;
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.monitor.ClusterReport;
import com.vmware.bdd.software.mgmt.plugin.monitor.ClusterReportQueue;
import com.vmware.bdd.software.mgmt.plugin.monitor.ServiceStatus;
import com.vmware.bdd.software.mgmt.plugin.utils.ReflectionUtils;
import com.vmware.bdd.software.mgmt.plugin.utils.SerialUtils;
import com.vmware.bdd.utils.CommonUtil;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
/**
* Author: Xiaoding Bian
* Date: 7/5/14
* Time: 9:51 PM
*/
public class TestClouderaManagerImpl {
private static final Logger logger = Logger.getLogger(TestClouderaManagerImpl.class);
private static ApiRootResource apiRootResource;
private static RootResourceV6 rootResourceV6;
private static RootResourceV7 rootResourceV7;
private static ClouderaManagerImpl provider;
private static ClusterBlueprint blueprint;
private static ClusterReportQueue reportQueue;
@MockClass(realClass = ClouderaManagerClientBuilder.class)
public static class MockClouderaManagerClientBuilder {
private ClouderaManagerClientBuilder builder = new ClouderaManagerClientBuilder();
@Mock
public ClouderaManagerClientBuilder withHost(String host) {
return builder;
}
@Mock
public ClouderaManagerClientBuilder withPort(int port) {
return builder;
}
@Mock
public ClouderaManagerClientBuilder withUsernamePassword(String user, String password) {
return builder;
}
@Mock
public ApiRootResource build() {
return apiRootResource;
}
}
@MockClass(realClass = HostInstallPoller.class)
public static class MockHostInstallPoller {
@Mock
public void setup() {
}
@Mock
public boolean poll() {
return true;
}
@Mock
public void tearDown() {
}
}
@MockClass(realClass = ReflectionUtils.class)
public static class MockReflectionUtils {
@Mock
public static PreStartServices getPreStartServicesHook() {
return new PreStartServices() {
@Override
public void preStartServices(String clusterName, List<String> addedNodeNames, boolean force) throws SoftwareManagementPluginException {
}
@Override
public void preStartServices(String clusterName) throws SoftwareManagementPluginException {
}
};
}
}
@MockClass(realClass = CmClusterValidator.class)
public static class MockCmClusterValidator {
@Mock
public boolean validateBlueprint(ClusterBlueprint blueprint) {
return true;
}
}
@BeforeClass( groups = { "TestClouderaManagerImpl" }, dependsOnGroups = { "TestClusterDef" })
public static void setup() throws IOException {
setupMocks();
provider = new ClouderaManagerImpl("127.0.0.1", 7180, "admin", "admin", "RSA_CERT");
blueprint = SerialUtils.getObjectByJsonString(ClusterBlueprint.class, CommonUtil.readJsonFile("simple_blueprint.json"));
reportQueue = new ClusterReportQueue();
}
@AfterClass( groups = { "TestClouderaManagerImpl" }, dependsOnGroups = { "TestClusterDef" })
public static void tearDown() throws IOException, InterruptedException {
Mockit.tearDownMocks();
}
@BeforeMethod(groups = { "TestClouderaManagerImpl" })
public void setupBeforeMethod() {
}
@Test( groups = { "TestClouderaManagerImpl" })
public void testGetName() {
Assert.assertEquals(provider.getName(), "ClouderaManager");
}
@Test( groups = { "TestClouderaManagerImpl" })
public void testGetSupportedStacks() {
List<HadoopStack> stacks = provider.getSupportedStacks();
Assert.assertTrue(stacks.get(0).getDistro().equals("CDH-5.0.2"));
Assert.assertTrue(stacks.get(0).getRoles().contains("YARN_NODE_MANAGER"));
Assert.assertTrue(stacks.get(1).getDistro().equals("CDH-4.7.0"));
Assert.assertFalse(stacks.get(1).getRoles().contains("YARN_NODE_MANAGER"));
}
@Test( groups = { "TestClouderaManagerImpl" })
public void testGetSupportedConfigs() {
HadoopStack stack = new HadoopStack();
stack.setDistro("CDH-5.0.1");
String configs = provider.getSupportedConfigs(stack);
System.out.println(configs);
}
@Test( groups = { "TestClouderaManagerImpl" })
public void testCreateCluster() {
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
// FakeParcelsResource#getParcelResource should print the right parcel version
provider.createCluster(blueprint, reportQueue);
provider.reconfigCluster(blueprint, reportQueue);
provider.onDeleteCluster(blueprint, reportQueue);
provider.deleteCluster(blueprint, reportQueue);
List<ClusterReport> reports = reportQueue.pollClusterReport();
for (ClusterReport report : reports) {
System.out.println("Action: " + report.getAction() + ", Progress: " + report.getProgress());
}
}
@Test( groups = { "TestClouderaManagerImpl" })
public void testCreateNnHa() throws IOException {
ClusterBlueprint haSpec = SerialUtils.getObjectByJsonString(ClusterBlueprint.class, CommonUtil.readJsonFile("namenode_ha.json"));
provider.createCluster(haSpec, reportQueue);
List<ClusterReport> reports = reportQueue.pollClusterReport();
for (ClusterReport report : reports) {
System.out.println("Action: " + report.getAction() + ", Progress: " + report.getProgress());
}
}
@Test( groups = { "TestClouderaManagerImpl" }, dependsOnMethods = { "testCreateCluster" })
public void testQueryClusterStatus() {
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
ApiHostList hostList = rootResourceV6.getHostsResource().readHosts(DataView.SUMMARY);
List<ApiHost> hosts = hostList.getHosts();
hosts.get(0).setHealthSummary(ApiHealthSummary.BAD);
hosts.get(1).setHealthSummary(ApiHealthSummary.CONCERNING);
hosts.get(2).setHealthSummary(ApiHealthSummary.GOOD);
hosts.get(3).setHealthSummary(ApiHealthSummary.NOT_AVAILABLE);
List<ApiRoleRef> roleRefs = new ArrayList<>();
String hdfsServiceName = blueprint.getName() + "_HDFS";
String yarnServiceName = blueprint.getName() + "_YARN";
ApiRoleList roleList =
rootResourceV6.getClustersResource()
.getServicesResource(blueprint.getName())
.getRolesResource(hdfsServiceName).readRoles();
for (ApiRole role : roleList.getRoles()) {
if (role.getHostRef().getHostId().equals(hosts.get(2).getHostId())) {
ApiRoleRef roleRef = new ApiRoleRef();
roleRef.setClusterName(blueprint.getName());
roleRef.setServiceName(hdfsServiceName);
roleRef.setRoleName(role.getName());
roleRefs.add(roleRef);
}
}
roleList =
rootResourceV6.getClustersResource()
.getServicesResource(blueprint.getName())
.getRolesResource(yarnServiceName).readRoles();
for (ApiRole role : roleList.getRoles()) {
if (role.getHostRef().getHostId().equals(hosts.get(2).getHostId())) {
ApiRoleRef roleRef = new ApiRoleRef();
roleRef.setClusterName(blueprint.getName());
roleRef.setServiceName(yarnServiceName);
roleRef.setRoleName(role.getName());
roleRefs.add(roleRef);
}
}
hosts.get(2).setRoleRefs(roleRefs);
ClusterReport report = provider.queryClusterStatus(blueprint);
Assert.assertTrue(report.getStatus() != null
&& report.getStatus() == ServiceStatus.STOPPED,
"Status should be stopped, but got " + report.getStatus());
System.out.println("Status: " + report.getStatus());
}
@Test( groups = { "TestClouderaManagerImpl" }, dependsOnMethods = { "testQueryClusterStatus" })
public void testScaleOutCluster() {
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
// FakeParcelsResource#getParcelResource should print the right parcel version
List<String> addedNodeNames = new ArrayList<>();
for (NodeGroupInfo groupInfo : blueprint.getNodeGroups()) {
int instanceNum = groupInfo.getNodes().size();
if (instanceNum > 1) {
addedNodeNames.add(groupInfo.getNodes().get(instanceNum - 1).getName());
}
}
provider.scaleOutCluster(blueprint, addedNodeNames, reportQueue, false);
List<ClusterReport> reports = reportQueue.pollClusterReport();
for (ClusterReport report : reports) {
System.out.println("Action: " + report.getAction() + ", Progress: " + report.getProgress());
if (report.isFinished()) {
Assert.assertTrue(report.isSuccess(), "Should get success result.");
}
}
}
//Todo(qjin):check whether return in early stage
@Test( groups = { "TestClouderaManagerImpl" }, dependsOnMethods = { "testScaleOutCluster" })
public void testStartStartedCluster() {
Mockit.setUpMock(MockReflectionUtils.class);
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
provider.startCluster(blueprint, reportQueue);
List<ClusterReport> reports = reportQueue.pollClusterReport();
for (ClusterReport report : reports) {
if (report.isFinished()) {
System.out.println("Starting Services finished.");
Assert.assertEquals(ServiceStatus.STARTED, report.getStatus(), "Cluster status should be STARTED");
Assert.assertEquals("", report.getAction(), "Cluster action should be empty");
Assert.assertTrue(report.isSuccess(), "Should get success result.");
}
}
}
@Test( groups = { "TestClouderaManagerImpl" }, dependsOnMethods = { "testStartStartedCluster" })
public void testStopStartedCluster() {
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
provider.onStopCluster(blueprint, reportQueue);
List<ClusterReport> reports = reportQueue.pollClusterReport();
for (ClusterReport report : reports) {
if (!CommonUtil.isBlank(report.getAction())) {
Assert.assertEquals(reports.get(0).getAction(), "Stopping Services", "Should get Stopping Services action.");
System.out.println("BDE is Stopping Services");
}
if (report.isFinished()) {
System.out.println("Stopping Services finished.");
Assert.assertEquals(ServiceStatus.STOPPED, report.getStatus(), "Cluster status should be STOPPED");
Assert.assertEquals("", report.getAction(), "Cluster action should be empty");
Assert.assertTrue(report.isSuccess(), "Should get success result.");
}
}
}
@Test( groups = { "TestClouderaManagerImpl" }, dependsOnMethods = { "testStopStartedCluster" })
public void testStopStoppedCluster() {
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
provider.onStopCluster(blueprint, reportQueue);
List<ClusterReport> reports = reportQueue.pollClusterReport();
for (ClusterReport report : reports) {
if (report.isFinished()) {
System.out.println("Stopping Services finished.");
Assert.assertEquals(ServiceStatus.STOPPED, report.getStatus(), "Cluster status should be STOPPED");
Assert.assertEquals("", report.getAction(), "Cluster action should be empty");
Assert.assertTrue(report.isSuccess(), "Should get success result.");
}
}
}
@Test( groups = { "TestClouderaManagerImpl" }, dependsOnMethods = { "testStopStoppedCluster" })
public void testStartStoppedCluster() {
Mockit.setUpMock(MockReflectionUtils.class);
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
provider.startCluster(blueprint, reportQueue);
List<ClusterReport> reports = reportQueue.pollClusterReport();
for (ClusterReport report : reports) {
if (!CommonUtil.isBlank(report.getAction())) {
Assert.assertEquals(reports.get(0).getAction(), "Starting Services", "Should get Stopping Services action.");
System.out.println("BDE is Starting Services");
}
if (report.isFinished()) {
System.out.println("Starting Services finished.");
Assert.assertEquals(ServiceStatus.STARTED, report.getStatus(), "Cluster status should be STARTED");
Assert.assertEquals("", report.getAction(), "Cluster action should be empty");
Assert.assertTrue(report.isSuccess(), "Should get success result.");
}
}
}
//add this helper function to fix strange ut failure in testStopClusterGotException and testStartClusterGotException
//when use mvn to do unit test. In my IntelliJ IDEA, the above
//two UTs works fine, but it cannot work in mvn test
private static void setupMocks() {
Mockit.setUpMock(MockClouderaManagerClientBuilder.class);
Mockit.setUpMock(MockHostInstallPoller.class);
Mockit.setUpMock(MockReflectionUtils.class);
Mockit.setUpMock(MockCmClusterValidator.class);
apiRootResource = Mockito.mock(ApiRootResource.class);
rootResourceV6 = new FakeRootResource();
rootResourceV7 = new FakeRootResourceV7();
Mockito.when(apiRootResource.getRootV6()).thenReturn(rootResourceV6);
Mockito.when(apiRootResource.getRootV7()).thenReturn(rootResourceV7);
Mockito.when(apiRootResource.getCurrentVersion()).thenReturn("v7");
}
@Test (groups = { "TestClouderaManagerImpl" }, dependsOnMethods = { "testStartStoppedCluster" })
public void testStopClusterGotException() {
setupMocks();
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
ClustersResourceV6 resourceV6 = Mockito.mock(FakeClustersResource.class);
Mockito.when(resourceV6.stopCommand(blueprint.getName())).thenThrow(
SoftwareManagementPluginException.STOP_CLUSTER_FAILED(null, null, blueprint.getName()));
ServicesResourceV6 servicesResourceV6 = Mockito.mock(ServicesResourceV6.class);
List<ApiService> serviceList = new ArrayList<>();
ApiService hdfs = new ApiService();
hdfs.setName("HDFS");
hdfs.setServiceState(ApiServiceState.STARTED);
serviceList.add(hdfs);
ApiServiceList apiServiceList = new ApiServiceList();
apiServiceList.setServices(serviceList);
Mockito.when(servicesResourceV6.readServices((DataView) anyObject())).thenReturn(apiServiceList);
List<ApiRole> roleList = new ArrayList<>();
ApiRole role = new ApiRole();
role.setName("NAMENODE");
role.setRoleState(ApiRoleState.STARTED);
role.setType(role.getName());
ApiHostRef hostRef = new ApiHostRef("host1");
role.setHostRef(hostRef);
roleList.add(role);
RolesResourceV6 rolesResourceV6 = new FakeRolesResource(roleList);
Mockito.when(servicesResourceV6.getRolesResource(hdfs.getName())).thenReturn(rolesResourceV6);
Mockito.when(resourceV6.getServicesResource(blueprint.getName())).thenReturn(servicesResourceV6);
ApiClusterList apiClusterList = new ApiClusterList();
ApiCluster apiCluster = new ApiCluster();
apiCluster.setName(blueprint.getName());
apiClusterList.add(apiCluster);
Mockito.when(resourceV6.readClusters((DataView) anyObject())).thenReturn(apiClusterList);
RootResourceV6 fakeRootResourceV6 = Mockito.mock(FakeRootResource.class);
Mockito.when(fakeRootResourceV6.getClustersResource()).thenReturn(resourceV6);
FakeHostsResource fakeHostsResource = Mockito.mock(FakeHostsResource.class);
ApiHost apiHost = Mockito.mock(ApiHost.class);
Mockito.when(apiHost.getIpAddress()).thenReturn("127.0.0.1");
Mockito.when(fakeHostsResource.readHost(anyString())).thenReturn(apiHost);
Mockito.when(fakeRootResourceV6.getHostsResource()).thenReturn(fakeHostsResource);
Mockito.when(apiRootResource.getRootV6()).thenReturn(fakeRootResourceV6);
boolean exceptionExist = false;
try {
ClouderaManagerImpl mockedProvider = new ClouderaManagerImpl("127.0.0.1", 7180, "admin", "admin", "RSA_CERT");
mockedProvider.onStopCluster(blueprint, reportQueue);
} catch (SoftwareManagementPluginException e) {
exceptionExist = true;
Assert.assertEquals(e.getMessage(), "An exception happens when Application Manager (ClouderaManager) tries to stop the cluster: cluster01.");
}
Assert.assertTrue(exceptionExist);
Mockito.when(apiRootResource.getRootV6()).thenReturn(rootResourceV6);
}
@Test (groups = { "TestClouderaManagerImpl" }, dependsOnMethods = { "testStopClusterGotException" })
public void testStartClusterGotException() {
setupMocks();
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
provider.onStopCluster(blueprint, reportQueue);
blueprint.getHadoopStack().setDistro("CDH-5.0.1");
ClustersResourceV6 resourceV6 = Mockito.mock(FakeClustersResource.class);
Mockito.when(resourceV6.startCommand(blueprint.getName())).thenThrow(
SoftwareManagementPluginException.START_CLUSTER_FAILED(null, null, blueprint.getName()));
ServicesResourceV6 servicesResourceV6 = Mockito.mock(ServicesResourceV6.class);
List<ApiService> serviceList = new ArrayList<>();
ApiService hdfs = new ApiService();
hdfs.setName("HDFS");
hdfs.setServiceState(ApiServiceState.STOPPED);
serviceList.add(hdfs);
ApiServiceList apiServiceList = new ApiServiceList();
apiServiceList.setServices(serviceList);
Mockito.when(servicesResourceV6.readServices((DataView) anyObject())).thenReturn(apiServiceList);
List<ApiRole> roleList = new ArrayList<>();
ApiRole role = new ApiRole();
role.setName("NAMENODE");
role.setRoleState(ApiRoleState.STOPPED);
role.setType(role.getName());
ApiHostRef hostRef = new ApiHostRef("host1");
role.setHostRef(hostRef);
roleList.add(role);
RolesResourceV6 rolesResourceV6 = new FakeRolesResource(roleList);
Mockito.when(servicesResourceV6.getRolesResource(hdfs.getName())).thenReturn(rolesResourceV6);
Mockito.when(resourceV6.getServicesResource(blueprint.getName())).thenReturn(servicesResourceV6);
ApiClusterList apiClusterList = new ApiClusterList();
ApiCluster apiCluster = new ApiCluster();
apiCluster.setName(blueprint.getName());
apiClusterList.add(apiCluster);
Mockito.when(resourceV6.readClusters((DataView) anyObject())).thenReturn(apiClusterList);
RootResourceV6 fakeRootResourceV6 = Mockito.mock(FakeRootResource.class);
Mockito.when(fakeRootResourceV6.getClustersResource()).thenReturn(resourceV6);
FakeHostsResource fakeHostsResource = Mockito.mock(FakeHostsResource.class);
ApiHost apiHost = Mockito.mock(ApiHost.class);
Mockito.when(apiHost.getIpAddress()).thenReturn("127.0.0.1");
Mockito.when(fakeHostsResource.readHost(anyString())).thenReturn(apiHost);
Mockito.when(fakeRootResourceV6.getHostsResource()).thenReturn(fakeHostsResource);
Mockito.when(apiRootResource.getRootV6()).thenReturn(fakeRootResourceV6);
boolean exceptionExist = false;
try {
ClouderaManagerImpl mockedProvider = new ClouderaManagerImpl("127.0.0.1", 7180, "admin", "admin", "RSA_CERT");
mockedProvider.startCluster(blueprint, reportQueue);
} catch (SoftwareManagementPluginException e) {
exceptionExist = true;
Assert.assertEquals(e.getMessage(), "Application Manager (ClouderaManager) fails to start the cluster: cluster01.");
}
Assert.assertTrue(exceptionExist);
Mockito.when(apiRootResource.getRootV6()).thenReturn(rootResourceV6);
}
private ClouderaManagerImpl testValidateServerVersionHelper(String version) {
ClouderaManagerImpl mockedProvider = Mockito.mock(ClouderaManagerImpl.class);
Mockito.when(mockedProvider.getVersion()).thenReturn(version);
Mockito.when(mockedProvider.validateServerVersion()).thenCallRealMethod();
Mockito.when(mockedProvider.getType()).thenCallRealMethod();
return mockedProvider;
}
private final static String[][] invalidServerVersion = new String[][] {
{"0.0.0"},
{"1.1.0"},
{"4.9.0"}
};
@DataProvider(name = "TestClouderaManagerImpl.InvalidServerVersion")
public String[][] getInvalidServerVersion() {
return invalidServerVersion;
}
@Test( groups = { "TestClouderaManagerImpl" }, dataProvider = "TestClouderaManagerImpl.InvalidServerVersion")
public void testValidateServerVersionFailed(String invalidVersion) {
ClouderaManagerImpl mockedProvider = testValidateServerVersionHelper(invalidVersion);
boolean exceptionExists = false;
try {
mockedProvider.validateServerVersion();
} catch (SoftwareManagerCollectorException e) {
exceptionExists = true;
String expectedErrMsg = "The software manager type " + mockedProvider.getType() + " version " + invalidVersion + " is not supported yet.";
Assert.assertEquals(e.getMessage(), expectedErrMsg);
}
Assert.assertTrue(exceptionExists);
}
@Test( groups = { "TestClouderaManagerImpl" } )
public void testValidateServerVersionSucceed() {
String validVersion = "5.0.0";
ClouderaManagerImpl mockedProvider = testValidateServerVersionHelper(validVersion);
boolean exceptionExists = false;
try {
mockedProvider.validateServerVersion();
} catch (SoftwareManagerCollectorException e) {
exceptionExists = true;
String expectedErrMsg = "The software manager type " + mockedProvider.getType() + " version " + validVersion + " is not supported yet.";
Assert.assertEquals(e.getMessage(), expectedErrMsg);
}
Assert.assertFalse(exceptionExists);
}
@Test ( groups = {"TestClouderaManagerImpl"}, dependsOnMethods = { "testStartStoppedCluster" } )
public void testOnDeleteNodes() {
List<String> nodeNames = new ArrayList<>();
List<NodeGroupInfo> nodeGroupInfos = blueprint.getNodeGroups();
for (NodeGroupInfo info : nodeGroupInfos) {
List<NodeInfo> nodeInfos = info.getNodes();
for (NodeInfo nodeInfo : nodeInfos) {
if (!CommonUtil.isBlank(nodeInfo.getName())) {
nodeNames.add(nodeInfo.getName());
}
}
}
Assert.assertTrue(!nodeNames.isEmpty());
Assert.assertTrue(provider.onDeleteNodes(blueprint, nodeNames));
}
@Test (groups = { "TestClouderaManagerImpl" })
public void testGetSummaryErrorMsg() {
Method method = null;
try {
method = ClouderaManagerImpl.class.getDeclaredMethod("getSummaryErrorMsg", ApiCommand.class, String.class);
method.setAccessible(true);
ApiCommand apiCommand = new ApiCommand();
apiCommand.setId(new Long(1));
CommandsResource fakeCommandResource = new CommandsResource() {
@Override
public ApiCommand readCommand(long commandId) {
ApiCommand command = new ApiCommand();
command.setId(new Long(1));
command.setResultMessage("TestGetSummaryErrorMsg");
return command;
}
@Override
public ApiCommand abortCommand(long commandId) {
return null;
}
};
RootResourceV6 mockRootResourceV6 = Mockito.mock(RootResourceV6.class);
Mockito.when(mockRootResourceV6.getCommandsResource()).thenReturn(fakeCommandResource);
Mockito.when(apiRootResource.getRootV6()).thenReturn(mockRootResourceV6);
ClouderaManagerImpl localProvider = new ClouderaManagerImpl("127.0.0.1", 7180, "admin", "admin", "RSA_CERT");
Object errMsg = method.invoke(localProvider, apiCommand, "http://domain");
Assert.assertTrue(errMsg instanceof String);
Assert.assertEquals(errMsg, "TestGetSummaryErrorMsg. Please refer to http://domain/cmf/command/1/details for details");
//should not throw exception, if got exception, use assertTrue(false) to break ut actively
} catch (NoSuchMethodException e) {
Assert.assertTrue(false);
} catch (InvocationTargetException e) {
Assert.assertTrue(false);
} catch (IllegalAccessException e) {
Assert.assertTrue(false);
} finally {
if (method != null) {
method.setAccessible(false);
}
Mockito.when(apiRootResource.getRootV6()).thenReturn(rootResourceV6);
}
}
}