Procházet zdrojové kódy

AMBARI-3619 - getAssociatedResource thorws Exception on POST

tbeerbower před 11 roky
rodič
revize
00484f9c9d

+ 25 - 22
ambari-server/src/main/java/org/apache/ambari/server/api/services/serializers/JsonSerializer.java

@@ -101,40 +101,43 @@ public class JsonSerializer implements ResultSerializer {
   }
 
   private void processNode(TreeNode<Resource> node) throws IOException {
-    String name = node.getName();
-    Resource r = node.getObject();
-
-    if (r == null) {
-      if (name != null) {
-        if (node.getParent() == null) {
-          m_generator.writeStartObject();
-          writeHref(node);
-        }
-        m_generator.writeArrayFieldStart(name);
-      }
-    } else {
+
+    if (isObject(node)) {
       m_generator.writeStartObject();
       writeHref(node);
-      // resource props
-      handleResourceProperties(getTreeProperties(r.getPropertiesMap()));
+
+      Resource r = node.getObject();
+      if (r != null) {
+        handleResourceProperties(getTreeProperties(r.getPropertiesMap()));
+      }
+    }
+    if (isArray(node)) {
+      m_generator.writeArrayFieldStart(node.getName());
     }
 
     for (TreeNode<Resource> child : node.getChildren()) {
       processNode(child);
     }
 
-    if (r == null) {
-      if (name != null) {
-        m_generator.writeEndArray();
-        if (node.getParent() == null) {
-          m_generator.writeEndObject();
-        }
-      }
-    } else {
+    if (isArray(node)) {
+      m_generator.writeEndArray();
+    }
+    if (isObject(node)) {
       m_generator.writeEndObject();
     }
   }
 
+  // Determines whether or not the given node is an object
+  private boolean isObject(TreeNode<Resource> node) {
+    return node.getObject() != null ||
+        ((node.getName() != null) && ((node.getParent() == null) || !isObject(node.getParent())));
+  }
+
+  // Determines whether or not the given node is an array
+  private boolean isArray(TreeNode<Resource> node) {
+    return node.getObject() == null && node.getName() != null;
+  }
+
   private TreeNode<Map<String, Object>> getTreeProperties (Map<String, Map<String, Object>> propertiesMap) {
     TreeNode<Map<String, Object>> treeProperties =
         new TreeNodeImpl<Map<String, Object>>(null, new LinkedHashMap<String, Object>(), null);

+ 12 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java

@@ -198,14 +198,23 @@ public abstract class AbstractResourceProvider extends BaseProvider implements R
    *
    * @return the request status
    */
-  protected RequestStatus getRequestStatus(RequestStatusResponse response) {
+  protected RequestStatus getRequestStatus(RequestStatusResponse response, Set<Resource> associatedResources) {
     if (response != null){
       Resource requestResource = new ResourceImpl(Resource.Type.Request);
       requestResource.setProperty(PropertyHelper.getPropertyId("Requests", "id"), response.getRequestId());
       requestResource.setProperty(PropertyHelper.getPropertyId("Requests", "status"), "InProgress");
-      return new RequestStatusImpl(requestResource);
+      return new RequestStatusImpl(requestResource, associatedResources);
     }
-    return new RequestStatusImpl(null);
+    return new RequestStatusImpl(null, associatedResources);
+  }
+
+  /**
+   * Get a request status
+   *
+   * @return the request status
+   */
+  protected RequestStatus getRequestStatus(RequestStatusResponse response) {
+    return getRequestStatus(response, null) ;
   }
 
   /**

+ 10 - 2
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestStatusImpl.java

@@ -30,14 +30,22 @@ import java.util.Set;
 public class RequestStatusImpl implements RequestStatus{
 
   private final Resource requestResource;
+  private final Set<Resource> associatedResources;
 
   public RequestStatusImpl(Resource requestResource) {
-    this.requestResource = requestResource;
+    this.requestResource     = requestResource;
+    this.associatedResources = Collections.emptySet();
+  }
+
+  public RequestStatusImpl(Resource requestResource, Set<Resource> associatedResources) {
+    this.requestResource     = requestResource;
+    this.associatedResources = associatedResources == null ?
+        Collections.<Resource>emptySet() : associatedResources;
   }
 
   @Override
   public Set<Resource> getAssociatedResources() {
-    return Collections.emptySet();  // TODO : handle in M4
+    return associatedResources;
   }
 
   @Override

+ 59 - 2
ambari-server/src/test/java/org/apache/ambari/server/api/services/serializers/JsonSerializerTest.java

@@ -22,7 +22,6 @@ import org.apache.ambari.server.api.services.Result;
 import org.apache.ambari.server.api.services.ResultImpl;
 import org.apache.ambari.server.api.services.ResultStatus;
 import org.apache.ambari.server.api.util.TreeNode;
-import org.apache.ambari.server.api.util.TreeNodeImpl;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.junit.Test;
 
@@ -48,7 +47,7 @@ public class JsonSerializerTest {
     result.setResultStatus(new ResultStatus(ResultStatus.STATUS.OK));
     TreeNode<Resource> tree = result.getResultTree();
     //tree.setName("items");
-    TreeNode<Resource> child = tree.addChild(resource, "resource1");
+    tree.addChild(resource, "resource1");
     //child.addChild(resource2, "sub-resource");
 
     // resource properties
@@ -87,4 +86,62 @@ public class JsonSerializerTest {
 
     verify(uriInfo, resource/*, resource2*/);
   }
+
+
+  @Test
+  public void testSerializeResources() throws Exception {
+    UriInfo uriInfo = createMock(UriInfo.class);
+    Resource resource = createMock(Resource.class);
+    //Resource resource2 = createMock(Resource.class);
+
+    Result result = new ResultImpl(true);
+    result.setResultStatus(new ResultStatus(ResultStatus.STATUS.OK));
+    TreeNode<Resource> tree = result.getResultTree();
+
+
+    TreeNode<Resource> resourcesNode = tree.addChild(null, "resources");
+
+
+    resourcesNode.addChild(resource, "resource1");
+
+    // resource properties
+    HashMap<String, Object> mapRootProps = new HashMap<String, Object>();
+    mapRootProps.put("prop1", "value1");
+    mapRootProps.put("prop2", "value2");
+
+    HashMap<String, Object> mapCategoryProps = new HashMap<String, Object>();
+    mapCategoryProps.put("catProp1", "catValue1");
+    mapCategoryProps.put("catProp2", "catValue2");
+
+    Map<String, Map<String, Object>> propertyMap = new HashMap<String, Map<String, Object>>();
+
+    propertyMap.put(null, mapRootProps);
+    propertyMap.put("category", mapCategoryProps);
+
+    //expectations
+    expect(resource.getPropertiesMap()).andReturn(propertyMap).anyTimes();
+    expect(resource.getType()).andReturn(Resource.Type.Cluster).anyTimes();
+
+    replay(uriInfo, resource);
+
+    //execute test
+    Object o = new JsonSerializer().serialize(result);
+
+    String expected = "{\n" +
+        "  \"resources\" : [\n" +
+        "    {\n" +
+        "      \"prop2\" : \"value2\",\n" +
+        "      \"prop1\" : \"value1\",\n" +
+        "      \"category\" : {\n" +
+        "        \"catProp1\" : \"catValue1\",\n" +
+        "        \"catProp2\" : \"catValue2\"\n" +
+        "      }\n" +
+        "    }\n" +
+        "  ]\n" +
+        "}";
+
+    assertEquals(expected, o);
+
+    verify(uriInfo, resource);
+  }
 }

+ 46 - 52
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java

@@ -23,11 +23,12 @@ 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.RequestStatusResponse;
 import org.apache.ambari.server.controller.ServiceComponentHostRequest;
-import org.apache.ambari.server.controller.ServiceComponentRequest;
 import org.apache.ambari.server.controller.StackConfigurationRequest;
 import org.apache.ambari.server.controller.TaskStatusRequest;
 import org.apache.ambari.server.controller.UserRequest;
+import org.apache.ambari.server.controller.spi.RequestStatus;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.easymock.EasyMock;
 import org.easymock.IArgumentMatcher;
@@ -113,6 +114,50 @@ public class AbstractResourceProviderTest {
     Assert.assertTrue(supportedPropertyIds.containsAll(propertyIds));
   }
 
+  @Test
+  public void testGetRequestStatus() {
+    Set<String> propertyIds = new HashSet<String>();
+    Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+
+    AbstractResourceProvider provider =
+        (AbstractResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
+            Resource.Type.Service,
+            propertyIds,
+            keyPropertyIds,
+            managementController);
+
+    RequestStatus status = provider.getRequestStatus(null);
+
+    Assert.assertNull(status.getRequestResource());
+    Assert.assertEquals(Collections.emptySet(), status.getAssociatedResources());
+
+    RequestStatusResponse response = new RequestStatusResponse(99L);
+
+    status = provider.getRequestStatus(response);
+    Resource resource = status.getRequestResource();
+
+    Assert.assertEquals(99L, resource.getPropertyValue("Requests/id"));
+    Assert.assertEquals(Collections.emptySet(), status.getAssociatedResources());
+
+
+    status = provider.getRequestStatus(response, null);
+    resource = status.getRequestResource();
+
+    Assert.assertEquals(99L, resource.getPropertyValue("Requests/id"));
+    Assert.assertEquals(Collections.emptySet(), status.getAssociatedResources());
+
+
+    Resource associatedResource = new ResourceImpl(Resource.Type.Service);
+
+    Set<Resource> associatedResources = Collections.singleton(associatedResource);
+    status = provider.getRequestStatus(response, associatedResources);
+    resource = status.getRequestResource();
+
+    Assert.assertEquals(99L, resource.getPropertyValue("Requests/id"));
+    Assert.assertEquals(associatedResources, status.getAssociatedResources());
+  }
+
 
   // ----- helper methods ----------------------------------------------------
 
@@ -163,15 +208,6 @@ public class AbstractResourceProviderTest {
       return null;
     }
 
-    public static Set<ServiceComponentRequest> getComponentRequestSet(String clusterName, String serviceName,
-                                                                      String componentName,
-                                                                      Map<String, String> configVersions,
-                                                                      String desiredState)
-    {
-      EasyMock.reportMatcher(new ComponentRequestSetMatcher(clusterName, serviceName, componentName,
-          configVersions, desiredState));
-      return null;
-    }
 
     public static Set<HostRequest> getHostRequestSet(String hostname, String clusterName,
                                                      Map<String, String> hostAttributes)
@@ -331,48 +367,6 @@ public class AbstractResourceProviderTest {
     }
   }
 
