浏览代码

AMBARI-3583 - Requests API should rollup tasks information

tbeerbower 11 年之前
父节点
当前提交
a67fb7cb3b

+ 20 - 0
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/HostRoleStatus.java

@@ -46,4 +46,24 @@ public enum HostRoleStatus {
         return false;
     }
   }
+
+  /**
+   * Indicates whether or not this is a completed state.
+   * Completed means that the associated task has stopped
+   * running because it has finished successfully or has
+   * failed.
+   *
+   * @return true if this is a completed state.
+   */
+  public boolean isCompletedState() {
+    switch (HostRoleStatus.values()[this.status]) {
+      case COMPLETED:
+      case FAILED:
+      case TIMEDOUT:
+      case ABORTED:
+        return true;
+      default:
+        return false;
+    }
+  }
 }

+ 9 - 13
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java

@@ -19,6 +19,7 @@
 package org.apache.ambari.server.controller;
 
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.actionmanager.ActionManager;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
@@ -162,18 +163,6 @@ public interface AmbariManagementController {
   public Set<ConfigurationResponse> getConfigurations(
       Set<ConfigurationRequest> requests) throws AmbariException;
 
-  /**
-   * Gets the request status identified by the given request object.
-   *
-   * @param request   the request object
-   *
-   * @return  a set of request status responses
-   *
-   * @throws AmbariException if the request status could not be read
-   */
-  public Set<RequestStatusResponse> getRequestStatus(RequestStatusRequest request)
-      throws AmbariException;
-
   /**
    * Gets the task status identified by the given request objects.
    *
@@ -507,10 +496,17 @@ public interface AmbariManagementController {
   /**
    * Get the service factory for this management controller.
    *
-   * @return the service factory.
+   * @return the service factory
    */
   public ServiceFactory getServiceFactory();
 
+  /**
+   * Get the action manager for this management controller.
+   *
+   * @return the action manager
+   */
+  public ActionManager getActionManager();
+
   /**
    * Create the stages required to persist an action and return a result containing the
    * associated request and resulting tasks.

+ 5 - 56
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java

@@ -38,7 +38,6 @@ import org.apache.ambari.server.StackAccessException;
 import org.apache.ambari.server.actionmanager.ActionManager;
 import org.apache.ambari.server.actionmanager.ExecutionCommandWrapper;
 import org.apache.ambari.server.actionmanager.HostRoleCommand;
-import org.apache.ambari.server.actionmanager.RequestStatus;
 import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.agent.ExecutionCommand;
@@ -2998,28 +2997,6 @@ public class AmbariManagementControllerImpl implements
     return responses;
   }
 
-  /**
-   * Get a collection of request responses for the given list of request ids.  Note that
-   * this method populates request resources only and does NOT populate the set of task
-   * sub-resources in each request response.
-   */
-  private Collection<RequestStatusResponse> getRequestStatusResponsesWithoutTasks(List<Long> requestIds) {
-    List<HostRoleCommand>            hostRoleCommands = actionManager.getAllTasksByRequestIds(requestIds);
-    Map<Long, String>                requestContexts  = actionManager.getRequestContext(requestIds);
-    Map<Long, RequestStatusResponse> responseMap      = new HashMap<Long, RequestStatusResponse>();
-
-    for (HostRoleCommand hostRoleCommand : hostRoleCommands) {
-      Long requestId = hostRoleCommand.getRequestId();
-      RequestStatusResponse response = responseMap.get(requestId);
-      if (response == null) {
-        response = new RequestStatusResponse(requestId);
-        response.setRequestContext(requestContexts.get(requestId));
-        responseMap.put(requestId, response);
-      }
-    }
-    return responseMap.values();
-  }
-
   /**
    * Get a request response for the given request ids.  Note that this method
    * fully populates a request resource including the set of task sub-resources
@@ -3041,39 +3018,6 @@ public class AmbariManagementControllerImpl implements
     return response;
   }
 
-  @Override
-  public Set<RequestStatusResponse> getRequestStatus(
-      RequestStatusRequest request) throws AmbariException{
-    Set<RequestStatusResponse> response  = new HashSet<RequestStatusResponse>();
-    Long                       requestId = request.getRequestId();
-
-    if (requestId == null) {
-      RequestStatus requestStatus = null;
-      if (request.getRequestStatus() != null) {
-        requestStatus = RequestStatus.valueOf(request.getRequestStatus());
-      }
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Received a Get Request Status request"
-            + ", requestId=null"
-            + ", requestStatus=" + requestStatus);
-      }
-      response.addAll(getRequestStatusResponsesWithoutTasks(
-          actionManager.getRequestsByStatus(requestStatus)));
-    } else {
-      Collection<RequestStatusResponse> responses = getRequestStatusResponsesWithoutTasks(
-          Collections.singletonList(requestId));
-
-      //todo: correlate request with cluster
-      if (responses.isEmpty()) {
-        //todo: should be thrown lower in stack but we only want to throw if id was specified
-        //todo: and we currently iterate over all id's and invoke for each if id is not specified
-        throw new ObjectNotFoundException("Request resource doesn't exist.");
-      }
-      response.addAll(responses);
-    }
-    return response;
-  }
-
   @Override
   public Set<TaskStatusResponse> getTaskStatus(Set<TaskStatusRequest> requests)
       throws AmbariException {
@@ -3966,4 +3910,9 @@ public class AmbariManagementControllerImpl implements
   public ServiceFactory getServiceFactory() {
     return serviceFactory;
   }
+
+  @Override
+  public ActionManager getActionManager() {
+    return actionManager;
+  }
 }

+ 0 - 46
ambari-server/src/main/java/org/apache/ambari/server/controller/RequestStatusRequest.java

@@ -1,46 +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.ambari.server.controller;
-
-public class RequestStatusRequest {
-
-  private final Long requestId;
-  private final String requestStatus;
-
-  public RequestStatusRequest(Long requestId, String requestStatus) {
-    super();
-    this.requestId = requestId;
-    this.requestStatus = requestStatus;
-  }
-
-  /**
-   * @return the requestId
-   */
-  public Long getRequestId() {
-    return requestId;
-  }
-
-  /**
-   * @return the requestStatus
-   */
-  public String getRequestStatus() {
-    return requestStatus;
-  }
-
-}

