Repository: ambari
Updated Branches:
  refs/heads/trunk 46fb0471c -> e58e53fab


AMBARI-9027. Create Downgrade Pack for 2.2.* to 2.2.* (ncole)


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

Branch: refs/heads/trunk
Commit: e58e53fab4ed4c83d5e0b7248e6b7900a3505157
Parents: 46fb047
Author: Nate Cole <[email protected]>
Authored: Wed Jan 7 11:48:47 2015 -0500
Committer: Nate Cole <[email protected]>
Committed: Wed Jan 7 15:04:01 2015 -0500

----------------------------------------------------------------------
 .../internal/UpgradeResourceProvider.java       | 23 +++++-
 .../ambari/server/state/UpgradeHelper.java      | 60 +++++++++++++--
 .../ambari/server/state/stack/UpgradePack.java  | 11 ++-
 .../state/stack/upgrade/ClusterGrouping.java    |  3 +-
 .../state/stack/upgrade/ColocatedGrouping.java  | 15 ++--
 .../server/state/stack/upgrade/Grouping.java    |  7 +-
 .../stack/upgrade/StageWrapperBuilder.java      | 26 ++++++-
 .../stacks/HDP/2.2/upgrades/upgrade-2.2.xml     | 12 +++
 .../internal/UpgradeResourceProviderTest.java   |  2 +-
 .../ambari/server/state/UpgradeHelperTest.java  | 43 +++++++++--
 .../server/state/stack/UpgradePackTest.java     | 80 +++++++-------------
 .../stacks/HDP/2.1.1/upgrades/upgrade_test.xml  | 10 ++-
 12 files changed, 205 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
----------------------------------------------------------------------
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 2b580f6..9eb0d4b 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
@@ -17,7 +17,9 @@
  */
 package org.apache.ambari.server.controller.internal;
 
+import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER;
 import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_LOCATION;
+import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -81,9 +83,6 @@ import org.apache.ambari.server.utils.StageUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER;
-import static 
org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER;
-
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -96,11 +95,13 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
   protected static final String UPGRADE_CLUSTER_NAME = "Upgrade/cluster_name";
   protected static final String UPGRADE_VERSION = "Upgrade/repository_version";
   protected static final String UPGRADE_REQUEST_ID = "Upgrade/request_id";
+  protected static final String UPGRADE_FORCE_DOWNGRADE = 
"Upgrade/force_downgrade";
 
   private static final Set<String> PK_PROPERTY_IDS = new HashSet<String>(
       Arrays.asList(UPGRADE_REQUEST_ID, UPGRADE_CLUSTER_NAME));
   private static final Set<String> PROPERTY_IDS = new HashSet<String>();
 
+
   private static final Map<Resource.Type, String> KEY_PROPERTY_IDS = new 
HashMap<Resource.Type, String>();
 
   @Inject
@@ -125,6 +126,7 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
     PROPERTY_IDS.add(UPGRADE_CLUSTER_NAME);
     PROPERTY_IDS.add(UPGRADE_VERSION);
     PROPERTY_IDS.add(UPGRADE_REQUEST_ID);
+    PROPERTY_IDS.add(UPGRADE_FORCE_DOWNGRADE);
 
     // !!! boo
     for (String requestPropertyId : RequestResourceProvider.PROPERTY_IDS) {
@@ -173,6 +175,10 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
         }
       });
 
+    if (null == entity) {
+      throw new SystemException("Could not load upgrade");
+    }
+
     notifyCreate(Resource.Type.Upgrade, request);
 
     Resource res = new ResourceImpl(Resource.Type.Upgrade);
@@ -366,7 +372,16 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
     MasterHostResolver mhr = new MasterHostResolver(cluster);
     UpgradeHelper helper = new UpgradeHelper();
 
