You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by wa...@apache.org on 2016/02/02 03:18:38 UTC

[3/3] hadoop git commit: YARN-4340. Add list API to reservation system. (Sean Po via wangda)

YARN-4340. Add list API to reservation system. (Sean Po via wangda)


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/9875325d
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/9875325d
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/9875325d

Branch: refs/heads/trunk
Commit: 9875325d5c63f343809907d06bf48a298035a611
Parents: ed55950
Author: Wangda Tan <wa...@apache.org>
Authored: Tue Feb 2 10:17:33 2016 +0800
Committer: Wangda Tan <wa...@apache.org>
Committed: Tue Feb 2 10:17:33 2016 +0800

----------------------------------------------------------------------
 .../hadoop/mapred/ResourceMgrDelegate.java      |   7 +
 .../hadoop/mapred/TestClientRedirect.java       |   8 +
 hadoop-yarn-project/CHANGES.txt                 |   2 +
 .../yarn/api/ApplicationClientProtocol.java     |  49 ++-
 .../protocolrecords/ReservationListRequest.java | 228 ++++++++++++++
 .../ReservationListResponse.java                |  79 +++++
 .../api/records/ReservationAllocationState.java | 191 +++++++++++
 .../api/records/ResourceAllocationRequest.java  | 123 ++++++++
 .../main/proto/applicationclient_protocol.proto |   1 +
 .../src/main/proto/yarn_protos.proto            |  17 +
 .../src/main/proto/yarn_service_protos.proto    |  12 +
 .../hadoop/yarn/client/api/YarnClient.java      |  49 ++-
 .../yarn/client/api/impl/YarnClientImpl.java    |  10 +-
 .../yarn/client/api/impl/TestYarnClient.java    | 173 ++++++++++
 .../ApplicationClientProtocolPBClientImpl.java  |  17 +
 .../ApplicationClientProtocolPBServiceImpl.java |  24 +-
 .../impl/pb/ReservationListRequestPBImpl.java   | 178 +++++++++++
 .../impl/pb/ReservationListResponsePBImpl.java  | 157 ++++++++++
 .../pb/ReservationAllocationStatePBImpl.java    | 288 +++++++++++++++++
 .../pb/ResourceAllocationRequestPBImpl.java     | 188 +++++++++++
 .../hadoop/yarn/api/TestPBImplRecords.java      |  22 +-
 .../amrmproxy/MockResourceManagerFacade.java    |  14 +-
 .../server/resourcemanager/ClientRMService.java |  44 +++
 .../server/resourcemanager/RMAuditLogger.java   |   2 +
 .../recovery/FileSystemRMStateStore.java        |   2 +-
 .../recovery/LeveldbRMStateStore.java           |   2 +-
 .../recovery/MemoryRMStateStore.java            |   2 +-
 .../recovery/NullRMStateStore.java              |   2 +-
 .../resourcemanager/recovery/RMStateStore.java  |   2 +-
 .../RMStateStoreStoreReservationEvent.java      |   2 +-
 .../recovery/ZKRMStateStore.java                |   2 +-
 .../reservation/AbstractReservationSystem.java  |   2 +-
 .../reservation/InMemoryPlan.java               |  71 +++--
 .../resourcemanager/reservation/PlanView.java   |  17 +
 .../reservation/ReservationInputValidator.java  | 122 ++++---
 .../reservation/ReservationSystemUtil.java      |  45 ++-
 .../yarn_server_resourcemanager_recovery.proto  |  16 -
 .../resourcemanager/TestClientRMService.java    | 179 +++++++++++
 .../TestReservationSystemWithRMHA.java          |   2 +-
 .../recovery/RMStateStoreTestBase.java          |   6 +-
 .../reservation/TestInMemoryPlan.java           | 314 +++++++++++++------
 .../TestReservationInputValidator.java          | 103 +++++-
 .../reservation/TestReservationSystemUtil.java  | 134 ++++++++
 43 files changed, 2702 insertions(+), 206 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java
----------------------------------------------------------------------
diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java
index e32b398..21c0d0f 100644
--- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java
+++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java
@@ -46,6 +46,8 @@ import org.apache.hadoop.security.token.Token;
 import org.apache.hadoop.yarn.api.ApplicationClientProtocol;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
@@ -452,6 +454,11 @@ public class ResourceMgrDelegate extends YarnClient {
   }
 
   @Override
