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 vi...@apache.org on 2011/12/14 00:05:59 UTC
svn commit: r1213975 [6/6] - in
/hadoop/common/trunk/hadoop-mapreduce-project: ./ hadoop-mapreduce-client/
hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/client/
hadoop-mapreduce-client/hadoop-mapre...
Added: hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java?rev=1213975&view=auto
==============================================================================
--- hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java (added)
+++ hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java Tue Dec 13 23:05:56 2011
@@ -0,0 +1,1101 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.yarn.server.resourcemanager.webapp;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+
+import javax.ws.rs.core.MediaType;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.yarn.api.records.ContainerStatus;
+import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
+import org.apache.hadoop.yarn.api.records.NodeHealthStatus;
+import org.apache.hadoop.yarn.api.records.QueueState;
+import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeState;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeStatusEvent;
+import org.apache.hadoop.yarn.server.security.ApplicationACLsManager;
+import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
+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 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.ClientResponse.Status;
+import com.sun.jersey.api.client.UniformInterfaceException;
+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;
+
+public class TestRMWebServices extends JerseyTest {
+
+ private static MockRM rm;
+
+ private Injector injector = Guice.createInjector(new ServletModule() {
+ @Override
+ protected void configureServlets() {
+ bind(JAXBContextResolver.class);
+ bind(RMWebServices.class);
+ bind(GenericExceptionHandler.class);
+ rm = new MockRM(new Configuration());
+ bind(ResourceManager.class).toInstance(rm);
+ bind(RMContext.class).toInstance(rm.getRMContext());
+ bind(ApplicationACLsManager.class).toInstance(
+ rm.getApplicationACLsManager());
+ 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 TestRMWebServices() {
+ super(new WebAppDescriptor.Builder(
+ "org.apache.hadoop.yarn.server.resourcemanager.webapp")
+ .contextListenerClass(GuiceServletConfig.class)
+ .filterClass(com.google.inject.servlet.GuiceFilter.class)
+ .contextPath("jersey-guice-filter").servletPath("/").build());
+ }
+
+ @Test
+ public void testCluster() throws JSONException, Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster")
+ .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+ verifyClusterInfo(json);
+ }
+
+ @Test
+ public void testClusterSlash() throws JSONException, Exception {
+ WebResource r = resource();
+ // test with trailing "/" to make sure acts same as without slash
+ JSONObject json = r.path("ws").path("v1").path("cluster/")
+ .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+ verifyClusterInfo(json);
+ }
+
+ @Test
+ public void testInfo() throws JSONException, Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("info")
+ .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+ verifyClusterInfo(json);
+ }
+
+ @Test
+ public void testInfoSlash() throws JSONException, Exception {
+ WebResource r = resource();
+ // test with trailing "/" to make sure acts same as without slash
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("info/")
+ .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+ verifyClusterInfo(json);
+ }
+
+ public void verifyClusterInfo(JSONObject json) throws JSONException,
+ Exception {
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject clusterinfo = json.getJSONObject("clusterInfo");
+ assertEquals("correct number of elements", 9, clusterinfo.length());
+ String clusterid = clusterinfo.get("id").toString();
+ assertTrue("clusterId doesn't match: " + clusterid, clusterid.toString()
+ .matches("^\\d+"));
+ String startedon = clusterinfo.get("startedOn").toString();
+ assertTrue("startedOn doesn't match: " + startedon,
+ startedon.matches("^\\d+"));
+ String state = clusterinfo.get("state").toString();
+ assertTrue("stated doesn't match: " + state, state.matches("INITED"));
+ String rmVersion = clusterinfo.get("resourceManagerVersion").toString();
+ assertTrue("rm version doesn't match: " + rmVersion,
+ rmVersion.matches(".*"));
+ String rmBuildVersion = clusterinfo.get("resourceManagerBuildVersion")
+ .toString();
+ assertTrue("rm Build version doesn't match: " + rmBuildVersion,
+ rmBuildVersion.matches(".*"));
+ String rmVersionBuiltOn = clusterinfo.get("resourceManagerVersionBuiltOn")
+ .toString();
+ assertTrue(
+ "rm version built on doesn't match: " + rmVersionBuiltOn,
+ rmVersionBuiltOn
+ .matches("^\\w+\\s+\\w+\\s+\\d+\\s+\\d\\d:\\d\\d:\\d\\d\\s+\\w+\\s+\\d\\d\\d\\d"));
+ String hadoopVersion = clusterinfo.get("hadoopVersion").toString();
+ assertTrue("hadoop version doesn't match: " + hadoopVersion,
+ hadoopVersion.matches(".*"));
+ String hadoopBuildVersion = clusterinfo.get("hadoopBuildVersion")
+ .toString();
+ assertTrue("hadoop Build version doesn't match: " + hadoopBuildVersion,
+ hadoopBuildVersion.matches(".*"));
+ String hadoopVersionBuiltOn = clusterinfo.get("hadoopVersionBuiltOn")
+ .toString();
+ assertTrue(
+ "hadoop version built on doesn't match: " + hadoopVersionBuiltOn,
+ hadoopVersionBuiltOn
+ .matches("^\\w+\\s+\\w+\\s+\\d+\\s+\\d\\d:\\d\\d:\\d\\d\\s+\\w+\\s+\\d\\d\\d\\d"));
+ }
+
+ @Test
+ public void testClusterMetrics() throws JSONException, Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("metrics")
+ .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+ verifyClusterMetrics(json);
+ }
+
+ @Test
+ public void testClusterMetricsSlash() throws JSONException, Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("metrics/")
+ .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+ verifyClusterMetrics(json);
+ }
+
+ public void verifyClusterMetrics(JSONObject json) throws JSONException,
+ Exception {
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject clusterinfo = json.getJSONObject("clusterMetrics");
+ assertEquals("correct number of elements", 11, clusterinfo.length());
+ assertEquals("appsSubmitted doesn't match", 0,
+ clusterinfo.getInt("appsSubmitted"));
+ assertEquals("reservedMB doesn't match", 0,
+ clusterinfo.getInt("reservedMB"));
+ assertEquals("availableMB doesn't match", 0,
+ clusterinfo.getInt("availableMB"));
+ assertEquals("allocatedMB doesn't match", 0,
+ clusterinfo.getInt("allocatedMB"));
+ assertEquals("containersAllocated doesn't match", 0,
+ clusterinfo.getInt("containersAllocated"));
+ assertEquals("totalMB doesn't match", 0, clusterinfo.getInt("totalMB"));
+ assertEquals("totalNodes doesn't match", 0,
+ clusterinfo.getInt("totalNodes"));
+ assertEquals("lostNodes doesn't match", 0, clusterinfo.getInt("lostNodes"));
+ assertEquals("unhealthyNodes doesn't match", 0,
+ clusterinfo.getInt("unhealthyNodes"));
+ assertEquals("decommissionedNodes doesn't match", 0,
+ clusterinfo.getInt("decommissionedNodes"));
+ assertEquals("rebootedNodes doesn't match", 0,
+ clusterinfo.getInt("rebootedNodes"));
+ }
+
+ @Test
+ public void testClusterSchedulerFifo() throws JSONException, Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("scheduler")
+ .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+ verifyClusterSchedulerFifo(json);
+ }
+
+ @Test
+ public void testClusterSchedulerFifoSlash() throws JSONException, Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster")
+ .path("scheduler/").accept(MediaType.APPLICATION_JSON)
+ .get(JSONObject.class);
+ verifyClusterSchedulerFifo(json);
+ }
+
+ public void verifyClusterSchedulerFifo(JSONObject json) throws JSONException,
+ Exception {
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("scheduler");
+ assertEquals("correct number of elements", 1, info.length());
+ info = info.getJSONObject("schedulerInfo");
+ assertEquals("correct number of elements", 11, info.length());
+ assertEquals("type doesn't match", "fifoScheduler", info.getString("type"));
+ assertEquals("qstate doesn't match", QueueState.RUNNING.toString(),
+ info.getString("qstate"));
+ assertEquals("capacity doesn't match", 1.0, info.getDouble("capacity"), 0.0);
+ assertEquals("usedCapacity doesn't match", Float.NaN,
+ info.getDouble("usedCapacity"), 0.0);
+ assertEquals("minQueueMemoryCapacity doesn't match", 1024,
+ info.getInt("minQueueMemoryCapacity"));
+ assertEquals("maxQueueMemoryCapacity doesn't match", 10240,
+ info.getInt("maxQueueMemoryCapacity"));
+ assertEquals("maxQueueMemoryCapacity doesn't match", 10240,
+ info.getInt("maxQueueMemoryCapacity"));
+
+ }
+
+ @Test
+ public void testNodes() throws JSONException, Exception {
+ testNodesHelper("nodes");
+ }
+
+ @Test
+ public void testNodesSlash() throws JSONException, Exception {
+ testNodesHelper("nodes/");
+ }
+
+ @Test
+ public void testNodesQueryState() throws JSONException, Exception {
+ WebResource r = resource();
+ MockNM nm1 = rm.registerNode("h1:1234", 5120);
+ MockNM nm2 = rm.registerNode("h2:1235", 5121);
+ rm.sendNodeStarted(nm1);
+ rm.NMwaitForState(nm1.getNodeId(), RMNodeState.RUNNING);
+ rm.NMwaitForState(nm2.getNodeId(), RMNodeState.NEW);
+
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("nodes")
+ .queryParam("state", RMNodeState.RUNNING.toString())
+ .accept("application/json").get(JSONObject.class);
+
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject nodes = json.getJSONObject("nodes");
+ assertEquals("correct number of elements", 1, nodes.length());
+ JSONArray nodeArray = nodes.getJSONArray("node");
+ assertEquals("correct number of elements", 1, nodeArray.length());
+ JSONObject info = nodeArray.getJSONObject(0);
+
+ verifyNodeInfo(info, nm1, RMNodeState.RUNNING);
+ }
+
+ @Test
+ public void testNodesQueryStateNone() throws JSONException, Exception {
+ WebResource r = resource();
+ rm.registerNode("h1:1234", 5120);
+ rm.registerNode("h2:1235", 5121);
+
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("nodes")
+ .queryParam("state", RMNodeState.DECOMMISSIONED.toString())
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ assertEquals("nodes is not null", JSONObject.NULL, json.get("nodes"));
+ }
+
+ @Test
+ public void testNodesQueryStateInvalid() throws JSONException, Exception {
+ WebResource r = resource();
+ rm.registerNode("h1:1234", 5120);
+ rm.registerNode("h2:1235", 5121);
+
+ try {
+ r.path("ws").path("v1").path("cluster").path("nodes")
+ .queryParam("state", "BOGUSSTATE").accept("application/json")
+ .get(JSONObject.class);
+
+ fail("should have thrown exception querying invalid state");
+ } catch (UniformInterfaceException ue) {
+ ClientResponse response = ue.getResponse();
+
+ assertEquals(Status.BAD_REQUEST, response.getClientResponseStatus());
+ JSONObject msg = response.getEntity(JSONObject.class);
+ JSONObject exception = msg.getJSONObject("RemoteException");
+ assertEquals("correct number of elements", 3, exception.length());
+ String message = exception.getString("message");
+ String type = exception.getString("exception");
+ String classname = exception.getString("javaClassName");
+ checkStringMatch(
+ "exception message",
+ "No enum const class org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeState.BOGUSSTATE",
+ message);
+ checkStringMatch("exception type", "IllegalArgumentException", type);
+ checkStringMatch("exception classname",
+ "java.lang.IllegalArgumentException", classname);
+
+ } finally {
+ rm.stop();
+ }
+ }
+
+ @Test
+ public void testNodesQueryHealthy() throws JSONException, Exception {
+ WebResource r = resource();
+ MockNM nm1 = rm.registerNode("h1:1234", 5120);
+ MockNM nm2 = rm.registerNode("h2:1235", 5121);
+ rm.sendNodeStarted(nm1);
+ rm.NMwaitForState(nm1.getNodeId(), RMNodeState.RUNNING);
+ rm.NMwaitForState(nm2.getNodeId(), RMNodeState.NEW);
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("nodes")
+ .queryParam("healthy", "true").accept("application/json")
+ .get(JSONObject.class);
+
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject nodes = json.getJSONObject("nodes");
+ assertEquals("correct number of elements", 1, nodes.length());
+ JSONArray nodeArray = nodes.getJSONArray("node");
+ assertEquals("correct number of elements", 2, nodeArray.length());
+ }
+
+ @Test
+ public void testNodesQueryHealthyCase() throws JSONException, Exception {
+ WebResource r = resource();
+ MockNM nm1 = rm.registerNode("h1:1234", 5120);
+ MockNM nm2 = rm.registerNode("h2:1235", 5121);
+ rm.sendNodeStarted(nm1);
+ rm.NMwaitForState(nm1.getNodeId(), RMNodeState.RUNNING);
+ rm.NMwaitForState(nm2.getNodeId(), RMNodeState.NEW);
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("nodes")
+ .queryParam("healthy", "TRUe").accept("application/json")
+ .get(JSONObject.class);
+
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject nodes = json.getJSONObject("nodes");
+ assertEquals("correct number of elements", 1, nodes.length());
+ JSONArray nodeArray = nodes.getJSONArray("node");
+ assertEquals("correct number of elements", 2, nodeArray.length());
+
+ }
+
+ @Test
+ public void testNodesQueryHealthyAndState() throws JSONException, Exception {
+ WebResource r = resource();
+ MockNM nm1 = rm.registerNode("h1:1234", 5120);
+ MockNM nm2 = rm.registerNode("h2:1235", 5121);
+ rm.sendNodeStarted(nm1);
+ rm.NMwaitForState(nm2.getNodeId(), RMNodeState.NEW);
+ rm.NMwaitForState(nm1.getNodeId(), RMNodeState.RUNNING);
+ RMNodeImpl node = (RMNodeImpl) rm.getRMContext().getRMNodes()
+ .get(nm1.getNodeId());
+ NodeHealthStatus nodeHealth = node.getNodeHealthStatus();
+ nodeHealth.setHealthReport("test health report");
+ nodeHealth.setIsNodeHealthy(false);
+ node.handle(new RMNodeStatusEvent(nm1.getNodeId(), nodeHealth,
+ new ArrayList<ContainerStatus>(), null));
+ rm.NMwaitForState(nm1.getNodeId(), RMNodeState.UNHEALTHY);
+
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("nodes")
+ .queryParam("healthy", "true")
+ .queryParam("state", RMNodeState.RUNNING.toString())
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ assertEquals("nodes is not null", JSONObject.NULL, json.get("nodes"));
+ }
+
+ @Test
+ public void testNodesQueryHealthyFalse() throws JSONException, Exception {
+ WebResource r = resource();
+ MockNM nm1 = rm.registerNode("h1:1234", 5120);
+ MockNM nm2 = rm.registerNode("h2:1235", 5121);
+ rm.sendNodeStarted(nm1);
+ rm.NMwaitForState(nm1.getNodeId(), RMNodeState.RUNNING);
+ rm.NMwaitForState(nm2.getNodeId(), RMNodeState.NEW);
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("nodes")
+ .queryParam("healthy", "false").accept("application/json")
+ .get(JSONObject.class);
+
+ assertEquals("correct number of elements", 1, json.length());
+ assertEquals("nodes is not null", JSONObject.NULL, json.get("nodes"));
+ }
+
+ @Test
+ public void testNodesQueryHealthyInvalid() throws JSONException, Exception {
+ WebResource r = resource();
+ rm.registerNode("h1:1234", 5120);
+ rm.registerNode("h2:1235", 5121);
+
+ try {
+ r.path("ws").path("v1").path("cluster").path("nodes")
+ .queryParam("healthy", "tr").accept("application/json")
+ .get(JSONObject.class);
+ fail("should have thrown exception querying invalid healthy string");
+ } catch (UniformInterfaceException ue) {
+ ClientResponse response = ue.getResponse();
+ assertEquals(Status.BAD_REQUEST, response.getClientResponseStatus());
+ JSONObject msg = response.getEntity(JSONObject.class);
+ JSONObject exception = msg.getJSONObject("RemoteException");
+ assertEquals("correct number of elements", 3, exception.length());
+ String message = exception.getString("message");
+ String type = exception.getString("exception");
+ String classname = exception.getString("javaClassName");
+ checkStringMatch(
+ "exception message",
+ "java.lang.Exception: Error: You must specify either true or false to query on health",
+ message);
+ checkStringMatch("exception type", "BadRequestException", type);
+ checkStringMatch("exception classname",
+ "org.apache.hadoop.yarn.webapp.BadRequestException", classname);
+
+ } finally {
+ rm.stop();
+ }
+ }
+
+ public void testNodesHelper(String path) throws JSONException, Exception {
+ WebResource r = resource();
+ MockNM nm1 = rm.registerNode("h1:1234", 5120);
+ MockNM nm2 = rm.registerNode("h2:1235", 5121);
+ JSONObject json = r.path("ws").path("v1").path("cluster").path(path)
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject nodes = json.getJSONObject("nodes");
+ assertEquals("correct number of elements", 1, nodes.length());
+ JSONArray nodeArray = nodes.getJSONArray("node");
+ assertEquals("correct number of elements", 2, nodeArray.length());
+ JSONObject info = nodeArray.getJSONObject(0);
+ String id = info.get("id").toString();
+
+ if (id.matches("h1:1234")) {
+ verifyNodeInfo(info, nm1, RMNodeState.NEW);
+ verifyNodeInfo(nodeArray.getJSONObject(1), nm2, RMNodeState.NEW);
+ } else {
+ verifyNodeInfo(info, nm2, RMNodeState.NEW);
+ verifyNodeInfo(nodeArray.getJSONObject(1), nm1, RMNodeState.NEW);
+ }
+ }
+
+ @Test
+ public void testSingleNode() throws JSONException, Exception {
+ rm.registerNode("h1:1234", 5120);
+ MockNM nm2 = rm.registerNode("h2:1235", 5121);
+ testSingleNodeHelper("h2:1235", nm2);
+ }
+
+ @Test
+ public void testSingleNodeSlash() throws JSONException, Exception {
+ MockNM nm1 = rm.registerNode("h1:1234", 5120);
+ rm.registerNode("h2:1235", 5121);
+ testSingleNodeHelper("h1:1234/", nm1);
+ }
+
+ public void testSingleNodeHelper(String nodeid, MockNM nm)
+ throws JSONException, Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("nodes")
+ .path(nodeid).accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject info = json.getJSONObject("node");
+ verifyNodeInfo(info, nm, RMNodeState.NEW);
+ }
+
+ @Test
+ public void testNonexistNode() throws JSONException, Exception {
+ rm.registerNode("h1:1234", 5120);
+ rm.registerNode("h2:1235", 5121);
+ WebResource r = resource();
+ try {
+ r.path("ws").path("v1").path("cluster").path("nodes")
+ .path("node_invalid:99").accept("application/json")
+ .get(JSONObject.class);
+
+ fail("should have thrown exception on non-existent nodeid");
+ } catch (UniformInterfaceException ue) {
+ ClientResponse response = ue.getResponse();
+ assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+
+ JSONObject msg = response.getEntity(JSONObject.class);
+ JSONObject exception = msg.getJSONObject("RemoteException");
+ assertEquals("correct number of elements", 3, exception.length());
+ String message = exception.getString("message");
+ String type = exception.getString("exception");
+ String classname = exception.getString("javaClassName");
+ checkStringMatch("exception message",
+ "java.lang.Exception: nodeId, node_invalid:99, is not found", message);
+ checkStringMatch("exception type", "NotFoundException", type);
+ checkStringMatch("exception classname",
+ "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+
+ } finally {
+ rm.stop();
+ }
+ }
+
+ @Test
+ public void testInvalidNode() throws JSONException, Exception {
+ rm.registerNode("h1:1234", 5120);
+ rm.registerNode("h2:1235", 5121);
+
+ WebResource r = resource();
+ try {
+ r.path("ws").path("v1").path("cluster").path("nodes")
+ .path("node_invalid_foo").accept("application/json")
+ .get(JSONObject.class);
+
+ fail("should have thrown exception on non-existent nodeid");
+ } catch (UniformInterfaceException ue) {
+ ClientResponse response = ue.getResponse();
+
+ assertEquals(Status.BAD_REQUEST, response.getClientResponseStatus());
+ JSONObject msg = response.getEntity(JSONObject.class);
+ JSONObject exception = msg.getJSONObject("RemoteException");
+ assertEquals("correct number of elements", 3, exception.length());
+ String message = exception.getString("message");
+ String type = exception.getString("exception");
+ String classname = exception.getString("javaClassName");
+ checkStringMatch("exception message",
+ "Invalid NodeId \\[node_invalid_foo\\]. Expected host:port", message);
+ checkStringMatch("exception type", "IllegalArgumentException", type);
+ checkStringMatch("exception classname",
+ "java.lang.IllegalArgumentException", classname);
+ } finally {
+ rm.stop();
+ }
+ }
+
+ public void verifyNodeInfo(JSONObject nodeInfo, MockNM nm,
+ RMNodeState expectedState) throws JSONException, Exception {
+ assertEquals("correct number of elements", 11, nodeInfo.length());
+ String state = nodeInfo.get("state").toString();
+ assertTrue("stated doesn't match: " + state,
+ state.matches(expectedState.toString()));
+ String rack = nodeInfo.get("rack").toString();
+ assertTrue("rack doesn't match: " + rack, rack.matches("/default-rack"));
+ String healthStatus = nodeInfo.get("healthStatus").toString();
+ assertTrue("healthStatus doesn't match: " + healthStatus,
+ healthStatus.matches("Healthy"));
+ String id = nodeInfo.get("id").toString();
+ assertTrue("id doesn't match, got: " + id + " expected: "
+ + nm.getNodeId().toString(), id.matches(nm.getNodeId().toString()));
+ String nodeHostName = nodeInfo.get("nodeHostName").toString();
+ assertTrue("hostname doesn't match, got: " + nodeHostName + " expected: "
+ + nm.getNodeId().getHost(),
+ nodeHostName.matches(nm.getNodeId().getHost()));
+
+ String nodeHTTPAddress = nodeInfo.get("nodeHTTPAddress").toString();
+ String expectedHttpAddress = nm.getNodeId().getHost() + ":"
+ + nm.getHttpPort();
+ assertTrue("nodeHTTPAddress doesn't match, got: " + nodeHTTPAddress
+ + " expected: " + expectedHttpAddress,
+ nodeHTTPAddress.matches(expectedHttpAddress));
+ // could use this for other checks
+ RMNode node = rm.getRMContext().getRMNodes().get(nm.getNodeId());
+ long lastHealthUpdate = nodeInfo.getLong("lastHealthUpdate");
+ long expectedHealthUpdate = node.getNodeHealthStatus()
+ .getLastHealthReportTime();
+ assertEquals("lastHealthUpdate doesn't match, got: " + lastHealthUpdate
+ + " expected: " + expectedHealthUpdate, expectedHealthUpdate,
+ lastHealthUpdate);
+ String healthReport = nodeInfo.get("healthReport").toString();
+ assertTrue("healthReport doesn't match: " + healthReport,
+ healthReport.matches("Healthy"));
+
+ int numContainers = nodeInfo.getInt("numContainers");
+ assertEquals("numContainers doesn't match: " + numContainers, 0,
+ numContainers);
+
+ long usedMemoryMB = nodeInfo.getLong("usedMemoryMB");
+ assertEquals("usedMemoryMB doesn't match: " + usedMemoryMB, 0, usedMemoryMB);
+
+ long availMemoryMB = nodeInfo.getLong("availMemoryMB");
+ assertEquals("availMemoryMB doesn't match: " + availMemoryMB, 0,
+ availMemoryMB);
+ }
+
+ @Test
+ public void testApps() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ RMApp app1 = rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ testAppsHelper("apps", app1);
+ rm.stop();
+
+ }
+
+ @Test
+ public void testAppsSlash() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ RMApp app1 = rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ testAppsHelper("apps/", app1);
+ rm.stop();
+
+ }
+
+ public void testAppsHelper(String path, RMApp app) throws JSONException,
+ Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path(path)
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 1, array.length());
+ verifyAppInfo(array.getJSONObject(0), app);
+
+ }
+
+ @Test
+ public void testAppsQueryState() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ RMApp app1 = rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("state", RMAppState.ACCEPTED.toString())
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 1, array.length());
+ verifyAppInfo(array.getJSONObject(0), app1);
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryStateNone() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("state", RMAppState.RUNNING.toString())
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ assertEquals("apps is not null", JSONObject.NULL, json.get("apps"));
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryStateInvalid() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ WebResource r = resource();
+
+ try {
+ r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("state", "INVALID_test").accept("application/json")
+ .get(JSONObject.class);
+ fail("should have thrown exception on invalid state query");
+ } catch (UniformInterfaceException ue) {
+ ClientResponse response = ue.getResponse();
+
+ assertEquals(Status.BAD_REQUEST, response.getClientResponseStatus());
+ JSONObject msg = response.getEntity(JSONObject.class);
+ JSONObject exception = msg.getJSONObject("RemoteException");
+ assertEquals("correct number of elements", 3, exception.length());
+ String message = exception.getString("message");
+ String type = exception.getString("exception");
+ String classname = exception.getString("javaClassName");
+ checkStringMatch(
+ "exception message",
+ "No enum const class org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState.INVALID_test",
+ message);
+ checkStringMatch("exception type", "IllegalArgumentException", type);
+ checkStringMatch("exception classname",
+ "java.lang.IllegalArgumentException", classname);
+
+ } finally {
+ rm.stop();
+ }
+ }
+
+ @Test
+ public void testAppsQueryUser() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+
+ amNodeManager.nodeHeartbeat(true);
+ WebResource r = resource();
+ JSONObject json = r
+ .path("ws")
+ .path("v1")
+ .path("cluster")
+ .path("apps")
+ .queryParam("user",
+ UserGroupInformation.getCurrentUser().getShortUserName())
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 2, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryQueue() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+
+ amNodeManager.nodeHeartbeat(true);
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("queue", "default").accept("application/json")
+ .get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 2, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryLimit() throws JSONException, Exception {
+ rm.start();
+ rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("limit", "2").accept("application/json")
+ .get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 2, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryStartBegin() throws JSONException, Exception {
+ rm.start();
+ long start = System.currentTimeMillis();
+ Thread.sleep(1);
+ rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("startedTimeBegin", String.valueOf(start))
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 3, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryStartBeginSome() throws JSONException, Exception {
+ rm.start();
+ rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ long start = System.currentTimeMillis();
+ Thread.sleep(1);
+ rm.submitApp(1024);
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("startedTimeBegin", String.valueOf(start))
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 1, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryStartEnd() throws JSONException, Exception {
+ rm.start();
+ rm.registerNode("amNM:1234", 2048);
+ long end = System.currentTimeMillis();
+ Thread.sleep(1);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("startedTimeEnd", String.valueOf(end))
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ assertEquals("apps is not null", JSONObject.NULL, json.get("apps"));
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryStartBeginEnd() throws JSONException, Exception {
+ rm.start();
+ rm.registerNode("amNM:1234", 2048);
+ long start = System.currentTimeMillis();
+ Thread.sleep(1);
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ long end = System.currentTimeMillis();
+ Thread.sleep(1);
+ rm.submitApp(1024);
+
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("startedTimeBegin", String.valueOf(start))
+ .queryParam("startedTimeEnd", String.valueOf(end))
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 2, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryFinishBegin() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ long start = System.currentTimeMillis();
+ Thread.sleep(1);
+ RMApp app1 = rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ // finish App
+ MockAM am = rm
+ .sendAMLaunched(app1.getCurrentAppAttempt().getAppAttemptId());
+ am.registerAppAttempt();
+ am.unregisterAppAttempt();
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("finishedTimeBegin", String.valueOf(start))
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 1, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryFinishEnd() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ RMApp app1 = rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ // finish App
+ MockAM am = rm
+ .sendAMLaunched(app1.getCurrentAppAttempt().getAppAttemptId());
+ am.registerAppAttempt();
+ am.unregisterAppAttempt();
+
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ long end = System.currentTimeMillis();
+
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("finishedTimeEnd", String.valueOf(end))
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 3, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testAppsQueryFinishBeginEnd() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ long start = System.currentTimeMillis();
+ Thread.sleep(1);
+ RMApp app1 = rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ // finish App
+ MockAM am = rm
+ .sendAMLaunched(app1.getCurrentAppAttempt().getAppAttemptId());
+ am.registerAppAttempt();
+ am.unregisterAppAttempt();
+
+ rm.submitApp(1024);
+ rm.submitApp(1024);
+ long end = System.currentTimeMillis();
+
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .queryParam("finishedTimeBegin", String.valueOf(start))
+ .queryParam("finishedTimeEnd", String.valueOf(end))
+ .accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ JSONObject apps = json.getJSONObject("apps");
+ assertEquals("correct number of elements", 1, apps.length());
+ JSONArray array = apps.getJSONArray("app");
+ assertEquals("correct number of elements", 1, array.length());
+ rm.stop();
+ }
+
+ @Test
+ public void testSingleApp() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ RMApp app1 = rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ testSingleAppsHelper(app1.getApplicationId().toString(), app1);
+ rm.stop();
+ }
+
+ @Test
+ public void testSingleAppsSlash() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ RMApp app1 = rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ testSingleAppsHelper(app1.getApplicationId().toString() + "/", app1);
+ rm.stop();
+ }
+
+ @Test
+ public void testInvalidApp() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ WebResource r = resource();
+
+ try {
+ r.path("ws").path("v1").path("cluster").path("apps")
+ .path("application_invalid_12").accept("application/json")
+ .get(JSONObject.class);
+ fail("should have thrown exception on invalid appid");
+ } catch (UniformInterfaceException ue) {
+ ClientResponse response = ue.getResponse();
+
+ assertEquals(Status.BAD_REQUEST, response.getClientResponseStatus());
+ JSONObject msg = response.getEntity(JSONObject.class);
+ JSONObject exception = msg.getJSONObject("RemoteException");
+ assertEquals("correct number of elements", 3, exception.length());
+ String message = exception.getString("message");
+ String type = exception.getString("exception");
+ String classname = exception.getString("javaClassName");
+ checkStringMatch("exception message", "For input string: \"invalid\"",
+ message);
+ checkStringMatch("exception type", "NumberFormatException", type);
+ checkStringMatch("exception classname",
+ "java.lang.NumberFormatException", classname);
+
+ } finally {
+ rm.stop();
+ }
+ }
+
+ @Test
+ public void testNonexistApp() throws JSONException, Exception {
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
+ rm.submitApp(1024);
+ amNodeManager.nodeHeartbeat(true);
+ WebResource r = resource();
+
+ try {
+ r.path("ws").path("v1").path("cluster").path("apps")
+ .path("application_00000_0099").accept("application/json")
+ .get(JSONObject.class);
+ fail("should have thrown exception on invalid appid");
+ } catch (UniformInterfaceException ue) {
+ ClientResponse response = ue.getResponse();
+
+ assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+ JSONObject msg = response.getEntity(JSONObject.class);
+ JSONObject exception = msg.getJSONObject("RemoteException");
+ assertEquals("correct number of elements", 3, exception.length());
+ String message = exception.getString("message");
+ String type = exception.getString("exception");
+ String classname = exception.getString("javaClassName");
+ checkStringMatch("exception message",
+ "java.lang.Exception: app with id: application_00000_0099 not found",
+ message);
+ checkStringMatch("exception type", "NotFoundException", type);
+ checkStringMatch("exception classname",
+ "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+ } finally {
+ rm.stop();
+ }
+ }
+
+ public void testSingleAppsHelper(String path, RMApp app)
+ throws JSONException, Exception {
+ WebResource r = resource();
+ JSONObject json = r.path("ws").path("v1").path("cluster").path("apps")
+ .path(path).accept("application/json").get(JSONObject.class);
+ assertEquals("correct number of elements", 1, json.length());
+ verifyAppInfo(json.getJSONObject("app"), app);
+ }
+
+ public void verifyAppInfo(JSONObject info, RMApp app) throws JSONException,
+ Exception {
+
+ // 15 because trackingUrl not assigned yet
+ assertEquals("correct number of elements", 15, info.length());
+ String id = info.getString("id");
+ String expectedId = app.getApplicationId().toString();
+ checkStringMatch("id", expectedId, id);
+
+ String user = info.getString("user");
+ String expectedUser = app.getUser();
+ checkStringMatch("user", expectedUser, user);
+
+ checkStringMatch("name", "", info.getString("name"));
+ checkStringMatch("queue", "default", info.getString("queue"));
+ checkStringMatch("state", RMAppState.ACCEPTED.toString(),
+ info.getString("state"));
+ checkStringMatch("finalStatus",
+ FinalApplicationStatus.UNDEFINED.toString(),
+ info.getString("finalStatus"));
+ assertEquals("progress doesn't match", 0, info.getDouble("progress"), 0.0);
+ checkStringMatch("trackingUI", "UNASSIGNED", info.getString("trackingUI"));
+ checkStringMatch("diagnostics", "", info.getString("diagnostics"));
+ assertEquals("clusterId doesn't match", ResourceManager.clusterTimeStamp,
+ info.getLong("clusterId"));
+ assertEquals("startedTime doesn't match", app.getStartTime(),
+ info.getLong("startedTime"));
+ assertEquals("finishedTime doesn't match", app.getFinishTime(),
+ info.getLong("finishedTime"));
+ assertTrue("elapsed time not greater than 0",
+ info.getLong("elapsedTime") > 0);
+ checkStringMatch("amHostHttpAddress", app.getCurrentAppAttempt()
+ .getMasterContainer().getNodeHttpAddress(),
+ info.getString("amHostHttpAddress"));
+ assertTrue("amContainerLogs doesn't match",
+ info.getString("amContainerLogs").startsWith("http://"));
+ }
+
+ private void checkStringMatch(String print, String expected, String got) {
+ assertTrue(
+ print + " doesn't match, got: " + got + " expected: " + expected,
+ got.matches(expected));
+ }
+
+}
Modified: hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/pom.xml
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/pom.xml?rev=1213975&r1=1213974&r2=1213975&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/pom.xml (original)
+++ hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/pom.xml Tue Dec 13 23:05:56 2011
@@ -168,7 +168,7 @@
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-servlet</artifactId>
- <version>2.0</version>
+ <version>3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
@@ -289,9 +289,30 @@
<scope>runtime</scope>
</dependency>
<dependency>
- <groupId>com.google.inject.extensions</groupId>
- <artifactId>guice-servlet</artifactId>
- <version>2.0</version>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ <version>3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.jersey-test-framework</groupId>
+ <artifactId>jersey-test-framework-core</artifactId>
+ <version>1.8</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.jersey-test-framework</groupId>
+ <artifactId>jersey-test-framework-grizzly2</artifactId>
+ <version>1.8</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-server</artifactId>
+ <version>1.8</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.contribs</groupId>
+ <artifactId>jersey-guice</artifactId>
+ <version>1.8</version>
</dependency>
<dependency>
<groupId>org.jboss.netty</groupId>
Modified: hadoop/common/trunk/hadoop-mapreduce-project/pom.xml
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/pom.xml?rev=1213975&r1=1213974&r2=1213975&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-mapreduce-project/pom.xml (original)
+++ hadoop/common/trunk/hadoop-mapreduce-project/pom.xml Tue Dec 13 23:05:56 2011
@@ -143,9 +143,24 @@
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ <version>3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-server</artifactId>
+ <version>1.8</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.contribs</groupId>
+ <artifactId>jersey-guice</artifactId>
+ <version>1.8</version>
+ </dependency>
+ <dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-servlet</artifactId>
- <version>2.0</version>
+ <version>3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>