AMBARI-21677 - Upgrade Pre-Checks Should Take PATCH/SERVICE Types Into Account 
(jonathanhurley)


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

Branch: refs/heads/branch-2.6
Commit: 1f95e149b756bcbd653fed66457a73a2a5040700
Parents: 8bf44f3
Author: Jonathan Hurley <jhur...@hortonworks.com>
Authored: Mon Aug 7 23:46:47 2017 -0400
Committer: Jonathan Hurley <jhur...@hortonworks.com>
Committed: Tue Aug 8 20:08:35 2017 -0400

----------------------------------------------------------------------
 .../server/checks/AbstractCheckDescriptor.java  | 215 ++++++++++----
 .../server/checks/AtlasPresenceCheck.java       |  13 +-
 .../server/checks/AutoStartDisabledCheck.java   |  11 +
 .../ambari/server/checks/CheckDescription.java  |   4 +-
 .../server/checks/ClientRetryPropertyCheck.java |  10 +-
 .../checks/ComponentsExistInRepoCheck.java      |  16 +-
 .../checks/ComponentsInstallationCheck.java     |  15 +-
 .../server/checks/ConfigurationMergeCheck.java  |   6 +-
 .../ambari/server/checks/HealthCheck.java       |   5 +-
 .../HiveDynamicServiceDiscoveryCheck.java       |  19 +-
 .../checks/HiveMultipleMetastoreCheck.java      |   7 +-
 .../server/checks/HiveNotRollingWarning.java    |  11 +-
 .../checks/HostsMasterMaintenanceCheck.java     |  21 +-
 .../checks/HostsRepositoryVersionCheck.java     |  53 +---
 .../server/checks/InstallPackagesCheck.java     |  18 +-
 .../server/checks/KafkaKerberosCheck.java       |  10 +-
 ...apReduce2JobHistoryStatePreservingCheck.java |  21 +-
 .../server/checks/RangerAuditDbCheck.java       |  10 +-
 .../server/checks/RangerPasswordCheck.java      |  27 +-
 .../server/checks/RangerSSLConfigCheck.java     |   8 +-
 .../checks/SecondaryNamenodeDeletedCheck.java   |  27 +-
 .../checks/ServicesMaintenanceModeCheck.java    |  11 +-
 .../ServicesMapReduceDistributedCacheCheck.java |  30 +-
 .../ServicesNamenodeHighAvailabilityCheck.java  |  12 +-
 .../checks/ServicesNamenodeTruncateCheck.java   |  31 +-
 .../ServicesTezDistributedCacheCheck.java       |  28 +-
 .../ambari/server/checks/ServicesUpCheck.java   |  14 +-
 .../checks/ServicesYarnWorkPreservingCheck.java |  11 +-
 .../server/checks/StormShutdownWarning.java     |  11 +-
 .../checks/YarnRMHighAvailabilityCheck.java     |  11 +-
 .../YarnTimelineServerStatePreservingCheck.java |  99 ++++---
 .../server/controller/PrereqCheckRequest.java   |  13 -
 .../apache/ambari/server/state/CheckHelper.java |   4 +-
 .../checks/AbstractCheckDescriptorTest.java     | 287 ++++++++++++-------
 .../checks/ClientRetryPropertyCheckTest.java    |  33 ++-
 .../checks/ComponentExistsInRepoCheckTest.java  |  16 ++
 .../checks/ComponentsInstallationCheckTest.java |  50 +++-
 .../HiveDynamicServiceDiscoveryCheckTest.java   |   2 +-
 .../checks/HiveMultipleMetastoreCheckTest.java  |  31 +-
 .../checks/HiveNotRollingWarningTest.java       |  39 ++-
 .../server/checks/HostsHeartbeatCheckTest.java  |   2 +-
 .../checks/HostsMasterMaintenanceCheckTest.java |  51 ++--
 .../checks/HostsRepositoryVersionCheckTest.java |  76 +++--
 .../server/checks/InstallPackagesCheckTest.java |   2 +-
 .../server/checks/KafkaKerberosCheckTest.java   |  39 ++-
 ...duce2JobHistoryStatePreservingCheckTest.java |  37 ++-
 .../server/checks/RangerAuditDbCheckTest.java   |  42 ++-
 .../server/checks/RangerPasswordCheckTest.java  |  47 +--
 .../server/checks/RangerSSLConfigCheckTest.java |  42 ++-
 .../SecondaryNamenodeDeletedCheckTest.java      |  52 +++-
 .../server/checks/ServicePresenceCheckTest.java |   2 +-
 .../ServicesMaintenanceModeCheckTest.java       |  34 ++-
 ...vicesMapReduceDistributedCacheCheckTest.java |  60 ++--
 ...rvicesNamenodeHighAvailabilityCheckTest.java |  42 ++-
 .../ServicesNamenodeTruncateCheckTest.java      |  45 ++-
 .../ServicesTezDistributedCacheCheckTest.java   |  49 +++-
 .../server/checks/ServicesUpCheckTest.java      |  64 +++--
 .../ServicesYarnWorkPreservingCheckTest.java    |  41 ++-
 .../server/checks/StormShutdownWarningTest.java |  38 ++-
 ...nTimelineServerStatePreservingCheckTest.java |   2 +-
 .../ambari/server/state/CheckHelperTest.java    | 248 ++++++++--------
 61 files changed, 1482 insertions(+), 793 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 4f8a39d..d54e8a1 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
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -29,11 +30,15 @@ import 
org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.dao.HostVersionDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.dao.UpgradeDAO;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.ServiceInfo;
+import org.apache.ambari.server.state.repository.ClusterVersionSummary;
+import org.apache.ambari.server.state.repository.VersionDefinitionXml;
+import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrereqCheckType;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.UpgradePack;
@@ -43,6 +48,7 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -56,7 +62,7 @@ public abstract class AbstractCheckDescriptor {
   protected static final String DEFAULT = "default";
 
   @Inject
-  Provider<Clusters> clustersProvider;
+  protected Provider<Clusters> clustersProvider;
 
   @Inject
   Provider<HostVersionDAO> hostVersionDaoProvider;
@@ -88,55 +94,54 @@ public abstract class AbstractCheckDescriptor {
   }
 
   /**
-   * Tests if the prerequisite check is applicable to given cluster. This
-   * 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)}.
+   * Gets the set of services that this check is associated with. If the check
+   * is not associated with a particular service, then this should be an empty
+   * set.
    *
-   * @param request
-   *          prerequisite check request
-   * @return true if check should be performed
+   * @return a set of services which will determine whether this check is
+   *         applicable.
+   */
+  public Set<String> getApplicableServices() {
+    return Collections.emptySet();
+  }
+
+  /**
+   * Gets any additional qualifications which an upgrade check should run in
+   * order to determine if it's applicable to the upgrade.
    *
-   * @throws org.apache.ambari.server.AmbariException
-   *           if server error happens
+   * @return a list of qualifications, or an empty list.
    */
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    // this is default behaviour
-   return true;
+  public List<CheckQualification> getQualifications() {
+    return Collections.emptyList();
   }
 
   /**
-   * Same like {@code isApplicable(PrereqCheckRequest request)}, but with 
service presence check
+   * Tests if the prerequisite check is applicable to given upgrade request. If
+   * a check requires some extra processing
+   *
    * @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();
-
-    // default return value depends on assign inside check block
-    boolean serviceFound = requiredAll && !requiredServices.isEmpty();
-
-    for (String service : requiredServices) {
-      if ( services.contains(service) && !requiredAll) {
-        serviceFound = true;
-        break;
-      } else if (!services.contains(service) && requiredAll) {
-        serviceFound = false;
-        break;
+  public final boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
+    List<CheckQualification> qualifications = Lists.<CheckQualification> 
newArrayList(
+        new ServiceQualification());
+
+    // add any others from the concrete check
+    qualifications.addAll(getQualifications());
+    for (CheckQualification qualification : qualifications) {
+      if (!qualification.isApplicable(request)) {
+        return false;
       }
     }
 
-    return serviceFound;
+    return true;
   }
 
+
   /**
    * Executes check against given cluster.
    *
@@ -172,7 +177,8 @@ public abstract class AbstractCheckDescriptor {
    * @param request           the request
    * @return the failure string
    */
-  protected String getFailReason(PrerequisiteCheck prerequisiteCheck, 
PrereqCheckRequest request) {
+  protected String getFailReason(PrerequisiteCheck prerequisiteCheck, 
PrereqCheckRequest request)
+      throws AmbariException {
     return getFailReason(DEFAULT, prerequisiteCheck, request);
   }
 
@@ -214,12 +220,13 @@ public abstract class AbstractCheckDescriptor {
    * @param request           the request
    * @return the failure string
    */
-  protected String getFailReason(String key,
-      PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) {
+  protected String getFailReason(String key, PrerequisiteCheck 
prerequisiteCheck,
+      PrereqCheckRequest request) throws AmbariException {
     String fail = m_description.getFail(key);
 
-    if (fail.contains("{{version}}") && null != request.getTargetVersion()) {
-      fail = fail.replace("{{version}}", request.getTargetVersion());
+    RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
+    if (fail.contains("{{version}}") && null != repositoryVersion) {
+      fail = fail.replace("{{version}}", repositoryVersion.getVersion());
     }
 
     if (fail.contains("{{fails}}")) {
@@ -230,24 +237,21 @@ public abstract class AbstractCheckDescriptor {
         Clusters clusters = clustersProvider.get();
         AmbariMetaInfo metaInfo = ambariMetaInfo.get();
 
-        try {
-          Cluster c = clusters.getCluster(request.getClusterName());
-          Map<String, ServiceInfo> services = metaInfo.getServices(
-              c.getDesiredStackVersion().getStackName(),
-              c.getDesiredStackVersion().getStackVersion());
-
-          LinkedHashSet<String> displays = new LinkedHashSet<>();
-          for (String name : names) {
-            if (services.containsKey(name)) {
-              displays.add(services.get(name).getDisplayName());
-            } else {
-              displays.add(name);
-            }
+        Cluster c = clusters.getCluster(request.getClusterName());
+        Map<String, ServiceInfo> services = metaInfo.getServices(
+            c.getDesiredStackVersion().getStackName(),
+            c.getDesiredStackVersion().getStackVersion());
+
+        LinkedHashSet<String> displays = new LinkedHashSet<>();
+        for (String name : names) {
+          if (services.containsKey(name)) {
+            displays.add(services.get(name).getDisplayName());
+          } else {
+            displays.add(name);
           }
-          names = displays;
-        } catch (Exception e) {
-          LOG.warn("Could not load service info map");
         }
+        names = displays;
+
       }
 
       fail = fail.replace("{{fails}}", formatEntityList(names));
@@ -256,7 +260,6 @@ public abstract class AbstractCheckDescriptor {
     return fail;
   }
 
-
   /**
    * Formats lists of given entities to human readable form:
    * [entity1] -> {entity1} {noun}
@@ -298,4 +301,106 @@ public abstract class AbstractCheckDescriptor {
     return false;
   }
 
+  /**
+   * Gets the services participating in the upgrade from the VDF.
+   *
+   * @param request
+   *          the upgrade check request.
+   * @return the services participating in the upgrade, which can either be all
+   *         of the cluster's services or a subset based on repository type.
+   */
+  final Set<String> getServicesInUpgrade(PrereqCheckRequest request) throws 
AmbariException {
+    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
+    RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
+
+    // the check is scoped to some services, so determine if any of those
+    // services are included in this upgrade
+    try {
+      VersionDefinitionXml vdf = repositoryVersion.getRepositoryXml();
+      ClusterVersionSummary clusterVersionSummary = 
vdf.getClusterSummary(cluster);
+      return clusterVersionSummary.getAvailableServiceNames();
+    } catch (Exception exception) {
+      throw new AmbariException("Unable to run upgrade checks because of an 
invalid VDF",
+          exception);
+    }
+  }
+
+  /**
+   * The {@link CheckQualification} interface is used to provide multiple
+   * different qualifications against which an upgrade check is determined to 
be
+   * applicable to the upgrade.
+   */
+  interface CheckQualification {
+
+    /**
+     * Gets whether the upgrade check meets this qualification and should
+     * therefore be run before the upgrade.
+     *
+     * @param request
+     * @return
+     * @throws AmbariException
+     */
+    boolean isApplicable(PrereqCheckRequest request) throws AmbariException;
+  }
+
+  /**
+   * The {@link ServiceQualification} class is used to determine if the
+   * service(s) associated with an upgraade check are both installed in the
+   * cluster and included in thr upgrade.
+   * <p/>
+   * If a service is installed but not included in the upgrade (for example of
+   * the upgrade is a patch upgrade), then the check should not qualify to run.
+   */
+  final class ServiceQualification implements CheckQualification {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
+
+      Set<String> applicableServices = getApplicableServices();
+
+      // if the check is not scoped to any particular service, then it passes
+      // this qualification
+      if (applicableServices.isEmpty()) {
+        return true;
+      }
+
+      Set<String> servicesForUpgrade = getServicesInUpgrade(request);
+
+      for (String serviceInUpgrade : servicesForUpgrade) {
+        if (applicableServices.contains(serviceInUpgrade)) {
+          return true;
+        }
+      }
+
+      return false;
+    }
+  }
+
+  /**
+   * The {@link PriorCheckQualification} class is used to determine if a prior 
check has run.
+   */
+  final class PriorCheckQualification implements CheckQualification {
+
+    private final CheckDescription m_checkDescription;
+
+    public PriorCheckQualification(CheckDescription checkDescription) {
+      m_checkDescription = checkDescription;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
+      PrereqCheckStatus checkStatus = request.getResult(m_checkDescription);
+      if (null != checkStatus && checkStatus == PrereqCheckStatus.FAIL) {
+        return false;
+      }
+
+      return true;
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/AtlasPresenceCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/AtlasPresenceCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/AtlasPresenceCheck.java
index 04b73fa..7b622bd 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/AtlasPresenceCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/AtlasPresenceCheck.java
@@ -17,15 +17,14 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Arrays;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -36,16 +35,18 @@ import com.google.inject.Singleton;
 @UpgradeCheck(group = UpgradeCheckGroup.DEFAULT)
 public class AtlasPresenceCheck extends AbstractCheckDescriptor{
 
-  private static final Logger LOG = 
LoggerFactory.getLogger(AtlasPresenceCheck.class);
   private static final String serviceName = "ATLAS";
 
   public AtlasPresenceCheck(){
     super(CheckDescription.ATLAS_SERVICE_PRESENCE_CHECK);
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList(serviceName), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet(serviceName);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java
index c41ad20..6b0698e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java
@@ -17,6 +17,9 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Collections;
+import java.util.Set;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
@@ -52,6 +55,14 @@ public class AutoStartDisabledCheck extends 
AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
+  public Set<String> getApplicableServices() {
+    return Collections.emptySet();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
 
     String autoStartEnabled = getProperty(request, CLUSTER_ENV_TYPE, 
RECOVERY_ENABLED_KEY);

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
index 640de58..91a92bd 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
@@ -86,9 +86,7 @@ public class CheckDescription {
     "All hosts should have target version installed",
     new ImmutableMap.Builder<String, String>()
       .put(AbstractCheckDescriptor.DEFAULT,
-          "The following hosts must have version {{version}} installed: 
{{fails}}.")
-      .put(HostsRepositoryVersionCheck.KEY_NO_REPO_VERSION,
-          "Repository version {{version}} does not exist.").build());
+          "The following hosts must have version {{version}} installed: 
{{fails}}.").build());
 
   public static CheckDescription SECONDARY_NAMENODE_MUST_BE_DELETED = new 
CheckDescription("SECONDARY_NAMENODE_MUST_BE_DELETED",
     PrereqCheckType.HOST,

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 226d82c..f26202d 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,9 +18,9 @@
 package org.apache.ambari.server.checks;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -31,6 +31,7 @@ import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -58,10 +59,11 @@ public class ClientRetryPropertyCheck extends 
AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList("HDFS", "HIVE", "OOZIE"), 
false);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("HDFS", "HIVE", "OOZIE");
   }
 
+
   /**
    * {@inheritDoc}
    */
@@ -70,7 +72,7 @@ public class ClientRetryPropertyCheck extends 
AbstractCheckDescriptor {
     final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
     Map<String, Service> services = cluster.getServices();
 
-    List<String> errorMessages = new ArrayList<String>();
+    List<String> errorMessages = new ArrayList<>();
 
     // HDFS needs to actually prevent client retry since that causes them to 
try too long and not failover quickly.
     if (services.containsKey("HDFS")) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java
index d60433d..6949257 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java
@@ -23,11 +23,10 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
-import org.apache.ambari.annotations.Experimental;
-import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.StackAccessException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.Service;
@@ -64,17 +63,16 @@ public class ComponentsExistInRepoCheck extends 
AbstractCheckDescriptor {
       throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
+    RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
+
     StackId sourceStack = request.getSourceStackId();
-    StackId targetStack = request.getTargetStackId();
+    StackId targetStack = repositoryVersion.getStackId();
 
     Set<String> failedServices = new TreeSet<>();
     Set<String> failedComponents = new TreeSet<>();
 
-    @Experimental(
-        feature = ExperimentalFeature.PATCH_UPGRADES,
-        comment = "Assumes all service participate in the upgrade")
-    Map<String, Service> servicesInUpgrade = cluster.getServices();
-    for (String serviceName : servicesInUpgrade.keySet()) {
+    Set<String> servicesInUpgrade = getServicesInUpgrade(request);
+    for (String serviceName : servicesInUpgrade) {
       try {
         ServiceInfo serviceInfo = 
ambariMetaInfo.get().getService(targetStack.getStackName(),
             targetStack.getStackVersion(), serviceName);
@@ -84,7 +82,7 @@ public class ComponentsExistInRepoCheck extends 
AbstractCheckDescriptor {
           continue;
         }
 
-        Service service = servicesInUpgrade.get(serviceName);
+        Service service = cluster.getService(serviceName);
         Map<String, ServiceComponent> componentsInUpgrade = 
service.getServiceComponents();
         for (String componentName : componentsInUpgrade.keySet()) {
           try {

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java
index a77d72b..ce7ec64 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java
@@ -18,7 +18,6 @@
 package org.apache.ambari.server.checks;
 
 import java.text.MessageFormat;
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -33,7 +32,6 @@ import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
-import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
@@ -63,15 +61,14 @@ public class ComponentsInstallationCheck extends 
AbstractCheckDescriptor {
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
-    Set<String> failedServiceNames = new HashSet<String>();
-
-    StackId stackId = cluster.getCurrentStackVersion();
+    Set<String> failedServiceNames = new HashSet<>();
 
     // Preq-req check should fail if any service component is in 
INSTALL_FAILED state
-    Set<String> installFailedHostComponents = new HashSet<String>();
+    Set<String> installFailedHostComponents = new HashSet<>();
 
-    for (Map.Entry<String, Service> serviceEntry : 
cluster.getServices().entrySet()) {
-      final Service service = serviceEntry.getValue();
+    Set<String> servicesInUpgrade = getServicesInUpgrade(request);
+    for (String serviceName : servicesInUpgrade) {
+      final Service service = cluster.getService(serviceName);
       // Skip service if it is in maintenance mode
       if (service.getMaintenanceState() != MaintenanceState.ON) {
         Map<String, ServiceComponent> serviceComponents = 
service.getServiceComponents();
@@ -100,7 +97,7 @@ public class ComponentsInstallationCheck extends 
AbstractCheckDescriptor {
     if(!installFailedHostComponents.isEmpty()) {
       String message = MessageFormat.format("Service components in 
INSTALL_FAILED state: {0}.",
           StringUtils.join(installFailedHostComponents, ", "));
-      prerequisiteCheck.setFailedOn(new 
LinkedHashSet<String>(failedServiceNames));
+      prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failedServiceNames));
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setFailReason(
           "Found service components in INSTALL_FAILED state. Please re-install 
these components. " + message);

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 28d7d78..4dc5d8b 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
@@ -25,7 +25,6 @@ import java.util.Set;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
-import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.ConfigMergeHelper;
 import org.apache.ambari.server.state.ConfigMergeHelper.ThreeWayValue;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
@@ -64,13 +63,12 @@ public class ConfigurationMergeCheck extends 
AbstractCheckDescriptor {
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request)
       throws AmbariException {
 
-    String stackName = request.getTargetStackId().getStackName();
-    RepositoryVersionEntity rve = 
repositoryVersionDaoProvider.get().findByStackNameAndVersion(stackName, 
request.getTargetVersion());
+    RepositoryVersionEntity rve = request.getTargetRepositoryVersion();
 
     Map<String, Map<String, ThreeWayValue>> changes =
         m_mergeHelper.getConflicts(request.getClusterName(), rve.getStackId());
 
-    Set<String> failedTypes = new HashSet<String>();
+    Set<String> failedTypes = new HashSet<>();
 
     for (Entry<String, Map<String, ThreeWayValue>> entry : changes.entrySet()) 
{
       for (Entry<String, ThreeWayValue> configEntry : 
entry.getValue().entrySet()) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java
index 8feb77a..f08be16 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java
@@ -76,7 +76,7 @@ public class HealthCheck extends AbstractCheckDescriptor {
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     List<AlertCurrentEntity> alerts = 
alertsDAO.findCurrentByCluster(cluster.getClusterId());
 
-    List<String> errorMessages = new ArrayList<String>();
+    List<String> errorMessages = new ArrayList<>();
 
     for (AlertCurrentEntity alert : alerts) {
       AlertHistoryEntity alertHistory = alert.getAlertHistory();
@@ -99,7 +99,8 @@ public class HealthCheck extends AbstractCheckDescriptor {
       prerequisiteCheck.getFailedOn().add(clusterName);
       prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING);
       String failReason = getFailReason(prerequisiteCheck, request);
-      prerequisiteCheck.setFailReason(String.format(failReason, 
StringUtils.join(errorMessages, "\n")));
+      prerequisiteCheck.setFailReason(
+          String.format(failReason, StringUtils.join(errorMessages, 
System.lineSeparator())));
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 c2ef4ad..34e5bfd 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,14 +18,14 @@
 package org.apache.ambari.server.checks;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import 
org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
@@ -33,6 +33,7 @@ import 
org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -62,8 +63,8 @@ public class HiveDynamicServiceDiscoveryCheck extends 
AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList("HIVE"), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("HIVE");
   }
 
   /**
@@ -71,7 +72,7 @@ public class HiveDynamicServiceDiscoveryCheck extends 
AbstractCheckDescriptor {
    */
   @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
-    List<String> errorMessages = new ArrayList<String>();
+    List<String> errorMessages = new ArrayList<>();
 
     String dynamicServiceDiscoveryEnabled = getProperty(request, "hive-site", 
"hive.server2.support.dynamic.service.discovery");
     String zookeeperQuorum = getProperty(request, "hive-site", 
"hive.zookeeper.quorum");
@@ -111,9 +112,11 @@ public class HiveDynamicServiceDiscoveryCheck extends 
AbstractCheckDescriptor {
           String minStackName = minStack[0];
           String minStackVersion = minStack[1];
           if (minStackName.equals(request.getSourceStackId().getStackName())) {
+            RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
+            StackId targetStackId = repositoryVersion.getStackId();
             if 
(VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), 
minStackVersion) < 0
-                && 
VersionUtils.compareVersions(request.getTargetStackId().getStackVersion(), 
minStackVersion) < 0
-                && 
VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), 
request.getTargetStackId().getStackVersion()) < 0) {
+                && 
VersionUtils.compareVersions(targetStackId.getStackVersion(), minStackVersion) 
< 0
+                && 
VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), 
targetStackId.getStackVersion()) < 0) {
               checkStatus = PrereqCheckStatus.WARNING;
             }
           }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 ea20a55..e876696 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,8 +17,8 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Arrays;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ServiceComponentNotFoundException;
@@ -30,6 +30,7 @@ import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -51,8 +52,8 @@ public class HiveMultipleMetastoreCheck extends 
AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList("HIVE"), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("HIVE");
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveNotRollingWarning.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveNotRollingWarning.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveNotRollingWarning.java
index 2b1c62e..8e862c8 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveNotRollingWarning.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveNotRollingWarning.java
@@ -17,7 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Arrays;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -25,6 +25,7 @@ import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -52,14 +53,10 @@ public class HiveNotRollingWarning extends 
AbstractCheckDescriptor {
 
   /**
    * {@inheritDoc}
-   * <p/>
-   * This check is only applicable if Hive is installed and the upgrade type is
-   * {@link UpgradeType#ROLLING}.
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    boolean isApplicable = super.isApplicable(request, Arrays.asList("HIVE"), 
true);
-    return isApplicable && request.getUpgradeType() == UpgradeType.ROLLING;
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("HIVE");
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 8cd935b..86e0f3b 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
@@ -23,6 +23,7 @@ import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
@@ -58,25 +59,25 @@ public class HostsMasterMaintenanceCheck extends 
AbstractCheckDescriptor {
   }
 
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-      return super.isApplicable(request) && request.getTargetVersion() != 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 Set<String> hostsWithMasterComponent = new HashSet<>();
 
     // 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.getTargetVersion(), null);
+    RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
+
+    final String upgradePackName = 
repositoryVersionHelper.get().getUpgradePackageName(
+        stackId.getStackName(), stackId.getStackVersion(), 
repositoryVersion.getVersion(), null);
+
     if (upgradePackName == null) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       String fail = getFailReason(KEY_NO_UPGRADE_NAME, prerequisiteCheck, 
request);
       prerequisiteCheck.setFailReason(String.format(fail, 
stackId.getStackName(), stackId.getStackVersion()));
       return;
     }
+
     final UpgradePack upgradePack = 
ambariMetaInfo.get().getUpgradePacks(stackId.getStackName(), 
stackId.getStackVersion()).get(upgradePackName);
     if (upgradePack == null) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
@@ -84,10 +85,12 @@ public class HostsMasterMaintenanceCheck extends 
AbstractCheckDescriptor {
       prerequisiteCheck.setFailReason(String.format(fail, upgradePackName));
       return;
     }
-    final Set<String> componentsFromUpgradePack = new HashSet<String>();
+
+    final Set<String> componentsFromUpgradePack = new HashSet<>();
     for (Map<String, ProcessingComponent> task: 
upgradePack.getTasks().values()) {
       componentsFromUpgradePack.addAll(task.keySet());
     }
+
     for (Service service: cluster.getServices().values()) {
       for (ServiceComponent serviceComponent: 
service.getServiceComponents().values()) {
         if (serviceComponent.isMasterComponent() && 
componentsFromUpgradePack.contains(serviceComponent.getName())) {
@@ -95,6 +98,7 @@ public class HostsMasterMaintenanceCheck extends 
AbstractCheckDescriptor {
         }
       }
     }
+
     final Map<String, Host> clusterHosts = 
clustersProvider.get().getHostsForCluster(clusterName);
     for (Map.Entry<String, Host> hostEntry : clusterHosts.entrySet()) {
       final Host host = hostEntry.getValue();
@@ -102,6 +106,7 @@ public class HostsMasterMaintenanceCheck extends 
AbstractCheckDescriptor {
         prerequisiteCheck.getFailedOn().add(host.getHostName());
       }
     }
+
     if (!prerequisiteCheck.getFailedOn().isEmpty()) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 613c5fc..17c9dc3 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
@@ -17,13 +17,14 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.EnumSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
 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.Host;
 import org.apache.ambari.server.state.MaintenanceState;
@@ -47,8 +48,6 @@ import com.google.inject.Singleton;
     required = { UpgradeType.ROLLING, UpgradeType.NON_ROLLING, 
UpgradeType.HOST_ORDERED })
 public class HostsRepositoryVersionCheck extends AbstractCheckDescriptor {
 
-  static final String KEY_NO_REPO_VERSION = "no_repo_version";
-
   /**
    * Constructor.
    */
@@ -57,17 +56,11 @@ public class HostsRepositoryVersionCheck extends 
AbstractCheckDescriptor {
   }
 
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request) && request.getTargetVersion() != null;
-  }
-
-  @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request)
       throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     final Map<String, Host> clusterHosts = 
clustersProvider.get().getHostsForCluster(clusterName);
-    final StackId stackId = cluster.getDesiredStackVersion();
 
     for (Host host : clusterHosts.values()) {
       // hosts in MM will produce a warning if they do not have the repo 
version
@@ -76,41 +69,19 @@ public class HostsRepositoryVersionCheck extends 
AbstractCheckDescriptor {
         continue;
       }
 
-      if (null != request.getTargetVersion()) {
-        boolean found = false;
-        for (HostVersionEntity hve : 
hostVersionDaoProvider.get().findByHost(host.getHostName())) {
-
-          if 
(hve.getRepositoryVersion().getVersion().equals(request.getTargetVersion())
-              && (hve.getState() == RepositoryVersionState.INSTALLED || 
hve.getState() == RepositoryVersionState.NOT_REQUIRED)) {
-            found = true;
-            break;
-          }
-        }
-
-        if (!found) {
-          prerequisiteCheck.getFailedOn().add(host.getHostName());
-        }
-      } else {
-        final RepositoryVersionEntity repositoryVersion = 
repositoryVersionDaoProvider.get().findByStackAndVersion(
-            stackId, request.getTargetVersion());
-        if (repositoryVersion == null) {
-          prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-          prerequisiteCheck.setFailReason(
-              getFailReason(KEY_NO_REPO_VERSION, prerequisiteCheck, request));
-          prerequisiteCheck.getFailedOn().addAll(clusterHosts.keySet());
-          return;
-        }
+      RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
+      StackId repositoryStackId = repositoryVersion.getStackId();
 
-        StackEntity repositoryStackEntity = repositoryVersion.getStack();
-        StackId repositoryStackId = new 
StackId(repositoryStackEntity.getStackName(),
-            repositoryStackEntity.getStackVersion());
+      // get the host version entity for this host and repository
+      final HostVersionEntity hostVersion = 
hostVersionDaoProvider.get().findByClusterStackVersionAndHost(
+          clusterName, repositoryStackId, repositoryVersion.getVersion(), 
host.getHostName());
 
-        final HostVersionEntity hostVersion = 
hostVersionDaoProvider.get().findByClusterStackVersionAndHost(
-            clusterName, repositoryStackId, repositoryVersion.getVersion(), 
host.getHostName());
+      // the repo needs to either be installed or not required
+      Set<RepositoryVersionState> okStates = 
EnumSet.of(RepositoryVersionState.INSTALLED,
+          RepositoryVersionState.NOT_REQUIRED);
 
-        if (hostVersion == null || hostVersion.getState() != 
RepositoryVersionState.INSTALLED) {
-          prerequisiteCheck.getFailedOn().add(host.getHostName());
-        }
+      if (hostVersion == null || !okStates.contains(hostVersion.getState())) {
+        prerequisiteCheck.getFailedOn().add(host.getHostName());
       }
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
index 7c84e5c..3e02572 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
@@ -59,16 +59,15 @@ public class InstallPackagesCheck extends 
AbstractCheckDescriptor {
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
-    final StackId targetStackId = request.getTargetStackId();
-    final String stackName = targetStackId.getStackName();
-    final String repoVersion = request.getTargetVersion();
+    RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
 
-    final RepositoryVersionEntity rve = 
repositoryVersionDaoProvider.get().findByStackNameAndVersion(stackName, 
request.getTargetVersion());
-    if (StringUtils.isBlank(rve.getVersion()) || 
!rve.getVersion().matches("^\\d+(\\.\\d+)*\\-\\d+$")) {
+    final StackId targetStackId = repositoryVersion.getStackId();
+
+    if (!repositoryVersion.getVersion().matches("^\\d+(\\.\\d+)*\\-\\d+$")) {
       String message = MessageFormat.format("The Repository Version {0} for 
Stack {1} must contain a \"-\" followed by a build number. " +
               "Make sure that another registered repository does not have the 
same repo URL or " +
-              "shares the same build number. Next, try reinstalling the 
Repository Version.", rve.getVersion(), rve.getStackVersion());
-      prerequisiteCheck.getFailedOn().add("Repository Version " + 
rve.getVersion());
+              "shares the same build number. Next, try reinstalling the 
Repository Version.", repositoryVersion.getVersion(), 
repositoryVersion.getStackVersion());
+      prerequisiteCheck.getFailedOn().add("Repository Version " + 
repositoryVersion.getVersion());
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setFailReason(message);
       return;
@@ -79,7 +78,7 @@ public class InstallPackagesCheck extends 
AbstractCheckDescriptor {
     for (Host host : cluster.getHosts()) {
       if (host.getMaintenanceState(cluster.getClusterId()) != 
MaintenanceState.ON) {
         for (HostVersionEntity hve : 
hostVersionDaoProvider.get().findByHost(host.getHostName())) {
-          if 
(hve.getRepositoryVersion().getVersion().equals(request.getTargetVersion())
+          if (StringUtils.equals(hve.getRepositoryVersion().getVersion(), 
repositoryVersion.getVersion())
               && hve.getState() == RepositoryVersionState.INSTALL_FAILED) {
             failedHosts.add(host.getHostName());
           }
@@ -91,7 +90,8 @@ public class InstallPackagesCheck extends 
AbstractCheckDescriptor {
       String message = MessageFormat.format("Hosts in cluster 
[{0},{1},{2},{3}] are in INSTALL_FAILED state because " +
               "Install Packages had failed. Please re-run Install Packages, if 
necessary place following hosts " +
               "in Maintenance mode: {4}", cluster.getClusterName(), 
targetStackId.getStackName(),
-          targetStackId.getStackVersion(), repoVersion, 
StringUtils.join(failedHosts, ", "));
+          targetStackId.getStackVersion(), repositoryVersion.getVersion(),
+          StringUtils.join(failedHosts, ", "));
       prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failedHosts));
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setFailReason(message);

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/KafkaKerberosCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/KafkaKerberosCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/KafkaKerberosCheck.java
index 69721d9..724feab 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/KafkaKerberosCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/KafkaKerberosCheck.java
@@ -18,7 +18,7 @@
 
 package org.apache.ambari.server.checks;
 
-import java.util.Arrays;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -27,6 +27,7 @@ import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -47,9 +48,12 @@ public class KafkaKerberosCheck extends 
AbstractCheckDescriptor {
     super(CheckDescription.KAFKA_KERBEROS_CHECK);
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList(KAFKA_SERVICE), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet(KAFKA_SERVICE);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 06ca162..2015be3 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
@@ -17,21 +17,18 @@
  */
 package org.apache.ambari.server.checks;
 
-import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import 
org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
-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;
+import com.google.common.collect.Sets;
+import com.google.inject.Singleton;
 
 /**
  * The {@link MapReduce2JobHistoryStatePreservingCheck}
@@ -61,8 +58,8 @@ public class MapReduce2JobHistoryStatePreservingCheck extends 
AbstractCheckDescr
    * {@inheritDoc}
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList("MAPREDUCE2"), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("MAPREDUCE2");
   }
 
   /**
@@ -70,7 +67,7 @@ public class MapReduce2JobHistoryStatePreservingCheck extends 
AbstractCheckDescr
    */
   @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
-    List<String> errorMessages = new ArrayList<String>();
+    List<String> errorMessages = new ArrayList<>();
     PrereqCheckStatus checkStatus = PrereqCheckStatus.FAIL;
 
     String enabled =

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerAuditDbCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerAuditDbCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerAuditDbCheck.java
index ec4ed09..27a0591 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerAuditDbCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerAuditDbCheck.java
@@ -17,7 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Arrays;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -26,6 +26,7 @@ import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -42,9 +43,12 @@ public class RangerAuditDbCheck extends 
AbstractCheckDescriptor{
     super(CheckDescription.RANGER_SERVICE_AUDIT_DB_CHECK);
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList(serviceName), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet(serviceName);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
index a55a148..4c5e4da 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
@@ -27,22 +27,21 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.controller.internal.URLStreamProvider;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
-import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Sets;
 import com.google.gson.Gson;
 import com.google.inject.Singleton;
 
@@ -74,25 +73,11 @@ public class RangerPasswordCheck extends 
AbstractCheckDescriptor {
   }
 
   /**
-   * Verifies that the check can be run.  If the stack is HDP and 2.3 or 
higher, allow
-   * this to run.  If the stack is not HDP, the check should run.
+   * {@inheritDoc}
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request, Arrays.asList("RANGER"), true)) {
-      return false;
-    }
-
-    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-
-    StackId clusterStackId = cluster.getCurrentStackVersion();
-    if (clusterStackId.getStackName().equals("HDP")) {
-      String sourceVersion = request.getSourceStackId().getStackVersion();
-
-      return VersionUtils.compareVersions(sourceVersion, "2.3.0.0") >= 0;
-    }
-
-    return true;
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("RANGER");
   }
 
   @Override
@@ -293,7 +278,7 @@ public class RangerPasswordCheck extends 
AbstractCheckDescriptor {
    */
   private boolean checkRangerUser(URLStreamProvider streamProvider, String 
rangerUserUrl,
       String username, String password, String userToSearch, PrerequisiteCheck 
check,
-      PrereqCheckRequest request, List<String> warnReasons) {
+      PrereqCheckRequest request, List<String> warnReasons) throws 
AmbariException {
 
     String url = String.format("%s?name=%s", rangerUserUrl, userToSearch);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerSSLConfigCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerSSLConfigCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerSSLConfigCheck.java
index 02f6559..6ee5a97 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerSSLConfigCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerSSLConfigCheck.java
@@ -18,16 +18,16 @@
 package org.apache.ambari.server.checks;
 
 
-import java.util.Arrays;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 
@@ -55,8 +55,8 @@ public class RangerSSLConfigCheck extends 
AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList(serviceName), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet(serviceName);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 0dbb1b5..e83b118 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
@@ -24,7 +24,6 @@ import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ServiceComponentNotFoundException;
-import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
@@ -34,6 +33,7 @@ import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
@@ -54,18 +54,21 @@ public class SecondaryNamenodeDeletedCheck extends 
AbstractCheckDescriptor {
     super(CheckDescription.SECONDARY_NAMENODE_MUST_BE_DELETED);
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request, Arrays.asList(HDFS_SERVICE_NAME), true)) {
-      return false;
-    }
-
-    PrereqCheckStatus ha = 
request.getResult(CheckDescription.SERVICES_NAMENODE_HA);
-    if (null != ha && ha == PrereqCheckStatus.FAIL) {
-      return false;
-    }
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet(HDFS_SERVICE_NAME);
+  }
 
-    return true;
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public List<CheckQualification> getQualifications() {
+    return Arrays.<CheckQualification> asList(
+        new PriorCheckQualification(CheckDescription.SERVICES_NAMENODE_HA));
   }
 
   // TODO AMBARI-12698, there are 2 ways to filter the prechecks.
@@ -75,7 +78,7 @@ public class SecondaryNamenodeDeletedCheck extends 
AbstractCheckDescriptor {
   //   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>();
+    Set<String> hosts = new HashSet<>();
     final String SECONDARY_NAMENODE = "SECONDARY_NAMENODE";
 
     final String clusterName = request.getClusterName();

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 08f4fd8..aa7b6db 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
@@ -17,7 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -49,10 +49,11 @@ public class ServicesMaintenanceModeCheck extends 
AbstractCheckDescriptor {
 
   @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
-    final String clusterName = request.getClusterName();
-    final Cluster cluster = clustersProvider.get().getCluster(clusterName);
-    for (Map.Entry<String, Service> serviceEntry : 
cluster.getServices().entrySet()) {
-      final Service service = serviceEntry.getValue();
+    final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
+    Set<String> servicesInUpgrade = getServicesInUpgrade(request);
+
+    for (String serviceName : servicesInUpgrade) {
+      final Service service = cluster.getService(serviceName);
       if (!service.isClientOnlyService() && service.getMaintenanceState() == 
MaintenanceState.ON) {
         prerequisiteCheck.getFailedOn().add(service.getName());
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 3970e9e..ab7e798 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
@@ -21,9 +21,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Config;
@@ -33,6 +33,7 @@ import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import 
org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -48,20 +49,21 @@ public class ServicesMapReduceDistributedCacheCheck extends 
AbstractCheckDescrip
   static final String DFS_PROTOCOLS_REGEX_PROPERTY_NAME = 
"dfs-protocols-regex";
   static final String DFS_PROTOCOLS_REGEX_DEFAULT = "^([^:]*dfs|wasb|ecs):.*";
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request)
-    throws AmbariException {
-
-    if (!super.isApplicable(request, Arrays.asList("YARN"), true)) {
-      return false;
-    }
-
-    PrereqCheckStatus ha = 
request.getResult(CheckDescription.SERVICES_NAMENODE_HA);
-    if (null != ha && ha == PrereqCheckStatus.FAIL) {
-      return false;
-    }
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("YARN");
+  }
 
-    return true;
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public List<CheckQualification> getQualifications() {
+    return Arrays.<CheckQualification> asList(
+        new PriorCheckQualification(CheckDescription.SERVICES_NAMENODE_HA));
   }
 
   /**
@@ -97,7 +99,7 @@ public class ServicesMapReduceDistributedCacheCheck extends 
AbstractCheckDescrip
     final String frameworkPath = 
mrConfig.getProperties().get("mapreduce.application.framework.path");
     final String defaultFS = 
coreSiteConfig.getProperties().get("fs.defaultFS");
 
-    List<String> errorMessages = new ArrayList<String>();
+    List<String> errorMessages = new ArrayList<>();
     if (applicationClasspath == null || applicationClasspath.isEmpty()) {
       errorMessages.add(getFailReason(KEY_APP_CLASSPATH, prerequisiteCheck, 
request));
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 38a6702..ecd88ed 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,11 +17,10 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Arrays;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Config;
@@ -29,6 +28,7 @@ import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -45,11 +45,15 @@ public class ServicesNamenodeHighAvailabilityCheck extends 
AbstractCheckDescript
     super(CheckDescription.SERVICES_NAMENODE_HA);
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList("HDFS"), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("HDFS");
   }
 
+
   @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/1f95e149/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 35be754..ce1b4bf 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
@@ -17,6 +17,10 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
@@ -24,11 +28,9 @@ import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
-import java.util.Arrays;
-import java.util.Map;
-
 /**
  * Checks that namenode high availability is enabled.
  */
@@ -43,18 +45,21 @@ public class ServicesNamenodeTruncateCheck extends 
AbstractCheckDescriptor {
     super(CheckDescription.SERVICES_NAMENODE_TRUNCATE);
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request, Arrays.asList("HDFS"), true)) {
-      return false;
-    }
-
-    PrereqCheckStatus ha = 
request.getResult(CheckDescription.SERVICES_NAMENODE_HA);
-    if (null != ha && ha == PrereqCheckStatus.FAIL) {
-      return false;
-    }
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("HDFS");
+  }
 
-    return true;
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public List<CheckQualification> getQualifications() {
+    return Arrays.<CheckQualification> asList(
+        new PriorCheckQualification(CheckDescription.SERVICES_NAMENODE_HA));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 5dadcdd..cb0c9ae 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
@@ -21,9 +21,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Config;
@@ -33,6 +33,7 @@ import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import 
org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -50,18 +51,21 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
   static final String DFS_PROTOCOLS_REGEX_PROPERTY_NAME = 
"dfs-protocols-regex";
   static final String DFS_PROTOCOLS_REGEX_DEFAULT = "^([^:]*dfs|wasb|ecs):.*";
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    if (!super.isApplicable(request, Arrays.asList("TEZ"), true)) {
-      return false;
-    }
-
-    PrereqCheckStatus ha = 
request.getResult(CheckDescription.SERVICES_NAMENODE_HA);
-    if (null != ha && ha == PrereqCheckStatus.FAIL) {
-      return false;
-    }
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("TEZ");
+  }
 
-    return true;
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public List<CheckQualification> getQualifications() {
+    return Arrays.<CheckQualification> asList(
+        new PriorCheckQualification(CheckDescription.SERVICES_NAMENODE_HA));
   }
 
   /**
@@ -97,7 +101,7 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
     final String useHadoopLibs = 
tezConfig.getProperties().get("tez.use.cluster.hadoop-libs");
     final String defaultFS = 
coreSiteConfig.getProperties().get("fs.defaultFS");
 
-    List<String> errorMessages = new ArrayList<String>();
+    List<String> errorMessages = new ArrayList<>();
     if (libUris == null || libUris.isEmpty()) {
       errorMessages.add(getFailReason(KEY_LIB_URI_MISSING, prerequisiteCheck, 
request));
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 d838f6a..d2f4950 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
@@ -88,13 +88,12 @@ public class ServicesUpCheck extends 
AbstractCheckDescriptor {
 
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
-    List<String> errorMessages = new ArrayList<String>();
-    Set<String> failedServiceNames = new HashSet<String>();
+    List<String> errorMessages = new ArrayList<>();
+    Set<String> failedServiceNames = new HashSet<>();
 
-    StackId stackId = cluster.getCurrentStackVersion();
-
-    for (Map.Entry<String, Service> serviceEntry : 
cluster.getServices().entrySet()) {
-      final Service service = serviceEntry.getValue();
+    Set<String> servicesInUpgrade = getServicesInUpgrade(request);
+    for (String serviceName : servicesInUpgrade) {
+      final Service service = cluster.getService(serviceName);
 
       // Ignore services like Tez that are clientOnly.
       if (service.isClientOnlyService()) {
@@ -132,6 +131,7 @@ public class ServicesUpCheck extends 
AbstractCheckDescriptor {
         // non-master, "true" slaves with cardinality 1+
         boolean checkThreshold = false;
         if (!serviceComponent.isMasterComponent()) {
+          StackId stackId = service.getDesiredStackId();
           ComponentInfo componentInfo = 
ambariMetaInfo.get().getComponent(stackId.getStackName(),
               stackId.getStackVersion(), serviceComponent.getServiceName(),
               serviceComponent.getName());
@@ -182,7 +182,7 @@ public class ServicesUpCheck extends 
AbstractCheckDescriptor {
     }
 
     if (!errorMessages.isEmpty()) {
-      prerequisiteCheck.setFailedOn(new 
LinkedHashSet<String>(failedServiceNames));
+      prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failedServiceNames));
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setFailReason(
           "The following Service Components should be in a started state.  
Please invoke a service Stop and full Start and try again. "

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 77605c1..0b102a9 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
@@ -17,18 +17,17 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Set;
+
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.commons.lang.BooleanUtils;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
-import java.util.Arrays;
-
 /**
  * Checks that YARN has work-preserving restart enabled.
  */
@@ -47,8 +46,8 @@ public class ServicesYarnWorkPreservingCheck extends 
AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList("YARN"), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("YARN");
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/ambari-server/src/main/java/org/apache/ambari/server/checks/StormShutdownWarning.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/StormShutdownWarning.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/StormShutdownWarning.java
index b5435f1..067cd80 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/StormShutdownWarning.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/StormShutdownWarning.java
@@ -17,7 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Arrays;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -25,6 +25,7 @@ import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -50,14 +51,10 @@ public class StormShutdownWarning extends 
AbstractCheckDescriptor {
 
   /**
    * {@inheritDoc}
-   * <p/>
-   * This check is only applicable if Storm is installed and the upgrade type 
is
-   * {@link UpgradeType#ROLLING}.
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    boolean isApplicable = super.isApplicable(request, Arrays.asList("STORM"), 
true);
-    return isApplicable && request.getUpgradeType() == UpgradeType.ROLLING;
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("STORM");
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f95e149/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 9dd4877..e0d3df7 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,17 +17,15 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Arrays;
-import java.util.Map;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.commons.lang.BooleanUtils;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 /**
@@ -49,10 +47,9 @@ public class YarnRMHighAvailabilityCheck extends 
AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
-    return super.isApplicable(request, Arrays.asList("YARN"), true);
+  public Set<String> getApplicableServices() {
+    return Sets.newHashSet("YARN");
   }
-
   /**
    * {@inheritDoc}
    */

Reply via email to