You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sw...@apache.org on 2018/04/30 19:18:21 UTC

[ambari] branch trunk updated: [AMBARI-23727] Predicate evaluation does not work as expected for RequestResourceFilters. (swagle) (#1139)

This is an automated email from the ASF dual-hosted git repository.

swagle pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 154b361  [AMBARI-23727] Predicate evaluation does not work as expected for RequestResourceFilters. (swagle) (#1139)
154b361 is described below

commit 154b3610f75013350990ff4543900a1a19977854
Author: Siddharth <sw...@apache.org>
AuthorDate: Mon Apr 30 12:18:18 2018 -0700

    [AMBARI-23727] Predicate evaluation does not work as expected for RequestResourceFilters. (swagle) (#1139)
---
 .../internal/RequestResourceProvider.java          | 73 ++++++++++------------
 .../internal/RequestResourceProviderTest.java      | 19 +++++-
 2 files changed, 50 insertions(+), 42 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
index c4ef23b..48a9432 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
@@ -43,17 +43,18 @@ import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.ExecuteActionRequest;
 import org.apache.ambari.server.controller.RequestRequest;
 import org.apache.ambari.server.controller.RequestStatusResponse;
+import org.apache.ambari.server.controller.spi.ClusterController;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.QueryResponse;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.RequestStatus;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
-import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.customactions.ActionDefinition;
 import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
@@ -536,52 +537,46 @@ public class RequestResourceProvider extends AbstractControllerResourceProvider
         throw new SystemException(msg, e);
       }
 
-      ResourceProvider resourceProvider = getResourceProvider(Resource.Type.HostComponent);
-
       Set<String> propertyIds = new HashSet<>();
       propertyIds.add(CLUSTER_NAME);
       propertyIds.add(SERVICE_NAME);
       propertyIds.add(COMPONENT_NAME);
 
       Request request = PropertyHelper.getReadRequest(propertyIds);
-
-      Predicate finalPredicate = new PredicateBuilder(filterPredicate)
-        .property(CLUSTER_NAME).equals(clusterName).and()
-        .property(SERVICE_NAME).equals(serviceName).and()
-        .property(COMPONENT_NAME).equals(componentName)
-        .toPredicate();
-
+      
       try {
-        Set<Resource> resources = resourceProvider.getResources(request, finalPredicate);
-
-        if (resources != null && !resources.isEmpty()) {
-          // Allow request to span services / components using just the predicate
-          Map<ServiceComponentTuple, List<String>> dupleListMap = new HashMap<>();
-          for (Resource resource : resources) {
-            String hostnameStr = (String) resource.getPropertyValue(HOST_NAME);
-            if (hostnameStr != null) {
-              String computedServiceName = (String) resource.getPropertyValue(SERVICE_NAME);
-              String computedComponentName = (String) resource.getPropertyValue(COMPONENT_NAME);
-              ServiceComponentTuple duple =
-                new ServiceComponentTuple(computedServiceName, computedComponentName);
-
-              if (!dupleListMap.containsKey(duple)) {
-                hostList = new ArrayList<>();
-                hostList.add(hostnameStr);
-                dupleListMap.put(duple, hostList);
-              } else {
-                dupleListMap.get(duple).add(hostnameStr);
-              }
+        ClusterController clusterController = ClusterControllerHelper.getClusterController();
+        QueryResponse queryResponse = clusterController.getResources(
+          Resource.Type.HostComponent, request, filterPredicate);
+        Iterable<Resource> resourceIterable = clusterController.getIterable(
+          Resource.Type.HostComponent, queryResponse, request,
+          filterPredicate, null, null);
+        
+        // Allow request to span services / components using just the predicate
+        Map<ServiceComponentTuple, List<String>> tupleListMap = new HashMap<>();
+        for (Resource resource : resourceIterable) {
+          String hostnameStr = (String) resource.getPropertyValue(HOST_NAME);
+          if (hostnameStr != null) {
+            String computedServiceName = (String) resource.getPropertyValue(SERVICE_NAME);
+            String computedComponentName = (String) resource.getPropertyValue(COMPONENT_NAME);
+            ServiceComponentTuple tuple = new ServiceComponentTuple(computedServiceName, computedComponentName);
+
+            if (!tupleListMap.containsKey(tuple)) {
+              hostList = new ArrayList<>();
+              hostList.add(hostnameStr);
+              tupleListMap.put(tuple, hostList);
+            } else {
+              tupleListMap.get(tuple).add(hostnameStr);
             }
           }
-          if (!dupleListMap.isEmpty()) {
-            for (Map.Entry<ServiceComponentTuple, List<String>> entry : dupleListMap.entrySet()) {
-              resourceFilterList.add(new RequestResourceFilter(
-                entry.getKey().getServiceName(),
-                entry.getKey().getComponentName(),
-                entry.getValue()
-              ));
-            }
+        }
+        if (!tupleListMap.isEmpty()) {
+          for (Map.Entry<ServiceComponentTuple, List<String>> entry : tupleListMap.entrySet()) {
+            resourceFilterList.add(new RequestResourceFilter(
+              entry.getKey().getServiceName(),
+              entry.getKey().getComponentName(),
+              entry.getValue()
+            ));
           }
         }
       } catch (Exception e) {
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java
index 31a3783..c014692 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java
@@ -41,6 +41,7 @@ import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
@@ -61,6 +62,7 @@ import org.apache.ambari.server.controller.ExecuteActionRequest;
 import org.apache.ambari.server.controller.RequestStatusResponse;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.QueryResponse;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
@@ -1157,12 +1159,24 @@ public class RequestResourceProviderTest {
     ClusterControllerImpl controller = createNiceMock(ClusterControllerImpl.class);
     HostComponentProcessResourceProvider hostComponentProcessResourceProvider = createNiceMock(HostComponentProcessResourceProvider.class);
     PowerMock.mockStatic(ClusterControllerHelper.class);
+
     Resource resource = createNiceMock(Resource.class);
+    Collection<Resource> resources = Collections.singleton(resource);
+    Iterable<Resource> resourceIterable = new Iterable<Resource>() {
+      @Override
+      public Iterator<Resource> iterator() {
+        return resources.iterator();
+      }
+    };
 
     expect(ClusterControllerHelper.getClusterController()).andReturn(controller);
     expect(controller.ensureResourceProvider(Resource.Type.HostComponent)).andReturn(hostComponentProcessResourceProvider);
-    expect(hostComponentProcessResourceProvider.getResources(
-      capture(requestCapture), capture(predicateCapture))).andReturn(Collections.singleton(resource));
+    QueryResponse queryResponse = createNiceMock(QueryResponse.class);
+    expect(controller.getResources(eq(Resource.Type.HostComponent), capture(requestCapture),
+      capture(predicateCapture))).andReturn(queryResponse);
+    expect(controller.getIterable(eq(Resource.Type.HostComponent), eq(queryResponse),
+      (Request) anyObject(), (Predicate) anyObject(), eq(null), eq(null)))
+      .andReturn(resourceIterable);
 
     // replay
     replayAll();
@@ -1184,7 +1198,6 @@ public class RequestResourceProviderTest {
     filterSet.add(filterMap);
 
     properties.put(RequestResourceProvider.REQUEST_RESOURCE_FILTER_ID, filterSet);
-
     propertySet.add(properties);
 
     Map<String, String> requestInfoProperties = new HashMap<>();

-- 
To stop receiving notification emails like this one, please contact
swagle@apache.org.