You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jl...@apache.org on 2015/11/11 23:59:02 UTC

ambari git commit: AMBARI-13804: RU pre-req checks should allow for other HCFS file systems (jluniya)

Repository: ambari
Updated Branches:
  refs/heads/trunk 34db83ae9 -> a4fd7223a


AMBARI-13804: RU pre-req checks should allow for other HCFS file systems (jluniya)


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

Branch: refs/heads/trunk
Commit: a4fd7223a65b7313928754b61ad36091d4472c8c
Parents: 34db83a
Author: Jayush Luniya <jl...@hortonworks.com>
Authored: Wed Nov 11 14:58:49 2015 -0800
Committer: Jayush Luniya <jl...@hortonworks.com>
Committed: Wed Nov 11 14:58:49 2015 -0800

----------------------------------------------------------------------
 .../HiveDynamicServiceDiscoveryCheck.java       |  29 +++-
 ...apReduce2JobHistoryStatePreservingCheck.java |  48 +------
 .../ServicesMapReduceDistributedCacheCheck.java |  15 +-
 .../checks/ServicesNamenodeTruncateCheck.java   |  11 +-
 .../ServicesTezDistributedCacheCheck.java       |  15 +-
 .../YarnTimelineServerStatePreservingCheck.java |  62 ++++-----
 .../server/controller/PrereqCheckRequest.java   |  14 ++
 .../PreUpgradeCheckResourceProvider.java        |   1 +
 .../ambari/server/state/stack/UpgradePack.java  | 128 ++++++++++++++++-
 .../HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml |   9 ++
 .../HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml |   6 +
 .../HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml |   6 +
 .../stacks/HDP/2.2/upgrades/upgrade-2.2.xml     |  12 +-
 .../stacks/HDP/2.2/upgrades/upgrade-2.3.xml     |  13 +-
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml |   6 +
 .../stacks/HDP/2.3/upgrades/upgrade-2.3.xml     |  13 +-
 .../HiveDynamicServiceDiscoveryCheckTest.java   |   9 ++
 ...duce2JobHistoryStatePreservingCheckTest.java |  13 +-
 ...vicesMapReduceDistributedCacheCheckTest.java | 114 +++++++++++++++-
 .../ServicesNamenodeTruncateCheckTest.java      |  13 +-
 .../ServicesTezDistributedCacheCheckTest.java   | 136 ++++++++++++++++++-
 ...nTimelineServerStatePreservingCheckTest.java |  24 ++++
 .../server/state/stack/UpgradePackTest.java     |  22 +++
 .../HDP/2.1.1/upgrades/upgrade_test_checks.xml  |  11 ++
 .../HDP/2.2.0/upgrades/upgrade_test_checks.xml  |  11 ++
 25 files changed, 619 insertions(+), 122 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/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 d8f51a2..9ecabc7 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
@@ -28,6 +28,7 @@ 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;
 
