AMBARI-13378. Stop-and-Start Upgrade: Merge feature branch to trunk. (dgrinenko 
via dlysnichenko)


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

Branch: refs/heads/trunk
Commit: c58162fe3538f8e4d67ad11da6f7d3c8940012a6
Parents: fa6f80a
Author: Lisnichenko Dmitro <dlysniche...@hortonworks.com>
Authored: Mon Oct 12 15:18:50 2015 +0300
Committer: Lisnichenko Dmitro <dlysniche...@hortonworks.com>
Committed: Mon Oct 12 15:20:44 2015 +0300

----------------------------------------------------------------------
 .../server/api/services/AmbariMetaInfo.java     |  21 +-
 .../server/checks/AbstractCheckDescriptor.java  |  56 +-
 .../server/checks/ClientRetryPropertyCheck.java |  17 +-
 .../server/checks/ConfigurationMergeCheck.java  |  29 +-
 .../HiveDynamicServiceDiscoveryCheck.java       |  15 +-
 .../checks/HiveMultipleMetastoreCheck.java      |  13 +-
 .../server/checks/HostsHeartbeatCheck.java      |   2 +-
 .../checks/HostsMasterMaintenanceCheck.java     |  15 +-
 .../checks/HostsRepositoryVersionCheck.java     |  11 +-
 ...apReduce2JobHistoryStatePreservingCheck.java |   7 +-
 .../checks/SecondaryNamenodeDeletedCheck.java   |  15 +-
 .../checks/ServicesMaintenanceModeCheck.java    |   3 +-
 .../ServicesMapReduceDistributedCacheCheck.java |  10 +-
 .../ServicesNamenodeHighAvailabilityCheck.java  |  13 +-
 .../checks/ServicesNamenodeTruncateCheck.java   |  11 +-
 .../ServicesTezDistributedCacheCheck.java       |  10 +-
 .../ambari/server/checks/ServicesUpCheck.java   |   4 +-
 .../checks/ServicesYarnWorkPreservingCheck.java |  14 +-
 .../ambari/server/checks/UpgradeCheck.java      |   8 +
 .../server/checks/UpgradeCheckRegistry.java     |  19 +
 .../checks/YarnRMHighAvailabilityCheck.java     |  13 +-
 .../YarnTimelineServerStatePreservingCheck.java |   7 +-
 .../AmbariCustomCommandExecutionHelper.java     |  13 +-
 .../AmbariManagementControllerImpl.java         |   6 +-
 .../server/controller/PrereqCheckRequest.java   |  20 +-
 .../ClusterStackVersionResourceProvider.java    |   6 +-
 ...atibleRepositoryVersionResourceProvider.java |   3 -
 .../PreUpgradeCheckResourceProvider.java        |  47 +-
 .../RepositoryVersionResourceProvider.java      | 102 ++-
 .../internal/UpgradeResourceProvider.java       | 246 ++++--
 .../ambari/server/metadata/ActionMetadata.java  |   4 +-
 .../server/orm/dao/ClusterVersionDAO.java       |  23 +
 .../apache/ambari/server/orm/dao/CrudDAO.java   |  15 +
 .../ambari/server/orm/dao/HostVersionDAO.java   |  42 +-
 .../server/orm/dao/RepositoryVersionDAO.java    |   6 +-
 .../ambari/server/orm/dao/UpgradeDAO.java       |  19 +-
 .../orm/entities/RepositoryVersionEntity.java   |  18 +-
 .../server/orm/entities/UpgradeEntity.java      |  89 ++
 .../serveraction/upgrades/ConfigureAction.java  |  23 +-
 .../upgrades/UpdateDesiredStackAction.java      | 139 ++++
 .../server/stack/ModuleFileUnmarshaller.java    |   4 +-
 .../server/stack/StackDefinitionDirectory.java  |   2 +
 .../ambari/server/stack/StackDirectory.java     |  52 +-
 .../apache/ambari/server/stack/StackModule.java |   2 +-
 .../apache/ambari/server/state/StackInfo.java   |  31 +-
 .../ambari/server/state/UpgradeContext.java     |  50 +-
 .../ambari/server/state/UpgradeHelper.java      | 151 +++-
 .../server/state/stack/ConfigUpgradePack.java   | 192 +++++
 .../ambari/server/state/stack/UpgradePack.java  | 114 ++-
 .../state/stack/upgrade/ClusterGrouping.java    |  27 +-
 .../upgrade/ConfigUpgradeChangeDefinition.java  | 420 ++++++++++
 .../state/stack/upgrade/ConfigureTask.java      | 335 ++------
 .../server/state/stack/upgrade/ExecuteTask.java |  12 +
 .../server/state/stack/upgrade/Grouping.java    |  37 +-
 .../server/state/stack/upgrade/ManualTask.java  |   4 +
 .../stack/upgrade/RepositoryVersionHelper.java  |  43 +-
 .../state/stack/upgrade/RestartGrouping.java    |  36 +
 .../server/state/stack/upgrade/RestartTask.java |  14 +-
 .../state/stack/upgrade/ServerActionTask.java   |   4 +
 .../stack/upgrade/ServerSideActionTask.java     |   7 +
 .../stack/upgrade/ServiceCheckGrouping.java     |  46 +-
 .../state/stack/upgrade/ServiceCheckTask.java   |  12 +
 .../state/stack/upgrade/StageWrapper.java       |   6 +-
 .../stack/upgrade/StageWrapperBuilder.java      |  12 +-
 .../state/stack/upgrade/StartGrouping.java      |  36 +
 .../server/state/stack/upgrade/StartTask.java   |  53 ++
 .../state/stack/upgrade/StopGrouping.java       |  36 +
 .../server/state/stack/upgrade/StopTask.java    |  53 ++
 .../ambari/server/state/stack/upgrade/Task.java |  22 +-
 .../stack/upgrade/UpdateStackGrouping.java      |  36 +
 .../state/stack/upgrade/UpgradeFunction.java    |  26 +
 .../server/state/stack/upgrade/UpgradeType.java |  36 +
 .../svccomphost/ServiceComponentHostImpl.java   |   1 -
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |   3 +-
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |   3 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |   3 +-
 .../Ambari-DDL-Postgres-EMBEDDED-CREATE.sql     |   3 +-
 .../resources/Ambari-DDL-SQLServer-CREATE.sql   |   3 +-
 .../0.96.0.2.0/package/scripts/hbase_upgrade.py |   6 +-
 .../HDFS/2.1.0.2.0/package/scripts/namenode.py  |  15 +
 .../HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml | 383 +++++++++
 .../stacks/HDP/2.2/upgrades/config-upgrade.xml  |  55 ++
 .../HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml | 469 +++++++++++
 .../stacks/HDP/2.2/upgrades/upgrade-2.2.xml     |  41 +-
 .../stacks/HDP/2.2/upgrades/upgrade-2.3.xml     | 637 ++-------------
 .../stacks/HDP/2.3/upgrades/config-upgrade.xml  | 807 +++++++++++++++++++
 .../stacks/HDP/2.3/upgrades/upgrade-2.3.xml     |  41 +-
 .../checks/ConfigurationMergeCheckTest.java     |  30 -
 .../checks/HostsMasterMaintenanceCheckTest.java |  14 +-
 .../checks/HostsRepositoryVersionCheckTest.java |   5 +-
 .../SecondaryNamenodeDeletedCheckTest.java      |  16 +-
 ...vicesMapReduceDistributedCacheCheckTest.java |  14 +-
 ...rvicesNamenodeHighAvailabilityCheckTest.java |  10 +-
 .../ServicesNamenodeTruncateCheckTest.java      |   8 +-
 .../ServicesTezDistributedCacheCheckTest.java   |  15 +-
 .../ServicesYarnWorkPreservingCheckTest.java    |  10 +-
 .../checks/UpgradeCheckStackVersionTest.java    | 170 ----
 .../AmbariManagementControllerTest.java         |   2 +-
 ...leRepositoryVersionResourceProviderTest.java |  16 +
 .../RepositoryVersionResourceProviderTest.java  | 109 ++-
 .../UpgradeResourceProviderHDP22Test.java       |   3 +-
 .../internal/UpgradeResourceProviderTest.java   |  66 +-
 .../apache/ambari/server/orm/OrmTestHelper.java |   2 +-
 .../ambari/server/orm/dao/CrudDAOTest.java      |   1 -
 .../orm/dao/RepositoryVersionDAOTest.java       |   8 +-
 .../ambari/server/orm/dao/UpgradeDAOTest.java   |  10 +-
 .../upgrades/ConfigureActionTest.java           |  39 +-
 .../upgrades/UpgradeActionTest.java             |   6 +-
 .../ambari/server/state/UpgradeHelperTest.java  | 162 ++--
 .../state/stack/ConfigUpgradePackTest.java      | 198 +++++
 .../server/state/stack/UpgradePackTest.java     | 190 +++--
 .../stack/upgrade/StageWrapperBuilderTest.java  |   4 +-
 .../stacks/2.0.6/HBASE/test_hbase_master.py     |   2 +-
 .../HDP/2.1.1/upgrades/config-upgrade.xml       | 101 +++
 .../HDP/2.1.1/upgrades/upgrade_bucket_test.xml  |  17 +-
 .../HDP/2.1.1/upgrades/upgrade_direction.xml    |   6 +-
 .../stacks/HDP/2.1.1/upgrades/upgrade_test.xml  |  61 +-
 .../HDP/2.1.1/upgrades/upgrade_test_checks.xml  |  30 +-
 .../2.1.1/upgrades/upgrade_test_nonrolling.xml  | 182 +++++
 .../HDP/2.1.1/upgrades/upgrade_to_new_stack.xml |  24 +-
 .../HDP/2.2.0/upgrades/config-upgrade.xml       | 101 +++
 .../stacks/HDP/2.2.0/upgrades/upgrade_test.xml  |  21 +-
 .../HDP/2.2.0/upgrades/upgrade_test_checks.xml  |  30 +-
 123 files changed, 5244 insertions(+), 1954 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index 561b3f4..e35e7ac 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -60,6 +60,7 @@ import 
