浏览代码

AMBARI-9182. Request to start Downgrade failed (ncole)

Nate Cole 10 年之前
父节点
当前提交
c061d72131

+ 15 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java

@@ -309,6 +309,10 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
   private UpgradePack validateRequest(Map<String, Object> requestMap) throws AmbariException {
     String clusterName = (String) requestMap.get(UPGRADE_CLUSTER_NAME);
     String version = (String) requestMap.get(UPGRADE_VERSION);
+    String forceDowngrade = (String) requestMap.get(UPGRADE_FORCE_DOWNGRADE);
+    String versionForUpgradePack = (String) requestMap.get(UPGRADE_FROM_VERSION);
+
+    boolean forDowngrade = (null != forceDowngrade && Boolean.parseBoolean(forceDowngrade));
 
     if (null == clusterName) {
       throw new AmbariException(String.format("%s is required", UPGRADE_CLUSTER_NAME));
@@ -320,12 +324,19 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
 
     Cluster cluster = getManagementController().getClusters().getCluster(clusterName);
     StackId stack = cluster.getDesiredStackVersion();
+
+    String repoVersion = version;
+
+    if (forDowngrade && null != versionForUpgradePack) {
+      repoVersion = versionForUpgradePack;
+    }
+
     RepositoryVersionEntity versionEntity = m_repoVersionDAO.findByStackAndVersion(
-        stack.getStackId(), version);
+        stack.getStackId(), repoVersion);
 
     if (null == versionEntity) {
       throw new AmbariException(String.format("Version %s for stack %s was not found",
-          version, stack.getStackVersion()));
+          repoVersion, stack.getStackVersion()));
     }
 
     Map<String, UpgradePack> packs = m_metaProvider.get().getUpgradePacks(
@@ -335,7 +346,8 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
 
     if (null == up) {
       throw new AmbariException(String.format(
-          "Upgrade pack %s not found", versionEntity.getUpgradePackage()));
+          "Upgrade pack %s for version %s not found", versionEntity.getUpgradePackage(),
+            repoVersion));
     }
 
     // !!! validate all hosts have the version installed

+ 42 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java

@@ -63,6 +63,7 @@ import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.view.ViewRegistry;
 import org.easymock.EasyMock;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -379,8 +380,49 @@ public class UpgradeResourceProviderTest {
 
   }
 
+  @Test
+  public void testDowngradeToBase() throws Exception {
+    Cluster cluster = clusters.getCluster("c1");
+
+    Map<String, Object> requestProps = new HashMap<String, Object>();
+    requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.2.1");
+
+    ResourceProvider upgradeResourceProvider = createProvider(amc);
+
+    Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+    org.apache.ambari.server.controller.spi.RequestStatus status = upgradeResourceProvider.createResources(request);
+
+    List<UpgradeEntity> upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
+    assertEquals(1, upgrades.size());
+
+    requestProps = new HashMap<String, Object>();
+    requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2");
+    request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+    try {
+      status = upgradeResourceProvider.createResources(request);
+      Assert.fail("Expected an exception going downgrade with no upgrade pack");
+    } catch (Exception e) {
+      // !!! expected
+    }
 
+    requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_FORCE_DOWNGRADE, "true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_FROM_VERSION, "2.2.2.1");
+    request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
+    status = upgradeResourceProvider.createResources(request);
+    assertEquals(1, status.getAssociatedResources().size());
+    Resource r = status.getAssociatedResources().iterator().next();
+    String id = r.getPropertyValue("Upgrade/request_id").toString();
+
+    UpgradeEntity entity = upgradeDao.findUpgrade(Long.parseLong(id));
+    assertNotNull(entity);
+    assertEquals("2.1.1", entity.getFromVersion());
+    assertEquals("2.2", entity.getToVersion());
 
+  }
 
   /**
    * @param amc