-    List<UpgradeGroupHolder> groups = helper.createUpgrade(cluster, mhr, pack);
+    String forceDowngrade = (String) requestMap.get(UPGRADE_FORCE_DOWNGRADE);
+
+    List<UpgradeGroupHolder> groups = null;
+
+    if (null != forceDowngrade && Boolean.parseBoolean(forceDowngrade)) {
+      groups = helper.createDowngrade(cluster, mhr, pack);
+    } else {
+      groups = helper.createUpgrade(cluster, mhr, pack);
+    }
+
     if (groups.isEmpty()) {
       throw new AmbariException("There are no upgrade groupings available");
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java 
b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
index ae793be..ac30762 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
@@ -19,6 +19,7 @@ package org.apache.ambari.server.state;
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -61,22 +62,55 @@ public class UpgradeHelper {
   private static Logger LOG = LoggerFactory.getLogger(UpgradeHelper.class);
 
   /**
+   * Generates a list of UpgradeGroupHolder items that are used to execute a 
downgrade
+   * @param cluster     the cluster
+   * @param mhr         Master Host Resolver needed to get master and secondary
+   *                    hosts of several components like NAMENODE
+   * @param upgradePack the upgrade pack
+   * @return the list of holders
+   */
+  public List<UpgradeGroupHolder> createDowngrade(Cluster cluster, 
MasterHostResolver mhr, UpgradePack upgradePack) throws AmbariException {
+    return createSequence(cluster, mhr, upgradePack, false);
+  }
+
+  /**
    * Generates a list of UpgradeGroupHolder items that are used to execute an 
upgrade
-   * @param cluster the cluster
-   * @param mhr Master Host Resolver needed to get master and secondary hosts 
of several components like NAMENODE
+   * @param cluster     the cluster
+   * @param mhr         Master Host Resolver needed to get master and secondary
+   *                    hosts of several components like NAMENODE
    * @param upgradePack the upgrade pack
    * @return the list of holders
    */
   public List<UpgradeGroupHolder> createUpgrade(Cluster cluster, 
MasterHostResolver mhr, UpgradePack upgradePack) throws AmbariException {
+    return createSequence(cluster, mhr, upgradePack, true);
+  }
+
+
+  /**
+   * Generates a list of UpgradeGroupHolder items that are used to execute an 
upgrade
+   * @param cluster     the cluster
+   * @param mhr         Master Host Resolver needed to get master and secondary
+   *                    hosts of several components like NAMENODE
+   * @param upgradePack the upgrade pack
+   * @param forUpgrade  {@code true} if the sequence is for an upgrade, {@code 
false} if for a downgrade
+   * @return the list of holders
+   *
+   */
+  private List<UpgradeGroupHolder> createSequence(Cluster cluster,
+      MasterHostResolver mhr, UpgradePack upgradePack, boolean forUpgrade)
+      throws AmbariException {
     Map<String, Map<String, ProcessingComponent>> allTasks = 
upgradePack.getTasks();
 
     List<UpgradeGroupHolder> groups = new ArrayList<UpgradeGroupHolder>();
 
+    int idx = 0;
+
     for (Grouping group : upgradePack.getGroups()) {
       if (ClusterGrouping.class.isInstance(group)) {
         UpgradeGroupHolder groupHolder = getClusterGroupHolder(cluster, 
(ClusterGrouping) group);
         if (null != groupHolder) {
           groups.add(groupHolder);
+          idx++;
           continue;
         }
       }
@@ -89,7 +123,15 @@ public class UpgradeHelper {
 
       StageWrapperBuilder builder = group.getBuilder();
 
-      for (UpgradePack.OrderService service : group.services) {
+      List<UpgradePack.OrderService> services = group.services;
+
+      if (!forUpgrade) {
+        List<UpgradePack.OrderService> reverse = new 
ArrayList<UpgradePack.OrderService>(services);
+        Collections.reverse(reverse);
+        services = reverse;
+      }
+
+      for (UpgradePack.OrderService service : services) {
 
         if (!allTasks.containsKey(service.serviceName)) {
           continue;
@@ -125,10 +167,12 @@ public class UpgradeHelper {
                 throw new AmbariException(MessageFormat.format("Could not find 
active and standby namenodes using hosts: {0}", 
StringUtils.join(hostsType.hosts, ", ").toString()));
             }
 
-            builder.add(hostsType, service.serviceName, 
svc.isClientOnlyService(), pc);
+            builder.add(hostsType, service.serviceName, forUpgrade,
+                svc.isClientOnlyService(), pc);
 
           } else {
-            builder.add(hostsType, service.serviceName, 
svc.isClientOnlyService(), pc);
+            builder.add(hostsType, service.serviceName, forUpgrade,
+                svc.isClientOnlyService(), pc);
           }
         }
       }
@@ -137,7 +181,11 @@ public class UpgradeHelper {
 
       if (!proxies.isEmpty()) {
         groupHolder.items = proxies;
-        groups.add(groupHolder);
+        if (forUpgrade) {
+          groups.add(groupHolder);
+        } else {
+          groups.add(idx, groupHolder);
+        }
       }
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
index 736a99c..1662baa 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
@@ -29,7 +29,6 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
-import org.apache.ambari.server.state.stack.upgrade.Batch;
 import org.apache.ambari.server.state.stack.upgrade.Grouping;
 import org.apache.ambari.server.state.stack.upgrade.Task;
 
@@ -131,6 +130,11 @@ public class UpgradePack {
     @XmlElement(name="task")
     public List<Task> preTasks;
 
+    @XmlElementWrapper(name="pre-downgrade")
+    @XmlElement(name="task")
+    public List<Task> preDowngradeTasks;
+
+
     @XmlElementWrapper(name="upgrade")
     @XmlElement(name="task")
     public List<Task> tasks;
@@ -139,8 +143,9 @@ public class UpgradePack {
     @XmlElement(name="task")
     public List<Task> postTasks;
 
-    @XmlElement(name="batch")
-    public Batch batch;
+    @XmlElementWrapper(name="post-downgrade")
+    @XmlElement(name="task")
+    public List<Task> postDowngradeTasks;
 
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
index a9acafb..ef605ec 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
@@ -90,7 +90,8 @@ public class ClusterGrouping extends Grouping {
     }
 
     @Override
-    public void add(HostsType hostsType, String service, boolean clientOnly, 
ProcessingComponent pc) {
+    public void add(HostsType hostsType, String service,
+        boolean forUpgrade, boolean clientOnly, ProcessingComponent pc) {
       // !!! no-op in this case
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
index 2c6a6e2..0d19b76 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
@@ -66,7 +66,8 @@ public class ColocatedGrouping extends Grouping {
     }
 
     @Override
-    public void add(HostsType hostsType, String service, boolean clientOnly, 
ProcessingComponent pc) {
+    public void add(HostsType hostsType, String service,
+        boolean forUpgrade, boolean clientOnly, ProcessingComponent pc) {
 
       int count = Double.valueOf(Math.ceil(
           (double) batch.percent / 100 * hostsType.hosts.size())).intValue();
@@ -86,11 +87,13 @@ public class ColocatedGrouping extends Grouping {
 
         TaskProxy proxy = null;
 
-        if (null != pc.preTasks && pc.preTasks.size() > 0) {
+        List<Task> tasks = resolveTasks(forUpgrade, true, pc);
+
+        if (null != tasks && tasks.size() > 0) {
           proxy = new TaskProxy();
           proxy.clientOnly = clientOnly;
           proxy.message = getStageText("Preparing", pc.name, 
Collections.singleton(host));
-          proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, 
singleHostsType, pc.preTasks));
+          proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, 
singleHostsType, tasks));
           proxy.service = service;
           proxy.component = pc.name;
           targetList.add(proxy);
@@ -112,12 +115,14 @@ public class ColocatedGrouping extends Grouping {
           }
         }
 
-        if (null != pc.postTasks && pc.postTasks.size() > 0) {
+        tasks = resolveTasks(forUpgrade, false, pc);
+
+        if (null != tasks && tasks.size() > 0) {
           proxy = new TaskProxy();
           proxy.clientOnly = clientOnly;
           proxy.component = pc.name;
           proxy.service = service;
-          proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, 
singleHostsType, pc.postTasks));
+          proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, 
singleHostsType, tasks));
           proxy.message = getStageText("Completing", pc.name, 
Collections.singleton(host));
           targetList.add(proxy);
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
index 3a7a0bf..b4a75ae 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
@@ -74,9 +74,10 @@ public class Grouping {
      * @param pc the ProcessingComponent derived from the upgrade pack.
      */
     @Override
-    public void add(HostsType hostsType, String service, boolean clientOnly, 
ProcessingComponent pc) {
+    public void add(HostsType hostsType, String service,
+        boolean forUpgrade, boolean clientOnly, ProcessingComponent pc) {
 
-      List<TaskBucket> buckets = buckets(pc.preTasks);
+      List<TaskBucket> buckets = buckets(resolveTasks(forUpgrade, true, pc));
       for (TaskBucket bucket : buckets) {
         List<TaskWrapper> preTasks = TaskWrapperBuilder.getTaskList(service, 
pc.name, hostsType, bucket.tasks);
         Set<String> preTasksEffectiveHosts = 
TaskWrapperBuilder.getEffectiveHosts(preTasks);
@@ -102,7 +103,7 @@ public class Grouping {
         }
       }
 
-      buckets = buckets(pc.postTasks);
+      buckets = buckets(resolveTasks(forUpgrade, false, pc));
       for (TaskBucket bucket : buckets) {
         List<TaskWrapper> postTasks = TaskWrapperBuilder.getTaskList(service, 
pc.name, hostsType, bucket.tasks);
         Set<String> postTasksEffectiveHosts = 
TaskWrapperBuilder.getEffectiveHosts(postTasks);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
index c0cf756..ee02a12 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
@@ -33,10 +33,12 @@ public abstract class StageWrapperBuilder {
    *
    * @param hostsType   the hosts, along with their type
    * @param service     the service name
+   * @param forUpgrade  {@code true} when performing an upgrade, {@code false} 
for a downgrade
    * @param clientOnly  whether the service is client only, no service checks
    * @param pc          the ProcessingComponent derived from the upgrade pack
    */
-  public abstract void add(HostsType hostsType, String service, boolean 
clientOnly, ProcessingComponent pc);
+  public abstract void add(HostsType hostsType, String service,
+      boolean forUpgrade, boolean clientOnly, ProcessingComponent pc);
 
   /**
    * Builds the stage wrappers.
@@ -58,5 +60,27 @@ public abstract class StageWrapperBuilder {
         1 == hosts.size() ? "" : " hosts");
   }
 
+  /**
+   * Determine the list of tasks given these rules
+   * <ul>
+   *   <li>When performing an upgrade, only use upgrade tasks</li>
+   *   <li>When performing a downgrade, use the downgrade tasks if they are 
defined</li>
+   *   <li>When performing a downgrade, but no downgrade tasks exist, reuse 
the upgrade tasks</li>
+   * </ul>
+   * @param forUpgrade  {@code true} if resolving for an upgrade, {@code 
false} for downgrade
+   * @param preTasks    {@code true} if loading pre-upgrade or pre-downgrade
+   * @param pc          the processing component holding task definitions
+   * @return
+   */
+  protected List<Task> resolveTasks(boolean forUpgrade, boolean preTasks, 
ProcessingComponent pc) {
+    if (forUpgrade) {
+      return preTasks ? pc.preTasks : pc.postTasks;
+    } else {
+      return preTasks ?
+        (null == pc.preDowngradeTasks ? pc.preTasks : pc.preDowngradeTasks) :
+        (null == pc.postDowngradeTasks ? pc.postTasks : pc.postDowngradeTasks);
+    }
+  }
+
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
index 73563cb..4549da0 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
@@ -320,6 +320,18 @@
             <value>10010</value>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade>
+          <task xsi:type="manual">
+            <message>The HiveServer port will now change to 10000. Ensure that 
this port is available on each HiveServer instance.</message>
+          </task>
+
+          <task xsi:type="configure">
+            <type>hive-site</type>
+            <key>hive.server2.thrift.port</key>
+            <value>10000</value>
+          </task>
+        </pre-downgrade>
 
         <upgrade>
           <task xsi:type="restart" />

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
----------------------------------------------------------------------
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 15c0c0c..2bb34d6 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
@@ -174,7 +174,7 @@ public class UpgradeResourceProviderTest {
 
     assertTrue(group.getItems().get(0).getText().contains("Preparing"));
     assertTrue(group.getItems().get(1).getText().contains("Restarting"));
-    assertTrue(group.getItems().get(2).getText().contains("Completing"));
+    assertTrue(group.getItems().get(2).getText().contains("Updating"));
     assertTrue(group.getItems().get(3).getText().contains("Service Check"));
 
     ActionManager am = injector.getInstance(ActionManager.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
index 3266d9e..53505f2 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
@@ -77,7 +77,7 @@ public class UpgradeHelperTest {
   }
 
   @Test
-  public void testOrchestration() throws Exception {
+  public void testUpgradeOrchestration() throws Exception {
     Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", 
"bar");
     assertTrue(upgrades.isEmpty());
 
@@ -88,12 +88,9 @@ public class UpgradeHelperTest {
 
     Cluster cluster = makeCluster();
 
-
     UpgradeHelper helper = new UpgradeHelper();
     List<UpgradeGroupHolder> groups = helper.createUpgrade(cluster, 
m_masterHostResolver, upgrade);
 
-
-
     assertEquals(5, groups.size());
 
     assertEquals("PRE_CLUSTER", groups.get(0).name);
@@ -116,6 +113,42 @@ public class UpgradeHelperTest {
   }
 
   @Test
+  public void testDowngradeOrchestration() throws Exception {
+    Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", 
"bar");
+    assertTrue(upgrades.isEmpty());
+
+    upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1");
+    assertTrue(upgrades.containsKey("upgrade_test"));
+    UpgradePack upgrade = upgrades.get("upgrade_test");
+    assertNotNull(upgrade);
+
+    Cluster cluster = makeCluster();
+
+    UpgradeHelper helper = new UpgradeHelper();
+    List<UpgradeGroupHolder> groups = helper.createDowngrade(cluster, 
m_masterHostResolver, upgrade);
+
+    assertEquals(5, groups.size());
+
+    assertEquals("PRE_CLUSTER", groups.get(0).name);
+    assertEquals("CORE_SLAVES", groups.get(1).name);
+    assertEquals("CORE_MASTER", groups.get(2).name);
+    assertEquals("ZOOKEEPER", groups.get(3).name);
+
+    UpgradeGroupHolder postGroup = groups.get(4);
+    assertEquals(postGroup.name, "POST_CLUSTER");
+    assertEquals(postGroup.title, "Finalize Upgrade");
+    assertEquals(postGroup.items.size(), 3);
+    assertEquals(postGroup.items.get(0).getText(), "Confirm Finalize");
+    assertEquals(postGroup.items.get(1).getText(), "Execute HDFS Finalize");
+    assertEquals(postGroup.items.get(2).getText(), "Save Cluster State");
+    assertEquals(postGroup.items.get(2).getType(), 
StageWrapper.Type.SERVER_SIDE_ACTION);
+
+    assertEquals(9, groups.get(1).items.size());
+    assertEquals(8, groups.get(2).items.size());
+    assertEquals(6, groups.get(3).items.size());
+  }
+
+  @Test
   public void testBuckets() throws Exception {
     Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", 
"bar");
     assertTrue(upgrades.isEmpty());
@@ -134,10 +167,8 @@ public class UpgradeHelperTest {
     UpgradeGroupHolder group = groups.iterator().next();
 
     assertEquals(7, group.items.size());
-
   }
 
-
   /**
    * Create an HA cluster
    * @throws AmbariException

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
index df6c8ac..cf191d5 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
@@ -17,14 +17,23 @@
  */
 package org.apache.ambari.server.state.stack;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
+import org.apache.ambari.server.state.stack.upgrade.RestartTask;
+import org.apache.ambari.server.state.stack.upgrade.Task;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -67,40 +76,20 @@ public class UpgradePackTest {
 
   @Test
   public void testUpgradeParsing() throws Exception {
-    /*
     Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", 
"2.1.1");
     assertTrue(upgrades.size() > 0);
+    assertTrue(upgrades.containsKey("upgrade_test"));
 
-    Map<String, List<String>> expectedOrder = new LinkedHashMap<String, 
List<String>>() {{
-      put("ZOOKEEPER", Arrays.asList("ZOOKEEPER_SERVER", "ZOOKEEPER_CLIENT"));
-      put("HDFS", Arrays.asList("JOURNALNODE", "NAMENODE", "DATANODE"));
-    }};
-
-
-    UpgradePack up = upgrades.values().iterator().next();
+    UpgradePack up = upgrades.get("upgrade_test");
     assertEquals("2.2.*", up.getTarget());
 
-    // !!! test the orders
-    assertEquals(expectedOrder.size(), up.getOrder().size());
-
-    int i = 0;
-    for (Entry<String, List<String>> entry : expectedOrder.entrySet()) {
-      assertTrue(up.getOrder().containsKey(entry.getKey()));
-      assertEquals(i++, indexOf(up.getOrder(), entry.getKey()));
-
-      int j = 0;
-      for (String comp : entry.getValue()) {
-        assertEquals(comp, up.getOrder().get(entry.getKey()).get(j++));
-      }
-    }
-
     Map<String, List<String>> expectedStages = new LinkedHashMap<String, 
List<String>>() {{
       put("ZOOKEEPER", Arrays.asList("ZOOKEEPER_SERVER"));
       put("HDFS", Arrays.asList("NAMENODE", "DATANODE"));
     }};
 
     // !!! test the tasks
-    i = 0;
+    int i = 0;
     for (Entry<String, List<String>> entry : expectedStages.entrySet()) {
       assertTrue(up.getTasks().containsKey(entry.getKey()));
       assertEquals(i++, indexOf(up.getTasks(), entry.getKey()));
@@ -120,39 +109,26 @@ public class UpgradePackTest {
     assertTrue(up.getTasks().get("HDFS").containsKey("NAMENODE"));
 
     ProcessingComponent pc = up.getTasks().get("HDFS").get("NAMENODE");
-    assertNull(pc.batch);
-    assertNull(pc.preTasks);
-    assertNull(pc.postTasks);
+    assertNotNull(pc.preTasks);
+    assertNotNull(pc.postTasks);
     assertNotNull(pc.tasks);
-    assertEquals(3, pc.tasks.size());
-
-    assertEquals(Task.Type.EXECUTE, pc.tasks.get(0).getType());
-    assertEquals(ExecuteTask.class, pc.tasks.get(0).getClass());
-    assertEquals("su - {hdfs-user} -c 'dosomething'",
-        ExecuteTask.class.cast(pc.tasks.get(0)).command);
-
-    assertEquals(Task.Type.CONFIGURE, pc.tasks.get(1).getType());
-    assertEquals(ConfigureTask.class, pc.tasks.get(1).getClass());
-    assertEquals("hdfs-site",
-        ConfigureTask.class.cast(pc.tasks.get(1)).configType);
-    assertEquals("myproperty",
-        ConfigureTask.class.cast(pc.tasks.get(1)).key);
-    assertEquals("mynewvalue",
-        ConfigureTask.class.cast(pc.tasks.get(1)).value);
-
-    assertEquals(Task.Type.MANUAL, pc.tasks.get(2).getType());
-    assertEquals(ManualTask.class, pc.tasks.get(2).getClass());
-    assertEquals("Update your database",
-        ManualTask.class.cast(pc.tasks.get(2)).message);
+    assertNull(pc.preDowngradeTasks);
+    assertNull(pc.postDowngradeTasks);
+    assertEquals(1, pc.tasks.size());
+
+    assertEquals(Task.Type.RESTART, pc.tasks.get(0).getType());
+    assertEquals(RestartTask.class, pc.tasks.get(0).getClass());
+
 
     assertTrue(up.getTasks().containsKey("ZOOKEEPER"));
     assertTrue(up.getTasks().get("ZOOKEEPER").containsKey("ZOOKEEPER_SERVER"));
 
     pc = up.getTasks().get("HDFS").get("DATANODE");
-    assertNotNull(pc.batch);
-//    assertEquals(Batch.Type.CONDITIONAL, pc.batch.getType());
-//    assertEquals(15, ConditionalBatch.class.cast(pc.batch).initial);
-//    assertEquals(50, ConditionalBatch.class.cast(pc.batch).remaining);
+    assertNotNull(pc.preDowngradeTasks);
+    assertEquals(0, pc.preDowngradeTasks.size());
+    assertNotNull(pc.postDowngradeTasks);
+    assertEquals(1, pc.postDowngradeTasks.size());
+
 
     pc = up.getTasks().get("ZOOKEEPER").get("ZOOKEEPER_SERVER");
     assertNotNull(pc.preTasks);
@@ -161,10 +137,6 @@ public class UpgradePackTest {
     assertEquals(1, pc.postTasks.size());
     assertNotNull(pc.tasks);
     assertEquals(1, pc.tasks.size());
-    assertNotNull(pc.batch);
-//    assertEquals(Batch.Type.COUNT, pc.batch.getType());
-//    assertEquals(2, CountBatch.class.cast(pc.batch).count);
-  */
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml
index bf608ec..2c57907 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml
@@ -104,9 +104,7 @@
           <task xsi:type="restart" />
         </upgrade>
         <post-upgrade>
-          <task xsi:type="execute">
-            <command>ls</command>
-          </task>
+          <task xsi:type="configure" />
         </post-upgrade>
       </component>
     </service>
@@ -135,9 +133,15 @@
         </post-upgrade>
       </component>
       <component name="DATANODE">
+        <pre-downgrade />
         <upgrade>
           <task xsi:type="restart" />
         </upgrade>
+        <post-downgrade>
+          <task xsi:type="manual">
+            <message>Manual Downgrade</message>
+          </task>
+        </post-downgrade>
       </component>
     </service>
     <service name="YARN">

Reply via email to