AMBARI-20835. Unable to proceed from manual prompt in EU wizard due to IllegalArgumentException (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4b672348 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4b672348 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4b672348 Branch: refs/heads/branch-feature-AMBARI-12556 Commit: 4b672348dacb96466275b8bfa2c41b62885f993c Parents: 0197813 Author: Nate Cole <nc...@hortonworks.com> Authored: Mon Apr 24 16:00:23 2017 -0400 Committer: Nate Cole <nc...@hortonworks.com> Committed: Mon Apr 24 17:09:13 2017 -0400 ---------------------------------------------------------------------- .../actionmanager/ActionDBAccessorImpl.java | 5 ++- .../server/orm/dao/HostRoleCommandDAO.java | 2 +- .../FixCapacitySchedulerOrderingPolicy.java | 5 +++ .../server/state/cluster/ClustersImpl.java | 4 --- .../server/actionmanager/TestActionManager.java | 36 ++++++++++++++++++++ .../AmbariManagementControllerTest.java | 9 +++-- 6 files changed, 53 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/4b672348/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java index 8c4eae8..4b7e71d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java @@ -377,6 +377,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { stageDAO.create(stageEntity); List<HostRoleCommand> orderedHostRoleCommands = stage.getOrderedHostRoleCommands(); + List<HostRoleCommandEntity> hostRoleCommandEntities = new ArrayList<>(); for (HostRoleCommand hostRoleCommand : orderedHostRoleCommands) { hostRoleCommand.setRequestId(requestId); @@ -384,8 +385,8 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { HostRoleCommandEntity hostRoleCommandEntity = hostRoleCommand.constructNewPersistenceEntity(); hostRoleCommandEntity.setStage(stageEntity); hostRoleCommandDAO.create(hostRoleCommandEntity); + hostRoleCommandEntities.add(hostRoleCommandEntity); - assert hostRoleCommandEntity.getTaskId() != null; hostRoleCommand.setTaskId(hostRoleCommandEntity.getTaskId()); String prefix = ""; @@ -442,6 +443,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { roleSuccessCriteriaDAO.create(roleSuccessCriteriaEntity); } + stageEntity.setHostRoleCommands(hostRoleCommandEntities); stageEntity = stageDAO.merge(stageEntity); } @@ -516,6 +518,7 @@ public class ActionDBAccessorImpl implements ActionDBAccessor { long now = System.currentTimeMillis(); List<Long> requestsToCheck = new ArrayList<>(); + List<Long> abortedCommandUpdates = new ArrayList<>(); List<HostRoleCommandEntity> commandEntities = hostRoleCommandDAO.findByPKs(taskReports.keySet()); List<HostRoleCommandEntity> commandEntitiesToMerge = new ArrayList<>(); http://git-wip-us.apache.org/repos/asf/ambari/blob/4b672348/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java index 6b34575..58a4180 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java @@ -737,7 +737,7 @@ public class HostRoleCommandDAO { @TransactionalLock(lockArea = LockArea.HRC_STATUS_CACHE, lockType = LockType.WRITE) public void remove(HostRoleCommandEntity entity) { EntityManager entityManager = entityManagerProvider.get(); - entityManager.remove(merge(entity)); + entityManager.remove(entity); invalidateHostRoleCommandStatusSummaryCache(entity); } http://git-wip-us.apache.org/repos/asf/ambari/blob/4b672348/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FixCapacitySchedulerOrderingPolicy.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FixCapacitySchedulerOrderingPolicy.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FixCapacitySchedulerOrderingPolicy.java index fbb88d8..92f6e50 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FixCapacitySchedulerOrderingPolicy.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FixCapacitySchedulerOrderingPolicy.java @@ -66,6 +66,11 @@ public class FixCapacitySchedulerOrderingPolicy extends AbstractServerAction { Cluster cluster = clusters.getCluster(clusterName); Config config = cluster.getDesiredConfigByType(SOURCE_CONFIG_TYPE); + if (null == config) { + return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", + String.format("The cluster does not have %s defined.", SOURCE_CONFIG_TYPE), ""); + } + Map<String, String> properties = config.getProperties(); Set<String> parentQueueNames = new HashSet<>(); http://git-wip-us.apache.org/repos/asf/ambari/blob/4b672348/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java index 2bc1e68..99bc781 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java @@ -811,10 +811,6 @@ public class ClustersImpl implements Clusters { } } - - entity.setHostRoleCommandEntities(null); - hostRoleCommandDAO.removeByHostId(entity.getHostId()); - entity.setHostStateEntity(null); hostStateDAO.removeByHostId(entity.getHostId()); hostConfigMappingDAO.removeByHostId(entity.getHostId()); http://git-wip-us.apache.org/repos/asf/ambari/blob/4b672348/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionManager.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionManager.java b/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionManager.java index e12461d..fbd7c4e 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionManager.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/actionmanager/TestActionManager.java @@ -26,10 +26,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.apache.ambari.server.AmbariException; @@ -42,11 +44,16 @@ import org.apache.ambari.server.audit.AuditLogger; import org.apache.ambari.server.events.publishers.JPAEventPublisher; import org.apache.ambari.server.orm.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; +import org.apache.ambari.server.orm.dao.StageDAO; +import org.apache.ambari.server.orm.entities.HostRoleCommandEntity; +import org.apache.ambari.server.orm.entities.StageEntity; +import org.apache.ambari.server.orm.entities.StageEntityPK; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostStartEvent; import org.apache.ambari.server.utils.CommandUtils; import org.apache.ambari.server.utils.StageUtils; +import org.apache.commons.collections.CollectionUtils; import org.easymock.EasyMock; import org.junit.After; import org.junit.Before; @@ -286,4 +293,33 @@ public class TestActionManager { verify(queue, db, clusters); } + + /** + * Tests whether {@link ActionDBAccessor#persistActions(Request)} associates tasks with their + * stages. Improvements to {@code Stage} processing exposed the fact that the association wasn't + * being made, and JPA didn't know of the Stage-to-Tasks child relationship. + * + * @throws Exception + */ + @Test + public void testPersistCommandsWithStages() throws Exception { + ActionDBAccessor db = injector.getInstance(ActionDBAccessorImpl.class); + + populateActionDBWithTwoCommands(db, hostname); + + List<Stage> stages = db.getAllStages(requestId); + assertEquals(1, stages.size()); + Stage stage = stages.get(0); + + StageEntityPK pk = new StageEntityPK(); + pk.setRequestId(stage.getRequestId()); + pk.setStageId(stage.getStageId()); + + StageDAO dao = injector.getInstance(StageDAO.class); + StageEntity stageEntity = dao.findByPK(pk); + assertNotNull(stageEntity); + + Collection<HostRoleCommandEntity> commandEntities = stageEntity.getHostRoleCommands(); + assertTrue(CollectionUtils.isNotEmpty(commandEntities)); + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/4b672348/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java index 554e089..628a56f 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java @@ -158,6 +158,7 @@ import org.easymock.Capture; import org.easymock.EasyMock; import org.junit.After; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; @@ -174,8 +175,6 @@ import com.google.gson.reflect.TypeToken; import com.google.inject.Guice; import com.google.inject.Injector; -import junit.framework.Assert; - public class AmbariManagementControllerTest { private static final Logger LOG = @@ -9018,6 +9017,8 @@ public class AmbariManagementControllerTest { Assert.assertNull(topologyHostInfoDAO.findByHostname(host1)); + Long firstHostId = clusters.getHost(host1).getHostId(); + // Deletion without specifying cluster should be successful requests.clear(); requests.add(new HostRequest(host1, null, null)); @@ -9031,6 +9032,10 @@ public class AmbariManagementControllerTest { Assert.assertFalse(clusters.getClustersForHost(host1).contains(cluster)); Assert.assertNull(topologyHostInfoDAO.findByHostname(host1)); + // verify there are no host role commands for the host + List<HostRoleCommandEntity> tasks = hostRoleCommandDAO.findByHostId(firstHostId); + assertEquals(0, tasks.size()); + // Case 3: Delete host that is still part of the cluster, and specify the cluster_name in the request requests.clear(); requests.add(new HostRequest(host2, cluster1, null));