Repository: ambari
Updated Branches:
  refs/heads/trunk 4b3dc9d41 -> 1b54f56d5


AMBARI-19527. Downgrade executes <pre-upgrade> section if <pre-downgrade> is 
not defined (ncole)


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

Branch: refs/heads/trunk
Commit: 1b54f56d54ddc8a66293374b456c57136df1af60
Parents: 4b3dc9d
Author: Nate Cole <[email protected]>
Authored: Fri Jan 13 09:36:14 2017 -0500
Committer: Nate Cole <[email protected]>
Committed: Fri Jan 13 21:54:38 2017 -0500

----------------------------------------------------------------------
 .../server/stack/ModuleFileUnmarshaller.java    |  11 ++
 .../ambari/server/state/stack/UpgradePack.java  |  67 +++++++-
 .../stack/upgrade/StageWrapperBuilder.java      |   6 +-
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml |   2 +
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml |   9 +
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.5.xml |   8 +
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.6.xml |   9 +
 .../stacks/HDP/2.3/upgrades/upgrade-2.3.xml     |  13 ++
 .../stacks/HDP/2.3/upgrades/upgrade-2.4.xml     |   6 +
 .../stacks/HDP/2.3/upgrades/upgrade-2.5.xml     |  13 +-
 .../stacks/HDP/2.3/upgrades/upgrade-2.6.xml     |  11 ++
 .../HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml |   2 +
 .../HDP/2.4/upgrades/nonrolling-upgrade-2.5.xml |   8 +
 .../HDP/2.4/upgrades/nonrolling-upgrade-2.6.xml |   8 +
 .../stacks/HDP/2.4/upgrades/upgrade-2.4.xml     |   9 +
 .../stacks/HDP/2.4/upgrades/upgrade-2.5.xml     |   8 +
 .../stacks/HDP/2.4/upgrades/upgrade-2.6.xml     |   8 +
 .../HDP/2.5/upgrades/host-upgrade-2.5.xml       |   9 +
 .../HDP/2.5/upgrades/nonrolling-upgrade-2.5.xml |   2 +
 .../HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml |   4 +
 .../stacks/HDP/2.5/upgrades/upgrade-2.5.xml     |   9 +
 .../stacks/HDP/2.5/upgrades/upgrade-2.6.xml     |  10 ++
 .../HDP/2.6/upgrades/host-upgrade-2.6.xml       |   2 +
 .../HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml |   2 +
 .../stacks/HDP/2.6/upgrades/upgrade-2.6.xml     |   7 +
 .../src/main/resources/upgrade-pack.xsd         |  14 +-
 .../AmbariManagementControllerTest.java         |   2 +-
 .../state/stack/UpgradePackParsingTest.java     |  92 ++++++++++
 .../server/state/stack/UpgradePackTest.java     | 168 ++++++++++++-------
 .../HDP/2.1.1/upgrades/upgrade_bucket_test.xml  |   4 +
 .../upgrades/upgrade_component_tasks_test.xml   | 133 +++++++++++++++
 .../HDP/2.1.1/upgrades/upgrade_direction.xml    |   5 +
 .../upgrades/upgrade_nonrolling_new_stack.xml   |   6 +
 .../stacks/HDP/2.1.1/upgrades/upgrade_test.xml  |   8 +
 .../HDP/2.1.1/upgrades/upgrade_test_checks.xml  |   6 +
 .../HDP/2.1.1/upgrades/upgrade_test_partial.xml |   8 +
 .../HDP/2.1.1/upgrades/upgrade_to_new_stack.xml |  10 +-
 .../stacks/HDP/2.2.0/upgrades/upgrade_test.xml  |   7 +
 .../HDP/2.2.0/upgrades/upgrade_test_15388.xml   |   7 +
 .../HDP/2.2.0/upgrades/upgrade_test_checks.xml  |   6 +
 .../upgrades/upgrade_test_host_ordered.xml      |   2 +
 .../upgrades/upgrade_test_skip_failures.xml     |   2 +
 .../HDP/2.2.0/upgrades/upgrade_test_15388.xml   |   7 +
 43 files changed, 652 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/java/org/apache/ambari/server/stack/ModuleFileUnmarshaller.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/ModuleFileUnmarshaller.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/ModuleFileUnmarshaller.java
index d76d59f..94f196f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/ModuleFileUnmarshaller.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/ModuleFileUnmarshaller.java
@@ -45,6 +45,7 @@ import 
org.apache.ambari.server.state.stack.ServiceMetainfoXml;
 import org.apache.ambari.server.state.stack.StackMetainfoXml;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