+ 159 - 69
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java

@@ -17,10 +17,10 @@
  */
 package org.apache.ambari.server.controller.internal;
 
-import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.actionmanager.ActionManager;
+import org.apache.ambari.server.actionmanager.HostRoleCommand;
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.controller.RequestStatusRequest;
-import org.apache.ambari.server.controller.RequestStatusResponse;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -29,11 +29,13 @@ import org.apache.ambari.server.controller.spi.RequestStatus;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -44,10 +46,17 @@ class RequestResourceProvider extends AbstractControllerResourceProvider {
 
   // ----- Property ID constants ---------------------------------------------
   // Requests
-  protected static final String REQUEST_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("Requests", "cluster_name");
-  protected static final String REQUEST_ID_PROPERTY_ID           = PropertyHelper.getPropertyId("Requests", "id");
-  protected static final String REQUEST_STATUS_PROPERTY_ID       = PropertyHelper.getPropertyId("Requests", "request_status");
-  protected static final String REQUEST_CONTEXT_ID               = PropertyHelper.getPropertyId("Requests", "request_context");
+  protected static final String REQUEST_CLUSTER_NAME_PROPERTY_ID = "Requests/cluster_name";
+  protected static final String REQUEST_ID_PROPERTY_ID           = "Requests/id";
+  protected static final String REQUEST_STATUS_PROPERTY_ID       = "Requests/request_status";
+  protected static final String REQUEST_CONTEXT_ID               = "Requests/request_context";
+  protected static final String REQUEST_TASK_CNT_ID              = "Requests/task_count";
+  protected static final String REQUEST_FAILED_TASK_CNT_ID       = "Requests/failed_task_count";
+  protected static final String REQUEST_ABORTED_TASK_CNT_ID      = "Requests/aborted_task_count";
+  protected static final String REQUEST_TIMED_OUT_TASK_CNT_ID    = "Requests/timed_out_task_count";
+  protected static final String REQUEST_COMPLETED_TASK_CNT_ID    = "Requests/completed_task_count";
+  protected static final String REQUEST_QUEUED_TASK_CNT_ID       = "Requests/queued_task_count";
+  protected static final String REQUEST_PROGRESS_PERCENT_ID      = "Requests/progress_percent";
 
   private static Set<String> pkPropertyIds =
       new HashSet<String>(Arrays.asList(new String[]{
@@ -58,9 +67,9 @@ class RequestResourceProvider extends AbstractControllerResourceProvider {
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds           the property ids
-   * @param keyPropertyIds        the key property ids
-   * @param managementController  the management controller
+   * @param propertyIds          the property ids
+   * @param keyPropertyIds       the key property ids
+   * @param managementController the management controller
    */
   RequestResourceProvider(Set<String> propertyIds,
                           Map<Resource.Type, String> keyPropertyIds,
@@ -77,42 +86,24 @@ class RequestResourceProvider extends AbstractControllerResourceProvider {
 
   @Override
   public Set<Resource> getResources(Request request, Predicate predicate)
-    throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
 
-    Set<Resource> resources    = new HashSet<Resource>();
     Set<String>   requestedIds = getRequestPropertyIds(request, predicate);
+    Set<Resource> resources    = new HashSet<Resource>();
 
-    // get the request objects by processing the given predicate
-    Map<String, Set<RequestStatusRequest>> requestStatusRequestSetMap = getRequests(getPropertyMaps(predicate));
-
-    for(Map.Entry<String, Set<RequestStatusRequest>> entry: requestStatusRequestSetMap.entrySet()) {
-
-      String clusterName = entry.getKey();
-      Set<RequestStatusRequest> requestStatusRequestSet = entry.getValue();
-
-      for (RequestStatusRequest requestStatusRequest : requestStatusRequestSet){
-
-        // we need to make a separate request for each request object
-        final RequestStatusRequest finalRequest = requestStatusRequest;
-        Set<RequestStatusResponse> responses = getResources(new Command<Set<RequestStatusResponse>>() {
-          @Override
-          public Set<RequestStatusResponse> invoke() throws AmbariException {
-            return getManagementController().getRequestStatus(finalRequest);
-          }
-        });
-
-        for (RequestStatusResponse response : responses) {
-          Resource resource = new ResourceImpl(Resource.Type.Request);
-          setResourceProperty(resource, REQUEST_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
-          setResourceProperty(resource, REQUEST_ID_PROPERTY_ID, response.getRequestId(), requestedIds);
-          setResourceProperty(resource, REQUEST_CONTEXT_ID, response.getRequestContext(), requestedIds);
-          if (requestStatusRequest.getRequestStatus() != null) {
-            setResourceProperty(resource, REQUEST_STATUS_PROPERTY_ID, requestStatusRequest.getRequestStatus(),
-                requestedIds);
-          }
-          resources.add(resource);
-        }
+    for (Map<String, Object> properties : getPropertyMaps(predicate)) {
+      String clusterName = (String) properties.get(REQUEST_CLUSTER_NAME_PROPERTY_ID);
+
+      Long requestId = null;
+      if (properties.get(REQUEST_ID_PROPERTY_ID) != null) {
+        requestId = Long.valueOf((String) properties.get(REQUEST_ID_PROPERTY_ID));
+      }
+
+      String requestStatus = null;
+      if (properties.get(REQUEST_STATUS_PROPERTY_ID) != null) {
+        requestStatus = (String) properties.get(REQUEST_STATUS_PROPERTY_ID);
       }
+      resources.addAll(getRequestResources(clusterName, requestId, requestStatus, requestedIds));
     }
     return resources;
   }
@@ -129,46 +120,145 @@ class RequestResourceProvider extends AbstractControllerResourceProvider {
     throw new UnsupportedOperationException("Not currently supported.");
   }
 
-  // ----- utility methods -------------------------------------------------
+  // ----- AbstractResourceProvider -----------------------------------------
 
   @Override
   protected Set<String> getPKPropertyIds() {
     return pkPropertyIds;
   }
 
-  /**
-   * Get a map of component request objects from the given maps of property values.
-   *
-   * @param propertiesSet  the set of property maps from the predicate
-   *
-   * @return the map of component request objects keyed by cluster name
-   */
-  private Map<String, Set<RequestStatusRequest>> getRequests(Set<Map<String, Object>> propertiesSet) {
 
-    Map<String, Set<RequestStatusRequest>> requestSetMap = new HashMap<String, Set<RequestStatusRequest>>();
+  // ----- utility methods --------------------------------------------------
 
-    for (Map<String, Object> properties : propertiesSet) {
-      Long   requestId   = null;
-      String clusterName = (String) properties.get(REQUEST_CLUSTER_NAME_PROPERTY_ID);
+  // Get all of the request resources for the given properties
+  private Set<Resource> getRequestResources(String clusterName,
+                                            Long requestId,
+                                            String requestStatus,
+                                            Set<String> requestedPropertyIds) throws NoSuchResourceException {
 
-      // group the requests by cluster name
-      Set<RequestStatusRequest> requestSet = requestSetMap.get(clusterName);
+    Set<Resource> response      = new HashSet<Resource>();
+    ActionManager actionManager = getManagementController().getActionManager();
 
-      if (requestSet == null) {
-        requestSet = new HashSet<RequestStatusRequest>();
-        requestSetMap.put(clusterName, requestSet);
+    if (requestId == null) {
+      org.apache.ambari.server.actionmanager.RequestStatus status = null;
+      if (requestStatus != null) {
+        status = org.apache.ambari.server.actionmanager.RequestStatus.valueOf(requestStatus);
+      }
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Received a Get Request Status request"
+            + ", requestId=null"
+            + ", requestStatus=" + status);
       }
+      response.addAll(getRequestResources(clusterName, actionManager,
+          actionManager.getRequestsByStatus(status), requestedPropertyIds));
+    } else {
+      Collection<Resource> responses = getRequestResources(
+          clusterName, actionManager, Collections.singletonList(requestId), requestedPropertyIds);
 
-      if (properties.get(REQUEST_ID_PROPERTY_ID) != null) {
-        requestId = Long.valueOf((String) properties
-            .get(REQUEST_ID_PROPERTY_ID));
+      if (responses.isEmpty()) {
+        throw new NoSuchResourceException("Request resource doesn't exist.");
       }
-      String requestStatus = null;
-      if (properties.get(REQUEST_STATUS_PROPERTY_ID) != null) {
-        requestStatus = (String)properties.get(REQUEST_STATUS_PROPERTY_ID);
+      response.addAll(responses);
+    }
+    return response;
+  }
+
+  // Get all of the request resources for the given set of request ids
+  private Collection<Resource> getRequestResources(String clusterName,
+                                                   ActionManager actionManager,
+                                                   List<Long> requestIds,
+                                                   Set<String> requestedPropertyIds) {
+
+    List<HostRoleCommand> hostRoleCommands = actionManager.getAllTasksByRequestIds(requestIds);
+    Map<Long, String>     requestContexts  = actionManager.getRequestContext(requestIds);
+    Map<Long, Resource>   resourceMap      = new HashMap<Long, Resource>();
+
+    // group by request id
+    Map<Long, Set<HostRoleCommand>> commandMap = new HashMap<Long, Set<HostRoleCommand>>();
+
+    for (HostRoleCommand hostRoleCommand : hostRoleCommands) {
+      Long                 requestId = hostRoleCommand.getRequestId();
+      Set<HostRoleCommand> commands  = commandMap.get(requestId);
+
+      if (commands == null) {
+        commands = new HashSet<HostRoleCommand>();
+        commandMap.put(requestId, commands);
       }
-      requestSet.add(new RequestStatusRequest(requestId, requestStatus));
+      commands.add(hostRoleCommand);
     }
-    return requestSetMap;
+
+    for (Map.Entry<Long, Set<HostRoleCommand>> entry : commandMap.entrySet()) {
+      Long                 requestId = entry.getKey();
+      Set<HostRoleCommand> commands  = entry.getValue();
+      String               context   = requestContexts.get(requestId);
+
+      resourceMap.put(requestId,
+          getRequestResource(clusterName, requestId, context, commands, requestedPropertyIds));
+    }
+    return resourceMap.values();
+  }
+
+  // Get a request resource from the given set of host role commands.
+  private Resource getRequestResource(String clusterName,
+                                      Long requestId,
+                                      String context,
+                                      Set<HostRoleCommand> commands,
+                                      Set<String> requestedPropertyIds) {
+    Resource resource = new ResourceImpl(Resource.Type.Request);
+
+    setResourceProperty(resource, REQUEST_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_ID_PROPERTY_ID, requestId, requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_CONTEXT_ID, context, requestedPropertyIds);
+
+    int taskCount          = commands.size();
+    int completedTaskCount = 0;
+    int queuedTaskCount    = 0;
+    int failedTaskCount    = 0;
+    int abortedTaskCount   = 0;
+    int timedOutTaskCount  = 0;
+
+    for (HostRoleCommand hostRoleCommand : commands) {
+      HostRoleStatus status = hostRoleCommand.getStatus();
+      if (status.isCompletedState()) {
+        completedTaskCount++;
+
+        switch (status) {
+          case ABORTED:
+            abortedTaskCount++;
+            break;
+          case FAILED:
+            failedTaskCount++;
+            break;
+          case TIMEDOUT:
+            timedOutTaskCount++;
+            break;
+        }
+      } else if (status.equals(HostRoleStatus.QUEUED)) {
+        queuedTaskCount++;
+      }
+    }
+
+    int inProgressTaskCount = taskCount - completedTaskCount - queuedTaskCount;
+
+    // determine request status
+    HostRoleStatus requestStatus = failedTaskCount > 0             ? HostRoleStatus.FAILED :
+                                   abortedTaskCount > 0            ? HostRoleStatus.ABORTED :
+                                   timedOutTaskCount > 0           ? HostRoleStatus.TIMEDOUT :
+                                   inProgressTaskCount > 0         ? HostRoleStatus.IN_PROGRESS :
+                                   completedTaskCount == taskCount ? HostRoleStatus.COMPLETED :
+                                                                     HostRoleStatus.PENDING;
+    double progressPercent =
+        (queuedTaskCount * 0.09 + inProgressTaskCount * 0.35 + completedTaskCount / (double) taskCount) * 100.0;
+
+    setResourceProperty(resource, REQUEST_STATUS_PROPERTY_ID, requestStatus.toString(), requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_TASK_CNT_ID, taskCount, requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_FAILED_TASK_CNT_ID, failedTaskCount, requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_ABORTED_TASK_CNT_ID, abortedTaskCount, requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_TIMED_OUT_TASK_CNT_ID, timedOutTaskCount, requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_QUEUED_TASK_CNT_ID, queuedTaskCount, requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_COMPLETED_TASK_CNT_ID, completedTaskCount, requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_PROGRESS_PERCENT_ID, progressPercent, requestedPropertyIds);
+
+    return resource;
   }
 }

+ 9 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/spi/NoSuchResourceException.java

@@ -32,4 +32,13 @@ public class NoSuchResourceException extends Exception {
   public NoSuchResourceException(String msg, Throwable throwable) {
     super(msg, throwable);
   }
+
+  /**
+   * Constructor.
+   *
+   * @param msg        message
+   */
+  public NoSuchResourceException(String msg) {
+    super(msg);
+  }
 }

+ 7 - 0
ambari-server/src/main/resources/properties.json

@@ -85,6 +85,13 @@
         "Requests/cluster_name",
         "Requests/request_status",
         "Requests/request_context",
+        "Requests/task_count",
+        "Requests/failed_task_count",
+        "Requests/aborted_task_count",
+        "Requests/timed_out_task_count",
+        "Requests/completed_task_count",
+        "Requests/queued_task_count",
+        "Requests/progress_percent",
         "_"
     ],
     "Task":[

+ 31 - 0
ambari-server/src/test/java/org/apache/ambari/server/actionmanager/HostRoleStatusTest.java

@@ -0,0 +1,31 @@
+package org.apache.ambari.server.actionmanager;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * HostRoleStatus Tests.
+ */
+public class HostRoleStatusTest {
+  @Test
+  public void testIsFailedState() throws Exception {
+    Assert.assertTrue(HostRoleStatus.ABORTED.isFailedState());
+    Assert.assertFalse(HostRoleStatus.COMPLETED.isFailedState());
+    Assert.assertTrue(HostRoleStatus.FAILED.isFailedState());
+    Assert.assertFalse(HostRoleStatus.IN_PROGRESS.isFailedState());
+    Assert.assertFalse(HostRoleStatus.PENDING.isFailedState());
+    Assert.assertFalse(HostRoleStatus.QUEUED.isFailedState());
+    Assert.assertTrue(HostRoleStatus.TIMEDOUT.isFailedState());
+  }
+
+  @Test
+  public void testIsCompletedState() throws Exception {
+    Assert.assertTrue(HostRoleStatus.ABORTED.isCompletedState());
+    Assert.assertTrue(HostRoleStatus.COMPLETED.isCompletedState());
+    Assert.assertTrue(HostRoleStatus.FAILED.isCompletedState());
+    Assert.assertFalse(HostRoleStatus.IN_PROGRESS.isCompletedState());
+    Assert.assertFalse(HostRoleStatus.PENDING.isCompletedState());
+    Assert.assertFalse(HostRoleStatus.QUEUED.isCompletedState());
+    Assert.assertTrue(HostRoleStatus.TIMEDOUT.isCompletedState());
+  }
+}

+ 10 - 86
ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java

@@ -432,7 +432,7 @@ public class AmbariManagementControllerTest {
       // Expected
     }
 
-    r.setClusterId(new Long(1));
+    r.setClusterId(1L);
     try {
       controller.createCluster(r);
       fail("Expected create cluster for invalid request");
@@ -1578,18 +1578,6 @@ public class AmbariManagementControllerTest {
       }
     }
 
-
-    RequestStatusRequest statusRequest =
-        new RequestStatusRequest(trackAction.getRequestId(), null);
-    Set<RequestStatusResponse> statusResponses =
-        controller.getRequestStatus(statusRequest);
-    Assert.assertEquals(1, statusResponses.size());
-    RequestStatusResponse statusResponse =
-        statusResponses.iterator().next();
-    Assert.assertNotNull(statusResponse);
-    Assert.assertEquals(trackAction.getRequestId(),
-        statusResponse.getRequestId());
-
     Set<TaskStatusRequest> taskRequests = new HashSet<TaskStatusRequest>();
     TaskStatusRequest t1, t2;
     t1 = new TaskStatusRequest();
@@ -1667,10 +1655,6 @@ public class AmbariManagementControllerTest {
     clusters.debugDump(sb);
     LOG.info("Cluster Dump: " + sb.toString());
 
-    statusRequest = new RequestStatusRequest(null, null);
-    statusResponses = controller.getRequestStatus(statusRequest);
-    Assert.assertEquals(2, statusResponses.size());
-
     for (ServiceComponent sc :
       clusters.getCluster(clusterName).getService(serviceName)
       .getServiceComponents().values()) {
@@ -3454,66 +3438,6 @@ public class AmbariManagementControllerTest {
     // start should fail
   }
 
-  @SuppressWarnings("serial")
-  @Test
-  public void testGetRequestAndTaskStatus() throws AmbariException {
-    long requestId = 3;
-    long stageId = 4;
-    String clusterName = "c1";
-    final String hostName1 = "h1";
-    final String hostName2 = "h2";
-    String context = "Test invocation";
-
-
-    clusters.addCluster(clusterName);
-    clusters.getCluster(clusterName).setDesiredStackVersion(
-        new StackId("HDP-0.1"));
-    clusters.addHost(hostName1);
-    clusters.getHost("h1").setOsType("centos5");
-    clusters.getHost(hostName1).persist();
-    clusters.addHost(hostName2);
-    clusters.getHost("h2").setOsType("centos5");
-    clusters.getHost(hostName2).persist();
-    clusters.mapHostsToCluster(new HashSet<String>(){
-      {add(hostName1); add(hostName2);}}, clusterName);
-
-
-    List<Stage> stages = new ArrayList<Stage>();
-    stages.add(new Stage(requestId, "/a1", clusterName, context));
-    stages.get(0).setStageId(stageId++);
-    stages.get(0).addHostRoleExecutionCommand(hostName1, Role.HBASE_MASTER,
-        RoleCommand.START,
-        new ServiceComponentHostStartEvent(Role.HBASE_MASTER.toString(),
-            hostName1, System.currentTimeMillis(),
-            new HashMap<String, String>()),
-            clusterName, "HBASE");
-    stages.add(new Stage(requestId, "/a2", clusterName, context));
-    stages.get(1).setStageId(stageId);
-    stages.get(1).addHostRoleExecutionCommand(hostName1, Role.HBASE_CLIENT,
-        RoleCommand.START,
-        new ServiceComponentHostStartEvent(Role.HBASE_CLIENT.toString(),
-            hostName1, System.currentTimeMillis(),
-            new HashMap<String, String>()), clusterName, "HBASE");
-
-    actionDB.persistActions(stages);
-
-    Set<RequestStatusResponse> requestStatusResponses =
-        controller.getRequestStatus(new RequestStatusRequest(requestId, null));
-
-    RequestStatusResponse requestStatusResponse =
-        requestStatusResponses.iterator().next();
-    assertEquals(requestId, requestStatusResponse.getRequestId());
-    assertEquals(context, requestStatusResponse.getRequestContext());
-
-    Set<TaskStatusRequest> taskStatusRequests = new HashSet<TaskStatusRequest>();
-    taskStatusRequests.add(new TaskStatusRequest(requestId, null));
-    Set<TaskStatusResponse> taskStatusResponses =
-        controller.getTaskStatus(taskStatusRequests);
-
-    assertEquals(2, taskStatusResponses.size());
-  }
-
-
   @SuppressWarnings("serial")
   @Test
   public void testGetActions() throws Exception {
@@ -4746,7 +4670,7 @@ public class AmbariManagementControllerTest {
     Cluster c = clusters.getCluster(clusterName);
     Service s = c.getService(serviceName);
     // Stop Sch only
-    long id = stopServiceComponentHosts(clusterName, serviceName);
+    stopServiceComponentHosts(clusterName, serviceName);
     Assert.assertEquals(State.STARTED, s.getDesiredState());
     for (ServiceComponent sc : s.getServiceComponents().values()) {
       for (ServiceComponentHost sch : sc.getServiceComponentHosts().values()) {
@@ -4763,7 +4687,7 @@ public class AmbariManagementControllerTest {
     crReq.setDesiredConfig(cr3);
     controller.updateClusters(Collections.singleton(crReq), null);
 
-    id = startService(clusterName, serviceName, false, true);
+    long id = startService(clusterName, serviceName, false, true);
     List<Stage> stages = actionDB.getAllStages(id);
     HostRoleCommand clientHrc = null;
     for (Stage stage : stages) {
@@ -5786,7 +5710,7 @@ public class AmbariManagementControllerTest {
     try {
       controller.getStacks(Collections.singleton(invalidRequest));
     } catch (StackAccessException e) {
-      Assert.assertTrue(e instanceof StackAccessException);
+      // do nothing
     }
   }
 
@@ -5810,7 +5734,7 @@ public class AmbariManagementControllerTest {
     try {
       controller.getStackVersions(Collections.singleton(invalidRequest));
     } catch (StackAccessException e) {
-      Assert.assertTrue(e instanceof StackAccessException);
+      // do nothing
     }
   }
 
@@ -5850,7 +5774,7 @@ public class AmbariManagementControllerTest {
     try {
       controller.getRepositories(Collections.singleton(invalidRequest));
     } catch (StackAccessException e) {
-      Assert.assertTrue(e instanceof StackAccessException);
+      // do nothing
     }
   }
 
@@ -5876,7 +5800,7 @@ public class AmbariManagementControllerTest {
     try {
       controller.getStackServices(Collections.singleton(invalidRequest));
     } catch (StackAccessException e) {
-      Assert.assertTrue(e instanceof StackAccessException);
+      // do nothing
     }
 
 
@@ -5903,7 +5827,7 @@ public class AmbariManagementControllerTest {
     try {
       controller.getStackConfigurations(Collections.singleton(invalidRequest));
     } catch (StackAccessException e) {
-      Assert.assertTrue(e instanceof StackAccessException);
+      // do nothing
     }
   }
 
@@ -5929,7 +5853,7 @@ public class AmbariManagementControllerTest {
     try {
       controller.getStackComponents(Collections.singleton(invalidRequest));
     } catch (StackAccessException e) {
-      Assert.assertTrue(e instanceof StackAccessException);
+      // do nothing
     }
 
 
@@ -5956,7 +5880,7 @@ public class AmbariManagementControllerTest {
     try {
       controller.getStackOperatingSystems(Collections.singleton(invalidRequest));
     } catch (StackAccessException e) {
-      Assert.assertTrue(e instanceof StackAccessException);
+      // do nothing
     }
   }
 

+ 0 - 77
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java

@@ -23,10 +23,8 @@ import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.ClusterRequest;
 import org.apache.ambari.server.controller.ConfigurationRequest;
 import org.apache.ambari.server.controller.HostRequest;
-import org.apache.ambari.server.controller.RequestStatusRequest;
 import org.apache.ambari.server.controller.ServiceComponentHostRequest;
 import org.apache.ambari.server.controller.ServiceComponentRequest;
-import org.apache.ambari.server.controller.ServiceRequest;
 import org.apache.ambari.server.controller.StackConfigurationRequest;
 import org.apache.ambari.server.controller.TaskStatusRequest;
 import org.apache.ambari.server.controller.UserRequest;
@@ -159,12 +157,6 @@ public class AbstractResourceProviderTest {
       return null;
     }
 
-    public static RequestStatusRequest getRequestRequest(Long requestId)
-    {
-      EasyMock.reportMatcher(new RequestRequestMatcher(requestId));
-      return null;
-    }
-
     public static Set<ActionRequest> getActionRequestSet(String clusterName, String serviceName, String actionName)
     {
       EasyMock.reportMatcher(new ActionRequestSetMatcher(clusterName, serviceName, actionName));
@@ -197,13 +189,6 @@ public class AbstractResourceProviderTest {
       return null;
     }
 
-    public static Set<ServiceRequest> getServiceRequestSet(String clusterName, String serviceName,
-                                                           Map<String, String> configVersions, String desiredState)
-    {
-      EasyMock.reportMatcher(new ServiceRequestSetMatcher(clusterName, serviceName, configVersions, desiredState));
-      return null;
-    }
-
     public static Set<TaskStatusRequest> getTaskRequestSet(Long requestId, Long taskId)
     {
       EasyMock.reportMatcher(new TaskRequestSetMatcher(requestId, taskId));
@@ -308,28 +293,6 @@ public class AbstractResourceProviderTest {
     }
   }
 
-  /**
-   * Matcher for a RequestStatusRequest.
-   */
-  public static class RequestRequestMatcher extends RequestStatusRequest implements IArgumentMatcher {
-
-    public RequestRequestMatcher(Long requestId) {
-      super(requestId, "");
-    }
-
-    @Override
-    public boolean matches(Object o) {
-
-      return o instanceof RequestStatusRequest &&
-          eq(((RequestStatusRequest) o).getRequestId(), getRequestId());
-    }
-
-    @Override
-    public void appendTo(StringBuffer stringBuffer) {
-      stringBuffer.append("RequestRequestMatcher(").append(super.toString()).append(")");
-    }
-  }
-
   /**
    * Matcher for a ActionRequest set containing a single request.
    */
@@ -495,46 +458,6 @@ public class AbstractResourceProviderTest {
     }
   }
 
-  /**
-   * Matcher for a ServiceRequest set containing a single request.
-   */
-  public static class ServiceRequestSetMatcher extends HashSet<ServiceRequest> implements IArgumentMatcher {
-
-    private final ServiceRequest serviceRequest;
-
-    public ServiceRequestSetMatcher(
-        String clusterName, String serviceName, Map<String, String> configVersions, String desiredState) {
-      this.serviceRequest = new ServiceRequest(clusterName, serviceName, configVersions, desiredState);
-      add(this.serviceRequest);
-    }
-
-    @Override
-    public boolean matches(Object o) {
-      if (!(o instanceof Set)) {
-        return false;
-      }
-
-      Set set = (Set) o;
-
-      if (set.size() != 1) {
-        return false;
-      }
-
-      Object request = set.iterator().next();
-
-      return request instanceof ServiceRequest &&
-          eq(((ServiceRequest) request).getClusterName(), serviceRequest.getClusterName()) &&
-          eq(((ServiceRequest) request).getServiceName(), serviceRequest.getServiceName()) &&
-          eq(((ServiceRequest) request).getConfigVersions(), serviceRequest.getConfigVersions()) &&
-          eq(((ServiceRequest) request).getDesiredState(), serviceRequest.getDesiredState());
-    }
-
-    @Override
-    public void appendTo(StringBuffer stringBuffer) {
-      stringBuffer.append("ServiceRequestSetMatcher(").append(serviceRequest).append(")");
-    }
-  }
-
   /**
    * Matcher for a TaskStatusRequest set containing a single request.
    */

+ 324 - 18
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java

@@ -18,6 +18,9 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import org.apache.ambari.server.actionmanager.ActionManager;
+import org.apache.ambari.server.actionmanager.HostRoleCommand;
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.RequestStatusResponse;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -26,15 +29,21 @@ import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.easymock.Capture;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
@@ -90,16 +99,27 @@ public class RequestResourceProviderTest {
     Resource.Type type = Resource.Type.Request;
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    ActionManager actionManager = createNiceMock(ActionManager.class);
+    HostRoleCommand hostRoleCommand = createNiceMock(HostRoleCommand.class);
 
-    Set<RequestStatusResponse> allResponse = new HashSet<RequestStatusResponse>();
-    allResponse.add(new RequestStatusResponse(100L));
+    List<HostRoleCommand> hostRoleCommands = new LinkedList<HostRoleCommand>();
+    hostRoleCommands.add(hostRoleCommand);
+
+    Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
+    Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
+
+    Map<Long, String> requestContexts  = new HashMap<Long, String>();
+    requestContexts.put(100L, "this is a context");
 
     // set expectations
-    expect(managementController.getRequestStatus(AbstractResourceProviderTest.Matcher.getRequestRequest(100L))).
-        andReturn(allResponse).once();
+    expect(managementController.getActionManager()).andReturn(actionManager);
+    expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands);
+    expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts);
+    expect(hostRoleCommand.getRequestId()).andReturn(100L).anyTimes();
+    expect(hostRoleCommand.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS);
 
     // replay
-    replay(managementController);
+    replay(managementController, actionManager, hostRoleCommand);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
@@ -110,6 +130,7 @@ public class RequestResourceProviderTest {
     Set<String> propertyIds = new HashSet<String>();
 
     propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
 
     Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").
         toPredicate();
@@ -118,12 +139,12 @@ public class RequestResourceProviderTest {
 
     Assert.assertEquals(1, resources.size());
     for (Resource resource : resources) {
-      long userName = (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
-      Assert.assertEquals(100L, userName);
+      Assert.assertEquals(100L, (long) (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID));
+      Assert.assertEquals("IN_PROGRESS", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
     }
 
     // verify
-    verify(managementController);
+    verify(managementController, actionManager, hostRoleCommand);
   }
 
   @Test
@@ -131,21 +152,28 @@ public class RequestResourceProviderTest {
     Resource.Type type = Resource.Type.Request;
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    ActionManager actionManager = createNiceMock(ActionManager.class);
+    HostRoleCommand hostRoleCommand = createNiceMock(HostRoleCommand.class);
 
-    Set<RequestStatusResponse> response1 = new HashSet<RequestStatusResponse>();
-    response1.add(new RequestStatusResponse(100L));
+    List<HostRoleCommand> hostRoleCommands = new LinkedList<HostRoleCommand>();
+    hostRoleCommands.add(hostRoleCommand);
 
-    Set<RequestStatusResponse> response2 = new HashSet<RequestStatusResponse>();
-    response2.add(new RequestStatusResponse(101L));
+    Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
+    Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
+
+    Map<Long, String> requestContexts  = new HashMap<Long, String>();
+    requestContexts.put(100L, "this is a context");
 
     // set expectations
-    expect(managementController.getRequestStatus(AbstractResourceProviderTest.Matcher.getRequestRequest(100L))).
-        andReturn(response1).once();
-    expect(managementController.getRequestStatus(AbstractResourceProviderTest.Matcher.getRequestRequest(101L))).
-        andReturn(response2).once();
+    expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
+    expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands).anyTimes();
+    expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts).anyTimes();
+    expect(hostRoleCommand.getRequestId()).andReturn(100L);
+    expect(hostRoleCommand.getRequestId()).andReturn(101L);
+    expect(hostRoleCommand.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS).anyTimes();
 
     // replay
-    replay(managementController);
+    replay(managementController, actionManager, hostRoleCommand);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
@@ -170,7 +198,268 @@ public class RequestResourceProviderTest {
     }
 
     // verify
-    verify(managementController);
+    verify(managementController, actionManager, hostRoleCommand);
+  }
+
+  @Test
+  public void testGetResourcesCompleted() throws Exception {
+    Resource.Type type = Resource.Type.Request;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    ActionManager actionManager = createNiceMock(ActionManager.class);
+    HostRoleCommand hostRoleCommand0 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand1 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand2 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand3 = createNiceMock(HostRoleCommand.class);
+
+    List<HostRoleCommand> hostRoleCommands0 = new LinkedList<HostRoleCommand>();
+    hostRoleCommands0.add(hostRoleCommand0);
+    hostRoleCommands0.add(hostRoleCommand1);
+
+    List<HostRoleCommand> hostRoleCommands1 = new LinkedList<HostRoleCommand>();
+    hostRoleCommands1.add(hostRoleCommand2);
+    hostRoleCommands1.add(hostRoleCommand3);
+
+    Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
+    Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
+
+    Map<Long, String> requestContexts0  = new HashMap<Long, String>();
+    requestContexts0.put(100L, "this is a context");
+
+    Map<Long, String> requestContexts1  = new HashMap<Long, String>();
+    requestContexts1.put(101L, "this is a context");
+
+    // set expectations
+    expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
+    expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands0);
+    expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands1);
+    expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts0);
+    expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts1);
+    expect(hostRoleCommand0.getRequestId()).andReturn(100L).anyTimes();
+    expect(hostRoleCommand1.getRequestId()).andReturn(100L).anyTimes();
+    expect(hostRoleCommand2.getRequestId()).andReturn(101L).anyTimes();
+    expect(hostRoleCommand3.getRequestId()).andReturn(101L).anyTimes();
+    expect(hostRoleCommand0.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
+    expect(hostRoleCommand1.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
+    expect(hostRoleCommand2.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
+    expect(hostRoleCommand3.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
+
+    // replay
+    replay(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
+
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID);
+
+    Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").or().
+        property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("101").toPredicate();
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(2, resources.size());
+    for (Resource resource : resources) {
+      long id = (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
+      Assert.assertTrue(id == 100L || id == 101L);
+      Assert.assertEquals("COMPLETED", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
+      Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_TASK_CNT_ID));
+      Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID));
+      Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID));
+
+      Assert.assertEquals(100.0, resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID));
+    }
+
+    // verify
+    verify(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
+  }
+
+  @Test
+  public void testGetResourcesInProgress() throws Exception {
+    Resource.Type type = Resource.Type.Request;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    ActionManager actionManager = createNiceMock(ActionManager.class);
+    HostRoleCommand hostRoleCommand0 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand1 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand2 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand3 = createNiceMock(HostRoleCommand.class);
+
+    List<HostRoleCommand> hostRoleCommands0 = new LinkedList<HostRoleCommand>();
+    hostRoleCommands0.add(hostRoleCommand0);
+    hostRoleCommands0.add(hostRoleCommand1);
+
+    List<HostRoleCommand> hostRoleCommands1 = new LinkedList<HostRoleCommand>();
+    hostRoleCommands1.add(hostRoleCommand2);
+    hostRoleCommands1.add(hostRoleCommand3);
+
+    Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
+    Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
+
+    Map<Long, String> requestContexts0  = new HashMap<Long, String>();
+    requestContexts0.put(100L, "this is a context");
+
+    Map<Long, String> requestContexts1  = new HashMap<Long, String>();
+    requestContexts1.put(101L, "this is a context");
+
+    // set expectations
+    expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
+    expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands0);
+    expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands1);
+    expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts0);
+    expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts1);
+    expect(hostRoleCommand0.getRequestId()).andReturn(100L).anyTimes();
+    expect(hostRoleCommand1.getRequestId()).andReturn(100L).anyTimes();
+    expect(hostRoleCommand2.getRequestId()).andReturn(101L).anyTimes();
+    expect(hostRoleCommand3.getRequestId()).andReturn(101L).anyTimes();
+    expect(hostRoleCommand0.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS).anyTimes();
+    expect(hostRoleCommand1.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
+    expect(hostRoleCommand2.getStatus()).andReturn(HostRoleStatus.IN_PROGRESS).anyTimes();
+    expect(hostRoleCommand3.getStatus()).andReturn(HostRoleStatus.QUEUED).anyTimes();
+
+    // replay
+    replay(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
+
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID);
+
+    Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").or().
+        property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("101").toPredicate();
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(2, resources.size());
+    for (Resource resource : resources) {
+      long id = (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
+      Assert.assertTrue(id == 100L || id == 101L);
+      Assert.assertEquals("IN_PROGRESS", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
+      Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_TASK_CNT_ID));
+      Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID));
+
+      if (id == 100L) {
+        Assert.assertEquals(1, resource.getPropertyValue(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID));
+        Assert.assertEquals(85.0, resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID));
+      } else {
+        Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID));
+        Assert.assertEquals(43.99999999999999, resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID));
+      }
+    }
+
+    // verify
+    verify(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
+  }
+
+  @Test
+  public void testGetResourcesFailed() throws Exception {
+    Resource.Type type = Resource.Type.Request;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    ActionManager actionManager = createNiceMock(ActionManager.class);
+    HostRoleCommand hostRoleCommand0 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand1 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand2 = createNiceMock(HostRoleCommand.class);
+    HostRoleCommand hostRoleCommand3 = createNiceMock(HostRoleCommand.class);
+
+    List<HostRoleCommand> hostRoleCommands0 = new LinkedList<HostRoleCommand>();
+    hostRoleCommands0.add(hostRoleCommand0);
+    hostRoleCommands0.add(hostRoleCommand1);
+
+    List<HostRoleCommand> hostRoleCommands1 = new LinkedList<HostRoleCommand>();
+    hostRoleCommands1.add(hostRoleCommand2);
+    hostRoleCommands1.add(hostRoleCommand3);
+
+    Capture<Collection<Long>> requestIdsCapture = new Capture<Collection<Long>>();
+    Capture<List<Long>> requestIdListCapture = new Capture<List<Long>>();
+
+    Map<Long, String> requestContexts0  = new HashMap<Long, String>();
+    requestContexts0.put(100L, "this is a context");
+
+    Map<Long, String> requestContexts1  = new HashMap<Long, String>();
+    requestContexts1.put(101L, "this is a context");
+
+    // set expectations
+    expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
+    expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands0);
+    expect(actionManager.getAllTasksByRequestIds(capture(requestIdsCapture))).andReturn(hostRoleCommands1);
+    expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts0);
+    expect(actionManager.getRequestContext(capture(requestIdListCapture))).andReturn(requestContexts1);
+    expect(hostRoleCommand0.getRequestId()).andReturn(100L).anyTimes();
+    expect(hostRoleCommand1.getRequestId()).andReturn(100L).anyTimes();
+    expect(hostRoleCommand2.getRequestId()).andReturn(101L).anyTimes();
+    expect(hostRoleCommand3.getRequestId()).andReturn(101L).anyTimes();
+    expect(hostRoleCommand0.getStatus()).andReturn(HostRoleStatus.FAILED).anyTimes();
+    expect(hostRoleCommand1.getStatus()).andReturn(HostRoleStatus.COMPLETED).anyTimes();
+    expect(hostRoleCommand2.getStatus()).andReturn(HostRoleStatus.ABORTED).anyTimes();
+    expect(hostRoleCommand3.getStatus()).andReturn(HostRoleStatus.TIMEDOUT).anyTimes();
+
+    // replay
+    replay(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
+
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    propertyIds.add(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_ABORTED_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_TIMED_OUT_TASK_CNT_ID);
+    propertyIds.add(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID);
+
+    Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("100").or().
+        property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).equals("101").toPredicate();
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(2, resources.size());
+    for (Resource resource : resources) {
+      long id = (Long) resource.getPropertyValue(RequestResourceProvider.REQUEST_ID_PROPERTY_ID);
+      Assert.assertTrue(id == 100L || id == 101L);
+      Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_TASK_CNT_ID));
+      if (id == 100L) {
+        Assert.assertEquals("FAILED", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
+        Assert.assertEquals(1, resource.getPropertyValue(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID));
+        Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_ABORTED_TASK_CNT_ID));
+        Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_TIMED_OUT_TASK_CNT_ID));
+      } else {
+        Assert.assertEquals("ABORTED", resource.getPropertyValue(RequestResourceProvider.REQUEST_STATUS_PROPERTY_ID));
+        Assert.assertEquals(0, resource.getPropertyValue(RequestResourceProvider.REQUEST_FAILED_TASK_CNT_ID));
+        Assert.assertEquals(1, resource.getPropertyValue(RequestResourceProvider.REQUEST_ABORTED_TASK_CNT_ID));
+        Assert.assertEquals(1, resource.getPropertyValue(RequestResourceProvider.REQUEST_TIMED_OUT_TASK_CNT_ID));
+      }
+      Assert.assertEquals(2, resource.getPropertyValue(RequestResourceProvider.REQUEST_COMPLETED_TASK_CNT_ID));
+      Assert.assertEquals(100.0, resource.getPropertyValue(RequestResourceProvider.REQUEST_PROGRESS_PERCENT_ID));
+    }
+
+    // verify
+    verify(managementController, actionManager, hostRoleCommand0, hostRoleCommand1, hostRoleCommand2, hostRoleCommand3);
   }
 
   @Test
@@ -236,4 +525,21 @@ public class RequestResourceProviderTest {
     // verify
     verify(managementController);
   }
+
+//  public static RequestResourceProvider getServiceProvider(AmbariManagementController managementController) {
+//    Resource.Type type = Resource.Type.Request;
+//
+//    return (RequestResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
+//        type,
+//        PropertyHelper.getPropertyIds(type),
+//        PropertyHelper.getKeyPropertyIds(type),
+//        managementController);
+//  }
+//
+//  public static Set<RequestStatusResponse> getRequestStatus(
+//      AmbariManagementController controller, RequestStatusRequest request)
+//      throws AmbariException {
+//    RequestResourceProvider provider = getServiceProvider(controller);
+//    return provider.getRequestStatus(request);
+//  }
 }