You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sm...@apache.org on 2015/12/15 00:02:12 UTC

ambari git commit: AMBARI-14360. Ambari API: request tasks are not returned via API (Sandor Magyari via smohanty)

Repository: ambari
Updated Branches:
  refs/heads/trunk e9c9f18cc -> 3469a3c26


AMBARI-14360. Ambari API: request tasks are not returned via API (Sandor Magyari via smohanty)


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

Branch: refs/heads/trunk
Commit: 3469a3c266abe424d57cc61fd7b3d400a8d6076b
Parents: e9c9f18
Author: Sumit Mohanty <sm...@hortonworks.com>
Authored: Mon Dec 14 15:02:01 2015 -0800
Committer: Sumit Mohanty <sm...@hortonworks.com>
Committed: Mon Dec 14 15:02:01 2015 -0800

----------------------------------------------------------------------
 .../internal/TaskResourceProvider.java          | 30 +++++++--
 .../internal/TaskResourceProviderTest.java      | 70 ++++++++++++++++++++
 2 files changed, 96 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/3469a3c2/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
index 012c456..510d6fb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
@@ -17,7 +17,9 @@
  */
 package org.apache.ambari.server.controller.internal;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -40,6 +42,7 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
 import org.apache.ambari.server.utils.StageUtils;
+import org.apache.ambari.server.topology.TopologyManager;
 import org.codehaus.jackson.map.ObjectMapper;
 
 import com.google.inject.Inject;
