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;