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/29 16:24:14 UTC

ambari git commit: AMBARI-9388 - Allow stage status transition HOLDING --> ABORTED. (tbeerbower)

Repository: ambari
Updated Branches:
  refs/heads/trunk a16e37ee9 -> 78d0af1b8


AMBARI-9388 - Allow stage status transition HOLDING --> ABORTED. (tbeerbower)


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

Branch: refs/heads/trunk
Commit: 78d0af1b8c0a8686b731d112183f9261479aadbb
Parents: a16e37e
Author: tbeerbower <tb...@hortonworks.com>
Authored: Thu Jan 29 10:23:45 2015 -0500
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Thu Jan 29 10:24:02 2015 -0500

----------------------------------------------------------------------
 .../server/actionmanager/ActionScheduler.java   |  2 +-
 .../internal/DefaultProviderModule.java         |  2 +-
 .../internal/StageResourceProvider.java         | 60 +++++++++++---------
 .../internal/UpgradeItemResourceProvider.java   |  2 +-
 .../internal/StageResourceProviderTest.java     | 53 ++++++++++++++---
 5 files changed, 81 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/78d0af1b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
index d5fa5b5..9cc1075 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java
@@ -802,7 +802,7 @@ class ActionScheduler implements Runnable {
 
   /**
    * @param requestId request will be cancelled on next scheduler wake up
-   * (if it is in state that allows cancelation, e.g. QUEUED, PENDING, IN_PROGRESS)
+   * (if it is in state that allows cancellation, e.g. QUEUED, PENDING, IN_PROGRESS)
    * @param reason why request is being cancelled
    */
   public void scheduleCancellingRequest(long requestId, String reason) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/78d0af1b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
index b0e23e9..0c4942e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
@@ -109,7 +109,7 @@ public class DefaultProviderModule extends AbstractProviderModule {
       case HostStackVersion:
         return new HostStackVersionResourceProvider(managementController);
       case Stage:
-        return new StageResourceProvider();
+        return new StageResourceProvider(managementController);
       case OperatingSystem:
         return new OperatingSystemResourceProvider(managementController);
       case Repository:

http://git-wip-us.apache.org/repos/asf/ambari/blob/78d0af1b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
index ce427a7..3d014b8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
@@ -19,6 +19,7 @@ package org.apache.ambari.server.controller.internal;
 
 import org.apache.ambari.server.StaticallyInject;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.spi.ExtendedResourceProvider;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
@@ -55,7 +56,7 @@ import java.util.Set;
  * ResourceProvider for Stage
  */
 @StaticallyInject
-public class StageResourceProvider extends AbstractResourceProvider implements ExtendedResourceProvider {
+public class StageResourceProvider extends AbstractControllerResourceProvider implements ExtendedResourceProvider {
 
   /**
    * Used for querying stage resources.
@@ -133,9 +134,9 @@ public class StageResourceProvider extends AbstractResourceProvider implements E
   private static Map<HostRoleStatus, EnumSet<HostRoleStatus>> manualTransitionMap = new HashMap<HostRoleStatus, EnumSet<HostRoleStatus>>();
 
   static {
-    manualTransitionMap.put(HostRoleStatus.HOLDING, EnumSet.of(HostRoleStatus.COMPLETED));
-    manualTransitionMap.put(HostRoleStatus.HOLDING_FAILED, EnumSet.of(HostRoleStatus.PENDING, HostRoleStatus.FAILED));
-    manualTransitionMap.put(HostRoleStatus.HOLDING_TIMEDOUT, EnumSet.of(HostRoleStatus.PENDING, HostRoleStatus.TIMEDOUT));
+    manualTransitionMap.put(HostRoleStatus.HOLDING, EnumSet.of(HostRoleStatus.COMPLETED, HostRoleStatus.ABORTED));
+    manualTransitionMap.put(HostRoleStatus.HOLDING_FAILED, EnumSet.of(HostRoleStatus.PENDING, HostRoleStatus.FAILED, HostRoleStatus.ABORTED));
+    manualTransitionMap.put(HostRoleStatus.HOLDING_TIMEDOUT, EnumSet.of(HostRoleStatus.PENDING, HostRoleStatus.TIMEDOUT, HostRoleStatus.ABORTED));
   }
 
 
@@ -143,9 +144,11 @@ public class StageResourceProvider extends AbstractResourceProvider implements E
 
   /**
    * Constructor.
+   *
+   * @param managementController  the Ambari management controller
    */
-  StageResourceProvider() {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS);
+  StageResourceProvider(AmbariManagementController managementController) {
+    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
   }
 
   // ----- AbstractResourceProvider ------------------------------------------
@@ -183,7 +186,7 @@ public class StageResourceProvider extends AbstractResourceProvider implements E
         String stageStatus = (String) updateProperties.get(STAGE_STATUS);
         if (stageStatus != null) {
           HostRoleStatus desiredStatus = HostRoleStatus.valueOf(stageStatus);
-          updateStageStatus(entity, desiredStatus);
+          updateStageStatus(entity, desiredStatus, getManagementController());
         }
       }
     }
@@ -237,15 +240,16 @@ public class StageResourceProvider extends AbstractResourceProvider implements E
    * @param requestId      the request id
    * @param stageId        the stage id
    * @param desiredStatus  the desired stage status
+   * @param controller     the ambari management controller
    */
-  public static void updateStageStatus(long requestId, long stageId, HostRoleStatus desiredStatus) {
-    Predicate predicate =
-        new PredicateBuilder().property(STAGE_STAGE_ID).equals(stageId).
-            and().property(STAGE_REQUEST_ID).equals(requestId).toPredicate();
+  public static void updateStageStatus(long requestId, long stageId, HostRoleStatus desiredStatus,
+                                       AmbariManagementController controller) {
+    Predicate predicate = new PredicateBuilder().property(STAGE_STAGE_ID).equals(stageId).and().
+        property(STAGE_REQUEST_ID).equals(requestId).toPredicate();
 
     List<StageEntity> entityList = dao.findAll(PropertyHelper.getReadRequest(), predicate);
     for (StageEntity stageEntity : entityList) {
-      updateStageStatus(stageEntity, desiredStatus);
+      updateStageStatus(stageEntity, desiredStatus, controller);
     }
   }
 
@@ -255,32 +259,36 @@ public class StageResourceProvider extends AbstractResourceProvider implements E
   /**
    * Update the given stage entity with the desired status.
    *
-   * @param entity         the stage entity to update
+   * @param stage          the stage entity to update
    * @param desiredStatus  the desired stage status
+   * @param controller     the ambari management controller
    *
    * @throws java.lang.IllegalArgumentException if the transition to the desired status is not a
    *         legal transition
    */
-  private static void updateStageStatus(StageEntity entity, HostRoleStatus desiredStatus) {
-    Collection<HostRoleCommandEntity> tasks = entity.getHostRoleCommands();
+  private static void updateStageStatus(StageEntity stage, HostRoleStatus desiredStatus,
+                                        AmbariManagementController controller) {
+    Collection<HostRoleCommandEntity> tasks = stage.getHostRoleCommands();
 
-    HostRoleStatus currentStatus = CalculatedStatus.statusFromTaskEntities(tasks, entity.isSkippable()).getStatus();
+    HostRoleStatus currentStatus = CalculatedStatus.statusFromTaskEntities(tasks, stage.isSkippable()).getStatus();
 
     if (!isValidManualTransition(currentStatus, desiredStatus)) {
       throw new IllegalArgumentException("Can not transition a stage from " +
           currentStatus + " to " + desiredStatus);
     }
-
-    for (HostRoleCommandEntity hostRoleCommand : tasks) {
-      HostRoleStatus hostRoleStatus = hostRoleCommand.getStatus();
-      if (hostRoleStatus.equals(currentStatus)) {
-        hostRoleCommand.setStatus(desiredStatus);
-
-        if (desiredStatus == HostRoleStatus.PENDING) {
-          hostRoleCommand.setStartTime(-1L);
+    if (desiredStatus == HostRoleStatus.ABORTED) {
+      controller.getActionManager().cancelRequest(stage.getRequestId(), "User aborted.");
+    } else {
+      for (HostRoleCommandEntity hostRoleCommand : tasks) {
+        HostRoleStatus hostRoleStatus = hostRoleCommand.getStatus();
+        if (hostRoleStatus.equals(currentStatus)) {
+          hostRoleCommand.setStatus(desiredStatus);
+
+          if (desiredStatus == HostRoleStatus.PENDING) {
+            hostRoleCommand.setStartTime(-1L);
+          }
+          hostRoleCommandDAO.merge(hostRoleCommand);
         }
-
-        hostRoleCommandDAO.merge(hostRoleCommand);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/78d0af1b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java
index c6a058d..323b56f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java
@@ -128,7 +128,7 @@ public class UpgradeItemResourceProvider extends ReadOnlyResourceProvider {
           Long requestId = (Long) resource.getPropertyValue(UPGRADE_REQUEST_ID);
           Long stageId   = (Long) resource.getPropertyValue(UPGRADE_ITEM_STAGE_ID);
 
-          StageResourceProvider.updateStageStatus(requestId, stageId, desiredStatus);
+          StageResourceProvider.updateStageStatus(requestId, stageId, desiredStatus, getManagementController());
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/78d0af1b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
index c97de8a..1d80f47 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StageResourceProviderTest.java
@@ -22,11 +22,15 @@ import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
+import org.apache.ambari.server.actionmanager.ActionManager;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.QueryResponse;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.metadata.ActionMetadata;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.dao.StageDAO;
@@ -47,8 +51,10 @@ import java.util.Map;
 import java.util.Set;
 
 import static org.easymock.EasyMock.anyLong;
+import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
@@ -59,6 +65,7 @@ public class StageResourceProviderTest {
   private StageDAO dao = null;
   private Clusters clusters = null;
   private Cluster cluster = null;
+  private AmbariManagementController managementController = null;
   private Injector injector;
 
   @Before
@@ -66,6 +73,7 @@ public class StageResourceProviderTest {
     dao = createStrictMock(StageDAO.class);
     clusters = createStrictMock(Clusters.class);
     cluster = createStrictMock(Cluster.class);
+    managementController = createNiceMock(AmbariManagementController.class);
 
     // create an injector which will inject the mocks
     injector = Guice.createInjector(Modules.override(
@@ -77,7 +85,7 @@ public class StageResourceProviderTest {
 
   @Test
   public void testCreateResources() throws Exception {
-    StageResourceProvider provider = new StageResourceProvider();
+    StageResourceProvider provider = new StageResourceProvider(managementController);
 
     Request request = createNiceMock(Request.class);
     try {
@@ -90,7 +98,7 @@ public class StageResourceProviderTest {
 
   @Test
   public void testUpdateResources() throws Exception {
-    StageResourceProvider provider = new StageResourceProvider();
+    StageResourceProvider provider = new StageResourceProvider(managementController);
 
     Request request = createNiceMock(Request.class);
     Predicate predicate = createNiceMock(Predicate.class);
@@ -107,7 +115,7 @@ public class StageResourceProviderTest {
 
   @Test
   public void testDeleteResources() throws Exception {
-    StageResourceProvider provider = new StageResourceProvider();
+    StageResourceProvider provider = new StageResourceProvider(managementController);
 
     Predicate predicate = createNiceMock(Predicate.class);
     try {
@@ -120,12 +128,12 @@ public class StageResourceProviderTest {
 
   @Test
   public void testGetResources() throws Exception {
-    StageResourceProvider provider = new StageResourceProvider();
+    StageResourceProvider provider = new StageResourceProvider(managementController);
 
     Request request = createNiceMock(Request.class);
     Predicate predicate = createNiceMock(Predicate.class);
 
-    List<StageEntity> entities = getStageEntities();
+    List<StageEntity> entities = getStageEntities(HostRoleStatus.COMPLETED);
 
     expect(dao.findAll(request, predicate)).andReturn(entities);
 
@@ -151,12 +159,12 @@ public class StageResourceProviderTest {
 
   @Test
   public void testQueryForResources() throws Exception {
-    StageResourceProvider provider = new StageResourceProvider();
+    StageResourceProvider provider = new StageResourceProvider(managementController);
 
     Request request = createNiceMock(Request.class);
     Predicate predicate = createNiceMock(Predicate.class);
 
-    List<StageEntity> entities = getStageEntities();
+    List<StageEntity> entities = getStageEntities(HostRoleStatus.COMPLETED);
 
     expect(dao.findAll(request, predicate)).andReturn(entities);
 
@@ -178,7 +186,32 @@ public class StageResourceProviderTest {
     verify(dao, clusters, cluster);
   }
 
-  private List<StageEntity> getStageEntities() {
+  @Test
+  public void testUpdateStageStatus_aborted() throws Exception {
+
+    ActionManager actionManager = createNiceMock(ActionManager.class);
+
+    Predicate predicate = new PredicateBuilder().property(StageResourceProvider.STAGE_STAGE_ID).equals(2L).and().
+        property(StageResourceProvider.STAGE_REQUEST_ID).equals(1L).toPredicate();
+
+    Request request = PropertyHelper.getReadRequest();
+
+    List<StageEntity> entities = getStageEntities(HostRoleStatus.HOLDING);
+
+    expect(dao.findAll(request, predicate)).andReturn(entities);
+
+    expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
+
+    actionManager.cancelRequest(eq(1L), anyObject(String.class));
+
+    replay(dao, clusters, cluster, actionManager, managementController);
+
+    StageResourceProvider.updateStageStatus(1L, 2L, HostRoleStatus.ABORTED, managementController);
+
+    verify(dao, clusters, cluster, actionManager, managementController);
+  }
+
+  private List<StageEntity> getStageEntities(HostRoleStatus lastTaskStatus) {
     StageEntity stage = new StageEntity();
 
     HostRoleCommandEntity task1 = new HostRoleCommandEntity();
@@ -187,7 +220,7 @@ public class StageResourceProviderTest {
     task1.setEndTime(2000L);
 
     HostRoleCommandEntity task2 = new HostRoleCommandEntity();
-    task2.setStatus(HostRoleStatus.COMPLETED);
+    task2.setStatus(lastTaskStatus);
     task2.setStartTime(1500L);
     task2.setEndTime(2500L);
 
@@ -197,6 +230,7 @@ public class StageResourceProviderTest {
     tasks.add(task2);
 
     stage.setHostRoleCommands(tasks);
+    stage.setRequestId(1L);
 
     List<StageEntity> entities = new LinkedList<StageEntity>();
     entities.add(stage);
@@ -209,6 +243,7 @@ public class StageResourceProviderTest {
       binder.bind(StageDAO.class).toInstance(dao);
       binder.bind(Clusters.class).toInstance(clusters);
       binder.bind(Cluster.class).toInstance(cluster);
+      binder.bind(AmbariManagementController.class).toInstance(managementController);
       binder.bind(ActionMetadata.class);
     }
   }