org.apache.ambari.server.state.kerberos.KerberosServiceDescriptorFactory;
 import org.apache.ambari.server.state.stack.Metric;
 import org.apache.ambari.server.state.stack.MetricDefinition;
 import org.apache.ambari.server.state.stack.OsFamily;
+import org.apache.ambari.server.state.stack.ConfigUpgradePack;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -997,7 +998,7 @@ public class AmbariMetaInfo {
     }
 
     return alertDefinitionFactory.getAlertDefinitions(alertsFile,
-        service.getName());
+            service.getName());
   }
 
   /**
@@ -1206,6 +1207,24 @@ public class AmbariMetaInfo {
   }
 
   /**
+   * Get all upgrade config pack if it is available for a stack.
+   *
+   * @param stackName the stack name
+   * @param stackVersion the stack version
+   * @return config upgrade pack for stack or null if it is
+   * not defined for stack
+   */
+  public ConfigUpgradePack getConfigUpgradePack(String stackName, String 
stackVersion) {
+    try {
+      StackInfo stack = getStack(stackName, stackVersion);
+      return stack.getConfigUpgradePack();
+    } catch (AmbariException e) {
+      LOG.debug("Cannot load config upgrade pack for non-existent stack 
{}-{}", stackName, stackVersion, e);
+      return null;
+    }
+  }
+
+  /**
    * Gets the fully compiled Kerberos descriptor for the relevant stack and 
version.
    * <p/>
    * All of the kerberos.json files from the specified stack (and version) are 
read, parsed and

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
index 2f0bc94..760a971 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
@@ -18,7 +18,9 @@
 package org.apache.ambari.server.checks;
 
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
@@ -82,7 +84,7 @@ public abstract class AbstractCheckDescriptor {
 
   /**
    * Tests if the prerequisite check is applicable to given cluster. This
-   * method's defautl logic is to ensure that the cluster stack source and
+   * method's default logic is to ensure that the cluster stack source and
    * target are compatible with the prerequisite check. When overridding this
    * method, call {@code super#isApplicable(PrereqCheckRequest)}.
    *
@@ -94,26 +96,36 @@ public abstract class AbstractCheckDescriptor {
    *           if server error happens
    */
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    StackId sourceStackId = getSourceStack();
-    StackId targetStackId = getTargetStack();
-
-    if( null == sourceStackId && null == targetStackId ) {
-      return true;
-    }
-
-    StackId requestSourceStack = request.getSourceStackId();
-    if (null != sourceStackId && null != requestSourceStack
-        && sourceStackId.compareTo(requestSourceStack) > 0) {
-      return false;
-    }
+    // this is default behaviour
+   return true;
+  }
 