+  public ReservationListResponse listReservations(
+          ReservationListRequest request) throws YarnException, IOException {
+    return client.listReservations(request);
+  }
+  @Override
   public Map<NodeId, Set<NodeLabel>> getNodeToLabels() throws YarnException,
       IOException {
     return client.getNodeToLabels();

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestClientRedirect.java
----------------------------------------------------------------------
diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestClientRedirect.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestClientRedirect.java
index 8ab3304..64f967d 100644
--- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestClientRedirect.java
+++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestClientRedirect.java
@@ -110,6 +110,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
@@ -440,6 +442,12 @@ public class TestClientRedirect {
     }
 
     @Override
+    public ReservationListResponse listReservations(
+            ReservationListRequest request) throws YarnException, IOException {
+      return null;
+    }
+
+    @Override
     public GetNodesToLabelsResponse getNodeToLabels(
         GetNodesToLabelsRequest request) throws YarnException, IOException {
       return null;

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/CHANGES.txt
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt
index 6ce175d..90742db 100644
--- a/hadoop-yarn-project/CHANGES.txt
+++ b/hadoop-yarn-project/CHANGES.txt
@@ -773,6 +773,8 @@ Release 2.8.0 - UNRELEASED
     YARN-4371. "yarn application -kill" should take multiple application ids
     (Sunil G via jlowe)
 
+    YARN-4340. Add "list" API to reservation system. (Sean Po via wangda)
+
   OPTIMIZATIONS
 
     YARN-3339. TestDockerContainerExecutor should pull a single image and not

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java
index 1f0e777..bca062e 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java
@@ -49,6 +49,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesReq
 import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
@@ -398,7 +400,7 @@ public interface ApplicationClientProtocol extends ApplicationBaseProtocol {
    * @throws YarnException if the request is invalid or reservation cannot be
    *           deleted successfully
    * @throws IOException
-   * 
+   *
    */
   @Public
   @Unstable
@@ -407,6 +409,51 @@ public interface ApplicationClientProtocol extends ApplicationBaseProtocol {
 
   /**
    * <p>
+   * The interface used by clients to get the list of reservations in a plan.
+   * The reservationId will be used to search for reservations to list if it is
+   * provided. Otherwise, it will select active reservations within the
+   * startTime and endTime (inclusive).
+   * </p>
+   *
+   * @param request to list reservations in a plan. Contains fields to select
+   *                String queue, ReservationId reservationId, long startTime,
+   *                long endTime, and a bool includeReservationAllocations.
+   *
+   *                queue: Required. Cannot be null or empty. Refers to the
+   *                reservable queue in the scheduler that was selected when
+   *                creating a reservation submission
+   *                {@link ReservationSubmissionRequest}.
+   *
+   *                reservationId: Optional. If provided, other fields will
+   *                be ignored.
+   *
+   *                startTime: Optional. If provided, only reservations that
+   *                end after the startTime will be selected. This defaults
+   *                to 0 if an invalid number is used.
+   *
+   *                endTime: Optional. If provided, only reservations that
+   *                start on or before endTime will be selected. This defaults
+   *                to Long.MAX_VALUE if an invalid number is used.
+   *
+   *                includeReservationAllocations: Optional. Flag that
+   *                determines whether the entire reservation allocations are
+   *                to be returned. Reservation allocations are subject to
+   *                change in the event of re-planning as described by
+   *                {@code ReservationDefinition}.
+   *
+   * @return response that contains information about reservations that are
+   *                being searched for.
+   * @throws YarnException if the request is invalid
+   * @throws IOException on IO failures
+   *
+   */
+  @Public
+  @Unstable
+  ReservationListResponse listReservations(
+            ReservationListRequest request) throws YarnException, IOException;
+
+  /**
+   * <p>
    * The interface used by client to get node to labels mappings in existing cluster
    * </p>
    *

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationListRequest.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationListRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationListRequest.java
new file mode 100644
index 0000000..0b5275c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationListRequest.java
@@ -0,0 +1,228 @@
+/**
+ * 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.api.protocolrecords;
+
+import org.apache.hadoop.classification.InterfaceAudience.Public;
+import org.apache.hadoop.classification.InterfaceStability.Unstable;
+import org.apache.hadoop.yarn.util.Records;
+
+/**
+ * {@link ReservationListRequest} captures the set of requirements the
+ * user has to list reservations.
+ */
+@Public
+@Unstable
+public abstract class ReservationListRequest {
+
+  /**
+   * The {@link ReservationListRequest} will use the reservationId to search for
+   * reservations to list if it is provided. Otherwise, it will select active
+   * reservations within the startTime and endTime (inclusive).
+   *
+   * @param queue Required. Cannot be null or empty. Refers to the reservable
+   *              queue in the scheduler that was selected when creating a
+   *              reservation submission {@link ReservationSubmissionRequest}.
+   * @param reservationId Optional. String representation of
+   *                     {@code ReservationId} If provided, other fields will
+   *                     be ignored.
+   * @param startTime Optional. If provided, only reservations that
+   *                end after the startTime will be selected. This defaults
+   *                to 0 if an invalid number is used.
+   * @param endTime Optional. If provided, only reservations that
+   *                start on or before endTime will be selected. This defaults
+   *                to Long.MAX_VALUE if an invalid number is used.
+   * @param includeReservationAllocations Optional. Flag that
+   *                determines whether the entire reservation allocations are
+   *                to be returned. Reservation allocations are subject to
+   *                change in the event of re-planning as described by
+   *                {@code ReservationDefinition}.
+   */
+  @Public
+  @Unstable
+  public static ReservationListRequest newInstance(
+      String queue, String reservationId, long startTime, long endTime,
+      boolean includeReservationAllocations) {
+    ReservationListRequest request =
+        Records.newRecord(ReservationListRequest.class);
+    request.setQueue(queue);
+    request.setReservationId(reservationId);
+    request.setStartTime(startTime);
+    request.setEndTime(endTime);
+    request.setIncludeResourceAllocations(includeReservationAllocations);
+    return request;
+  }
+
+  /**
+   * The {@link ReservationListRequest} will use the reservationId to search for
+   * reservations to list if it is provided. Otherwise, it will select active
+   * reservations within the startTime and endTime (inclusive).
+   *
+   * @param queue Required. Cannot be null or empty. Refers to the reservable
+   *              queue in the scheduler that was selected when creating a
+   *              reservation submission {@link ReservationSubmissionRequest}.
+   * @param reservationId Optional. String representation of
+   *                     {@code ReservationId} If provided, other fields will
+   *                     be ignored.
+   * @param includeReservationAllocations Optional. Flag that
+   *                determines whether the entire reservation allocations are
+   *                to be returned. Reservation allocations are subject to
+   *                change in the event of re-planning as described by
+   *                {@code ReservationDefinition}.
+   */
+  @Public
+  @Unstable
+  public static ReservationListRequest newInstance(
+          String queue, String reservationId, boolean
+          includeReservationAllocations) {
+    return newInstance(queue, reservationId, -1, -1,
+            includeReservationAllocations);
+  }
+
+  /**
+   * The {@link ReservationListRequest} will use the reservationId to search for
+   * reservations to list if it is provided. Otherwise, it will select active
+   * reservations within the startTime and endTime (inclusive).
+   *
+   * @param queue Required. Cannot be null or empty. Refers to the reservable
+   *              queue in the scheduler that was selected when creating a
+   *              reservation submission {@link ReservationSubmissionRequest}.
+   * @param reservationId Optional. String representation of
+   *                     {@code ReservationId} If provided, other fields will
+   *                     be ignored.
+   */
+  @Public
+  @Unstable
+  public static ReservationListRequest newInstance(
+          String queue, String reservationId) {
+    return newInstance(queue, reservationId, -1, -1, false);
+  }
+
+  /**
+   * Get queue name to use to find reservations.
+   *
+   * @return the queue name to use to find reservations.
+   */
+  @Public
+  @Unstable
+  public abstract String getQueue();
+
+  /**
+   * Set queue name to use to find resource allocations.
+   *
+   * @param queue Required. Cannot be null or empty.
+   */
+  @Public
+  @Unstable
+  public abstract void setQueue(String queue);
+
+  /**
+   * Get the reservation id to use to find a reservation.
+   *
+   * @return the reservation id of the reservation.
+   */
+  @Public
+  @Unstable
+  public abstract String getReservationId();
+
+  /**
+   * Set the reservation id to use to find a reservation.
+   *
+   * @param reservationId Optional. String representation of
+   *                     {@code ReservationId} If provided, other fields will
+   *                     be ignored.
+   */
+  @Public
+  @Unstable
+  public abstract void setReservationId(String reservationId);
+
+  /**
+   * Get the start time to use to search for reservations.
+   * When this is set, reservations that start before this start
+   * time are ignored.
+   *
+   * @return the start time to use to search for reservations.
+   */
+  @Public
+  @Unstable
+  public abstract long getStartTime();
+
+  /**
+   * Set the start time to use to search for reservations.
+   * When this is set, reservations that start before this start
+   * time are ignored.
+   *
+   * @param startTime Optional. If provided, only reservations that
+   *                end after the startTime will be selected. This defaults
+   *                to 0 if an invalid number is used.
+   */
+  @Public
+  @Unstable
+  public abstract void setStartTime(long startTime);
+
+  /**
+   * Get the end time to use to search for reservations.
+   * When this is set, reservations that start after this end
+   * time are ignored.
+   *
+   * @return the end time to use to search for reservations.
+   */
+  @Public
+  @Unstable
+  public abstract long getEndTime();
+
+  /**
+   * Set the end time to use to search for reservations.
+   * When this is set, reservations that start after this end
+   * time are ignored.
+   *
+   * @param endTime Optional. If provided, only reservations that
+   *                start before endTime will be selected. This defaults
+   *                to Long.MAX_VALUE if an invalid number is used.
+   */
+  @Public
+  @Unstable
+  public abstract void setEndTime(long endTime);
+
+  /**
+   * Get the boolean representing whether or not the user
+   * is requesting the full resource allocation.
+   * If this is true, the full resource allocation will
+   * be included in the response.
+   *
+   * @return the end time to use to search for reservations.
+   */
+  @Public
+  @Unstable
+  public abstract boolean getIncludeResourceAllocations();
+
+  /**
+   * Set the boolean representing whether or not the user
+   * is requesting the full resource allocation.
+   * If this is true, the full resource allocation will
+   * be included in the response.
+   *
+   * @param includeReservationAllocations Optional. Flag that
+   *                determines whether the entire list of
+   *                {@code ResourceAllocationRequest} will be returned.
+   */
+  @Public
+  @Unstable
+  public abstract void setIncludeResourceAllocations(
+          boolean includeReservationAllocations);
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationListResponse.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationListResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationListResponse.java
new file mode 100644
index 0000000..a5a5e08
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationListResponse.java
@@ -0,0 +1,79 @@
+/**
+ * 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.api.protocolrecords;
+
+import org.apache.hadoop.classification.InterfaceAudience.Private;
+import org.apache.hadoop.classification.InterfaceAudience.Public;
+import org.apache.hadoop.classification.InterfaceStability.Unstable;
+import org.apache.hadoop.yarn.api.records.ReservationAllocationState;
+import org.apache.hadoop.yarn.util.Records;
+
+import java.util.List;
+
+/**
+ * {@link ReservationListResponse} captures the list of reservations that the
+ * user has queried.
+ *
+ * The resulting list of {@link ReservationAllocationState} contains a list of
+ * {@code ResourceAllocationRequest} representing the current state of the
+ * reservation resource allocations will be returned. This is subject to change
+ * in the event of re-planning a described by {@code ReservationDefinition}
+ *
+ * @see ReservationAllocationState
+ *
+ */
+@Public
+@Unstable
+public abstract class ReservationListResponse {
+
+  @Private
+  @Unstable
+  public static ReservationListResponse newInstance(
+      List<ReservationAllocationState> reservationAllocationState) {
+    ReservationListResponse response =
+        Records.newRecord(ReservationListResponse.class);
+    response.setReservationAllocationState(reservationAllocationState);
+    return response;
+  }
+
+  /**
+   * Get the list of {@link ReservationAllocationState}, that corresponds
+   * to a reservation in the scheduler.
+   *
+   * @return the list of {@link ReservationAllocationState} which holds
+   * information of a particular reservation
+   */
+  @Public
+  @Unstable
+  public abstract List<ReservationAllocationState>
+          getReservationAllocationState();
+
+  /**
+   * Set the list of {@link ReservationAllocationState}, that correspond
+   * to a reservation in the scheduler.
+   *
+   * @param reservationAllocationState the list of
+   * {@link ReservationAllocationState} which holds information of a
+   *                                   particular reservation.
+   */
+  @Private
+  @Unstable
+  public abstract void setReservationAllocationState(
+          List<ReservationAllocationState> reservationAllocationState);
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationAllocationState.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationAllocationState.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationAllocationState.java
new file mode 100644
index 0000000..c67b736
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationAllocationState.java
@@ -0,0 +1,191 @@
+/**
+ * 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.api.records;
+
+import org.apache.hadoop.classification.InterfaceAudience.Private;
+import org.apache.hadoop.classification.InterfaceAudience.Public;
+import org.apache.hadoop.classification.InterfaceStability.Stable;
+import org.apache.hadoop.classification.InterfaceStability.Unstable;
+import org.apache.hadoop.yarn.util.Records;
+
+import java.util.List;
+
+/**
+ * {@code ReservationAllocationState} represents the reservation that is
+ * made by a user.
+ * <p>
+ * It includes:
+ * <ul>
+ *   <li>Duration of the reservation.</li>
+ *   <li>Acceptance time of the duration.</li>
+ *   <li>
+ *       List of {@link ResourceAllocationRequest}, which includes the time
+ *       interval, and capability of the allocation.
+ *       {@code ResourceAllocationRequest} represents an allocation
+ *       made for a reservation for the current state of the queue. This can be
+ *       changed for reasons such as re-planning, but will always be subject to
+ *       the constraints of the user contract as described by
+ *       {@link ReservationDefinition}
+ *   </li>
+ *   <li>{@link ReservationId} of the reservation.</li>
+ *   <li>{@link ReservationDefinition} used to make the reservation.</li>
+ * </ul>
+ *
+ * @see ResourceAllocationRequest
+ * @see ReservationId
+ * @see ReservationDefinition
+ */
+@Public
+@Stable
+public abstract class ReservationAllocationState {
+
+  /**
+   *
+   * @param acceptanceTime The acceptance time of the reservation.
+   * @param user The username of the user who made the reservation.
+   * @param resourceAllocations List of {@link ResourceAllocationRequest}
+   *                            representing the current state of the
+   *                            reservation resource allocations. This is
+   *                            subject to change in the event of re-planning.
+   * @param reservationId {@link ReservationId } of the reservation being
+   *                                            listed.
+   * @param reservationDefinition {@link ReservationDefinition} used to make
+   *                              the reservation.
+   * @return {@code ReservationAllocationState} that represents the state of
+   * the reservation.
+   */
+  @Public
+  @Stable
+  public static ReservationAllocationState newInstance(long acceptanceTime,
+           String user, List<ResourceAllocationRequest> resourceAllocations,
+           ReservationId reservationId,
+           ReservationDefinition reservationDefinition) {
+    ReservationAllocationState ri = Records.newRecord(
+            ReservationAllocationState.class);
+    ri.setAcceptanceTime(acceptanceTime);
+    ri.setUser(user);
+    ri.setResourceAllocationRequests(resourceAllocations);
+    ri.setReservationId(reservationId);
+    ri.setReservationDefinition(reservationDefinition);
+    return ri;
+  }
+
+  /**
+   * Get the acceptance time of the reservation.
+   *
+   * @return the time that the reservation was accepted.
+   */
+  @Public
+  @Unstable
+  public abstract long getAcceptanceTime();
+
+  /**
+   * Set the time that the reservation was accepted.
+   *
+   * @param acceptanceTime The acceptance time of the reservation.
+   */
+  @Private
+  @Unstable
+  public abstract void setAcceptanceTime(long acceptanceTime);
+
+  /**
+   * Get the user who made the reservation.
+   *
+   * @return the name of the user who made the reservation.
+   */
+  @Public
+  @Unstable
+  public abstract String getUser();
+
+  /**
+   * Set the user who made the reservation.
+   *
+   * @param user The username of the user who made the reservation.
+   */
+  @Private
+  @Unstable
+  public abstract void setUser(String user);
+
+  /**
+   * Get the Resource allocations of the reservation based on the current state
+   * of the plan. This is subject to change in the event of re-planning.
+   * The allocations will be constraint to the user contract as described by
+   * the {@link ReservationDefinition}
+   *
+   * @return a list of resource allocations for the reservation.
+   */
+  @Public
+  @Unstable
+  public abstract List<ResourceAllocationRequest>
+          getResourceAllocationRequests();
+
+  /**
+   * Set the list of resource allocations made for the reservation.
+   *
+   * @param resourceAllocations List of {@link ResourceAllocationRequest}
+   *                            representing the current state of the
+   *                            reservation resource allocations. This is
+   *                            subject to change in the event of re-planning.
+   */
+  @Private
+  @Unstable
+  public abstract void setResourceAllocationRequests(
+          List<ResourceAllocationRequest> resourceAllocations);
+
+  /**
+   * Get the id of the reservation.
+   *
+   * @return the reservation id corresponding to the reservation.
+   */
+  @Public
+  @Unstable
+  public abstract ReservationId getReservationId();
+
+  /**
+   * Set the id corresponding to the reservation.
+   * `
+   * @param reservationId {@link ReservationId } of the reservation being
+   *                                            listed.
+   */
+  @Private
+  @Unstable
+  public abstract void setReservationId(ReservationId reservationId);
+
+  /**
+   * Get the reservation definition used to make the reservation.
+   *
+   * @return the reservation definition used to make the reservation.
+   */
+  @Public
+  @Unstable
+  public abstract ReservationDefinition getReservationDefinition();
+
+  /**
+   * Set the definition of the reservation.
+   *
+   * @param reservationDefinition {@link ReservationDefinition} used to make
+   *                              the reservation.
+   */
+  @Private
+  @Unstable
+  public abstract void setReservationDefinition(ReservationDefinition
+                                                      reservationDefinition);
+
+
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceAllocationRequest.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceAllocationRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceAllocationRequest.java
new file mode 100644
index 0000000..23a590a
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceAllocationRequest.java
@@ -0,0 +1,123 @@
+/**
+ * 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.api.records;
+
+import org.apache.hadoop.classification.InterfaceAudience.Private;
+import org.apache.hadoop.classification.InterfaceAudience.Public;
+import org.apache.hadoop.classification.InterfaceStability.Unstable;
+import org.apache.hadoop.classification.InterfaceStability.Stable;
+import org.apache.hadoop.yarn.util.Records;
+
+/**
+ * {@code ResourceAllocationRequest} represents an allocation
+ * made for a reservation for the current state of the plan. This can be
+ * changed for reasons such as re-planning, but will always be subject to the
+ * constraints of the user contract as described by
+ * {@link ReservationDefinition}
+ * {@link Resource}
+ *
+ * <p>
+ * It includes:
+ * <ul>
+ *   <li>StartTime of the allocation.</li>
+ *   <li>EndTime of the allocation.</li>
+ *   <li>{@link Resource} reserved for the allocation.</li>
+ * </ul>
+ *
+ * @see Resource
+ */
+@Public
+@Stable
+public abstract class ResourceAllocationRequest {
+
+  /**
+   * @param startTime The start time that the capability is reserved for.
+   * @param endTime The end time that the capability is reserved for.
+   * @param capability {@link Resource} representing the capability of the
+   *                                   resource allocation.
+   * @return {ResourceAllocationRequest} which represents the capability of
+   * the resource allocation for a time interval.
+   */
+  @Public
+  @Stable
+  public static ResourceAllocationRequest newInstance(long startTime,
+                                     long endTime, Resource capability) {
+    ResourceAllocationRequest ra = Records.newRecord(
+            ResourceAllocationRequest.class);
+    ra.setEndTime(endTime);
+    ra.setStartTime(startTime);
+    ra.setCapability(capability);
+    return ra;
+  }
+
+  /**
+   * Get the start time that the resource is allocated.
+   *
+   * @return the start time that the resource is allocated.
+   */
+  @Public
+  @Unstable
+  public abstract long getStartTime();
+
+  /**
+   * Set the start time that the resource is allocated.
+   *
+   * @param startTime The start time that the capability is reserved for.
+   */
+  @Private
+  @Unstable
+  public abstract void setStartTime(long startTime);
+
+  /**
+   * Get the end time that the resource is allocated.
+   *
+   * @return the end time that the resource is allocated.
+   */
+  @Public
+  @Unstable
+  public abstract long getEndTime();
+
+  /**
+   * Set the end time that the resource is allocated.
+   *
+   * @param endTime The end time that the capability is reserved for.
+   */
+  @Private
+  @Unstable
+  public abstract void setEndTime(long endTime);
+
+  /**
+   * Get the allocated resource.
+   *
+   * @return the allocated resource.
+   */
+  @Public
+  @Unstable
+  public abstract Resource getCapability();
+
+  /**
+   * Set the allocated resource.
+   *
+   * @param resource {@link Resource} representing the capability of the
+   *                                   resource allocation.
+   */
+  @Private
+  @Unstable
+  public abstract void setCapability(Resource resource);
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto
index e98726b..763c839 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto
@@ -53,6 +53,7 @@ service ApplicationClientProtocolService {
   rpc submitReservation (ReservationSubmissionRequestProto) returns (ReservationSubmissionResponseProto);
   rpc updateReservation (ReservationUpdateRequestProto) returns (ReservationUpdateResponseProto);
   rpc deleteReservation (ReservationDeleteRequestProto) returns (ReservationDeleteResponseProto);
+  rpc listReservations (ReservationListRequestProto) returns (ReservationListResponseProto);
   rpc getNodeToLabels (GetNodesToLabelsRequestProto) returns (GetNodesToLabelsResponseProto);
   rpc getLabelsToNodes (GetLabelsToNodesRequestProto) returns (GetLabelsToNodesResponseProto);
   rpc getClusterNodeLabels (GetClusterNodeLabelsRequestProto) returns (GetClusterNodeLabelsResponseProto);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto
index 85bfe90..9392efd 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto
@@ -474,6 +474,23 @@ message ReservationDefinitionProto {
   optional string reservation_name = 4;
 }
 
+message ResourceAllocationRequestProto {
+  optional int64 start_time = 1;
+  optional int64 end_time = 2;
+  optional ResourceProto resource = 3;
+}
+
+message ReservationAllocationStateProto {
+  optional ReservationDefinitionProto reservation_definition = 1;
+  repeated ResourceAllocationRequestProto allocation_requests = 2;
+  optional int64 start_time = 3;
+  optional int64 end_time = 4;
+  optional string user = 5;
+  optional bool contains_gangs = 6;
+  optional int64 acceptance_time = 7;
+  optional ReservationIdProto reservation_id = 8;
+}
+
 enum ReservationRequestInterpreterProto {
   R_ANY = 0;
   R_ALL = 1;

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto
index eae840b..bdf022f 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto
@@ -391,6 +391,18 @@ message ReservationDeleteRequestProto {
 message ReservationDeleteResponseProto {
 }
 
+message ReservationListRequestProto {
+  optional string queue = 1;
+  optional string reservation_id = 3;
+  optional int64 start_time = 4;
+  optional int64 end_time = 5;
+  optional bool include_resource_allocations = 6;
+}
+
+message ReservationListResponseProto {
+  repeated ReservationAllocationStateProto reservations = 1;
+}
+
 //////////////////////////////////////////////////////
 /////// SCM_Admin_Protocol //////////////////////////
 //////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java
index 5c9706b..ff231a8 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java
@@ -34,6 +34,8 @@ import org.apache.hadoop.service.AbstractService;
 import org.apache.hadoop.yarn.api.ApplicationClientProtocol;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
@@ -626,7 +628,52 @@ public abstract class YarnClient extends AbstractService {
   @Unstable
   public abstract ReservationDeleteResponse deleteReservation(
       ReservationDeleteRequest request) throws YarnException, IOException;
-  
+
+  /**
+   * <p>
+   * The interface used by clients to get the list of reservations in a plan.
+   * The reservationId will be used to search for reservations to list if it is
+   * provided. Otherwise, it will select active reservations within the
+   * startTime and endTime (inclusive).
+   * </p>
+   *
+   * @param request to list reservations in a plan. Contains fields to select
+   *                String queue, ReservationId reservationId, long startTime,
+   *                long endTime, and a bool includeReservationAllocations.
+   *
+   *                queue: Required. Cannot be null or empty. Refers to the
+   *                reservable queue in the scheduler that was selected when
+   *                creating a reservation submission
+   *                {@link ReservationSubmissionRequest}.
+   *
+   *                reservationId: Optional. If provided, other fields will
+   *                be ignored.
+   *
+   *                startTime: Optional. If provided, only reservations that
+   *                end after the startTime will be selected. This defaults
+   *                to 0 if an invalid number is used.
+   *
+   *                endTime: Optional. If provided, only reservations that
+   *                start on or before endTime will be selected. This defaults
+   *                to Long.MAX_VALUE if an invalid number is used.
+   *
+   *                includeReservationAllocations: Optional. Flag that
+   *                determines whether the entire reservation allocations are
+   *                to be returned. Reservation allocations are subject to
+   *                change in the event of re-planning as described by
+   *                {@link ReservationDefinition}.
+   *
+   * @return response that contains information about reservations that are
+   *                being searched for.
+   * @throws YarnException if the request is invalid
+   * @throws IOException
+   *
+   */
+  @Public
+  @Unstable
+  public abstract ReservationListResponse listReservations(
+          ReservationListRequest request) throws YarnException, IOException;
+
   /**
    * <p>
    * The interface used by client to get node to labels mappings in existing cluster

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java
index f5bbeb4..56e42c4 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java
@@ -73,6 +73,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
@@ -803,7 +805,13 @@ public class YarnClientImpl extends YarnClient {
       ReservationDeleteRequest request) throws YarnException, IOException {
     return rmClient.deleteReservation(request);
   }
-  
+
+  @Override
+  public ReservationListResponse listReservations(
+          ReservationListRequest request) throws YarnException, IOException {
+    return rmClient.listReservations(request);
+  }
+
   @Override
   public Map<NodeId, Set<NodeLabel>> getNodeToLabels() throws YarnException,
       IOException {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java
index 5c2f23f..2c34b99 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java
@@ -73,6 +73,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
@@ -1233,6 +1235,163 @@ public class TestYarnClient {
       Assert.assertNotNull(sResponse);
       System.out.println("Update reservation response: " + uResponse);
 
+      // List reservations, search by reservation ID
+      ReservationListRequest request =
+              ReservationListRequest.newInstance(
+                      ReservationSystemTestUtil.reservationQ,
+                      reservationID.toString(), -1, -1, false);
+
+      ReservationListResponse response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+      Assert.assertNotNull(response);
+      Assert.assertEquals(1, response.getReservationAllocationState().size());
+      Assert.assertEquals(response.getReservationAllocationState().get(0)
+              .getReservationId().getId(), reservationID.getId());
+      Assert.assertEquals(response.getReservationAllocationState().get(0)
+              .getResourceAllocationRequests().size(), 0);
+
+      // List reservations, search by time interval.
+      request = ReservationListRequest.newInstance(
+              ReservationSystemTestUtil.reservationQ, "", arrival +
+                      duration/2, arrival + duration/2, true);
+
+      response = null;
+      try {
+          response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+      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.
+      request = ReservationListRequest.newInstance(
+              ReservationSystemTestUtil.reservationQ, "", 1, -1,
+              true);
+
+      response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+      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.
+      request = ReservationListRequest.newInstance(
+              ReservationSystemTestUtil.reservationQ, "", 1, -10,
+              true);
+
+      response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+      Assert.assertNotNull(response);
+      Assert.assertEquals(1, response.getReservationAllocationState().size());
+      Assert.assertEquals(response.getReservationAllocationState().get(0)
+              .getReservationId().getId(), reservationID.getId());
+
+      // List reservations, search by time within reservation interval.
+      request = ReservationListRequest.newInstance(
+              ReservationSystemTestUtil.reservationQ, "", 1, Long.MAX_VALUE,
+              true);
+
+      response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+      Assert.assertNotNull(response);
+      Assert.assertEquals(1, response.getReservationAllocationState().size());
+      Assert.assertEquals(response.getReservationAllocationState().get(0)
+              .getReservationId().getId(), reservationID.getId());
+
+      // Verify that the full resource allocations exist.
+      Assert.assertTrue(response.getReservationAllocationState().get(0)
+              .getResourceAllocationRequests().size() > 0);
+
+      // 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);
+
+      // List reservations, search by very large start time.
+      request = ReservationListRequest.newInstance(
+              ReservationSystemTestUtil.reservationQ, "", Long.MAX_VALUE,
+              -1, false);
+
+      response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+
+      // List reservations, search by start time after the reservation
+      // end time.
+      request = ReservationListRequest.newInstance(
+              ReservationSystemTestUtil.reservationQ, "", deadline + duration,
+              deadline + 2 * duration, false);
+
+      response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+
+      // Ensure all reservations are filtered out.
+      Assert.assertNotNull(response);
+      Assert.assertEquals(response.getReservationAllocationState().size(), 0);
+
+      // List reservations, search by end time before the reservation start
+      // time.
+      request = ReservationListRequest.newInstance(
+              ReservationSystemTestUtil.reservationQ, "", 0, arrival -
+                      duration, false);
+
+      response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+
+      // Ensure all reservations are filtered out.
+      Assert.assertNotNull(response);
+      Assert.assertEquals(response.getReservationAllocationState().size(), 0);
+
+      // List reservations, search by very small end time.
+      request = ReservationListRequest.newInstance(
+              ReservationSystemTestUtil.reservationQ, "", 0, 1, false);
+
+      response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+
+      // Ensure all reservations are filtered out.
+      Assert.assertNotNull(response);
+      Assert.assertEquals(response.getReservationAllocationState().size(), 0);
+
       // Delete the reservation
       ReservationDeleteRequest dRequest =
           ReservationDeleteRequest.newInstance(reservationID);
@@ -1244,6 +1403,20 @@ public class TestYarnClient {
       }
       Assert.assertNotNull(sResponse);
       System.out.println("Delete reservation response: " + dResponse);
+
+      // List reservations, search by non-existent reservationID
+      request = ReservationListRequest.newInstance(
+                      ReservationSystemTestUtil.reservationQ,
+                      reservationID.toString(), -1, -1, false);
+
+      response = null;
+      try {
+        response = client.listReservations(request);
+      } catch (Exception e) {
+        Assert.fail(e.getMessage());
+      }
+      Assert.assertNotNull(response);
+      Assert.assertEquals(0, response.getReservationAllocationState().size());
     } finally {
       // clean-up
       if (client != null) {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java
index c1e6e9a..e5aad74 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java
@@ -73,6 +73,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
@@ -125,6 +127,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenRe
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteResponsePBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationListRequestPBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationListResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateRequestPBImpl;
@@ -490,6 +494,19 @@ public class ApplicationClientProtocolPBClientImpl implements ApplicationClientP
     }
   }
 
+  @Override
+  public ReservationListResponse listReservations(ReservationListRequest
+                     request) throws YarnException, IOException {
+    YarnServiceProtos.ReservationListRequestProto requestProto =
+        ((ReservationListRequestPBImpl) request).getProto();
+    try {
+      return new ReservationListResponsePBImpl(proxy.listReservations(null,
+      requestProto));
+    } catch (ServiceException e) {
+      RPCUtil.unwrapAndThrowException(e);
+      return null;
+    }
+  }
 
   @Override
   public GetNodesToLabelsResponse getNodeToLabels(

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java
index 2ee88c8..2c5794e 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java
@@ -50,6 +50,7 @@ import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.UpdateApplicationPriorityResponse;
@@ -97,10 +98,14 @@ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenRe
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteResponsePBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationListRequestPBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationListResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateResponsePBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SignalContainerRequestPBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SignalContainerResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.UpdateApplicationPriorityRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.UpdateApplicationPriorityResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationRequestPBImpl;
@@ -147,11 +152,11 @@ import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionReque
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionResponseProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateResponseProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationListRequestProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationListResponseProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.SignalContainerResponseProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.UpdateApplicationPriorityRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.UpdateApplicationPriorityResponseProto;
-import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SignalContainerRequestPBImpl;
-import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SignalContainerResponsePBImpl;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.SubmitApplicationRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.SubmitApplicationResponseProto;
 
@@ -489,6 +494,21 @@ public class ApplicationClientProtocolPBServiceImpl implements ApplicationClient
   }
 
   @Override
+  public ReservationListResponseProto listReservations(RpcController controller,
+            ReservationListRequestProto requestProto) throws ServiceException {
+    ReservationListRequestPBImpl request =
+            new ReservationListRequestPBImpl(requestProto);
+    try {
+      ReservationListResponse response = real.listReservations(request);
+      return ((ReservationListResponsePBImpl) response).getProto();
+    } catch (YarnException e) {
+      throw new ServiceException(e);
+    } catch (IOException e) {
+      throw new ServiceException(e);
+    }
+  }
+
+  @Override
   public GetNodesToLabelsResponseProto getNodeToLabels(
       RpcController controller, GetNodesToLabelsRequestProto proto)
       throws ServiceException {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationListRequestPBImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationListRequestPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationListRequestPBImpl.java
new file mode 100644
index 0000000..044cff6
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationListRequestPBImpl.java
@@ -0,0 +1,178 @@
+/**
+ * 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.api.protocolrecords.impl.pb;
+
+import com.google.protobuf.TextFormat;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListRequest;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos
+        .ReservationListRequestProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos
+        .ReservationListRequestProtoOrBuilder;
+
+/**
+ * {@link ReservationListRequestPBImpl} implements the {@link
+ * ReservationListRequest} abstract class which captures the set of requirements
+ * the user has to list reservations.
+ *
+ * @see ReservationListRequest
+ */
+public class ReservationListRequestPBImpl extends
+        ReservationListRequest {
+
+  private ReservationListRequestProto proto = ReservationListRequestProto
+          .getDefaultInstance();
+  private ReservationListRequestProto.Builder builder = null;
+  private boolean viaProto = false;
+
+  public ReservationListRequestPBImpl() {
+    builder = ReservationListRequestProto.newBuilder();
+  }
+
+  public ReservationListRequestPBImpl(
+          ReservationListRequestProto proto) {
+    this.proto = proto;
+    viaProto = true;
+  }
+
+  public ReservationListRequestProto getProto() {
+    proto = viaProto ? proto : builder.build();
+    viaProto = true;
+    return proto;
+  }
+
+  @Override
+  public String getQueue() {
+    ReservationListRequestProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasQueue()) {
+      return null;
+    }
+    return (p.getQueue());
+  }
+
+  @Override
+  public void setQueue(String queue) {
+    maybeInitBuilder();
+    if (queue == null) {
+      builder.clearQueue();
+      return;
+    }
+    builder.setQueue(queue);
+  }
+
+  @Override
+  public String getReservationId() {
+    ReservationListRequestProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasReservationId()) {
+      return null;
+    }
+    return (p.getReservationId());
+  }
+
+  @Override
+  public void setReservationId(String reservationId) {
+    maybeInitBuilder();
+    if (reservationId == null) {
+      builder.clearReservationId();
+      return;
+    }
+    builder.setReservationId(reservationId);
+  }
+
+  @Override
+  public long getStartTime() {
+    ReservationListRequestProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasStartTime()) {
+      return 0;
+    }
+    return (p.getStartTime());
+  }
+
+  @Override
+  public void setStartTime(long startTime) {
+    maybeInitBuilder();
+    if (startTime <= 0) {
+      builder.clearStartTime();
+      return;
+    }
+    builder.setStartTime(startTime);
+  }
+
+  @Override
+  public long getEndTime() {
+    ReservationListRequestProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasEndTime()) {
+      return Long.MAX_VALUE;
+    }
+    return (p.getEndTime());
+  }
+
+  @Override
+  public void setEndTime(long endTime) {
+    maybeInitBuilder();
+    if (endTime < 0) {
+      builder.setEndTime(Long.MAX_VALUE);
+      return;
+    }
+    builder.setEndTime(endTime);
+  }
+
+  @Override
+  public boolean getIncludeResourceAllocations() {
+    ReservationListRequestProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasIncludeResourceAllocations()) {
+      return false;
+    }
+    return (p.getIncludeResourceAllocations());
+  }
+
+  @Override
+  public void setIncludeResourceAllocations(boolean
+                              includeReservationAllocations) {
+    maybeInitBuilder();
+    builder.setIncludeResourceAllocations(includeReservationAllocations);
+  }
+
+  private void maybeInitBuilder() {
+    if (viaProto || builder == null) {
+      builder = ReservationListRequestProto.newBuilder(proto);
+    }
+    viaProto = false;
+  }
+
+  @Override
+  public String toString() {
+    return TextFormat.shortDebugString(getProto());
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other == null) {
+      return false;
+    }
+    if (other.getClass().isAssignableFrom(this.getClass())) {
+      return this.getProto().equals(this.getClass().cast(other).getProto());
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return getProto().hashCode();
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationListResponsePBImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationListResponsePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationListResponsePBImpl.java
new file mode 100644
index 0000000..7bc43cd
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationListResponsePBImpl.java
@@ -0,0 +1,157 @@
+/**
+ * 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.api.protocolrecords.impl.pb;
+
+import com.google.protobuf.TextFormat;
+import org.apache.hadoop.yarn.api.protocolrecords.ReservationListResponse;
+import org.apache.hadoop.yarn.api.records.ReservationAllocationState;
+import org.apache.hadoop.yarn.api.records.impl.pb.ReservationAllocationStatePBImpl;
+import org.apache.hadoop.yarn.proto.YarnProtos.ReservationAllocationStateProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationListResponseProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationListResponseProtoOrBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * {@link ReservationListResponsePBImpl} is the implementation of the
+ * {@link ReservationListResponse} which captures  the list of reservations
+ * that the user has queried.
+ */
+public class ReservationListResponsePBImpl extends
+    ReservationListResponse {
+
+  private ReservationListResponseProto proto = ReservationListResponseProto
+          .getDefaultInstance();
+  private ReservationListResponseProto.Builder builder = null;
+  private boolean viaProto = false;
+
+  private List<ReservationAllocationState> reservations;
+
+  public ReservationListResponsePBImpl() {
+    builder = ReservationListResponseProto.newBuilder();
+  }
+
+  public ReservationListResponsePBImpl(
+          ReservationListResponseProto proto) {
+    this.proto = proto;
+    viaProto = true;
+  }
+
+  public ReservationListResponseProto getProto() {
+    if (viaProto) {
+      mergeLocalToProto();
+    } else {
+      proto = builder.build();
+    }
+    viaProto = true;
+    return proto;
+  }
+
+  private void maybeInitBuilder() {
+    if (viaProto || builder == null) {
+      builder = ReservationListResponseProto.newBuilder(proto);
+    }
+    viaProto = false;
+  }
+
+  @Override
+  public List<ReservationAllocationState> getReservationAllocationState() {
+    initReservations();
+    mergeLocalToProto();
+    return this.reservations;
+  }
+
+  @Override
+  public void setReservationAllocationState(List<ReservationAllocationState>
+                                                      newReservations) {
+    if (newReservations == null) {
+      builder.clearReservations();
+      return;
+    }
+    reservations = newReservations;
+    mergeLocalToProto();
+  }
+
+  private void mergeLocalToBuilder() {
+    if (this.reservations != null) {
+      int size = reservations.size();
+      builder.clearReservations();
+      for (int i = 0; i < size; i++) {
+        builder.addReservations(i, convertToProtoFormat(
+                reservations.get(i)
+        ));
+      }
+    }
+  }
+
+  private void mergeLocalToProto() {
+    if (viaProto) {
+      maybeInitBuilder();
+    }
+    mergeLocalToBuilder();
+    proto = builder.build();
+    viaProto = true;
+  }
+
+  private ReservationAllocationStatePBImpl convertFromProtoFormat(
+          ReservationAllocationStateProto p) {
+    return new ReservationAllocationStatePBImpl(p);
+  }
+
+  private ReservationAllocationStateProto convertToProtoFormat(
+          ReservationAllocationState r) {
+    return ((ReservationAllocationStatePBImpl)r).getProto();
+  }
+
+  private void initReservations() {
+    if (this.reservations != null) {
+      return;
+    }
+    ReservationListResponseProtoOrBuilder p = viaProto ? proto : builder;
+    List<ReservationAllocationStateProto> reservationProtos =
+            p.getReservationsList();
+    reservations = new ArrayList<>();
+
+    for (ReservationAllocationStateProto r : reservationProtos) {
+      reservations.add(convertFromProtoFormat(r));
+    }
+  }
+
+  @Override
+  public String toString() {
+    return TextFormat.shortDebugString(getProto());
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other == null) {
+      return false;
+    }
+    if (other.getClass().isAssignableFrom(this.getClass())) {
+      return this.getProto().equals(this.getClass().cast(other).getProto());
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return getProto().hashCode();
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/9875325d/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationAllocationStatePBImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationAllocationStatePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationAllocationStatePBImpl.java
new file mode 100644
index 0000000..88e39ec
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationAllocationStatePBImpl.java
@@ -0,0 +1,288 @@
+/**
+ * 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.api.records.impl.pb;
+
+import org.apache.hadoop.classification.InterfaceAudience.Private;
+import org.apache.hadoop.classification.InterfaceStability.Unstable;
+import org.apache.hadoop.yarn.api.records.*;
+import org.apache.hadoop.yarn.proto.YarnProtos.ReservationAllocationStateProto;
+import org.apache.hadoop.yarn.proto.YarnProtos.ReservationAllocationStateProtoOrBuilder;
+import org.apache.hadoop.yarn.proto.YarnProtos.ReservationIdProto;
+import org.apache.hadoop.yarn.proto.YarnProtos.ReservationDefinitionProto;
+import org.apache.hadoop.yarn.proto.YarnProtos.ResourceAllocationRequestProto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * {@code ReservationAllocationStatePBImpl} implements the {@link
+ * ReservationAllocationState} that represents the  reservation  that is
+ * made by a user.
+ *
+ * <p>
+ * It includes:
+ * <ul>
+ *   <li>Duration of the reservation.</li>
+ *   <li>Acceptance time of the duration.</li>
+ *   <li>
+ *       List of {@link ResourceAllocationRequest}, which includes the time
+ *       interval, and capability of the allocation.
+ *       {@code ResourceAllocationRequest} represents an allocation
+ *       made for a reservation for the current state of the plan. This can be
+ *       changed for reasons such as re-planning, but will always be subject to
+ *       the constraints of the user contract as described by
+ *       {@link ReservationDefinition}
+ *   </li>
+ *   <li>{@link ReservationId} of the reservation.</li>
+ *   <li>{@link ReservationDefinition} used to make the reservation.</li>
+ * </ul>
+ *
+ * @see ResourceAllocationRequest
+ * @see ReservationId
+ * @see ReservationDefinition
+ */
+@Private
+@Unstable
+public class ReservationAllocationStatePBImpl extends
+        ReservationAllocationState {
+  private ReservationAllocationStateProto proto =
+          ReservationAllocationStateProto.getDefaultInstance();;
+  private ReservationAllocationStateProto.Builder builder = null;
+  private boolean viaProto = false;
+
+  private List<ResourceAllocationRequest> resourceAllocations = null;
+  private ReservationId reservationId = null;
+  private ReservationDefinition reservationDefinition = null;
+
+  public ReservationAllocationStatePBImpl() {
+    builder = ReservationAllocationStateProto.newBuilder();
+  }
+
+  public ReservationAllocationStatePBImpl(
+          ReservationAllocationStateProto proto) {
+    this.proto = proto;
+    viaProto = true;
+  }
+
+  public ReservationAllocationStateProto getProto() {
+    mergeLocalToProto();
+    proto = viaProto ? proto : builder.build();
+    viaProto = true;
+    return proto;
+  }
+
+  private void maybeInitBuilder() {
+    if (viaProto || builder == null) {
+      builder = ReservationAllocationStateProto.newBuilder(proto);
+    }
+    viaProto = false;
+  }
+
+  private void mergeLocalToBuilder() {
+    if (this.resourceAllocations != null) {
+      int size = resourceAllocations.size();
+      builder.clearAllocationRequests();
+      for (int i = 0; i < size; i++) {
+        builder.addAllocationRequests(i, convertToProtoFormat(
+                resourceAllocations.get(i)
+        ));
+      }
+    }
+
+    if (this.reservationId != null) {
+      builder.setReservationId(convertToProtoFormat(this.reservationId));
+    }
+
+    if (this.reservationDefinition != null) {
+      builder.setReservationDefinition(convertToProtoFormat(this
+              .reservationDefinition));
+    }
+  }
+
+  private void mergeLocalToProto() {
+    if (viaProto) {
+      maybeInitBuilder();
+    }
+    mergeLocalToBuilder();
+    proto = builder.build();
+    viaProto = true;
+  }
+
+  @Override
+  public long getAcceptanceTime() {
+    ReservationAllocationStateProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasAcceptanceTime()) {
+      return 0;
+    }
+    return (p.getAcceptanceTime());
+  }
+
+  @Override
+  public void setAcceptanceTime(long acceptanceTime) {
+    maybeInitBuilder();
+    if (acceptanceTime <= 0) {
+      builder.clearAcceptanceTime();
+      return;
+    }
+    builder.setAcceptanceTime(acceptanceTime);
+  }
+
+  @Override
+  public String getUser() {
+    ReservationAllocationStateProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasUser()) {
+      return null;
+    }
+    return p.getUser();
+  }
+
+  @Override
+  public void setUser(String user) {
+    maybeInitBuilder();
+    if (user == null) {
+      builder.clearUser();
+      return;
+    }
+    builder.setUser(user);
+  }
+
+  @Override
+  public List<ResourceAllocationRequest>
+      getResourceAllocationRequests() {
+    initResourceAllocations();
+    return this.resourceAllocations;
+  }
+
+  @Override
+  public void setResourceAllocationRequests(
+          List<ResourceAllocationRequest> newResourceAllocations) {
+    maybeInitBuilder();
+    if (newResourceAllocations == null) {
+      builder.clearAllocationRequests();
+    }
+    this.resourceAllocations = newResourceAllocations;
+  }
+
+  @Override
+  public ReservationId getReservationId() {
+    ReservationAllocationStateProtoOrBuilder p = viaProto ? proto : builder;
+    if (this.reservationId != null) {
+      return this.reservationId;
+    }
+    this.reservationId = convertFromProtoFormat(p.getReservationId());
+    return this.reservationId;
+  }
+
+  @Override
+  public void setReservationId(ReservationId newReservationId) {
+    maybeInitBuilder();
+    if (newReservationId == null) {
+      builder.clearReservationId();
+    }
+    reservationId = newReservationId;
+  }
+
+  @Override
+  public ReservationDefinition getReservationDefinition() {
+    ReservationAllocationStateProtoOrBuilder p = viaProto ? proto : builder;
+    if (this.reservationDefinition != null) {
+      return this.reservationDefinition;
+    }
+    this.reservationDefinition = convertFromProtoFormat(
+            p.getReservationDefinition());
+    return this.reservationDefinition;
+  }
+
+  @Override
+  public void setReservationDefinition(ReservationDefinition
+                                                 newReservationDefinition) {
+    maybeInitBuilder();
+    if (newReservationDefinition == null) {
+      builder.clearReservationDefinition();
+    }
+    reservationDefinition = newReservationDefinition;
+  }
+
+  private ResourceAllocationRequestPBImpl convertFromProtoFormat(
+          ResourceAllocationRequestProto p) {
+    return new ResourceAllocationRequestPBImpl(p);
+  }
+
+  private ReservationIdPBImpl convertFromProtoFormat(ReservationIdProto p) {
+    return new ReservationIdPBImpl(p);
+  }
+
+  private ReservationDefinitionPBImpl convertFromProtoFormat(
+          ReservationDefinitionProto p) {
+    return new ReservationDefinitionPBImpl(p);
+  }
+
+  private ResourceAllocationRequestProto convertToProtoFormat(
+          ResourceAllocationRequest p) {
+    return ((ResourceAllocationRequestPBImpl)p).getProto();
+  }
+
+  private ReservationIdProto convertToProtoFormat(ReservationId p) {
+    return ((ReservationIdPBImpl)p).getProto();
+  }
+
+  private ReservationDefinitionProto convertToProtoFormat(
+          ReservationDefinition p) {
+    return ((ReservationDefinitionPBImpl)p).getProto();
+  }
+
+  private void initResourceAllocations() {
+    if (this.resourceAllocations != null) {
+      return;
+    }
+    ReservationAllocationStateProtoOrBuilder p = viaProto ? proto : builder;
+    List<ResourceAllocationRequestProto> resourceAllocationProtos =
+            p.getAllocationRequestsList();
+    resourceAllocations = new ArrayList<>();
+
+    for (ResourceAllocationRequestProto r : resourceAllocationProtos) {
+      resourceAllocations.add(convertFromProtoFormat(r));
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "{Acceptance Time: "
+        + getAcceptanceTime() + ", User: " + getUser()
+        + ", Resource Allocations: " + getResourceAllocationRequests()
+        + ", Reservation Id: " + getReservationId()
+        + ", Reservation Definition: " + getReservationDefinition() + "}";
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other == null) {
+      return false;
+    }
+    if (other.getClass().isAssignableFrom(this.getClass())) {
+      return this.getProto().equals(this.getClass().cast(other).getProto());
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return getProto().hashCode();
+  }
+}
\ No newline at end of file