AMBARI-22194 - Prevent Patch Upgrades With Known Service Incompatibilities 
(jonathanhurley)


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

Branch: refs/heads/feature-branch-AMBARI-21307
Commit: c19f363c877776623fd42d285717e6e95b9036ad
Parents: 8ec33db
Author: Jonathan Hurley <jhur...@hortonworks.com>
Authored: Tue Oct 10 15:42:30 2017 -0400
Committer: Jonathan Hurley <jhur...@hortonworks.com>
Committed: Wed Oct 11 09:08:27 2017 -0400

----------------------------------------------------------------------
 .../server/checks/AbstractCheckDescriptor.java  |  81 +++++++++++--
 .../ambari/server/checks/CheckDescription.java  |   8 ++
 .../RequiredServicesInRepositoryCheck.java      |  91 +++++++++++++++
 .../ambari/server/checks/UpgradeCheck.java      |  11 ++
 .../ClusterStackVersionResourceProvider.java    |  26 +++++
 .../ambari/server/state/RepositoryType.java     |  18 +++
 .../server/state/repository/StackPackage.java   |  69 +++++++++++
 .../state/repository/VersionDefinitionXml.java  |  87 ++++++++++++++
 .../HDP/2.0.6/properties/stack_packages.json    |   6 +-
 .../checks/AbstractCheckDescriptorTest.java     |   3 +
 .../checks/AutoStartDisabledCheckTest.java      |  12 +-
 .../checks/ClientRetryPropertyCheckTest.java    |   2 +
 .../checks/ComponentExistsInRepoCheckTest.java  |   2 +
 .../checks/ComponentsInstallationCheckTest.java |   3 +
 .../checks/ConfigurationMergeCheckTest.java     |   2 +
 .../checks/DruidHighAvailabilityCheckTest.java  |   2 +
 .../checks/HiveMultipleMetastoreCheckTest.java  |   3 +
 .../checks/HiveNotRollingWarningTest.java       |   3 +
 .../server/checks/HostsHeartbeatCheckTest.java  |   2 +
 .../checks/HostsMasterMaintenanceCheckTest.java |   5 +-
 .../checks/HostsRepositoryVersionCheckTest.java |   2 +
 .../server/checks/InstallPackagesCheckTest.java |   2 +
 .../server/checks/KafkaKerberosCheckTest.java   |   2 +
 ...duce2JobHistoryStatePreservingCheckTest.java |   2 +
 .../server/checks/RangerAuditDbCheckTest.java   |   3 +
 .../server/checks/RangerPasswordCheckTest.java  |   3 +
 .../server/checks/RangerSSLConfigCheckTest.java |   3 +
 .../RequiredServicesInRepositoryCheckTest.java  | 116 +++++++++++++++++++
 .../SecondaryNamenodeDeletedCheckTest.java      |   3 +
 .../ServicesMaintenanceModeCheckTest.java       |   2 +
 ...vicesMapReduceDistributedCacheCheckTest.java |   3 +
 ...rvicesNamenodeHighAvailabilityCheckTest.java |   3 +
 .../ServicesNamenodeTruncateCheckTest.java      |   2 +
 .../ServicesTezDistributedCacheCheckTest.java   |   3 +
 .../server/checks/ServicesUpCheckTest.java      |   2 +
 .../ServicesYarnWorkPreservingCheckTest.java    |   2 +
 .../server/checks/StormShutdownWarningTest.java |   3 +
 .../ambari/server/state/CheckHelperTest.java    |   7 ++
 38 files changed, 588 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 6726d30..478489d 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