-  /**
-   * Matcher for a ServiceComponentRequest set containing a single request.
-   */
-  public static class ComponentRequestSetMatcher extends HashSet<ServiceComponentRequest> implements IArgumentMatcher {
-
-    private final ServiceComponentRequest serviceComponentRequest;
-
-    public ComponentRequestSetMatcher(String clusterName, String serviceName, String componentName,
-                                   Map<String, String> configVersions, String desiredState) {
-      this.serviceComponentRequest =
-          new ServiceComponentRequest(clusterName, serviceName, componentName, configVersions, desiredState);
-      add(this.serviceComponentRequest);
-    }
-
-    @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 ServiceComponentRequest &&
-          eq(((ServiceComponentRequest) request).getClusterName(), serviceComponentRequest.getClusterName()) &&
-          eq(((ServiceComponentRequest) request).getServiceName(), serviceComponentRequest.getServiceName()) &&
-          eq(((ServiceComponentRequest) request).getComponentName(), serviceComponentRequest.getComponentName()) &&
-          eq(((ServiceComponentRequest) request).getConfigVersions(), serviceComponentRequest.getConfigVersions()) &&
-          eq(((ServiceComponentRequest) request).getDesiredState(), serviceComponentRequest.getDesiredState());
-    }
-
-    @Override
-    public void appendTo(StringBuffer stringBuffer) {
-      stringBuffer.append("ComponentRequestSetMatcher(").append(serviceComponentRequest).append(")");
-    }
-  }
 
   /**
    * Matcher for a HostRequest set containing a single request.

+ 48 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestStatusImplTest.java

@@ -0,0 +1,48 @@
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * RequestStatusImpl Tests
+ */
+public class RequestStatusImplTest {
+  @Test
+  public void testGetAssociatedResources() throws Exception {
+    RequestStatusImpl status = new RequestStatusImpl(null);
+    Assert.assertEquals(Collections.emptySet(), status.getAssociatedResources());
+
+
+    Resource associatedResource = new ResourceImpl(Resource.Type.Service);
+    Set<Resource> associatedResources = Collections.singleton(associatedResource);
+    status = new RequestStatusImpl(null, associatedResources);
+    Assert.assertEquals(associatedResources, status.getAssociatedResources());
+  }
+
+  @Test
+  public void testGetRequestResource() throws Exception {
+    RequestStatusImpl status = new RequestStatusImpl(null);
+    Assert.assertNull(status.getRequestResource());
+
+    Resource requestResource = new ResourceImpl(Resource.Type.Request);
+    status = new RequestStatusImpl(requestResource);
+
+    Assert.assertEquals(requestResource, status.getRequestResource());
+  }
+
+  @Test
+  public void testGetStatus() throws Exception {
+    RequestStatusImpl status = new RequestStatusImpl(null);
+    Assert.assertEquals(RequestStatus.Status.Complete, status.getStatus());
+
+    Resource requestResource = new ResourceImpl(Resource.Type.Request);
+    requestResource.setProperty("Requests/status", "InProgress");
+    status = new RequestStatusImpl(requestResource);
+    Assert.assertEquals(RequestStatus.Status.InProgress, status.getStatus());
+  }
+}