You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-commits@hadoop.apache.org by ss...@apache.org on 2012/10/19 20:59:07 UTC
svn commit: r1400227 [3/5] - in
/hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2:
./ job/impl/ webapp/
Modified: hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesAttempts.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesAttempts.java?rev=1400227&r1=1400226&r2=1400227&view=diff
==============================================================================
--- hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesAttempts.java (original)
+++ hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesAttempts.java Fri Oct 19 18:59:06 2012
@@ -1,738 +1,738 @@
-///**
-// * 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.mapreduce.v2.app2.webapp;
-//
-//import static org.junit.Assert.assertEquals;
-//import static org.junit.Assert.assertNotNull;
-//import static org.junit.Assert.assertTrue;
-//import static org.junit.Assert.fail;
-//
-//import java.io.StringReader;
-//import java.util.List;
-//import java.util.Map;
-//
-//import javax.ws.rs.core.MediaType;
-//import javax.xml.parsers.DocumentBuilder;
-//import javax.xml.parsers.DocumentBuilderFactory;
-//
-//import org.apache.hadoop.conf.Configuration;
-//import org.apache.hadoop.mapreduce.v2.api.records.JobId;
-//import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
-//import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
-//import org.apache.hadoop.mapreduce.v2.app2.AppContext;
-//import org.apache.hadoop.mapreduce.v2.app2.MockJobs;
-//import org.apache.hadoop.mapreduce.v2.app2.job.Job;
-//import org.apache.hadoop.mapreduce.v2.app2.job.Task;
-//import org.apache.hadoop.mapreduce.v2.app2.job.TaskAttempt;
-//import org.apache.hadoop.mapreduce.v2.util.MRApps;
-//import org.apache.hadoop.yarn.Clock;
-//import org.apache.hadoop.yarn.ClusterInfo;
-//import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
-//import org.apache.hadoop.yarn.api.records.ApplicationId;
-//import org.apache.hadoop.yarn.event.EventHandler;
-//import org.apache.hadoop.yarn.util.ConverterUtils;
-//import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
-//import org.apache.hadoop.yarn.webapp.WebServicesTestUtils;
-//import org.codehaus.jettison.json.JSONArray;
-//import org.codehaus.jettison.json.JSONException;
-//import org.codehaus.jettison.json.JSONObject;
-//import org.junit.Before;
-//import org.junit.Test;
-//import org.w3c.dom.Document;
-//import org.w3c.dom.Element;
-//import org.w3c.dom.NodeList;
-//import org.xml.sax.InputSource;
-//
-//import com.google.inject.Guice;
-//import com.google.inject.Injector;
-//import com.google.inject.servlet.GuiceServletContextListener;
-//import com.google.inject.servlet.ServletModule;
-//import com.sun.jersey.api.client.ClientResponse;
-//import com.sun.jersey.api.client.UniformInterfaceException;
-//import com.sun.jersey.api.client.WebResource;
-//import com.sun.jersey.api.client.ClientResponse.Status;
-//import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
-//import com.sun.jersey.test.framework.JerseyTest;
-//import com.sun.jersey.test.framework.WebAppDescriptor;
-//
-///**
-// * Test the app master web service Rest API for getting task attempts, a
-// * specific task attempt, and task attempt counters
-// *
-// * /ws/v1/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts
-// * /ws/v1/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}
-// * /ws/v1/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/counters
-// */
-//public class TestAMWebServicesAttempts extends JerseyTest {
-//
-// private static Configuration conf = new Configuration();
-// private static TestAppContext appContext;
-//
-// static class TestAppContext implements AppContext {
-// final ApplicationAttemptId appAttemptID;
-// final ApplicationId appID;
-// final String user = MockJobs.newUserName();
-// final Map<JobId, Job> jobs;
-// final long startTime = System.currentTimeMillis();
-//
-// TestAppContext(int appid, int numJobs, int numTasks, int numAttempts) {
-// appID = MockJobs.newAppID(appid);
-// appAttemptID = MockJobs.newAppAttemptID(appID, 0);
-// jobs = MockJobs.newJobs(appID, numJobs, numTasks, numAttempts);
-// }
-//
-// TestAppContext() {
-// this(0, 1, 2, 1);
-// }
-//
-// @Override
-// public ApplicationAttemptId getApplicationAttemptId() {
-// return appAttemptID;
-// }
-//
-// @Override
-// public ApplicationId getApplicationID() {
-// return appID;
-// }
-//
-// @Override
-// public CharSequence getUser() {
-// return user;
-// }
-//
-// @Override
-// public Job getJob(JobId jobID) {
-// return jobs.get(jobID);
-// }
-//
-// @Override
-// public Map<JobId, Job> getAllJobs() {
-// return jobs; // OK
-// }
-//
-// @SuppressWarnings("rawtypes")
-// @Override
-// public EventHandler getEventHandler() {
-// return null;
-// }
-//
-// @Override
-// public Clock getClock() {
-// return null;
-// }
-//
-// @Override
-// public String getApplicationName() {
-// return "TestApp";
-// }
-//
-// @Override
-// public long getStartTime() {
-// return startTime;
-// }
-//
-// @Override
-// public ClusterInfo getClusterInfo() {
-// return null;
-// }
-// }
-//
-// private Injector injector = Guice.createInjector(new ServletModule() {
-// @Override
-// protected void configureServlets() {
-//
-// appContext = new TestAppContext();
-// bind(JAXBContextResolver.class);
-// bind(AMWebServices.class);
-// bind(GenericExceptionHandler.class);
-// bind(AppContext.class).toInstance(appContext);
-// bind(Configuration.class).toInstance(conf);
-//
-// serve("/*").with(GuiceContainer.class);
-// }
-// });
-//
-// public class GuiceServletConfig extends GuiceServletContextListener {
-//
-// @Override
-// protected Injector getInjector() {
-// return injector;
-// }
-// }
-//
-// @Before
-// @Override
-// public void setUp() throws Exception {
-// super.setUp();
-//
-// }
-//
-// public TestAMWebServicesAttempts() {
-// super(new WebAppDescriptor.Builder(
-// "org.apache.hadoop.mapreduce.v2.app2.webapp")
-// .contextListenerClass(GuiceServletConfig.class)
-// .filterClass(com.google.inject.servlet.GuiceFilter.class)
-// .contextPath("jersey-guice-filter").servletPath("/").build());
-// }
-//
-// @Test
-// public void testTaskAttempts() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-//
-// String tid = MRApps.toString(task.getID());
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
-// .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// verifyAMTaskAttempts(json, task);
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptsSlash() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-//
-// String tid = MRApps.toString(task.getID());
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid).path("attempts/")
-// .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// verifyAMTaskAttempts(json, task);
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptsDefault() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-//
-// String tid = MRApps.toString(task.getID());
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
-// .get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// verifyAMTaskAttempts(json, task);
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptsXML() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-//
-// String tid = MRApps.toString(task.getID());
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
-// .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
-//
-// assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
-// String xml = response.getEntity(String.class);
-// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-// DocumentBuilder db = dbf.newDocumentBuilder();
-// InputSource is = new InputSource();
-// is.setCharacterStream(new StringReader(xml));
-// Document dom = db.parse(is);
-// NodeList attempts = dom.getElementsByTagName("taskAttempts");
-// assertEquals("incorrect number of elements", 1, attempts.getLength());
-//
-// NodeList nodes = dom.getElementsByTagName("taskAttempt");
-// verifyAMTaskAttemptsXML(nodes, task);
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptId() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-//
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-// String tid = MRApps.toString(task.getID());
-//
-// for (TaskAttempt att : task.getAttempts().values()) {
-// TaskAttemptId attemptid = att.getID();
-// String attid = MRApps.toString(attemptid);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid)
-// .path("attempts").path(attid).accept(MediaType.APPLICATION_JSON)
-// .get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONObject info = json.getJSONObject("taskAttempt");
-// verifyAMTaskAttempt(info, att, task.getType());
-// }
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptIdSlash() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-//
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-// String tid = MRApps.toString(task.getID());
-//
-// for (TaskAttempt att : task.getAttempts().values()) {
-// TaskAttemptId attemptid = att.getID();
-// String attid = MRApps.toString(attemptid);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid)
-// .path("attempts").path(attid + "/")
-// .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONObject info = json.getJSONObject("taskAttempt");
-// verifyAMTaskAttempt(info, att, task.getType());
-// }
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptIdDefault() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-//
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-// String tid = MRApps.toString(task.getID());
-//
-// for (TaskAttempt att : task.getAttempts().values()) {
-// TaskAttemptId attemptid = att.getID();
-// String attid = MRApps.toString(attemptid);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid)
-// .path("attempts").path(attid).get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONObject info = json.getJSONObject("taskAttempt");
-// verifyAMTaskAttempt(info, att, task.getType());
-// }
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptIdXML() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-//
-// String tid = MRApps.toString(task.getID());
-// for (TaskAttempt att : task.getAttempts().values()) {
-// TaskAttemptId attemptid = att.getID();
-// String attid = MRApps.toString(attemptid);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid)
-// .path("attempts").path(attid).accept(MediaType.APPLICATION_XML)
-// .get(ClientResponse.class);
-//
-// assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
-// String xml = response.getEntity(String.class);
-// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-// DocumentBuilder db = dbf.newDocumentBuilder();
-// InputSource is = new InputSource();
-// is.setCharacterStream(new StringReader(xml));
-// Document dom = db.parse(is);
-// NodeList nodes = dom.getElementsByTagName("taskAttempt");
-// for (int i = 0; i < nodes.getLength(); i++) {
-// Element element = (Element) nodes.item(i);
-// verifyAMTaskAttemptXML(element, att, task.getType());
-// }
-// }
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptIdBogus() throws JSONException, Exception {
-//
-// testTaskAttemptIdErrorGeneric("bogusid",
-// "java.lang.Exception: TaskAttemptId string : bogusid is not properly formed");
-// }
-//
-// @Test
-// public void testTaskAttemptIdNonExist() throws JSONException, Exception {
-//
-// testTaskAttemptIdErrorGeneric(
-// "attempt_0_12345_m_000000_0",
-// "java.lang.Exception: Error getting info on task attempt id attempt_0_12345_m_000000_0");
-// }
-//
-// @Test
-// public void testTaskAttemptIdInvalid() throws JSONException, Exception {
-//
-// testTaskAttemptIdErrorGeneric("attempt_0_12345_d_000000_0",
-// "java.lang.Exception: Bad TaskType identifier. TaskAttemptId string : attempt_0_12345_d_000000_0 is not properly formed.");
-// }
-//
-// @Test
-// public void testTaskAttemptIdInvalid2() throws JSONException, Exception {
-//
-// testTaskAttemptIdErrorGeneric("attempt_12345_m_000000_0",
-// "java.lang.Exception: TaskAttemptId string : attempt_12345_m_000000_0 is not properly formed");
-// }
-//
-// @Test
-// public void testTaskAttemptIdInvalid3() throws JSONException, Exception {
-//
-// testTaskAttemptIdErrorGeneric("attempt_0_12345_m_000000",
-// "java.lang.Exception: TaskAttemptId string : attempt_0_12345_m_000000 is not properly formed");
-// }
-//
-// private void testTaskAttemptIdErrorGeneric(String attid, String error)
-// throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-//
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-// String tid = MRApps.toString(task.getID());
-//
-// try {
-// r.path("ws").path("v1").path("mapreduce").path("jobs").path(jobId)
-// .path("tasks").path(tid).path("attempts").path(attid)
-// .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
-// fail("should have thrown exception on invalid uri");
-// } catch (UniformInterfaceException ue) {
-// ClientResponse response = ue.getResponse();
-// assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject msg = response.getEntity(JSONObject.class);
-// JSONObject exception = msg.getJSONObject("RemoteException");
-// assertEquals("incorrect number of elements", 3, exception.length());
-// String message = exception.getString("message");
-// String type = exception.getString("exception");
-// String classname = exception.getString("javaClassName");
-// WebServicesTestUtils.checkStringMatch("exception message", error,
-// message);
-// WebServicesTestUtils.checkStringMatch("exception type",
-// "NotFoundException", type);
-// WebServicesTestUtils.checkStringMatch("exception classname",
-// "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
-// }
-// }
-// }
-// }
-//
-// public void verifyAMTaskAttemptXML(Element element, TaskAttempt att,
-// TaskType ttype) {
-// verifyTaskAttemptGeneric(att, ttype,
-// WebServicesTestUtils.getXmlString(element, "id"),
-// WebServicesTestUtils.getXmlString(element, "state"),
-// WebServicesTestUtils.getXmlString(element, "type"),
-// WebServicesTestUtils.getXmlString(element, "rack"),
-// WebServicesTestUtils.getXmlString(element, "nodeHttpAddress"),
-// WebServicesTestUtils.getXmlString(element, "diagnostics"),
-// WebServicesTestUtils.getXmlString(element, "assignedContainerId"),
-// WebServicesTestUtils.getXmlLong(element, "startTime"),
-// WebServicesTestUtils.getXmlLong(element, "finishTime"),
-// WebServicesTestUtils.getXmlLong(element, "elapsedTime"),
-// WebServicesTestUtils.getXmlFloat(element, "progress"));
-//
-// if (ttype == TaskType.REDUCE) {
-// verifyReduceTaskAttemptGeneric(att,
-// WebServicesTestUtils.getXmlLong(element, "shuffleFinishTime"),
-// WebServicesTestUtils.getXmlLong(element, "mergeFinishTime"),
-// WebServicesTestUtils.getXmlLong(element, "elapsedShuffleTime"),
-// WebServicesTestUtils.getXmlLong(element, "elapsedMergeTime"),
-// WebServicesTestUtils.getXmlLong(element, "elapsedReduceTime"));
-// }
-// }
-//
-// public void verifyAMTaskAttempt(JSONObject info, TaskAttempt att,
-// TaskType ttype) throws JSONException {
-// if (ttype == TaskType.REDUCE) {
-// assertEquals("incorrect number of elements", 16, info.length());
-// } else {
-// assertEquals("incorrect number of elements", 11, info.length());
-// }
-//
-// verifyTaskAttemptGeneric(att, ttype, info.getString("id"),
-// info.getString("state"), info.getString("type"),
-// info.getString("rack"), info.getString("nodeHttpAddress"),
-// info.getString("diagnostics"), info.getString("assignedContainerId"),
-// info.getLong("startTime"), info.getLong("finishTime"),
-// info.getLong("elapsedTime"), (float) info.getDouble("progress"));
-//
-// if (ttype == TaskType.REDUCE) {
-// verifyReduceTaskAttemptGeneric(att, info.getLong("shuffleFinishTime"),
-// info.getLong("mergeFinishTime"), info.getLong("elapsedShuffleTime"),
-// info.getLong("elapsedMergeTime"), info.getLong("elapsedReduceTime"));
-// }
-// }
-//
-// public void verifyAMTaskAttempts(JSONObject json, Task task)
-// throws JSONException {
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONObject attempts = json.getJSONObject("taskAttempts");
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONArray arr = attempts.getJSONArray("taskAttempt");
-// for (TaskAttempt att : task.getAttempts().values()) {
-// TaskAttemptId id = att.getID();
-// String attid = MRApps.toString(id);
-// Boolean found = false;
-//
-// for (int i = 0; i < arr.length(); i++) {
-// JSONObject info = arr.getJSONObject(i);
-// if (attid.matches(info.getString("id"))) {
-// found = true;
-// verifyAMTaskAttempt(info, att, task.getType());
-// }
-// }
-// assertTrue("task attempt with id: " + attid
-// + " not in web service output", found);
-// }
-// }
-//
-// public void verifyAMTaskAttemptsXML(NodeList nodes, Task task) {
-// assertEquals("incorrect number of elements", 1, nodes.getLength());
-//
-// for (TaskAttempt att : task.getAttempts().values()) {
-// TaskAttemptId id = att.getID();
-// String attid = MRApps.toString(id);
-// Boolean found = false;
-// for (int i = 0; i < nodes.getLength(); i++) {
-// Element element = (Element) nodes.item(i);
-//
-// if (attid.matches(WebServicesTestUtils.getXmlString(element, "id"))) {
-// found = true;
-// verifyAMTaskAttemptXML(element, att, task.getType());
-// }
-// }
-// assertTrue("task with id: " + attid + " not in web service output", found);
-// }
-// }
-//
-// public void verifyTaskAttemptGeneric(TaskAttempt ta, TaskType ttype,
-// String id, String state, String type, String rack,
-// String nodeHttpAddress, String diagnostics, String assignedContainerId,
-// long startTime, long finishTime, long elapsedTime, float progress) {
-//
-// TaskAttemptId attid = ta.getID();
-// String attemptId = MRApps.toString(attid);
-//
-// WebServicesTestUtils.checkStringMatch("id", attemptId, id);
-// WebServicesTestUtils.checkStringMatch("type", ttype.toString(), type);
-// WebServicesTestUtils.checkStringMatch("state", ta.getState().toString(),
-// state);
-// WebServicesTestUtils.checkStringMatch("rack", ta.getNodeRackName(), rack);
-// WebServicesTestUtils.checkStringMatch("nodeHttpAddress",
-// ta.getNodeHttpAddress(), nodeHttpAddress);
-//
-// String expectDiag = "";
-// List<String> diagnosticsList = ta.getDiagnostics();
-// if (diagnosticsList != null && !diagnostics.isEmpty()) {
-// StringBuffer b = new StringBuffer();
-// for (String diag : diagnosticsList) {
-// b.append(diag);
-// }
-// expectDiag = b.toString();
-// }
-// WebServicesTestUtils.checkStringMatch("diagnostics", expectDiag,
-// diagnostics);
-// WebServicesTestUtils.checkStringMatch("assignedContainerId",
-// ConverterUtils.toString(ta.getAssignedContainerID()),
-// assignedContainerId);
-//
-// assertEquals("startTime wrong", ta.getLaunchTime(), startTime);
-// assertEquals("finishTime wrong", ta.getFinishTime(), finishTime);
-// assertEquals("elapsedTime wrong", finishTime - startTime, elapsedTime);
-// assertEquals("progress wrong", ta.getProgress() * 100, progress, 1e-3f);
-// }
-//
-// public void verifyReduceTaskAttemptGeneric(TaskAttempt ta,
-// long shuffleFinishTime, long mergeFinishTime, long elapsedShuffleTime,
-// long elapsedMergeTime, long elapsedReduceTime) {
-//
-// assertEquals("shuffleFinishTime wrong", ta.getShuffleFinishTime(),
-// shuffleFinishTime);
-// assertEquals("mergeFinishTime wrong", ta.getSortFinishTime(),
-// mergeFinishTime);
-// assertEquals("elapsedShuffleTime wrong",
-// ta.getLaunchTime() - ta.getShuffleFinishTime(), elapsedShuffleTime);
-// assertEquals("elapsedMergeTime wrong",
-// ta.getShuffleFinishTime() - ta.getSortFinishTime(), elapsedMergeTime);
-// assertEquals("elapsedReduceTime wrong",
-// ta.getSortFinishTime() - ta.getFinishTime(), elapsedReduceTime);
-// }
-//
-// @Test
-// public void testTaskAttemptIdCounters() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-//
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-// String tid = MRApps.toString(task.getID());
-//
-// for (TaskAttempt att : task.getAttempts().values()) {
-// TaskAttemptId attemptid = att.getID();
-// String attid = MRApps.toString(attemptid);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid)
-// .path("attempts").path(attid).path("counters")
-// .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONObject info = json.getJSONObject("jobTaskAttemptCounters");
-// verifyAMJobTaskAttemptCounters(info, att);
-// }
-// }
-// }
-// }
-//
-// @Test
-// public void testTaskAttemptIdXMLCounters() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-// for (Task task : jobsMap.get(id).getTasks().values()) {
-//
-// String tid = MRApps.toString(task.getID());
-// for (TaskAttempt att : task.getAttempts().values()) {
-// TaskAttemptId attemptid = att.getID();
-// String attid = MRApps.toString(attemptid);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("tasks").path(tid)
-// .path("attempts").path(attid).path("counters")
-// .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
-//
-// assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
-// String xml = response.getEntity(String.class);
-// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-// DocumentBuilder db = dbf.newDocumentBuilder();
-// InputSource is = new InputSource();
-// is.setCharacterStream(new StringReader(xml));
-// Document dom = db.parse(is);
-// NodeList nodes = dom.getElementsByTagName("jobTaskAttemptCounters");
-//
-// verifyAMTaskCountersXML(nodes, att);
-// }
-// }
-// }
-// }
-//
-// public void verifyAMJobTaskAttemptCounters(JSONObject info, TaskAttempt att)
-// throws JSONException {
-//
-// assertEquals("incorrect number of elements", 2, info.length());
-//
-// WebServicesTestUtils.checkStringMatch("id", MRApps.toString(att.getID()),
-// info.getString("id"));
-//
-// // just do simple verification of fields - not data is correct
-// // in the fields
-// JSONArray counterGroups = info.getJSONArray("taskAttemptCounterGroup");
-// for (int i = 0; i < counterGroups.length(); i++) {
-// JSONObject counterGroup = counterGroups.getJSONObject(i);
-// String name = counterGroup.getString("counterGroupName");
-// assertTrue("name not set", (name != null && !name.isEmpty()));
-// JSONArray counters = counterGroup.getJSONArray("counter");
-// for (int j = 0; j < counters.length(); j++) {
-// JSONObject counter = counters.getJSONObject(j);
-// String counterName = counter.getString("name");
-// assertTrue("name not set",
-// (counterName != null && !counterName.isEmpty()));
-// long value = counter.getLong("value");
-// assertTrue("value >= 0", value >= 0);
-// }
-// }
-// }
-//
-// public void verifyAMTaskCountersXML(NodeList nodes, TaskAttempt att) {
-//
-// for (int i = 0; i < nodes.getLength(); i++) {
-//
-// Element element = (Element) nodes.item(i);
-// WebServicesTestUtils.checkStringMatch("id", MRApps.toString(att.getID()),
-// WebServicesTestUtils.getXmlString(element, "id"));
-// // just do simple verification of fields - not data is correct
-// // in the fields
-// NodeList groups = element.getElementsByTagName("taskAttemptCounterGroup");
-//
-// for (int j = 0; j < groups.getLength(); j++) {
-// Element counters = (Element) groups.item(j);
-// assertNotNull("should have counters in the web service info", counters);
-// String name = WebServicesTestUtils.getXmlString(counters,
-// "counterGroupName");
-// assertTrue("name not set", (name != null && !name.isEmpty()));
-// NodeList counterArr = counters.getElementsByTagName("counter");
-// for (int z = 0; z < counterArr.getLength(); z++) {
-// Element counter = (Element) counterArr.item(z);
-// String counterName = WebServicesTestUtils.getXmlString(counter,
-// "name");
-// assertTrue("counter name not set",
-// (counterName != null && !counterName.isEmpty()));
-//
-// long value = WebServicesTestUtils.getXmlLong(counter, "value");
-// assertTrue("value not >= 0", value >= 0);
-//
-// }
-// }
-// }
-// }
-//
-//}
+/**
+ * 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.mapreduce.v2.app2.webapp;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.StringReader;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MediaType;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.mapreduce.v2.api.records.JobId;
+import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
+import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
+import org.apache.hadoop.mapreduce.v2.app2.AppContext;
+import org.apache.hadoop.mapreduce.v2.app2.MockJobs;
+import org.apache.hadoop.mapreduce.v2.app2.job.Job;
+import org.apache.hadoop.mapreduce.v2.app2.job.Task;
+import org.apache.hadoop.mapreduce.v2.app2.job.TaskAttempt;
+import org.apache.hadoop.mapreduce.v2.util.MRApps;
+import org.apache.hadoop.yarn.Clock;
+import org.apache.hadoop.yarn.ClusterInfo;
+import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.hadoop.yarn.util.ConverterUtils;
+import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
+import org.apache.hadoop.yarn.webapp.WebServicesTestUtils;
+import org.codehaus.jettison.json.JSONArray;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.servlet.GuiceServletContextListener;
+import com.google.inject.servlet.ServletModule;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.UniformInterfaceException;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.ClientResponse.Status;
+import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
+import com.sun.jersey.test.framework.JerseyTest;
+import com.sun.jersey.test.framework.WebAppDescriptor;
+
+/**
+ * Test the app master web service Rest API for getting task attempts, a
+ * specific task attempt, and task attempt counters
+ *
+ * /ws/v1/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts
+ * /ws/v1/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}
+ * /ws/v1/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/counters
+ */
+public class TestAMWebServicesAttempts extends JerseyTest {
+
+ private static Configuration conf = new Configuration();
+ private static TestAppContext appContext;
+
+ static class TestAppContext implements AppContext {
+ final ApplicationAttemptId appAttemptID;
+ final ApplicationId appID;
+ final String user = MockJobs.newUserName();
+ final Map<JobId, Job> jobs;
+ final long startTime = System.currentTimeMillis();
+
+ TestAppContext(int appid, int numJobs, int numTasks, int numAttempts) {
+ appID = MockJobs.newAppID(appid);
+ appAttemptID = MockJobs.newAppAttemptID(appID, 0);
+ jobs = MockJobs.newJobs(appID, numJobs, numTasks, numAttempts);
+ }
+
+ TestAppContext() {
+ this(0, 1, 2, 1);
+ }
+
+ @Override
+ public ApplicationAttemptId getApplicationAttemptId() {
+ return appAttemptID;
+ }
+
+ @Override
+ public ApplicationId getApplicationID() {
+ return appID;
+ }
+
+ @Override
+ public CharSequence getUser() {
+ return user;
+ }
+
+ @Override
+ public Job getJob(JobId jobID) {
+ return jobs.get(jobID);
+ }
+
+ @Override
+ public Map<JobId, Job> getAllJobs() {
+ return jobs; // OK
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public EventHandler getEventHandler() {
+ return null;
+ }
+
+ @Override
+ public Clock getClock() {
+ return null;
+ }
+
+ @Override
+ public String getApplicationName() {
+ return "TestApp";
+ }
+
+ @Override
+ public long getStartTime() {
+ return startTime;
+ }
+
+ @Override
+ public ClusterInfo getClusterInfo() {
+ return null;
+ }
+ }
+
+ private Injector injector = Guice.createInjector(new ServletModule() {
+ @Override
+ protected void configureServlets() {
+
+ appContext = new TestAppContext();
+ bind(JAXBContextResolver.class);
+ bind(AMWebServices.class);
+ bind(GenericExceptionHandler.class);
+ bind(AppContext.class).toInstance(appContext);
+ bind(Configuration.class).toInstance(conf);
+
+ serve("/*").with(GuiceContainer.class);
+ }
+ });
+
+ public class GuiceServletConfig extends GuiceServletContextListener {
+
+ @Override
+ protected Injector getInjector() {
+ return injector;
+ }
+ }
+
+ @Before
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ }
+
+ public TestAMWebServicesAttempts() {
+ super(new WebAppDescriptor.Builder(
+ "org.apache.hadoop.mapreduce.v2.app2.webapp")
+ .contextListenerClass(GuiceServletConfig.class)
+ .filterClass(com.google.inject.servlet.GuiceFilter.class)
+ .contextPath("jersey-guice-filter").servletPath("/").build());
+ }
+
+ @Test
+ public void testTaskAttempts() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+
+ String tid = MRApps.toString(task.getID());
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
+ .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ verifyAMTaskAttempts(json, task);
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptsSlash() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+
+ String tid = MRApps.toString(task.getID());
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid).path("attempts/")
+ .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ verifyAMTaskAttempts(json, task);
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptsDefault() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+
+ String tid = MRApps.toString(task.getID());
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
+ .get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ verifyAMTaskAttempts(json, task);
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptsXML() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+
+ String tid = MRApps.toString(task.getID());
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
+ .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+
+ assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+ String xml = response.getEntity(String.class);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ InputSource is = new InputSource();
+ is.setCharacterStream(new StringReader(xml));
+ Document dom = db.parse(is);
+ NodeList attempts = dom.getElementsByTagName("taskAttempts");
+ assertEquals("incorrect number of elements", 1, attempts.getLength());
+
+ NodeList nodes = dom.getElementsByTagName("taskAttempt");
+ verifyAMTaskAttemptsXML(nodes, task);
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptId() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+ String tid = MRApps.toString(task.getID());
+
+ for (TaskAttempt att : task.getAttempts().values()) {
+ TaskAttemptId attemptid = att.getID();
+ String attid = MRApps.toString(attemptid);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid)
+ .path("attempts").path(attid).accept(MediaType.APPLICATION_JSON)
+ .get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("taskAttempt");
+ verifyAMTaskAttempt(info, att, task.getType());
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptIdSlash() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+ String tid = MRApps.toString(task.getID());
+
+ for (TaskAttempt att : task.getAttempts().values()) {
+ TaskAttemptId attemptid = att.getID();
+ String attid = MRApps.toString(attemptid);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid)
+ .path("attempts").path(attid + "/")
+ .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("taskAttempt");
+ verifyAMTaskAttempt(info, att, task.getType());
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptIdDefault() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+ String tid = MRApps.toString(task.getID());
+
+ for (TaskAttempt att : task.getAttempts().values()) {
+ TaskAttemptId attemptid = att.getID();
+ String attid = MRApps.toString(attemptid);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid)
+ .path("attempts").path(attid).get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("taskAttempt");
+ verifyAMTaskAttempt(info, att, task.getType());
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptIdXML() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+
+ String tid = MRApps.toString(task.getID());
+ for (TaskAttempt att : task.getAttempts().values()) {
+ TaskAttemptId attemptid = att.getID();
+ String attid = MRApps.toString(attemptid);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid)
+ .path("attempts").path(attid).accept(MediaType.APPLICATION_XML)
+ .get(ClientResponse.class);
+
+ assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+ String xml = response.getEntity(String.class);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ InputSource is = new InputSource();
+ is.setCharacterStream(new StringReader(xml));
+ Document dom = db.parse(is);
+ NodeList nodes = dom.getElementsByTagName("taskAttempt");
+ for (int i = 0; i < nodes.getLength(); i++) {
+ Element element = (Element) nodes.item(i);
+ verifyAMTaskAttemptXML(element, att, task.getType());
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptIdBogus() throws JSONException, Exception {
+
+ testTaskAttemptIdErrorGeneric("bogusid",
+ "java.lang.Exception: TaskAttemptId string : bogusid is not properly formed");
+ }
+
+ @Test
+ public void testTaskAttemptIdNonExist() throws JSONException, Exception {
+
+ testTaskAttemptIdErrorGeneric(
+ "attempt_0_12345_m_000000_0",
+ "java.lang.Exception: Error getting info on task attempt id attempt_0_12345_m_000000_0");
+ }
+
+ @Test
+ public void testTaskAttemptIdInvalid() throws JSONException, Exception {
+
+ testTaskAttemptIdErrorGeneric("attempt_0_12345_d_000000_0",
+ "java.lang.Exception: Bad TaskType identifier. TaskAttemptId string : attempt_0_12345_d_000000_0 is not properly formed.");
+ }
+
+ @Test
+ public void testTaskAttemptIdInvalid2() throws JSONException, Exception {
+
+ testTaskAttemptIdErrorGeneric("attempt_12345_m_000000_0",
+ "java.lang.Exception: TaskAttemptId string : attempt_12345_m_000000_0 is not properly formed");
+ }
+
+ @Test
+ public void testTaskAttemptIdInvalid3() throws JSONException, Exception {
+
+ testTaskAttemptIdErrorGeneric("attempt_0_12345_m_000000",
+ "java.lang.Exception: TaskAttemptId string : attempt_0_12345_m_000000 is not properly formed");
+ }
+
+ private void testTaskAttemptIdErrorGeneric(String attid, String error)
+ throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+ String tid = MRApps.toString(task.getID());
+
+ try {
+ r.path("ws").path("v1").path("mapreduce").path("jobs").path(jobId)
+ .path("tasks").path(tid).path("attempts").path(attid)
+ .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+ fail("should have thrown exception on invalid uri");
+ } catch (UniformInterfaceException ue) {
+ ClientResponse response = ue.getResponse();
+ assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject msg = response.getEntity(JSONObject.class);
+ JSONObject exception = msg.getJSONObject("RemoteException");
+ assertEquals("incorrect number of elements", 3, exception.length());
+ String message = exception.getString("message");
+ String type = exception.getString("exception");
+ String classname = exception.getString("javaClassName");
+ WebServicesTestUtils.checkStringMatch("exception message", error,
+ message);
+ WebServicesTestUtils.checkStringMatch("exception type",
+ "NotFoundException", type);
+ WebServicesTestUtils.checkStringMatch("exception classname",
+ "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+ }
+ }
+ }
+ }
+
+ public void verifyAMTaskAttemptXML(Element element, TaskAttempt att,
+ TaskType ttype) {
+ verifyTaskAttemptGeneric(att, ttype,
+ WebServicesTestUtils.getXmlString(element, "id"),
+ WebServicesTestUtils.getXmlString(element, "state"),
+ WebServicesTestUtils.getXmlString(element, "type"),
+ WebServicesTestUtils.getXmlString(element, "rack"),
+ WebServicesTestUtils.getXmlString(element, "nodeHttpAddress"),
+ WebServicesTestUtils.getXmlString(element, "diagnostics"),
+ WebServicesTestUtils.getXmlString(element, "assignedContainerId"),
+ WebServicesTestUtils.getXmlLong(element, "startTime"),
+ WebServicesTestUtils.getXmlLong(element, "finishTime"),
+ WebServicesTestUtils.getXmlLong(element, "elapsedTime"),
+ WebServicesTestUtils.getXmlFloat(element, "progress"));
+
+ if (ttype == TaskType.REDUCE) {
+ verifyReduceTaskAttemptGeneric(att,
+ WebServicesTestUtils.getXmlLong(element, "shuffleFinishTime"),
+ WebServicesTestUtils.getXmlLong(element, "mergeFinishTime"),
+ WebServicesTestUtils.getXmlLong(element, "elapsedShuffleTime"),
+ WebServicesTestUtils.getXmlLong(element, "elapsedMergeTime"),
+ WebServicesTestUtils.getXmlLong(element, "elapsedReduceTime"));
+ }
+ }
+
+ public void verifyAMTaskAttempt(JSONObject info, TaskAttempt att,
+ TaskType ttype) throws JSONException {
+ if (ttype == TaskType.REDUCE) {
+ assertEquals("incorrect number of elements", 16, info.length());
+ } else {
+ assertEquals("incorrect number of elements", 11, info.length());
+ }
+
+ verifyTaskAttemptGeneric(att, ttype, info.getString("id"),
+ info.getString("state"), info.getString("type"),
+ info.getString("rack"), info.getString("nodeHttpAddress"),
+ info.getString("diagnostics"), info.getString("assignedContainerId"),
+ info.getLong("startTime"), info.getLong("finishTime"),
+ info.getLong("elapsedTime"), (float) info.getDouble("progress"));
+
+ if (ttype == TaskType.REDUCE) {
+ verifyReduceTaskAttemptGeneric(att, info.getLong("shuffleFinishTime"),
+ info.getLong("mergeFinishTime"), info.getLong("elapsedShuffleTime"),
+ info.getLong("elapsedMergeTime"), info.getLong("elapsedReduceTime"));
+ }
+ }
+
+ public void verifyAMTaskAttempts(JSONObject json, Task task)
+ throws JSONException {
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONObject attempts = json.getJSONObject("taskAttempts");
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONArray arr = attempts.getJSONArray("taskAttempt");
+ for (TaskAttempt att : task.getAttempts().values()) {
+ TaskAttemptId id = att.getID();
+ String attid = MRApps.toString(id);
+ Boolean found = false;
+
+ for (int i = 0; i < arr.length(); i++) {
+ JSONObject info = arr.getJSONObject(i);
+ if (attid.matches(info.getString("id"))) {
+ found = true;
+ verifyAMTaskAttempt(info, att, task.getType());
+ }
+ }
+ assertTrue("task attempt with id: " + attid
+ + " not in web service output", found);
+ }
+ }
+
+ public void verifyAMTaskAttemptsXML(NodeList nodes, Task task) {
+ assertEquals("incorrect number of elements", 1, nodes.getLength());
+
+ for (TaskAttempt att : task.getAttempts().values()) {
+ TaskAttemptId id = att.getID();
+ String attid = MRApps.toString(id);
+ Boolean found = false;
+ for (int i = 0; i < nodes.getLength(); i++) {
+ Element element = (Element) nodes.item(i);
+
+ if (attid.matches(WebServicesTestUtils.getXmlString(element, "id"))) {
+ found = true;
+ verifyAMTaskAttemptXML(element, att, task.getType());
+ }
+ }
+ assertTrue("task with id: " + attid + " not in web service output", found);
+ }
+ }
+
+ public void verifyTaskAttemptGeneric(TaskAttempt ta, TaskType ttype,
+ String id, String state, String type, String rack,
+ String nodeHttpAddress, String diagnostics, String assignedContainerId,
+ long startTime, long finishTime, long elapsedTime, float progress) {
+
+ TaskAttemptId attid = ta.getID();
+ String attemptId = MRApps.toString(attid);
+
+ WebServicesTestUtils.checkStringMatch("id", attemptId, id);
+ WebServicesTestUtils.checkStringMatch("type", ttype.toString(), type);
+ WebServicesTestUtils.checkStringMatch("state", ta.getState().toString(),
+ state);
+ WebServicesTestUtils.checkStringMatch("rack", ta.getNodeRackName(), rack);
+ WebServicesTestUtils.checkStringMatch("nodeHttpAddress",
+ ta.getNodeHttpAddress(), nodeHttpAddress);
+
+ String expectDiag = "";
+ List<String> diagnosticsList = ta.getDiagnostics();
+ if (diagnosticsList != null && !diagnostics.isEmpty()) {
+ StringBuffer b = new StringBuffer();
+ for (String diag : diagnosticsList) {
+ b.append(diag);
+ }
+ expectDiag = b.toString();
+ }
+ WebServicesTestUtils.checkStringMatch("diagnostics", expectDiag,
+ diagnostics);
+ WebServicesTestUtils.checkStringMatch("assignedContainerId",
+ ConverterUtils.toString(ta.getAssignedContainerID()),
+ assignedContainerId);
+
+ assertEquals("startTime wrong", ta.getLaunchTime(), startTime);
+ assertEquals("finishTime wrong", ta.getFinishTime(), finishTime);
+ assertEquals("elapsedTime wrong", finishTime - startTime, elapsedTime);
+ assertEquals("progress wrong", ta.getProgress() * 100, progress, 1e-3f);
+ }
+
+ public void verifyReduceTaskAttemptGeneric(TaskAttempt ta,
+ long shuffleFinishTime, long mergeFinishTime, long elapsedShuffleTime,
+ long elapsedMergeTime, long elapsedReduceTime) {
+
+ assertEquals("shuffleFinishTime wrong", ta.getShuffleFinishTime(),
+ shuffleFinishTime);
+ assertEquals("mergeFinishTime wrong", ta.getSortFinishTime(),
+ mergeFinishTime);
+ assertEquals("elapsedShuffleTime wrong",
+ ta.getLaunchTime() - ta.getShuffleFinishTime(), elapsedShuffleTime);
+ assertEquals("elapsedMergeTime wrong",
+ ta.getShuffleFinishTime() - ta.getSortFinishTime(), elapsedMergeTime);
+ assertEquals("elapsedReduceTime wrong",
+ ta.getSortFinishTime() - ta.getFinishTime(), elapsedReduceTime);
+ }
+
+ @Test
+ public void testTaskAttemptIdCounters() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+ String tid = MRApps.toString(task.getID());
+
+ for (TaskAttempt att : task.getAttempts().values()) {
+ TaskAttemptId attemptid = att.getID();
+ String attid = MRApps.toString(attemptid);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid)
+ .path("attempts").path(attid).path("counters")
+ .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("jobTaskAttemptCounters");
+ verifyAMJobTaskAttemptCounters(info, att);
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testTaskAttemptIdXMLCounters() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+ for (Task task : jobsMap.get(id).getTasks().values()) {
+
+ String tid = MRApps.toString(task.getID());
+ for (TaskAttempt att : task.getAttempts().values()) {
+ TaskAttemptId attemptid = att.getID();
+ String attid = MRApps.toString(attemptid);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("tasks").path(tid)
+ .path("attempts").path(attid).path("counters")
+ .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+
+ assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+ String xml = response.getEntity(String.class);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ InputSource is = new InputSource();
+ is.setCharacterStream(new StringReader(xml));
+ Document dom = db.parse(is);
+ NodeList nodes = dom.getElementsByTagName("jobTaskAttemptCounters");
+
+ verifyAMTaskCountersXML(nodes, att);
+ }
+ }
+ }
+ }
+
+ public void verifyAMJobTaskAttemptCounters(JSONObject info, TaskAttempt att)
+ throws JSONException {
+
+ assertEquals("incorrect number of elements", 2, info.length());
+
+ WebServicesTestUtils.checkStringMatch("id", MRApps.toString(att.getID()),
+ info.getString("id"));
+
+ // just do simple verification of fields - not data is correct
+ // in the fields
+ JSONArray counterGroups = info.getJSONArray("taskAttemptCounterGroup");
+ for (int i = 0; i < counterGroups.length(); i++) {
+ JSONObject counterGroup = counterGroups.getJSONObject(i);
+ String name = counterGroup.getString("counterGroupName");
+ assertTrue("name not set", (name != null && !name.isEmpty()));
+ JSONArray counters = counterGroup.getJSONArray("counter");
+ for (int j = 0; j < counters.length(); j++) {
+ JSONObject counter = counters.getJSONObject(j);
+ String counterName = counter.getString("name");
+ assertTrue("name not set",
+ (counterName != null && !counterName.isEmpty()));
+ long value = counter.getLong("value");
+ assertTrue("value >= 0", value >= 0);
+ }
+ }
+ }
+
+ public void verifyAMTaskCountersXML(NodeList nodes, TaskAttempt att) {
+
+ for (int i = 0; i < nodes.getLength(); i++) {
+
+ Element element = (Element) nodes.item(i);
+ WebServicesTestUtils.checkStringMatch("id", MRApps.toString(att.getID()),
+ WebServicesTestUtils.getXmlString(element, "id"));
+ // just do simple verification of fields - not data is correct
+ // in the fields
+ NodeList groups = element.getElementsByTagName("taskAttemptCounterGroup");
+
+ for (int j = 0; j < groups.getLength(); j++) {
+ Element counters = (Element) groups.item(j);
+ assertNotNull("should have counters in the web service info", counters);
+ String name = WebServicesTestUtils.getXmlString(counters,
+ "counterGroupName");
+ assertTrue("name not set", (name != null && !name.isEmpty()));
+ NodeList counterArr = counters.getElementsByTagName("counter");
+ for (int z = 0; z < counterArr.getLength(); z++) {
+ Element counter = (Element) counterArr.item(z);
+ String counterName = WebServicesTestUtils.getXmlString(counter,
+ "name");
+ assertTrue("counter name not set",
+ (counterName != null && !counterName.isEmpty()));
+
+ long value = WebServicesTestUtils.getXmlLong(counter, "value");
+ assertTrue("value not >= 0", value >= 0);
+
+ }
+ }
+ }
+ }
+
+}
Modified: hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesJobConf.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesJobConf.java?rev=1400227&r1=1400226&r2=1400227&view=diff
==============================================================================
--- hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesJobConf.java (original)
+++ hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesJobConf.java Fri Oct 19 18:59:06 2012
@@ -1,342 +1,342 @@
-///**
-// * 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.mapreduce.v2.app2.webapp;
-//
-//import static org.junit.Assert.assertEquals;
-//import static org.junit.Assert.assertNotNull;
-//import static org.junit.Assert.assertTrue;
-//import static org.junit.Assert.fail;
-//
-//import java.io.File;
-//import java.io.IOException;
-//import java.io.OutputStream;
-//import java.io.StringReader;
-//import java.util.Map;
-//
-//import javax.ws.rs.core.MediaType;
-//import javax.xml.parsers.DocumentBuilder;
-//import javax.xml.parsers.DocumentBuilderFactory;
-//
-//import org.apache.hadoop.conf.Configuration;
-//import org.apache.hadoop.fs.FileSystem;
-//import org.apache.hadoop.fs.FileUtil;
-//import org.apache.hadoop.fs.Path;
-//import org.apache.hadoop.mapreduce.MRJobConfig;
-//import org.apache.hadoop.mapreduce.v2.api.records.JobId;
-//import org.apache.hadoop.mapreduce.v2.app2.AppContext;
-//import org.apache.hadoop.mapreduce.v2.app2.MockJobs;
-//import org.apache.hadoop.mapreduce.v2.app2.job.Job;
-//import org.apache.hadoop.mapreduce.v2.util.MRApps;
-//import org.apache.hadoop.yarn.Clock;
-//import org.apache.hadoop.yarn.ClusterInfo;
-//import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
-//import org.apache.hadoop.yarn.api.records.ApplicationId;
-//import org.apache.hadoop.yarn.event.EventHandler;
-//import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
-//import org.apache.hadoop.yarn.webapp.WebServicesTestUtils;
-//import org.codehaus.jettison.json.JSONArray;
-//import org.codehaus.jettison.json.JSONException;
-//import org.codehaus.jettison.json.JSONObject;
-//import org.junit.AfterClass;
-//import org.junit.Before;
-//import org.junit.Test;
-//import org.w3c.dom.Document;
-//import org.w3c.dom.Element;
-//import org.w3c.dom.NodeList;
-//import org.xml.sax.InputSource;
-//
-//import com.google.common.collect.Maps;
-//import com.google.inject.Guice;
-//import com.google.inject.Injector;
-//import com.google.inject.servlet.GuiceServletContextListener;
-//import com.google.inject.servlet.ServletModule;
-//import com.sun.jersey.api.client.ClientResponse;
-//import com.sun.jersey.api.client.WebResource;
-//import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
-//import com.sun.jersey.test.framework.JerseyTest;
-//import com.sun.jersey.test.framework.WebAppDescriptor;
-//
-///**
-// * Test the app master web service Rest API for getting the job conf. This
-// * requires created a temporary configuration file.
-// *
-// * /ws/v1/mapreduce/job/{jobid}/conf
-// */
-//public class TestAMWebServicesJobConf extends JerseyTest {
-//
-// private static Configuration conf = new Configuration();
-// private static TestAppContext appContext;
-//
-// private static File testConfDir = new File("target",
-// TestAMWebServicesJobConf.class.getSimpleName() + "confDir");
-//
-// static class TestAppContext implements AppContext {
-// final ApplicationAttemptId appAttemptID;
-// final ApplicationId appID;
-// final String user = MockJobs.newUserName();
-// final Map<JobId, Job> jobs;
-// final long startTime = System.currentTimeMillis();
-//
-// TestAppContext(int appid, int numTasks, int numAttempts, Path confPath) {
-// appID = MockJobs.newAppID(appid);
-// appAttemptID = MockJobs.newAppAttemptID(appID, 0);
-// Map<JobId, Job> map = Maps.newHashMap();
-// Job job = MockJobs.newJob(appID, 0, numTasks, numAttempts, confPath);
-// map.put(job.getID(), job);
-// jobs = map;
-// }
-//
-// @Override
-// public ApplicationAttemptId getApplicationAttemptId() {
-// return appAttemptID;
-// }
-//
-// @Override
-// public ApplicationId getApplicationID() {
-// return appID;
-// }
-//
-// @Override
-// public CharSequence getUser() {
-// return user;
-// }
-//
-// @Override
-// public Job getJob(JobId jobID) {
-// return jobs.get(jobID);
-// }
-//
-// @Override
-// public Map<JobId, Job> getAllJobs() {
-// return jobs; // OK
-// }
-//
-// @SuppressWarnings("rawtypes")
-// @Override
-// public EventHandler getEventHandler() {
-// return null;
-// }
-//
-// @Override
-// public Clock getClock() {
-// return null;
-// }
-//
-// @Override
-// public String getApplicationName() {
-// return "TestApp";
-// }
-//
-// @Override
-// public long getStartTime() {
-// return startTime;
-// }
-//
-// @Override
-// public ClusterInfo getClusterInfo() {
-// return null;
-// }
-// }
-//
-// private Injector injector = Guice.createInjector(new ServletModule() {
-// @Override
-// protected void configureServlets() {
-//
-// Path confPath = new Path(testConfDir.toString(),
-// MRJobConfig.JOB_CONF_FILE);
-// Configuration config = new Configuration();
-//
-// FileSystem localFs;
-// try {
-// localFs = FileSystem.getLocal(config);
-// confPath = localFs.makeQualified(confPath);
-//
-// OutputStream out = localFs.create(confPath);
-// try {
-// conf.writeXml(out);
-// } finally {
-// out.close();
-// }
-// if (!localFs.exists(confPath)) {
-// fail("error creating config file: " + confPath);
-// }
-//
-// } catch (IOException e) {
-// fail("error creating config file: " + e.getMessage());
-// }
-//
-// appContext = new TestAppContext(0, 2, 1, confPath);
-//
-// bind(JAXBContextResolver.class);
-// bind(AMWebServices.class);
-// bind(GenericExceptionHandler.class);
-// bind(AppContext.class).toInstance(appContext);
-// bind(Configuration.class).toInstance(conf);
-//
-// serve("/*").with(GuiceContainer.class);
-// }
-// });
-//
-// public class GuiceServletConfig extends GuiceServletContextListener {
-//
-// @Override
-// protected Injector getInjector() {
-// return injector;
-// }
-// }
-//
-// @Before
-// @Override
-// public void setUp() throws Exception {
-// super.setUp();
-// testConfDir.mkdir();
-//
-// }
-//
-// @AfterClass
-// static public void stop() {
-// FileUtil.fullyDelete(testConfDir);
-// }
-//
-// public TestAMWebServicesJobConf() {
-// super(new WebAppDescriptor.Builder(
-// "org.apache.hadoop.mapreduce.v2.app2.webapp")
-// .contextListenerClass(GuiceServletConfig.class)
-// .filterClass(com.google.inject.servlet.GuiceFilter.class)
-// .contextPath("jersey-guice-filter").servletPath("/").build());
-// }
-//
-// @Test
-// public void testJobConf() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("conf")
-// .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONObject info = json.getJSONObject("conf");
-// verifyAMJobConf(info, jobsMap.get(id));
-// }
-// }
-//
-// @Test
-// public void testJobConfSlash() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("conf/")
-// .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONObject info = json.getJSONObject("conf");
-// verifyAMJobConf(info, jobsMap.get(id));
-// }
-// }
-//
-// @Test
-// public void testJobConfDefault() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("conf").get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-// JSONObject json = response.getEntity(JSONObject.class);
-// assertEquals("incorrect number of elements", 1, json.length());
-// JSONObject info = json.getJSONObject("conf");
-// verifyAMJobConf(info, jobsMap.get(id));
-// }
-// }
-//
-// @Test
-// public void testJobConfXML() throws JSONException, Exception {
-// WebResource r = resource();
-// Map<JobId, Job> jobsMap = appContext.getAllJobs();
-// for (JobId id : jobsMap.keySet()) {
-// String jobId = MRApps.toString(id);
-//
-// ClientResponse response = r.path("ws").path("v1").path("mapreduce")
-// .path("jobs").path(jobId).path("conf")
-// .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
-// assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
-// String xml = response.getEntity(String.class);
-// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-// DocumentBuilder db = dbf.newDocumentBuilder();
-// InputSource is = new InputSource();
-// is.setCharacterStream(new StringReader(xml));
-// Document dom = db.parse(is);
-// NodeList info = dom.getElementsByTagName("conf");
-// verifyAMJobConfXML(info, jobsMap.get(id));
-// }
-// }
-//
-// public void verifyAMJobConf(JSONObject info, Job job) throws JSONException {
-//
-// assertEquals("incorrect number of elements", 2, info.length());
-//
-// WebServicesTestUtils.checkStringMatch("path", job.getConfFile().toString(),
-// info.getString("path"));
-// // just do simple verification of fields - not data is correct
-// // in the fields
-// JSONArray properties = info.getJSONArray("property");
-// for (int i = 0; i < properties.length(); i++) {
-// JSONObject prop = properties.getJSONObject(i);
-// String name = prop.getString("name");
-// String value = prop.getString("value");
-// assertTrue("name not set", (name != null && !name.isEmpty()));
-// assertTrue("value not set", (value != null && !value.isEmpty()));
-// }
-// }
-//
-// public void verifyAMJobConfXML(NodeList nodes, Job job) {
-//
-// assertEquals("incorrect number of elements", 1, nodes.getLength());
-//
-// for (int i = 0; i < nodes.getLength(); i++) {
-// Element element = (Element) nodes.item(i);
-// WebServicesTestUtils.checkStringMatch("path", job.getConfFile()
-// .toString(), WebServicesTestUtils.getXmlString(element, "path"));
-//
-// // just do simple verification of fields - not data is correct
-// // in the fields
-// NodeList properties = element.getElementsByTagName("property");
-//
-// for (int j = 0; j < properties.getLength(); j++) {
-// Element property = (Element) properties.item(j);
-// assertNotNull("should have counters in the web service info", property);
-// String name = WebServicesTestUtils.getXmlString(property, "name");
-// String value = WebServicesTestUtils.getXmlString(property, "value");
-// assertTrue("name not set", (name != null && !name.isEmpty()));
-// assertTrue("name not set", (value != null && !value.isEmpty()));
-// }
-// }
-// }
-//
-//}
+/**
+ * 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.mapreduce.v2.app2.webapp;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.StringReader;
+import java.util.Map;
+
+import javax.ws.rs.core.MediaType;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.FileUtil;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.mapreduce.MRJobConfig;
+import org.apache.hadoop.mapreduce.v2.api.records.JobId;
+import org.apache.hadoop.mapreduce.v2.app2.AppContext;
+import org.apache.hadoop.mapreduce.v2.app2.MockJobs;
+import org.apache.hadoop.mapreduce.v2.app2.job.Job;
+import org.apache.hadoop.mapreduce.v2.util.MRApps;
+import org.apache.hadoop.yarn.Clock;
+import org.apache.hadoop.yarn.ClusterInfo;
+import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
+import org.apache.hadoop.yarn.webapp.WebServicesTestUtils;
+import org.codehaus.jettison.json.JSONArray;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.servlet.GuiceServletContextListener;
+import com.google.inject.servlet.ServletModule;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
+import com.sun.jersey.test.framework.JerseyTest;
+import com.sun.jersey.test.framework.WebAppDescriptor;
+
+/**
+ * Test the app master web service Rest API for getting the job conf. This
+ * requires created a temporary configuration file.
+ *
+ * /ws/v1/mapreduce/job/{jobid}/conf
+ */
+public class TestAMWebServicesJobConf extends JerseyTest {
+
+ private static Configuration conf = new Configuration();
+ private static TestAppContext appContext;
+
+ private static File testConfDir = new File("target",
+ TestAMWebServicesJobConf.class.getSimpleName() + "confDir");
+
+ static class TestAppContext implements AppContext {
+ final ApplicationAttemptId appAttemptID;
+ final ApplicationId appID;
+ final String user = MockJobs.newUserName();
+ final Map<JobId, Job> jobs;
+ final long startTime = System.currentTimeMillis();
+
+ TestAppContext(int appid, int numTasks, int numAttempts, Path confPath) {
+ appID = MockJobs.newAppID(appid);
+ appAttemptID = MockJobs.newAppAttemptID(appID, 0);
+ Map<JobId, Job> map = Maps.newHashMap();
+ Job job = MockJobs.newJob(appID, 0, numTasks, numAttempts, confPath);
+ map.put(job.getID(), job);
+ jobs = map;
+ }
+
+ @Override
+ public ApplicationAttemptId getApplicationAttemptId() {
+ return appAttemptID;
+ }
+
+ @Override
+ public ApplicationId getApplicationID() {
+ return appID;
+ }
+
+ @Override
+ public CharSequence getUser() {
+ return user;
+ }
+
+ @Override
+ public Job getJob(JobId jobID) {
+ return jobs.get(jobID);
+ }
+
+ @Override
+ public Map<JobId, Job> getAllJobs() {
+ return jobs; // OK
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public EventHandler getEventHandler() {
+ return null;
+ }
+
+ @Override
+ public Clock getClock() {
+ return null;
+ }
+
+ @Override
+ public String getApplicationName() {
+ return "TestApp";
+ }
+
+ @Override
+ public long getStartTime() {
+ return startTime;
+ }
+
+ @Override
+ public ClusterInfo getClusterInfo() {
+ return null;
+ }
+ }
+
+ private Injector injector = Guice.createInjector(new ServletModule() {
+ @Override
+ protected void configureServlets() {
+
+ Path confPath = new Path(testConfDir.toString(),
+ MRJobConfig.JOB_CONF_FILE);
+ Configuration config = new Configuration();
+
+ FileSystem localFs;
+ try {
+ localFs = FileSystem.getLocal(config);
+ confPath = localFs.makeQualified(confPath);
+
+ OutputStream out = localFs.create(confPath);
+ try {
+ conf.writeXml(out);
+ } finally {
+ out.close();
+ }
+ if (!localFs.exists(confPath)) {
+ fail("error creating config file: " + confPath);
+ }
+
+ } catch (IOException e) {
+ fail("error creating config file: " + e.getMessage());
+ }
+
+ appContext = new TestAppContext(0, 2, 1, confPath);
+
+ bind(JAXBContextResolver.class);
+ bind(AMWebServices.class);
+ bind(GenericExceptionHandler.class);
+ bind(AppContext.class).toInstance(appContext);
+ bind(Configuration.class).toInstance(conf);
+
+ serve("/*").with(GuiceContainer.class);
+ }
+ });
+
+ public class GuiceServletConfig extends GuiceServletContextListener {
+
+ @Override
+ protected Injector getInjector() {
+ return injector;
+ }
+ }
+
+ @Before
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ testConfDir.mkdir();
+
+ }
+
+ @AfterClass
+ static public void stop() {
+ FileUtil.fullyDelete(testConfDir);
+ }
+
+ public TestAMWebServicesJobConf() {
+ super(new WebAppDescriptor.Builder(
+ "org.apache.hadoop.mapreduce.v2.app2.webapp")
+ .contextListenerClass(GuiceServletConfig.class)
+ .filterClass(com.google.inject.servlet.GuiceFilter.class)
+ .contextPath("jersey-guice-filter").servletPath("/").build());
+ }
+
+ @Test
+ public void testJobConf() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("conf")
+ .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("conf");
+ verifyAMJobConf(info, jobsMap.get(id));
+ }
+ }
+
+ @Test
+ public void testJobConfSlash() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("conf/")
+ .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("conf");
+ verifyAMJobConf(info, jobsMap.get(id));
+ }
+ }
+
+ @Test
+ public void testJobConfDefault() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("conf").get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+ JSONObject json = response.getEntity(JSONObject.class);
+ assertEquals("incorrect number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("conf");
+ verifyAMJobConf(info, jobsMap.get(id));
+ }
+ }
+
+ @Test
+ public void testJobConfXML() throws JSONException, Exception {
+ WebResource r = resource();
+ Map<JobId, Job> jobsMap = appContext.getAllJobs();
+ for (JobId id : jobsMap.keySet()) {
+ String jobId = MRApps.toString(id);
+
+ ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+ .path("jobs").path(jobId).path("conf")
+ .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+ assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+ String xml = response.getEntity(String.class);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ InputSource is = new InputSource();
+ is.setCharacterStream(new StringReader(xml));
+ Document dom = db.parse(is);
+ NodeList info = dom.getElementsByTagName("conf");
+ verifyAMJobConfXML(info, jobsMap.get(id));
+ }
+ }
+
+ public void verifyAMJobConf(JSONObject info, Job job) throws JSONException {
+
+ assertEquals("incorrect number of elements", 2, info.length());
+
+ WebServicesTestUtils.checkStringMatch("path", job.getConfFile().toString(),
+ info.getString("path"));
+ // just do simple verification of fields - not data is correct
+ // in the fields
+ JSONArray properties = info.getJSONArray("property");
+ for (int i = 0; i < properties.length(); i++) {
+ JSONObject prop = properties.getJSONObject(i);
+ String name = prop.getString("name");
+ String value = prop.getString("value");
+ assertTrue("name not set", (name != null && !name.isEmpty()));
+ assertTrue("value not set", (value != null && !value.isEmpty()));
+ }
+ }
+
+ public void verifyAMJobConfXML(NodeList nodes, Job job) {
+
+ assertEquals("incorrect number of elements", 1, nodes.getLength());
+
+ for (int i = 0; i < nodes.getLength(); i++) {
+ Element element = (Element) nodes.item(i);
+ WebServicesTestUtils.checkStringMatch("path", job.getConfFile()
+ .toString(), WebServicesTestUtils.getXmlString(element, "path"));
+
+ // just do simple verification of fields - not data is correct
+ // in the fields
+ NodeList properties = element.getElementsByTagName("property");
+
+ for (int j = 0; j < properties.getLength(); j++) {
+ Element property = (Element) properties.item(j);
+ assertNotNull("should have counters in the web service info", property);
+ String name = WebServicesTestUtils.getXmlString(property, "name");
+ String value = WebServicesTestUtils.getXmlString(property, "value");
+ assertTrue("name not set", (name != null && !name.isEmpty()));
+ assertTrue("name not set", (value != null && !value.isEmpty()));
+ }
+ }
+ }
+
+}