@@ -89,6 +92,9 @@ public class TaskResourceProvider extends AbstractControllerResourceProvider {
   @Inject
   private static HostRoleCommandFactory s_hostRoleCommandFactory;
 
+  @Inject
+  protected static TopologyManager s_topologyManager;
+
   /**
    * Thread-safe Jackson JSON mapper.
    */
@@ -127,7 +133,6 @@ public class TaskResourceProvider extends AbstractControllerResourceProvider {
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     List<HostRoleCommandEntity> entities = s_dao.findAll(request, predicate);
-    LOG.debug("Retrieved {} commands for request {}", entities.size(), request);
 
     // !!! getting the cluster name out of the request property maps is a little
     // hacky since there could be a different request per cluster name; however
@@ -136,12 +141,31 @@ public class TaskResourceProvider extends AbstractControllerResourceProvider {
     // tasks/Tasks/status.in(FAILED,ABORTED,TIMEDOUT) which would unnecessarily
     // make the same call to the API over and over
     String clusterName = null;
+    Long requestId = null;
     for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
       clusterName = (String) propertyMap.get(TASK_CLUSTER_NAME_PROPERTY_ID);
+      String requestIdStr = (String) propertyMap.get(TASK_REQUEST_ID_PROPERTY_ID);
+      requestId = Long.parseLong(requestIdStr);
     }
 
+    Collection<HostRoleCommand> commands = new ArrayList<>(100);
+
+    if (!entities.isEmpty()) {
+      for (HostRoleCommandEntity entity : entities) {
+        commands.add(s_hostRoleCommandFactory.createExisting(entity));
+      }
+    } else {
+      // if query has no results, look up in TopologyManager as the request might be a TopologyLogicalRequest
+      // which is not directly linked to tasks
+      if (requestId != null) {
+        commands.addAll(s_topologyManager.getTasks(requestId));
+      }
+    }
+
+    LOG.debug("Retrieved {} commands for request {}", commands.size(), request);
+
     // convert each entity into a response
-    for (HostRoleCommandEntity entity : entities) {
+    for (HostRoleCommand hostRoleCommand : commands) {
       Resource resource = new ResourceImpl(Resource.Type.Task);
 
       // !!! shocked this isn't broken.  the key can be null for non-cluster tasks
@@ -149,8 +173,6 @@ public class TaskResourceProvider extends AbstractControllerResourceProvider {
         setResourceProperty(resource, TASK_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
       }
 
-      HostRoleCommand hostRoleCommand = s_hostRoleCommandFactory.createExisting(entity);
-
       setResourceProperty(resource, TASK_REQUEST_ID_PROPERTY_ID, hostRoleCommand.getRequestId(), requestedIds);
       setResourceProperty(resource, TASK_ID_PROPERTY_ID, hostRoleCommand.getTaskId(), requestedIds);
       setResourceProperty(resource, TASK_STAGE_ID_PROPERTY_ID, hostRoleCommand.getStageId(), requestedIds);

http://git-wip-us.apache.org/repos/asf/ambari/blob/3469a3c2/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java
index 3ea5544..587febe 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java
@@ -35,6 +35,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.ambari.server.Role;
+import org.apache.ambari.server.actionmanager.HostRoleCommand;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.RequestStatusResponse;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -44,8 +45,12 @@ import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.dao.ExecutionCommandDAO;
+import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.topology.LogicalRequest;
+import org.apache.ambari.server.topology.TopologyManager;
 import org.easymock.EasyMock;
 import org.junit.Assert;
 import org.junit.Test;
@@ -155,6 +160,71 @@ public class TaskResourceProviderTest {
   }
 
   @Test
+  public void testGetResourcesForTopology() throws Exception {
+    Resource.Type type = Resource.Type.Task;
+
+    AmbariManagementController amc = createMock(AmbariManagementController.class);
+    HostRoleCommandDAO hostRoleCommandDAO = createMock(HostRoleCommandDAO.class);
+    TopologyManager topologyManager = createMock(TopologyManager.class);
+    HostDAO hostDAO = createMock(HostDAO.class);
+    ExecutionCommandDAO executionCommandDAO = createMock(ExecutionCommandDAO.class);
+
+    Injector m_injector = Guice.createInjector(new InMemoryDefaultTestModule());
+    TaskResourceProvider provider = (TaskResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
+      type, PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), amc);
+
+    m_injector.injectMembers(provider);
+    TaskResourceProvider.s_dao = hostRoleCommandDAO;
+    TaskResourceProvider.s_topologyManager = topologyManager;
+
+    List<HostRoleCommandEntity> entities = new ArrayList<>();
+
+    List<HostRoleCommand> commands = new ArrayList<>();
+    HostRoleCommandEntity hostRoleCommandEntity = new HostRoleCommandEntity();
+    hostRoleCommandEntity.setRequestId(100L);
+    hostRoleCommandEntity.setTaskId(100L);
+    hostRoleCommandEntity.setStageId(100L);
+    hostRoleCommandEntity.setRole(Role.DATANODE);
+    hostRoleCommandEntity.setCustomCommandName("customCommandName");
+    hostRoleCommandEntity.setCommandDetail("commandDetail");
+    commands.add(new HostRoleCommand(hostRoleCommandEntity, hostDAO, executionCommandDAO));
+
+    // set expectations
+    expect(hostRoleCommandDAO.findAll(EasyMock.anyObject(Request.class),
+      EasyMock.anyObject(Predicate.class))).andReturn(entities).once();
+    expect(topologyManager.getTasks(EasyMock.anyLong())).andReturn(commands).once();
+
+    // replay
+    replay(hostRoleCommandDAO, topologyManager);
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    propertyIds.add(TaskResourceProvider.TASK_ID_PROPERTY_ID);
+    propertyIds.add(TaskResourceProvider.TASK_REQUEST_ID_PROPERTY_ID);
+    propertyIds.add(TaskResourceProvider.TASK_COMMAND_DET_PROPERTY_ID);
+
+    Predicate predicate = new PredicateBuilder().property(TaskResourceProvider.TASK_ID_PROPERTY_ID).equals("100").
+      and().property(TaskResourceProvider.TASK_REQUEST_ID_PROPERTY_ID).equals("100").toPredicate();
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(1, resources.size());
+    for (Resource resource : resources) {
+      long taskId = (Long) resource.getPropertyValue(TaskResourceProvider.TASK_ID_PROPERTY_ID);
+      Assert.assertEquals(100L, taskId);
+      Assert.assertEquals(null, resource.getPropertyValue(TaskResourceProvider
+        .TASK_CUST_CMD_NAME_PROPERTY_ID));
+      Assert.assertEquals("commandDetail", resource.getPropertyValue(TaskResourceProvider
+        .TASK_COMMAND_DET_PROPERTY_ID));
+    }
+
+    // verify
+    verify(hostRoleCommandDAO, topologyManager);
+  }
+
+
+  @Test
   public void testUpdateResources() throws Exception {
     Resource.Type type = Resource.Type.Task;