AMBARI-9780. RU: upgrade checks need changes (ncole)

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

Branch: refs/heads/branch-2.0.0
Commit: c9e901bc27cc7711aa0cb329f82752c561be32fa
Parents: 9b86ebd
Author: Nate Cole <[email protected]>
Authored: Wed Feb 25 10:12:22 2015 -0500
Committer: Nate Cole <[email protected]>
Committed: Wed Feb 25 10:12:22 2015 -0500

----------------------------------------------------------------------
 .../server/checks/AbstractCheckDescriptor.java  |  98 ++++++++++--
 .../ambari/server/checks/CheckDescription.java  | 157 +++++++++++++++++++
 .../server/checks/HostsHeartbeatCheck.java      |   9 +-
 .../checks/HostsMasterMaintenanceCheck.java     |  26 +--
 .../checks/HostsRepositoryVersionCheck.java     |   7 +-
 .../checks/SecondaryNamenodeDeletedCheck.java   |  20 ++-
 .../checks/ServicesDecommissionCheck.java       |  17 +-
 .../checks/ServicesMaintenanceModeCheck.java    |  11 +-
 .../ServicesMapReduceDistributedCacheCheck.java |  30 ++--
 .../ServicesNamenodeHighAvailabilityCheck.java  |   9 +-
 .../ServicesTezDistributedCacheCheck.java       |  32 ++--
 .../ambari/server/checks/ServicesUpCheck.java   |   9 +-
 .../checks/ServicesYarnWorkPreservingCheck.java |  12 +-
 .../server/controller/PrereqCheckRequest.java   |  39 ++++-
 .../PreUpgradeCheckResourceProvider.java        |  14 +-
 .../apache/ambari/server/state/CheckHelper.java |  32 +++-
 .../server/state/stack/PrerequisiteCheck.java   |  42 +++--
 .../checks/AbstractCheckDescriptorTest.java     |  28 ++--
 .../server/checks/HostsHeartbeatCheckTest.java  |   4 +-
 .../checks/HostsMasterMaintenanceCheckTest.java |   6 +-
 .../checks/HostsRepositoryVersionCheckTest.java |   4 +-
 .../SecondaryNamenodeDeletedCheckTest.java      |  24 ++-
 .../checks/ServicesDecommissionCheckTest.java   |  12 +-
 .../ServicesMaintenanceModeCheckTest.java       |  13 +-
 ...vicesMapReduceDistributedCacheCheckTest.java |  23 ++-
 ...rvicesNamenodeHighAvailabilityCheckTest.java |   4 +-
 .../ServicesTezDistributedCacheCheckTest.java   |  29 ++--
 .../server/checks/ServicesUpCheckTest.java      |  14 +-
 .../ServicesYarnWorkPreservingCheckTest.java    |   4 +-
 .../ambari/server/state/CheckHelperTest.java    |   3 +
 30 files changed, 547 insertions(+), 185 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 c43d843..d23124b 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,18 +17,24 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 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.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.stack.PrereqCheckType;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -38,9 +44,7 @@ import com.google.inject.Provider;
  */
 public abstract class AbstractCheckDescriptor {
 
-  public final String id;
-  public final String description;
-  public final PrereqCheckType type;
+  private static final Logger LOG = 
LoggerFactory.getLogger(AbstractCheckDescriptor.class);
 
   @Inject
   Provider<Clusters> clustersProvider;
@@ -57,17 +61,15 @@ public abstract class AbstractCheckDescriptor {
   @Inject
   Provider<AmbariMetaInfo> ambariMetaInfo;
 
+  private CheckDescription m_description;
+
   /**
    * Constructor.
    *
-   * @param id unique identifier
-   * @param type type
    * @param description description
    */
-  public AbstractCheckDescriptor(String id, PrereqCheckType type, String 
description) {
-    this.id = id;
-    this.type = type;
-    this.description = description;
+  protected AbstractCheckDescriptor(CheckDescription description) {
+    m_description = description;
   }
 
   /**
@@ -92,6 +94,77 @@ public abstract class AbstractCheckDescriptor {
    */
   public abstract void perform(PrerequisiteCheck prerequisiteCheck, 
PrereqCheckRequest request) throws AmbariException;
 
+
+  public CheckDescription getDescription() {
+    return m_description;
+  }
+
+  public PrereqCheckType getType() {
+    return m_description.getType();
+  }
+
+  /**
+   * Gets the default fail reason
+   * @param prerequisiteCheck the check being performed
+   * @param request           the request
+   * @return the failure string
+   */
+  protected String getFailReason(PrerequisiteCheck prerequisiteCheck, 
PrereqCheckRequest request) {
+    return getFailReason("default", prerequisiteCheck, request);
+  }
+
+  /**
+   * Gets the fail reason
+   * @param key               the failure text key
+   * @param prerequisiteCheck the check being performed
+   * @param request           the request
+   * @return the failure string
+   */
+  protected String getFailReason(String key,
+      PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) {
+    String fail = m_description.getFail(key);
+
+    if (-1 != fail.indexOf("{{version}}") && null != 
request.getRepositoryVersion()) {
+      fail = fail.replace("{{version}}", request.getRepositoryVersion());
+    }
+
+    if (-1 != fail.indexOf("{{fails}}")) {
+      List<String> names = prerequisiteCheck.getFailedOn();
+
+      if (getDescription().getType() == PrereqCheckType.SERVICE) {
+        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());
+
+          List<String> displays = new ArrayList<String>();
+          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");
+        }
+
+        fail = fail.replace("{{fails}}", formatEntityList(names));
+
+      }
+
+
+    }
+
+    return fail;
+  }
+
+
   /**
    * Formats lists of given entities to human readable form:
    * [entity1] -> {entity1} {noun}
@@ -110,12 +183,7 @@ public abstract class AbstractCheckDescriptor {
     if (entities.size() > 1) {
       formatted.replace(formatted.lastIndexOf(","), formatted.lastIndexOf(",") 
+ 1, " and");
     }
-    if (type != null) {
-      formatted.append(" ").append(type.name().toLowerCase());
-      if (entities.size() > 1) {
-        formatted.append("s");
-      }
-    }
+
     return formatted.toString();
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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
new file mode 100644
index 0000000..5b67565
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
@@ -0,0 +1,157 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.checks;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ambari.server.state.stack.PrereqCheckType;
+
+/**
+ * Enum that wraps the various type, text and failure messages for the checks
+ * done for Rolling Upgrades.
+ */
+public enum CheckDescription {
+
+  HOSTS_HEARTBEAT(PrereqCheckType.HOST,
+      "All hosts must be heartbeating with the Ambari Server unless they are 
in Maintenance Mode",
+      new HashMap<String, String>() {{
+        put("default",
+            "The following hosts must be heartbeating to the Ambari Server: 
{{fails}}.");
+      }}),
+
+  HOSTS_MASTER_MAINTENANCE(PrereqCheckType.HOST,
+      "Hosts in Maintenance Mode must not have any master components",
+      new HashMap<String, String>() {{
+        put("default",
+          "The following hosts must not be in in Maintenance Mode since they 
host Master components: {{fails}}.");
+        put("no_upgrade_name",
+          "Could not find suitable upgrade pack for %s %s to version 
{{version}}.");
+        put("no_upgrade_pack",
+          "Could not find upgrade pack named %s.");
+      }}),
+
+  HOSTS_REPOSITORY_VERSION(PrereqCheckType.HOST,
+      "All hosts should have target version installed",
+      new HashMap<String, String>() {{
+        put("default",
+          "The following hosts must have version {{version}} installed: 
{{fails}}.");
+        put("no_repo_version",
+          "Repository version {{version}} does not exist.");
+      }}),
+
+  SECONDARY_NAMENODE_MUST_BE_DELETED(PrereqCheckType.SERVICE,
+      "The SNameNode component must be deleted from all hosts",
+      new HashMap<String, String>() {{
+        put("default", "The SNameNode component must be deleted from host: 
{{fails}}.");
+      }}),
+
+  SERVICES_DECOMMISSION(PrereqCheckType.SERVICE,
+      "Services should not have components in decommission state",
+      new HashMap<String, String>() {{
+        put("default",
+          "The following Services must not have components in decommissioned 
or decommissioning state: {{fails}}.");
+      }}),
+
+  SERVICES_MAINTENANCE_MODE(PrereqCheckType.SERVICE,
+      "No services can be in Maintenance Mode",
+      new HashMap<String, String>() {{
+        put("default",
+          "The following Services must not be in Maintenance Mode: 
{{fails}}.");
+      }}),
+
+  SERVICES_MR_DISTRIBUTED_CACHE(PrereqCheckType.SERVICE,
+      "MapReduce should reference Hadoop libraries from the distributed cache 
in HDFS",
+      new HashMap<String, String>() {{
+        put("app_classpath",
+          "The mapred-site.xml property mapreduce.application.classpath should 
be set.");
+        put("framework_path",
+          "The mapred-site.xml property mapreduce.application.framework.path 
should be set.");
+        put("not_dfs",
+          "The mapred-site.xml property mapreduce.application.framework.path 
or the core-site.xml property fs.defaultFS should point to *dfs:/ url.");
+      }}),
+
+  SERVICES_NAMENODE_HA(PrereqCheckType.SERVICE,
+      "NameNode High Availability must  be enabled",
+      new HashMap<String, String>() {{
+        put("default",
+          "NameNode High Availability is not enabled. Verify that 
dfs.nameservices property is present in hdfs-site.xml.");
+      }}),
+
+
+  SERVICES_TEZ_DISTRIBUTED_CACHE(PrereqCheckType.SERVICE,
+      "Tez should reference Hadoop libraries from the distributed cache in 
HDFS",
+      new HashMap<String, String>() {{
+        put("tez_lib_uri_missing",
+          "The tez-site.xml property tez.lib.uris should be set.");
+        put("tez_use_hadoop_libs",
+          "The tez-site.xml property tez.use.cluster-hadoop-libs should be 
set.");
+        put("lib_not_dfs",
+          "The tez-site.xml property tez.lib.uris or the core-site.xml 
property fs.defaultFS should point to *dfs:/ url.");
+        put("lib_not_targz",
+          "The tez-site.xml property tez.lib.uris should point to tar.gz 
file.");
+        put("tez_use_hadoop_libs_false",
+          "The tez-site.xml property tez.use.cluster.hadoop-libs should be set 
to false.");
+      }}),
+
+  SERVICES_UP(PrereqCheckType.SERVICE,
+      "All services must be started",
+      new HashMap<String, String>() {{
+        put("default",
+          "The following Services must be started: {{fails}}");
+      }}),
+
+  SERVICES_YARN_WP(PrereqCheckType.SERVICE,
+      "YARN work preserving restart should be enabled",
+      new HashMap<String, String>() {{
+        put("default",
+          "YARN should have work preserving restart enabled. The yarn-site.xml 
property yarn.resourcemanager.work-preserving-recovery.enabled property should 
be set to true.");
+      }});
+
+  private PrereqCheckType m_type;
+  private String m_description;
+  private Map<String, String> m_fails;
+  private CheckDescription(PrereqCheckType type, String description,
+      Map<String, String> fails) {
+    m_type = type;
+    m_description = description;
+    m_fails = fails;
+  }
+
+  /**
+   * @return the type of check
+   */
+  public PrereqCheckType getType() {
+    return m_type;
+  }
+
+  /**
+   * @return the text associated with the description
+   */
+  public String getText() {
+    return m_description;
+  }
+
+  /**
+   * @param key the failure text key
+   * @return the fail text template.  Never {@code null}
+   */
+  public String getFail(String key) {
+    return m_fails.containsKey(key) ? m_fails.get(key) : "";
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
index 9e76928..cf9e4ae 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
@@ -17,6 +17,8 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Map;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
@@ -25,9 +27,6 @@ import org.apache.ambari.server.state.HostHealthStatus;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import org.apache.ambari.server.state.stack.PrereqCheckType;
-
-import java.util.Map;
 
 /**
  * Checks that all hosts are either in maintenance mode or heartbeating with 
the server.
@@ -38,7 +37,7 @@ public class HostsHeartbeatCheck extends 
AbstractCheckDescriptor {
    * Constructor.
    */
   public HostsHeartbeatCheck() {
-    super("HOSTS_HEARTBEAT", PrereqCheckType.HOST, "All hosts must be 
heartbeating with the server unless they are in Maintenance Mode");
+    super(CheckDescription.HOSTS_HEARTBEAT);
   }
 
   @Override
@@ -54,7 +53,7 @@ public class HostsHeartbeatCheck extends 
AbstractCheckDescriptor {
     }
     if (!prerequisiteCheck.getFailedOn().isEmpty()) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      
prerequisiteCheck.setFailReason(formatEntityList(prerequisiteCheck.getFailedOn())
 + " must be heartbeating with the server");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 7bdce47..1f97dd9 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
@@ -17,19 +17,23 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.HashSet;
+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.*;
+import org.apache.ambari.server.state.Cluster;
+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.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import org.apache.ambari.server.state.stack.PrereqCheckType;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
 
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
 /**
  * Checks that all hosts in maintenance state do not have master components.
  */
@@ -39,7 +43,7 @@ public class HostsMasterMaintenanceCheck extends 
AbstractCheckDescriptor {
    * Constructor.
    */
   public HostsMasterMaintenanceCheck() {
-    super("HOSTS_MASTER_MAINTENANCE", PrereqCheckType.HOST, "Hosts in 
Maintenance Mode must not have any master components");
+    super(CheckDescription.HOSTS_MASTER_MAINTENANCE);
   }
 
   @Override
@@ -56,13 +60,15 @@ public class HostsMasterMaintenanceCheck extends 
AbstractCheckDescriptor {
     final String upgradePackName = 
repositoryVersionHelper.get().getUpgradePackageName(stackId.getStackName(), 
stackId.getStackVersion(), request.getRepositoryVersion());
     if (upgradePackName == null) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason("Could not find suitable upgrade pack 
for " + stackId.getStackName() + " " + stackId.getStackVersion() + " to version 
" + request.getRepositoryVersion());
+      String fail = getFailReason("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);
-      prerequisiteCheck.setFailReason("Could not find upgrade pack named " + 
upgradePackName);
+      String fail = getFailReason("no_upgrade_pack", prerequisiteCheck, 
request);
+      prerequisiteCheck.setFailReason(String.format(fail, upgradePackName));
       return;
     }
     final Set<String> componentsFromUpgradePack = new HashSet<String>();
@@ -85,7 +91,7 @@ public class HostsMasterMaintenanceCheck extends 
AbstractCheckDescriptor {
     }
     if (!prerequisiteCheck.getFailedOn().isEmpty()) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      
prerequisiteCheck.setFailReason(formatEntityList(prerequisiteCheck.getFailedOn())
 + " must not be in in Maintenance Mode as they have master components 
installed");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 f9bcdd9..cc8335e 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
@@ -29,7 +29,6 @@ import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrereqCheckType;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
 /**
@@ -41,7 +40,7 @@ public class HostsRepositoryVersionCheck extends 
AbstractCheckDescriptor {
    * Constructor.
    */
   public HostsRepositoryVersionCheck() {
-    super("HOSTS_REPOSITORY_VERSION", PrereqCheckType.HOST, "Hosts should have 
the new repository version installed");
+    super(CheckDescription.HOSTS_REPOSITORY_VERSION);
   }
 
   @Override
@@ -61,7 +60,7 @@ public class HostsRepositoryVersionCheck extends 
AbstractCheckDescriptor {
         final RepositoryVersionEntity repositoryVersion = 
repositoryVersionDaoProvider.get().findByStackAndVersion(stackId.getStackId(), 
request.getRepositoryVersion());
         if (repositoryVersion == null) {
           prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-          prerequisiteCheck.setFailReason("Repository version " + 
request.getRepositoryVersion() + " doesn't exist");
+          
prerequisiteCheck.setFailReason(getFailReason("no_repo_version",prerequisiteCheck,
 request));
           prerequisiteCheck.getFailedOn().addAll(clusterHosts.keySet());
           return;
         }
@@ -73,7 +72,7 @@ public class HostsRepositoryVersionCheck extends 
AbstractCheckDescriptor {
     }
     if (!prerequisiteCheck.getFailedOn().isEmpty()) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      
prerequisiteCheck.setFailReason(formatEntityList(prerequisiteCheck.getFailedOn())
 + " must have repository version " + request.getRepositoryVersion() + " 
installed");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 6ba28f1..2a7b9f3 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
@@ -17,7 +17,9 @@
  */
 package org.apache.ambari.server.checks;
 
-import com.google.inject.Inject;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ServiceComponentNotFoundException;
@@ -29,13 +31,9 @@ import org.apache.ambari.server.stack.MasterHostResolver;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.ServiceComponent;
 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.commons.lang.StringUtils;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import com.google.inject.Inject;
 
 /**
  * Checks that the Secondary NameNode is not present on any of the hosts.
@@ -47,7 +45,7 @@ public class SecondaryNamenodeDeletedCheck extends 
AbstractCheckDescriptor {
    * Constructor.
    */
   public SecondaryNamenodeDeletedCheck() {
-    super("SECONDARY_NAMENODE_MUST_BE_DELETED", PrereqCheckType.SERVICE, "The 
SECONDARY_NAMENODE component must be deleted from all hosts");
+    super(CheckDescription.SECONDARY_NAMENODE_MUST_BE_DELETED);
   }
 
   @Override
@@ -58,6 +56,12 @@ public class SecondaryNamenodeDeletedCheck extends 
AbstractCheckDescriptor {
     } catch (ServiceNotFoundException ex) {
       return false;
     }
+
+    PrereqCheckStatus ha = 
request.getResult(CheckDescription.SERVICES_NAMENODE_HA);
+    if (null != ha && ha == PrereqCheckStatus.FAIL) {
+      return false;
+    }
+
     return true;
   }
 
@@ -91,7 +95,7 @@ public class SecondaryNamenodeDeletedCheck extends 
AbstractCheckDescriptor {
     if (!hosts.isEmpty()) {
       prerequisiteCheck.getFailedOn().add(SECONDARY_NAMENODE);
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason("The SECONDARY_NAMENODE component must 
be deleted from host(s): " + StringUtils.join(hosts, ", ") + ". Please delete 
it from the Host Components.");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesDecommissionCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesDecommissionCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesDecommissionCheck.java
index 6ac0326..7497c2f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesDecommissionCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesDecommissionCheck.java
@@ -17,14 +17,17 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Map;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.state.*;
-import org.apache.ambari.server.state.stack.PrereqCheckType;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.HostComponentAdminState;
+import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.ServiceComponent;
+import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-
-import java.util.Map;
+import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
 /**
  * Checks that there are no services in decommission state.
@@ -35,7 +38,7 @@ public class ServicesDecommissionCheck extends 
AbstractCheckDescriptor {
    * Constructor.
    */
   public ServicesDecommissionCheck() {
-    super("SERVICES_DECOMMISSION", PrereqCheckType.SERVICE, "Services should 
not be in Decommission state");
+    super(CheckDescription.SERVICES_DECOMMISSION);
   }
 
   @Override
@@ -56,7 +59,7 @@ public class ServicesDecommissionCheck extends 
AbstractCheckDescriptor {
     }
     if (!prerequisiteCheck.getFailedOn().isEmpty()) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      
prerequisiteCheck.setFailReason(formatEntityList(prerequisiteCheck.getFailedOn())
 + " must not be in decommissioned or decommissioning state");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 5043d31..0ae5c46 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,17 +17,16 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Map;
+
 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.MaintenanceState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.State;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrereqCheckType;
-
-import java.util.Map;
+import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
 /**
  * Checks that services are in the maintenance mode.
@@ -38,7 +37,7 @@ public class ServicesMaintenanceModeCheck extends 
AbstractCheckDescriptor {
    * Constructor.
    */
   public ServicesMaintenanceModeCheck() {
-    super("SERVICES_MAINTENANCE_MODE", PrereqCheckType.SERVICE, "No service 
can be in maintenance mode");
+    super(CheckDescription.SERVICES_MAINTENANCE_MODE);
   }
 
   @Override
@@ -53,7 +52,7 @@ public class ServicesMaintenanceModeCheck extends 
AbstractCheckDescriptor {
     }
     if (!prerequisiteCheck.getFailedOn().isEmpty()) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      
prerequisiteCheck.setFailReason(formatEntityList(prerequisiteCheck.getFailedOn())
 + " must not be in Maintenance Mode");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 c388a81..59e0a95 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
@@ -17,6 +17,10 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -25,13 +29,8 @@ 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.PrereqCheckType;
 import org.apache.commons.lang.StringUtils;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Checks that MR jobs reference hadoop libraries from the distributed cache.
  */
@@ -46,6 +45,12 @@ public class ServicesMapReduceDistributedCacheCheck extends 
AbstractCheckDescrip
     } catch (ServiceNotFoundException ex) {
       return false;
     }
+
+    PrereqCheckStatus ha = 
request.getResult(CheckDescription.SERVICES_NAMENODE_HA);
+    if (null != ha && ha == PrereqCheckStatus.FAIL) {
+      return false;
+    }
+
     return true;
   }
 
@@ -53,7 +58,7 @@ public class ServicesMapReduceDistributedCacheCheck extends 
AbstractCheckDescrip
    * Constructor.
    */
   public ServicesMapReduceDistributedCacheCheck() {
-    super("SERVICES_MR_DISTRIBUTED_CACHE", PrereqCheckType.SERVICE, "MapReduce 
should reference hadoop libraries from the distributed cache");
+    super(CheckDescription.SERVICES_MR_DISTRIBUTED_CACHE);
   }
 
   @Override
@@ -63,6 +68,7 @@ public class ServicesMapReduceDistributedCacheCheck extends 
AbstractCheckDescrip
     final String mrConfigType = "mapred-site";
     final String coreSiteConfigType = "core-site";
     final Map<String, DesiredConfig> desiredConfigs = 
cluster.getDesiredConfigs();
+
     final DesiredConfig mrDesiredConfig = desiredConfigs.get(mrConfigType);
     final DesiredConfig coreSiteDesiredConfig = 
desiredConfigs.get(coreSiteConfigType);
     final Config mrConfig = cluster.getConfig(mrConfigType, 
mrDesiredConfig.getTag());
@@ -73,24 +79,24 @@ public class ServicesMapReduceDistributedCacheCheck extends 
AbstractCheckDescrip
 
     List<String> errorMessages = new ArrayList<String>();
     if (applicationClasspath == null || applicationClasspath.isEmpty()) {
-      errorMessages.add("Property mapreduce.application.classpath is missing 
from mapred-site, please add it.");
+      errorMessages.add(getFailReason("app_classpath", prerequisiteCheck, 
request));
     }
 
     if (frameworkPath == null || frameworkPath.isEmpty()) {
-      errorMessages.add("Property mapreduce.application.framework.path is 
missing from mapred-site, please add it.");
+      errorMessages.add(getFailReason("framework_path", prerequisiteCheck, 
request));
     }
 
     if (!errorMessages.isEmpty()) {
-      prerequisiteCheck.getFailedOn().add("MAP_REDUCE");
+      prerequisiteCheck.getFailedOn().add("MAPREDUCE2");
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setFailReason(StringUtils.join(errorMessages, " "));
       return;
     }
 
     if (!frameworkPath.matches("^[^:]*dfs:.*") && (defaultFS == null || 
!defaultFS.matches("^[^:]*dfs:.*"))) {
-      prerequisiteCheck.getFailedOn().add("MAP_REDUCE");
+      prerequisiteCheck.getFailedOn().add("MAPREDUCE2");
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason("MapReduce should reference hadoop 
libraries from the distributed cache. Please make sure that either 
mapred-site's mapreduce.application.framework.path or core-site's fs.defaultFS 
begins with *dfs:");
+      prerequisiteCheck.setFailReason(getFailReason("not_dfs", 
prerequisiteCheck, request));
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 d9f8704..56ce1c1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
@@ -17,6 +17,8 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Map;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -24,11 +26,8 @@ import org.apache.ambari.server.state.Cluster;
 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.PrereqCheckType;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
-import java.util.Map;
-
 /**
  * Checks that namenode high availability is enabled.
  */
@@ -38,7 +37,7 @@ public class ServicesNamenodeHighAvailabilityCheck extends 
AbstractCheckDescript
    * Constructor.
    */
   public ServicesNamenodeHighAvailabilityCheck() {
-    super("SERVICES_NAMENODE_HA", PrereqCheckType.SERVICE, "Namenode high 
availability should be enabled");
+    super(CheckDescription.SERVICES_NAMENODE_HA);
   }
 
   @Override
@@ -63,7 +62,7 @@ public class ServicesNamenodeHighAvailabilityCheck extends 
AbstractCheckDescript
     if (!config.getProperties().containsKey("dfs.nameservices")) {
       prerequisiteCheck.getFailedOn().add("HDFS");
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason("Namenode high availability is disabled. 
Verify that dfs.nameservices property is present in hdfs-site.xml");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 8859370..6686a95 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
@@ -17,6 +17,10 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
@@ -25,13 +29,8 @@ 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.PrereqCheckType;
 import org.apache.commons.lang.StringUtils;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Checks that Tez jobs reference hadoop libraries from the distributed cache.
  */
@@ -46,6 +45,12 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
     } catch (ServiceNotFoundException ex) {
       return false;
     }
+
+    PrereqCheckStatus ha = 
request.getResult(CheckDescription.SERVICES_NAMENODE_HA);
+    if (null != ha && ha == PrereqCheckStatus.FAIL) {
+      return false;
+    }
+
     return true;
   }
 
@@ -53,7 +58,7 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
    * Constructor.
    */
   public ServicesTezDistributedCacheCheck() {
-    super("SERVICES_TEZ_DISTRIBUTED_CACHE", PrereqCheckType.SERVICE, "TEZ 
should reference hadoop libraries from the distributed cache");
+    super(CheckDescription.SERVICES_TEZ_DISTRIBUTED_CACHE);
   }
 
   @Override
@@ -63,6 +68,7 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
     final String tezConfigType = "tez-site";
     final String coreSiteConfigType = "core-site";
     final Map<String, DesiredConfig> desiredConfigs = 
cluster.getDesiredConfigs();
+
     final DesiredConfig tezDesiredConfig = desiredConfigs.get(tezConfigType);
     final Config tezConfig = cluster.getConfig(tezConfigType, 
tezDesiredConfig.getTag());
     final DesiredConfig coreSiteDesiredConfig = 
desiredConfigs.get(coreSiteConfigType);
@@ -73,11 +79,11 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
 
     List<String> errorMessages = new ArrayList<String>();
     if (libUris == null || libUris.isEmpty()) {
-      errorMessages.add("Property tez.lib.uris is missing from tez-site, 
please add it.");
+      errorMessages.add(getFailReason("tez_lib_uri_missing", 
prerequisiteCheck, request));
     }
 
     if (useHadoopLibs == null || useHadoopLibs.isEmpty()) {
-      errorMessages.add("Property tez.use.cluster.hadoop-libs is missing from 
tez-site, please add it.");
+      errorMessages.add(getFailReason("tez_use_hadoop_libs", 
prerequisiteCheck, request));
     }
 
     if (!errorMessages.isEmpty()) {
@@ -88,13 +94,15 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
     }
 
     if (!libUris.matches("^[^:]*dfs:.*") && (defaultFS == null || 
!defaultFS.matches("^[^:]*dfs:.*"))) {
-      errorMessages.add("Property tez.lib.uris in tez-site should use a 
distributed file system. Please make sure that either tez-site's tez.lib.uris 
or core-site's fs.defaultFS begins with *dfs:");
+      errorMessages.add(getFailReason("lib_not_dfs", prerequisiteCheck, 
request));
     }
+
     if (!libUris.contains("tar.gz")) {
-      errorMessages.add("Property tez.lib.uris in tez-site should end in 
tar.gz");
+      errorMessages.add(getFailReason("lib_not_targz", prerequisiteCheck, 
request));
     }
+
     if (Boolean.parseBoolean(useHadoopLibs)) {
-      errorMessages.add("Property tez.use.cluster.hadoop-libs in tez-site 
should be set to false");
+      errorMessages.add(getFailReason("tez_use_hadoop_libs_false", 
prerequisiteCheck, request));
     }
 
     if (!errorMessages.isEmpty()) {
@@ -103,4 +111,4 @@ public class ServicesTezDistributedCacheCheck extends 
AbstractCheckDescriptor {
       prerequisiteCheck.setFailReason(StringUtils.join(errorMessages, " "));
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 e2b7657..e0696fa 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
@@ -17,17 +17,16 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Map;
+
 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.State;
 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 java.util.Map;
-
 /**
  * Checks that services are up.
  */
@@ -37,7 +36,7 @@ public class ServicesUpCheck extends AbstractCheckDescriptor {
    * Constructor.
    */
   public ServicesUpCheck() {
-    super("SERVICES_UP", PrereqCheckType.SERVICE, "All services must be up");
+    super(CheckDescription.SERVICES_UP);
   }
 
   @Override
@@ -56,7 +55,7 @@ public class ServicesUpCheck extends AbstractCheckDescriptor {
 
     if (!prerequisiteCheck.getFailedOn().isEmpty()) {
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      
prerequisiteCheck.setFailReason(formatEntityList(prerequisiteCheck.getFailedOn())
 + " must be STARTED");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 3b06076..7879346 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,19 +17,18 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Map;
+
 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.DesiredConfig;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 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.commons.lang.BooleanUtils;
 
-import java.util.Map;
-
 /**
  * Checks that YARN has work-preserving restart enabled.
  */
@@ -39,7 +38,7 @@ public class ServicesYarnWorkPreservingCheck extends 
AbstractCheckDescriptor {
    * Constructor.
    */
   public ServicesYarnWorkPreservingCheck() {
-    super("SERVICES_YARN_WP", PrereqCheckType.SERVICE, "YARN work preserving 
restart should be enabled");
+    super(CheckDescription.SERVICES_YARN_WP);
   }
 
   @Override
@@ -65,8 +64,7 @@ public class ServicesYarnWorkPreservingCheck extends 
AbstractCheckDescriptor {
       
!BooleanUtils.toBoolean(config.getProperties().get("yarn.resourcemanager.work-preserving-recovery.enabled")))
 {
       prerequisiteCheck.getFailedOn().add("YARN");
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason("YARN doesn't have work preserving 
restart. Verify that yarn.resourcemanager.work-preserving-recovery.enabled 
property"
-          + " is present in yarn-site.xml and is set to true");
+      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, 
request));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 5f33914..b7b4858 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
@@ -17,27 +17,52 @@
  */
 package org.apache.ambari.server.controller;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ambari.server.checks.CheckDescription;
+import org.apache.ambari.server.state.stack.PrereqCheckStatus;
+
 /**
  * Represents a prerequisite check request.
  */
 public class PrereqCheckRequest {
-  private final String clusterName;
-  private String repositoryVersion;
+  private String m_clusterName;
+  private String m_repositoryVersion;
+  private Map<CheckDescription, PrereqCheckStatus> m_results =
+      new HashMap<CheckDescription, PrereqCheckStatus>();
 
-  //TODO make repositoryVersionName also final as soon as UI will be changed 
to always provide it to API
   public PrereqCheckRequest(String clusterName) {
-    this.clusterName = clusterName;
+    m_clusterName = clusterName;
   }
 
   public String getClusterName() {
-    return clusterName;
+    return m_clusterName;
   }
 
   public String getRepositoryVersion() {
-    return repositoryVersion;
+    return m_repositoryVersion;
   }
 
   public void setRepositoryVersion(String repositoryVersion) {
-    this.repositoryVersion = repositoryVersion;
+    m_repositoryVersion = repositoryVersion;
+  }
+
+  /**
+   * Sets the result of a check.
+   * @param description the description
+   * @param status      the status result
+   */
+  public void addResult(CheckDescription description, PrereqCheckStatus 
status) {
+    m_results.put(description, status);
+  }
+
+  /**
+   * Gets the result of a check of the supplied description
+   * @param description the description
+   * @return the return value, or {@code null} if it has not been run
+   */
+  public PrereqCheckStatus getResult(CheckDescription description) {
+    return m_results.get(description);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 2220b2b..ee8cefce 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
@@ -17,27 +17,26 @@
  */
 package org.apache.ambari.server.controller.internal;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.List;
-import java.util.ArrayList;
 
 import org.apache.ambari.server.StaticallyInject;
 import org.apache.ambari.server.checks.AbstractCheckDescriptor;
 import org.apache.ambari.server.checks.HostsHeartbeatCheck;
 import org.apache.ambari.server.checks.HostsMasterMaintenanceCheck;
 import org.apache.ambari.server.checks.HostsRepositoryVersionCheck;
+import org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck;
 import org.apache.ambari.server.checks.ServicesDecommissionCheck;
-import org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck;
 import org.apache.ambari.server.checks.ServicesMaintenanceModeCheck;
+import org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck;
 import org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck;
-import org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck;
 import org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck;
 import org.apache.ambari.server.checks.ServicesUpCheck;
 import org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck;
-import org.apache.ambari.server.state.CheckHelper;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
@@ -49,6 +48,7 @@ import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.state.CheckHelper;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 
 import com.google.inject.Inject;
@@ -94,7 +94,9 @@ public class PreUpgradeCheckResourceProvider extends 
ReadOnlyResourceProvider {
   private static ServicesTezDistributedCacheCheck 
servicesTezDistributedCacheCheck;
 
   /**
-   * List of the registered upgrade checks
+   * List of the registered upgrade checks.  Make sure that if a check that
+   * depends on the result of another check comes earlier in the list.
+   * For example, MR2 and Tez distributed cache checks rely on NN-HA check 
passing.
    */
   @SuppressWarnings("serial")
   private final List<AbstractCheckDescriptor> updateChecksRegistry = new 
ArrayList<AbstractCheckDescriptor>() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java 
b/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java
index f4b0b52..abaf8e7 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java
@@ -17,17 +17,18 @@
  */
 package org.apache.ambari.server.state;
 
-import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.ambari.server.ClusterNotFoundException;
 import org.apache.ambari.server.checks.AbstractCheckDescriptor;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 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 java.util.ArrayList;
-import java.util.List;
+import com.google.inject.Singleton;
 
 @Singleton
 public class CheckHelper {
@@ -49,24 +50,41 @@ public class CheckHelper {
     final List<PrerequisiteCheck> prerequisiteCheckResults = new 
ArrayList<PrerequisiteCheck>();
     for (AbstractCheckDescriptor checkDescriptor : checksRegistry) {
       final PrerequisiteCheck prerequisiteCheck = new PrerequisiteCheck(
-        checkDescriptor.id, checkDescriptor.description,
-        checkDescriptor.type, clusterName);
+          checkDescriptor.getDescription(), clusterName);
       try {
         if (checkDescriptor.isApplicable(request)) {
           checkDescriptor.perform(prerequisiteCheck, request);
           prerequisiteCheckResults.add(prerequisiteCheck);
+
+          request.addResult(checkDescriptor.getDescription(), 
prerequisiteCheck.getStatus());
         }
       } catch (ClusterNotFoundException ex) {
         prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
         prerequisiteCheck.setFailReason("Cluster with name " + clusterName + " 
doesn't exists");
         prerequisiteCheckResults.add(prerequisiteCheck);
+
+        request.addResult(checkDescriptor.getDescription(), 
prerequisiteCheck.getStatus());
       } catch (Exception ex) {
-        LOG.error("Check " + checkDescriptor.id + " failed", ex);
+        LOG.error("Check " + checkDescriptor.getDescription().name() + " 
failed", ex);
         prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
         prerequisiteCheck.setFailReason("Unexpected server error happened");
         prerequisiteCheckResults.add(prerequisiteCheck);
+
+        request.addResult(checkDescriptor.getDescription(), 
prerequisiteCheck.getStatus());
       }
+
+
+
+
+
+
+
+
+
+
     }
+
+
     return prerequisiteCheckResults;
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/main/java/org/apache/ambari/server/state/stack/PrerequisiteCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/PrerequisiteCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/PrerequisiteCheck.java
index 4ed2fb3..a538dd9 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/PrerequisiteCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/PrerequisiteCheck.java
@@ -20,63 +20,61 @@ package org.apache.ambari.server.state.stack;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.ambari.server.checks.CheckDescription;
+
 /**
  * Contains information about performed prerequisite check.
  *
  */
 public class PrerequisiteCheck {
-  private final String id;
-  private final String description;
-  private final PrereqCheckType type;
-  private final String clusterName;
-  private PrereqCheckStatus status = PrereqCheckStatus.PASS;
-  private String failReason = "";
-  private List<String> failedOn = new ArrayList<String>();
+  private final CheckDescription m_description;
+  private final String m_clusterName;
+  private PrereqCheckStatus m_status = PrereqCheckStatus.PASS;
+  private String m_failReason = "";
+  private List<String> m_failedOn = new ArrayList<String>();
 
-  public PrerequisiteCheck(String id, String description, PrereqCheckType 
type, String clusterName) {
-    this.id = id;
-    this.description = description;
-    this.type = type;
-    this.clusterName = clusterName;
+  public PrerequisiteCheck(CheckDescription description, String clusterName) {
+    m_description = description;
+    m_clusterName = clusterName;
   }
 
   public String getId() {
-    return id;
+    return m_description.name();
   }
 
   public String getDescription() {
-    return description;
+    return m_description.getText();
   }
 
   public PrereqCheckStatus getStatus() {
-    return status;
+    return m_status;
   }
 
   public void setStatus(PrereqCheckStatus status) {
-    this.status = status;
+    m_status = status;
   }
 
   public String getFailReason() {
-    return failReason;
+    return m_failReason;
   }
 
   public void setFailReason(String failReason) {
-    this.failReason = failReason;
+    m_failReason = failReason;
   }
 
   public List<String> getFailedOn() {
-    return failedOn;
+    return m_failedOn;
   }
 
   public void setFailedOn(List<String> failedOn) {
-    this.failedOn = failedOn;
+    m_failedOn = failedOn;
   }
 
   public PrereqCheckType getType() {
-    return type;
+    return m_description.getType();
   }
 
   public String getClusterName() {
-    return clusterName;
+    return m_clusterName;
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/test/java/org/apache/ambari/server/checks/AbstractCheckDescriptorTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/AbstractCheckDescriptorTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/AbstractCheckDescriptorTest.java
index 716d033..4834cee 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/AbstractCheckDescriptorTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/AbstractCheckDescriptorTest.java
@@ -34,9 +34,15 @@ import org.junit.Test;
 public class AbstractCheckDescriptorTest {
 
   private class TestCheckImpl extends AbstractCheckDescriptor {
+    private PrereqCheckType m_type;
+    public TestCheckImpl(PrereqCheckType type) {
+      super(null);
+      m_type = type;
+    }
 
-    public TestCheckImpl(String id, PrereqCheckType type, String description) {
-      super(id, type, description);
+    @Override
+    public PrereqCheckType getType() {
+      return m_type;
     }
 
     @Override
@@ -47,7 +53,7 @@ public class AbstractCheckDescriptorTest {
 
   @Test
   public void testFormatEntityList() {
-    AbstractCheckDescriptor check = new TestCheckImpl(null, 
PrereqCheckType.HOST, null);
+    AbstractCheckDescriptor check = new TestCheckImpl(PrereqCheckType.HOST);
 
     Assert.assertEquals("", check.formatEntityList(null));
 
@@ -55,21 +61,21 @@ public class AbstractCheckDescriptorTest {
     Assert.assertEquals("", check.formatEntityList(failedOn));
 
     failedOn.add("host1");
-    Assert.assertEquals("host1 host", check.formatEntityList(failedOn));
+    Assert.assertEquals("host1", check.formatEntityList(failedOn));
 
     failedOn.add("host2");
-    Assert.assertEquals("host1 and host2 hosts", 
check.formatEntityList(failedOn));
+    Assert.assertEquals("host1 and host2", check.formatEntityList(failedOn));
 
     failedOn.add("host3");
-    Assert.assertEquals("host1, host2 and host3 hosts", 
check.formatEntityList(failedOn));
+    Assert.assertEquals("host1, host2 and host3", 
check.formatEntityList(failedOn));
 
-    check = new TestCheckImpl(null, PrereqCheckType.CLUSTER, null);
-    Assert.assertEquals("host1, host2 and host3 clusters", 
check.formatEntityList(failedOn));
+    check = new TestCheckImpl(PrereqCheckType.CLUSTER);
+    Assert.assertEquals("host1, host2 and host3", 
check.formatEntityList(failedOn));
 
-    check = new TestCheckImpl(null, PrereqCheckType.SERVICE, null);
-    Assert.assertEquals("host1, host2 and host3 services", 
check.formatEntityList(failedOn));
+    check = new TestCheckImpl(PrereqCheckType.SERVICE);
+    Assert.assertEquals("host1, host2 and host3", 
check.formatEntityList(failedOn));
 
-    check = new TestCheckImpl(null, null, null);
+    check = new TestCheckImpl(null);
     Assert.assertEquals("host1, host2 and host3", 
check.formatEntityList(failedOn));
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java
index fa20373..0b77bcb 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java
@@ -82,12 +82,12 @@ public class HostsHeartbeatCheckTest {
     hosts.put("host3", host3);
     Mockito.when(clusters.getHostsForCluster("cluster")).thenReturn(hosts);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     hostHeartbeatCheck.perform(check, new PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
     Mockito.when(status3.getHealthStatus()).thenReturn(HealthStatus.HEALTHY);
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     hostHeartbeatCheck.perform(check, new PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
index 9444aa3..fc0f9bc 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
@@ -94,14 +94,14 @@ public class HostsMasterMaintenanceCheckTest {
     Mockito.when(cluster.getDesiredStackVersion()).thenReturn(new 
StackId("HDP", "1.0"));
     
Mockito.when(repositoryVersionHelper.getUpgradePackageName(Mockito.anyString(), 
Mockito.anyString(), Mockito.anyString())).thenReturn(null);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     hostsMasterMaintenanceCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
     
Mockito.when(repositoryVersionHelper.getUpgradePackageName(Mockito.anyString(), 
Mockito.anyString(), Mockito.anyString())).thenReturn("upgrade pack");
     Mockito.when(ambariMetaInfo.getUpgradePacks(Mockito.anyString(), 
Mockito.anyString())).thenReturn(new HashMap<String, UpgradePack>());
 
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     hostsMasterMaintenanceCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
@@ -113,7 +113,7 @@ public class HostsMasterMaintenanceCheckTest {
     Mockito.when(cluster.getServices()).thenReturn(new HashMap<String, 
Service>());
     
Mockito.when(clusters.getHostsForCluster(Mockito.anyString())).thenReturn(new 
HashMap<String, Host>());
 
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     hostsMasterMaintenanceCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheckTest.java
index 02fd01e..f70d9fc 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheckTest.java
@@ -98,7 +98,7 @@ public class HostsRepositoryVersionCheckTest {
     Mockito.when(clusters.getHostsForCluster("cluster")).thenReturn(hosts);
     
Mockito.when(repositoryVersionDAO.findByStackAndVersion(Mockito.anyString(), 
Mockito.anyString())).thenReturn(null);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     hostsRepositoryVersionCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
@@ -108,7 +108,7 @@ public class HostsRepositoryVersionCheckTest {
     hostVersion.setState(RepositoryVersionState.INSTALLED);
     
Mockito.when(hostVersionDAO.findByClusterStackVersionAndHost(Mockito.anyString(),
 Mockito.anyString(), Mockito.anyString(), 
Mockito.anyString())).thenReturn(hostVersion);
 
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     hostsRepositoryVersionCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java
index 4938468..631ca8a 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.checks;
 import java.util.Collections;
 
 import org.apache.ambari.server.ServiceNotFoundException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.state.Cluster;
@@ -49,13 +50,19 @@ public class SecondaryNamenodeDeletedCheckTest {
   @Before
   public void setup() {
     secondaryNamenodeDeletedCheck.clustersProvider = new Provider<Clusters>() {
-
       @Override
       public Clusters get() {
         return clusters;
       }
     };
 
+    secondaryNamenodeDeletedCheck.ambariMetaInfo = new 
Provider<AmbariMetaInfo>() {
+      @Override
+      public AmbariMetaInfo get() {
+        return Mockito.mock(AmbariMetaInfo.class);
+      }
+    };
+
     secondaryNamenodeDeletedCheck.hostComponentStateDao = 
hostComponentStateDAO;
   }
 
@@ -69,6 +76,17 @@ public class SecondaryNamenodeDeletedCheckTest {
     Mockito.when(cluster.getService("HDFS")).thenReturn(service);
     Assert.assertTrue(secondaryNamenodeDeletedCheck.isApplicable(new 
PrereqCheckRequest("cluster")));
 
+    PrereqCheckRequest req = new PrereqCheckRequest("cluster");
+    req.addResult(CheckDescription.SERVICES_NAMENODE_HA, 
PrereqCheckStatus.FAIL);
+    Mockito.when(cluster.getService("HDFS")).thenReturn(service);
+    Assert.assertFalse(secondaryNamenodeDeletedCheck.isApplicable(req));
+
+    req.addResult(CheckDescription.SERVICES_NAMENODE_HA, 
PrereqCheckStatus.PASS);
+    Mockito.when(cluster.getService("HDFS")).thenReturn(service);
+    Assert.assertTrue(secondaryNamenodeDeletedCheck.isApplicable(req));
+
+
+
     Mockito.when(cluster.getService("HDFS")).thenThrow(new 
ServiceNotFoundException("no", "service"));
     Assert.assertFalse(secondaryNamenodeDeletedCheck.isApplicable(new 
PrereqCheckRequest("cluster")));
   }
@@ -85,12 +103,12 @@ public class SecondaryNamenodeDeletedCheckTest {
     
Mockito.when(service.getServiceComponent("SECONDARY_NAMENODE")).thenReturn(serviceComponent);
     
Mockito.when(serviceComponent.getServiceComponentHosts()).thenReturn(Collections.<String,
 ServiceComponentHost>singletonMap("host", null));
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     secondaryNamenodeDeletedCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
     
Mockito.when(serviceComponent.getServiceComponentHosts()).thenReturn(Collections.<String,
 ServiceComponentHost> emptyMap());
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     secondaryNamenodeDeletedCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesDecommissionCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesDecommissionCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesDecommissionCheckTest.java
index 71e61e2..151648f 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesDecommissionCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesDecommissionCheckTest.java
@@ -21,6 +21,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
@@ -58,6 +59,13 @@ public class ServicesDecommissionCheckTest {
         return clusters;
       }
     };
+    servicesDecommissionCheck.ambariMetaInfo = new Provider<AmbariMetaInfo>() {
+      @Override
+      public AmbariMetaInfo get() {
+        return Mockito.mock(AmbariMetaInfo.class);
+      }
+    };
+
     final Cluster cluster = Mockito.mock(Cluster.class);
     Mockito.when(cluster.getClusterId()).thenReturn(1L);
     Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster);
@@ -78,12 +86,12 @@ public class ServicesDecommissionCheckTest {
     
Mockito.when(serviceComponentHost1.getComponentAdminState()).thenReturn(HostComponentAdminState.DECOMMISSIONED);
     
Mockito.when(serviceComponentHost2.getComponentAdminState()).thenReturn(HostComponentAdminState.INSERVICE);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     servicesDecommissionCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
     
Mockito.when(serviceComponentHost1.getComponentAdminState()).thenReturn(HostComponentAdminState.INSERVICE);
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesDecommissionCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java
index c8c8bd8..ff4e36f 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java
@@ -19,6 +19,7 @@ package org.apache.ambari.server.checks;
 
 import java.util.Collections;
 
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
@@ -54,6 +55,14 @@ public class ServicesMaintenanceModeCheckTest {
         return clusters;
       }
     };
+
+    servicesMaintenanceModeCheck.ambariMetaInfo = new 
Provider<AmbariMetaInfo>() {
+      @Override
+      public AmbariMetaInfo get() {
+        return Mockito.mock(AmbariMetaInfo.class);
+      }
+    };
+
     final Cluster cluster = Mockito.mock(Cluster.class);
     Mockito.when(cluster.getClusterId()).thenReturn(1L);
     Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster);
@@ -62,12 +71,12 @@ public class ServicesMaintenanceModeCheckTest {
     Mockito.when(service.isClientOnlyService()).thenReturn(false);
     Mockito.when(service.getDesiredState()).thenReturn(State.UNKNOWN);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     servicesMaintenanceModeCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
     Mockito.when(service.getDesiredState()).thenReturn(State.STARTED);
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesMaintenanceModeCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 a8a09bd..acc9776 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
@@ -17,7 +17,6 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -67,6 +66,16 @@ public class ServicesMapReduceDistributedCacheCheckTest {
     Mockito.when(cluster.getService("YARN")).thenReturn(service);
     Assert.assertTrue(servicesMapReduceDistributedCacheCheck.isApplicable(new 
PrereqCheckRequest("cluster")));
 
+    PrereqCheckRequest req = new PrereqCheckRequest("cluster");
+    req.addResult(CheckDescription.SERVICES_NAMENODE_HA, 
PrereqCheckStatus.FAIL);
+    Mockito.when(cluster.getService("YARN")).thenReturn(service);
+    
Assert.assertFalse(servicesMapReduceDistributedCacheCheck.isApplicable(req));
+
+    req.addResult(CheckDescription.SERVICES_NAMENODE_HA, 
PrereqCheckStatus.PASS);
+    Mockito.when(cluster.getService("YARN")).thenReturn(service);
+    
Assert.assertTrue(servicesMapReduceDistributedCacheCheck.isApplicable(req));
+
+
     Mockito.when(cluster.getService("YARN")).thenThrow(new 
ServiceNotFoundException("no", "service"));
     Assert.assertFalse(servicesMapReduceDistributedCacheCheck.isApplicable(new 
PrereqCheckRequest("cluster")));
   }
@@ -88,35 +97,35 @@ public class ServicesMapReduceDistributedCacheCheckTest {
     final Map<String, String> properties = new HashMap<String, String>();
     Mockito.when(config.getProperties()).thenReturn(properties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     servicesMapReduceDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesMapReduceDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesMapReduceDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesMapReduceDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesMapReduceDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
 
@@ -124,7 +133,7 @@ public class ServicesMapReduceDistributedCacheCheckTest {
     properties.put("fs.defaultFS", "anything");
     properties.put("mapreduce.application.framework.path", "/some/path");
     properties.put("mapreduce.application.classpath", "anything");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesMapReduceDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java
index c1b2022..85ebc79 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java
@@ -85,12 +85,12 @@ public class ServicesNamenodeHighAvailabilityCheckTest {
     final Map<String, String> properties = new HashMap<String, String>();
     Mockito.when(config.getProperties()).thenReturn(properties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     servicesNamenodeHighAvailabilityCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
     properties.put("dfs.nameservices", "anything");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesNamenodeHighAvailabilityCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e901bc/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 c4dcc5e..88584f7 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
@@ -17,7 +17,6 @@
  */
 package org.apache.ambari.server.checks;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -67,8 +66,20 @@ public class ServicesTezDistributedCacheCheckTest {
     Mockito.when(cluster.getService("TEZ")).thenReturn(service);
     Assert.assertTrue(servicesTezDistributedCacheCheck.isApplicable(new 
PrereqCheckRequest("cluster")));
 
+    PrereqCheckRequest req = new PrereqCheckRequest("cluster");
+    req.addResult(CheckDescription.SERVICES_NAMENODE_HA, 
PrereqCheckStatus.FAIL);
+    Mockito.when(cluster.getService("TEZ")).thenReturn(service);
+    Assert.assertFalse(servicesTezDistributedCacheCheck.isApplicable(req));
+
+    req.addResult(CheckDescription.SERVICES_NAMENODE_HA, 
PrereqCheckStatus.PASS);
+    Mockito.when(cluster.getService("TEZ")).thenReturn(service);
+    Assert.assertTrue(servicesTezDistributedCacheCheck.isApplicable(req));
+
+
     Mockito.when(cluster.getService("TEZ")).thenThrow(new 
ServiceNotFoundException("no", "service"));
     Assert.assertFalse(servicesTezDistributedCacheCheck.isApplicable(new 
PrereqCheckRequest("cluster")));
+
+
   }
 
   @Test
@@ -88,35 +99,35 @@ public class ServicesTezDistributedCacheCheckTest {
     final Map<String, String> properties = new HashMap<String, String>();
     Mockito.when(config.getProperties()).thenReturn(properties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null, null, null);
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     servicesTezDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesTezDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesTezDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesTezDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesTezDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
 
@@ -124,7 +135,7 @@ public class ServicesTezDistributedCacheCheckTest {
     properties.put("fs.defaultFS", "anything");
     properties.put("tez.lib.uris", "/some/path/to/archive.tar.gz");
     properties.put("tez.use.cluster.hadoop-libs", "false");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesTezDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
@@ -132,7 +143,7 @@ public class ServicesTezDistributedCacheCheckTest {
     properties.put("fs.defaultFS", "hdfs://ha");
     properties.put("tez.lib.uris", "/some/path/to/archive.log");
     properties.put("tez.use.cluster.hadoop-libs", "false");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesTezDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
 
@@ -140,7 +151,7 @@ public class ServicesTezDistributedCacheCheckTest {
     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");
-    check = new PrerequisiteCheck(null, null, null, null);
+    check = new PrerequisiteCheck(null, null);
     servicesTezDistributedCacheCheck.perform(check, new 
PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
   }

Reply via email to