blob: 80146c32c20821c5e02c906930aad3ca2e3e5589 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.hadoop.yarn.client.cli;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationReport;
import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
import org.apache.hadoop.yarn.api.records.NodeHealthStatus;
import org.apache.hadoop.yarn.api.records.NodeId;
import org.apache.hadoop.yarn.api.records.NodeReport;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.apache.hadoop.yarn.client.YarnClient;
import org.apache.hadoop.yarn.factories.RecordFactory;
import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
import org.apache.hadoop.yarn.util.BuilderUtils;
import org.apache.hadoop.yarn.util.Records;
import org.junit.Before;
import org.junit.Test;
public class TestYarnCLI {
private static final RecordFactory recordFactory = RecordFactoryProvider
.getRecordFactory(null);
private YarnClient client = mock(YarnClient.class);
ByteArrayOutputStream sysOutStream;
private PrintStream sysOut;
ByteArrayOutputStream sysErrStream;
private PrintStream sysErr;
@Before
public void setup() {
sysOutStream = new ByteArrayOutputStream();
sysOut = spy(new PrintStream(sysOutStream));
sysErrStream = new ByteArrayOutputStream();
sysErr = spy(new PrintStream(sysErrStream));
}
@Test
public void testGetApplicationReport() throws Exception {
ApplicationCLI cli = createAndGetAppCLI();
ApplicationId applicationId = BuilderUtils.newApplicationId(1234, 5);
ApplicationReport newApplicationReport = BuilderUtils.newApplicationReport(
applicationId,
"user", "queue", "appname", "host", 124, null,
YarnApplicationState.FINISHED, "diagnostics", "url", 0, 0,
FinalApplicationStatus.SUCCEEDED, null, "N/A");
when(client.getApplicationReport(any(ApplicationId.class))).thenReturn(
newApplicationReport);
int result = cli.run(new String[] { "-status", applicationId.toString() });
assertEquals(0, result);
verify(client).getApplicationReport(applicationId);
String appReportStr = "Application Report : \n\t"
+ "Application-Id : application_1234_0005\n\t"
+ "Application-Name : appname\n\tUser : user\n\t"
+ "Queue : queue\n\tStart-Time : 0\n\tFinish-Time : 0\n\t"
+ "State : FINISHED\n\tFinal-State : SUCCEEDED\n\t"
+ "Tracking-URL : N/A\n\tDiagnostics : diagnostics\n";
Assert.assertEquals(appReportStr, sysOutStream.toString());
verify(sysOut, times(1)).println(isA(String.class));
}
@Test
public void testGetAllApplications() throws Exception {
ApplicationCLI cli = createAndGetAppCLI();
ApplicationId applicationId = BuilderUtils.newApplicationId(1234, 5);
ApplicationReport newApplicationReport = BuilderUtils.newApplicationReport(
applicationId,
"user", "queue", "appname", "host", 124, null,
YarnApplicationState.FINISHED, "diagnostics", "url", 0, 0,
FinalApplicationStatus.SUCCEEDED, null, "N/A");
List<ApplicationReport> applicationReports = new ArrayList<ApplicationReport>();
applicationReports.add(newApplicationReport);
when(client.getApplicationList()).thenReturn(applicationReports);
int result = cli.run(new String[] { "-list" });
assertEquals(0, result);
verify(client).getApplicationList();
StringBuffer appsReportStrBuf = new StringBuffer();
appsReportStrBuf.append("Total Applications:1\n");
appsReportStrBuf
.append(" Application-Id\t Application-Name"
+ "\t User\t Queue\t State\t "
+ "Final-State\t Tracking-URL\n");
appsReportStrBuf.append(" application_1234_0005\t "
+ "appname\t user\t queue\t FINISHED\t "
+ "SUCCEEDED\t N/A\n");
Assert.assertEquals(appsReportStrBuf.toString(), sysOutStream.toString());
verify(sysOut, times(1)).write(any(byte[].class), anyInt(), anyInt());
}
@Test
public void testKillApplication() throws Exception {
ApplicationCLI cli = createAndGetAppCLI();
ApplicationId applicationId = BuilderUtils.newApplicationId(1234, 5);
int result = cli.run(new String[] { "-kill", applicationId.toString() });
assertEquals(0, result);
verify(client).killApplication(any(ApplicationId.class));
verify(sysOut).println("Killing application application_1234_0005");
}
@Test
public void testListClusterNodes() throws Exception {
NodeCLI cli = new NodeCLI();
when(client.getNodeReports()).thenReturn(getNodeReports(3));
cli.setClient(client);
cli.setSysOutPrintStream(sysOut);
int result = cli.run(new String[] { "-list" });
assertEquals(0, result);
verify(client).getNodeReports();
StringBuffer nodesReportStr = new StringBuffer();
nodesReportStr.append("Total Nodes:3");
nodesReportStr
.append("\n Node-Id\tNode-Http-Address\t"
+ "Health-Status(isNodeHealthy)\tRunning-Containers");
nodesReportStr.append("\n host0:0\t host1:8888"
+ "\t false\t 0");
nodesReportStr.append("\n host1:0\t host1:8888"
+ "\t false\t 0");
nodesReportStr.append("\n host2:0\t host1:8888"
+ "\t false\t 0\n");
Assert.assertEquals(nodesReportStr.toString(), sysOutStream.toString());
verify(sysOut, times(1)).write(any(byte[].class), anyInt(), anyInt());
}
@Test
public void testNodeStatus() throws Exception {
NodeId nodeId = BuilderUtils.newNodeId("host0", 0);
NodeCLI cli = new NodeCLI();
when(client.getNodeReports()).thenReturn(getNodeReports(3));
cli.setClient(client);
cli.setSysOutPrintStream(sysOut);
cli.setSysErrPrintStream(sysErr);
int result = cli.run(new String[] { "-status", nodeId.toString() });
assertEquals(0, result);
verify(client).getNodeReports();
String nodeStatusStr = "Node Report : \n\tNode-Id : host0:0\n\t"
+ "Rack : rack1\n\t"
+ "Node-Http-Address : host1:8888\n\tHealth-Status(isNodeHealthy) "
+ ": false\n\tLast-Last-Health-Update : 0\n\tHealth-Report : null"
+ "\n\tContainers : 0\n\tMemory-Used : 0M\n\tMemory-Capacity : 0";
verify(sysOut, times(1)).println(isA(String.class));
verify(sysOut).println(nodeStatusStr);
}
@Test
public void testAbsentNodeStatus() throws Exception {
NodeId nodeId = BuilderUtils.newNodeId("Absenthost0", 0);
NodeCLI cli = new NodeCLI();
when(client.getNodeReports()).thenReturn(getNodeReports(0));
cli.setClient(client);
cli.setSysOutPrintStream(sysOut);
cli.setSysErrPrintStream(sysErr);
int result = cli.run(new String[] { "-status", nodeId.toString() });
assertEquals(0, result);
verify(client).getNodeReports();
verify(sysOut, times(1)).println(isA(String.class));
verify(sysOut).println(
"Could not find the node report for node id : " + nodeId.toString());
}
@Test
public void testAppCLIUsageInfo() throws Exception {
verifyUsageInfo(new ApplicationCLI());
}
@Test
public void testNodeCLIUsageInfo() throws Exception {
verifyUsageInfo(new NodeCLI());
}
private void verifyUsageInfo(YarnCLI cli) throws Exception {
cli.setSysErrPrintStream(sysErr);
cli.run(new String[0]);
verify(sysErr).println("Invalid Command Usage : ");
}
private List<NodeReport> getNodeReports(int noOfNodes) {
List<NodeReport> nodeReports = new ArrayList<NodeReport>();
for (int i = 0; i < noOfNodes; i++) {
NodeReport nodeReport = newNodeReport(BuilderUtils
.newNodeId("host" + i, 0), "host" + 1 + ":8888",
"rack1", Records.newRecord(Resource.class), Records
.newRecord(Resource.class), 0, Records
.newRecord(NodeHealthStatus.class));
nodeReports.add(nodeReport);
}
return nodeReports;
}
private static NodeReport newNodeReport(NodeId nodeId,
String httpAddress, String rackName, Resource used, Resource capability,
int numContainers, NodeHealthStatus nodeHealthStatus) {
NodeReport nodeReport = recordFactory.newRecordInstance(NodeReport.class);
nodeReport.setNodeId(nodeId);
nodeReport.setHttpAddress(httpAddress);
nodeReport.setRackName(rackName);
nodeReport.setUsed(used);
nodeReport.setCapability(capability);
nodeReport.setNumContainers(numContainers);
nodeReport.setNodeHealthStatus(nodeHealthStatus);
return nodeReport;
}
private ApplicationCLI createAndGetAppCLI() {
ApplicationCLI cli = new ApplicationCLI();
cli.setClient(client);
cli.setSysOutPrintStream(sysOut);
return cli;
}
}