@@ -35,6 +35,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
@@ -44,11 +45,11 @@ import 
org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Lists;
+import com.google.gson.Gson;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -57,8 +58,6 @@ import com.google.inject.Provider;
  */
 public abstract class AbstractCheckDescriptor {
 
-  private static final Logger LOG = 
LoggerFactory.getLogger(AbstractCheckDescriptor.class);
-
   protected static final String DEFAULT = "default";
 
   @Inject
@@ -82,6 +81,9 @@ public abstract class AbstractCheckDescriptor {
   @Inject
   Configuration config;
 
+  @Inject
+  Gson gson;
+
   private CheckDescription m_description;
 
   /**
@@ -128,7 +130,7 @@ public abstract class AbstractCheckDescriptor {
    */
   public final boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
     List<CheckQualification> qualifications = Lists.newArrayList(
-        new ServiceQualification());
+        new ServiceQualification(), new 
OrchestrationQualification(getClass()));
 
     // add any others from the concrete check
     qualifications.addAll(getQualifications());
@@ -302,6 +304,27 @@ public abstract class AbstractCheckDescriptor {
   }
 
   /**
+   * Gets a de-serialized {@link VersionDefinitionXml} from the repository for
+   * this upgrade.
+   *
+   * @param request
+   *          the upgrade check request.
+   * @return the VDF XML
+   * @throws AmbariException
+   */
+  final VersionDefinitionXml getVersionDefinitionXml(PrereqCheckRequest 
request) throws AmbariException {
+    RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
+
+    try {
+      VersionDefinitionXml vdf = repositoryVersion.getRepositoryXml();
+      return vdf;
+    } catch (Exception exception) {
+      throw new AmbariException("Unable to run upgrade checks because of an 
invalid VDF",
+          exception);
+    }
+  }
+
+  /**
    * Gets the services participating in the upgrade from the VDF.
    *
    * @param request
@@ -311,12 +334,11 @@ public abstract class AbstractCheckDescriptor {
    */
   final Set<String> getServicesInUpgrade(PrereqCheckRequest request) throws 
AmbariException {
     final Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
-    RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
 
     // the check is scoped to some services, so determine if any of those
     // services are included in this upgrade
     try {
-      VersionDefinitionXml vdf = repositoryVersion.getRepositoryXml();
+      VersionDefinitionXml vdf = getVersionDefinitionXml(request);
       ClusterVersionSummary clusterVersionSummary = 
vdf.getClusterSummary(cluster);
       return clusterVersionSummary.getAvailableServiceNames();
     } catch (Exception exception) {
@@ -403,4 +425,47 @@ public abstract class AbstractCheckDescriptor {
       return true;
     }
   }
-}
\ No newline at end of file
+
+  /**
+   * The {@link OrchestrationQualification} class is used to determine if the
+   * check is required to run based on the {@link RepositoryType}.
+   */
+  final class OrchestrationQualification implements CheckQualification {
+
+    private final Class<? extends AbstractCheckDescriptor> m_checkClass;
+
+    /**
+     * Constructor.
+     *
+     * @param checkClass
+     *          the class of the check which is being considered for
+     *          applicability.
+     */
+    public OrchestrationQualification(Class<? extends AbstractCheckDescriptor> 
checkClass) {
+      m_checkClass = checkClass;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isApplicable(PrereqCheckRequest request) throws 
AmbariException {
+      RepositoryVersionEntity repositoryVersion = 
request.getTargetRepositoryVersion();
+      RepositoryType repositoryType = repositoryVersion.getType();
+
+      UpgradeCheck annotation = m_checkClass.getAnnotation(UpgradeCheck.class);
+      if (null == annotation) {
+        return true;
+      }
+
+      RepositoryType[] repositoryTypes = annotation.orchestration();
+
+      if (ArrayUtils.isEmpty(repositoryTypes)
+          || ArrayUtils.contains(repositoryTypes, repositoryType)) {
+        return true;
+      }
+
+      return false;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
index c4d0820..3caac14 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
@@ -352,6 +352,14 @@ public class CheckDescription {
           )
           .build()
   );
+  
+  public static CheckDescription VALID_SERVICES_INCLUDED_IN_REPOSITORY = new 
CheckDescription("VALID_SERVICES_INCLUDED_IN_REPOSITORY",
+      PrereqCheckType.CLUSTER,
+      "The repository is missing services which are required",
+      new ImmutableMap.Builder<String, String>()
+        .put(AbstractCheckDescriptor.DEFAULT,
+            "The following services are included in the upgrade but the 
repository is missing their dependencies:\n%s").build());
+  
 
   private String m_name;
   private PrereqCheckType m_type;

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/main/java/org/apache/ambari/server/checks/RequiredServicesInRepositoryCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/RequiredServicesInRepositoryCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/RequiredServicesInRepositoryCheck.java
new file mode 100644
index 0000000..d911411
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/RequiredServicesInRepositoryCheck.java
@@ -0,0 +1,91 @@
+/*
+ * 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.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.RepositoryType;
+import org.apache.ambari.server.state.repository.VersionDefinitionXml;
+import org.apache.ambari.server.state.stack.PrereqCheckStatus;
+import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
+import org.apache.commons.lang.StringUtils;
+
+import com.google.inject.Singleton;
+
+/**
+ * The {@link RequiredServicesInRepositoryCheck} is used to ensure that if 
there
+ * are any services which require other services to also be included in the
+ * upgrade that they are included in the repository.
+ * <p/>
+ * This check is to prevent problems which can be caused by trying to patch
+ * upgrade services which have known depdenencies on other services because of
+ * things like hard coded versions.
+ */
+@Singleton
+@UpgradeCheck(
+    group = UpgradeCheckGroup.REPOSITORY_VERSION,
+    order = 1.0f,
+    required = { UpgradeType.ROLLING, UpgradeType.NON_ROLLING, 
UpgradeType.HOST_ORDERED },
+    orchestration = { RepositoryType.PATCH, RepositoryType.MAINT, 
RepositoryType.SERVICE })
+public class RequiredServicesInRepositoryCheck extends AbstractCheckDescriptor 
{
+
+  /**
+   * Constructor.
+   */
+  public RequiredServicesInRepositoryCheck() {
+    super(CheckDescription.VALID_SERVICES_INCLUDED_IN_REPOSITORY);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request) throws AmbariException {
+    String clusterName = request.getClusterName();
+    Cluster cluster = clustersProvider.get().getCluster(clusterName);
+
+    VersionDefinitionXml xml = getVersionDefinitionXml(request);
+    Map<String, Set<String>> missingDependencies = 
xml.getMissingDependencies(cluster);
+
+    if (!missingDependencies.isEmpty()) {
+      String failReasonTemplate = getFailReason(prerequisiteCheck, request);
+
+      StringBuilder message = new StringBuilder();
+      for (String failedService : missingDependencies.keySet()) {
+        Set<String> servicesRequired = missingDependencies.get(failedService);
+
+        message.append(String.format(
+            "%s requires the following services which are not included: %s",
+            failedService, StringUtils.join(servicesRequired, 
','))).append(System.lineSeparator());
+      }
+
+      prerequisiteCheck.setFailedOn(new 
LinkedHashSet<>(missingDependencies.keySet()));
+      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
+      prerequisiteCheck.setFailReason(String.format(failReasonTemplate, 
message.toString()));
+      return;
+    }
+
+    prerequisiteCheck.setStatus(PrereqCheckStatus.PASS);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
index 58ef4ba..4e03f47 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
@@ -23,6 +23,7 @@ import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
 import com.google.inject.ScopeAnnotation;
@@ -69,4 +70,14 @@ public @interface UpgradeCheck {
    *         defined in the upgrade pack or an empty array for none.
    */
   UpgradeType[] required() default {};
+
+
+  /**
+   * The valid orchestration repository type that this check if valid for. By
+   * default, a check is valid for all orchestration types.
+   *
+   * @return the repository types that the check is valid for.
+   */
+  RepositoryType[] orchestration() default { RepositoryType.STANDARD, 
RepositoryType.PATCH,
+      RepositoryType.MAINT, RepositoryType.SERVICE };
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
index ba5a4e7..388551f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
@@ -442,6 +442,32 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
           String.format("Version %s is backed by a version definition, but it 
could not be parsed", desiredRepoVersion), e);
     }
 
+    // stop the VDF distribution right now if there are problems with service
+    // dependencies
+    try {
+      if (repoVersionEntity.getType().isPartial()) {
+        Map<String, Set<String>> missingDependencies = 
desiredVersionDefinition.getMissingDependencies(cluster);
+
+        if (!missingDependencies.isEmpty()) {
+          StringBuilder message = new StringBuilder(
+              "The following services are included in this repository, but the 
repository is missing their dependencies: ").append(
+                  System.lineSeparator());
+
+          for (String failedService : missingDependencies.keySet()) {
+            message.append(String.format("%s requires the following services: 
%s", failedService,
+                StringUtils.join(missingDependencies.get(failedService), 
','))).append(
+                    System.lineSeparator());
+          }
+
+          throw new SystemException(message.toString());
+        }
+      }
+    } catch (AmbariException ambariException) {
+      throw new SystemException(
+          "Unable to determine if this repository contains the necessary 
service dependencies",
+          ambariException);
+    }
+
     // if true, then we need to force all new host versions into the INSTALLED 
state
     boolean forceInstalled = Boolean.parseBoolean((String)propertyMap.get(
         CLUSTER_STACK_VERSION_FORCE));

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryType.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryType.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryType.java
index bf7eab0..da2eb06 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryType.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/RepositoryType.java
@@ -54,6 +54,13 @@ public enum RepositoryType {
       RepositoryType.PATCH);
 
   /**
+   * The types of repositories which can participate in an upgrade where only
+   * some services are orchestrated.
+   */
+  public static final EnumSet<RepositoryType> PARTIAL = 
EnumSet.of(RepositoryType.MAINT,
+      RepositoryType.PATCH, RepositoryType.SERVICE);
+
+  /**
    * Gets whether applications of this repository are revertable after they 
have
    * been finalized.
    *
@@ -72,4 +79,15 @@ public enum RepositoryType {
         return false;
     }
   }
+
+  /**
+   * Gets whether this repository type can be used to upgrade only a subset of
+   * services.
+   *
+   * @return {@code true} if the repository can be be applied to a subset of
+   *         isntalled services, {@code false} otherwise.
+   */
+  public boolean isPartial() {
+    return PARTIAL.contains(this);
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/main/java/org/apache/ambari/server/state/repository/StackPackage.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/StackPackage.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/StackPackage.java
new file mode 100644
index 0000000..39670da
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/StackPackage.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.state.repository;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+
+/**
+ * Represents the data inside of the {@code stack_packages.json}.
+ */
+public class StackPackage {
+
+  /**
+   * The upgrade dependencies, if any. Will be {@code null} if none.
+   */
+  @SerializedName("upgrade-dependencies")
+  public UpgradeDependencies upgradeDependencies;
+
+  /**
+   * The upgrade dependencies between services.
+   */
+  public static class UpgradeDependencies {
+    Map<String, List<String>> dependencies;
+  }
+
+  /**
+   * A deserializer which extracts the "upgrade-dependencies" key from the
+   * stack_packages.json.
+   */
+  public static class UpgradeDependencyDeserializer
+      implements JsonDeserializer<UpgradeDependencies> {
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public UpgradeDependencies deserialize(JsonElement json, Type typeOfT,
+        JsonDeserializationContext context) throws JsonParseException {
+      Type mapType = new TypeToken<Map<String, List<String>>>() {}.getType();
+      Map<String, List<String>> data = context.deserialize(json, mapType);
+
+      UpgradeDependencies upgradeDependencies = new UpgradeDependencies();
+      upgradeDependencies.dependencies = data;
+      return upgradeDependencies;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java
index ec4814b..1dda0b1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.state.repository;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.StringWriter;
+import java.lang.reflect.Type;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -29,6 +30,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 import java.util.TreeSet;
 
 import javax.xml.XMLConstants;
@@ -50,18 +52,28 @@ import javax.xml.validation.SchemaFactory;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.ComponentInfo;
+import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.repository.AvailableVersion.Component;
+import 
org.apache.ambari.server.state.repository.StackPackage.UpgradeDependencies;
+import 
org.apache.ambari.server.state.repository.StackPackage.UpgradeDependencyDeserializer;
 import org.apache.ambari.server.state.stack.RepositoryXml;
 import org.apache.ambari.server.state.stack.RepositoryXml.Os;
 import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.Sets;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import jline.internal.Log;
+
 /**
  * Class that wraps a repository definition file.
  */
@@ -310,6 +322,81 @@ public class VersionDefinitionXml {
   }
 
   /**
+   * Gets information about services which cannot be upgraded because the
+   * repository does not contain required dependencies. This method will look 
at
+   * the {@code cluster-env/stack_packages} structure to see if there are any
+   * dependencies listed in the {@code upgrade-dependencies} key.
+   *
+   * @param cluster
+   *          the cluster (not {@code null}).
+   * @return a mapping of service name to its missing service dependencies, or
+   *         an empty map if there are none (never {@code null}).
+   * @throws AmbariException
+   */
+  public Map<String, Set<String>> getMissingDependencies(Cluster cluster)
+      throws AmbariException {
+    Map<String, Set<String>> missingDependencies = new TreeMap<>();
+
+    String stackPackagesJson = cluster.getClusterProperty(
+        ConfigHelper.CLUSTER_ENV_STACK_PACKAGES_PROPERTY, null);
+
+    // quick exit
+    if (StringUtils.isEmpty(stackPackagesJson)) {
+      return missingDependencies;
+    }
+
+    // create a GSON builder which can deserialize the stack_packages.json
+    GsonBuilder gsonBuilder = new GsonBuilder();
+    gsonBuilder.registerTypeAdapter(UpgradeDependencies.class, new 
UpgradeDependencyDeserializer());
+    Gson gson = gsonBuilder.create();
+    Type type = new TypeToken<Map<String, StackPackage>>(){}.getType();
+
+    // a mapping of stack name to stack-select/conf-select/upgade-deps
+    final Map<String, StackPackage> stackPackages;
+
+    try {
+      stackPackages = gson.fromJson(stackPackagesJson, type);
+    } catch( Exception exception ) {
+      Log.warn("Unable to deserialize the stack packages JSON, assuming no 
service dependencies",
+          exception);
+
+      return missingDependencies;
+    }
+
+    StackId stackId = new StackId(release.stackId);
+    StackPackage stackPackage = stackPackages.get(stackId.getStackName());
+    if (null == stackPackage || null == stackPackage.upgradeDependencies) {
+      return missingDependencies;
+    }
+
+    Map<String, List<String>> dependencies = 
stackPackage.upgradeDependencies.dependencies;
+
+    if (null == dependencies || dependencies.isEmpty()) {
+      return missingDependencies;
+    }
+
+    ClusterVersionSummary clusterVersionSummary = getClusterSummary(cluster);
+    Set<String> servicesInUpgrade = 
clusterVersionSummary.getAvailableServiceNames();
+    Set<String> servicesInRepository = getAvailableServiceNames();
+
+    for (String serviceInUpgrade : servicesInUpgrade) {
+      List<String> servicesRequired = dependencies.get(serviceInUpgrade);
+      if (null == servicesRequired) {
+        continue;
+      }
+
+      for (String serviceRequired : servicesRequired) {
+        if (!servicesInRepository.contains(serviceRequired)) {
+          missingDependencies.put(serviceInUpgrade, 
Sets.newTreeSet(servicesRequired));
+          break;
+        }
+      }
+    }
+
+    return missingDependencies;
+  }
+
+  /**
    * Structures the manifest by service name.
    * <p/>
    * !!! WARNING. This is currently based on the assumption that there is one 
and only

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
 
b/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
index 8f685f6..c217ea8 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
@@ -1174,6 +1174,10 @@
           "current_dir": "{0}/current/zookeeper-client/conf"
         }
       ]
-    }
+    },
+    "upgrade-dependencies" : {
+      "YARN": ["TEZ"],
+      "TEZ": ["YARN"]
+    }    
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 092bd0b..9915346 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
@@ -30,6 +30,7 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
@@ -120,6 +121,7 @@ public class AbstractCheckDescriptorTest extends 
EasyMockSupport {
     expect(cluster.getServices()).andReturn(services).atLeastOnce();
 
     RepositoryVersionEntity repositoryVersion = 
createNiceMock(RepositoryVersionEntity.class);
+    
expect(repositoryVersion.getType()).andReturn(RepositoryType.STANDARD).anyTimes();
     
expect(repositoryVersion.getRepositoryXml()).andReturn(m_vdfXml).atLeastOnce();
     
expect(m_vdfXml.getClusterSummary(EasyMock.anyObject(Cluster.class))).andReturn(
         m_clusterVersionSummary).atLeastOnce();
@@ -170,6 +172,7 @@ public class AbstractCheckDescriptorTest extends 
EasyMockSupport {
     expect(cluster.getServices()).andReturn(services).atLeastOnce();
 
     RepositoryVersionEntity repositoryVersion = 
createNiceMock(RepositoryVersionEntity.class);
+    
expect(repositoryVersion.getType()).andReturn(RepositoryType.STANDARD).anyTimes();
     
expect(repositoryVersion.getRepositoryXml()).andReturn(m_vdfXml).atLeastOnce();
     
expect(m_vdfXml.getClusterSummary(EasyMock.anyObject(Cluster.class))).andReturn(
         m_clusterVersionSummary).atLeastOnce();

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java
index 4a84483..b3d5b32 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java
@@ -25,10 +25,12 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.commons.lang.StringUtils;
@@ -48,6 +50,8 @@ public class AutoStartDisabledCheckTest {
   private final Clusters m_clusters = EasyMock.createMock(Clusters.class);
   private Map<String, String> m_configMap = new HashMap<>();
 
+  RepositoryVersionEntity repositoryVersionEntity;
+
   @Before
   public void before() throws Exception {
 
@@ -73,7 +77,10 @@ public class AutoStartDisabledCheckTest {
 
     expect(m_clusters.getCluster((String) 
anyObject())).andReturn(cluster).anyTimes();
 
-    replay(m_clusters, cluster, config);
+    repositoryVersionEntity = 
EasyMock.createNiceMock(RepositoryVersionEntity.class);
+    
expect(repositoryVersionEntity.getType()).andReturn(RepositoryType.STANDARD).anyTimes();
+
+    replay(m_clusters, cluster, config, repositoryVersionEntity);
 
     m_configMap.clear();
   }
@@ -82,6 +89,7 @@ public class AutoStartDisabledCheckTest {
   public void testNoAutoStart() throws Exception {
     PrerequisiteCheck check = new 
PrerequisiteCheck(CheckDescription.AUTO_START_DISABLED, "foo");
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setTargetRepositoryVersion(repositoryVersionEntity);
 
     Assert.assertTrue(m_check.isApplicable(request));
 
@@ -95,6 +103,7 @@ public class AutoStartDisabledCheckTest {
   public void testAutoStartFalse() throws Exception {
     PrerequisiteCheck check = new 
PrerequisiteCheck(CheckDescription.AUTO_START_DISABLED, "foo");
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setTargetRepositoryVersion(repositoryVersionEntity);
 
     Assert.assertTrue(m_check.isApplicable(request));
 
@@ -110,6 +119,7 @@ public class AutoStartDisabledCheckTest {
   public void testAutoStartTrue() throws Exception {
     PrerequisiteCheck check = new 
PrerequisiteCheck(CheckDescription.AUTO_START_DISABLED, "foo");
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setTargetRepositoryVersion(repositoryVersionEntity);
 
     Assert.assertTrue(m_check.isApplicable(request));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/ClientRetryPropertyCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ClientRetryPropertyCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ClientRetryPropertyCheckTest.java
index ecc3165..52ec530 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ClientRetryPropertyCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ClientRetryPropertyCheckTest.java
@@ -27,6 +27,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
@@ -78,6 +79,7 @@ public class ClientRetryPropertyCheckTest {
     Configuration config = Mockito.mock(Configuration.class);
     m_check.config = config;
 
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getVersion()).thenReturn("2.3.0.0-1234");
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "2.3"));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java
index ede1daa..2fe8ee0 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java
@@ -30,6 +30,7 @@ import 
org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ComponentInfo;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceInfo;
@@ -147,6 +148,7 @@ public class ComponentExistsInRepoCheckTest extends 
EasyMockSupport {
         TARGET_STACK.getStackVersion(), "ZOOKEEPER", 
"ZOOKEEPER_SERVER")).andReturn(
             m_zookeeperServerInfo).anyTimes();
 
+    
expect(m_repositoryVersion.getType()).andReturn(RepositoryType.STANDARD).anyTimes();
     
expect(m_repositoryVersion.getStackId()).andReturn(TARGET_STACK).anyTimes();
     expect(m_repositoryVersion.getVersion()).andReturn("2.2.0").anyTimes();
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java
index 4ae33f8..0e57966 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java
@@ -33,6 +33,7 @@ import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.StackId;
@@ -86,6 +87,8 @@ public class ComponentsInstallationCheckTest {
     MockitoAnnotations.initMocks(this);
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getVersion()).thenReturn("2.2.0.0-1234");
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "2.2"));
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java
index fd450b9..e017a02 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java
@@ -37,6 +37,7 @@ import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.ConfigMergeHelper;
 import org.apache.ambari.server.state.PropertyInfo;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
@@ -82,6 +83,7 @@ public class ConfigurationMergeCheckTest {
 
     
expect(cluster.getDesiredConfigByType(CONFIG_TYPE)).andReturn(config).anyTimes();
 
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getVersion()).thenReturn("1.1.0.0-1234");
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "1.1"));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/DruidHighAvailabilityCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/DruidHighAvailabilityCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/DruidHighAvailabilityCheckTest.java
index dfb18ed..efc6a80 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/DruidHighAvailabilityCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/DruidHighAvailabilityCheckTest.java
@@ -27,6 +27,7 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
@@ -87,6 +88,7 @@ public class DruidHighAvailabilityCheckTest
     druidHighAvailabilityCheck.config = config;
 
     m_services.clear();
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheckTest.java
index 3dfe2f8..6bba2ea 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheckTest.java
@@ -27,6 +27,7 @@ import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
@@ -85,6 +86,8 @@ public class HiveMultipleMetastoreCheckTest {
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "1.0"));
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveNotRollingWarningTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveNotRollingWarningTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveNotRollingWarningTest.java
index 3b0c900..bed1b43 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveNotRollingWarningTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/HiveNotRollingWarningTest.java
@@ -24,6 +24,7 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
@@ -66,6 +67,8 @@ public class HiveNotRollingWarningTest extends 
EasyMockSupport {
   @Before
   public void setup() throws Exception {
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 daf2e4c..cf42ab7 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
@@ -29,6 +29,7 @@ import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostHealthStatus;
 import org.apache.ambari.server.state.HostHealthStatus.HealthStatus;
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
@@ -53,6 +54,7 @@ public class HostsHeartbeatCheckTest {
    */
   @Before
   public void setup() throws Exception {
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getVersion()).thenReturn("2.2.0.0-1234");
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "2.2"));
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 8fcb1b2..c7cb13f 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
@@ -27,6 +27,7 @@ import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
@@ -71,6 +72,8 @@ public class HostsMasterMaintenanceCheckTest {
   @Before
   public void setup() throws Exception {
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());
@@ -170,4 +173,4 @@ public class HostsMasterMaintenanceCheckTest {
     hostsMasterMaintenanceCheck.perform(check, checkRequest);
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 5539618..2d60a52 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
@@ -31,6 +31,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
@@ -73,6 +74,7 @@ public class HostsRepositoryVersionCheckTest {
   public void setup() throws Exception {
     m_services.clear();
 
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getVersion()).thenReturn("1.0.0.0-1234");
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "1.0"));
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/InstallPackagesCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/InstallPackagesCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/InstallPackagesCheckTest.java
index cdfbb0a..b02d834 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/InstallPackagesCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/InstallPackagesCheckTest.java
@@ -34,6 +34,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
@@ -73,6 +74,7 @@ public class InstallPackagesCheckTest {
    */
   @Before
   public void setup() throws Exception {
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     
Mockito.when(m_repositoryVersion.getVersion()).thenReturn(repositoryVersion);
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(targetStackId);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/KafkaKerberosCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/KafkaKerberosCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/KafkaKerberosCheckTest.java
index 9a95c42..b4ee6ec 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/KafkaKerberosCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/KafkaKerberosCheckTest.java
@@ -24,6 +24,7 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
@@ -68,6 +69,7 @@ public class KafkaKerberosCheckTest {
     };
 
     m_services.clear();
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 096781c..f8ea169 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
@@ -97,6 +97,8 @@ public class MapReduce2JobHistoryStatePreservingCheckTest {
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "2.3"));
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerAuditDbCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerAuditDbCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerAuditDbCheckTest.java
index ec91e48..4a7e8d3 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerAuditDbCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerAuditDbCheckTest.java
@@ -27,6 +27,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
@@ -72,6 +73,8 @@ public class RangerAuditDbCheckTest {
     rangerAuditDbCheck.config = config;
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerPasswordCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerPasswordCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerPasswordCheckTest.java
index cfffb8f..d24c73c 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerPasswordCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerPasswordCheckTest.java
@@ -39,6 +39,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
@@ -149,6 +150,8 @@ public class RangerPasswordCheckTest {
     
PowerMockito.whenNew(URLStreamProvider.class).withAnyArguments().thenReturn(m_streamProvider);
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerSSLConfigCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerSSLConfigCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerSSLConfigCheckTest.java
index af016b0..50ec21c 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerSSLConfigCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/RangerSSLConfigCheckTest.java
@@ -27,6 +27,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
@@ -73,6 +74,8 @@ public class RangerSSLConfigCheckTest {
     rangerSSLConfigCheck.config = config;
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/RequiredServicesInRepositoryCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/RequiredServicesInRepositoryCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/RequiredServicesInRepositoryCheckTest.java
new file mode 100644
index 0000000..0285c0a
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/RequiredServicesInRepositoryCheckTest.java
@@ -0,0 +1,116 @@
+/**
+ * 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 static org.mockito.Mockito.mock;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.repository.VersionDefinitionXml;
+import org.apache.ambari.server.state.stack.PrereqCheckStatus;
+import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import com.google.common.collect.Sets;
+import com.google.gson.Gson;
+import com.google.inject.Provider;
+
+/**
+ * Tests {@link RequiredServicesInRepositoryCheck}.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class RequiredServicesInRepositoryCheckTest {
+
+  private static final String CLUSTER_NAME = "c1";
+
+  @Mock
+  private VersionDefinitionXml m_vdfXml;
+
+  @Mock
+  private RepositoryVersionEntity m_repositoryVersion;
+
+  private RequiredServicesInRepositoryCheck m_requiredServicesCheck;
+
+  /**
+   * Used to return the missing dependencies for the test.
+   */
+  private Map<String, Set<String>> m_missingDependencies = new HashMap<>();
+
+  @Before
+  public void setUp() throws Exception {
+    final Clusters clusters = mock(Clusters.class);
+    m_requiredServicesCheck = new RequiredServicesInRepositoryCheck();
+    m_requiredServicesCheck.clustersProvider = new Provider<Clusters>() {
+      @Override
+      public Clusters get() {
+        return clusters;
+      }
+    };
+
+    final Cluster cluster = Mockito.mock(Cluster.class);
+    Mockito.when(cluster.getClusterId()).thenReturn(1L);
+    Mockito.when(clusters.getCluster(CLUSTER_NAME)).thenReturn(cluster);
+
+    Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
+    
Mockito.when(m_vdfXml.getMissingDependencies(Mockito.eq(cluster))).thenReturn(m_missingDependencies);
+  }
+
+  /**
+   * Tests that a no missing services results in a passed test.
+   *
+   * @throws Exception
+   */
+  @Test
+  public void testNoMissingServices() throws Exception {
+    PrereqCheckRequest request = new PrereqCheckRequest(CLUSTER_NAME);
+    request.setTargetRepositoryVersion(m_repositoryVersion);
+
+    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
+    m_requiredServicesCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+  }
+
+  /**
+   * Tests that a missing required service causes the test to fail.
+   *
+   * @throws Exception
+   */
+  @Test
+  public void testMissingRequiredService() throws Exception {
+    PrereqCheckRequest request = new PrereqCheckRequest(CLUSTER_NAME);
+    request.setTargetRepositoryVersion(m_repositoryVersion);
+
+    m_missingDependencies.put("FOO", Sets.newHashSet("BAR"));
+
+    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
+    m_requiredServicesCheck.perform(check, request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 67c458a..c038c47 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
@@ -28,6 +28,7 @@ import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
@@ -87,6 +88,8 @@ public class SecondaryNamenodeDeletedCheckTest {
     secondaryNamenodeDeletedCheck.config = config;
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 6577651..694a9b6 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
@@ -27,6 +27,7 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
@@ -70,6 +71,7 @@ public class ServicesMaintenanceModeCheckTest {
   public void setup() throws Exception {
     m_services.clear();
 
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getVersion()).thenReturn("2.2.0.0-1234");
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "2.2"));
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 a8569cc..b32a782 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
@@ -27,6 +27,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
@@ -77,6 +78,8 @@ public class ServicesMapReduceDistributedCacheCheckTest {
     servicesMapReduceDistributedCacheCheck.config = config;
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 c7e8fd6..8c51add 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
@@ -28,6 +28,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
@@ -77,6 +78,8 @@ public class ServicesNamenodeHighAvailabilityCheckTest {
     servicesNamenodeHighAvailabilityCheck.config = config;
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 545caf3..356d2cd 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
@@ -31,6 +31,7 @@ import 
org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
@@ -99,6 +100,7 @@ public class ServicesNamenodeTruncateCheckTest {
       }
     };
 
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getVersion()).thenReturn("HDP-2.2.0.0");
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "2.2.0"));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/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 96eefc1..0123f18 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
@@ -27,6 +27,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
@@ -77,6 +78,8 @@ public class ServicesTezDistributedCacheCheckTest {
     servicesTezDistributedCacheCheck.config = config;
 
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java
index a851919..4d00644 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java
@@ -33,6 +33,7 @@ import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.StackId;
@@ -87,6 +88,7 @@ public class ServicesUpCheckTest {
 
     m_services.clear();
 
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getVersion()).thenReturn("2.2.0.0-1234");
     Mockito.when(m_repositoryVersion.getStackId()).thenReturn(new 
StackId("HDP", "2.2"));
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java
index 331223d..5164a4f 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java
@@ -28,6 +28,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
@@ -77,6 +78,7 @@ public class ServicesYarnWorkPreservingCheckTest {
     Configuration config = Mockito.mock(Configuration.class);
     servicesYarnWorkPreservingCheck.config = config;
 
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/checks/StormShutdownWarningTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/StormShutdownWarningTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/StormShutdownWarningTest.java
index 1441256..a5e24f1 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/StormShutdownWarningTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/StormShutdownWarningTest.java
@@ -24,6 +24,7 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
@@ -66,6 +67,8 @@ public class StormShutdownWarningTest extends EasyMockSupport 
{
   @Before
   public void setup() throws Exception {
     m_services.clear();
+
+    
Mockito.when(m_repositoryVersion.getType()).thenReturn(RepositoryType.STANDARD);
     Mockito.when(m_repositoryVersion.getRepositoryXml()).thenReturn(m_vdfXml);
     
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c19f363c/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
index 0301431..14a1eaf 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
@@ -100,6 +100,8 @@ public class CheckHelperTest {
     updateChecksRegistry.add(m_mockCheck);
 
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setTargetRepositoryVersion(m_repositoryVersion);
+
     helper.performChecks(request, updateChecksRegistry, configuration);
 
     Assert.assertEquals(PrereqCheckStatus.PASS, 
request.getResult(m_mockCheckDescription));
@@ -128,6 +130,7 @@ public class CheckHelperTest {
     updateChecksRegistry.add(m_mockCheck);
 
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+
     helper.performChecks(request, updateChecksRegistry, configuration);
 
 
@@ -151,6 +154,8 @@ public class CheckHelperTest {
     Mockito.when(m_mockPerform.toString()).thenThrow(new RuntimeException());
 
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setTargetRepositoryVersion(m_repositoryVersion);
+
     helper.performChecks(request, updateChecksRegistry, configuration);
 
     Assert.assertEquals(PrereqCheckStatus.FAIL, 
request.getResult(m_mockCheckDescription));
@@ -173,6 +178,8 @@ public class CheckHelperTest {
     Mockito.when(m_mockPerform.toString()).thenThrow(new RuntimeException());
 
     PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    request.setTargetRepositoryVersion(m_repositoryVersion);
+
     helper.performChecks(request, updateChecksRegistry, configuration);
 
     Assert.assertEquals(PrereqCheckStatus.BYPASS, 
request.getResult(m_mockCheckDescription));

Reply via email to