|
@@ -22,9 +22,13 @@ import static org.junit.Assert.assertFalse;
|
|
|
import static org.junit.Assert.assertNotNull;
|
|
|
import static org.junit.Assert.assertTrue;
|
|
|
import static org.mockito.Matchers.any;
|
|
|
+import static org.mockito.Mockito.doNothing;
|
|
|
import static org.mockito.Mockito.doReturn;
|
|
|
import static org.mockito.Mockito.doThrow;
|
|
|
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 java.io.BufferedReader;
|
|
|
import java.io.ByteArrayOutputStream;
|
|
@@ -53,15 +57,18 @@ import org.apache.hadoop.fs.permission.FsPermission;
|
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAccessType;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
|
|
+import org.apache.hadoop.yarn.api.records.ApplicationAttemptReport;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationReport;
|
|
|
import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
|
+import org.apache.hadoop.yarn.api.records.ContainerReport;
|
|
|
import org.apache.hadoop.yarn.api.records.NodeId;
|
|
|
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
|
|
|
import org.apache.hadoop.yarn.client.api.YarnClient;
|
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
|
|
import org.apache.hadoop.yarn.logaggregation.AggregatedLogFormat;
|
|
|
+import org.apache.hadoop.yarn.logaggregation.ContainerLogsRequest;
|
|
|
import org.apache.hadoop.yarn.logaggregation.LogAggregationUtils;
|
|
|
import org.apache.hadoop.yarn.logaggregation.LogCLIHelpers;
|
|
|
import org.junit.Assert;
|
|
@@ -396,6 +403,56 @@ public class TestLogsCLI {
|
|
|
fs.delete(new Path(rootLogDir), true);
|
|
|
}
|
|
|
|
|
|
+ @Test (timeout = 5000)
|
|
|
+ public void testFetchRunningApplicationLogs() throws Exception {
|
|
|
+ UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
|
|
|
+ NodeId nodeId = NodeId.newInstance("localhost", 1234);
|
|
|
+ ApplicationId appId = ApplicationId.newInstance(0, 1);
|
|
|
+ ApplicationAttemptId appAttemptId = ApplicationAttemptId
|
|
|
+ .newInstance(appId, 1);
|
|
|
+ // Create a mock ApplicationAttempt Report
|
|
|
+ ApplicationAttemptReport mockAttemptReport = mock(
|
|
|
+ ApplicationAttemptReport.class);
|
|
|
+ doReturn(appAttemptId).when(mockAttemptReport).getApplicationAttemptId();
|
|
|
+ List<ApplicationAttemptReport> attemptReports = Arrays.asList(
|
|
|
+ mockAttemptReport);
|
|
|
+
|
|
|
+ // Create two mock containerReports
|
|
|
+ ContainerId containerId1 = ContainerId.newContainerId(appAttemptId, 1);
|
|
|
+ ContainerReport mockContainerReport1 = mock(ContainerReport.class);
|
|
|
+ doReturn(containerId1).when(mockContainerReport1).getContainerId();
|
|
|
+ doReturn(nodeId).when(mockContainerReport1).getAssignedNode();
|
|
|
+ doReturn("http://localhost:2345").when(mockContainerReport1)
|
|
|
+ .getNodeHttpAddress();
|
|
|
+ ContainerId containerId2 = ContainerId.newContainerId(appAttemptId, 2);
|
|
|
+ ContainerReport mockContainerReport2 = mock(ContainerReport.class);
|
|
|
+ doReturn(containerId2).when(mockContainerReport2).getContainerId();
|
|
|
+ doReturn(nodeId).when(mockContainerReport2).getAssignedNode();
|
|
|
+ doReturn("http://localhost:2345").when(mockContainerReport2)
|
|
|
+ .getNodeHttpAddress();
|
|
|
+ List<ContainerReport> containerReports = Arrays.asList(
|
|
|
+ mockContainerReport1, mockContainerReport2);
|
|
|
+
|
|
|
+ // Mock the YarnClient, and it would report the previous created
|
|
|
+ // mockAttemptReport and previous two created mockContainerReports
|
|
|
+ YarnClient mockYarnClient = createMockYarnClient(
|
|
|
+ YarnApplicationState.RUNNING, ugi.getShortUserName(), true,
|
|
|
+ attemptReports, containerReports);
|
|
|
+ LogsCLI cli = spy(new LogsCLIForTest(mockYarnClient));
|
|
|
+ doNothing().when(cli).printContainerLogsFromRunningApplication(
|
|
|
+ any(Configuration.class), any(ContainerLogsRequest.class),
|
|
|
+ any(LogCLIHelpers.class));
|
|
|
+
|
|
|
+ cli.setConf(new YarnConfiguration());
|
|
|
+ int exitCode = cli.run(new String[] {"-applicationId", appId.toString()});
|
|
|
+ assertTrue(exitCode == 0);
|
|
|
+ // we have two container reports, so make sure we have called
|
|
|
+ // printContainerLogsFromRunningApplication twice
|
|
|
+ verify(cli, times(2)).printContainerLogsFromRunningApplication(
|
|
|
+ any(Configuration.class), any(ContainerLogsRequest.class),
|
|
|
+ any(LogCLIHelpers.class));
|
|
|
+ }
|
|
|
+
|
|
|
@Test (timeout = 15000)
|
|
|
public void testFetchApplictionLogsAsAnotherUser() throws Exception {
|
|
|
String remoteLogRootDir = "target/logs/";
|
|
@@ -916,14 +973,26 @@ public class TestLogsCLI {
|
|
|
}
|
|
|
|
|
|
private YarnClient createMockYarnClient(YarnApplicationState appState,
|
|
|
- String user)
|
|
|
- throws YarnException, IOException {
|
|
|
+ String user) throws YarnException, IOException {
|
|
|
+ return createMockYarnClient(appState, user, false, null, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ private YarnClient createMockYarnClient(YarnApplicationState appState,
|
|
|
+ String user, boolean mockContainerReport,
|
|
|
+ List<ApplicationAttemptReport> mockAttempts,
|
|
|
+ List<ContainerReport> mockContainers) throws YarnException, IOException {
|
|
|
YarnClient mockClient = mock(YarnClient.class);
|
|
|
ApplicationReport mockAppReport = mock(ApplicationReport.class);
|
|
|
doReturn(user).when(mockAppReport).getUser();
|
|
|
doReturn(appState).when(mockAppReport).getYarnApplicationState();
|
|
|
doReturn(mockAppReport).when(mockClient).getApplicationReport(
|
|
|
any(ApplicationId.class));
|
|
|
+ if (mockContainerReport) {
|
|
|
+ doReturn(mockAttempts).when(mockClient).getApplicationAttempts(
|
|
|
+ any(ApplicationId.class));
|
|
|
+ doReturn(mockContainers).when(mockClient).getContainers(any(
|
|
|
+ ApplicationAttemptId.class));
|
|
|
+ }
|
|
|
return mockClient;
|
|
|
}
|
|
|
|