@@ -133,6 +134,16 @@ public class ModuleFileUnmarshaller {
 
     try {
       return clz.cast(u.unmarshal(file));
+    } catch (Exception unmarshalException) {
+
+      Throwable cause = ExceptionUtils.getRootCause(unmarshalException);
+
+      LOG.error("Cannot parse {}", file.getAbsolutePath());
+      if (null != cause) {
+        LOG.error(cause.getMessage(), cause);
+      }
+
+      throw unmarshalException;
     } finally {
       IOUtils.closeQuietly(xsdStream);
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/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 76f1897..d8676bd 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
@@ -509,11 +509,11 @@ public class UpgradePack {
     @XmlElement(name="task")
     public List<Task> preTasks;
 
-    @XmlElementWrapper(name="pre-downgrade")
-    @XmlElement(name="task")
+    @XmlElement(name="pre-downgrade")
+    private DowngradeTasks preDowngradeXml;
+    @XmlTransient
     public List<Task> preDowngradeTasks;
 
-
     @XmlElementWrapper(name="upgrade")
     @XmlElement(name="task")
     public List<Task> tasks;
@@ -522,9 +522,53 @@ public class UpgradePack {
     @XmlElement(name="task")
     public List<Task> postTasks;
 
-    @XmlElementWrapper(name="post-downgrade")
-    @XmlElement(name="task")
+
+    @XmlElement(name="post-downgrade")
+    private DowngradeTasks postDowngradeXml;
+    @XmlTransient
     public List<Task> postDowngradeTasks;
+
+    /**
+     * This method verifies that if {@code pre-upgrade} is defined, that there 
is also
+     * a sibling {@code pre-downgrade} defined.  Similarly, {@code 
post-upgrade} must have a
+     * sibling {@code post-downgrade}.  This is because the JDK (include 1.8) 
JAXB doesn't
+     * support XSD xpath assertions for siblings.
+     *
+     * @param unmarshaller  the unmarshaller
+     * @param parent        the parent
+     */
+    void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
+      if (null != preDowngradeXml) {
+        preDowngradeTasks = preDowngradeXml.copyUpgrade ? preTasks :
+          preDowngradeXml.tasks;
+      }
+
+      if (null != postDowngradeXml) {
+        postDowngradeTasks = postDowngradeXml.copyUpgrade ? postTasks :
+          postDowngradeXml.tasks;
+      }
+
+      ProcessingService service = (ProcessingService) parent;
+
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Processing component {}/{} preUpgrade={} postUpgrade={} 
preDowngrade={} postDowngrade={}",
+            preTasks, preDowngradeTasks, postTasks, postDowngradeTasks);
+      }
+
+      if (null != preTasks && null == preDowngradeTasks) {
+        String error = String.format("Upgrade pack must contain pre-downgrade 
elements if "
+            + "pre-upgrade exists for processing component %s/%s", 
service.name, name);
+
+        throw new RuntimeException(error);
+      }
+
+      if (null != postTasks && null == postDowngradeTasks) {
+        String error = String.format("Upgrade pack must contain post-downgrade 
elements if "
+            + "post-upgrade exists for processing component %s/%s", 
service.name, name);
+
+        throw new RuntimeException(error);
+      }
+    }
   }
 
   /**
@@ -647,4 +691,17 @@ public class UpgradePack {
     @XmlValue
     public String value;
   }
+
+  /**
+   * A {@code (pre|post)-downgrade} can have an attribute as well as contain 
{@code task} elements.
+   */
+  private static class DowngradeTasks {
+
+    @XmlAttribute(name="copy-upgrade")
+    private boolean copyUpgrade = false;
+
+    @XmlElement(name="task")
+    private List<Task> tasks = new ArrayList<>();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/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 0b9cb3d..cfe4a78 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
@@ -214,12 +214,10 @@ public abstract class StageWrapperBuilder {
     if (forUpgrade) {
       interim = preTasks ? pc.preTasks : pc.postTasks;
     } else {
-      interim = preTasks ?
-        (null == pc.preDowngradeTasks ? pc.preTasks : pc.preDowngradeTasks) :
-        (null == pc.postDowngradeTasks ? pc.postTasks : pc.postDowngradeTasks);
+      interim = preTasks ? pc.preDowngradeTasks : pc.postDowngradeTasks;
     }
 
-    if (null == interim || interim.isEmpty()) {
+    if (CollectionUtils.isEmpty(interim)) {
       return Collections.emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
index d274135..396bf30 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
@@ -720,6 +720,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
index 8c9414a..8dff078 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
@@ -773,6 +773,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1124,6 +1126,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1138,6 +1142,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1148,6 +1154,9 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
+        
       </component>
     </service>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.5.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.5.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.5.xml
index fa6d46b..11cd31a 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.5.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.5.xml
@@ -913,6 +913,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1268,6 +1270,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1282,6 +1286,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1292,6 +1298,8 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.6.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.6.xml
index 42918ff..549e5a4 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.6.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.6.xml
@@ -918,6 +918,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1273,6 +1275,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1287,6 +1291,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1297,6 +1303,9 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
+        
       </component>
     </service>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
index a2286d8..6bf2d4c 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
@@ -449,6 +449,8 @@
             <function>stop</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -492,6 +494,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -590,6 +594,8 @@
           </task>
         </pre-upgrade>
 
+        <pre-downgrade copy-upgrade="true" />
+
         <upgrade>
           <task xsi:type="restart-task"/>
         </upgrade>
@@ -628,6 +634,8 @@
           <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't 
distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
           <task xsi:type="configure" 
id="hdp_2_3_4_0_hbase_remove_local_indexing"/>
         </pre-upgrade>
+        
+        <pre-downgrade />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -662,6 +670,9 @@
             <summary>Verifying LZO codec path for Tez</summary>
           </task>  
         </pre-upgrade>
+
+        <pre-downgrade copy-upgrade="true" />
+        
         <upgrade>
           <task xsi:type="restart-task"/>
         </upgrade>
@@ -811,6 +822,8 @@
 
           <task xsi:type="configure" id="increase_storm_zookeeper_timeouts"/>
         </pre-upgrade>
+        
+        <pre-downgrade />
 
         <upgrade>
           <task xsi:type="restart-task"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml
index c082e3b..0a7bcea 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml
@@ -510,6 +510,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -609,6 +611,8 @@
           </task>
         </pre-upgrade>
 
+        <pre-downgrade copy-upgrade="true" />
+
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -896,6 +900,8 @@
           <task xsi:type="configure" id="increase_storm_zookeeper_timeouts"/>
         </pre-upgrade>
 
+        <pre-downgrade />
+        
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.5.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.5.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.5.xml
index ec317a9..7827533 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.5.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.5.xml
@@ -612,7 +612,7 @@
           </task>
         </pre-upgrade>
 
-        <pre-downgrade/> <!--  no-op to prevent config changes on downgrade -->
+        <pre-downgrade /> <!--  no-op to prevent config changes on downgrade 
-->
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -713,6 +713,8 @@
             <summary>Verifying LZO codec path for mapreduce</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -870,6 +872,8 @@
         <pre-upgrade>
           <task xsi:type="configure" 
id="hdp_2_5_0_0_webhcat_server_update_configuration_paths"/>
         </pre-upgrade>
+        
+        <pre-downgrade />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1112,6 +1116,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1127,6 +1133,8 @@
           </task>
         </pre-upgrade>
 
+        <pre-downgrade copy-upgrade="true" />
+
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -1136,6 +1144,9 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
+        
       </component>
     </service>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.6.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.6.xml
index a0a7929..8101682 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.6.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.6.xml
@@ -715,6 +715,8 @@
             <summary>Verifying LZO codec path for mapreduce</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -872,6 +874,8 @@
         <pre-upgrade>
           <task xsi:type="configure" 
id="hdp_2_5_0_0_webhcat_server_update_configuration_paths"/>
         </pre-upgrade>
+        
+        <pre-downgrade />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1114,6 +1118,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1128,6 +1134,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1138,6 +1146,9 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
+        
       </component>
     </service>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
index b9a7e1e..1e6c18a 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
@@ -705,6 +705,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.5.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.5.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.5.xml
index d22e94a..8bee56d 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.5.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.5.xml
@@ -863,6 +863,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1218,6 +1220,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1232,6 +1236,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1242,6 +1248,8 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.6.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.6.xml
index 58ca724..23b2694 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.6.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.6.xml
@@ -872,6 +872,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1227,6 +1229,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1241,6 +1245,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -1251,6 +1257,8 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml
index 968e3b7..708c011 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml
@@ -463,6 +463,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -569,6 +571,8 @@
           </task>
         </pre-upgrade>
 
+        <pre-downgrade copy-upgrade="true" />
+
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -636,6 +640,9 @@
             <summary>Verifying LZO codec path for Tez</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
+        
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -793,6 +800,8 @@
 
           <task xsi:type="configure" id="increase_storm_zookeeper_timeouts"/>
         </pre-upgrade>
+        
+        <pre-downgrade />
 
         <upgrade>
           <task xsi:type="restart-task" />

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.5.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.5.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.5.xml
index 9c61c39..e6f952d 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.5.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.5.xml
@@ -714,6 +714,8 @@
           </task>
         </pre-upgrade>
 
+        <pre-downgrade copy-upgrade="true" />
+
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -1064,6 +1066,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1078,6 +1082,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1088,6 +1094,8 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
 
       </component>
     </service>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.6.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.6.xml
index 9b3ce4e..dc21124 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.6.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.6.xml
@@ -719,6 +719,8 @@
             <summary>Verifying LZO codec path for mapreduce</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1070,6 +1072,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1084,6 +1088,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -1094,6 +1100,8 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
 
       </component>
     </service>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/host-upgrade-2.5.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/host-upgrade-2.5.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/host-upgrade-2.5.xml
index 11c59e9..c180b61 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/host-upgrade-2.5.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/host-upgrade-2.5.xml
@@ -158,6 +158,8 @@
           </task>
         </pre-upgrade>
 
+        <pre-downgrade copy-upgrade="true" />
+
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -268,6 +270,8 @@
             <summary>Verifying LZO codec path for mapreduce</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -334,6 +338,9 @@
             <summary>Verifying LZO codec path for Tez</summary>
           </task>
         </pre-upgrade>
+
+        <pre-downgrade copy-upgrade="true" />
+
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -504,6 +511,8 @@
 
           <task xsi:type="configure" id="increase_storm_zookeeper_timeouts"/>
         </pre-upgrade>
+        
+        <pre-downgrade />
 
         <upgrade>
           <task xsi:type="restart-task" />

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.5.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.5.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.5.xml
index 6bca487..a1c9a16 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.5.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.5.xml
@@ -771,6 +771,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml
index 78418b0..09608a0 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml
@@ -775,6 +775,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -796,6 +798,8 @@
             <function>configure_atlas_user_for_tagsync</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.5.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.5.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.5.xml
index 076b45b..7205924 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.5.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.5.xml
@@ -511,6 +511,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -622,6 +624,8 @@
             <summary>Verifying LZO codec path for mapreduce</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -688,6 +692,9 @@
             <summary>Verifying LZO codec path for Tez</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
+        
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -864,6 +871,8 @@
 
           <task xsi:type="configure" id="increase_storm_zookeeper_timeouts"/>
         </pre-upgrade>
+        
+        <pre-downgrade />
 
         <upgrade>
           <task xsi:type="restart-task" />

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml
index 4abf0ec..949a174 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml
@@ -528,6 +528,8 @@
             <function>configure_atlas_user_for_tagsync</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -626,6 +628,8 @@
             <summary>Verifying LZO codec path for mapreduce</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -692,6 +696,9 @@
             <summary>Verifying LZO codec path for Tez</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
+        
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -775,6 +782,9 @@
         <pre-upgrade>
           <task xsi:type="configure" 
id="hdp_2_5_0_0_rename_spark_livy_configs" />
         </pre-upgrade>
+        
+        <pre-downgrade />
+        
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/host-upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/host-upgrade-2.6.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/host-upgrade-2.6.xml
index e7aace9..087482c 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/host-upgrade-2.6.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/host-upgrade-2.6.xml
@@ -152,6 +152,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
index 1c65f9b..5786695 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml
@@ -744,6 +744,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml
index eb4309a..a4719c1 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml
@@ -504,6 +504,8 @@
             <function>setup_ranger_java_patches</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -615,6 +617,8 @@
             <summary>Verifying LZO codec path for mapreduce</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task" />
@@ -681,6 +685,9 @@
             <summary>Verifying LZO codec path for Tez</summary>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
+        
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/main/resources/upgrade-pack.xsd
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/upgrade-pack.xsd 
b/ambari-server/src/main/resources/upgrade-pack.xsd
index 3963a2c..1f11aa1 100644
--- a/ambari-server/src/main/resources/upgrade-pack.xsd
+++ b/ambari-server/src/main/resources/upgrade-pack.xsd
@@ -354,6 +354,13 @@
       <xs:element name="task" type="abstract-task-type" minOccurs="0" 
maxOccurs="unbounded"/>
     </xs:sequence>
   </xs:complexType>
+
+  <xs:complexType name="downgrade-directive-type">
+    <xs:sequence>
+      <xs:element name="task" type="abstract-task-type" minOccurs="0" 
maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="copy-upgrade" use="optional" type="xs:boolean" />
+  </xs:complexType>
   
   <xs:complexType name="processing-type">
     <xs:sequence>
@@ -364,14 +371,15 @@
               <xs:complexType>
                 <xs:sequence>
                   <xs:element name="pre-upgrade" type="upgrade-directive-type" 
minOccurs="0"/>
-                  <xs:element name="pre-downgrade" 
type="upgrade-directive-type" minOccurs="0" />
+                  <xs:element name="pre-downgrade" 
type="downgrade-directive-type" minOccurs="0" />
                   <xs:element name="upgrade" type="upgrade-directive-type" 
minOccurs="1" />
                   <xs:element name="post-upgrade" 
type="upgrade-directive-type" minOccurs="0" />
-                  <xs:element name="post-downgrade" 
type="upgrade-directive-type" minOccurs="0" />
+                  <xs:element name="post-downgrade" 
type="downgrade-directive-type" minOccurs="0" />
                 </xs:sequence>
                 <!-- 
-                Want to use <xs:assert> to make sure that a pre-downgrade is 
available i
+                Want to use <xs:assert> to make sure that a pre-downgrade is 
available if
                 pre-upgrade is set.  It appears as though that is not yet 
available to jaxb.
+                See java implementation for the workaround for this.
                  -->
                 <xs:attribute name="name" type="xs:NMTOKEN" />
               </xs:complexType>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/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 50780e3..6e2190b 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
@@ -7284,7 +7284,7 @@ public class AmbariManagementControllerTest {
     Assert.assertEquals(1, responsesWithParams.size());
     StackVersionResponse resp = responsesWithParams.iterator().next();
     assertNotNull(resp.getUpgradePacks());
-    assertEquals(11, resp.getUpgradePacks().size());
+    assertEquals(12, resp.getUpgradePacks().size());
     assertTrue(resp.getUpgradePacks().contains("upgrade_test"));
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackParsingTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackParsingTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackParsingTest.java
new file mode 100644
index 0000000..04dfbd1
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackParsingTest.java
@@ -0,0 +1,92 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.state.stack;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.ambari.server.stack.ModuleFileUnmarshaller;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.FileFilterUtils;
+import org.apache.commons.io.filefilter.IOFileFilter;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * Tests parsing upgrade packs in the entire codebase.  This does not use Guice
+ * initialization, which will parse upgrade packs itself.
+ */
+@Category({ category.StackUpgradeTest.class})
+public class UpgradePackParsingTest {
+
+  @Test
+  @SuppressWarnings("unchecked")
+  public void findAndValidateUpgradePacks() throws Exception {
+
+    IOFileFilter filter = new IOFileFilter() {
+      @Override
+      public boolean accept(File dir, String name) {
+        return false;
+      }
+
+      @Override
+      public boolean accept(File file) {
+        // file has the folder named 'upgrades', ends with '.xml' and is NOT 
'config-upgrade.xml'
+        if (file.getAbsolutePath().contains("upgrades") &&
+            file.getAbsolutePath().endsWith(".xml") &&
+            !file.getAbsolutePath().contains("config-upgrade.xml")) {
+
+          return true;
+        }
+
+        return false;
+      }
+    };
+
+    List<File> files = new ArrayList<>();
+
+    files.addAll(FileUtils.listFiles(new File("src/main/resources/stacks"), 
filter,
+      FileFilterUtils.directoryFileFilter()));
+
+    files.addAll(FileUtils.listFiles(new File("src/test/resources/stacks"), 
filter,
+        FileFilterUtils.directoryFileFilter()));
+
+    files.addAll(FileUtils.listFiles(new 
File("src/test/resources/stacks_with_upgrade_cycle"), filter,
+        FileFilterUtils.directoryFileFilter()));
+
+    ModuleFileUnmarshaller unmarshaller = new ModuleFileUnmarshaller();
+
+    for (File file : files) {
+      String fileContent = FileUtils.readFileToString(file, "UTF-8");
+
+      // these things must be in upgrade packs for them to work anyway
+      if (fileContent.contains("<upgrade") && 
fileContent.contains("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";))
 {
+        if 
(!fileContent.contains("xsi:noNamespaceSchemaLocation=\"upgrade-pack.xsd\"")) {
+          String msg = String.format("File %s appears to be an upgrade pack, 
but does not define 'upgrade-pack.xsd' as its schema",
+              file.getAbsolutePath());
+          Assert.fail(msg);
+        } else {
+          unmarshaller.unmarshal(UpgradePack.class, file, true);
+        }
+      }
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/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 d9b1dd6..2d9a95f 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
@@ -23,8 +23,6 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import java.io.File;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -36,7 +34,6 @@ import java.util.Set;
 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.stack.ModuleFileUnmarshaller;
 import 
org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
 import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
 import org.apache.ambari.server.state.stack.upgrade.ClusterGrouping;
@@ -53,9 +50,6 @@ import 
org.apache.ambari.server.state.stack.upgrade.StopGrouping;
 import org.apache.ambari.server.state.stack.upgrade.Task;
 import org.apache.ambari.server.state.stack.upgrade.UpdateStackGrouping;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.FileFilterUtils;
-import org.apache.commons.io.filefilter.IOFileFilter;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -64,6 +58,7 @@ import org.junit.experimental.categories.Category;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.persist.PersistService;
@@ -93,59 +88,6 @@ public class UpgradePackTest {
   }
 
   @Test
-  @SuppressWarnings("unchecked")
-  public void findAndValidateUpgradePacks() throws Exception {
-
-    IOFileFilter filter = new IOFileFilter() {
-      @Override
-      public boolean accept(File dir, String name) {
-        return false;
-      }
-
-      @Override
-      public boolean accept(File file) {
-        // file has the folder named 'upgrades', ends with '.xml' and is NOT 
'config-upgrade.xml'
-        if (file.getAbsolutePath().contains("upgrades") &&
-            file.getAbsolutePath().endsWith(".xml") &&
-            !file.getAbsolutePath().contains("config-upgrade.xml")) {
-
-          return true;
-        }
-
-        return false;
-      }
-    };
-
-    List<File> files = new ArrayList<>();
-
-    files.addAll(FileUtils.listFiles(new File("src/main/resources/stacks"), 
filter,
-      FileFilterUtils.directoryFileFilter()));
-
-    files.addAll(FileUtils.listFiles(new File("src/test/resources/stacks"), 
filter,
-        FileFilterUtils.directoryFileFilter()));
-
-    files.addAll(FileUtils.listFiles(new 
File("src/test/resources/stacks_with_upgrade_cycle"), filter,
-        FileFilterUtils.directoryFileFilter()));
-
-    ModuleFileUnmarshaller unmarshaller = new ModuleFileUnmarshaller();
-
-    for (File file : files) {
-      String fileContent = FileUtils.readFileToString(file, "UTF-8");
-
-      // these things must be in upgrade packs for them to work anyway
-      if (fileContent.contains("<upgrade") && 
fileContent.contains("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";))
 {
-        if 
(!fileContent.contains("xsi:noNamespaceSchemaLocation=\"upgrade-pack.xsd\"")) {
-          String msg = String.format("File %s appears to be an upgrade pack, 
but does not define 'upgrade-pack.xsd' as its schema",
-              file.getAbsolutePath());
-          Assert.fail(msg);
-        } else {
-          unmarshaller.unmarshal(UpgradePack.class, file, true);
-        }
-      }
-    }
-  }
-
-  @Test
   public void testExistence() throws Exception {
     Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", 
"bar");
     assertTrue(upgrades.isEmpty());
@@ -192,10 +134,13 @@ public class UpgradePackTest {
     assertNotNull(pc.preTasks);
     assertNotNull(pc.postTasks);
     assertNotNull(pc.tasks);
-    assertNull(pc.preDowngradeTasks);
-    assertNull(pc.postDowngradeTasks);
+    assertNotNull(pc.preDowngradeTasks);
+    assertNotNull(pc.postDowngradeTasks);
     assertEquals(1, pc.tasks.size());
 
+    assertEquals(3, pc.preDowngradeTasks.size());
+    assertEquals(1, pc.postDowngradeTasks.size());
+
     assertEquals(Task.Type.RESTART, pc.tasks.get(0).getType());
     assertEquals(RestartTask.class, pc.tasks.get(0).getClass());
 
@@ -556,7 +501,7 @@ public class UpgradePackTest {
     ServiceCheckGrouping scGroup = (ServiceCheckGrouping) group;
     Set<String> priorityServices = scGroup.getPriorities();
     assertEquals(4, priorityServices.size());
-    Iterator serviceIterator = priorityServices.iterator();
+    Iterator<String> serviceIterator = priorityServices.iterator();
     assertEquals("ZOOKEEPER", serviceIterator.next());
     assertEquals("HBASE", serviceIterator.next());
 
@@ -609,6 +554,105 @@ public class UpgradePackTest {
     assertEquals(Grouping.class, upgradePack.getAllGroups().get(1).getClass());
   }
 
+  @Test
+  public void testDowngradeComponentTasks() throws Exception {
+    Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", 
"2.1.1");
+    UpgradePack upgradePack = upgrades.get("upgrade_component_tasks_test");
+    assertNotNull(upgradePack);
+
+    Map<String, Map<String, ProcessingComponent>> components = 
upgradePack.getTasks();
+    assertTrue(components.containsKey("ZOOKEEPER"));
+    assertTrue(components.containsKey("HDFS"));
+
+    Map<String, ProcessingComponent> zkMap = components.get("ZOOKEEPER");
+    Map<String, ProcessingComponent> hdfsMap = components.get("HDFS");
+
+    assertTrue(zkMap.containsKey("ZOOKEEPER_SERVER"));
+    assertTrue(zkMap.containsKey("ZOOKEEPER_CLIENT"));
+    assertTrue(hdfsMap.containsKey("NAMENODE"));
+    assertTrue(hdfsMap.containsKey("DATANODE"));
+    assertTrue(hdfsMap.containsKey("HDFS_CLIENT"));
+    assertTrue(hdfsMap.containsKey("JOURNALNODE"));
+
+    ProcessingComponent zkServer = zkMap.get("ZOOKEEPER_SERVER");
+    ProcessingComponent zkClient = zkMap.get("ZOOKEEPER_CLIENT");
+    ProcessingComponent hdfsNN = hdfsMap.get("NAMENODE");
+    ProcessingComponent hdfsDN = hdfsMap.get("DATANODE");
+    ProcessingComponent hdfsClient = hdfsMap.get("HDFS_CLIENT");
+    ProcessingComponent hdfsJN = hdfsMap.get("JOURNALNODE");
+
+    // ZK server has only pretasks defined, with pre-downgrade being a copy of 
pre-upgrade
+    assertNotNull(zkServer.preTasks);
+    assertNotNull(zkServer.preDowngradeTasks);
+    assertNull(zkServer.postTasks);
+    assertNull(zkServer.postDowngradeTasks);
+    assertEquals(1, zkServer.preTasks.size());
+    assertEquals(1, zkServer.preDowngradeTasks.size());
+
+    // ZK client has only post-tasks defined, with post-downgrade being a copy 
of pre-upgrade
+    assertNull(zkClient.preTasks);
+    assertNull(zkClient.preDowngradeTasks);
+    assertNotNull(zkClient.postTasks);
+    assertNotNull(zkClient.postDowngradeTasks);
+    assertEquals(1, zkClient.postTasks.size());
+    assertEquals(1, zkClient.postDowngradeTasks.size());
+
+    // NN has only pre-tasks defined, with an empty pre-downgrade
+    assertNotNull(hdfsNN.preTasks);
+    assertNotNull(hdfsNN.preDowngradeTasks);
+    assertNull(hdfsNN.postTasks);
+    assertNull(hdfsNN.postDowngradeTasks);
+    assertEquals(1, hdfsNN.preTasks.size());
+    assertEquals(0, hdfsNN.preDowngradeTasks.size());
+
+    // DN has only post-tasks defined, with post-downgrade being empty
+    assertNull(hdfsDN.preTasks);
+    assertNull(hdfsDN.preDowngradeTasks);
+    assertNotNull(hdfsDN.postTasks);
+    assertNotNull(hdfsDN.postDowngradeTasks);
+    assertEquals(1, hdfsDN.postTasks.size());
+    assertEquals(0, hdfsDN.postDowngradeTasks.size());
+
+    // HDFS client has only post and post-downgrade tasks
+    assertNull(hdfsClient.preTasks);
+    assertNotNull(hdfsClient.preDowngradeTasks);
+    assertNull(hdfsClient.postTasks);
+    assertNotNull(hdfsClient.postDowngradeTasks);
+    assertEquals(1, hdfsClient.preDowngradeTasks.size());
+    assertEquals(1, hdfsClient.postDowngradeTasks.size());
+
+    // JN has differing tasks for pre and post downgrade
+    assertNotNull(hdfsJN.preTasks);
+    assertNotNull(hdfsJN.preDowngradeTasks);
+    assertNotNull(hdfsJN.postTasks);
+    assertNotNull(hdfsJN.postDowngradeTasks);
+    assertEquals(1, hdfsJN.preTasks.size());
+    assertEquals(2, hdfsJN.preDowngradeTasks.size());
+    assertEquals(1, hdfsJN.postTasks.size());
+    assertEquals(2, hdfsJN.postDowngradeTasks.size());
+
+    // make sure all ids are accounted for
+
+    Set<String> allIds = Sets.newHashSet("some_id", "some_id1", "some_id2", 
"some_id3", "some_id4", "some_id5");
+
+    @SuppressWarnings("unchecked")
+    Set<List<Task>> allTasks = Sets.newHashSet(hdfsJN.preTasks, 
hdfsJN.preDowngradeTasks,
+        hdfsJN.postTasks, hdfsJN.postDowngradeTasks);
+
+    for (List<Task> list : allTasks) {
+      for (Task t : list) {
+        assertEquals(ConfigureTask.class, t.getClass());
+
+        ConfigureTask ct = (ConfigureTask) t;
+        assertTrue(allIds.contains(ct.id));
+
+        allIds.remove(ct.id);
+      }
+    }
+
+    assertTrue(allIds.isEmpty());
+  }
+
 
   private int indexOf(Map<String, ?> map, String keyToFind) {
     int result = -1;

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml
index 8ca9df4..48433fe 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml
@@ -58,6 +58,8 @@
           </task>
         </pre-upgrade>
         
+        <pre-downgrade copy-upgrade="true" />
+        
         <upgrade />
         
         <post-upgrade>
@@ -86,6 +88,8 @@
           
         </post-upgrade>
         
+        <post-downgrade copy-upgrade="true" />
+        
         
       </component>
     </service>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_component_tasks_test.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_component_tasks_test.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_component_tasks_test.xml
new file mode 100644
index 0000000..6cd9ce8
--- /dev/null
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_component_tasks_test.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:noNamespaceSchemaLocation="upgrade-pack.xsd">
+  <target>2.2.*.*</target>
+  <target-stack>HDP-2.2.0</target-stack>
+  <type>ROLLING</type>
+  <prerequisite-checks />
+  
+  <order>
+    <group name="ZOOKEEPER" title="Zookeeper">
+      <service name="ZOOKEEPER">
+        <component>ZOOKEEPER_SERVER</component>
+        <component>ZOOKEEPER_CLIENT</component>
+      </service>
+    </group>
+    
+    <group name="HDFS" title="HDFS">
+      <service name="HDFS">
+        <component>NAMENODE</component>
+        <component>DATANODE</component>
+        <component>HDFS_CLIENT</component>
+        <component>JOURNALNODE</component>
+      </service>
+    </group>
+  </order>
+  
+
+  <processing>
+    <service name="ZOOKEEPER">
+      <component name="ZOOKEEPER_SERVER">
+        <pre-upgrade>
+          <task xsi:type="manual">
+            <summary>SUMMARY OF PREPARE</summary>
+            <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
+          </task>
+        </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
+        <upgrade>
+          <task xsi:type="restart-task" />
+        </upgrade>
+      </component>
+      
+      <component name="ZOOKEEPER_CLIENT">
+        <upgrade />
+        
+        <post-upgrade>
+          <task xsi:type="configure" id="hdp_2_1_1_zookeeper_new_config_type" 
/>
+        </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
+      </component>
+      
+    </service>
+    
+    <service name="HDFS">
+      <component name="NAMENODE">
+        <pre-upgrade>
+          <task xsi:type="execute" hosts="master">
+            <script>foo</script>
+            <function>list</function>
+          </task>
+        </pre-upgrade>
+        <pre-downgrade />
+        <upgrade>
+          <task xsi:type="restart-task" />
+        </upgrade>
+      </component>
+      
+      <component name="DATANODE">
+        <upgrade>
+          <task xsi:type="restart-task" />
+        </upgrade>
+        <post-upgrade>
+          <task xsi:type="manual">
+            <message>Manual Downgrade</message>
+          </task>
+        </post-upgrade>
+        <post-downgrade />
+      </component>
+      
+      <component name="HDFS_CLIENT">
+        <pre-downgrade>
+          <task xsi:type="configure" id="some_id" />
+        </pre-downgrade>
+        <upgrade />
+        <post-downgrade>
+          <task xsi:type="configure" id="some_id" />
+        </post-downgrade>
+      </component>
+      
+      <component name="JOURNALNODE">
+        <pre-upgrade>
+          <task xsi:type="configure" id="some_id" />
+        </pre-upgrade>
+        
+        <pre-downgrade>
+          <task xsi:type="configure" id="some_id1" />
+          <task xsi:type="configure" id="some_id2" />
+        </pre-downgrade>
+        
+        <upgrade />
+        
+        <post-upgrade>
+          <task xsi:type="configure" id="some_id3" />
+        </post-upgrade>
+        
+        <post-downgrade>
+          <task xsi:type="configure" id="some_id4" />
+          <task xsi:type="configure" id="some_id5" />
+        </post-downgrade>
+        
+        
+        
+      </component>
+    </service>
+    
+
+  </processing>
+</upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml
index 802a04c..ab88df2 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml
@@ -88,12 +88,17 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
+        
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="foo" />
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
   </processing>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
index 018dab3..9d53714 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
@@ -935,6 +935,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -949,6 +951,8 @@
             <function>delete_storm_local_data</function>
           </task>
         </pre-upgrade>
+        
+        <pre-downgrade copy-upgrade="true" />
 
         <upgrade>
           <task xsi:type="restart-task"/>
@@ -959,6 +963,8 @@
             <message>Please rebuild your topology using the new Storm version 
dependencies and resubmit it using the newly created jar.</message>
           </task>
         </post-upgrade>
+        
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/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 cba7685..8d506bf 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
@@ -144,12 +144,14 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="hdp_2_1_1_zookeeper_new_config_type" 
/>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
     
@@ -165,6 +167,7 @@
             <message>{{direction.verb.proper}} your database</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -174,6 +177,7 @@
             <function>list</function>
           </task>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
       <component name="DATANODE">
         <pre-downgrade />
@@ -196,6 +200,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
       <component name="NODEMANAGER">
@@ -206,6 +211,7 @@
           </task>
           <task xsi:type="configure" id="hdp_2_1_1_nm_pre_upgrade"/>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
     </service>
@@ -222,6 +228,7 @@
           <task xsi:type="configure" 
id="hdp_2_1_1_hive_server_conditions_skip"/>
           <task xsi:type="configure" id="hdp_2_1_1_no_conditions_met"/>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
        </component>
      </service>
@@ -244,6 +251,7 @@
             <function>upgrade_oozie_database_and_sharelib</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
index 6476978..f82b025 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
@@ -145,12 +145,14 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="hdp_2_1_1_zk_post_upgrade"/>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
     <service name="HDFS">
@@ -165,6 +167,7 @@
             <message>Update your database</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -174,6 +177,7 @@
             <function>list</function>
           </task>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
       <component name="DATANODE">
         <pre-downgrade />
@@ -195,6 +199,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
       <component name="NODEMANAGER">
@@ -204,6 +209,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
     </service>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml
index 9348aa5..6e8745d 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml
@@ -157,12 +157,14 @@
             <message>This is only for partials</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="hdp_2_1_1_zookeeper_new_config_type" 
/>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
     
@@ -178,6 +180,7 @@
             <message>{{direction.verb.proper}} your database</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -187,6 +190,7 @@
             <function>list</function>
           </task>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
       <component name="DATANODE">
         <pre-downgrade />
@@ -209,6 +213,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
       <component name="NODEMANAGER">
@@ -219,6 +224,7 @@
           </task>
           <task xsi:type="configure" id="hdp_2_1_1_nm_pre_upgrade"/>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
     </service>
@@ -233,6 +239,7 @@
           <task xsi:type="configure" id="hdp_2_1_1_set_transport_mode"/>
           <task xsi:type="configure" id="hdp_2_1_1_hive_server_foo"/>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
        </component>
      </service>
@@ -255,6 +262,7 @@
             <function>upgrade_oozie_database_and_sharelib</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml
index f505220..fe387f3 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_to_new_stack.xml
@@ -142,11 +142,12 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
-        <post-upgrade>
-        </post-upgrade>
+        <post-upgrade />
+        <post-downgrade />
       </component>
     </service>
     
@@ -162,6 +163,7 @@
             <message>{{direction.verb.proper}} your database</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -171,6 +173,7 @@
             <function>list</function>
           </task>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
       <component name="DATANODE">
         <pre-downgrade />
@@ -193,6 +196,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
       <component name="NODEMANAGER">
@@ -202,6 +206,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
     </service>
@@ -216,6 +221,7 @@
 
           <task xsi:type="configure" id="hdp_2_1_1_test_properties"/>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
        </component>
      </service>    

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test.xml 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test.xml
index 7fe275f..c819d12 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test.xml
@@ -133,12 +133,14 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="foo" />
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
     
@@ -154,6 +156,7 @@
             <message>{{direction.verb.proper}} your database</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -163,6 +166,7 @@
             <function>list</function>
           </task>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
       <component name="DATANODE">
         <pre-downgrade />
@@ -185,6 +189,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
       <component name="NODEMANAGER">
@@ -194,6 +199,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
     </service>
@@ -206,6 +212,7 @@
             <message>The HiveServer port will now change to 10010 if hive is 
using a binary transfer mode or 10011 if hive is using an http transport mode. 
You can use "netstat -anp | grep 1001[01]" to determine if the port is 
available on each of following HiveServer host(s): {{hosts.all}}. If the port 
is not available, the process using it must be terminated.</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
        </component>
      </service>    

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_15388.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_15388.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_15388.xml
index 1f0d9bf..640ea0a 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_15388.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_15388.xml
@@ -144,12 +144,14 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="foo" />
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
 
@@ -166,6 +168,7 @@
             <message>{{direction.verb.proper}} your database</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -175,6 +178,7 @@
             <function>list</function>
           </task>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
       <component name="DATANODE">
         <pre-downgrade />
@@ -197,6 +201,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
       <component name="NODEMANAGER">
@@ -206,6 +211,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
     </service>
@@ -218,6 +224,7 @@
             <message>The HiveServer port will now change to 10010 if hive is 
using a binary transfer mode or 10011 if hive is using an http transport mode. 
You can use "netstat -anp | grep 1001[01]" to determine if the port is 
available on each of following HiveServer host(s): {{hosts.all}}. If the port 
is not available, the process using it must be terminated.</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
        </component>
      </service>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
index ed9391f..4d4d972 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
@@ -151,12 +151,14 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="hdp_2_2_0_zk_post_upgrade"/>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
     <service name="HDFS">
@@ -171,6 +173,7 @@
             <message>Update your database</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -180,6 +183,7 @@
             <function>list</function>
           </task>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
       <component name="DATANODE">
         <pre-downgrade />
@@ -201,6 +205,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
       <component name="NODEMANAGER">
@@ -210,6 +215,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
       </component>
     </service>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_host_ordered.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_host_ordered.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_host_ordered.xml
index 020a49f..6b9e086 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_host_ordered.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_host_ordered.xml
@@ -67,12 +67,14 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task"/>
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="foo" />
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
   </processing>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_skip_failures.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_skip_failures.xml
 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_skip_failures.xml
index dae1c16..ed0fdda 100644
--- 
a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_skip_failures.xml
+++ 
b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_skip_failures.xml
@@ -64,12 +64,14 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task"/>
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="foo" />
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
   </processing>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1b54f56d/ambari-server/src/test/resources/stacks_with_upgrade_cycle/HDP/2.2.0/upgrades/upgrade_test_15388.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/resources/stacks_with_upgrade_cycle/HDP/2.2.0/upgrades/upgrade_test_15388.xml
 
b/ambari-server/src/test/resources/stacks_with_upgrade_cycle/HDP/2.2.0/upgrades/upgrade_test_15388.xml
index 947f05a..8a02781 100644
--- 
a/ambari-server/src/test/resources/stacks_with_upgrade_cycle/HDP/2.2.0/upgrades/upgrade_test_15388.xml
+++ 
b/ambari-server/src/test/resources/stacks_with_upgrade_cycle/HDP/2.2.0/upgrades/upgrade_test_15388.xml
@@ -144,12 +144,14 @@
             <message>This is a manual task with a placeholder of 
{{foo/bar}}</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
         <post-upgrade>
           <task xsi:type="configure" id="foo"  />
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
     </service>
 
@@ -166,6 +168,7 @@
             <message>{{direction.verb.proper}} your database</message>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -175,6 +178,7 @@
             <function>list</function>
           </task>
         </post-upgrade>
+        <post-downgrade copy-upgrade="true" />
       </component>
       <component name="DATANODE">
         <pre-downgrade />
@@ -197,6 +201,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -208,6 +213,7 @@
             <function>list</function>
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade>
           <task xsi:type="restart-task" />
         </upgrade>
@@ -225,6 +231,7 @@
           <task xsi:type="configure" id="foo">
           </task>
         </pre-upgrade>
+        <pre-downgrade copy-upgrade="true" />
         <upgrade />
        </component>
      </service>

Reply via email to