You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by tb...@apache.org on 2015/01/23 12:20:21 UTC

ambari git commit: AMBARI-8342 - Requesting the config_groups collection resource with no registered configuration groups results in a 404 response (tbeerbower)

Repository: ambari
Updated Branches:
  refs/heads/trunk 91adc8dbf -> 474cfcd3d


AMBARI-8342 - Requesting the config_groups collection resource with no registered configuration groups results in a 404 response (tbeerbower)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/474cfcd3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/474cfcd3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/474cfcd3

Branch: refs/heads/trunk
Commit: 474cfcd3db4d686b8036e429976678bbe7dc5c92
Parents: 91adc8d
Author: tbeerbower <tb...@hortonworks.com>
Authored: Fri Jan 23 06:20:11 2015 -0500
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Fri Jan 23 06:20:11 2015 -0500

----------------------------------------------------------------------
 .../ambari/server/api/query/QueryImpl.java      |  32 +++++-
 .../internal/ClusterControllerImpl.java         |   7 --
 .../ambari/server/api/query/QueryImplTest.java  | 111 +++++++++++++++++++
 .../internal/ClusterControllerImplTest.java     |  35 ------
 4 files changed, 138 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/474cfcd3/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
index 9f1be06..0ab9d07 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
@@ -372,13 +372,13 @@ public class QueryImpl implements Query, ResourceInstance {
 
     Request request = createRequest();
 
-    // use linked hashsets so that we maintain inseration and traversal order
+    // use linked hash sets so that we maintain insertion and traversal order
     // in the event that the resource provider already gave us a sorted set
     // back
     Set<Resource> resourceSet = new LinkedHashSet<Resource>();
     Set<Resource> providerResourceSet = new LinkedHashSet<Resource>();
 
-    QueryResponse queryResponse = doQuery(resourceType, request, queryPredicate);
+    QueryResponse queryResponse = doQuery(resourceType, request, queryPredicate, true);
 
     // If there is a page request and the predicate does not contain properties
     // that need to be set
@@ -431,7 +431,9 @@ public class QueryImpl implements Query, ResourceInstance {
           Set<Resource> resourceSet    = new LinkedHashSet<Resource>();
 
           try {
-            Set<Resource> queryResources = subResource.doQuery(resourceType, request, queryPredicate).getResources();
+            Set<Resource> queryResources =
+                subResource.doQuery(resourceType, request, queryPredicate, false).getResources();
+
             providerResourceSet.addAll(queryResources);
             resourceSet.addAll(queryResources);
           } catch (NoSuchResourceException e) {
@@ -450,8 +452,17 @@ public class QueryImpl implements Query, ResourceInstance {
 
   /**
    * Query the cluster controller for the resources.
+   *
+   * @param type                the resource type
+   * @param request             the request information
+   * @param predicate           the predicate
+   * @param checkEmptyResponse  true if an empty query response can trigger a NoSuchResourceException
+   *
+   * @return the result of the cluster controller query
+   *
+   * @throws NoSuchResourceException if a specific resource was asked for and not found and checkEmptyResponse == true
    */
-  private QueryResponse doQuery(Resource.Type type, Request request, Predicate predicate)
+  private QueryResponse doQuery(Resource.Type type, Request request, Predicate predicate, boolean checkEmptyResponse)
       throws UnsupportedPropertyException,
       SystemException,
       NoSuchResourceException,
@@ -461,7 +472,18 @@ public class QueryImpl implements Query, ResourceInstance {
       LOG.debug("Executing resource query: " + request + " where " + predicate);
     }
 
-    return clusterController.getResources(type, request, predicate);
+    QueryResponse queryResponse = clusterController.getResources(type, request, predicate);
+
+    if (checkEmptyResponse && queryResponse.getResources().isEmpty()) {
+
+      // If this is not a collection request then we must throw
+      // NoSuchResourceException (404 response) for an empty query result
+      if(!isCollectionResource()) {
+        throw new NoSuchResourceException(
+            "The requested resource doesn't exist: " + type.toString() + " not found where " + predicate + ".");
+      }
+    }
+    return queryResponse;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/474cfcd3/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java
index b075d25..9f864f8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java
@@ -130,13 +130,6 @@ public class ClusterControllerImpl implements ClusterController {
 
       // get the resources
       queryResponse = provider.queryForResources(request, predicate);
-
-      // if a specific resource was asked for and not found then throw exception
-      if (predicate != null &&
-          (queryResponse == null || queryResponse.getResources() == null || queryResponse.getResources().isEmpty())) {
-        throw new NoSuchResourceException(
-            "The requested resource doesn't exist: " + type.toString() + " not found, " + predicate);
-      }
     }
     return queryResponse == null ? new QueryResponseImpl(Collections.<Resource>emptySet()) : queryResponse;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/474cfcd3/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
index fdf3ef4..863ed96 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
@@ -20,7 +20,11 @@
 package org.apache.ambari.server.api.query;
 
 
+import static org.easymock.EasyMock.anyBoolean;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
@@ -31,10 +35,13 @@ import static org.junit.Assert.fail;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.ambari.server.api.query.render.DefaultRenderer;
+import org.apache.ambari.server.api.query.render.Renderer;
+import org.apache.ambari.server.api.resources.ClusterResourceDefinition;
 import org.apache.ambari.server.api.resources.ResourceDefinition;
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.api.resources.StackResourceDefinition;
@@ -42,17 +49,23 @@ import org.apache.ambari.server.api.resources.StackVersionResourceDefinition;
 import org.apache.ambari.server.api.resources.SubResourceDefinition;
 import org.apache.ambari.server.api.services.Result;
 import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.api.util.TreeNodeImpl;
 import org.apache.ambari.server.controller.internal.ClusterControllerImpl;
 import org.apache.ambari.server.controller.internal.ClusterControllerImplTest;
 import org.apache.ambari.server.controller.internal.PageRequestImpl;
+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.PageRequest;
 import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.QueryResponse;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.Schema;
+import org.apache.ambari.server.controller.spi.SortRequest;
 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.easymock.Capture;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -246,6 +259,99 @@ public class QueryImplTest {
   }
 
   @Test
+  public void testExecute_NoSuchResourceException() throws Exception {
+    ResourceDefinition resourceDefinition = new ClusterResourceDefinition();
+
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Cluster, "c1");
+
+    ClusterController clusterController = createNiceMock(ClusterController.class);
+    QueryResponse queryResponse = createNiceMock(QueryResponse.class);
+    Schema schema = createNiceMock(Schema.class);
+    Renderer renderer = createNiceMock(Renderer.class);
+
+    expect(clusterController.getSchema(Resource.Type.Cluster)).andReturn(schema).anyTimes();
+
+    expect(clusterController.getResources(eq(Resource.Type.Cluster),
+        anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class))).
+        andReturn(queryResponse);
+
+    // Always return an empty set of resources.
+    expect(queryResponse.getResources()).andReturn(Collections.<Resource>emptySet()).anyTimes();
+
+    expect(schema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("Clusters/cluster_name").anyTimes();
+
+    TreeNode<Set<String>> treeNode = new TreeNodeImpl<Set<String>>(null, Collections.EMPTY_SET, null);
+    expect(renderer.finalizeProperties(anyObject(TreeNode.class), anyBoolean())).andReturn(treeNode).anyTimes();
+
+    replay(clusterController, queryResponse, schema, renderer);
+
+    //test
+    QueryImpl query = new TestQuery(mapIds, resourceDefinition, clusterController);
+    query.setRenderer(renderer);
+
+    try {
+      query.execute();
+      fail("Expected NoSuchResourceException!");
+
+    } catch (NoSuchResourceException e) {
+      //expected
+    }
+    verify(clusterController, queryResponse, schema, renderer);
+  }
+
+  @Test
+  public void testExecute_collection_NoSuchResourceException() throws Exception {
+    ResourceDefinition resourceDefinition = new ClusterResourceDefinition();
+
+    ClusterController clusterController = createNiceMock(ClusterController.class);
+    QueryResponse queryResponse = createNiceMock(QueryResponse.class);
+    Schema schema = createNiceMock(Schema.class);
+    Renderer renderer = createNiceMock(Renderer.class);
+    Iterable<Resource> iterable = createNiceMock(Iterable.class);
+    Iterator<Resource> iterator = createNiceMock(Iterator.class);
+
+    expect(clusterController.getSchema(Resource.Type.Cluster)).andReturn(schema).anyTimes();
+
+    expect(clusterController.getResources(eq(Resource.Type.Cluster),
+        anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class))).
+        andReturn(queryResponse);
+
+    expect(clusterController.getIterable(eq(Resource.Type.Cluster), anyObject(QueryResponse.class),
+        anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class),
+        anyObject(PageRequest.class), anyObject(SortRequest.class))).andReturn(iterable).anyTimes();
+
+    expect(iterable.iterator()).andReturn(iterator).anyTimes();
+
+    expect(iterator.hasNext()).andReturn(false).anyTimes();
+
+    // Always return an empty set of resources.
+    expect(queryResponse.getResources()).andReturn(Collections.<Resource>emptySet()).anyTimes();
+
+    expect(schema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("Clusters/cluster_name").anyTimes();
+
+    TreeNode<Set<String>> treeNode = new TreeNodeImpl<Set<String>>(null, Collections.<String>emptySet(), null);
+    expect(renderer.finalizeProperties(anyObject(TreeNode.class), anyBoolean())).andReturn(treeNode).anyTimes();
+
+    Capture<Result> resultCapture = new Capture<Result>();
+
+    expect(renderer.finalizeResult(capture(resultCapture))).andReturn(null);
+
+    replay(clusterController, queryResponse, schema, renderer, iterable, iterator);
+
+    //test
+    QueryImpl query = new TestQuery(new HashMap<Resource.Type, String>(), resourceDefinition, clusterController);
+    query.setRenderer(renderer);
+
+    query.execute();
+
+    TreeNode<Resource> tree = resultCapture.getValue().getResultTree();
+    Assert.assertEquals(0, tree.getChildren().size());
+
+    verify(clusterController, queryResponse, schema, renderer, iterable, iterator);
+  }
+
+  @Test
   public void testExecute__Stack_instance_specifiedSubResources() throws Exception {
     ResourceDefinition resourceDefinition = new StackResourceDefinition();
 
@@ -668,6 +774,11 @@ public class QueryImplTest {
       super(mapIds, resourceDefinition, new ClusterControllerImpl(new ClusterControllerImplTest.TestProviderModule()));
       setRenderer(new DefaultRenderer());
     }
+
+    public TestQuery(Map<Resource.Type, String> mapIds, ResourceDefinition resourceDefinition, ClusterController clusterController) {
+      super(mapIds, resourceDefinition, clusterController);
+      setRenderer(new DefaultRenderer());
+    }
   }
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/474cfcd3/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
index fa24c9d..147dc49 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
@@ -155,41 +155,6 @@ public class ClusterControllerImplTest {
   }
 
   @Test
-  public void testGetResources_NoSuchResourceException() throws Exception{
-
-    ProviderModule providerModule = createNiceMock(ProviderModule.class);
-    ResourceProvider resourceProvider = createNiceMock(ResourceProvider.class);
-
-    expect(providerModule.getResourceProvider(Resource.Type.View)).andReturn(resourceProvider).anyTimes();
-    expect(resourceProvider.checkPropertyIds(Collections.singleton("ViewInfo/view_name"))).andReturn(Collections.<String>emptySet()).anyTimes();
-    expect(resourceProvider.getResources(anyObject(Request.class), anyObject(Predicate.class))).andReturn(Collections.<Resource>emptySet()).anyTimes();
-
-    replay(providerModule, resourceProvider);
-
-    ClusterControllerImpl controller = new ClusterControllerImpl(providerModule);
-
-    Set<String> propertyIds = new HashSet<String>();
-
-    propertyIds.add("ViewInfo/view_name");
-
-    Request request = PropertyHelper.getReadRequest(propertyIds);
-
-    // No predicate
-    Iterator<Resource> iter = controller.getResourceIterable(Resource.Type.View, request, null).iterator();
-    Assert.assertFalse(iter.hasNext());
-
-    // Ask for a specific resource.
-    Predicate predicate = new PredicateBuilder().property("ViewInfo/view_name").equals("BadView").toPredicate();
-    try {
-      controller.getResourceIterable(Resource.Type.View, request, predicate);
-      Assert.fail("Expected NoSuchResourceException.");
-    } catch (NoSuchResourceException e) {
-      // expected
-    }
-    verify(providerModule, resourceProvider);
-  }
-
-  @Test
   public void testGetResourcesPageFromStart() throws Exception{
     ClusterControllerImpl controller = new ClusterControllerImpl(new TestProviderModule());