http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
index 50c450b..a4c01df 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
@@ -78,6 +78,8 @@ import 
org.apache.hadoop.yarn.api.protocolrecords.GetDelegationTokenRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetDelegationTokenResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewReservationRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewReservationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationResponse;
 import 
org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesRequest;
@@ -149,6 +151,7 @@ import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.LabelsToNodesInf
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.LocalResourceInfo;
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.LogAggregationContextInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NewApplication;
+import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NewReservation;
 import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelsInfo;
@@ -162,7 +165,6 @@ import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationDelet
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationListInfo;
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationRequestInfo;
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationRequestsInfo;
-import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationSubmissionResponseInfo;
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationSubmissionRequestInfo;
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationUpdateRequestInfo;
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ReservationUpdateResponseInfo;
@@ -1870,6 +1872,61 @@ public class RMWebServices extends WebServices {
   }
 
   /**
+   * Generates a new ReservationId which is then sent to the client.
+   *
+   * @param hsr the servlet request
+   * @return Response containing the app id and the maximum resource
+   *         capabilities
+   * @throws AuthorizationException if the user is not authorized
+   *         to invoke this method.
+   * @throws IOException if creation fails.
+   * @throws InterruptedException if interrupted.
+   */
+  @POST
+  @Path("/reservation/new-reservation")
+  @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+  public Response createNewReservation(@Context HttpServletRequest hsr)
+    throws AuthorizationException, IOException, InterruptedException {
+    init();
+    UserGroupInformation callerUGI = getCallerUserGroupInformation(hsr, true);
+    if (callerUGI == null) {
+      throw new AuthorizationException("Unable to obtain user name, "
+        + "user not authenticated");
+    }
+    if (UserGroupInformation.isSecurityEnabled() && isStaticUser(callerUGI)) {
+      String msg = "The default static user cannot carry out this operation.";
+      return Response.status(Status.FORBIDDEN).entity(msg).build();
+    }
+
+    NewReservation reservationId = createNewReservation();
+    return Response.status(Status.OK).entity(reservationId).build();
+
+  }
+
+  /**
+   * Function that actually creates the {@link ReservationId} by calling the
+   * ClientRMService.
+   *
+   * @return returns structure containing the {@link ReservationId}
+   * @throws IOException if creation fails.
+   */
+  private NewReservation createNewReservation() throws IOException {
+    GetNewReservationRequest req =
+        recordFactory.newRecordInstance(GetNewReservationRequest.class);
+    GetNewReservationResponse resp;
+    try {
+      resp = rm.getClientRMService().getNewReservation(req);
+    } catch (YarnException e) {
+      String msg = "Unable to create new reservation from RM web service";
+      LOG.error(msg, e);
+      throw new YarnRuntimeException(msg, e);
+    }
+    NewReservation reservationId =
+        new NewReservation(resp.getReservationId().toString());
+    return reservationId;
+  }
+
+  /**
    * Function to submit a Reservation to the RM.
    *
    * @param resContext provides information to construct the
@@ -1903,19 +1960,15 @@ public class RMWebServices extends WebServices {
     final ReservationSubmissionRequest reservation =
         createReservationSubmissionRequest(resContext);
 
-    ReservationSubmissionResponseInfo resRespInfo;
     try {
-      resRespInfo =
-          callerUGI.doAs(
-           new PrivilegedExceptionAction<ReservationSubmissionResponseInfo>() {
-                @Override
-                public ReservationSubmissionResponseInfo run()
-                    throws IOException, YarnException {
-                  ReservationSubmissionResponse tempRes =
-                      rm.getClientRMService().submitReservation(reservation);
-                  return new ReservationSubmissionResponseInfo(tempRes);
-                }
-              });
+      callerUGI
+          .doAs(new PrivilegedExceptionAction<ReservationSubmissionResponse>() 
{
+              @Override
+              public ReservationSubmissionResponse run() throws IOException,
+                  YarnException {
+                return rm.getClientRMService().submitReservation(reservation);
+              }
+          });
     } catch (UndeclaredThrowableException ue) {
       if (ue.getCause() instanceof YarnException) {
         throw new BadRequestException(ue.getCause().getMessage());
@@ -1924,11 +1977,11 @@ public class RMWebServices extends WebServices {
       throw ue;
     }
 
-    return Response.status(Status.OK).entity(resRespInfo).build();
+    return Response.status(Status.ACCEPTED).build();
   }
 
   private ReservationSubmissionRequest createReservationSubmissionRequest(
-      ReservationSubmissionRequestInfo resContext) {
+      ReservationSubmissionRequestInfo resContext) throws IOException {
 
     // defending against a couple of common submission format problems
     if (resContext == null) {
@@ -1972,8 +2025,12 @@ public class RMWebServices extends WebServices {
     ReservationDefinition rDef =
         ReservationDefinition.newInstance(resInfo.getArrival(),
             resInfo.getDeadline(), reqs, resInfo.getReservationName());
+
+    ReservationId reservationId = ReservationId.parseReservationId(resContext
+        .getReservationId());
     ReservationSubmissionRequest request =
-        ReservationSubmissionRequest.newInstance(rDef, resContext.getQueue());
+        ReservationSubmissionRequest.newInstance(rDef, resContext.getQueue(),
+          reservationId);
 
     return request;
   }
@@ -2095,9 +2152,13 @@ public class RMWebServices extends WebServices {
    *          the ReservationDeleteRequest
    * @param hsr the servlet request
    * @return Response containing the status code
-   * @throws AuthorizationException
-   * @throws IOException
-   * @throws InterruptedException
+   * @throws AuthorizationException when the user group information cannot be
+   *           retrieved.
+   * @throws IOException when a {@link ReservationDeleteRequest} cannot be
+   *           created from the {@link ReservationDeleteRequestInfo}. This
+   *           exception is also thrown on
+   *           {@code ClientRMService.deleteReservation} invokation failure.
+   * @throws InterruptedException if doAs action throws an 
InterruptedException.
    */
   @POST
   @Path("/reservation/delete")

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NewReservation.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NewReservation.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NewReservation.java
new file mode 100644
index 0000000..92993ad
--- /dev/null
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NewReservation.java
@@ -0,0 +1,55 @@
+/**
+* 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.dao;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * <p>The response sent by the <code>ResourceManager</code> to the client for
+ * a request to get a new {@code ReservationId} for submitting reservations
+ * using the REST API.</p>
+ *
+ * <p>Clients can submit a reservation with the returned {@code ReservationId}.
+ * </p>
+ *
+ * {@code RMWebServices#createNewReservation(HttpServletRequest)}
+ */
+@XmlRootElement(name="new-reservation")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class NewReservation {
+
+  @XmlElement(name="reservation-id")
+  private String reservationId;
+
+  public NewReservation() {
+    reservationId = "";
+  }
+
+  public NewReservation(String resId) {
+    reservationId = resId;
+  }
+
+  public String getReservationId() {
+    return reservationId;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionRequestInfo.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionRequestInfo.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionRequestInfo.java
index 701370d..5ca7998 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionRequestInfo.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionRequestInfo.java
@@ -37,6 +37,9 @@ public class ReservationSubmissionRequestInfo {
   @XmlElement(name = "reservation-definition")
   private ReservationDefinitionInfo reservationDefinition;
 
+  @XmlElement(name = "reservation-id")
+  private String reservationId;
+
   public ReservationSubmissionRequestInfo() {
   }
 
@@ -48,6 +51,14 @@ public class ReservationSubmissionRequestInfo {
     this.queue = queue;
   }
 
+  public String getReservationId() {
+    return reservationId;
+  }
+
+  public void setReservationId(String reservationId) {
+    this.reservationId = reservationId;
+  }
+
   public ReservationDefinitionInfo getReservationDefinition() {
     return reservationDefinition;
   }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionResponseInfo.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionResponseInfo.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionResponseInfo.java
deleted file mode 100644
index 943390b..0000000
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationSubmissionResponseInfo.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hadoop.yarn.server.resourcemanager.webapp.dao;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import 
org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
-
-/**
- * Simple class that represent a response to a reservation submission.
- */
-@XmlRootElement(name = "reservation-submission-response")
-@XmlAccessorType(XmlAccessType.FIELD)
-public class ReservationSubmissionResponseInfo {
-
-  @XmlElement(name = "reservation-id")
-  private String reservationId;
-
-  public ReservationSubmissionResponseInfo() {
-
-  }
-
-  public ReservationSubmissionResponseInfo(
-      ReservationSubmissionResponse response) {
-    this.reservationId = response.getReservationId().toString();
-  }
-
-  public String getReservationId() {
-    return reservationId;
-  }
-
-  public void setReservationId(String reservationId) {
-    this.reservationId = reservationId;
-  }
-}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ReservationACLsTestBase.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ReservationACLsTestBase.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ReservationACLsTestBase.java
index 4039f50..518da61 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ReservationACLsTestBase.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ReservationACLsTestBase.java
@@ -32,6 +32,8 @@ import java.util.UUID;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.security.authorize.AccessControlList;
 import org.apache.hadoop.yarn.api.ApplicationClientProtocol;
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewReservationRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewReservationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
@@ -242,8 +244,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
 
   private void verifySubmitReservationSuccess(String submitter, String
           queueName) throws Exception {
-    ReservationId reservationId =
-            submitReservation(submitter, queueName);
+    ReservationId reservationId = createReservation(submitter);
+    submitReservation(submitter, queueName, reservationId);
 
     deleteReservation(submitter, reservationId);
   }
@@ -251,7 +253,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
   private void verifySubmitReservationFailure(String submitter, String
           queueName) throws Exception {
     try {
-      submitReservation(submitter, queueName);
+      ReservationId reservationId = createReservation(submitter);
+      submitReservation(submitter, queueName, reservationId);
       Assert.fail("Submit reservation by the enemy should fail!");
     } catch (YarnException e) {
       handleAdministerException(e, submitter, queueName, ReservationACL
@@ -261,8 +264,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
 
   private void verifyListReservationSuccess(String lister, String
           originalSubmitter, String queueName) throws Exception {
-    ReservationId reservationId =
-            submitReservation(originalSubmitter, queueName);
+    ReservationId reservationId = createReservation(originalSubmitter);
+    submitReservation(originalSubmitter, queueName, reservationId);
 
     ReservationListResponse adminResponse = listReservation(lister, queueName);
 
@@ -275,8 +278,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
 
   private void verifyListReservationFailure(String lister,
           String originalSubmitter, String queueName) throws Exception {
-    ReservationId reservationId =
-            submitReservation(originalSubmitter, queueName);
+    ReservationId reservationId = createReservation(originalSubmitter);
+    submitReservation(originalSubmitter, queueName, reservationId);
 
     try {
       listReservation(lister, queueName);
@@ -291,8 +294,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
 
   private void verifyListReservationByIdSuccess(String lister, String
           originalSubmitter, String queueName) throws Exception {
-    ReservationId reservationId =
-            submitReservation(originalSubmitter, queueName);
+    ReservationId reservationId = createReservation(originalSubmitter);
+    submitReservation(originalSubmitter, queueName, reservationId);
 
     ReservationListResponse adminResponse = listReservationById(lister,
             reservationId, queueName);
@@ -306,8 +309,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
 
   private void verifyListReservationByIdFailure(String lister,
           String originalSubmitter, String queueName) throws Exception {
-    ReservationId reservationId =
-            submitReservation(originalSubmitter, queueName);
+    ReservationId reservationId = createReservation(originalSubmitter);
+    submitReservation(originalSubmitter, queueName, reservationId);
     try {
       listReservationById(lister, reservationId, queueName);
       Assert.fail("List reservation by the enemy should fail!");
@@ -321,8 +324,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
 
   private void verifyDeleteReservationSuccess(String killer,
           String originalSubmitter, String queueName) throws Exception {
-    ReservationId reservationId =
-            submitReservation(originalSubmitter, queueName);
+    ReservationId reservationId = createReservation(originalSubmitter);
+    submitReservation(originalSubmitter, queueName, reservationId);
 
     deleteReservation(killer, reservationId);
   }
@@ -330,8 +333,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
   private void verifyDeleteReservationFailure(String killer,
           String originalSubmitter, String queueName) throws Exception {
 
-    ReservationId reservationId =
-        submitReservation(originalSubmitter, queueName);
+    ReservationId reservationId = createReservation(originalSubmitter);
+    submitReservation(originalSubmitter, queueName, reservationId);
 
     try {
       deleteReservation(killer, reservationId);
@@ -346,8 +349,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
 
   private void verifyUpdateReservationSuccess(String updater,
           String originalSubmitter, String queueName) throws Exception {
-    ReservationId reservationId =
-            submitReservation(originalSubmitter, queueName);
+    ReservationId reservationId = createReservation(originalSubmitter);
+    submitReservation(originalSubmitter, queueName, reservationId);
 
     final ReservationUpdateRequest updateRequest =
             ReservationUpdateRequest.newInstance(
@@ -362,8 +365,8 @@ public class ReservationACLsTestBase extends ACLsTestBase {
 
   private void verifyUpdateReservationFailure(String updater,
           String originalSubmitter, String queueName) throws Exception {
-    ReservationId reservationId =
-            submitReservation(originalSubmitter, queueName);
+    ReservationId reservationId = createReservation(originalSubmitter);
+    submitReservation(originalSubmitter, queueName, reservationId);
 
     final ReservationUpdateRequest updateRequest =
             ReservationUpdateRequest.newInstance(
@@ -422,17 +425,27 @@ public class ReservationACLsTestBase extends ACLsTestBase 
{
     deleteClient.deleteReservation(deleteRequest);
   }
 
-  private ReservationId submitReservation(String submitter,
-      String queueName) throws Exception {
+  private ReservationId createReservation(String creator) throws Exception {
+
+    ApplicationClientProtocol creatorClient = getRMClientForUser(creator);
+    GetNewReservationRequest getNewReservationRequest =
+        GetNewReservationRequest.newInstance();
+
+    GetNewReservationResponse response = creatorClient
+        .getNewReservation(getNewReservationRequest);
+    return response.getReservationId();
+  }
+
+  private void submitReservation(String submitter,
+      String queueName, ReservationId reservationId) throws Exception {
 
     ApplicationClientProtocol submitterClient = getRMClientForUser(submitter);
     ReservationSubmissionRequest reservationSubmissionRequest =
-            ReservationSubmissionRequest.newInstance(
-                    makeSimpleReservationDefinition(), queueName);
+        ReservationSubmissionRequest.newInstance(
+        makeSimpleReservationDefinition(), queueName, reservationId);
 
     ReservationSubmissionResponse response = submitterClient
             .submitReservation(reservationSubmissionRequest);
-    return response.getReservationId();
   }
 
   private void handleAdministerException(Exception e, String user, String

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java
index 8a6ddae..f5826c1 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java
@@ -68,6 +68,7 @@ import 
org.apache.hadoop.yarn.api.protocolrecords.GetContainersRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetContainersResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetLabelsToNodesRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetLabelsToNodesResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewReservationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetNodesToLabelsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetNodesToLabelsResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetQueueInfoRequest;
@@ -1091,9 +1092,7 @@ public class TestClientRMService {
     return yarnScheduler;
   }
 
-  @Test
-  public void testReservationAPIs() {
-    // initialize
+  private ResourceManager setupResourceManager() {
     CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration();
     ReservationSystemTestUtil.setupQueueConfiguration(conf);
     conf.setClass(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class,
@@ -1101,41 +1100,95 @@ public class TestClientRMService {
     conf.setBoolean(YarnConfiguration.RM_RESERVATION_SYSTEM_ENABLE, true);
     MockRM rm = new MockRM(conf);
     rm.start();
-    MockNM nm;
     try {
-      nm = rm.registerNode("127.0.0.1:1", 102400, 100);
+      rm.registerNode("127.0.0.1:1", 102400, 100);
       // allow plan follower to synchronize
       Thread.sleep(1050);
     } catch (Exception e) {
       Assert.fail(e.getMessage());
     }
+    return rm;
+  }
 
-    // Create a client.
-    ClientRMService clientService = rm.getClientRMService();
+  private ReservationSubmissionRequest submitReservationTestHelper(
+      ClientRMService clientService, long arrival, long deadline,
+      long duration) {
+    ReservationSubmissionResponse sResponse = null;
+    GetNewReservationRequest newReservationRequest =
+        GetNewReservationRequest.newInstance();
+    ReservationId reservationID = null;
+    try {
+      reservationID = clientService.getNewReservation(newReservationRequest)
+          .getReservationId();
+    } catch (Exception e) {
+      Assert.fail(e.getMessage());
+    }
+    ReservationSubmissionRequest sRequest =
+        ReservationSystemTestUtil.createSimpleReservationRequest(reservationID,
+            4, arrival, deadline, duration);
+    try {
+      sResponse = clientService.submitReservation(sRequest);
+    } catch (Exception e) {
+      Assert.fail(e.getMessage());
+    }
+    Assert.assertNotNull(sResponse);
+    Assert.assertNotNull(reservationID);
+    System.out.println("Submit reservation response: " + reservationID);
+    return sRequest;
+  }
 
-    // create a reservation
+  @Test
+  public void testCreateReservation() {
+    ResourceManager rm = setupResourceManager();
+    ClientRMService clientService = rm.getClientRMService();
     Clock clock = new UTCClock();
     long arrival = clock.getTime();
     long duration = 60000;
     long deadline = (long) (arrival + 1.05 * duration);
     ReservationSubmissionRequest sRequest =
-        ReservationSystemTestUtil.createSimpleReservationRequest(4, arrival,
-            deadline, duration);
-    ReservationSubmissionResponse sResponse = null;
+        submitReservationTestHelper(clientService, arrival, deadline, 
duration);
+
+    // Submit the reservation again with the same request and make sure it
+    // passes.
     try {
-      sResponse = clientService.submitReservation(sRequest);
+      clientService.submitReservation(sRequest);
     } catch (Exception e) {
       Assert.fail(e.getMessage());
     }
-    Assert.assertNotNull(sResponse);
-    ReservationId reservationID = sResponse.getReservationId();
-    Assert.assertNotNull(reservationID);
-    LOG.info("Submit reservation response: " + reservationID);
 
-    // Update the reservation
+    // Submit the reservation with the same reservation id but different
+    // reservation definition, and ensure YarnException is thrown.
+    arrival = clock.getTime();
+    ReservationDefinition rDef = sRequest.getReservationDefinition();
+    rDef.setArrival(arrival + duration);
+    sRequest.setReservationDefinition(rDef);
+    try {
+      clientService.submitReservation(sRequest);
+      Assert.fail("Reservation submission should fail if a duplicate "
+          + "reservation id is used, but the reservation definition has been "
+          + "updated.");
+    } catch (Exception e) {
+      Assert.assertTrue(e instanceof YarnException);
+    }
+
+    rm.stop();
+  }
+
+  @Test
+  public void testUpdateReservation() {
+    ResourceManager rm = setupResourceManager();
+    ClientRMService clientService = rm.getClientRMService();
+    Clock clock = new UTCClock();
+    long arrival = clock.getTime();
+    long duration = 60000;
+    long deadline = (long) (arrival + 1.05 * duration);
+    ReservationSubmissionRequest sRequest =
+        submitReservationTestHelper(clientService, arrival, deadline, 
duration);
+
     ReservationDefinition rDef = sRequest.getReservationDefinition();
     ReservationRequest rr =
         rDef.getReservationRequests().getReservationResources().get(0);
+    ReservationId reservationID = sRequest.getReservationId();
     rr.setNumContainers(5);
     arrival = clock.getTime();
     duration = 30000;
@@ -1151,34 +1204,63 @@ public class TestClientRMService {
     } catch (Exception e) {
       Assert.fail(e.getMessage());
     }
-    Assert.assertNotNull(sResponse);
-    LOG.info("Update reservation response: " + uResponse);
+    Assert.assertNotNull(uResponse);
+    System.out.println("Update reservation response: " + uResponse);
 
-    // List reservations, search by reservation ID
-    ReservationListRequest request =
-            ReservationListRequest.newInstance(
-                    ReservationSystemTestUtil.reservationQ,
-                    reservationID.toString(), -1, -1, false);
+    rm.stop();
+  }
 
+  @Test
+  public void testListReservationsByReservationId() {
+    ResourceManager rm = setupResourceManager();
+    ClientRMService clientService = rm.getClientRMService();
+    Clock clock = new UTCClock();
+    long arrival = clock.getTime();
+    long duration = 60000;
+    long deadline = (long) (arrival + 1.05 * duration);
+    ReservationSubmissionRequest sRequest =
+        submitReservationTestHelper(clientService, arrival, deadline, 
duration);
+
+    ReservationId reservationID = sRequest.getReservationId();
     ReservationListResponse response = null;
+    ReservationListRequest request = ReservationListRequest.newInstance(
+        ReservationSystemTestUtil.reservationQ, reservationID.toString(), -1,
+        -1, false);
     try {
       response = clientService.listReservations(request);
     } catch (Exception e) {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    Assert.assertEquals(response.getReservationAllocationState().size(), 1);
+    Assert.assertEquals(1, response.getReservationAllocationState().size());
     Assert.assertEquals(response.getReservationAllocationState().get(0)
-            .getReservationId().getId(), reservationID.getId());
+        .getReservationId().getId(), reservationID.getId());
     Assert.assertEquals(response.getReservationAllocationState().get(0)
-            .getResourceAllocationRequests().size(), 0);
+        .getResourceAllocationRequests().size(), 0);
 
-    // List reservations, search by time within reservation interval.
-    request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, "", 1, Long.MAX_VALUE,
-            true);
+    rm.stop();
+  }
 
-    response = null;
+  @Test
+  public void testListReservationsByTimeInterval() {
+    ResourceManager rm = setupResourceManager();
+    ClientRMService clientService = rm.getClientRMService();
+    Clock clock = new UTCClock();
+    long arrival = clock.getTime();
+    long duration = 60000;
+    long deadline = (long) (arrival + 1.05 * duration);
+    ReservationSubmissionRequest sRequest =
+        submitReservationTestHelper(clientService, arrival, deadline, 
duration);
+
+    // List reservations, search by a point in time within the reservation
+    // range.
+    arrival = clock.getTime();
+    ReservationId reservationID = sRequest.getReservationId();
+    ReservationListRequest request = ReservationListRequest.newInstance(
+        ReservationSystemTestUtil.reservationQ, "", arrival + duration / 2,
+        arrival + duration / 2, true);
+
+    ReservationListResponse response = null;
     try {
       response = clientService.listReservations(request);
     } catch (Exception e) {
@@ -1187,12 +1269,10 @@ public class TestClientRMService {
     Assert.assertNotNull(response);
     Assert.assertEquals(1, response.getReservationAllocationState().size());
     Assert.assertEquals(response.getReservationAllocationState().get(0)
-            .getReservationId().getId(), reservationID.getId());
-
-    // List reservations, search by invalid end time == -1.
+        .getReservationId().getId(), reservationID.getId());
+    // List reservations, search by time within reservation interval.
     request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, "", 1, -1,
-            true);
+        ReservationSystemTestUtil.reservationQ, "", 1, Long.MAX_VALUE, true);
 
     response = null;
     try {
@@ -1203,14 +1283,39 @@ public class TestClientRMService {
     Assert.assertNotNull(response);
     Assert.assertEquals(1, response.getReservationAllocationState().size());
     Assert.assertEquals(response.getReservationAllocationState().get(0)
-            .getReservationId().getId(), reservationID.getId());
+        .getReservationId().getId(), reservationID.getId());
+    // Verify that the full resource allocations exist.
+    Assert.assertTrue(response.getReservationAllocationState().get(0)
+        .getResourceAllocationRequests().size() > 0);
 
-    // List reservations, search by invalid end time < -1.
-    request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, "", 1, -10,
-            true);
+    // Verify that the full RDL is returned.
+    ReservationRequests reservationRequests =
+        response.getReservationAllocationState().get(0)
+            .getReservationDefinition().getReservationRequests();
+    Assert.assertTrue(
+        reservationRequests.getInterpreter().toString().equals("R_ALL"));
+    Assert.assertTrue(reservationRequests.getReservationResources().get(0)
+        .getDuration() == duration);
 
-    response = null;
+    rm.stop();
+  }
+
+  @Test
+  public void testListReservationsByInvalidTimeInterval() {
+    ResourceManager rm = setupResourceManager();
+    ClientRMService clientService = rm.getClientRMService();
+    Clock clock = new UTCClock();
+    long arrival = clock.getTime();
+    long duration = 60000;
+    long deadline = (long) (arrival + 1.05 * duration);
+    ReservationSubmissionRequest sRequest =
+        submitReservationTestHelper(clientService, arrival, deadline, 
duration);
+
+    // List reservations, search by invalid end time == -1.
+    ReservationListRequest request = ReservationListRequest
+        .newInstance(ReservationSystemTestUtil.reservationQ, "", 1, -1, true);
+
+    ReservationListResponse response = null;
     try {
       response = clientService.listReservations(request);
     } catch (Exception e) {
@@ -1219,12 +1324,11 @@ public class TestClientRMService {
     Assert.assertNotNull(response);
     Assert.assertEquals(1, response.getReservationAllocationState().size());
     Assert.assertEquals(response.getReservationAllocationState().get(0)
-            .getReservationId().getId(), reservationID.getId());
+        .getReservationId().getId(), sRequest.getReservationId().getId());
 
-    // List reservations, search by time interval.
-    request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, "", arrival +
-                    duration/2, arrival + duration/2, true);
+    // List reservations, search by invalid end time < -1.
+    request = ReservationListRequest
+        .newInstance(ReservationSystemTestUtil.reservationQ, "", 1, -10, true);
 
     response = null;
     try {
@@ -1235,27 +1339,27 @@ public class TestClientRMService {
     Assert.assertNotNull(response);
     Assert.assertEquals(1, response.getReservationAllocationState().size());
     Assert.assertEquals(response.getReservationAllocationState().get(0)
-            .getReservationId().getId(), reservationID.getId());
+        .getReservationId().getId(), sRequest.getReservationId().getId());
 
-    // Verify that the full resource allocations exist.
-    Assert.assertTrue(response.getReservationAllocationState().get(0)
-            .getResourceAllocationRequests().size() > 0);
+    rm.stop();
+  }
 
-    // Verify that the full RDL is returned.
-    ReservationRequests reservationRequests = response
-            .getReservationAllocationState().get(0).getReservationDefinition()
-            .getReservationRequests();
-    Assert.assertTrue(reservationRequests.getInterpreter().toString()
-            .equals("R_ALL"));
-    Assert.assertTrue(reservationRequests.getReservationResources().get(0)
-            .getDuration() == duration);
+  @Test
+  public void testListReservationsByTimeIntervalContainingNoReservations() {
+    ResourceManager rm = setupResourceManager();
+    ClientRMService clientService = rm.getClientRMService();
+    Clock clock = new UTCClock();
+    long arrival = clock.getTime();
+    long duration = 60000;
+    long deadline = (long) (arrival + 1.05 * duration);
+    ReservationSubmissionRequest sRequest =
+        submitReservationTestHelper(clientService, arrival, deadline, 
duration);
 
-      // List reservations, search by a very large start time.
-    request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, "", Long.MAX_VALUE,
-            -1, false);
+    // List reservations, search by very large start time.
+    ReservationListRequest request = ReservationListRequest.newInstance(
+        ReservationSystemTestUtil.reservationQ, "", Long.MAX_VALUE, -1, false);
 
-    response = null;
+    ReservationListResponse response = null;
     try {
       response = clientService.listReservations(request);
     } catch (Exception e) {
@@ -1264,13 +1368,16 @@ public class TestClientRMService {
 
     // Ensure all reservations are filtered out.
     Assert.assertNotNull(response);
-    Assert.assertEquals(0, response.getReservationAllocationState().size());
+    Assert.assertEquals(response.getReservationAllocationState().size(), 0);
+
+    duration = 30000;
+    deadline = sRequest.getReservationDefinition().getDeadline();
 
     // List reservations, search by start time after the reservation
     // end time.
     request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, "", deadline + duration,
-            deadline + 2 * duration, false);
+        ReservationSystemTestUtil.reservationQ, "", deadline + duration,
+        deadline + 2 * duration, false);
 
     response = null;
     try {
@@ -1283,11 +1390,12 @@ public class TestClientRMService {
     Assert.assertNotNull(response);
     Assert.assertEquals(response.getReservationAllocationState().size(), 0);
 
-    // List reservations, search by  end time before the reservation start
+    arrival = clock.getTime();
+    // List reservations, search by end time before the reservation start
     // time.
     request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, "", 0, arrival -
-                    duration, false);
+        ReservationSystemTestUtil.reservationQ, "", 0, arrival - duration,
+        false);
 
     response = null;
     try {
@@ -1300,10 +1408,9 @@ public class TestClientRMService {
     Assert.assertNotNull(response);
     Assert.assertEquals(response.getReservationAllocationState().size(), 0);
 
-    // List reservations, search by a very small end time.
-    request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, "", 0, 1,
-            false);
+    // List reservations, search by very small end time.
+    request = ReservationListRequest
+        .newInstance(ReservationSystemTestUtil.reservationQ, "", 0, 1, false);
 
     response = null;
     try {
@@ -1316,6 +1423,21 @@ public class TestClientRMService {
     Assert.assertNotNull(response);
     Assert.assertEquals(response.getReservationAllocationState().size(), 0);
 
+    rm.stop();
+  }
+
+  @Test
+  public void testReservationDelete() {
+    ResourceManager rm = setupResourceManager();
+    ClientRMService clientService = rm.getClientRMService();
+    Clock clock = new UTCClock();
+    long arrival = clock.getTime();
+    long duration = 60000;
+    long deadline = (long) (arrival + 1.05 * duration);
+    ReservationSubmissionRequest sRequest =
+        submitReservationTestHelper(clientService, arrival, deadline, 
duration);
+
+    ReservationId reservationID = sRequest.getReservationId();
     // Delete the reservation
     ReservationDeleteRequest dRequest =
         ReservationDeleteRequest.newInstance(reservationID);
@@ -1325,15 +1447,15 @@ public class TestClientRMService {
     } catch (Exception e) {
       Assert.fail(e.getMessage());
     }
-    Assert.assertNotNull(sResponse);
-    LOG.info("Delete reservation response: " + dResponse);
+    Assert.assertNotNull(dResponse);
+    System.out.println("Delete reservation response: " + dResponse);
 
     // List reservations, search by non-existent reservationID
-    request = ReservationListRequest.newInstance(
-            ReservationSystemTestUtil.reservationQ, reservationID.toString(),
-            -1, -1, false);
+    ReservationListRequest request = ReservationListRequest.newInstance(
+        ReservationSystemTestUtil.reservationQ, reservationID.toString(), -1,
+        -1, false);
 
-    response = null;
+    ReservationListResponse response = null;
     try {
       response = clientService.listReservations(request);
     } catch (Exception e) {
@@ -1342,10 +1464,7 @@ public class TestClientRMService {
     Assert.assertNotNull(response);
     Assert.assertEquals(0, response.getReservationAllocationState().size());
 
-    // clean-up
     rm.stop();
-    nm = null;
-    rm = null;
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestReservationSystemWithRMHA.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestReservationSystemWithRMHA.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestReservationSystemWithRMHA.java
index 9a0f2c9..c13d72d 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestReservationSystemWithRMHA.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestReservationSystemWithRMHA.java
@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.yarn.server.resourcemanager;
 
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewReservationRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewReservationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
@@ -65,8 +67,11 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
 
     ClientRMService clientService = rm1.getClientRMService();
 
+    ReservationId reservationID = getNewReservation(clientService)
+        .getReservationId();
     // create a reservation
-    ReservationSubmissionRequest request = 
createReservationSubmissionRequest();
+    ReservationSubmissionRequest request = createReservationSubmissionRequest(
+        reservationID);
     ReservationSubmissionResponse response = null;
     try {
       response = clientService.submitReservation(request);
@@ -74,7 +79,6 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId reservationID = response.getReservationId();
     Assert.assertNotNull(reservationID);
     LOG.info("Submit reservation response: " + reservationID);
 
@@ -98,8 +102,12 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
 
     ClientRMService clientService = rm1.getClientRMService();
 
+    ReservationId reservationID = getNewReservation(clientService)
+        .getReservationId();
+
     // create a reservation
-    ReservationSubmissionRequest request = 
createReservationSubmissionRequest();
+    ReservationSubmissionRequest request = createReservationSubmissionRequest(
+        reservationID);
     ReservationSubmissionResponse response = null;
     try {
       response = clientService.submitReservation(request);
@@ -107,7 +115,6 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId reservationID = response.getReservationId();
     Assert.assertNotNull(reservationID);
     LOG.info("Submit reservation response: " + reservationID);
     ReservationDefinition reservationDefinition =
@@ -144,8 +151,12 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
 
     ClientRMService clientService = rm1.getClientRMService();
 
+    ReservationId reservationID = getNewReservation(clientService)
+        .getReservationId();
+
     // create a reservation
-    ReservationSubmissionRequest request = 
createReservationSubmissionRequest();
+    ReservationSubmissionRequest request = createReservationSubmissionRequest(
+        reservationID);
     ReservationSubmissionResponse response = null;
     try {
       response = clientService.submitReservation(request);
@@ -153,7 +164,6 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId reservationID = response.getReservationId();
     Assert.assertNotNull(reservationID);
 
     // Delete the reservation
@@ -199,13 +209,14 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
     }
   }
 
-  private ReservationSubmissionRequest createReservationSubmissionRequest() {
+  private ReservationSubmissionRequest createReservationSubmissionRequest(
+      ReservationId reservationId) {
     Clock clock = new UTCClock();
     long arrival = clock.getTime();
     long duration = 60000;
     long deadline = (long) (arrival + duration + 1500);
-    return ReservationSystemTestUtil.createSimpleReservationRequest(4, arrival,
-        deadline, duration);
+    return ReservationSystemTestUtil.createSimpleReservationRequest(
+      reservationId, 4, arrival, deadline, duration);
   }
 
   private void validateReservation(Plan plan, ReservationId resId,
@@ -224,8 +235,12 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
 
     ClientRMService clientService = rm1.getClientRMService();
 
+    ReservationId reservationID = getNewReservation(clientService)
+        .getReservationId();
+
     // create a reservation
-    ReservationSubmissionRequest request = 
createReservationSubmissionRequest();
+    ReservationSubmissionRequest request = createReservationSubmissionRequest(
+        reservationID);
     ReservationSubmissionResponse response = null;
     try {
       response = clientService.submitReservation(request);
@@ -233,7 +248,6 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId reservationID = response.getReservationId();
     Assert.assertNotNull(reservationID);
     LOG.info("Submit reservation response: " + reservationID);
     ReservationDefinition reservationDefinition =
@@ -273,10 +287,14 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
     explicitFailover();
 
     addNodeCapacityToPlan(rm2, 102400, 100);
+    ClientRMService clientService = rm2.getClientRMService();
+
+    ReservationId reservationID = getNewReservation(clientService)
+        .getReservationId();
 
     // create a reservation
-    ClientRMService clientService = rm2.getClientRMService();
-    ReservationSubmissionRequest request = 
createReservationSubmissionRequest();
+    ReservationSubmissionRequest request = createReservationSubmissionRequest(
+        reservationID);
     ReservationSubmissionResponse response = null;
     try {
       response = clientService.submitReservation(request);
@@ -284,7 +302,6 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId reservationID = response.getReservationId();
     Assert.assertNotNull(reservationID);
     LOG.info("Submit reservation response: " + reservationID);
     ReservationDefinition reservationDefinition =
@@ -304,8 +321,12 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
 
     ClientRMService clientService = rm1.getClientRMService();
 
+    ReservationId reservationID = getNewReservation(clientService)
+        .getReservationId();
+
     // create a reservation
-    ReservationSubmissionRequest request = 
createReservationSubmissionRequest();
+    ReservationSubmissionRequest request = createReservationSubmissionRequest(
+        reservationID);
     ReservationSubmissionResponse response = null;
     try {
       response = clientService.submitReservation(request);
@@ -313,7 +334,6 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId reservationID = response.getReservationId();
     Assert.assertNotNull(reservationID);
     LOG.info("Submit reservation response: " + reservationID);
     ReservationDefinition reservationDefinition =
@@ -353,8 +373,12 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
 
     ClientRMService clientService = rm1.getClientRMService();
 
+    ReservationId reservationID = getNewReservation(clientService)
+        .getReservationId();
+
     // create a reservation
-    ReservationSubmissionRequest request = 
createReservationSubmissionRequest();
+    ReservationSubmissionRequest request = createReservationSubmissionRequest(
+        reservationID);
     ReservationSubmissionResponse response = null;
     try {
       response = clientService.submitReservation(request);
@@ -362,7 +386,6 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId reservationID = response.getReservationId();
     Assert.assertNotNull(reservationID);
     LOG.info("Submit reservation response: " + reservationID);
     ReservationDefinition reservationDefinition =
@@ -419,8 +442,12 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
 
     ClientRMService clientService = rm1.getClientRMService();
 
-    // create 3 reservations
-    ReservationSubmissionRequest request = 
createReservationSubmissionRequest();
+    ReservationId resID1 = getNewReservation(clientService)
+        .getReservationId();
+
+    // create a reservation
+    ReservationSubmissionRequest request = createReservationSubmissionRequest(
+        resID1);
     ReservationDefinition reservationDefinition =
         request.getReservationDefinition();
     ReservationSubmissionResponse response = null;
@@ -430,25 +457,30 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId resID1 = response.getReservationId();
     Assert.assertNotNull(resID1);
     LOG.info("Submit reservation response: " + resID1);
+
+    ReservationId resID2 = getNewReservation(clientService)
+        .getReservationId();
+    request.setReservationId(resID2);
     try {
       response = clientService.submitReservation(request);
     } catch (Exception e) {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId resID2 = response.getReservationId();
     Assert.assertNotNull(resID2);
     LOG.info("Submit reservation response: " + resID2);
+
+    ReservationId resID3 = getNewReservation(clientService)
+        .getReservationId();
+    request.setReservationId(resID3);
     try {
       response = clientService.submitReservation(request);
     } catch (Exception e) {
       Assert.fail(e.getMessage());
     }
     Assert.assertNotNull(response);
-    ReservationId resID3 = response.getReservationId();
     Assert.assertNotNull(resID3);
     LOG.info("Submit reservation response: " + resID3);
 
@@ -515,4 +547,18 @@ public class TestReservationSystemWithRMHA extends 
RMHATestBase {
     }
   }
 
+  private GetNewReservationResponse getNewReservation(ClientRMService
+                                                        clientRMService) {
+    GetNewReservationRequest newReservationRequest = GetNewReservationRequest
+        .newInstance();
+    GetNewReservationResponse getNewReservationResponse = null;
+    try {
+      getNewReservationResponse = clientRMService.getNewReservation(
+        newReservationRequest);
+    } catch (Exception e) {
+      Assert.fail(e.getMessage());
+    }
+    return getNewReservationResponse;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/ReservationSystemTestUtil.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/ReservationSystemTestUtil.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/ReservationSystemTestUtil.java
index 4aef7ae..9ea1044 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/ReservationSystemTestUtil.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/ReservationSystemTestUtil.java
@@ -197,7 +197,8 @@ public class ReservationSystemTestUtil {
   }
 
   public static ReservationSubmissionRequest createSimpleReservationRequest(
-      int numContainers, long arrival, long deadline, long duration) {
+      ReservationId reservationId, int numContainers, long arrival,
+      long deadline, long duration) {
     // create a request with a single atomic ask
     ReservationRequest r =
         ReservationRequest.newInstance(Resource.newInstance(1024, 1),
@@ -210,7 +211,7 @@ public class ReservationSystemTestUtil {
             "testClientRMService#reservation");
     ReservationSubmissionRequest request =
         ReservationSubmissionRequest.newInstance(rDef,
-            reservationQ);
+            reservationQ, reservationId);
     return request;
   }
 

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java
index a60cf17..40d46d0 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java
@@ -19,8 +19,6 @@
 package org.apache.hadoop.yarn.server.resourcemanager.webapp;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
@@ -102,6 +100,8 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
   // This is what is used in the test resource files.
   private static final String DEFAULT_QUEUE = "dedicated";
   private static final String LIST_RESERVATION_PATH = "reservation/list";
+  private static final String GET_NEW_RESERVATION_PATH =
+      "reservation/new-reservation";
 
   public static class GuiceServletConfig extends GuiceServletContextListener {
 
@@ -330,12 +330,73 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
   public void testSubmitReservation() throws Exception {
     rm.start();
     setupCluster(100);
-    ReservationId rid =
-        testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON);
+
+    ReservationId rid = getReservationIdTestHelper(1);
+    ClientResponse response = reservationSubmissionTestHelper(
+        "reservation/submit", MediaType.APPLICATION_JSON, rid);
+    if (this.isAuthenticationEnabled()) {
+      assertTrue(isHttpSuccessResponse(response));
+      verifyReservationCount(1);
+    }
+    rm.stop();
+  }
+
+  @Test
+  public void testSubmitDuplicateReservation() throws Exception {
+    rm.start();
+    setupCluster(100);
+
+    ReservationId rid = getReservationIdTestHelper(1);
+    long currentTimestamp = clock.getTime() + MINIMUM_RESOURCE_DURATION;
+    ClientResponse response = reservationSubmissionTestHelper(
+        "reservation/submit", MediaType.APPLICATION_JSON, currentTimestamp, "",
+        rid);
+
+    // Make sure that the first submission is successful
+    if (this.isAuthenticationEnabled()) {
+      assertTrue(isHttpSuccessResponse(response));
+    }
+
+    response = reservationSubmissionTestHelper(
+      "reservation/submit", MediaType.APPLICATION_JSON, currentTimestamp, "",
+      rid);
+
+    // Make sure that the second submission is successful
     if (this.isAuthenticationEnabled()) {
-      assertNotNull(rid);
+      assertTrue(isHttpSuccessResponse(response));
+      verifyReservationCount(1);
     }
+
+    rm.stop();
+  }
+
+  @Test
+  public void testSubmitDifferentReservationWithSameId() throws Exception {
+    rm.start();
+    setupCluster(100);
+
+    ReservationId rid = getReservationIdTestHelper(1);
+    long currentTimestamp = clock.getTime() + MINIMUM_RESOURCE_DURATION;
+    ClientResponse response = reservationSubmissionTestHelper(
+        "reservation/submit", MediaType.APPLICATION_JSON, currentTimestamp,
+        "res1", rid);
+
+    // Make sure that the first submission is successful
+    if (this.isAuthenticationEnabled()) {
+      assertTrue(isHttpSuccessResponse(response));
+    }
+
+    // Change the reservation definition.
+    response = reservationSubmissionTestHelper(
+        "reservation/submit", MediaType.APPLICATION_JSON,
+        currentTimestamp + MINIMUM_RESOURCE_DURATION, "res1", rid);
+
+    // Make sure that the second submission is unsuccessful
+    if (this.isAuthenticationEnabled()) {
+      assertTrue(!isHttpSuccessResponse(response));
+      verifyReservationCount(1);
+    }
+
     rm.stop();
   }
 
@@ -344,10 +405,13 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     // setup a cluster too small to accept the reservation
     setupCluster(1);
-    ReservationId rid =
-        testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON);
-    assertNull(rid);
+
+    ReservationId rid = getReservationIdTestHelper(1);
+    ClientResponse response = reservationSubmissionTestHelper(
+        "reservation/submit", MediaType.APPLICATION_JSON, rid);
+
+    assertTrue(!isHttpSuccessResponse(response));
+
     rm.stop();
   }
 
@@ -355,13 +419,14 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
   public void testUpdateReservation() throws JSONException, Exception {
     rm.start();
     setupCluster(100);
-    ReservationId rid =
-        testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON);
+
+    ReservationId rid = getReservationIdTestHelper(1);
+    ClientResponse response = reservationSubmissionTestHelper(
+        "reservation/submit", MediaType.APPLICATION_JSON, rid);
     if (this.isAuthenticationEnabled()) {
-      assertNotNull(rid);
+      assertTrue(isHttpSuccessResponse(response));
     }
-    testUpdateReservationHelper("reservation/update", rid,
+    updateReservationTestHelper("reservation/update", rid,
         MediaType.APPLICATION_JSON);
 
     rm.stop();
@@ -373,11 +438,15 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     setupCluster(100);
 
     long time = clock.getTime() + MINIMUM_RESOURCE_DURATION;
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, time, "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
+
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, time, "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
             MediaType.APPLICATION_JSON, time + MINIMUM_RESOURCE_DURATION,
-            "res_2", 2);
+            "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("start-time", Long.toString((long) (time * 0.9)))
@@ -410,11 +479,19 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
 
     long time = clock.getTime() + MINIMUM_RESOURCE_DURATION;
 
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, time, "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    // If authentication is not enabled then id1 and id2 will be null
+    if (!this.isAuthenticationEnabled() && id1 == null && id2 == null) {
+      return;
+    }
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, time, "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
             MediaType.APPLICATION_JSON, time + MINIMUM_RESOURCE_DURATION,
-            "res_2", 2);
+            "res_2", id2);
 
     String timeParam = Long.toString(time + MINIMUM_RESOURCE_DURATION / 2);
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
@@ -447,11 +524,14 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
 
     long time = clock.getTime() + MINIMUM_RESOURCE_DURATION;
 
-    ReservationId res1 = testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, time, "res_1", 1);
-    ReservationId res2 = testSubmissionReservationHelper("reservation/submit",
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, time, "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
             MediaType.APPLICATION_JSON, time + MINIMUM_RESOURCE_DURATION,
-            "res_2", 2);
+            "res_2", id2);
 
     WebResource resource;
     resource = constructWebResource(LIST_RESERVATION_PATH)
@@ -483,11 +563,14 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
 
     long time = clock.getTime() + MINIMUM_RESOURCE_DURATION;
 
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, time, "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, time, "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
             MediaType.APPLICATION_JSON, time + MINIMUM_RESOURCE_DURATION,
-            "res_2", 2);
+            "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("start-time", Long.toString((long) (time +
@@ -520,11 +603,14 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
 
     long time = clock.getTime() + MINIMUM_RESOURCE_DURATION;
 
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, time, "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, time, "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
             MediaType.APPLICATION_JSON, time + MINIMUM_RESOURCE_DURATION,
-            "res_2", 2);
+            "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("start-time", new Long((long) (time +
@@ -556,11 +642,14 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
 
     long time = clock.getTime() + MINIMUM_RESOURCE_DURATION;
 
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, time, "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, time, "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
             MediaType.APPLICATION_JSON, time + MINIMUM_RESOURCE_DURATION,
-            "res_2", 2);
+            "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("start-time", "-1")
@@ -592,13 +681,16 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     setupCluster(100);
 
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
     long time = clock.getTime() + MINIMUM_RESOURCE_DURATION;
 
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, time, "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, time, "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
             MediaType.APPLICATION_JSON, time + MINIMUM_RESOURCE_DURATION,
-            "res_2", 2);
+            "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("end-time", new Long((long)(time +
@@ -629,10 +721,13 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     setupCluster(100);
 
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_2", 2);
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, clock.getTime(), "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("queue", DEFAULT_QUEUE);
@@ -656,10 +751,13 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     setupCluster(100);
 
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_2", 2);
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, clock.getTime(), "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH);
 
@@ -673,10 +771,13 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     setupCluster(100);
 
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_2", 2);
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, clock.getTime(), "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("queue", DEFAULT_QUEUE + "_invalid");
@@ -691,10 +792,15 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     setupCluster(100);
 
-    ReservationId id1 = testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", 1);
-    testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_2", 2);
+    ReservationId id1 = getReservationIdTestHelper(1);
+    ReservationId id2 = getReservationIdTestHelper(2);
+
+    reservationSubmissionTestHelper("reservation/submit",
+        MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
+        MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1);
+    reservationSubmissionTestHelper("reservation/submit",
+        MediaType.APPLICATION_JSON, clock.getTime(), "res_2", id2);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("include-resource-allocations", "true")
@@ -726,8 +832,10 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     setupCluster(100);
 
-    ReservationId id1 = testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", 1);
+    ReservationId id1 = getReservationIdTestHelper(1);
+
+    reservationSubmissionTestHelper("reservation/submit",
+        MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("queue", DEFAULT_QUEUE);
@@ -747,8 +855,9 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     setupCluster(100);
 
-    ReservationId id1 = testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", 1);
+    ReservationId id1 = getReservationIdTestHelper(1);
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("include-resource-allocations", "true")
@@ -781,8 +890,10 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     rm.start();
     setupCluster(100);
 
-    ReservationId id1 = testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", 1);
+    ReservationId id1 = getReservationIdTestHelper(1);
+
+    reservationSubmissionTestHelper("reservation/submit",
+            MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1);
 
     WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
             .queryParam("include-resource-allocations", "false")
@@ -818,40 +929,76 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
           rm.registerNode("127.0.0." + i + ":1234", 100 * 1024);
       amNodeManager.nodeHeartbeat(true);
     }
-    ReservationId rid =
-        testSubmissionReservationHelper("reservation/submit",
-            MediaType.APPLICATION_JSON);
-    if (this.isAuthenticationEnabled()) {
-      assertNotNull(rid);
-    }
+
+    ReservationId rid = getReservationIdTestHelper(1);
+
+    reservationSubmissionTestHelper("reservation/submit", MediaType
+        .APPLICATION_JSON, rid);
     testDeleteReservationHelper("reservation/delete", rid,
         MediaType.APPLICATION_JSON);
 
     rm.stop();
   }
 
-  private ReservationId testSubmissionReservationHelper(String path,
-      String media) throws Exception {
+  /**
+   * This method is used when a ReservationId is required. Attempt to use REST
+   * API. If authentication is not enabled, ensure that the response status is
+   * unauthorized and generate a ReservationId because downstream components
+   * require a ReservationId for testing.
+   * @param fallbackReservationId the ReservationId to use if authentication
+   *                              is not enabled, causing the getNewReservation
+   *                              API to fail.
+   * @return the object representing the reservation ID.
+   */
+  private ReservationId getReservationIdTestHelper(int fallbackReservationId)
+      throws Exception {
+    Thread.sleep(1000);
+    ClientResponse response = constructWebResource(GET_NEW_RESERVATION_PATH)
+        .type(MediaType.APPLICATION_JSON)
+        .accept(MediaType.APPLICATION_JSON)
+        .post(ClientResponse.class);
+
+    if (!this.isAuthenticationEnabled()) {
+      assertEquals(Status.UNAUTHORIZED, response.getClientResponseStatus());
+      return ReservationId.newInstance(clock.getTime(), fallbackReservationId);
+    }
+
+    System.out.println("RESPONSE:" + response);
+    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+    JSONObject json = response.getEntity(JSONObject.class);
+
+    assertEquals("incorrect number of elements", 1, json.length());
+    ReservationId rid = null;
+    try {
+      rid = ReservationId.parseReservationId(json.getString("reservation-id"));
+    } catch (JSONException j) {
+      // failure is possible and is checked outside
+    }
+    return rid;
+  }
+
+  private ClientResponse reservationSubmissionTestHelper(String path,
+      String media, ReservationId reservationId) throws Exception {
     long arrival = clock.getTime() + MINIMUM_RESOURCE_DURATION;
 
-    return testSubmissionReservationHelper(path, media, arrival, "res_1", 1);
+    return reservationSubmissionTestHelper(path, media, arrival, "res_1",
+      reservationId);
   }
 
-  private ReservationId testSubmissionReservationHelper(String path,
-      String media, Long arrival, String reservationName, int expectedId)
-      throws Exception {
+  private ClientResponse reservationSubmissionTestHelper(String path,
+      String media, Long arrival, String reservationName,
+      ReservationId reservationId) throws Exception {
     String reservationJson = loadJsonFile("submit-reservation.json");
 
-    String reservationJsonRequest = String.format(reservationJson, arrival,
-            arrival + MINIMUM_RESOURCE_DURATION, reservationName);
+    String reservationJsonRequest = String.format(reservationJson,
+        reservationId.toString(), arrival, arrival + MINIMUM_RESOURCE_DURATION,
+        reservationName);
 
-    return submitAndVerifyReservation(path, media, reservationJsonRequest,
-            expectedId);
+    return submitAndVerifyReservation(path, media, reservationJsonRequest);
   }
 
-  private ReservationId submitAndVerifyReservation(String path, String media,
-      String reservationJson, int expectedId) throws Exception {
-
+  private ClientResponse submitAndVerifyReservation(String path, String media,
+      String reservationJson) throws Exception {
     JSONJAXBContext jc =
         new JSONJAXBContext(JSONConfiguration.mapped()
             .build(), ReservationSubmissionRequestInfo.class);
@@ -867,25 +1014,12 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
 
     if (!this.isAuthenticationEnabled()) {
       assertEquals(Status.UNAUTHORIZED, response.getClientResponseStatus());
-      return null;
     }
 
-    System.out.println("RESPONSE:" + response);
-    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
-    JSONObject json = response.getEntity(JSONObject.class);
-
-    assertEquals("incorrect number of elements", 1, json.length());
-    ReservationId rid = null;
-    try {
-      rid = ReservationId.parseReservationId(json.getString("reservation-id"));
-      assertEquals("incorrect return value", rid.getId(), expectedId);
-    } catch (JSONException j) {
-      // failure is possible and is checked outside
-    }
-    return rid;
+    return response;
   }
 
-  private void testUpdateReservationHelper(String path,
+  private void updateReservationTestHelper(String path,
       ReservationId reservationId, String media) throws JSONException,
       Exception {
 
@@ -1002,6 +1136,25 @@ public class TestRMWebServicesReservation extends 
JerseyTestBase {
     return response.getEntity(JSONObject.class);
   }
 
+  private void verifyReservationCount(int count) throws Exception {
+    WebResource resource = constructWebResource(LIST_RESERVATION_PATH)
+        .queryParam("queue", DEFAULT_QUEUE);
+
+    JSONObject json = testListReservationHelper(resource);
+
+    if (count == 1) {
+      // If there are any number other than one reservation, this will throw.
+      json.getJSONObject("reservations");
+    } else {
+      JSONArray reservations = json.getJSONArray("reservations");
+      assertTrue(reservations.length() == count);
+    }
+  }
+
+  private boolean isHttpSuccessResponse(ClientResponse response) {
+    return (response.getStatus() / 100) == 2;
+  }
+
   private void setupCluster(int nodes) throws Exception {
     for (int i = 0; i < nodes; i++) {
       MockNM amNodeManager =

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json
index 0a243a2..580c599 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json
@@ -1,5 +1,6 @@
 {
   "queue" : "dedicated",
+  "reservation-id" : "%s",
   "reservation-definition" : {
      "arrival" : %s,
      "deadline" : %s,

http://git-wip-us.apache.org/repos/asf/hadoop/blob/013532a9/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/ReservationSystem.md
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/ReservationSystem.md
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/ReservationSystem.md
index eda8d4d..51d2b97 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/ReservationSystem.md
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/ReservationSystem.md
@@ -39,7 +39,9 @@ Flow of a Reservation
 
 With reference to the figure above, a typical reservation proceeds as follows:
 
- * **Step 1**  The user (or an automated tool on its behalf) submit a 
reservation request specified by the Reservation Definition Language (RDL). 
This describes the user need for resources over-time (e.g., a skyline of 
resources) and temporal constraints (e.g., deadline). This can be done both 
programmatically through the usual Client-to-RM protocols or via the REST api 
of the RM.
+ * **Step 0**  The user (or an automated tool on its behalf) submits a 
reservation creation request, and receives a response containing the 
ReservationId.
+
+ * **Step 1**  The user (or an automated tool on its behalf) submits a 
reservation request specified by the Reservation Definition Language (RDL) and 
ReservationId retrieved from the previous step. This describes the user need 
for resources over-time (e.g., a skyline of resources) and temporal constraints 
(e.g., deadline). This can be done both programmatically through the usual 
Client-to-RM protocols or via the REST api of the RM. If a reservation is 
submitted with the same ReservationId, and the RDL is the same, a new 
reservation will not be created and the request will be successful. If the RDL 
is different, the reservation will be rejected, and the request will be 
unsuccessful.
 
  * **Step 2**  The ReservationSystem leverages a ReservationAgent (GREE in the 
figure) to find a plausible allocation for the reservation in the Plan, a data 
structure tracking all reservation currently accepted and the available 
resources in the system.
 


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to