Ver código fonte

AMBARI-6546. API call for hosts filtered by host_components/HostRoles/component_name returns 400 error.(vbrodetskyi)

Vitaly Brodetskyi 11 anos atrás
pai
commit
e793b6c838

+ 14 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/query/ProcessingPredicateVisitor.java

@@ -129,7 +129,20 @@ public class ProcessingPredicateVisitor implements PredicateVisitor {
 
   @Override
   public void acceptUnaryPredicate(UnaryPredicate predicate) {
-    lastVisited = predicate;
+    String propertyId = predicate.getPropertyIds().iterator().next();
+    int    index      = propertyId.indexOf("/");
+    String category   = index == -1 ? propertyId : propertyId.substring(0, index);
+
+    Map<String, QueryImpl> subResources = query.ensureSubResources();
+
+    if (subResources.containsKey(category)) {
+      subResourceCategories.add(category);
+      subResourceProperties.add(propertyId);
+      lastVisited = AlwaysPredicate.INSTANCE;
+    }
+    else {
+      lastVisited = predicate;
+    }
   }
 
   @Override

+ 17 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/query/SubResourcePredicateVisitor.java

@@ -24,6 +24,7 @@ import org.apache.ambari.server.controller.predicate.CategoryPredicate;
 import org.apache.ambari.server.controller.predicate.ComparisonPredicate;
 import org.apache.ambari.server.controller.predicate.PredicateVisitor;
 import org.apache.ambari.server.controller.predicate.UnaryPredicate;
+import org.apache.ambari.server.controller.predicate.NotPredicate;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.utilities.PredicateHelper;
 
@@ -100,7 +101,22 @@ public class SubResourcePredicateVisitor implements PredicateVisitor {
 
   @Override
   public void acceptUnaryPredicate(UnaryPredicate predicate) {
-    lastVisited = predicate;
+    if (predicate.getPredicate() instanceof ComparisonPredicate) {
+      ComparisonPredicate innerPredicate = (ComparisonPredicate) predicate.getPredicate();
+      String propertyId = innerPredicate.getPropertyId();
+
+      int    index    = propertyId.indexOf("/");
+      String category = index == -1 ? propertyId : propertyId.substring(0, index);
+
+      if(index > -1 && category.equals(this.category)) {
+        // copy and strip off category
+        lastVisited = new NotPredicate(innerPredicate.copy(propertyId.substring(index + 1)));
+      } else {
+        lastVisited = AlwaysPredicate.INSTANCE;
+      }
+    } else {
+      lastVisited = predicate;
+    }
   }
 
   @Override

+ 27 - 0
ambari-server/src/test/java/org/apache/ambari/server/api/query/ProcessingPredicateVisitorTest.java

@@ -17,8 +17,10 @@
  */
 package org.apache.ambari.server.api.query;
 
+import org.apache.ambari.server.api.resources.HostResourceDefinition;
 import org.apache.ambari.server.api.resources.ResourceDefinition;
 import org.apache.ambari.server.api.resources.StackResourceDefinition;
+import org.apache.ambari.server.controller.predicate.AndPredicate;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
@@ -59,6 +61,31 @@ public class ProcessingPredicateVisitorTest {
     Assert.assertEquals(expectedPredicate, processedPredicate);
   }
 
+  @Test
+  public void testGetSubResourceForNotPredicate() throws Exception {
+    ResourceDefinition resourceDefinition = new HostResourceDefinition();
+
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Host, null);
+
+    //test
+    QueryImpl instance = new QueryImplTest.TestQuery(mapIds, resourceDefinition);
+
+    Predicate notPredicate1 = new PredicateBuilder().not().property("host_components/HostRoles/component_name").
+            equals("ZOOKEEPER_SERVER").toPredicate();
+    Predicate notPredicate2 = new PredicateBuilder().not().property("host_components/HostRoles/component_name").
+            equals("HBASE_MASTER").toPredicate();
+    Predicate andPredicate = new AndPredicate(notPredicate1,notPredicate2);
+
+    ProcessingPredicateVisitor visitor = new ProcessingPredicateVisitor(instance);
+    PredicateHelper.visit(andPredicate, visitor);
+
+    Set<String> categories = visitor.getSubResourceCategories();
+
+    Assert.assertEquals(categories.iterator().next(), "host_components");
+  }
+
+
   @Test
   public void testGetSubResourceCategories() throws Exception {
     ResourceDefinition resourceDefinition = new StackResourceDefinition();

+ 14 - 0
ambari-server/src/test/java/org/apache/ambari/server/api/query/SubResourcePredicateVisitorTest.java

@@ -55,5 +55,19 @@ public class SubResourcePredicateVisitorTest {
     subResourcePredicate = visitor.getSubResourcePredicate();
 
     Assert.assertEquals(new AndPredicate(), subResourcePredicate);
+
+
+    Predicate notPredicate = new PredicateBuilder().not().property("host_components/HostRoles/component_name").
+            equals("ZOOKEEPER_SERVER").toPredicate();
+
+    Predicate expectedNotPredicate = new PredicateBuilder().not().property("HostRoles/component_name").
+            equals("ZOOKEEPER_SERVER").toPredicate();
+
+    visitor = new SubResourcePredicateVisitor("host_components");
+    PredicateHelper.visit(notPredicate, visitor);
+
+    subResourcePredicate = visitor.getSubResourcePredicate();
+
+    Assert.assertEquals(expectedNotPredicate, subResourcePredicate);
   }
 }