hadoop-mapreduce-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From a..@apache.org
Subject svn commit: r1225612 [1/2] - in /hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project: ./ conf/ hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/resources/ hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/ ha...
Date Thu, 29 Dec 2011 18:25:51 GMT
Author: atm
Date: Thu Dec 29 18:25:48 2011
New Revision: 1225612

URL: http://svn.apache.org/viewvc?rev=1225612&view=rev
Log:
Merge trunk into HA branch.

Added:
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/WebServicesTestUtils.java
      - copied unchanged from r1225610, hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/WebServicesTestUtils.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/MockApp.java
      - copied unchanged from r1225610, hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/MockApp.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/MockContainer.java
      - copied unchanged from r1225610, hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/MockContainer.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServices.java
      - copied unchanged from r1225610, hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServices.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServicesApps.java
      - copied unchanged from r1225610, hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServicesApps.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServicesContainers.java
      - copied unchanged from r1225610, hadoop/common/trunk/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServicesContainers.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesApps.java
      - copied unchanged from r1225610, 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/TestRMWebServicesApps.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java
      - copied unchanged from r1225610, 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/TestRMWebServicesCapacitySched.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodes.java
      - copied unchanged from r1225610, 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/TestRMWebServicesNodes.java
Modified:
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/.gitignore   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/CHANGES.txt   (contents, props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/conf/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/resources/mapred-default.xml   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/NMWebServices.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/dao/ContainerInfo.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterInfo.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/c++/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/contrib/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/contrib/block_forensics/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/contrib/build-contrib.xml   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/contrib/build.xml   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/contrib/data_join/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/contrib/eclipse-plugin/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/contrib/index/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/contrib/vaidya/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/examples/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/java/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/test/mapred/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/test/mapred/org/apache/hadoop/fs/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/test/mapred/org/apache/hadoop/hdfs/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/test/mapred/org/apache/hadoop/io/FileBench.java   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/test/mapred/org/apache/hadoop/io/TestSequenceFileMergeProgress.java   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/test/mapred/org/apache/hadoop/ipc/   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/test/mapred/org/apache/hadoop/security/authorize/TestServiceLevelAuthorization.java   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/test/mapred/org/apache/hadoop/test/MapredTestDriver.java   (props changed)
    hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/src/webapps/job/   (props changed)

Propchange: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Dec 29 18:25:48 2011
@@ -1,2 +1,2 @@
-/hadoop/common/trunk/hadoop-mapreduce-project:1152502-1225257
+/hadoop/common/trunk/hadoop-mapreduce-project:1152502-1225610
 /hadoop/core/branches/branch-0.19/mapred:713112

Propchange: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/.gitignore
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Dec 29 18:25:48 2011
@@ -1,3 +1,3 @@
-/hadoop/common/trunk/hadoop-mapreduce-project/.gitignore:1161333-1225257
+/hadoop/common/trunk/hadoop-mapreduce-project/.gitignore:1161333-1225610
 /hadoop/core/branches/branch-0.19/mapred/.gitignore:713112
 /hadoop/core/trunk/.gitignore:784664-785643

Modified: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/CHANGES.txt?rev=1225612&r1=1225611&r2=1225612&view=diff
==============================================================================
--- hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/CHANGES.txt (original)
+++ hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/CHANGES.txt Thu Dec 29 18:25:48 2011
@@ -172,6 +172,9 @@ Release 0.23.1 - Unreleased
     MAPREDUCE-3391. Making a trivial change to correct a log message in
     DistributedShell app's AM. (Subroto Sanyal via vinodkv)
 
+    MAPREDUCE-3547. Added a bunch of unit tests for the the RM/NM webservices.
+    (Thomas Graves via acmurthy)
+
   OPTIMIZATIONS
 
     MAPREDUCE-3567. Extraneous JobConf objects in AM heap. (Vinod Kumar
@@ -369,6 +372,12 @@ Release 0.23.1 - Unreleased
     MAPREDUCE-3586. Modified CompositeService to avoid duplicate stop operations
     thereby solving race conditions in MR AM shutdown. (vinodkv)
 
+    MAPREDUCE-3604. Fixed streaming to use new mapreduce.framework.name to
+    check for local mode. (acmurthy) 
+
+    MAPREDUCE-3521. Fixed streaming to ensure it doesn't silently ignore
+    unknown arguments. (Robert Evans via acmurthy) 
+
 Release 0.23.0 - 2011-11-01 
 
   INCOMPATIBLE CHANGES

Propchange: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/CHANGES.txt
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Dec 29 18:25:48 2011
@@ -1,3 +1,3 @@
-/hadoop/common/trunk/hadoop-mapreduce-project/CHANGES.txt:1161333-1225257
+/hadoop/common/trunk/hadoop-mapreduce-project/CHANGES.txt:1161333-1225610
 /hadoop/core/branches/branch-0.19/mapred/CHANGES.txt:713112
 /hadoop/mapreduce/branches/HDFS-641/CHANGES.txt:817878-835964

Propchange: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/conf/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Dec 29 18:25:48 2011
@@ -1,3 +1,3 @@
-/hadoop/common/trunk/hadoop-mapreduce-project/conf:1152502-1225257
+/hadoop/common/trunk/hadoop-mapreduce-project/conf:1152502-1225610
 /hadoop/core/branches/branch-0.19/mapred/conf:713112
 /hadoop/core/trunk/conf:784664-785643

Propchange: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/resources/mapred-default.xml
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Dec 29 18:25:48 2011
@@ -1,3 +1,3 @@
-/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/resources/mapred-default.xml:1166973-1225257
+/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/resources/mapred-default.xml:1166973-1225610
 /hadoop/core/branches/branch-0.19/mapred/src/java/mapred-default.xml:713112
 /hadoop/core/trunk/src/mapred/mapred-default.xml:776175-785643

Modified: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/NMWebServices.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/NMWebServices.java?rev=1225612&r1=1225611&r2=1225612&view=diff
==============================================================================
--- hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/NMWebServices.java (original)
+++ hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/NMWebServices.java Thu Dec 29 18:25:48 2011
@@ -42,6 +42,7 @@ import org.apache.hadoop.yarn.server.nod
 import org.apache.hadoop.yarn.server.nodemanager.webapp.dao.ContainersInfo;
 import org.apache.hadoop.yarn.server.nodemanager.webapp.dao.NodeInfo;
 import org.apache.hadoop.yarn.util.ConverterUtils;
+import org.apache.hadoop.yarn.webapp.BadRequestException;
 import org.apache.hadoop.yarn.webapp.NotFoundException;
 import org.apache.hadoop.yarn.webapp.WebApp;
 
@@ -92,12 +93,16 @@ public class NMWebServices {
 
       AppInfo appInfo = new AppInfo(entry.getValue());
       if (stateQuery != null && !stateQuery.isEmpty()) {
-        ApplicationState state = ApplicationState.valueOf(stateQuery);
+        ApplicationState.valueOf(stateQuery);
         if (!appInfo.getState().equalsIgnoreCase(stateQuery)) {
           continue;
         }
       }
-      if (userQuery != null && !userQuery.isEmpty()) {
+      if (userQuery != null) {
+        if (userQuery.isEmpty()) {
+          String msg = "Error: You must specify a non-empty string for the user";
+          throw new BadRequestException(msg);
+        }
         if (!appInfo.getUser().toString().equals(userQuery)) {
           continue;
         }
@@ -146,11 +151,12 @@ public class NMWebServices {
   @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
   public ContainerInfo getNodeContainer(@PathParam("containerid") String id) {
     ContainerId containerId = null;
-    containerId = ConverterUtils.toContainerId(id);
-    if (containerId == null) {
-      throw new NotFoundException("container with id, " + id
-          + ", is empty or null");
+    try {
+      containerId = ConverterUtils.toContainerId(id);
+    } catch (Exception e) {
+      throw new BadRequestException("invalid container id, " + id);
     }
+
     Container container = nmContext.getContainers().get(containerId);
     if (container == null) {
       throw new NotFoundException("container with id, " + id + ", not found");

Modified: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/dao/ContainerInfo.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/dao/ContainerInfo.java?rev=1225612&r1=1225611&r2=1225612&view=diff
==============================================================================
--- hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/dao/ContainerInfo.java (original)
+++ hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/dao/ContainerInfo.java Thu Dec 29 18:25:48 2011
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRoot
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.hadoop.yarn.api.records.ContainerStatus;
+import org.apache.hadoop.yarn.api.records.Resource;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.nodemanager.Context;
 import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
@@ -56,7 +57,7 @@ public class ContainerInfo {
   }
 
   public ContainerInfo(final Context nmContext, final Container container,
-      final String requestUri, final String pathPrefix) {
+       String requestUri, String pathPrefix) {
 
     this.id = container.getContainerID().toString();
     this.nodeId = nmContext.getNodeId().toString();
@@ -71,10 +72,19 @@ public class ContainerInfo {
     }
 
     this.user = container.getUser();
-    this.totalMemoryNeededMB = container.getLaunchContext().getResource()
-        .getMemory();
+    Resource res = container.getLaunchContext().getResource();
+    if (res != null) {
+      this.totalMemoryNeededMB = res.getMemory();
+    }
     this.containerLogsShortLink = ujoin("containerlogs", this.id,
         container.getUser());
+
+    if (requestUri == null) {
+      requestUri = "";
+    }
+    if (pathPrefix == null) {
+      pathPrefix = "";
+    }
     this.containerLogsLink = join(requestUri, pathPrefix,
         this.containerLogsShortLink);
   }

Modified: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java?rev=1225612&r1=1225611&r2=1225612&view=diff
==============================================================================
--- hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java (original)
+++ hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java Thu Dec 29 18:25:48 2011
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlRoot
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
+import org.apache.hadoop.yarn.api.records.QueueState;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.ParentQueue;
 
@@ -90,7 +91,7 @@ public class CapacitySchedulerInfo exten
       if (max < EPSILON || max > 1f)
         max = 1f;
       float maxCapacity = max * 100;
-      String state = queue.getState().toString();
+      QueueState state = queue.getState();
       CapacitySchedulerQueueInfo info = new CapacitySchedulerQueueInfo(
           capacity, usedCapacity, maxCapacity, queueName, state, queuePath);
 

Modified: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java?rev=1225612&r1=1225611&r2=1225612&view=diff
==============================================================================
--- hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java (original)
+++ hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java Thu Dec 29 18:25:48 2011
@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAcce
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.hadoop.yarn.api.records.QueueState;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue;
 
 @XmlRootElement
@@ -43,14 +44,14 @@ public class CapacitySchedulerQueueInfo 
   protected float usedCapacity;
   protected float maxCapacity;
   protected String queueName;
-  protected String state;
+  protected QueueState state;
   protected ArrayList<CapacitySchedulerQueueInfo> subQueues;
 
   CapacitySchedulerQueueInfo() {
   };
 
   CapacitySchedulerQueueInfo(float cap, float used, float max, String name,
-      String state, String path) {
+      QueueState state, String path) {
     this.capacity = cap;
     this.usedCapacity = used;
     this.maxCapacity = max;
@@ -84,7 +85,7 @@ public class CapacitySchedulerQueueInfo 
   }
 
   public String getQueueState() {
-    return this.state;
+    return this.state.toString();
   }
 
   public String getQueuePath() {

Modified: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterInfo.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterInfo.java?rev=1225612&r1=1225611&r2=1225612&view=diff
==============================================================================
--- hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterInfo.java (original)
+++ hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterInfo.java Thu Dec 29 18:25:48 2011
@@ -23,6 +23,7 @@ import javax.xml.bind.annotation.XmlRoot
 
 import org.apache.hadoop.util.VersionInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
+import org.apache.hadoop.yarn.service.Service.STATE;
 import org.apache.hadoop.yarn.util.YarnVersionInfo;
 
 @XmlRootElement
@@ -31,7 +32,7 @@ public class ClusterInfo {
 
   protected long id;
   protected long startedOn;
-  protected String state;
+  protected STATE state;
   protected String resourceManagerVersion;
   protected String resourceManagerBuildVersion;
   protected String resourceManagerVersionBuiltOn;
@@ -46,7 +47,7 @@ public class ClusterInfo {
     long ts = ResourceManager.clusterTimeStamp;
 
     this.id = ts;
-    this.state = rm.getServiceState().toString();
+    this.state = rm.getServiceState();
     this.startedOn = ts;
     this.resourceManagerVersion = YarnVersionInfo.getVersion();
     this.resourceManagerBuildVersion = YarnVersionInfo.getBuildVersion();
@@ -57,7 +58,7 @@ public class ClusterInfo {
   }
 
   public String getState() {
-    return this.state;
+    return this.state.toString();
   }
 
   public String getRMVersion() {

Modified: hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java?rev=1225612&r1=1225611&r2=1225612&view=diff
==============================================================================
--- hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java (original)
+++ hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java Thu Dec 29 18:25:48 2011
@@ -87,8 +87,12 @@ public class MockRM extends ResourceMana
         .newRecord(GetNewApplicationRequest.class));
   }
 
-  // client
   public RMApp submitApp(int masterMemory) throws Exception {
+    return submitApp(masterMemory, "", "");
+  }
+
+  // client
+  public RMApp submitApp(int masterMemory, String name, String user) throws Exception {
     ClientRMProtocol client = getClientRMService();
     GetNewApplicationResponse resp = client.getNewApplication(Records
         .newRecord(GetNewApplicationRequest.class));
@@ -99,8 +103,8 @@ public class MockRM extends ResourceMana
     ApplicationSubmissionContext sub = Records
         .newRecord(ApplicationSubmissionContext.class);
     sub.setApplicationId(appId);
-    sub.setApplicationName("");
-    sub.setUser("");
+    sub.setApplicationName(name);
+    sub.setUser(user);
     ContainerLaunchContext clc = Records
         .newRecord(ContainerLaunchContext.class);
     Resource capability = Records.newRecord(Resource.class);

Modified: hadoop/common/branches/HDFS-1623/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/branches/HDFS-1623/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=1225612&r1=1225611&r2=1225612&view=diff
==============================================================================
--- hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java (original)
+++ hadoop/common/branches/HDFS-1623/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java Thu Dec 29 18:25:48 2011
@@ -22,34 +22,34 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.util.ArrayList;
+import java.io.StringReader;
 
 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.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.util.VersionInfo;
 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.ClusterMetrics;
 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.resourcemanager.scheduler.QueueMetrics;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
 import org.apache.hadoop.yarn.server.security.ApplicationACLsManager;
+import org.apache.hadoop.yarn.service.Service.STATE;
+import org.apache.hadoop.yarn.util.YarnVersionInfo;
 import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
-import org.codehaus.jettison.json.JSONArray;
+import org.apache.hadoop.yarn.webapp.WebServicesTestUtils;
 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;
@@ -105,997 +105,439 @@ public class TestRMWebServices extends J
   }
 
   @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 {
+  public void testInfoXML() 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);
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("info").accept("application/xml").get(ClientResponse.class);
+    assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+    String xml = response.getEntity(String.class);
+    verifyClusterInfoXML(xml);
   }
 
   @Test
-  public void testNodesQueryStateNone() throws JSONException, Exception {
+  public void testInvalidUri() 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);
-
+    String responseStr = "";
     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");
+      responseStr = r.path("ws").path("v1").path("cluster").path("bogus")
+          .accept(MediaType.APPLICATION_JSON).get(String.class);
+      fail("should have thrown exception on invalid uri");
     } catch (UniformInterfaceException ue) {
       ClientResponse response = ue.getResponse();
+      assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
 
-      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();
+      WebServicesTestUtils.checkStringMatch(
+          "error string exists and shouldn't", "", responseStr);
     }
   }
 
   @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, 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 {
+  public void testInvalidUri2() 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);
-
+    String responseStr = "";
     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");
+      responseStr = r.accept(MediaType.APPLICATION_JSON).get(String.class);
+      fail("should have thrown exception on invalid uri");
     } 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);
+      assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+      WebServicesTestUtils.checkStringMatch(
+          "error string exists and shouldn't", "", responseStr);
     }
   }
 
   @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);
+  public void testInvalidAccept() throws JSONException, Exception {
     WebResource r = resource();
+    String responseStr = "";
     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");
+      responseStr = r.path("ws").path("v1").path("cluster")
+          .accept(MediaType.TEXT_PLAIN).get(String.class);
+      fail("should have thrown exception on invalid uri");
     } 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();
+      assertEquals(Status.INTERNAL_SERVER_ERROR,
+          response.getClientResponseStatus());
+      WebServicesTestUtils.checkStringMatch(
+          "error string exists and shouldn't", "", responseStr);
     }
   }
 
   @Test
-  public void testInvalidNode() throws JSONException, Exception {
-    rm.registerNode("h1:1234", 5120);
-    rm.registerNode("h2:1235", 5121);
-
+  public void testCluster() throws JSONException, Exception {
     WebResource r = resource();
-    try {
-      r.path("ws").path("v1").path("cluster").path("nodes")
-          .path("node_invalid_foo").accept("application/json")
-          .get(JSONObject.class);
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .accept(MediaType.APPLICATION_JSON).get(ClientResponse.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);
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterInfo(json);
   }
 
   @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();
+  public void testClusterSlash() throws JSONException, Exception {
+    WebResource r = resource();
+    // test with trailing "/" to make sure acts same as without slash
+    ClientResponse response = r.path("ws").path("v1").path("cluster/")
+        .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
 
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterInfo(json);
   }
 
   @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 {
+  public void testClusterDefault() 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 with trailing "/" to make sure acts same as without slash
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .get(ClientResponse.class);
 
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterInfo(json);
   }
 
   @Test
-  public void testAppsQueryState() throws JSONException, Exception {
-    rm.start();
-    MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
-    RMApp app1 = rm.submitApp(1024);
-    amNodeManager.nodeHeartbeat(true);
+  public void testInfo() throws JSONException, Exception {
     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();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("info").accept(MediaType.APPLICATION_JSON)
+        .get(ClientResponse.class);
+
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterInfo(json);
   }
 
   @Test
-  public void testAppsQueryStateNone() throws JSONException, Exception {
-    rm.start();
-    MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
-    rm.submitApp(1024);
-    amNodeManager.nodeHeartbeat(true);
+  public void testInfoSlash() throws JSONException, Exception {
+    // test with trailing "/" to make sure acts same as without slash
     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();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("info/").accept(MediaType.APPLICATION_JSON)
+        .get(ClientResponse.class);
+
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterInfo(json);
   }
 
   @Test
-  public void testAppsQueryStateInvalid() throws JSONException, Exception {
-    rm.start();
-    MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
-    rm.submitApp(1024);
-    amNodeManager.nodeHeartbeat(true);
+  public void testInfoDefault() throws JSONException, Exception {
     WebResource r = resource();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("info").get(ClientResponse.class);
 
-    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);
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterInfo(json);
+  }
 
-    } finally {
-      rm.stop();
+  public void verifyClusterInfoXML(String xml) throws JSONException, Exception {
+    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("clusterInfo");
+    assertEquals("incorrect number of elements", 1, nodes.getLength());
+
+    for (int i = 0; i < nodes.getLength(); i++) {
+      Element element = (Element) nodes.item(i);
+
+      verifyClusterGeneric(WebServicesTestUtils.getXmlLong(element, "id"),
+          WebServicesTestUtils.getXmlLong(element, "startedOn"),
+          WebServicesTestUtils.getXmlString(element, "state"),
+          WebServicesTestUtils.getXmlString(element, "hadoopVersionBuiltOn"),
+          WebServicesTestUtils.getXmlString(element, "hadoopBuildVersion"),
+          WebServicesTestUtils.getXmlString(element, "hadoopVersion"),
+          WebServicesTestUtils.getXmlString(element,
+              "resourceManagerVersionBuiltOn"),
+          WebServicesTestUtils.getXmlString(element,
+              "resourceManagerBuildVersion"),
+          WebServicesTestUtils.getXmlString(element, "resourceManagerVersion"));
     }
   }
 
-  @Test
-  public void testAppsQueryUser() throws JSONException, Exception {
-    rm.start();
-    MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
-    rm.submitApp(1024);
-    rm.submitApp(1024);
+  public void verifyClusterInfo(JSONObject json) throws JSONException,
+      Exception {
+    assertEquals("incorrect number of elements", 1, json.length());
+    JSONObject info = json.getJSONObject("clusterInfo");
+    assertEquals("incorrect number of elements", 9, info.length());
+    verifyClusterGeneric(info.getLong("id"), info.getLong("startedOn"),
+        info.getString("state"), info.getString("hadoopVersionBuiltOn"),
+        info.getString("hadoopBuildVersion"), info.getString("hadoopVersion"),
+        info.getString("resourceManagerVersionBuiltOn"),
+        info.getString("resourceManagerBuildVersion"),
+        info.getString("resourceManagerVersion"));
 
-    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);
+  public void verifyClusterGeneric(long clusterid, long startedon,
+      String state, String hadoopVersionBuiltOn, String hadoopBuildVersion,
+      String hadoopVersion, String resourceManagerVersionBuiltOn,
+      String resourceManagerBuildVersion, String resourceManagerVersion) {
+
+    assertEquals("clusterId doesn't match: ", ResourceManager.clusterTimeStamp,
+        clusterid);
+    assertEquals("startedOn doesn't match: ", ResourceManager.clusterTimeStamp,
+        startedon);
+    assertTrue("stated doesn't match: " + state,
+        state.matches(STATE.INITED.toString()));
 
-    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();
+    WebServicesTestUtils.checkStringMatch("hadoopVersionBuiltOn",
+        VersionInfo.getDate(), hadoopVersionBuiltOn);
+    WebServicesTestUtils.checkStringMatch("hadoopBuildVersion",
+        VersionInfo.getBuildVersion(), hadoopBuildVersion);
+    WebServicesTestUtils.checkStringMatch("hadoopVersion",
+        VersionInfo.getVersion(), hadoopVersion);
+
+    WebServicesTestUtils.checkStringMatch("resourceManagerVersionBuiltOn",
+        YarnVersionInfo.getDate(), resourceManagerVersionBuiltOn);
+    WebServicesTestUtils.checkStringMatch("resourceManagerBuildVersion",
+        YarnVersionInfo.getBuildVersion(), resourceManagerBuildVersion);
+    WebServicesTestUtils.checkStringMatch("resourceManagerVersion",
+        YarnVersionInfo.getVersion(), resourceManagerVersion);
   }
 
   @Test
-  public void testAppsQueryLimit() throws JSONException, Exception {
-    rm.start();
-    rm.registerNode("amNM:1234", 2048);
-    rm.submitApp(1024);
-    rm.submitApp(1024);
-    rm.submitApp(1024);
+  public void testClusterMetrics() throws JSONException, Exception {
     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();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("metrics").accept(MediaType.APPLICATION_JSON)
+        .get(ClientResponse.class);
+
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterMetricsJSON(json);
   }
 
   @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);
+  public void testClusterMetricsSlash() throws JSONException, Exception {
     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();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("metrics/").accept(MediaType.APPLICATION_JSON)
+        .get(ClientResponse.class);
+
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterMetricsJSON(json);
   }
 
   @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);
+  public void testClusterMetricsDefault() throws JSONException, Exception {
     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();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("metrics").get(ClientResponse.class);
+
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterMetricsJSON(json);
   }
 
   @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);
+  public void testClusterMetricsXML() throws JSONException, Exception {
     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();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("metrics").accept("application/xml").get(ClientResponse.class);
+    assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+    String xml = response.getEntity(String.class);
+    verifyClusterMetricsXML(xml);
   }
 
-  @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();
+  public void verifyClusterMetricsXML(String xml) throws JSONException,
+      Exception {
+    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("clusterMetrics");
+    assertEquals("incorrect number of elements", 1, nodes.getLength());
+
+    for (int i = 0; i < nodes.getLength(); i++) {
+      Element element = (Element) nodes.item(i);
+
+      verifyClusterMetrics(
+          WebServicesTestUtils.getXmlInt(element, "appsSubmitted"),
+          WebServicesTestUtils.getXmlInt(element, "reservedMB"),
+          WebServicesTestUtils.getXmlInt(element, "availableMB"),
+          WebServicesTestUtils.getXmlInt(element, "allocatedMB"),
+          WebServicesTestUtils.getXmlInt(element, "containersAllocated"),
+          WebServicesTestUtils.getXmlInt(element, "totalMB"),
+          WebServicesTestUtils.getXmlInt(element, "totalNodes"),
+          WebServicesTestUtils.getXmlInt(element, "lostNodes"),
+          WebServicesTestUtils.getXmlInt(element, "unhealthyNodes"),
+          WebServicesTestUtils.getXmlInt(element, "decommissionedNodes"),
+          WebServicesTestUtils.getXmlInt(element, "rebootedNodes"));
+    }
   }
 
-  @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);
+  public void verifyClusterMetricsJSON(JSONObject json) throws JSONException,
+      Exception {
+    assertEquals("incorrect number of elements", 1, json.length());
+    JSONObject clusterinfo = json.getJSONObject("clusterMetrics");
+    assertEquals("incorrect number of elements", 11, clusterinfo.length());
+    verifyClusterMetrics(clusterinfo.getInt("appsSubmitted"),
+        clusterinfo.getInt("reservedMB"), clusterinfo.getInt("availableMB"),
+        clusterinfo.getInt("allocatedMB"),
+        clusterinfo.getInt("containersAllocated"),
+        clusterinfo.getInt("totalMB"), clusterinfo.getInt("totalNodes"),
+        clusterinfo.getInt("lostNodes"), clusterinfo.getInt("unhealthyNodes"),
+        clusterinfo.getInt("decommissionedNodes"),
+        clusterinfo.getInt("rebootedNodes"));
+  }
 
-    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();
+  public void verifyClusterMetrics(int sub, int reservedMB, int availableMB,
+      int allocMB, int containersAlloc, int totalMB, int totalNodes,
+      int lostNodes, int unhealthyNodes, int decommissionedNodes,
+      int rebootedNodes) throws JSONException, Exception {
+
+    ResourceScheduler rs = rm.getResourceScheduler();
+    QueueMetrics metrics = rs.getRootQueueMetrics();
+    ClusterMetrics clusterMetrics = ClusterMetrics.getMetrics();
+    final long MB_IN_GB = 1024;
+
+    long totalMBExpect = (metrics.getReservedGB() * MB_IN_GB)
+        + (metrics.getAvailableGB() * MB_IN_GB)
+        + (metrics.getAllocatedGB() * MB_IN_GB);
+
+    assertEquals("appsSubmitted doesn't match", metrics.getAppsSubmitted(), sub);
+    assertEquals("reservedMB doesn't match",
+        metrics.getReservedGB() * MB_IN_GB, reservedMB);
+    assertEquals("availableMB doesn't match", metrics.getAvailableGB()
+        * MB_IN_GB, availableMB);
+    assertEquals("allocatedMB doesn't match", metrics.getAllocatedGB()
+        * MB_IN_GB, allocMB);
+    assertEquals("containersAllocated doesn't match", 0, containersAlloc);
+    assertEquals("totalMB doesn't match", totalMBExpect, totalMB);
+    assertEquals("totalNodes doesn't match", clusterMetrics.getNumNMs(),
+        totalNodes);
+    assertEquals("lostNodes doesn't match", clusterMetrics.getNumLostNMs(),
+        lostNodes);
+    assertEquals("unhealthyNodes doesn't match",
+        clusterMetrics.getUnhealthyNMs(), unhealthyNodes);
+    assertEquals("decommissionedNodes doesn't match",
+        clusterMetrics.getNumDecommisionedNMs(), decommissionedNodes);
+    assertEquals("rebootedNodes doesn't match",
+        clusterMetrics.getNumRebootedNMs(), rebootedNodes);
   }
 
   @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();
-
+  public void testClusterSchedulerFifo() throws JSONException, Exception {
     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();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("scheduler").accept(MediaType.APPLICATION_JSON)
+        .get(ClientResponse.class);
+
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterSchedulerFifo(json);
   }
 
   @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();
-
+  public void testClusterSchedulerFifoSlash() throws JSONException, Exception {
     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();
-  }
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("scheduler/").accept(MediaType.APPLICATION_JSON)
+        .get(ClientResponse.class);
 
-  @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();
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterSchedulerFifo(json);
   }
 
   @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();
+  public void testClusterSchedulerFifoDefault() throws JSONException, Exception {
+    WebResource r = resource();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("scheduler").get(ClientResponse.class);
+
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+    verifyClusterSchedulerFifo(json);
   }
 
   @Test
-  public void testInvalidApp() throws JSONException, Exception {
-    rm.start();
-    MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
-    rm.submitApp(1024);
-    amNodeManager.nodeHeartbeat(true);
+  public void testClusterSchedulerFifoXML() throws JSONException, Exception {
     WebResource r = resource();
+    ClientResponse response = r.path("ws").path("v1").path("cluster")
+        .path("scheduler").accept(MediaType.APPLICATION_XML)
+        .get(ClientResponse.class);
 
-    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);
+    assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+    String xml = response.getEntity(String.class);
+    verifySchedulerFifoXML(xml);
+  }
 
-    } finally {
-      rm.stop();
+  public void verifySchedulerFifoXML(String xml) throws JSONException,
+      Exception {
+    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+    DocumentBuilder db = dbf.newDocumentBuilder();
+    InputSource is = new InputSource();
+    is.setCharacterStream(new StringReader(xml));
+    Document dom = db.parse(is);
+    NodeList nodesSched = dom.getElementsByTagName("scheduler");
+    assertEquals("incorrect number of elements", 1, nodesSched.getLength());
+    NodeList nodes = dom.getElementsByTagName("schedulerInfo");
+    assertEquals("incorrect number of elements", 1, nodes.getLength());
+
+    for (int i = 0; i < nodes.getLength(); i++) {
+      Element element = (Element) nodes.item(i);
+
+      verifyClusterSchedulerFifoGeneric(
+          WebServicesTestUtils.getXmlAttrString(element, "xsi:type"),
+          WebServicesTestUtils.getXmlString(element, "qstate"),
+          WebServicesTestUtils.getXmlFloat(element, "capacity"),
+          WebServicesTestUtils.getXmlFloat(element, "usedCapacity"),
+          WebServicesTestUtils.getXmlInt(element, "minQueueMemoryCapacity"),
+          WebServicesTestUtils.getXmlInt(element, "maxQueueMemoryCapacity"),
+          WebServicesTestUtils.getXmlInt(element, "numNodes"),
+          WebServicesTestUtils.getXmlInt(element, "usedNodeCapacity"),
+          WebServicesTestUtils.getXmlInt(element, "availNodeCapacity"),
+          WebServicesTestUtils.getXmlInt(element, "totalNodeCapacity"),
+          WebServicesTestUtils.getXmlInt(element, "numContainers"));
     }
   }
 
-  @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();
+  public void verifyClusterSchedulerFifo(JSONObject json) throws JSONException,
+      Exception {
+    assertEquals("incorrect number of elements", 1, json.length());
+    JSONObject info = json.getJSONObject("scheduler");
+    assertEquals("incorrect number of elements", 1, info.length());
+    info = info.getJSONObject("schedulerInfo");
+    assertEquals("incorrect number of elements", 11, info.length());
 
-    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();
+    verifyClusterSchedulerFifoGeneric(info.getString("type"),
+        info.getString("qstate"), (float) info.getDouble("capacity"),
+        (float) info.getDouble("usedCapacity"),
+        info.getInt("minQueueMemoryCapacity"),
+        info.getInt("maxQueueMemoryCapacity"), info.getInt("numNodes"),
+        info.getInt("usedNodeCapacity"), info.getInt("availNodeCapacity"),
+        info.getInt("totalNodeCapacity"), info.getInt("numContainers"));
 
-      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)
+  public void verifyClusterSchedulerFifoGeneric(String type, String state,
+      float capacity, float usedCapacity, int minQueueCapacity,
+      int maxQueueCapacity, int numNodes, int usedNodeCapacity,
+      int availNodeCapacity, int totalNodeCapacity, int numContainers)
       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 {
+    assertEquals("type doesn't match", "fifoScheduler", type);
+    assertEquals("qstate doesn't match", QueueState.RUNNING.toString(), state);
+    assertEquals("capacity doesn't match", 1.0, capacity, 0.0);
+    assertEquals("usedCapacity doesn't match", Float.NaN, usedCapacity, 0.0);
+    assertEquals("minQueueMemoryCapacity doesn't match", 1024, minQueueCapacity);
+    assertEquals("maxQueueMemoryCapacity doesn't match", 10240,
+        maxQueueCapacity);
+    assertEquals("numNodes doesn't match", 0, numNodes);
+    assertEquals("usedNodeCapacity doesn't match", 0, usedNodeCapacity);
+    assertEquals("availNodeCapacity doesn't match", 0, availNodeCapacity);
+    assertEquals("totalNodeCapacity doesn't match", 0, totalNodeCapacity);
+    assertEquals("numContainers doesn't match", 0, numContainers);
 
-    // 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));
   }
 
 }



Mime
View raw message