@@ -44,6 +45,7 @@ public class HiveDynamicServiceDiscoveryCheck extends AbstractCheckDescriptor {
   static final String HIVE_DYNAMIC_SERVICE_DISCOVERY_ENABLED_KEY = "hive.dynamic-service.discovery.enabled.key";
   static final String HIVE_DYNAMIC_SERVICE_ZK_QUORUM_KEY = "hive.dynamic-service.discovery.zk-quorum.key";
   static final String HIVE_DYNAMIC_SERVICE_ZK_NAMESPACE_KEY = "hive.dynamic-service.zk-namespace.key";
+  static final String MIN_FAILURE_STACK_VERSION_PROPERTY_NAME = "min-failure-stack-version";
 
   /**
    * Constructor.
@@ -85,15 +87,32 @@ public class HiveDynamicServiceDiscoveryCheck extends AbstractCheckDescriptor {
           request));
     }
 
+    String minFailureStackVersion = null;
+    PrerequisiteCheckConfig prerequisiteCheckConfig = request.getPrerequisiteCheckConfig();
+    Map<String, String> checkProperties = null;
+    if(prerequisiteCheckConfig != null) {
+      checkProperties = prerequisiteCheckConfig.getCheckProperties(this.getClass().getName());
+    }
+    if(checkProperties != null && checkProperties.containsKey(MIN_FAILURE_STACK_VERSION_PROPERTY_NAME)) {
+      minFailureStackVersion = checkProperties.get(MIN_FAILURE_STACK_VERSION_PROPERTY_NAME);
+    }
+
     if (!errorMessages.isEmpty()) {
       prerequisiteCheck.setFailReason(StringUtils.join(errorMessages, " "));
       prerequisiteCheck.getFailedOn().add("HIVE");
       PrereqCheckStatus checkStatus = PrereqCheckStatus.FAIL;
-      if ("HDP".equals(request.getSourceStackId().getStackName())) {
-        if (VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), "2.3.0.0") < 0
-            && VersionUtils.compareVersions(request.getTargetStackId().getStackVersion(), "2.3.0.0") < 0
-            && VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), request.getTargetStackId().getStackVersion()) < 0) {
-          checkStatus = PrereqCheckStatus.WARNING;
+      if(minFailureStackVersion != null && !minFailureStackVersion.isEmpty()) {
+        String[] minStack = minFailureStackVersion.split("-");
+        if (minStack.length == 2) {
+          String minStackName = minStack[0];
+          String minStackVersion = minStack[1];
+          if (minStackName.equals(request.getSourceStackId().getStackName())) {
+            if (VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), minStackVersion) < 0
+                && VersionUtils.compareVersions(request.getTargetStackId().getStackVersion(), minStackVersion) < 0
+                && VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), request.getTargetStackId().getStackVersion()) < 0) {
+              checkStatus = PrereqCheckStatus.WARNING;
+            }
+          }
         }
       }
       prerequisiteCheck.setStatus(checkStatus);

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/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 af134d8..626438f 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
@@ -24,6 +24,7 @@ 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;
 
@@ -48,33 +49,6 @@ public class MapReduce2JobHistoryStatePreservingCheck extends AbstractCheckDescr
     "mapreduce.jobhistory.recovery.store.leveldb.path";
   final static String YARN_TIMELINE_SERVICE_LEVELDB_STATE_STORE_PATH_KEY =
     "yarn.timeline-service.leveldb-state-store.path";
-  /**
-   * Due to the introduction of MapReduce2 JobHistory state recovery only from certain
-   * stack-versions onwards, this check is not applicable to earlier versions
-   * of the stack.
-   *
-   * This enumeration lists the minimum stack-versions for which this check is applicable.
-   * If a stack is not specified in this enumeration, this check will be applicable.
-   */
-  private enum MinimumApplicableStackVersion {
-    HDP_STACK("HDP", "2.3.0.0");
-
-    private String stackName;
-    private String stackVersion;
-
-    private MinimumApplicableStackVersion(String stackName, String stackVersion) {
-      this.stackName = stackName;
-      this.stackVersion = stackVersion;
-    }
-
-    public String getStackName() {
-      return stackName;
-    }
-
-    public String getStackVersion() {
-      return stackVersion;
-    }
-  }
 
   /**
    * Constructor.
@@ -88,25 +62,7 @@ public class MapReduce2JobHistoryStatePreservingCheck extends AbstractCheckDescr
    */
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws AmbariException {
-    if (!super.isApplicable(request, Arrays.asList("MAPREDUCE2"), true)) {
-      return false;
-    }
-
-    final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName());
-
-    // Applicable only if stack not defined in MinimumApplicableStackVersion, or
-    // version equals or exceeds the enumerated version.
-    for (MinimumApplicableStackVersion minimumStackVersion : MinimumApplicableStackVersion.values()) {
-      String stackName = cluster.getCurrentStackVersion().getStackName();
-      if (minimumStackVersion.getStackName().equals(stackName)){
-        String targetVersion = request.getTargetStackId().getStackVersion();
-        String sourceVersion = request.getSourceStackId().getStackVersion();
-        return VersionUtils.compareVersions(targetVersion, minimumStackVersion.getStackVersion()) >= 0 &&
-               VersionUtils.compareVersions(sourceVersion, minimumStackVersion.getStackVersion()) >= 0;
-      }
-    }
-
-    return true;
+    return super.isApplicable(request, Arrays.asList("MAPREDUCE2"), true);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/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 2359919..8e98c99 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
@@ -30,6 +30,7 @@ import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
 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.commons.lang.StringUtils;
 
 import com.google.inject.Singleton;
@@ -44,6 +45,8 @@ public class ServicesMapReduceDistributedCacheCheck extends AbstractCheckDescrip
   static final String KEY_APP_CLASSPATH = "app_classpath";
   static final String KEY_FRAMEWORK_PATH = "framework_path";
   static final String KEY_NOT_DFS = "not_dfs";
+  static final String DFS_PROTOCOLS_REGEX_PROPERTY_NAME = "dfs-protocols-regex";
+  static final String DFS_PROTOCOLS_REGEX_DEFAULT = "^([^:]*dfs|wasb|ecs):.*";
 
   @Override
   public boolean isApplicable(PrereqCheckRequest request)
@@ -70,6 +73,16 @@ public class ServicesMapReduceDistributedCacheCheck extends AbstractCheckDescrip
 
   @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+    String dfsProtocolsRegex = DFS_PROTOCOLS_REGEX_DEFAULT;
+    PrerequisiteCheckConfig prerequisiteCheckConfig = request.getPrerequisiteCheckConfig();
+    Map<String, String> checkProperties = null;
+    if(prerequisiteCheckConfig != null) {
+      checkProperties = prerequisiteCheckConfig.getCheckProperties(this.getClass().getName());
+    }
+    if(checkProperties != null && checkProperties.containsKey(DFS_PROTOCOLS_REGEX_PROPERTY_NAME)) {
+      dfsProtocolsRegex = checkProperties.get(DFS_PROTOCOLS_REGEX_PROPERTY_NAME);
+    }
+
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     final String mrConfigType = "mapred-site";
@@ -100,7 +113,7 @@ public class ServicesMapReduceDistributedCacheCheck extends AbstractCheckDescrip
       return;
     }
 