-    StackId requestTargetStack = request.getTargetStackId();
-    if (null != targetStackId && null != requestTargetStack
-        && targetStackId.compareTo(requestTargetStack) < 0) {
-      return false;
+  /**
+   * Same like {@code isApplicable(PrereqCheckRequest request)}, but with 
service presence check
+   * @param request
+   *          prerequisite check request
+   * @param requiredServices
+   *          set of services, which need to be present to allow check 
execution
+   * @param requiredAll
+   *          require all services in the list or at least one need to present
+   * @return true if check should be performed
+   * @throws org.apache.ambari.server.AmbariException
+   *           if server error happens
+   */
+  public boolean isApplicable(PrereqCheckRequest request, List<String> 
requiredServices, boolean requiredAll) throws AmbariException {
+    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
+    Set<String> services = cluster.getServices().keySet();
+    boolean serviceFound = false;
+
+    for (String service : requiredServices) {
+      if (services.contains(service) && !requiredAll) {
+        serviceFound = true;
+      } else if (!services.contains(service) && requiredAll) {
+        return false;
+      }
     }
 
-    return true;
+    return !(!serviceFound && !requiredAll);
   }
 
   /**
@@ -292,4 +304,12 @@ public abstract class AbstractCheckDescriptor {
 
     return formatted.toString();
   }
+
+  /**
+   * Return the optionality flag of the Upgrade Check
+   * @return
+   */
+  public Boolean isRequired(){
+      return getClass().getAnnotation(UpgradeCheck.class).required();
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java
index 52fca40..368bcb8 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java
@@ -18,6 +18,7 @@
 package org.apache.ambari.server.checks;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -36,7 +37,7 @@ import com.google.inject.Singleton;
  * client retry properties for HDFS, HIVE, and OOZIE are set.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.CLIENT_RETRY_PROPERTY)
+@UpgradeCheck(group = UpgradeCheckGroup.CLIENT_RETRY_PROPERTY, required = true)
 public class ClientRetryPropertyCheck extends AbstractCheckDescriptor {
 
   static final String HIVE_CLIENT_RETRY_MISSING_KEY = 
"hive.client.retry.missing.key";
@@ -54,19 +55,7 @@ public class ClientRetryPropertyCheck extends 
AbstractCheckDescriptor {
    */
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    Map<String, Service> services = cluster.getServices();
-
-    if (services.containsKey("HDFS") || services.containsKey("HIVE")
-        || services.containsKey("OOZIE")) {
-      return true;
-    }
-
-    return false;
+    return super.isApplicable(request, Arrays.asList("HDFS", "HIVE", "OOZIE"), 
false);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java
index b81ca11..a47512e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java
@@ -39,7 +39,7 @@ import com.google.inject.Singleton;
  * Checks for configuration merge conflicts.
  */
 @Singleton
-@UpgradeCheck(order = 99.0f)
+@UpgradeCheck(order = 99.0f, required = true)
 public class ConfigurationMergeCheck extends AbstractCheckDescriptor {
 
   @Inject
@@ -49,33 +49,6 @@ public class ConfigurationMergeCheck extends 
AbstractCheckDescriptor {
     super(CheckDescription.CONFIG_MERGE);
   }
 
-  @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    String stackName = request.getTargetStackId().getStackName();
-    String repoVersion = request.getRepositoryVersion();
-    if (null == repoVersion) {
-      return false;
-    }
-
-    RepositoryVersionEntity rve = 
repositoryVersionDaoProvider.get().findByStackNameAndVersion(stackName, 
repoVersion);
-    if (null == rve) {
-      return false;
-    }
-
-    Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-
-    if (rve.getStackId().equals(cluster.getCurrentStackVersion())) {
-      return false;
-    }
-
-    return true;
-  }
-
-
   /**
    * The following logic determines if a warning is generated for config merge
    * issues:

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
index 4ea5484..d8f51a2 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
@@ -18,6 +18,7 @@
 package org.apache.ambari.server.checks;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -37,7 +38,7 @@ import com.google.inject.Singleton;
  * is properly configured for dynamic discovery.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f, required = true)
 public class HiveDynamicServiceDiscoveryCheck extends AbstractCheckDescriptor {
 
   static final String HIVE_DYNAMIC_SERVICE_DISCOVERY_ENABLED_KEY = 
"hive.dynamic-service.discovery.enabled.key";
@@ -56,17 +57,7 @@ public class HiveDynamicServiceDiscoveryCheck extends 
AbstractCheckDescriptor {
    */
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    Map<String, Service> services = cluster.getServices();
-    if (services.containsKey("HIVE")) {
-      return true;
-    }
-
-    return false;
+    return super.isApplicable(request, Arrays.asList("HIVE"), true);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
index c387a4b..14b8435 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Arrays;
 import java.util.Map;
 
 import org.apache.ambari.server.AmbariException;
@@ -51,17 +52,7 @@ public class HiveMultipleMetastoreCheck extends 
AbstractCheckDescriptor {
    */
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    Map<String, Service> services = cluster.getServices();
-    if (!services.containsKey("HIVE")) {
-      return false;
-    }
-
-    return true;
+    return super.isApplicable(request, Arrays.asList("HIVE"), true);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
index a8600c4..a6811cb 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
@@ -43,7 +43,7 @@ import com.google.inject.Singleton;
  * {@link PrereqCheckStatus#WARNING} for any hosts in maintenance mode.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 1.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 1.0f, required = 
true)
 public class HostsHeartbeatCheck extends AbstractCheckDescriptor {
 
   static final String KEY_HOSTS_IN_MM_WARNING = "key.hosts.in.mm.warning";

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
index ef93337..39ab39f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
@@ -40,7 +40,7 @@ import com.google.inject.Singleton;
  * Checks that all hosts in maintenance state do not have master components.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 1.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 1.0f, 
required = true)
 public class HostsMasterMaintenanceCheck extends AbstractCheckDescriptor {
 
   static final String KEY_NO_UPGRADE_NAME = "no_upgrade_name";
@@ -54,21 +54,14 @@ public class HostsMasterMaintenanceCheck extends 
AbstractCheckDescriptor {
   }
 
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    return request.getRepositoryVersion() != null;
-  }
-
-  @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     final StackId stackId = cluster.getDesiredStackVersion();
     final Set<String> hostsWithMasterComponent = new HashSet<String>();
-    final String upgradePackName = 
repositoryVersionHelper.get().getUpgradePackageName(stackId.getStackName(), 
stackId.getStackVersion(), request.getRepositoryVersion());
+
+    // TODO AMBARI-12698, need to pass the upgrade pack to use in the request, 
or at least the type.
+    final String upgradePackName = 
repositoryVersionHelper.get().getUpgradePackageName(stackId.getStackName(), 
stackId.getStackVersion(), request.getRepositoryVersion(), null);
     if (upgradePackName == null) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       String fail = getFailReason(KEY_NO_UPGRADE_NAME, prerequisiteCheck, 
request);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java
index eaa0096..00862ac 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java
@@ -41,7 +41,7 @@ import com.google.inject.Singleton;
  * orchstration, so no warning is required.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.REPOSITORY_VERSION)
+@UpgradeCheck(group = UpgradeCheckGroup.REPOSITORY_VERSION, required = true)
 public class HostsRepositoryVersionCheck extends AbstractCheckDescriptor {
 
   static final String KEY_NO_REPO_VERSION = "no_repo_version";
@@ -54,15 +54,6 @@ public class HostsRepositoryVersionCheck extends 
AbstractCheckDescriptor {
   }
 
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    return request.getRepositoryVersion() != null;
-  }
-
-  @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request)
       throws AmbariException {
     final String clusterName = request.getClusterName();

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
index 5f02c4f..af134d8 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
@@ -28,6 +28,7 @@ import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.commons.lang.StringUtils;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -87,15 +88,11 @@ public class MapReduce2JobHistoryStatePreservingCheck 
extends AbstractCheckDescr
    */
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
+    if (!super.isApplicable(request, Arrays.asList("MAPREDUCE2"), true)) {
       return false;
     }
 
     final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    Map<String, Service> services = cluster.getServices();
-    if (!services.containsKey("MAPREDUCE2")) {
-      return false;
-    }
 
     // Applicable only if stack not defined in MinimumApplicableStackVersion, 
or
     // version equals or exceeds the enumerated version.

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
index 493042f..d7c27d7 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -53,14 +54,7 @@ public class SecondaryNamenodeDeletedCheck extends 
AbstractCheckDescriptor {
 
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    try {
-      cluster.getService("HDFS");
-    } catch (ServiceNotFoundException ex) {
+    if (!super.isApplicable(request, Arrays.asList("HDFS"), true)) {
       return false;
     }
 
@@ -72,6 +66,11 @@ public class SecondaryNamenodeDeletedCheck extends 
AbstractCheckDescriptor {
     return true;
   }
 
+  // TODO AMBARI-12698, there are 2 ways to filter the prechecks.
+  // 1. Explictly mention them in each upgrade pack, which is more flexible, 
but requires adding the name of checks
+  //   to perform in each upgrade pack.
+  // 2. Make each upgrade check class call a function before perform() that 
will determine if the check is appropriate
+  //   given the type of upgrade. The PrereqCheckRequest object has a field 
for the type of upgrade.
   @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
     Set<String> hosts = new HashSet<String>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
index 5108afd..8d578d8 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
@@ -24,7 +24,6 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.Service;
-import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
@@ -34,7 +33,7 @@ import com.google.inject.Singleton;
  * Checks that services are in the maintenance mode.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 2.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 2.0f, 
required = true)
 public class ServicesMaintenanceModeCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
index be5d11a..2359919 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
@@ -18,6 +18,7 @@
 package org.apache.ambari.server.checks;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -48,14 +49,7 @@ public class ServicesMapReduceDistributedCacheCheck extends 
AbstractCheckDescrip
   public boolean isApplicable(PrereqCheckRequest request)
     throws AmbariException {
 
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    try {
-      cluster.getService("YARN");
-    } catch (ServiceNotFoundException ex) {
+    if (!super.isApplicable(request, Arrays.asList("YARN"), true)) {
       return false;
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
index d92f12d..44e183d 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Arrays;
 import java.util.Map;
 
 import org.apache.ambari.server.AmbariException;
@@ -46,17 +47,7 @@ public class ServicesNamenodeHighAvailabilityCheck extends 
AbstractCheckDescript
 
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    try {
-      cluster.getService("HDFS");
-    } catch (ServiceNotFoundException ex) {
-      return false;
-    }
-    return true;
+    return super.isApplicable(request, Arrays.asList("HDFS"), true);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
index 51369c9..3761d99 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
@@ -28,6 +28,8 @@ import org.apache.ambari.server.utils.VersionUtils;
 
 import com.google.inject.Singleton;
 
+import java.util.Arrays;
+
 /**
  * Checks that namenode high availability is enabled.
  */
@@ -44,14 +46,7 @@ public class ServicesNamenodeTruncateCheck extends 
AbstractCheckDescriptor {
 
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    try {
-      cluster.getService("HDFS");
-    } catch (ServiceNotFoundException ex) {
+    if (!super.isApplicable(request, Arrays.asList("HDFS"), true)) {
       return false;
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
index 68a7103..70a9b1b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
@@ -18,6 +18,7 @@
 package org.apache.ambari.server.checks;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -48,14 +49,7 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
 
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    try {
-      cluster.getService("TEZ");
-    } catch (ServiceNotFoundException ex) {
+    if (!super.isApplicable(request, Arrays.asList("TEZ"), true)) {
       return false;
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
index 70b8884..09ad55d 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
@@ -44,7 +44,7 @@ import com.google.inject.Singleton;
  * Checks that services are up.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 2.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 2.0f, required = 
true)
 public class ServicesUpCheck extends AbstractCheckDescriptor {
 
   private static final float SLAVE_THRESHOLD = 0.5f;
@@ -150,4 +150,4 @@ public class ServicesUpCheck extends 
AbstractCheckDescriptor {
     }
   }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
index a0b2b59..062c11f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
@@ -27,6 +27,8 @@ import org.apache.commons.lang.BooleanUtils;
 
 import com.google.inject.Singleton;
 
+import java.util.Arrays;
+
 /**
  * Checks that YARN has work-preserving restart enabled.
  */
@@ -46,17 +48,7 @@ public class ServicesYarnWorkPreservingCheck extends 
AbstractCheckDescriptor {
    */
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    try {
-      cluster.getService("YARN");
-    } catch (ServiceNotFoundException ex) {
-      return false;
-    }
-    return true;
+    return super.isApplicable(request, Arrays.asList("YARN"), true);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
index 9fa8916..9e43560 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
@@ -55,4 +55,12 @@ public @interface UpgradeCheck {
    * @return the order, or {@code 1.0f} if not specified.
    */
   float order() default 1.0f;
+
+  /**
+   * Gets whether the pre-upgrade check is required.
+   * By default, a pre-upgrade check needs to be declared in the upgrade pack. 
This flag will override that setting.
+   *
+   * @return  flag state, or {@code true} if not specified
+   */
+  boolean required() default false;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
index 8be572c..4ed345c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
@@ -24,6 +24,7 @@ import java.util.Set;
 import java.util.TreeSet;
 
 import com.google.inject.Singleton;
+import org.apache.ambari.server.state.stack.UpgradePack;
 
 /**
  * The {@link UpgradeCheckRegistry} contains the ordered list of all 
pre-upgrade
@@ -59,6 +60,24 @@ public class UpgradeCheckRegistry {
   }
 
   /**
+   * Gets an ordered and filtered list of the upgrade checks.
+   * @param upgradePack Upgrade pack object with the list of required checks 
to be included
+   * @return
+   */
+  public List<AbstractCheckDescriptor> getFilteredUpgradeChecks(UpgradePack 
upgradePack){
+    List<String> prerequisiteChecks = upgradePack.getPrerequisiteChecks();
+    List<AbstractCheckDescriptor> resultCheckDescriptor = new 
ArrayList<AbstractCheckDescriptor>();
+    for (AbstractCheckDescriptor descriptor: m_upgradeChecks){
+      if (descriptor.isRequired()){
+        resultCheckDescriptor.add(descriptor);
+      } else if (prerequisiteChecks.contains(descriptor.getClass().getName())){
+        resultCheckDescriptor.add(descriptor);
+      }
+    }
+    return resultCheckDescriptor;
+  }
+
+  /**
    * THe {@link PreUpgradeCheckComparator} class is used to compare
    * {@link AbstractCheckDescriptor} based on their {@link UpgradeCheck}
    * annotations.

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
index bf25f9f..9f3bd6e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Arrays;
 import java.util.Map;
 
 import org.apache.ambari.server.AmbariException;
@@ -49,17 +50,7 @@ public class YarnRMHighAvailabilityCheck extends 
AbstractCheckDescriptor {
    */
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    Map<String, Service> services = cluster.getServices();
-    if (!services.containsKey("YARN")) {
-      return false;
-    }
-
-    return true;
+    return super.isApplicable(request, Arrays.asList("YARN"), true);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
index eca0967..03528c2 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Arrays;
 import java.util.Map;
 
 import org.apache.ambari.server.AmbariException;
@@ -81,15 +82,11 @@ public class YarnTimelineServerStatePreservingCheck extends 
AbstractCheckDescrip
    */
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request)) {
+    if (!super.isApplicable(request, Arrays.asList("YARN"), true)) {
       return false;
     }
 
     final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    Map<String, Service> services = cluster.getServices();
-    if (!services.containsKey("YARN")) {
-      return false;
-    }
 
     // Applicable only if stack not defined in MinimumApplicableStackVersion, 
or
     // version equals or exceeds the enumerated version.

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index d80b497..9ba5a22 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@ -912,7 +912,7 @@ public class AmbariCustomCommandExecutionHelper {
 
         String commandDetail = 
getReadableCustomCommandDetail(actionExecutionContext, resourceFilter);
 
-        Map<String, String> extraParams = new HashMap<String, String>();;
+        Map<String, String> extraParams = new HashMap<String, String>();
         String componentName = (null == resourceFilter.getComponentName()) ? 
null :
             resourceFilter.getComponentName().toLowerCase();
 
@@ -1036,11 +1036,12 @@ public class AmbariCustomCommandExecutionHelper {
    *
    * @param actionExecContext  the context
    * @param cluster            the cluster for the command
+   * @param stackId            the effective stack id to use.
    *
    * @return a wrapper of the imporant JSON structures to add to a stage
    */
   public ExecuteCommandJson getCommandJson(ActionExecutionContext 
actionExecContext,
-      Cluster cluster) throws AmbariException {
+      Cluster cluster, StackId stackId) throws AmbariException {
 
     Map<String, String> commandParamsStage = 
StageUtils.getCommandParamsStage(actionExecContext);
     Map<String, String> hostParamsStage = new HashMap<String, String>();
@@ -1050,8 +1051,8 @@ public class AmbariCustomCommandExecutionHelper {
     if (null != cluster) {
       clusterHostInfo = StageUtils.getClusterHostInfo(
           cluster);
-      hostParamsStage = createDefaultHostParams(cluster);
-      StackId stackId = cluster.getDesiredStackVersion();
+      // Important, because this runs during Stack Uprade, it needs to use the 
effective Stack Id.
+      hostParamsStage = createDefaultHostParams(cluster, stackId);
       String componentName = null;
       String serviceName = null;
       if (actionExecContext.getOperationLevel() != null) {
@@ -1095,6 +1096,10 @@ public class AmbariCustomCommandExecutionHelper {
 
   Map<String, String> createDefaultHostParams(Cluster cluster) {
     StackId stackId = cluster.getDesiredStackVersion();
+    return createDefaultHostParams(cluster, stackId);
+  }
+
+  Map<String, String> createDefaultHostParams(Cluster cluster, StackId 
stackId) {
     TreeMap<String, String> hostLevelParams = new TreeMap<String, String>();
     hostLevelParams.put(JDK_LOCATION, 
managementController.getJdkResourceUrl());
     hostLevelParams.put(JAVA_HOME, managementController.getJavaHome());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index de0ae28..87e05c6 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -3348,7 +3348,11 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
         actionManager,
         actionRequest);
 
-    ExecuteCommandJson jsons = 
customCommandExecutionHelper.getCommandJson(actionExecContext, cluster);
+    StackId stackId = null;
+    if (null != cluster) {
+      stackId = cluster.getDesiredStackVersion();
+    }
+    ExecuteCommandJson jsons = 
customCommandExecutionHelper.getCommandJson(actionExecContext, cluster, 
stackId);
     String commandParamsForStage = jsons.getCommandParamsForStage();
 
     // Ensure that the specified requestContext (if any) is set as the request 
context

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java
index f8c5316..b8dda3a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.ambari.server.checks.CheckDescription;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
 /**
  * Represents a prerequisite check request.
@@ -33,17 +34,34 @@ public class PrereqCheckRequest {
   private StackId m_sourceStackId;
   private StackId m_targetStackId;
 
+  private UpgradeType m_upgradeType;
+
   private Map<CheckDescription, PrereqCheckStatus> m_results =
       new HashMap<CheckDescription, PrereqCheckStatus>();
 
-  public PrereqCheckRequest(String clusterName) {
+
+  public PrereqCheckRequest(String clusterName, UpgradeType upgradeType) {
     m_clusterName = clusterName;
+    m_upgradeType = upgradeType;
+  }
+
+  /**
+   * Construct a request to performs checks before an Upgrade.
+   * The default type is Rolling.
+   * @param clusterName
+   */
+  public PrereqCheckRequest(String clusterName) {
+    this(clusterName, UpgradeType.ROLLING);
   }
 
   public String getClusterName() {
     return m_clusterName;
   }
 
+  public UpgradeType getUpgradeType() {
+    return m_upgradeType;
+  }
+
   public String getRepositoryVersion() {
     return m_repositoryVersion;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
index 4868ca7..abd9f4a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
@@ -680,11 +680,9 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
         throw new SystemException(detailedOutput);
       }
     } catch (AmbariException e) {
-      e.printStackTrace();
-      throw new SystemException("Can not perform request. " + e.getMessage(), 
e);
+      throw new SystemException("Cannot perform request", e);
     } catch (InterruptedException e) {
-      e.printStackTrace();
-      throw new SystemException("Can not perform request. " + e.getMessage(), 
e);
+      throw new SystemException("Cannot perform request", e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
index 6344aa2..2a1092b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
@@ -61,7 +61,6 @@ public class CompatibleRepositoryVersionResourceProvider 
extends ReadOnlyResourc
   public static final String REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID      
= "CompatibleRepositoryVersions/stack_version";
   public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID 
= "CompatibleRepositoryVersions/repository_version";
   public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID       
= "CompatibleRepositoryVersions/display_name";
-  public static final String REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID       
= "CompatibleRepositoryVersions/upgrade_pack";
   public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID         
= new OperatingSystemResourceDefinition().getPluralName();
   public static final String SUBRESOURCE_REPOSITORIES_PROPERTY_ID              
= new RepositoryResourceDefinition().getPluralName();
 
@@ -73,7 +72,6 @@ public class CompatibleRepositoryVersionResourceProvider 
extends ReadOnlyResourc
       REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
       REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
       REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
-      REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID,
       SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID);
 
   static Map<Type, String> keyPropertyIds = new HashMap<Type, String>() {
@@ -151,7 +149,6 @@ public class CompatibleRepositoryVersionResourceProvider 
extends ReadOnlyResourc
       setResourceProperty(resource, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, 
entity.getStackName(), requestedIds);
       setResourceProperty(resource, 
REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, entity.getStackVersion(), 
requestedIds);
       setResourceProperty(resource, 
REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, entity.getDisplayName(), 
requestedIds);
-      setResourceProperty(resource, 
REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID, entity.getUpgradePackage(), 
requestedIds);
       setResourceProperty(resource, 
REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID, entity.getVersion(), 
requestedIds);
 
       resources.add(resource);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java
index ce58e1e..9c429bf 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java
@@ -20,30 +20,39 @@ package org.apache.ambari.server.controller.internal;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.StaticallyInject;
+import org.apache.ambari.server.checks.AbstractCheckDescriptor;
 import org.apache.ambari.server.checks.UpgradeCheckRegistry;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.CheckHelper;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.UpgradeHelper;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
+import org.apache.ambari.server.state.stack.UpgradePack;
+import org.apache.ambari.server.state.stack.upgrade.Direction;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
 /**
  * Resource provider for pre-upgrade checks.
@@ -61,6 +70,7 @@ public class PreUpgradeCheckResourceProvider extends 
ReadOnlyResourceProvider {
   public static final String UPGRADE_CHECK_FAILED_DETAIL_PROPERTY_ID      = 
PropertyHelper.getPropertyId("UpgradeChecks", "failed_detail");
   public static final String UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID         = 
PropertyHelper.getPropertyId("UpgradeChecks", "check_type");
   public static final String UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID       = 
PropertyHelper.getPropertyId("UpgradeChecks", "cluster_name");
+  public static final String UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID       = 
PropertyHelper.getPropertyId("UpgradeChecks", "upgrade_type");
   public static final String UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID = 
PropertyHelper.getPropertyId("UpgradeChecks", "repository_version");
 
   @Inject
@@ -72,6 +82,9 @@ public class PreUpgradeCheckResourceProvider extends 
ReadOnlyResourceProvider {
   @Inject
   private static UpgradeCheckRegistry upgradeCheckRegistry;
 
+  @Inject
+  private static Provider<UpgradeHelper> upgradeHelper;
+
   private static Set<String> pkPropertyIds = 
Collections.singleton(UPGRADE_CHECK_ID_PROPERTY_ID);
 
   public static Set<String> propertyIds = Sets.newHashSet(
@@ -83,6 +96,7 @@ public class PreUpgradeCheckResourceProvider extends 
ReadOnlyResourceProvider {
       UPGRADE_CHECK_FAILED_DETAIL_PROPERTY_ID,
       UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID,
       UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID,
+      UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID,
       UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID);
 
 
@@ -106,8 +120,8 @@ public class PreUpgradeCheckResourceProvider extends 
ReadOnlyResourceProvider {
     super(propertyIds, keyPropertyIds, managementController);
   }
 
-  @Override
-  public Set<Resource> getResources(Request request, Predicate predicate) 
throws NoSuchResourceException {
+  public Set<Resource> getResources(Request request, Predicate predicate) 
throws SystemException, UnsupportedPropertyException,
+    NoSuchResourceException, NoSuchParentResourceException {
 
     final Set<Resource> resources = new HashSet<Resource>();
     final Set<String> requestedIds = getRequestPropertyIds(request, predicate);
@@ -115,6 +129,8 @@ public class PreUpgradeCheckResourceProvider extends 
ReadOnlyResourceProvider {
 
     for (Map<String, Object> propertyMap: propertyMaps) {
       final String clusterName = 
propertyMap.get(UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID).toString();
+      final UpgradeType upgradeType = 
(!propertyMap.containsKey(UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID)) ? 
UpgradeType.ROLLING
+          : 
(UpgradeType)propertyMap.get(UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID);
       final Cluster cluster;
 
       try {
@@ -124,20 +140,40 @@ public class PreUpgradeCheckResourceProvider extends 
ReadOnlyResourceProvider {
       }
 
       String stackName = cluster.getCurrentStackVersion().getStackName();
+      String sourceStackVersion = 
cluster.getCurrentStackVersion().getStackVersion();
 
-      final PrereqCheckRequest upgradeCheckRequest = new 
PrereqCheckRequest(clusterName);
+      final PrereqCheckRequest upgradeCheckRequest = new 
PrereqCheckRequest(clusterName, upgradeType);
       upgradeCheckRequest.setSourceStackId(cluster.getCurrentStackVersion());
 
       if 
(propertyMap.containsKey(UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID)) {
         String repositoryVersionId = 
propertyMap.get(UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID).toString();
         RepositoryVersionEntity repositoryVersionEntity = 
repositoryVersionDAO.findByStackNameAndVersion(stackName, repositoryVersionId);
-
         // set some required properties on the check request
         upgradeCheckRequest.setRepositoryVersion(repositoryVersionId);
         
upgradeCheckRequest.setTargetStackId(repositoryVersionEntity.getStackId());
       }
 
-      for (PrerequisiteCheck prerequisiteCheck : 
checkHelper.performChecks(upgradeCheckRequest, 
upgradeCheckRegistry.getUpgradeChecks())) {
+      //ambariMetaInfo.getStack(stackName, 
cluster.getCurrentStackVersion().getStackVersion()).getUpgradePacks()
+      // TODO AMBARI-12698, filter the upgrade checks to run based on the 
stack and upgrade type, or the upgrade pack.
+      UpgradePack upgradePack = null;
+      try{
+        // Hint: PreChecks currently executing only before UPGRADE direction
+        upgradePack = upgradeHelper.get().suggestUpgradePack(clusterName, 
sourceStackVersion,
+            upgradeCheckRequest.getRepositoryVersion(), Direction.UPGRADE, 
upgradeType);
+      } catch (AmbariException e) {
+        throw new SystemException(e.getMessage(), e);
+      }
+
+      if (upgradePack == null) {
+        throw new SystemException(String.format("Upgrade pack not found for 
the target repository version %s",
+          upgradeCheckRequest.getRepositoryVersion()));
+      }
+
+      // ToDo: properly handle exceptions, i.e. create fake check with error 
description
+
+      List<AbstractCheckDescriptor> upgradeChecksToRun = 
upgradeCheckRegistry.getFilteredUpgradeChecks(upgradePack);
+
+      for (PrerequisiteCheck prerequisiteCheck : 
checkHelper.performChecks(upgradeCheckRequest, upgradeChecksToRun)) {
         final Resource resource = new 
ResourceImpl(Resource.Type.PreUpgradeCheck);
         setResourceProperty(resource, UPGRADE_CHECK_ID_PROPERTY_ID, 
prerequisiteCheck.getId(), requestedIds);
         setResourceProperty(resource, UPGRADE_CHECK_CHECK_PROPERTY_ID, 
prerequisiteCheck.getDescription(), requestedIds);
@@ -147,6 +183,7 @@ public class PreUpgradeCheckResourceProvider extends 
ReadOnlyResourceProvider {
         setResourceProperty(resource, 
UPGRADE_CHECK_FAILED_DETAIL_PROPERTY_ID,prerequisiteCheck.getFailedDetail(), 
requestedIds);
         setResourceProperty(resource, UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID, 
prerequisiteCheck.getType(), requestedIds);
         setResourceProperty(resource, UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID, 
prerequisiteCheck.getClusterName(), requestedIds);
+        setResourceProperty(resource, UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID, 
upgradeType, requestedIds);
         if (upgradeCheckRequest.getRepositoryVersion() != null) {
           setResourceProperty(resource, 
UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID, 
upgradeCheckRequest.getRepositoryVersion(), requestedIds);
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
index 06291dd..062b0cb 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
@@ -19,12 +19,14 @@ package org.apache.ambari.server.controller.internal;
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.google.inject.Provider;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ObjectNotFoundException;
@@ -50,10 +52,13 @@ import 
org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 import org.apache.ambari.server.orm.entities.RepositoryEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.orm.entities.StackEntity;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.OperatingSystemInfo;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
@@ -74,7 +79,6 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
   public static final String REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID      
= PropertyHelper.getPropertyId("RepositoryVersions", "stack_version");
   public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID 
= PropertyHelper.getPropertyId("RepositoryVersions", "repository_version");
   public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID       
= PropertyHelper.getPropertyId("RepositoryVersions", "display_name");
-  public static final String REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID       
= PropertyHelper.getPropertyId("RepositoryVersions", "upgrade_pack");
   public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID         
= new OperatingSystemResourceDefinition().getPluralName();
   public static final String SUBRESOURCE_REPOSITORIES_PROPERTY_ID              
= new RepositoryResourceDefinition().getPluralName();
 
@@ -93,7 +97,6 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
       add(REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID);
       add(REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID);
       add(REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID);
-      add(REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID);
       add(SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID);
     }
   };
@@ -122,6 +125,9 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
   @Inject
   private RepositoryVersionHelper repositoryVersionHelper;
 
+  @Inject
+  private Provider<Clusters> clusters;
+
   /**
    * Data access object used for lookup up stacks.
    */
@@ -149,13 +155,13 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
         @Override
         public Void invoke() throws AmbariException {
           final String[] requiredProperties = {
-              REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
-              SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID,
-              REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
-              REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
-              REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID
+            REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
+            SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID,
+            REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
+            REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
+            REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID
           };
-          for (String propertyName: requiredProperties) {
+          for (String propertyName : requiredProperties) {
             if (properties.get(propertyName) == null) {
               throw new AmbariException("Property " + propertyName + " should 
be provided");
             }
@@ -215,7 +221,6 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
       setResourceProperty(resource, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, 
entity.getStackName(), requestedIds);
       setResourceProperty(resource, 
REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, entity.getStackVersion(), 
requestedIds);
       setResourceProperty(resource, 
REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, entity.getDisplayName(), 
requestedIds);
-      setResourceProperty(resource, 
REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID, entity.getUpgradePackage(), 
requestedIds);
       setResourceProperty(resource, 
REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID, entity.getVersion(), 
requestedIds);
 
       resources.add(resource);
@@ -245,22 +250,18 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
             throw new ObjectNotFoundException("There is no repository version 
with id " + id);
           }
 
-          if 
(StringUtils.isNotBlank(ObjectUtils.toString(propertyMap.get(REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID))))
 {
-            StackEntity stackEntity = entity.getStack();
-            String stackName = stackEntity.getStackName();
-            String stackVersion = stackEntity.getStackVersion();
+          // Prevent changing repo version if there's already a cluster 
version that has performed some meaningful action on it.
+          StackEntity stackEntity = entity.getStack();
+          String stackName = stackEntity.getStackName();
+          String stackVersion = stackEntity.getStackVersion();
 
-            final List<ClusterVersionEntity> clusterVersionEntities = 
clusterVersionDAO.findByStackAndVersion(
-                stackName, stackVersion, entity.getVersion());
+          final List<ClusterVersionEntity> clusterVersionEntities = 
clusterVersionDAO.findByStackAndVersion(
+              stackName, stackVersion, entity.getVersion());
 
-            if (!clusterVersionEntities.isEmpty()) {
-              final ClusterVersionEntity firstClusterVersion = 
clusterVersionEntities.get(0);
-              throw new AmbariException("Upgrade pack can't be changed for 
repository version which is " +
-                firstClusterVersion.getState().name() + " on cluster " + 
firstClusterVersion.getClusterEntity().getClusterName());
-            }
-
-            final String upgradePackage = 
propertyMap.get(REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID).toString();
-            entity.setUpgradePackage(upgradePackage);
+          if (!clusterVersionEntities.isEmpty()) {
+            final ClusterVersionEntity firstClusterVersion = 
clusterVersionEntities.get(0);
+            throw new AmbariException("Upgrade pack can't be changed for 
repository version which has a state of " +
+              firstClusterVersion.getState().name() + " on cluster " + 
firstClusterVersion.getClusterEntity().getClusterName());
           }
 
           List<OperatingSystemEntity> operatingSystemEntities = null;
@@ -287,12 +288,12 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
           // Update metaInfo table as well
           //
           if (operatingSystemEntities != null) {
-            String stackName = entity.getStackName();
-            String stackVersion = entity.getStackVersion();
+            String entityStackName = entity.getStackName();
+            String entityStackVersion = entity.getStackVersion();
             for (OperatingSystemEntity osEntity : operatingSystemEntities) {
               List<RepositoryEntity> repositories = osEntity.getRepositories();
               for (RepositoryEntity repository : repositories) {
-                ambariMetaInfo.updateRepoBaseURL(stackName, stackVersion, 
osEntity.getOsType(), repository.getRepositoryId(), repository.getBaseUrl());
+                ambariMetaInfo.updateRepoBaseURL(entityStackName, 
entityStackVersion, osEntity.getOsType(), repository.getRepositoryId(), 
repository.getBaseUrl());
               }
             }
           }
@@ -366,14 +367,13 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
    */
   protected void validateRepositoryVersion(RepositoryVersionEntity 
repositoryVersion) throws AmbariException {
     final StackId requiredStack = new StackId(repositoryVersion.getStack());
-    final String stackName = requiredStack.getStackName();
-    final String stackMajorVersion = requiredStack.getStackVersion();
-    final String stackFullName = requiredStack.getStackId();
-
-    // check that stack exists
-    final StackInfo stackInfo = ambariMetaInfo.getStack(stackName, 
stackMajorVersion);
-    if (stackInfo.getUpgradePacks() == null) {
-      throw new AmbariException("Stack " + stackFullName + " doesn't have 
upgrade packages");
+
+    final String requiredStackName = requiredStack.getStackName();
+    final String requiredStackVersion = requiredStack.getStackVersion();
+    final String requiredStackId = requiredStack.getStackId();
+
+    if (!upgradePackExists(repositoryVersion.getVersion())) {
+      throw new AmbariException("Stack " + requiredStackId + " doesn't have 
upgrade packages");
     }
 
     // List of all repo urls that are already added at stack
@@ -392,7 +392,7 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
 
     // check that repositories contain only supported operating systems
     final Set<String> osSupported = new HashSet<String>();
-    for (OperatingSystemInfo osInfo: 
ambariMetaInfo.getOperatingSystems(stackName, stackMajorVersion)) {
+    for (OperatingSystemInfo osInfo: 
ambariMetaInfo.getOperatingSystems(requiredStackName, requiredStackVersion)) {
       osSupported.add(osInfo.getOsType());
     }
     final Set<String> osRepositoryVersion = new HashSet<String>();
@@ -412,7 +412,7 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
     }
     for (String os: osRepositoryVersion) {
       if (!osSupported.contains(os)) {
-        throw new AmbariException("Operating system type " + os + " is not 
supported by stack " + stackFullName);
+        throw new AmbariException("Operating system type " + os + " is not 
supported by stack " + requiredStackId);
       }
     }
 
@@ -423,6 +423,35 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
   }
 
   /**
+   * Check for required upgrade pack across all stack definitions
+   * @param checkVersion version to check (e.g. 2.2.3.0-1111)
+   * @return existence flag
+   */
+  private boolean upgradePackExists(String checkVersion) throws 
AmbariException{
+    Collection<StackInfo> stacks = new ArrayList<StackInfo>();
+
+    // Search results only in the installed stacks
+    for (Cluster cluster:clusters.get().getClusters().values()){
+      
stacks.add(ambariMetaInfo.getStack(cluster.getCurrentStackVersion().getStackName(),
+                                          
cluster.getCurrentStackVersion().getStackVersion()));
+    }
+
+    for (StackInfo si: stacks){
+      Map<String, UpgradePack> upgradePacks = si.getUpgradePacks();
+      if (upgradePacks!=null) {
+        for (UpgradePack upgradePack: upgradePacks.values()){
+          if (upgradePack.canBeApplied(checkVersion)) {
+            // If we found at least one match, the rest could be skipped
+            return true;
+          }
+        }
+      }
+    }
+   return false;
+  }
+
+
+  /**
    * Transforms map of json properties to repository version entity.
    *
    * @param properties json map
@@ -448,7 +477,6 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
       throw new AmbariException("Json structure for operating systems is 
incorrect", ex);
     }
     entity.setOperatingSystems(operatingSystemsJson);
-    
entity.setUpgradePackage(repositoryVersionHelper.getUpgradePackageName(stackName,
 stackVersion, entity.getVersion()));
     return entity;
   }
 

Reply via email to