diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java index 14e311e1c18..9036ac4bacb 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java @@ -67,6 +67,7 @@ import org.apache.ambari.server.orm.entities.HostRoleCommandEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.RequestEntity; +import org.apache.ambari.server.orm.entities.StackEntity; import org.apache.ambari.server.orm.entities.UpgradeEntity; import org.apache.ambari.server.orm.entities.UpgradeGroupEntity; import org.apache.ambari.server.orm.entities.UpgradeHistoryEntity; @@ -755,7 +756,16 @@ major stack versions (e.g., HDP 2.2 -> 2.3), and then set config changes at the appropriate moment during the orchestration. */ if (pack.getType() == UpgradeType.ROLLING || pack.getType() == UpgradeType.HOST_ORDERED) { + if (direction == Direction.UPGRADE) { + StackEntity targetStack = upgradeContext.getRepositoryVersion().getStack(); + cluster.setDesiredStackVersion( + new StackId(targetStack.getStackName(), targetStack.getStackVersion())); + } s_upgradeHelper.updateDesiredRepositoriesAndConfigs(upgradeContext); + if (direction == Direction.DOWNGRADE) { + StackId targetStack = upgradeContext.getCluster().getCurrentStackVersion(); + cluster.setDesiredStackVersion(targetStack); + } } // resolve or build a proper config upgrade pack - always start out with the config pack diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog262.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog262.java index f83204d8106..5dfcef43b32 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog262.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog262.java @@ -18,9 +18,14 @@ package org.apache.ambari.server.upgrade; import java.sql.SQLException; +import java.util.Map; import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.orm.DBAccessor; +import org.apache.ambari.server.state.Cluster; +import org.apache.ambari.server.state.Clusters; +import org.apache.ambari.server.state.StackId; import com.google.inject.Inject; import com.google.inject.Injector; @@ -61,6 +66,29 @@ private void addHostRequestStatusColumn() throws SQLException { @Override protected void executePreDMLUpdates() throws AmbariException, SQLException { + fixDesiredStack(); + } + + /** + * if desired stack < current stack, set current stack as desired + * + * @throws AmbariException + */ + private void fixDesiredStack() throws AmbariException { + AmbariManagementController ambariManagementController = injector.getInstance(AmbariManagementController.class); + Clusters clusters = ambariManagementController.getClusters(); + if (clusters != null) { + Map clusterMap = getCheckedClusterMap(clusters); + if (clusterMap != null && !clusterMap.isEmpty()) { + for (final Cluster cluster : clusterMap.values()) { + StackId desiredStack = cluster.getDesiredStackVersion(); + StackId currentStack = cluster.getCurrentStackVersion(); + if (!desiredStack.equals(currentStack)) { + cluster.setDesiredStackVersion(currentStack); + } + } + } + } } @Override diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java index a8c095412cf..88ed9462c95 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java @@ -701,9 +701,10 @@ public void testCreatePartialDowngrade() throws Exception { public void testDowngradeToBase() throws Exception { Cluster cluster = clusters.getCluster("c1"); + assertEquals(cluster.getDesiredStackVersion().getStackId(), "HDP-2.1.1"); Map requestProps = new HashMap<>(); requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1"); - requestProps.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID, String.valueOf(repoVersionEntity2111.getId())); + requestProps.put(UpgradeResourceProvider.UPGRADE_REPO_VERSION_ID, String.valueOf(repoVersionEntity2200.getId())); requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test"); requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true"); requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name()); @@ -718,6 +719,8 @@ public void testDowngradeToBase() throws Exception { UpgradeEntity upgrade = upgrades.get(0); + assertEquals("HDP-2.2.0", cluster.getDesiredStackVersion().getStackId()); + // now abort the upgrade so another can be created abortUpgrade(upgrade.getRequestId()); @@ -749,12 +752,14 @@ public void testDowngradeToBase() throws Exception { Resource r = status.getAssociatedResources().iterator().next(); String id = r.getPropertyValue("Upgrade/request_id").toString(); + assertEquals("HDP-2.1.1", cluster.getDesiredStackVersion().getStackId()); + UpgradeEntity entity = upgradeDao.findUpgrade(Long.parseLong(id)); assertNotNull(entity); assertEquals(Direction.DOWNGRADE, entity.getDirection()); // associated version is the FROM on DOWNGRADE - assertEquals(repoVersionEntity2111.getVersion(), entity.getRepositoryVersion().getVersion()); + assertEquals(repoVersionEntity2200.getVersion(), entity.getRepositoryVersion().getVersion()); // target is by service assertEquals(repoVersionEntity2110.getVersion(), @@ -763,6 +768,8 @@ public void testDowngradeToBase() throws Exception { StageDAO dao = injector.getInstance(StageDAO.class); List stages = dao.findByRequestId(entity.getRequestId()); + assertEquals("HDP-2.1.1", cluster.getDesiredStackVersion().getStackId()); + Gson gson = new Gson(); for (StageEntity se : stages) { Map map = gson.>fromJson(se.getCommandParamsStage(), Map.class); @@ -1113,6 +1120,7 @@ public void testPercents() throws Exception { public void testCreateCrossStackUpgrade() throws Exception { Cluster cluster = clusters.getCluster("c1"); StackId oldStack = repoVersionEntity2110.getStackId(); + assertEquals(cluster.getDesiredStackVersion(), oldStack); for (Service s : cluster.getServices().values()) { assertEquals(oldStack, s.getDesiredStackId()); @@ -1155,6 +1163,7 @@ public void testCreateCrossStackUpgrade() throws Exception { assertEquals(2, group.getItems().size()); assertTrue(cluster.getDesiredConfigs().containsKey("zoo.cfg")); + assertTrue(cluster.getDesiredStackVersion().getStackId().equals("HDP-2.2.0")); for (Service s : cluster.getServices().values()) { assertEquals(repoVersionEntity2200, s.getDesiredRepositoryVersion());