-    if (!frameworkPath.matches("^[^:]*dfs:.*") && (defaultFS == null || !defaultFS.matches("^[^:]*dfs:.*"))) {
+    if (!frameworkPath.matches(dfsProtocolsRegex) && (defaultFS == null || !defaultFS.matches(dfsProtocolsRegex))) {
       prerequisiteCheck.getFailedOn().add("MAPREDUCE2");
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setFailReason(getFailReason(KEY_NOT_DFS, prerequisiteCheck, request));

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/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 3761d99..cbb8623 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
@@ -18,17 +18,16 @@
 package org.apache.ambari.server.checks;
 
 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;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import org.apache.ambari.server.utils.VersionUtils;
 
 import com.google.inject.Singleton;
 
 import java.util.Arrays;
+import java.util.Map;
 
 /**
  * Checks that namenode high availability is enabled.
@@ -69,16 +68,8 @@ public class ServicesNamenodeTruncateCheck extends AbstractCheckDescriptor {
     if (Boolean.valueOf(truncateEnabled)) {
       prerequisiteCheck.getFailedOn().add("HDFS");
       PrereqCheckStatus checkStatus = PrereqCheckStatus.FAIL;
-      if ("HDP".equals(request.getSourceStackId().getStackName())) {
-        if (VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), "2.3.0.0") >= 0
-            && VersionUtils.compareVersions(request.getTargetStackId().getStackVersion(), "2.3.0.0") >= 0
-            && VersionUtils.compareVersions(request.getSourceStackId().getStackVersion(), request.getTargetStackId().getStackVersion()) < 0) {
-          checkStatus = PrereqCheckStatus.PASS;
-        }
-      }
       prerequisiteCheck.setStatus(checkStatus);
       prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, request));
-
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/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 70a9b1b..0a866eb 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
@@ -30,6 +30,7 @@ import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
 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.commons.lang.StringUtils;
 
 import com.google.inject.Singleton;
@@ -46,6 +47,8 @@ public class ServicesTezDistributedCacheCheck extends AbstractCheckDescriptor {
   static final String KEY_LIB_NOT_DFS = "lib_not_dfs";
   static final String KEY_LIB_NOT_TARGZ = "lib_not_targz";
   static final String KEY_USE_HADOOP_LIBS_FALSE = "tez_use_hadoop_libs_false";
+  static final String DFS_PROTOCOLS_REGEX_PROPERTY_NAME = "dfs-protocols-regex";
+  static final String DFS_PROTOCOLS_REGEX_DEFAULT = "^([^:]*dfs|wasb|ecs):.*";
 
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws AmbariException {
@@ -70,6 +73,16 @@ public class ServicesTezDistributedCacheCheck extends AbstractCheckDescriptor {
 
   @Override
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+    String dfsProtocolsRegex = DFS_PROTOCOLS_REGEX_DEFAULT;
+    PrerequisiteCheckConfig prerequisiteCheckConfig = request.getPrerequisiteCheckConfig();
+    Map<String, String> checkProperties = null;
+    if(prerequisiteCheckConfig != null) {
+      checkProperties = prerequisiteCheckConfig.getCheckProperties(this.getClass().getName());
+    }
+    if(checkProperties != null && checkProperties.containsKey(DFS_PROTOCOLS_REGEX_PROPERTY_NAME)) {
+      dfsProtocolsRegex = checkProperties.get(DFS_PROTOCOLS_REGEX_PROPERTY_NAME);
+    }
+
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     final String tezConfigType = "tez-site";
@@ -100,7 +113,7 @@ public class ServicesTezDistributedCacheCheck extends AbstractCheckDescriptor {
       return;
     }
 
-    if (!libUris.matches("^[^:]*dfs:.*") && (defaultFS == null || !defaultFS.matches("^[^:]*dfs:.*"))) {
+    if (!libUris.matches(dfsProtocolsRegex) && (defaultFS == null || !defaultFS.matches(dfsProtocolsRegex))) {
       errorMessages.add(getFailReason(KEY_LIB_NOT_DFS, prerequisiteCheck, request));
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/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 03528c2..5dbd0b4 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
@@ -26,6 +26,7 @@ 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.BooleanUtils;
 
@@ -41,34 +42,7 @@ import com.google.inject.Singleton;
 public class YarnTimelineServerStatePreservingCheck extends AbstractCheckDescriptor {
 
   private final static String YARN_TIMELINE_STATE_RECOVERY_ENABLED_KEY = "yarn.timeline-service.recovery.enabled";
-
-  /**
-   * Due to the introduction of YARN Timeline state recovery only from certain
-   * stack-versions onwards, this check is not applicable to earlier versions
-   * of the stack.
-   *
-   * This enumeration lists the minimum stack-versions for which this check is applicable.
-   * If a stack is not specified in this enumeration, this check will be applicable.
-   */
-  private enum MinimumApplicableStackVersion {
-    HDP_STACK("HDP", "2.2.4.2");
-
-    private String stackName;
-    private String stackVersion;
-
-    private MinimumApplicableStackVersion(String stackName, String stackVersion) {
-      this.stackName = stackName;
-      this.stackVersion = stackVersion;
-    }
-
-    public String getStackName() {
-      return stackName;
-    }
-
-    public String getStackVersion() {
-      return stackVersion;
-    }
-  }
+  private final static String MIN_APPLICABLE_STACK_VERSION_PROPERTY_NAME = "min-applicable-stack-version";
 
   /**
    * Constructor.
@@ -88,13 +62,31 @@ public class YarnTimelineServerStatePreservingCheck extends AbstractCheckDescrip
 
     final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName());
 
-    // Applicable only if stack not defined in MinimumApplicableStackVersion, or
-    // version equals or exceeds the enumerated version.
-    for (MinimumApplicableStackVersion minimumStackVersion : MinimumApplicableStackVersion.values()) {
-      String stackName = cluster.getCurrentStackVersion().getStackName();
-      if (minimumStackVersion.getStackName().equals(stackName)){
-        String currentClusterRepositoryVersion = cluster.getCurrentClusterVersion().getRepositoryVersion().getVersion();
-        return VersionUtils.compareVersions(currentClusterRepositoryVersion, minimumStackVersion.getStackVersion()) >= 0;
+    String minApplicableStackVersion = null;
+    PrerequisiteCheckConfig prerequisiteCheckConfig = request.getPrerequisiteCheckConfig();
+    Map<String, String> checkProperties = null;
+    if(prerequisiteCheckConfig != null) {
+      checkProperties = prerequisiteCheckConfig.getCheckProperties(this.getClass().getName());
+    }
+    if(checkProperties != null && checkProperties.containsKey(MIN_APPLICABLE_STACK_VERSION_PROPERTY_NAME)) {
+      minApplicableStackVersion = checkProperties.get(MIN_APPLICABLE_STACK_VERSION_PROPERTY_NAME);
+    }
+
+    // Due to the introduction of YARN Timeline state recovery only from certain
+    // stack-versions onwards, this check is not applicable to earlier versions
+    // of the stack.
+    // Applicable only if min-applicable-stack-version config property is not defined, or
+    // version equals or exceeds the configured version.
+    if(minApplicableStackVersion != null && !minApplicableStackVersion.isEmpty()) {
+      String[] minStack = minApplicableStackVersion.split("-");
+      if(minStack.length == 2) {
+        String minStackName = minStack[0];
+        String minStackVersion = minStack[1];
+        String stackName = cluster.getCurrentStackVersion().getStackName();
+        if (minStackName.equals(stackName)) {
+          String currentClusterRepositoryVersion = cluster.getCurrentClusterVersion().getRepositoryVersion().getVersion();
+          return VersionUtils.compareVersions(currentClusterRepositoryVersion, minStackVersion) >= 0;
+        }
       }
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/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 b8dda3a..8584ef6 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.UpgradePack.PrerequisiteCheckConfig;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
 /**
@@ -33,6 +34,7 @@ public class PrereqCheckRequest {
   private String m_repositoryVersion;
   private StackId m_sourceStackId;
   private StackId m_targetStackId;
+  private PrerequisiteCheckConfig m_prereqCheckConfig;
 
   private UpgradeType m_upgradeType;
 
@@ -125,4 +127,16 @@ public class PrereqCheckRequest {
   public void setTargetStackId(StackId targetStackId) {
     m_targetStackId = targetStackId;
   }
+
+  /**
+   * Gets the prerequisite check config
+   * @return the prereqCheckConfig
+   */
+  public PrerequisiteCheckConfig getPrerequisiteCheckConfig() { return m_prereqCheckConfig; }
+
+  /**
+   * Sets the prerequisite check config obtained from the upgrade pack
+   * @param prereqCheckConfig The prereqCheckConfig
+   */
+  public void setPrerequisiteCheckConfig(PrerequisiteCheckConfig prereqCheckConfig) { m_prereqCheckConfig = prereqCheckConfig;}
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/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 e98f730..7d7b618 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
@@ -187,6 +187,7 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider {
       // ToDo: properly handle exceptions, i.e. create fake check with error description
 
       List<AbstractCheckDescriptor> upgradeChecksToRun = upgradeCheckRegistry.getFilteredUpgradeChecks(upgradePack);
+      upgradeCheckRequest.setPrerequisiteCheckConfig(upgradePack.getPrerequisiteCheckConfig());
 
       for (PrerequisiteCheck prerequisiteCheck : checkHelper.performChecks(upgradeCheckRequest, upgradeChecksToRun)) {
         final Resource resource = new ResourceImpl(Resource.Type.PreUpgradeCheck);

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
index ca1b79b..a3207cd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
@@ -18,6 +18,7 @@
 package org.apache.ambari.server.state.stack;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -31,6 +32,7 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlValue;
 
 import org.apache.ambari.server.state.stack.upgrade.ClusterGrouping;
 import org.apache.ambari.server.state.stack.upgrade.Direction;
@@ -61,9 +63,8 @@ public class UpgradePack {
   @XmlElement(name="group")
   private List<Grouping> groups;
 
-  @XmlElementWrapper(name="prerequisite-checks")
-  @XmlElement(name="check", type=String.class)
-  private List<String> prerequisiteChecks = new ArrayList<String>();
+  @XmlElement(name="prerequisite-checks")
+  private PrerequisiteChecks prerequisiteChecks;
 
   /**
    * In the case of a rolling upgrade, will specify processing logic for a particular component.
@@ -136,7 +137,15 @@ public class UpgradePack {
    * @return the preCheck name, e.g. "CheckDescription"
    */
   public List<String> getPrerequisiteChecks() {
-    return new ArrayList<String>(prerequisiteChecks);
+    return new ArrayList<String>(prerequisiteChecks.checks);
+  }
+
+  /**
+   *
+   * @return the prerequisite check configuration
+   */
+  public PrerequisiteCheckConfig getPrerequisiteCheckConfig() {
+    return prerequisiteChecks.configuration;
   }
 
   /**
@@ -380,4 +389,115 @@ public class UpgradePack {
     @XmlAttribute
     public String version;
   }
+
+  /**
+   * Container class to specify list of additional prerequisite checks to run in addition to the
+   * required prerequisite checks and configuration properties for all prerequisite checks
+   */
+  public static class PrerequisiteChecks {
+    /**
+     * List of additional prerequisite checks to run in addition to required prerequisite checks
+     */
+    @XmlElement(name="check", type=String.class)
+    public List<String> checks = new ArrayList<String>();
+
+    /**
+     * Prerequisite checks configuration
+     */
+    @XmlElement(name="configuration")
+    public PrerequisiteCheckConfig configuration;
+  }
+
+  /**
+   * Prerequisite checks configuration
+   */
+  public static class PrerequisiteCheckConfig {
+    /**
+     * Global config properties common to all prereq checks
+     */
+    @XmlElement(name="property")
+    public List<PrerequisiteProperty> globalProperties;
+
+    /**
+     * Config properties for individual prerequisite checks
+     */
+    @XmlElement(name="check-properties")
+    public List<PrerequisiteCheckProperties> prerequisiteCheckProperties;
+
+    /**
+     * Get global config properties as a map
+     * @return Map of global config properties
+     */
+    public Map<String, String> getGlobalProperties() {
+      if(globalProperties == null) {
+        return null;
+      }
+      Map<String, String> result = new HashMap<String, String>();
+      for (PrerequisiteProperty property : globalProperties) {
+        result.put(property.name, property.value);
+      }
+      return result;
+    }
+
+    /**
+     * Get config properties for a given prerequisite check as a map
+     * @param checkName The prerequisite check name
+     * @return Map of config properties for the prerequisite check
+     */
+    public Map<String, String> getCheckProperties(String checkName) {
+      if(prerequisiteCheckProperties == null) {
+        return null;
+      }
+      for(PrerequisiteCheckProperties checkProperties : prerequisiteCheckProperties) {
+        if(checkProperties.name.equalsIgnoreCase(checkName)) {
+          return checkProperties.getProperties();
+        }
+      }
+      return null;
+    }
+  }
+
+  /**
+   * Config properties for a specific prerequisite check.
+   */
+  public static class PrerequisiteCheckProperties {
+    /**
+     * Prereq check name
+     */
+    @XmlAttribute
+    public String name;
+
+    /**
+     * Config properties for the prerequisite check
+     */
+    @XmlElement(name="property")
+    public List<PrerequisiteProperty> properties;
+
+    /**
+     * Get config properties as a map
+     * @return Map of config properties
+     */
+    public Map<String, String> getProperties() {
+      if(properties == null) {
+        return null;
+      }
+
+      Map<String, String> result = new HashMap<String, String>();
+      for (PrerequisiteProperty property : properties) {
+        result.put(property.name, property.value);
+      }
+      return result;
+    }
+  }
+
+  /**
+   * Prerequisite check config property
+   */
+  public static class PrerequisiteProperty {
+    @XmlAttribute
+    public String name;
+
+    @XmlValue
+    public String value;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
index a6ff604..4f286ae 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
@@ -23,8 +23,17 @@
   <type>NON_ROLLING</type>
   <downgrade-allowed>false</downgrade-allowed>
   <prerequisite-checks>
+    <!-- List of additional pre-req checks to run in addition to the required pre-reqs -->
     <check>org.apache.ambari.server.checks.StormRestAPIDeletedCheck</check>
+
+    <configuration>
+      <!-- Configuration properties for all pre-reqs including required pre-reqs -->
+      <check-properties name="org.apache.ambari.server.checks.HiveDynamicServiceDiscoveryCheck">
+        <property name="min-failure-stack-version">HDP-2.3.0.0</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
+
   <upgrade-path>
     <intermediate-stack version="2.2"/>
     <intermediate-stack version="2.3"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
index d18fbd3..40cb607 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
@@ -22,6 +22,12 @@
   <target-stack>HDP-2.2</target-stack>
   <type>NON_ROLLING</type>
   <prerequisite-checks>
+    <configuration>
+      <!-- Configuration properties for all pre-reqs including required pre-reqs -->
+      <check-properties name="org.apache.ambari.server.checks.HiveDynamicServiceDiscoveryCheck">
+        <property name="min-failure-stack-version">HDP-2.3.0.0</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
   <order>
     <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Upgrade">

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
index 02f5d1c..9a4ddb0 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
@@ -22,6 +22,12 @@
   <target-stack>HDP-2.3</target-stack>
   <type>NON_ROLLING</type>
   <prerequisite-checks>
+    <configuration>
+      <!-- Configuration properties for all pre-reqs including required pre-reqs -->
+      <check-properties name="org.apache.ambari.server.checks.HiveDynamicServiceDiscoveryCheck">
+        <property name="min-failure-stack-version">HDP-2.3.0.0</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
   <order>
     <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Upgrade">

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
index f0351f8..a71ad45 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
@@ -24,8 +24,8 @@
   <target-stack>HDP-2.2</target-stack>
   <type>ROLLING</type>
   <prerequisite-checks>
+    <!-- List of additional pre-req checks to run in addition to the required pre-reqs -->
     <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check>
-    <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check>
     <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check>
     <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check>
     <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check>
@@ -34,6 +34,16 @@
     <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check>
     <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check>
     <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check>
+
+    <configuration>
+      <!-- Configuration properties for all pre-reqs including required pre-reqs -->
+      <check-properties name="org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck">
+        <property name="min-applicable-stack-version">HDP-2.2.4.2</property>
+      </check-properties>
+      <check-properties name="org.apache.ambari.server.checks.HiveDynamicServiceDiscoveryCheck">
+        <property name="min-failure-stack-version">HDP-2.3.0.0</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
 
   <order>

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
index a8a8d89..d318a3a 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
@@ -20,8 +20,8 @@
   <target-stack>HDP-2.3</target-stack>
   <type>ROLLING</type>
   <prerequisite-checks>
+    <!-- List of additional pre-req checks to run in addition to the required pre-reqs -->
     <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check>
-    <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check>
     <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check>
     <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check>
     <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check>
@@ -30,7 +30,18 @@
     <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check>
     <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check>
     <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check>
+
+    <configuration>
+      <!-- Configuration properties for all pre-reqs including required pre-reqs -->
+      <check-properties name="org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck">
+        <property name="min-applicable-stack-version">HDP-2.2.4.2</property>
+      </check-properties>
+      <check-properties name="org.apache.ambari.server.checks.HiveDynamicServiceDiscoveryCheck">
+        <property name="min-failure-stack-version">HDP-2.3.0.0</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
+
   <skip-failures>false</skip-failures>
   <skip-service-check-failures>false</skip-service-check-failures>
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
index 092ab31..25620af 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
@@ -22,6 +22,12 @@
   <target-stack>HDP-2.3</target-stack>
   <type>NON_ROLLING</type>
   <prerequisite-checks>
+    <configuration>
+      <!-- Configuration properties for all pre-reqs including required pre-reqs -->
+      <check-properties name="org.apache.ambari.server.checks.HiveDynamicServiceDiscoveryCheck">
+        <property name="min-failure-stack-version">HDP-2.3.0.0</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
   <order>
     <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Upgrade">

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
index 2787468..e419133 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
@@ -24,17 +24,28 @@
   <target-stack>HDP-2.3</target-stack>
   <type>ROLLING</type>
   <prerequisite-checks>
+    <!-- List of additional pre-req checks to run in addition to the required pre-reqs -->
     <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check>
     <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check>
     <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check>
     <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check>
     <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check>
-    <check>org.apache.ambari.server.checks.ServicesNamenodeTruncateCheck</check>
     <check>org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck</check>
     <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check>
     <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check>
     <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check>
+
+    <configuration>
+      <!-- Configuration properties for all pre-reqs including required pre-reqs -->
+      <check-properties name="org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck">
+        <property name="min-applicable-stack-version">HDP-2.2.4.2</property>
+      </check-properties>
+      <check-properties name="org.apache.ambari.server.checks.HiveDynamicServiceDiscoveryCheck">
+        <property name="min-failure-stack-version">HDP-2.3.0.0</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
+
   <order>
     <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Upgrade">
       <direction>UPGRADE</direction>

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheckTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheckTest.java
index b4bec49..047c8f7 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheckTest.java
@@ -29,6 +29,7 @@ import org.apache.ambari.server.state.DesiredConfig;
 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;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -78,8 +79,16 @@ public class HiveDynamicServiceDiscoveryCheckTest {
     Mockito.when(cluster.getConfig(Mockito.anyString(), Mockito.anyString())).thenReturn(config);
     final Map<String, String> properties = new HashMap<String, String>();
     Mockito.when(config.getProperties()).thenReturn(properties);
+
+    Map<String, String> checkProperties = new HashMap<String, String>();
+    checkProperties.put("min-failure-stack-version","HDP-2.3.0.0");
+    PrerequisiteCheckConfig prerequisiteCheckConfig = Mockito.mock(PrerequisiteCheckConfig.class);
+    Mockito.when(prerequisiteCheckConfig.getCheckProperties(
+        m_check.getClass().getName())).thenReturn(checkProperties);
+
     PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
     // Check HDP-2.2.x => HDP-2.2.y
     request.setSourceStackId(new StackId("HDP-2.2.4.2"));

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java
index c1b57fb..0ee00d5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheckTest.java
@@ -30,6 +30,7 @@ import org.apache.ambari.server.state.Service;
 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;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -90,18 +91,6 @@ public class MapReduce2JobHistoryStatePreservingCheckTest {
     // MAPREDUCE2 installed
     services.put("MAPREDUCE2", Mockito.mock(Service.class));
     Assert.assertTrue(m_check.isApplicable(request));
-
-    // Should not be supported for any upgrade from version less than 2.3.0.0
-    request.setTargetStackId(new StackId("HDP", "2.2.0.1"));
-    Assert.assertFalse(m_check.isApplicable(request));
-
-    request.setSourceStackId(new StackId("HDP", "2.2.0.1"));
-    request.setTargetStackId(new StackId("HDP", "2.3.0.0"));
-    Assert.assertFalse(m_check.isApplicable(request));
-
-    request.setSourceStackId(new StackId("HDP", "2.2.0.1"));
-    request.setTargetStackId(new StackId("HDP", "2.2.1.0"));
-    Assert.assertFalse(m_check.isApplicable(request));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java
index a7c6d58..77d3469 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java
@@ -20,7 +20,6 @@ package org.apache.ambari.server.checks;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
@@ -30,6 +29,7 @@ import org.apache.ambari.server.state.DesiredConfig;
 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.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -144,4 +144,116 @@ public class ServicesMapReduceDistributedCacheCheckTest {
     servicesMapReduceDistributedCacheCheck.perform(check, new PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
   }
+
+  @Test
+  public void testPerformWithCheckConfig() throws Exception {
+    final Cluster cluster = Mockito.mock(Cluster.class);
+    Mockito.when(cluster.getClusterId()).thenReturn(1L);
+    Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster);
+
+    final DesiredConfig desiredConfig = Mockito.mock(DesiredConfig.class);
+    Mockito.when(desiredConfig.getTag()).thenReturn("tag");
+    Map<String, DesiredConfig> configMap = new HashMap<String, DesiredConfig>();
+    configMap.put("mapred-site", desiredConfig);
+    configMap.put("core-site", desiredConfig);
+    Mockito.when(cluster.getDesiredConfigs()).thenReturn(configMap);
+    final Config config = Mockito.mock(Config.class);
+    Mockito.when(cluster.getConfig(Mockito.anyString(), Mockito.anyString())).thenReturn(config);
+    final Map<String, String> properties = new HashMap<String, String>();
+    Mockito.when(config.getProperties()).thenReturn(properties);
+
+    Map<String, String> checkProperties = new HashMap<String, String>();
+    checkProperties.put("dfs-protocols-regex","^([^:]*dfs|wasb|ecs):.*");
+    PrerequisiteCheckConfig prerequisiteCheckConfig = Mockito.mock(PrerequisiteCheckConfig.class);
+    Mockito.when(prerequisiteCheckConfig.getCheckProperties(
+        servicesMapReduceDistributedCacheCheck.getClass().getName())).thenReturn(checkProperties);
+
+    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+
+    properties.put("fs.defaultFS", "anything");
+    properties.put("mapreduce.application.framework.path", "hdfs://some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "anything");
+    properties.put("mapreduce.application.framework.path", "dfs://some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "anything");
+    properties.put("mapreduce.application.framework.path", "wasb://some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "anything");
+    properties.put("mapreduce.application.framework.path", "ecs://some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "hdfs://ha");
+    properties.put("mapreduce.application.framework.path", "/some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "dfs://ha");
+    properties.put("mapreduce.application.framework.path", "/some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "wasb://ha");
+    properties.put("mapreduce.application.framework.path", "/some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "ecs://ha");
+    properties.put("mapreduce.application.framework.path", "/some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    // Fail due to no dfs
+    properties.put("fs.defaultFS", "anything");
+    properties.put("mapreduce.application.framework.path", "/some/path");
+    properties.put("mapreduce.application.classpath", "anything");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesMapReduceDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java
index 9fec6f1..7255ddc 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java
@@ -34,6 +34,7 @@ import org.apache.ambari.server.state.Service;
 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;
 import org.easymock.EasyMock;
 import org.junit.Assert;
 import org.junit.Before;
@@ -111,13 +112,19 @@ public class ServicesNamenodeTruncateCheckTest {
     m_check.perform(check, request);
     assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
-    // Check HDP-2.3.x => HDP-2.3.y is PASS
-    request.setSourceStackId(new StackId("HDP-2.3.4.2"));
-    request.setTargetStackId(new StackId("HDP-2.3.8.4"));
+    m_configMap.put("dfs.allow.truncate", "false");
     check = new PrerequisiteCheck(null, null);
     m_check.perform(check, request);
     assertEquals(PrereqCheckStatus.PASS, check.getStatus());
 
+    // Check HDP-2.2.x => HDP-2.3.y is FAIL
+    m_configMap.put("dfs.allow.truncate", "true");
+    request.setSourceStackId(new StackId("HDP-2.2.4.2"));
+    request.setTargetStackId(new StackId("HDP-2.3.8.4"));
+    check = new PrerequisiteCheck(null, null);
+    m_check.perform(check, request);
+    assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+
     m_configMap.put("dfs.allow.truncate", "false");
     check = new PrerequisiteCheck(null, null);
     m_check.perform(check, request);

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java
index d70d575..49db159 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java
@@ -20,7 +20,6 @@ package org.apache.ambari.server.checks;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
@@ -30,6 +29,7 @@ import org.apache.ambari.server.state.DesiredConfig;
 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.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -162,4 +162,138 @@ public class ServicesTezDistributedCacheCheckTest {
     servicesTezDistributedCacheCheck.perform(check, new PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
   }
+
+  @Test
+  public void testPerformWithCheckConfig() throws Exception {
+    final Cluster cluster = Mockito.mock(Cluster.class);
+    Mockito.when(cluster.getClusterId()).thenReturn(1L);
+    Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster);
+
+    final DesiredConfig desiredConfig = Mockito.mock(DesiredConfig.class);
+    Mockito.when(desiredConfig.getTag()).thenReturn("tag");
+    Map<String, DesiredConfig> configMap = new HashMap<String, DesiredConfig>();
+    configMap.put("tez-site", desiredConfig);
+    configMap.put("core-site", desiredConfig);
+    Mockito.when(cluster.getDesiredConfigs()).thenReturn(configMap);
+    final Config config = Mockito.mock(Config.class);
+    Mockito.when(cluster.getConfig(Mockito.anyString(), Mockito.anyString())).thenReturn(config);
+    final Map<String, String> properties = new HashMap<String, String>();
+    Mockito.when(config.getProperties()).thenReturn(properties);
+
+    Map<String, String> checkProperties = new HashMap<String, String>();
+    checkProperties.put("dfs-protocols-regex","^([^:]*dfs|wasb|ecs):.*");
+    PrerequisiteCheckConfig prerequisiteCheckConfig = Mockito.mock(PrerequisiteCheckConfig.class);
+    Mockito.when(prerequisiteCheckConfig.getCheckProperties(
+        servicesTezDistributedCacheCheck.getClass().getName())).thenReturn(checkProperties);
+
+    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
+
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+
+    properties.put("fs.defaultFS", "anything");
+    properties.put("tez.lib.uris", "hdfs://some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "anything");
+    properties.put("tez.lib.uris", "dfs://some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "anything");
+    properties.put("tez.lib.uris", "wasb://some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "anything");
+    properties.put("tez.lib.uris", "ecs://some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "dfs://ha");
+    properties.put("tez.lib.uris", "/some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "hdfs://ha");
+    properties.put("tez.lib.uris", "/some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "wasb://ha");
+    properties.put("tez.lib.uris", "/some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    properties.put("fs.defaultFS", "ecs://ha");
+    properties.put("tez.lib.uris", "/some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    // Fail due to no DFS
+    properties.put("fs.defaultFS", "anything");
+    properties.put("tez.lib.uris", "/some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+
+    // Fail due to no tar.gz
+    properties.put("fs.defaultFS", "hdfs://ha");
+    properties.put("tez.lib.uris", "/some/path/to/archive.log");
+    properties.put("tez.use.cluster.hadoop-libs", "false");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+
+    // Fail due to property set to true
+    properties.put("fs.defaultFS", "hdfs://ha");
+    properties.put("tez.lib.uris", "/some/path/to/archive.tar.gz");
+    properties.put("tez.use.cluster.hadoop-libs", "true");
+    request = new PrereqCheckRequest("cluster");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
+    check = new PrerequisiteCheck(null, null);
+    servicesTezDistributedCacheCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheckTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheckTest.java
index 06e0b11..1657722 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheckTest.java
@@ -32,6 +32,7 @@ import org.apache.ambari.server.state.Service;
 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;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -85,8 +86,15 @@ public class YarnTimelineServerStatePreservingCheckTest {
     Mockito.when(clusterVersionEntity.getRepositoryVersion()).thenReturn(repositoryVersionEntity);
     Mockito.when(repositoryVersionEntity.getVersion()).thenReturn("2.2.4.2");
 
+    Map<String, String> checkProperties = new HashMap<String, String>();
+    checkProperties.put("min-applicable-stack-version","HDP-2.2.4.2");
+    PrerequisiteCheckConfig prerequisiteCheckConfig = Mockito.mock(PrerequisiteCheckConfig.class);
+    Mockito.when(prerequisiteCheckConfig.getCheckProperties(
+        m_check.getClass().getName())).thenReturn(checkProperties);
+
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
     request.setRepositoryVersion("2.3.0.0");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
     // YARN not installed
     Assert.assertFalse(m_check.isApplicable(request));
@@ -146,7 +154,15 @@ public class YarnTimelineServerStatePreservingCheckTest {
     RepositoryVersionEntity repositoryVersionEntity = Mockito.mock(RepositoryVersionEntity.class);
     Mockito.when(clusterVersionEntity.getRepositoryVersion()).thenReturn(repositoryVersionEntity);
     Mockito.when(m_clusters.getCluster("c1")).thenReturn(cluster);
+
+    Map<String, String> checkProperties = new HashMap<String, String>();
+    checkProperties.put("min-applicable-stack-version","HDP-2.2.4.2");
+    PrerequisiteCheckConfig prerequisiteCheckConfig = Mockito.mock(PrerequisiteCheckConfig.class);
+    Mockito.when(prerequisiteCheckConfig.getCheckProperties(
+        m_check.getClass().getName())).thenReturn(checkProperties);
+
     PrereqCheckRequest request = new PrereqCheckRequest("c1");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
     // Check < 2.2.4.2
     Mockito.when(repositoryVersionEntity.getVersion()).thenReturn("2.1.1.1");
@@ -186,7 +202,15 @@ public class YarnTimelineServerStatePreservingCheckTest {
     RepositoryVersionEntity repositoryVersionEntity = Mockito.mock(RepositoryVersionEntity.class);
     Mockito.when(clusterVersionEntity.getRepositoryVersion()).thenReturn(repositoryVersionEntity);
     Mockito.when(m_clusters.getCluster("c1")).thenReturn(cluster);
+
+    Map<String, String> checkProperties = new HashMap<String, String>();
+    checkProperties.put("min-applicable-stack-version", "HDP-2.2.4.2");
+    PrerequisiteCheckConfig prerequisiteCheckConfig = Mockito.mock(PrerequisiteCheckConfig.class);
+    Mockito.when(prerequisiteCheckConfig.getCheckProperties(
+        m_check.getClass().getName())).thenReturn(checkProperties);
+
     PrereqCheckRequest request = new PrereqCheckRequest("c1");
+    request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
     Mockito.when(repositoryVersionEntity.getVersion()).thenReturn("2.3.0.1");
     boolean isApplicable = m_check.isApplicable(request);

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
index 95b9522..15be8b4 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java
@@ -33,6 +33,7 @@ import java.util.Set;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
 import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
 import org.apache.ambari.server.state.stack.upgrade.ClusterGrouping;
 import org.apache.ambari.server.state.stack.upgrade.ClusterGrouping.ExecuteStage;
@@ -167,6 +168,27 @@ public class UpgradePackTest {
     assertTrue(upgrades.containsKey("upgrade_test_checks"));
     UpgradePack upgrade = upgrades.get("upgrade_test_checks");
 
+    PrerequisiteCheckConfig prerequisiteCheckConfig = upgrade.getPrerequisiteCheckConfig();
+    assertNotNull(prerequisiteCheckConfig);
+    assertNotNull(prerequisiteCheckConfig.globalProperties);
+    assertTrue(prerequisiteCheckConfig.getGlobalProperties().containsKey("global-property-1"));
+    assertEquals("global-value-1", prerequisiteCheckConfig.getGlobalProperties().get("global-property-1"));
+    assertNotNull(prerequisiteCheckConfig.prerequisiteCheckProperties);
+    assertEquals(2, prerequisiteCheckConfig.prerequisiteCheckProperties.size());
+    assertNotNull(prerequisiteCheckConfig.getCheckProperties(
+        "org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck"));
+    assertTrue(prerequisiteCheckConfig.getCheckProperties(
+        "org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck").containsKey("dfs-protocols-regex"));
+    assertEquals("^([^:]*dfs|wasb|ecs):.*", prerequisiteCheckConfig.getCheckProperties(
+        "org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck").get("dfs-protocols-regex"));
+    assertNotNull(prerequisiteCheckConfig.getCheckProperties(
+        "org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck"));
+    assertTrue(prerequisiteCheckConfig.getCheckProperties(
+        "org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck").containsKey("dfs-protocols-regex"));
+    assertEquals("^([^:]*dfs|wasb|ecs):.*", prerequisiteCheckConfig.getCheckProperties(
+        "org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck").get("dfs-protocols-regex"));
+
+
     List<String> expected_up = Arrays.asList(
         "PRE_CLUSTER",
         "ZOOKEEPER",

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
index 05d3db9..85736e1 100644
--- a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
+++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_checks.xml
@@ -30,7 +30,18 @@
     <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check>
     <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check>
     <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check>
+
+    <configuration>
+      <property name="global-property-1">global-value-1</property>
+      <check-properties name="org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck">
+        <property name="dfs-protocols-regex">^([^:]*dfs|wasb|ecs):.*</property>
+      </check-properties>
+      <check-properties name="org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck">
+        <property name="dfs-protocols-regex">^([^:]*dfs|wasb|ecs):.*</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
+
   <order>
     <group xsi:type="cluster" name="PRE_CLUSTER" title="Pre Upgrade" stage="pre">
       <execute-stage title="Confirm 1">

http://git-wip-us.apache.org/repos/asf/ambari/blob/a4fd7223/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
index 14c68be..fb03cb3 100644
--- a/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
+++ b/ambari-server/src/test/resources/stacks/HDP/2.2.0/upgrades/upgrade_test_checks.xml
@@ -30,7 +30,18 @@
     <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check>
     <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check>
     <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check>
+
+    <configuration>
+      <property name="global-property-1">global-value-1</property>
+      <check-properties name="org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck">
+        <property name="dfs-protocols-regex">^([^:]*dfs|wasb|ecs):.*</property>
+      </check-properties>
+      <check-properties name="org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck">
+        <property name="dfs-protocols-regex">^([^:]*dfs|wasb|ecs):.*</property>
+      </check-properties>
+    </configuration>
   </prerequisite-checks>
+
   <order>
     <group xsi:type="cluster" name="PRE_CLUSTER" title="Pre Upgrade" stage="pre">
       <execute-stage title="Confirm 1">