|
@@ -22,6 +22,7 @@ import static org.apache.hadoop.yarn.webapp.WebServicesTestUtils.assertResponseS
|
|
|
import static org.junit.Assert.assertEquals;
|
|
|
import static org.junit.Assert.assertTrue;
|
|
|
import static org.junit.Assert.fail;
|
|
|
+import static org.mockito.ArgumentMatchers.any;
|
|
|
import static org.mockito.ArgumentMatchers.isA;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.when;
|
|
@@ -30,11 +31,17 @@ import java.io.File;
|
|
|
import java.io.StringReader;
|
|
|
import java.security.Principal;
|
|
|
import java.util.Arrays;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
+import java.util.List;
|
|
|
import java.util.Set;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.ConcurrentMap;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
+import javax.ws.rs.core.HttpHeaders;
|
|
|
import javax.ws.rs.core.MediaType;
|
|
|
import javax.xml.parsers.DocumentBuilder;
|
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
|
@@ -49,12 +56,21 @@ import org.apache.hadoop.util.VersionInfo;
|
|
|
import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationsRequest;
|
|
|
import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationsResponse;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
|
|
+import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
|
|
+import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationReport;
|
|
|
+import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
|
|
|
+import org.apache.hadoop.yarn.api.records.Priority;
|
|
|
import org.apache.hadoop.yarn.api.records.QueueACL;
|
|
|
import org.apache.hadoop.yarn.api.records.QueueState;
|
|
|
+import org.apache.hadoop.yarn.api.records.Resource;
|
|
|
+import org.apache.hadoop.yarn.api.records.YarnApplicationState;
|
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
|
+import org.apache.hadoop.yarn.event.Dispatcher;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.*;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppMetrics;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
|
|
@@ -870,6 +886,72 @@ public class TestRMWebServices extends JerseyTestBase {
|
|
|
verifyClusterUserInfo(userInfo, "yarn", "admin");
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testInvalidXMLChars() throws Exception {
|
|
|
+ ResourceManager mockRM = mock(ResourceManager.class);
|
|
|
+
|
|
|
+ ApplicationId applicationId = ApplicationId.newInstance(1234, 5);
|
|
|
+ ApplicationReport appReport = ApplicationReport.newInstance(
|
|
|
+ applicationId, ApplicationAttemptId.newInstance(applicationId, 1),
|
|
|
+ "user", "queue", "appname", "host", 124, null,
|
|
|
+ YarnApplicationState.FAILED, "java.lang.Exception: \u0001", "url",
|
|
|
+ 0, 0, 0, FinalApplicationStatus.FAILED, null, "N/A", 0.53789f, "YARN",
|
|
|
+ null, null, false, Priority.newInstance(0), "high-mem", "high-mem");
|
|
|
+ List<ApplicationReport> appReports = new ArrayList<ApplicationReport>();
|
|
|
+ appReports.add(appReport);
|
|
|
+
|
|
|
+ GetApplicationsResponse response = mock(GetApplicationsResponse.class);
|
|
|
+ when(response.getApplicationList()).thenReturn(appReports);
|
|
|
+ ClientRMService clientRMService = mock(ClientRMService.class);
|
|
|
+ when(clientRMService.getApplications(any(GetApplicationsRequest.class)))
|
|
|
+ .thenReturn(response);
|
|
|
+ when(mockRM.getClientRMService()).thenReturn(clientRMService);
|
|
|
+
|
|
|
+ RMContext rmContext = mock(RMContext.class);
|
|
|
+ when(rmContext.getDispatcher()).thenReturn(mock(Dispatcher.class));
|
|
|
+
|
|
|
+ ApplicationSubmissionContext applicationSubmissionContext = mock(
|
|
|
+ ApplicationSubmissionContext.class);
|
|
|
+ when(applicationSubmissionContext.getUnmanagedAM()).thenReturn(true);
|
|
|
+
|
|
|
+ RMApp app = mock(RMApp.class);
|
|
|
+ RMAppMetrics appMetrics = new RMAppMetrics(Resource.newInstance(0, 0),
|
|
|
+ 0, 0, new HashMap<>(), new HashMap<>());
|
|
|
+ when(app.getDiagnostics()).thenReturn(
|
|
|
+ new StringBuilder("java.lang.Exception: \u0001"));
|
|
|
+ when(app.getApplicationId()).thenReturn(applicationId);
|
|
|
+ when(app.getUser()).thenReturn("user");
|
|
|
+ when(app.getName()).thenReturn("appname");
|
|
|
+ when(app.getQueue()).thenReturn("queue");
|
|
|
+ when(app.getRMAppMetrics()).thenReturn(appMetrics);
|
|
|
+ when(app.getApplicationSubmissionContext()).thenReturn(
|
|
|
+ applicationSubmissionContext);
|
|
|
+
|
|
|
+ ConcurrentMap<ApplicationId, RMApp> applications =
|
|
|
+ new ConcurrentHashMap<>();
|
|
|
+ applications.put(applicationId, app);
|
|
|
+
|
|
|
+ when(rmContext.getRMApps()).thenReturn(applications);
|
|
|
+ when(mockRM.getRMContext()).thenReturn(rmContext);
|
|
|
+
|
|
|
+ Configuration conf = new YarnConfiguration();
|
|
|
+ conf.setBoolean(YarnConfiguration.FILTER_INVALID_XML_CHARS, true);
|
|
|
+ RMWebServices webSvc = new RMWebServices(mockRM, conf, mock(
|
|
|
+ HttpServletResponse.class));
|
|
|
+
|
|
|
+ HttpServletRequest mockHsr = mock(HttpServletRequest.class);
|
|
|
+ when(mockHsr.getHeader(HttpHeaders.ACCEPT)).
|
|
|
+ thenReturn(MediaType.APPLICATION_XML);
|
|
|
+ Set<String> emptySet = Collections.unmodifiableSet(Collections.emptySet());
|
|
|
+
|
|
|
+ AppsInfo appsInfo = webSvc.getApps(mockHsr, null, emptySet, null,
|
|
|
+ null, null, null, null, null, null, null, emptySet, emptySet, null);
|
|
|
+
|
|
|
+ assertEquals("Incorrect Number of Apps", 1, appsInfo.getApps().size());
|
|
|
+ assertEquals("Invalid XML Characters Present",
|
|
|
+ "java.lang.Exception: \uFFFD", appsInfo.getApps().get(0).getNote());
|
|
|
+ }
|
|
|
+
|
|
|
public void verifyClusterUserInfo(ClusterUserInfo userInfo,
|
|
|
String rmLoginUser, String requestedUser) {
|
|
|
assertEquals("rmLoginUser doesn't match: ",
|