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);
}
}