Browse Source

AMBARI-1764 - Unable to get all tasks from more than one request_id by one request

git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/trunk@1463624 13f79535-47bb-0310-9956-ffa450edef68
Tom Beerbower 12 years ago
parent
commit
a411f6b89b

+ 3 - 0
CHANGES.txt

@@ -544,6 +544,9 @@ Trunk (unreleased changes):
 
 
  BUG FIXES
  BUG FIXES
 
 
+ AMBARI-1764. Unable to get all tasks from more than one request_id by one
+ request (tbeerbower)
+
  AMBARI-1766. Hide Java Home option on step-7 of Installer wizard. (jaimin)
  AMBARI-1766. Hide Java Home option on step-7 of Installer wizard. (jaimin)
 
 
  AMBARI-1765. Enable the Ganglia rrd files location to be configurable
  AMBARI-1765. Enable the Ganglia rrd files location to be configurable

+ 63 - 38
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java

@@ -29,10 +29,10 @@ import org.apache.ambari.server.controller.spi.RequestStatus;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 
 import java.util.Arrays;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Map;
 import java.util.Set;
 import java.util.Set;
@@ -79,31 +79,40 @@ class RequestResourceProvider extends AbstractControllerResourceProvider {
   public Set<Resource> getResources(Request request, Predicate predicate)
   public Set<Resource> getResources(Request request, Predicate predicate)
     throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
     throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
 
 
-    Set<String>         requestedIds         = getRequestPropertyIds(request, predicate);
-    Map<String, Object> predicateProperties  = PredicateHelper.getProperties(predicate);
-
-    final RequestStatusRequest requestStatusRequest = getRequest(predicateProperties);
-
-    String clusterName = (String) predicateProperties.get(REQUEST_CLUSTER_NAME_PROPERTY_ID);
-
-    Set<RequestStatusResponse> responses = getResources(new Command<Set<RequestStatusResponse>>() {
-      @Override
-      public Set<RequestStatusResponse> invoke() throws AmbariException {
-        return getManagementController().getRequestStatus(requestStatusRequest);
-      }
-    });
-
-
-    Set<Resource> resources = new HashSet<Resource>();
-    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);
+    Set<Resource> resources    = new HashSet<Resource>();
+    Set<String>   requestedIds = getRequestPropertyIds(request, predicate);
+
+    // 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);
+        }
       }
       }
-      resources.add(resource);
     }
     }
     return resources;
     return resources;
   }
   }
@@ -128,22 +137,38 @@ class RequestResourceProvider extends AbstractControllerResourceProvider {
   }
   }
 
 
   /**
   /**
-   * Get a component request object from a map of property values.
+   * Get a map of component request objects from the given maps of property values.
    *
    *
-   * @param properties  the predicate
+   * @param propertiesSet  the set of property maps from the predicate
    *
    *
-   * @return the component request object
+   * @return the map of component request objects keyed by cluster name
    */
    */
-  private RequestStatusRequest getRequest(Map<String, Object> properties) {
-    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);
+  private Map<String, Set<RequestStatusRequest>> getRequests(Set<Map<String, Object>> propertiesSet) {
+
+    Map<String, Set<RequestStatusRequest>> requestSetMap = new HashMap<String, Set<RequestStatusRequest>>();
+
+    for (Map<String, Object> properties : propertiesSet) {
+      Long   requestId   = null;
+      String clusterName = (String) properties.get(REQUEST_CLUSTER_NAME_PROPERTY_ID);
+
+      // group the requests by cluster name
+      Set<RequestStatusRequest> requestSet = requestSetMap.get(clusterName);
+
+      if (requestSet == null) {
+        requestSet = new HashSet<RequestStatusRequest>();
+        requestSetMap.put(clusterName, requestSet);
+      }
+
+      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);
+      }
+      requestSet.add(new RequestStatusRequest(requestId, requestStatus));
     }
     }
-    return new RequestStatusRequest(requestId, requestStatus);
+    return requestSetMap;
   }
   }
 }
 }

+ 46 - 1
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java

@@ -123,7 +123,52 @@ public class RequestResourceProviderTest {
     }
     }
 
 
     // verify
     // verify
-    verify(managementController);  }
+    verify(managementController);
+  }
+
+  @Test
+  public void testGetResourcesOrPredicate() throws Exception {
+    Resource.Type type = Resource.Type.Request;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+
+    Set<RequestStatusResponse> allResponse = new HashSet<RequestStatusResponse>();
+    allResponse.add(new RequestStatusResponse(100L));
+
+    // set expectations
+    expect(managementController.getRequestStatus(AbstractResourceProviderTest.Matcher.getRequestRequest(100L))).
+        andReturn(allResponse).once();
+    expect(managementController.getRequestStatus(AbstractResourceProviderTest.Matcher.getRequestRequest(101L))).
+        andReturn(allResponse).once();
+
+    // replay
+    replay(managementController);
+
+    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);
+
+    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);
+    }
+
+    // verify
+    verify(managementController);
+  }
 
 
   @Test
   @Test
   public void testUpdateResources() throws Exception {
   public void testUpdateResources() throws Exception {