This is an automated email from the ASF dual-hosted git repository.

ncole pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 26bb2eb  [AMBARI-24780] Add Hotfix to VDF Release Element (#2469)
26bb2eb is described below

commit 26bb2ebc342c9f9b56088280e2f852eb1cfa1fa4
Author: ncole <nc...@hortonworks.com>
AuthorDate: Tue Oct 16 12:31:32 2018 -0400

    [AMBARI-24780] Add Hotfix to VDF Release Element (#2469)
---
 .../apache/ambari/spi/stack/StackReleaseInfo.java  | 65 +++++++++++++++++++
 .../ambari/spi/stack/StackReleaseVersion.java      | 47 ++++++++++++++
 .../checks/RequiredServicesInRepositoryCheck.java  |  3 +-
 .../server/controller/StackVersionResponse.java    | 27 +++-----
 .../ClusterStackVersionResourceProvider.java       |  8 ++-
 .../internal/StackVersionResourceProvider.java     |  3 -
 .../VersionDefinitionResourceProvider.java         | 17 +++--
 .../orm/entities/RepositoryVersionEntity.java      | 13 ----
 .../apache/ambari/server/stack/StackModule.java    |  2 +-
 .../stack/upgrade/RepositoryVersionHelper.java     |  2 +-
 .../stack/upgrade/orchestrate/UpgradeContext.java  |  3 +-
 .../stack/upgrade/orchestrate/UpgradeHelper.java   |  2 +-
 .../apache/ambari/server/state/CheckHelper.java    |  7 +-
 .../org/apache/ambari/server/state/StackInfo.java  | 52 ++++++++++++---
 .../ambari/server/state/cluster/ClusterImpl.java   |  3 +-
 .../state/repository/DefaultStackVersion.java      | 74 ++++++++++++++++++++++
 .../ambari/server/state/repository/Release.java    | 25 +++++---
 .../state/repository/VersionDefinitionXml.java     | 31 ++++++---
 .../server/state/stack/StackMetainfoXml.java       | 34 +++++-----
 .../src/main/resources/version_definition.xsd      |  5 +-
 .../server/api/services/AmbariMetaInfoTest.java    |  1 -
 .../AmbariMetricsHadoopSinkVersionCheckTest.java   |  3 +-
 .../ambari/server/checks/ClusterCheckTest.java     | 27 ++++++--
 .../checks/ComponentsInstallationCheckTest.java    | 11 +++-
 .../checks/HostsMasterMaintenanceCheckTest.java    |  2 +-
 .../checks/HostsRepositoryVersionCheckTest.java    |  3 +-
 .../ambari/server/checks/MockCheckHelper.java      |  8 +++
 .../RequiredServicesInRepositoryCheckTest.java     | 13 +++-
 .../checks/ServicesMaintenanceModeCheckTest.java   |  4 +-
 .../ambari/server/checks/ServicesUpCheckTest.java  |  3 +-
 .../upgrade/orchestrate/UpgradeContextTest.java    |  2 +-
 .../ambari/server/state/CheckHelperTest.java       | 11 +++-
 .../state/repository/VersionDefinitionTest.java    | 29 +++++++--
 33 files changed, 422 insertions(+), 118 deletions(-)

diff --git 
a/ambari-server-spi/src/main/java/org/apache/ambari/spi/stack/StackReleaseInfo.java
 
b/ambari-server-spi/src/main/java/org/apache/ambari/spi/stack/StackReleaseInfo.java
new file mode 100644
index 0000000..63299fe
--- /dev/null
+++ 
b/ambari-server-spi/src/main/java/org/apache/ambari/spi/stack/StackReleaseInfo.java
@@ -0,0 +1,65 @@
+/*
+ * 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.spi.stack;
+
+/**
+ * Provides information about a version's release.  Ambari provides instances
+ * for consumption.
+ */
+public class StackReleaseInfo {
+
+  private String m_version;
+  private String m_hotfix;
+  private String m_build;
+ 
+  /**
+   * @param version
+   *          the version string
+   * @param hotfix
+   *          the hotfix string
+   * @param build
+   *          the build string
+   */
+  public StackReleaseInfo(String version, String hotfix, String build) {
+    m_version = version;
+    m_hotfix = hotfix;
+    m_build = build;
+  }
+  
+  /**
+   * @return the version string
+   */
+  public String getVersion() {
+    return m_version;
+  }
+
+  /**
+   * @return the hotfix string
+   */
+  public String getHotfix() {
+    return m_hotfix;
+  }
+  
+  /**
+   * @return the build string
+   */
+  public String getBuild() {
+    return m_build;
+  }
+
+}
diff --git 
a/ambari-server-spi/src/main/java/org/apache/ambari/spi/stack/StackReleaseVersion.java
 
b/ambari-server-spi/src/main/java/org/apache/ambari/spi/stack/StackReleaseVersion.java
new file mode 100644
index 0000000..e61252e
--- /dev/null
+++ 
b/ambari-server-spi/src/main/java/org/apache/ambari/spi/stack/StackReleaseVersion.java
@@ -0,0 +1,47 @@
+/*
+ * 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.spi.stack;
+
+import java.util.Comparator;
+
+/**
+ * A stack supplies an implementation class to handle version representations.
+ */
+public interface StackReleaseVersion {
+
+  /**
+   * @param info
+   *          the release info instance
+   * @return  the full display string
+   */
+  String getFullVersion(StackReleaseInfo info);
+
+  /**
+   * @return a comparator of release info
+   */
+  Comparator<StackReleaseInfo> getComparator();
+
+  /**
+   * Parses a version string to a stack release info
+   * @param versionString
+   *          the version string
+   * @return the corresponding stack release.  Never {@code null}.
+   */
+  StackReleaseInfo parse(String versionString);
+}
+
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
index 97ae21f..6b53140 100644
--- 
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
@@ -81,7 +81,8 @@ public class RequiredServicesInRepositoryCheck extends 
ClusterCheck {
     Cluster cluster = clustersProvider.get().getCluster(clusterName);
 
     VersionDefinitionXml xml = 
checkHelperProvider.get().getVersionDefinitionXml(request);
-    Set<String> missingDependencies = xml.getMissingDependencies(cluster);
+
+    Set<String> missingDependencies = xml.getMissingDependencies(cluster, 
ambariMetaInfo.get());
 
     if (!missingDependencies.isEmpty()) {
       String failReasonTemplate = getFailReason(result, request);
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackVersionResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackVersionResponse.java
index 38b32d2..9772ae1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackVersionResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackVersionResponse.java
@@ -49,13 +49,12 @@ public class StackVersionResponse implements Validable{
   private Collection<File> serviceKerberosDescriptorFiles;
   private Set<String> upgradePacks = Collections.emptySet();
 
-  public StackVersionResponse(String stackVersion, String minUpgradeVersion,
+  public StackVersionResponse(String stackVersion,
                               boolean active, String parentVersion,
                               Map<String, Map<String, Map<String, String>>> 
configTypes,
                               Collection<File> serviceKerberosDescriptorFiles,
                               Set<String> upgradePacks, boolean valid, 
Collection<String> errorSet, String minJdk, String maxJdk) {
     setStackVersion(stackVersion);
-    setMinUpgradeVersion(minUpgradeVersion);
     setActive(active);
     setParentVersion(parentVersion);
     setConfigTypes(configTypes);
@@ -76,10 +75,10 @@ public class StackVersionResponse implements Validable{
   @Override
   public void setValid(boolean valid) {
     this.valid = valid;
-  }  
+  }
 
   private Set<String> errorSet = new HashSet<>();
-  
+
   @Override
   public void addError(String error) {
     errorSet.add(error);
@@ -89,7 +88,7 @@ public class StackVersionResponse implements Validable{
   @ApiModelProperty(name = "stack-errors")
   public Collection<String> getErrors() {
     return errorSet;
-  }   
+  }
 
   @Override
   public void addErrors(Collection<String> errors) {
@@ -130,15 +129,6 @@ public class StackVersionResponse implements Validable{
     this.stackVersion = stackVersion;
   }
 
-  @ApiModelProperty(name = "min_upgrade_version")
-  public String getMinUpgradeVersion() {
-    return minUpgradeVersion;
-  }
-
-  public void setMinUpgradeVersion(String minUpgradeVersion) {
-    this.minUpgradeVersion = minUpgradeVersion;
-  }
-
   @ApiModelProperty(name = "active")
   public boolean isActive() {
     return active;
@@ -187,14 +177,14 @@ public class StackVersionResponse implements Validable{
   public void setServiceKerberosDescriptorFiles(Collection<File> 
serviceKerberosDescriptorFiles) {
     this.serviceKerberosDescriptorFiles = serviceKerberosDescriptorFiles;
   }
-  
+
   /**
-   * @param upgradePacks the names of the upgrade packs for the stack version 
+   * @param upgradePacks the names of the upgrade packs for the stack version
    */
   public void setUpgradePacks(Set<String> upgradePacks) {
     this.upgradePacks = upgradePacks;
   }
-  
+
   /**
    * @return the upgrade pack names for the stack version
    */
@@ -208,7 +198,6 @@ public class StackVersionResponse implements Validable{
    * Interface to help correct Swagger documentation generation
    */
   public interface StackVersionResponseSwagger extends ApiModel {
-    @ApiModelProperty(name = "Versions")
-    public StackVersionResponse getStackVersionResponse();
+    @ApiModelProperty(name = "Versions") StackVersionResponse 
getStackVersionResponse();
   }
 }
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 acfc090..7ea52fe 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
@@ -304,7 +304,7 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
       try {
         VersionDefinitionXml vdf = repositoryVersion.getRepositoryXml();
         if (null != vdf) {
-          versionSummary = vdf.getClusterSummary(cluster);
+          versionSummary = vdf.getClusterSummary(cluster, metaInfo.get());
         }
       } catch (Exception e) {
         throw new IllegalArgumentException(
@@ -446,7 +446,8 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
     // dependencies
     try {
       if (repoVersionEntity.getType().isPartial()) {
-        Set<String> missingDependencies = 
desiredVersionDefinition.getMissingDependencies(cluster);
+        Set<String> missingDependencies = 
desiredVersionDefinition.getMissingDependencies(cluster,
+            metaInfo.get());
 
         if (!missingDependencies.isEmpty()) {
           String message = String.format(
@@ -609,7 +610,8 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
       // !!! limit the serviceNames to those that are detailed for the 
repository.
       // TODO packages don't have component granularity
       if (RepositoryType.STANDARD != repoVersionEnt.getType()) {
-        ClusterVersionSummary clusterSummary = 
desiredVersionDefinition.getClusterSummary(cluster);
+        ClusterVersionSummary clusterSummary = 
desiredVersionDefinition.getClusterSummary(
+            cluster, metaInfo.get());
         serviceNames.addAll(clusterSummary.getAvailableServiceNames());
       } else {
         serviceNames.addAll(ami.getStack(stackId).getServiceNames());
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
index a4d4a88..f2a2034 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
@@ -154,9 +154,6 @@ public class StackVersionResourceProvider extends 
ReadOnlyResourceProvider {
       setResourceProperty(resource, STACK_VERSION_PROPERTY_ID,
           response.getStackVersion(), requestedIds);
 
-      setResourceProperty(resource, STACK_MIN_VERSION_PROPERTY_ID,
-          response.getMinUpgradeVersion(), requestedIds);
-
       setResourceProperty(resource, STACK_ACTIVE_PROPERTY_ID,
           response.isActive(), requestedIds);
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
index b121c7d..9f1d7ad 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
@@ -613,15 +613,22 @@ public class VersionDefinitionResourceProvider extends 
AbstractAuthorizedResourc
 
     List<RepositoryInfo> repos = holder.xml.repositoryInfo.getRepositories();
 
+    StackInfo stack = s_metaInfo.get().getStack(stackId);
+
     // Add service repositories (these are not contained by the VDF but are 
there in the stack model)
-    ListMultimap<String, RepositoryInfo> stackReposByOs =
-        s_metaInfo.get().getStack(stackId.getStackName(), 
stackId.getStackVersion()).getRepositoriesByOs();
+    ListMultimap<String, RepositoryInfo> stackReposByOs = 
stack.getRepositoriesByOs();
     repos.addAll(RepoUtil.getServiceRepos(repos, stackReposByOs));
 
     
entity.addRepoOsEntities(s_repoVersionHelper.get().createRepoOsEntities(repos));
 
-    entity.setVersion(holder.xml.release.getFullVersion());
-    entity.setDisplayName(stackId, holder.xml.release);
+    
entity.setVersion(holder.xml.release.getFullVersion(stack.getReleaseVersion()));
+
+    if (StringUtils.isNotEmpty(holder.xml.release.display)) {
+      entity.setDisplayName(holder.xml.release.display);
+    } else {
+      entity.setDisplayName(stackId.getStackName() + "-" + 
entity.getVersion());
+    }
+
     entity.setType(holder.xml.release.repositoryType);
     entity.setVersionUrl(holder.url);
     entity.setVersionXml(holder.xmlString);
@@ -658,7 +665,7 @@ public class VersionDefinitionResourceProvider extends 
AbstractAuthorizedResourc
     }
 
     setResourceProperty(resource, VERSION_DEF_TYPE_PROPERTY_ID, 
xml.release.repositoryType, requestedIds);
-    setResourceProperty(resource, VERSION_DEF_FULL_VERSION, 
xml.release.getFullVersion(), requestedIds);
+    setResourceProperty(resource, VERSION_DEF_FULL_VERSION, 
xml.release.getFullVersion(stack.getReleaseVersion()), requestedIds);
     setResourceProperty(resource, VERSION_DEF_RELEASE_BUILD, 
xml.release.build, requestedIds);
     setResourceProperty(resource, VERSION_DEF_RELEASE_COMPATIBLE_WITH, 
xml.release.compatibleWith, requestedIds);
     setResourceProperty(resource, VERSION_DEF_RELEASE_NOTES, 
xml.release.releaseNotes, requestedIds);
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
index 1767a82..358de55 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
@@ -49,7 +49,6 @@ import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.StaticallyInject;
 import org.apache.ambari.server.stack.upgrade.RepositoryVersionHelper;
 import org.apache.ambari.server.state.StackId;
-import org.apache.ambari.server.state.repository.Release;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.spi.RepositoryType;
 import org.apache.commons.lang.StringUtils;
@@ -254,18 +253,6 @@ public class RepositoryVersionEntity {
     this.displayName = displayName;
   }
 
-  /**
-   * @param stackId the stack id for the version
-   * @param release the XML release instance
-   */
-  public void setDisplayName(StackId stackId, Release release) {
-    if (StringUtils.isNotBlank(release.display)) {
-      displayName = release.display;
-    } else {
-      displayName = stackId.getStackName() + "-" + release.getFullVersion();
-    }
-  }
-
 
   public String getStackName() {
     return getStackId().getStackName();
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
index 09624a9..280c48a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
@@ -565,7 +565,6 @@ public class StackModule extends BaseModule<StackModule, 
StackInfo> implements V
       }
       stackInfo.setMinJdk(smx.getMinJdk());
       stackInfo.setMaxJdk(smx.getMaxJdk());
-      stackInfo.setMinUpgradeVersion(smx.getVersion().getUpgrade());
       stackInfo.setActive(smx.getVersion().isActive());
       stackInfo.setParentStackVersion(smx.getExtends());
       stackInfo.setRcoFileLocation(stackDirectory.getRcoFilePath());
@@ -574,6 +573,7 @@ public class StackModule extends BaseModule<StackModule, 
StackInfo> implements V
       stackInfo.setUpgradePacks(stackDirectory.getUpgradePacks());
       stackInfo.setConfigUpgradePack(stackDirectory.getConfigUpgradePack());
       stackInfo.setRoleCommandOrder(stackDirectory.getRoleCommandOrder());
+      stackInfo.setReleaseVersionClass(smx.getVersion().getReleaseVersion());
       stackInfo.setLibraryClassLoader(stackDirectory.getLibraryClassLoader());
       populateConfigurationModules();
     }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/RepositoryVersionHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/RepositoryVersionHelper.java
index 63f814d..204f82f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/RepositoryVersionHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/RepositoryVersionHelper.java
@@ -607,7 +607,7 @@ public class RepositoryVersionHelper {
         final Cluster cluster = 
clusters.get().getCluster(context.getClusterName());
 
         VersionDefinitionXml xml = repoVersion.getRepositoryXml();
-        summary = xml.getClusterSummary(cluster);
+        summary = xml.getClusterSummary(cluster, ami.get());
       } catch (Exception e) {
         LOG.warn("Could not determine repository from %s/%s.  Will not pass 
cluster version.");
       }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java
index ff49d28..d2e68bb 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContext.java
@@ -1085,7 +1085,8 @@ public class UpgradeContext {
         // upgrade - this will take into account the type (such as patch/maint)
         // and the version of services installed in the cluster
         VersionDefinitionXml vdf = repositoryVersion.getRepositoryXml();
-        ClusterVersionSummary clusterVersionSummary = 
vdf.getClusterSummary(cluster);
+        ClusterVersionSummary clusterVersionSummary = vdf.getClusterSummary(
+            cluster, m_metaInfo);
         servicesForUpgrade = clusterVersionSummary.getAvailableServiceNames();
 
         // if this is every true, then just stop the upgrade attempt and
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeHelper.java
index fe79131..76eab07 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeHelper.java
@@ -260,7 +260,7 @@ public class UpgradeHelper {
       StackId upgradeStack = compareToSource ?
           new StackId(upgradePack.getSourceStack()) : new 
StackId(upgradePack.getTargetStack());
 
-      if (upgradeStack.equals(stackToFind) && 
upgradePack.getType().equals(upgradeType)) {
+      if (upgradeStack.equals(stackToFind) && upgradePack.getType() == 
upgradeType) {
         if (null == result) {
           result = upgradePack;
         } else {
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 c4550fd..b886ac2 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
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ClusterNotFoundException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.checks.OrchestrationQualification;
 import org.apache.ambari.server.checks.UpgradeTypeQualification;
 import org.apache.ambari.server.configuration.Configuration;
@@ -65,6 +66,9 @@ public class CheckHelper {
   @Inject
   protected Provider<Clusters> clustersProvider;
 
+  @Inject
+  protected Provider<AmbariMetaInfo> metaInfoProvider;
+
 
   /**
    * Gets any {@link UpgradeCheck}s which have passed all of their {@link 
CheckQualification}s
@@ -193,7 +197,8 @@ public class CheckHelper {
     // services are included in this upgrade
     try {
       VersionDefinitionXml vdf = getVersionDefinitionXml(request);
-      ClusterVersionSummary clusterVersionSummary = 
vdf.getClusterSummary(cluster);
+      ClusterVersionSummary clusterVersionSummary = 
vdf.getClusterSummary(cluster,
+          metaInfoProvider.get());
       return clusterVersionSummary.getAvailableServiceNames();
     } catch (Exception exception) {
       throw new AmbariException("Unable to run upgrade checks because of an 
invalid VDF",
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java 
b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
index 679163a..b4911cb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
@@ -36,17 +36,24 @@ import 
org.apache.ambari.server.controller.StackVersionResponse;
 import org.apache.ambari.server.stack.Validable;
 import org.apache.ambari.server.stack.upgrade.ConfigUpgradePack;
 import org.apache.ambari.server.stack.upgrade.UpgradePack;
+import org.apache.ambari.server.state.repository.DefaultStackVersion;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.server.state.stack.LatestRepoCallable;
 import org.apache.ambari.server.state.stack.RepositoryXml;
 import org.apache.ambari.server.state.stack.StackRoleCommandOrder;
 import org.apache.ambari.server.utils.VersionUtils;
+import org.apache.ambari.spi.stack.StackReleaseVersion;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Multimaps;
 import com.google.common.io.Files;
 
 public class StackInfo implements Comparable<StackInfo>, Validable {
+  private static final Logger LOG = LoggerFactory.getLogger(StackInfo.class);
+
   private String minJdk;
   private String maxJdk;
   private String name;
@@ -77,6 +84,8 @@ public class StackInfo implements Comparable<StackInfo>, 
Validable {
 
   private VersionDefinitionXml latestVersion = null;
 
+  private String releaseVersionClass = null;
+
   /**
    * A {@link ClassLoader} for any JARs discovered in the stack's library
    * folder.
@@ -111,6 +120,10 @@ public class StackInfo implements Comparable<StackInfo>, 
Validable {
     this.maxJdk = maxJdk;
   }
 
+  public void setReleaseVersionClass(String className) {
+    releaseVersionClass = className;
+  }
+
   /**
    *
    * @return valid xml flag
@@ -354,21 +367,13 @@ public class StackInfo implements Comparable<StackInfo>, 
Validable {
       }
     }
 
-    return new StackVersionResponse(getVersion(), getMinUpgradeVersion(),
+    return new StackVersionResponse(getVersion(),
         isActive(), getParentStackVersion(), getConfigTypeAttributes(),
         serviceDescriptorFiles,
         null == upgradePacks ? Collections.emptySet() : upgradePacks.keySet(),
         isValid(), getErrors(), getMinJdk(), getMaxJdk());
   }
 
-  public String getMinUpgradeVersion() {
-    return minUpgradeVersion;
-  }
-
-  public void setMinUpgradeVersion(String minUpgradeVersion) {
-    this.minUpgradeVersion = minUpgradeVersion;
-  }
-
   public boolean isActive() {
     return active;
   }
@@ -641,6 +646,35 @@ public class StackInfo implements Comparable<StackInfo>, 
Validable {
   }
 
   /**
+   * Gets the instance of the {@code StackReleaseVersion}.  If not specified
+   * or there is an error instantiating the class, return a default 
implementation.
+   *
+   * @return the stack release information.
+   */
+  public StackReleaseVersion getReleaseVersion() {
+
+    if (StringUtils.isNotEmpty(releaseVersionClass)) {
+
+      try {
+        Class<?> clazz = null;
+
+        if (null != libraryClassLoader) {
+          clazz = libraryClassLoader.loadClass(releaseVersionClass);
+        } else {
+          clazz = Class.forName(releaseVersionClass);
+        }
+
+        return (StackReleaseVersion) clazz.newInstance();
+      } catch (Exception e) {
+        LOG.error("Could not create stack release instance.  Using default. 
{}", e.getMessage());
+        return new DefaultStackVersion();
+      }
+    } else {
+      return new DefaultStackVersion();
+    }
+  }
+
+  /**
    * Gets the {@link ClassLoader} that can be used to load classes found in 
JARs
    * in the stack's library folder.
    *
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index ead57a5..eb1176e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -1054,7 +1054,8 @@ public class ClusterImpl implements Cluster {
             // does the host gets a different repo state based on VDF and repo
             // type
             boolean hostRequiresRepository = false;
-            ClusterVersionSummary clusterSummary = 
versionDefinitionXml.getClusterSummary(this);
+            ClusterVersionSummary clusterSummary = 
versionDefinitionXml.getClusterSummary(this,
+                ambariMetaInfo);
             Set<String> servicesInUpgrade = 
clusterSummary.getAvailableServiceNames();
 
             List<ServiceComponentHost> schs = 
getServiceComponentHosts(hostEntity.getHostName());
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/DefaultStackVersion.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/DefaultStackVersion.java
new file mode 100644
index 0000000..d98ac93
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/DefaultStackVersion.java
@@ -0,0 +1,74 @@
+/*
+ * 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.util.Comparator;
+
+import org.apache.ambari.server.utils.VersionUtils;
+import org.apache.ambari.spi.stack.StackReleaseInfo;
+import org.apache.ambari.spi.stack.StackReleaseVersion;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * This is the default implementation if no stack provides an implementation.
+ * Before this mechanism, Ambari assumed the version was in the format 
X.X.X.X-YYYY
+ */
+public class DefaultStackVersion implements StackReleaseVersion {
+
+  @Override
+  public String getFullVersion(StackReleaseInfo info) {
+
+    StringBuilder sb = new StringBuilder(info.getVersion());
+
+    if (StringUtils.isNotBlank(info.getBuild())) {
+      sb.append('-').append(StringUtils.trim(info.getBuild()));
+    }
+
+    return sb.toString();
+  }
+
+  @Override
+  public Comparator<StackReleaseInfo> getComparator() {
+
+    return new Comparator<StackReleaseInfo>() {
+      @Override
+      public int compare(StackReleaseInfo o1, StackReleaseInfo o2) {
+        return VersionUtils.compareVersionsWithBuild(
+            getFullVersion(o1), getFullVersion(o2), 4);
+      }
+    };
+  }
+
+  @Override
+  public StackReleaseInfo parse(String versionString) {
+    String version = "0";
+    String build = "0";
+
+    String[] parts = StringUtils.split(versionString, '-');
+    if (1 == parts.length) {
+      version = parts[0];
+    } else if (parts.length > 1) {
+      version = parts[0];
+      build = parts[1];
+    }
+
+    return new StackReleaseInfo(version, "0", build);
+  }
+
+
+}
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/Release.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/Release.java
index c998742..41ddc62 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/Release.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/Release.java
@@ -22,7 +22,8 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 
 import org.apache.ambari.spi.RepositoryType;
-import org.apache.commons.lang.StringUtils;
+import org.apache.ambari.spi.stack.StackReleaseInfo;
+import org.apache.ambari.spi.stack.StackReleaseVersion;
 
 /**
  * Release information for a repository.
@@ -55,6 +56,12 @@ public class Release {
   public String build;
 
   /**
+   * The hotfix number.
+   */
+  @XmlElement(name="hotfix")
+  public String hotfix;
+
+  /**
    * The compatability regex.  This is used to relate the release to another 
release.
    */
   @XmlElement(name="compatible-with")
@@ -75,14 +82,16 @@ public class Release {
   /**
    * @return the full version
    */
-  public String getFullVersion() {
-    StringBuilder sb = new StringBuilder(version);
-
-    if (StringUtils.isNotBlank(build)) {
-      sb.append('-').append(StringUtils.trim(build));
-    }
+  public String getFullVersion(StackReleaseVersion stackVersion) {
+    return stackVersion.getFullVersion(new StackReleaseInfo(
+        version, hotfix, build));
+  }
 
-    return sb.toString();
+  /**
+   * @return the release info for the VDF
+   */
+  public StackReleaseInfo getReleaseInfo() {
+    return new StackReleaseInfo(version, hotfix, build);
   }
 
 }
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 8e6f4b2..abca273 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
@@ -25,6 +25,7 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -49,6 +50,7 @@ import javax.xml.validation.Schema;
 import javax.xml.validation.SchemaFactory;
 
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.ConfigHelper;
@@ -61,8 +63,9 @@ import 
org.apache.ambari.server.state.repository.StackPackage.UpgradeDependencie
 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.ambari.spi.RepositoryType;
+import org.apache.ambari.spi.stack.StackReleaseInfo;
+import org.apache.ambari.spi.stack.StackReleaseVersion;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -286,7 +289,8 @@ public class VersionDefinitionXml {
    * @return a summary instance
    * @throws AmbariException
    */
-  public ClusterVersionSummary getClusterSummary(Cluster cluster) throws 
AmbariException {
+  public ClusterVersionSummary getClusterSummary(Cluster cluster, 
AmbariMetaInfo metaInfo)
+      throws AmbariException {
 
     Map<String, ManifestService> manifests = buildManifestByService();
     Set<String> available = getAvailableServiceNames();
@@ -304,18 +308,24 @@ public class VersionDefinitionXml {
       ServiceVersionSummary summary = new ServiceVersionSummary();
       summaries.put(service.getName(), summary);
 
-      String serviceVersion = 
service.getDesiredRepositoryVersion().getVersion();
+      StackId stackId = service.getDesiredRepositoryVersion().getStackId();
+      StackInfo stack = metaInfo.getStack(stackId);
+      StackReleaseVersion stackReleaseVersion = stack.getReleaseVersion();
+
+      StackReleaseInfo serviceVersion = stackReleaseVersion.parse(
+          service.getDesiredRepositoryVersion().getVersion());
 
       // !!! currently only one version is supported (unique service names)
       ManifestService manifest = manifests.get(serviceName);
 
-      final String versionToCompare;
+      final StackReleaseInfo versionToCompare;
       final String summaryReleaseVersion;
+
       if (StringUtils.isEmpty(manifest.releaseVersion)) {
-        versionToCompare = release.getFullVersion();
+        versionToCompare = release.getReleaseInfo();
         summaryReleaseVersion = release.version;
       } else {
-        versionToCompare = manifest.releaseVersion;
+        versionToCompare = stackReleaseVersion.parse(manifest.releaseVersion);
         summaryReleaseVersion = manifest.releaseVersion;
       }
 
@@ -326,7 +336,8 @@ public class VersionDefinitionXml {
       } else {
         // !!! installed service already meets the release version, then 
nothing to upgrade
         // !!! TODO should this be using the release compatible-with field?
-        if (VersionUtils.compareVersionsWithBuild(versionToCompare, 
serviceVersion, 4) > 0) {
+        Comparator<StackReleaseInfo> comparator = 
stackReleaseVersion.getComparator();
+        if (comparator.compare(versionToCompare, serviceVersion) > 0) {
           summary.setUpgrade(true);
         }
       }
@@ -343,11 +354,13 @@ public class VersionDefinitionXml {
    *
    * @param cluster
    *          the cluster (not {@code null}).
+   * @param metaInfo
+   *          the metainfo instance
    * @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 Set<String> getMissingDependencies(Cluster cluster)
+  public Set<String> getMissingDependencies(Cluster cluster, AmbariMetaInfo 
metaInfo)
       throws AmbariException {
     Set<String> missingDependencies = Sets.newTreeSet();
 
@@ -392,7 +405,7 @@ public class VersionDefinitionXml {
     // the installed services in the cluster
     Map<String,Service> installedServices = cluster.getServices();
 
-    ClusterVersionSummary clusterVersionSummary = getClusterSummary(cluster);
+    ClusterVersionSummary clusterVersionSummary = getClusterSummary(cluster, 
metaInfo);
     Set<String> servicesInUpgrade = 
clusterVersionSummary.getAvailableServiceNames();
     Set<String> servicesInRepository = getAvailableServiceNames();
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackMetainfoXml.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackMetainfoXml.java
index be2a45c..e03d40c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackMetainfoXml.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackMetainfoXml.java
@@ -52,7 +52,7 @@ public class StackMetainfoXml implements Validable{
 
   @XmlElement(name="extends")
   private String extendsVersion = null;
-  
+
   @XmlElement(name="versions")
   private Version version = new Version();
 
@@ -60,7 +60,7 @@ public class StackMetainfoXml implements Validable{
   private boolean valid = true;
 
   /**
-   * 
+   *
    * @return valid xml flag
    */
   @Override
@@ -69,17 +69,17 @@ public class StackMetainfoXml implements Validable{
   }
 
   /**
-   * 
+   *
    * @param valid set validity flag
    */
   @Override
   public void setValid(boolean valid) {
     this.valid = valid;
   }
-  
+
   @XmlTransient
   private Set<String> errorSet = new HashSet<>();
-  
+
   @Override
   public void addError(String error) {
     errorSet.add(error);
@@ -88,20 +88,20 @@ public class StackMetainfoXml implements Validable{
   @Override
   public Collection<String> getErrors() {
     return errorSet;
-  }   
+  }
 
   @Override
   public void addErrors(Collection<String> errors) {
     this.errorSet.addAll(errors);
   }
-  
+
   /**
    * @return the parent stack version number
    */
   public String getExtends() {
     return extendsVersion;
   }
-  
+
   /**
    * @return gets the version
    */
@@ -126,28 +126,24 @@ public class StackMetainfoXml implements Validable{
     public Version() {
     }
     private boolean active = false;
-    private String upgrade = null;
-    
+    private String stackReleaseVersion;
+
     /**
      * @return <code>true</code> if the stack is active
      */
     public boolean isActive() {
       return active;
     }
-    
-    /**
-     * @return the upgrade version number, if set
-     */
-    public String getUpgrade() {
-      return upgrade;
-    }
 
+    public String getReleaseVersion() {
+      return stackReleaseVersion;
+    }
 
     public void setActive(boolean active) {
       this.active = active;
     }
-  }  
-  
+  }
+
 }
 
 
diff --git a/ambari-server/src/main/resources/version_definition.xsd 
b/ambari-server/src/main/resources/version_definition.xsd
index fb38370..c933280 100644
--- a/ambari-server/src/main/resources/version_definition.xsd
+++ b/ambari-server/src/main/resources/version_definition.xsd
@@ -30,8 +30,9 @@
      <xs:element name="type" type="repo-type" />
      <xs:element name="stack-id" type="xs:string" />
      <xs:element name="version" type="xs:string" />
-     <xs:element name="build" type="xs:string" minOccurs="0" maxOccurs="1"/>
-     <xs:element name="compatible-with" type="xs:string" minOccurs="0"/>
+     <xs:element name="hotfix" type="xs:string" minOccurs="0" maxOccurs="1" />
+     <xs:element name="build" type="xs:string" minOccurs="0" maxOccurs="1" />
+     <xs:element name="compatible-with" type="xs:string" minOccurs="0" />
      <xs:element name="release-notes" type="xs:string" maxOccurs="1" />
      <xs:element name="display" type="xs:string" minOccurs="0" />
      <!-- deprecated and will be removed -->
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
index d06e4d0..11c1909 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
@@ -512,7 +512,6 @@ public class AmbariMetaInfoTest {
     StackInfo stackInfo = metaInfo.getStack(STACK_NAME_HDP, STACK_VERSION_HDP);
     Assert.assertEquals(stackInfo.getName(), STACK_NAME_HDP);
     Assert.assertEquals(stackInfo.getVersion(), STACK_VERSION_HDP);
-    Assert.assertEquals(stackInfo.getMinUpgradeVersion(), 
STACK_MINIMAL_VERSION_HDP);
     try {
       metaInfo.getStack(STACK_NAME_HDP, NON_EXT_VALUE);
     } catch (StackAccessException e) {
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/AmbariMetricsHadoopSinkVersionCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/AmbariMetricsHadoopSinkVersionCheckTest.java
index 1330962..2a963d4 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/AmbariMetricsHadoopSinkVersionCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/AmbariMetricsHadoopSinkVersionCheckTest.java
@@ -32,6 +32,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.AmbariServer;
@@ -132,7 +133,7 @@ public class AmbariMetricsHadoopSinkVersionCheckTest {
 
     
when(m_repositoryVersionEntity.getType()).thenReturn(RepositoryType.STANDARD);
     when(m_repositoryVersionEntity.getRepositoryXml()).thenReturn(m_vdfXml);
-    
when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
+    when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class), 
Mockito.any(AmbariMetaInfo.class))).thenReturn(m_clusterVersionSummary);
     
when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());
 
     m_checkHelper.m_clusters = m_clusters;
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ClusterCheckTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ClusterCheckTest.java
index 786f03a..11ced03 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/ClusterCheckTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/ClusterCheckTest.java
@@ -27,6 +27,7 @@ import java.util.Set;
 
 import org.apache.ambari.annotations.UpgradeCheckInfo;
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.CheckHelper;
 import org.apache.ambari.server.state.Cluster;
@@ -140,13 +141,22 @@ public class ClusterCheckTest extends EasyMockSupport {
     RepositoryVersionEntity repositoryVersionEntity = 
createNiceMock(RepositoryVersionEntity.class);
     
expect(repositoryVersionEntity.getType()).andReturn(RepositoryType.STANDARD).anyTimes();
     
expect(repositoryVersionEntity.getRepositoryXml()).andReturn(m_vdfXml).atLeastOnce();
-    
expect(m_vdfXml.getClusterSummary(EasyMock.anyObject(Cluster.class))).andReturn(
-        m_clusterVersionSummary).atLeastOnce();
+    expect(m_vdfXml.getClusterSummary(EasyMock.anyObject(Cluster.class),
+        
EasyMock.anyObject(AmbariMetaInfo.class))).andReturn(m_clusterVersionSummary).atLeastOnce();
 
     expect(m_clusterVersionSummary.getAvailableServiceNames()).andReturn(
         allServicesList).atLeastOnce();
 
-    m_mockCheckHelper.m_clusters = clusters;
+    final AmbariMetaInfo ami = createNiceMock(AmbariMetaInfo.class);
+
+    m_mockCheckHelper.setMetaInfoProvider(new Provider<AmbariMetaInfo>() {
+      @Override
+      public AmbariMetaInfo get() {
+        return ami;
+      }
+    });
+
+
     
Mockito.when(m_mockCheckHelper.m_repositoryVersionDAO.findByPK(Mockito.anyLong())).thenReturn(
         repositoryVersionEntity);
 
@@ -206,7 +216,7 @@ public class ClusterCheckTest extends EasyMockSupport {
     RepositoryVersionEntity repositoryVersionEntity = 
createNiceMock(RepositoryVersionEntity.class);
     
expect(repositoryVersionEntity.getType()).andReturn(RepositoryType.STANDARD).anyTimes();
     
expect(repositoryVersionEntity.getRepositoryXml()).andReturn(m_vdfXml).atLeastOnce();
-    
expect(m_vdfXml.getClusterSummary(EasyMock.anyObject(Cluster.class))).andReturn(
+    expect(m_vdfXml.getClusterSummary(EasyMock.anyObject(Cluster.class), 
EasyMock.anyObject(AmbariMetaInfo.class))).andReturn(
         m_clusterVersionSummary).atLeastOnce();
 
     // the cluster summary will only return 1 service for the upgrade, even
@@ -218,6 +228,15 @@ public class ClusterCheckTest extends EasyMockSupport {
     
Mockito.when(m_mockCheckHelper.m_repositoryVersionDAO.findByPK(Mockito.anyLong())).thenReturn(
         repositoryVersionEntity);
 
+    final AmbariMetaInfo ami = createNiceMock(AmbariMetaInfo.class);
+
+    m_mockCheckHelper.setMetaInfoProvider(new Provider<AmbariMetaInfo>() {
+      @Override
+      public AmbariMetaInfo get() {
+        return ami;
+      }
+    });
+
     replayAll();
 
     TestCheckImpl check = new TestCheckImpl(UpgradeCheckType.SERVICE);
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 a123298..d0d4f07 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
@@ -108,9 +108,18 @@ public class ComponentsInstallationCheckTest {
     Mockito.when(m_repositoryVersionEntity.getVersion()).thenReturn(version);
     Mockito.when(m_repositoryVersionEntity.getStackId()).thenReturn(stackId);
     
Mockito.when(m_repositoryVersionEntity.getRepositoryXml()).thenReturn(m_vdfXml);
-    
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
+    Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class), 
Mockito.any(AmbariMetaInfo.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());
 
+    final AmbariMetaInfo metaInfo = Mockito.mock(AmbariMetaInfo.class);
+
+    m_checkHelper.setMetaInfoProvider(new Provider<AmbariMetaInfo>() {
+      @Override
+      public AmbariMetaInfo get() {
+        return metaInfo;
+      }
+    });
+
     m_checkHelper.m_clusters = clusters;
     
Mockito.when(m_checkHelper.m_repositoryVersionDAO.findByPK(Mockito.anyLong())).thenReturn(m_repositoryVersionEntity);
   }
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 3af2d3f..088e75d 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
@@ -80,7 +80,7 @@ public class HostsMasterMaintenanceCheckTest {
     
Mockito.when(m_repositoryVersion.getRepositoryType()).thenReturn(RepositoryType.STANDARD);
     
Mockito.when(m_repositoryVersionEntity.getType()).thenReturn(RepositoryType.STANDARD);
     
Mockito.when(m_repositoryVersionEntity.getRepositoryXml()).thenReturn(m_vdfXml);
-    
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
+    Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class), 
Mockito.any(AmbariMetaInfo.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());
   }
 
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 7729bba..45b3e1d 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
@@ -20,6 +20,7 @@ package org.apache.ambari.server.checks;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.dao.HostVersionDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
@@ -94,7 +95,7 @@ public class HostsRepositoryVersionCheckTest {
     Mockito.when(m_repositoryVersionEntity.getVersion()).thenReturn(version);
     Mockito.when(m_repositoryVersionEntity.getStackId()).thenReturn(stackId);
     
Mockito.when(m_repositoryVersionEntity.getRepositoryXml()).thenReturn(m_vdfXml);
-    
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
+    Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class), 
Mockito.any(AmbariMetaInfo.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());
 
     m_checkHelper.m_clusters = clusters;
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/MockCheckHelper.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/MockCheckHelper.java
index 898b0de..a640fc7 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/checks/MockCheckHelper.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/checks/MockCheckHelper.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.state.CheckHelper;
 import org.apache.ambari.server.state.Clusters;
@@ -48,4 +49,11 @@ public class MockCheckHelper extends CheckHelper {
       }
     };
   }
+
+  /**
+   * Helper to set the AmbariMetaInfo provider instance
+   */
+  public void setMetaInfoProvider(Provider<AmbariMetaInfo> provider) {
+    metaInfoProvider = provider;
+  }
 }
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
index 5861a2e..83f626d 100644
--- 
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
@@ -21,6 +21,7 @@ import static org.mockito.Mockito.mock;
 
 import java.util.Set;
 
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.CheckHelper;
 import org.apache.ambari.server.state.Cluster;
@@ -89,11 +90,21 @@ public class RequiredServicesInRepositoryCheckTest {
     
Mockito.when(m_repositoryVersion.getRepositoryType()).thenReturn(RepositoryType.STANDARD);
 
     
Mockito.when(m_repositoryVersionEntity.getRepositoryXml()).thenReturn(m_vdfXml);
-    
Mockito.when(m_vdfXml.getMissingDependencies(Mockito.eq(cluster))).thenReturn(m_missingDependencies);
+    Mockito.when(m_vdfXml.getMissingDependencies(Mockito.eq(cluster), 
Mockito.any(AmbariMetaInfo.class))).thenReturn(m_missingDependencies);
+
 
     m_checkHelper.m_clusters = clusters;
     
Mockito.when(m_checkHelper.m_repositoryVersionDAO.findByPK(Mockito.anyLong())).thenReturn(m_repositoryVersionEntity);
 
+    final AmbariMetaInfo metaInfo = Mockito.mock(AmbariMetaInfo.class);
+    m_requiredServicesCheck.ambariMetaInfo = new Provider<AmbariMetaInfo>() {
+      @Override
+      public AmbariMetaInfo get() {
+        return metaInfo;
+      }
+    };
+
+
     m_requiredServicesCheck.checkHelperProvider = new Provider<CheckHelper>() {
       @Override
       public CheckHelper get() {
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 07a683d..9d8e7da 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
@@ -91,7 +91,7 @@ public class ServicesMaintenanceModeCheckTest {
     
Mockito.when(m_repositoryVersionEntity.getVersion()).thenReturn("2.2.0.0-1234");
     Mockito.when(m_repositoryVersionEntity.getStackId()).thenReturn(new 
StackId("HDP", "2.2"));
     
Mockito.when(m_repositoryVersionEntity.getRepositoryXml()).thenReturn(m_vdfXml);
-    
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
+    Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class), 
Mockito.any(AmbariMetaInfo.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());
 
     m_checkHelper.m_clusters = clusters;
@@ -116,6 +116,8 @@ public class ServicesMaintenanceModeCheckTest {
       }
     };
 
+    
m_checkHelper.setMetaInfoProvider(servicesMaintenanceModeCheck.ambariMetaInfo);
+
     servicesMaintenanceModeCheck.checkHelperProvider = new 
Provider<CheckHelper>() {
     @Override
     public CheckHelper get() {
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 000c7e2..dfe0c6c 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
@@ -109,7 +109,7 @@ public class ServicesUpCheckTest {
     Mockito.when(m_repositoryVersionEntity.getVersion()).thenReturn(version);
     Mockito.when(m_repositoryVersionEntity.getStackId()).thenReturn(stackId);
     
Mockito.when(m_repositoryVersionEntity.getRepositoryXml()).thenReturn(m_vdfXml);
-    
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
+    Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class), 
Mockito.any(AmbariMetaInfo.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services.keySet());
 
     
Mockito.when(m_repositoryVersionDAO.findByPK(Mockito.anyLong())).thenReturn(m_repositoryVersionEntity);
@@ -141,6 +141,7 @@ public class ServicesUpCheckTest {
         MockCheckHelper mockCheckHelper = new MockCheckHelper();
         mockCheckHelper.m_clusters = clusters;
         mockCheckHelper.m_repositoryVersionDAO = m_repositoryVersionDAO;
+        mockCheckHelper.setMetaInfoProvider(servicesUpCheck.ambariMetaInfo);
         return mockCheckHelper;
       }
     };
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContextTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContextTest.java
index f8a934c..dde51a5 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContextTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeContextTest.java
@@ -184,7 +184,7 @@ public class UpgradeContextTest extends EasyMockSupport {
     expect(m_cluster.getUpgradeInProgress()).andReturn(null).atLeastOnce();
 
     // VDF stuff
-    
expect(m_vdfXml.getClusterSummary(EasyMock.anyObject(Cluster.class))).andReturn(
+    expect(m_vdfXml.getClusterSummary(EasyMock.anyObject(Cluster.class), 
EasyMock.anyObject(AmbariMetaInfo.class))).andReturn(
         m_clusterVersionSummary).anyTimes();
   }
 
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 6413e77..ad77aa1 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
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import org.apache.ambari.annotations.UpgradeCheckInfo;
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.checks.ClusterCheck;
 import org.apache.ambari.server.checks.MockCheckHelper;
 import org.apache.ambari.server.configuration.Configuration;
@@ -99,7 +100,7 @@ public class CheckHelperTest {
     
Mockito.when(m_repositoryVersion.getRepositoryType()).thenReturn(RepositoryType.STANDARD);
     
Mockito.when(repositoryVersionDao.findByPK(Mockito.anyLong())).thenReturn(m_repositoryVersionEntity);
     
Mockito.when(m_repositoryVersionEntity.getRepositoryXml()).thenReturn(m_vdfXml);
-    
Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class))).thenReturn(m_clusterVersionSummary);
+    Mockito.when(m_vdfXml.getClusterSummary(Mockito.any(Cluster.class), 
Mockito.any(AmbariMetaInfo.class))).thenReturn(m_clusterVersionSummary);
     
Mockito.when(m_clusterVersionSummary.getAvailableServiceNames()).thenReturn(m_services);
   }
 
@@ -233,6 +234,14 @@ public class CheckHelperTest {
     helper.m_repositoryVersionDAO = repositoryVersionDao;
     helper.clustersProvider = () -> clusters;
 
+    final AmbariMetaInfo metaInfo = Mockito.mock(AmbariMetaInfo.class);
+    helper.metaInfoProvider = new Provider<AmbariMetaInfo>() {
+      @Override
+      public AmbariMetaInfo get() {
+        return metaInfo;
+      }
+    };
+
     Configuration configuration = EasyMock.createNiceMock(Configuration.class);
     List<UpgradeCheck> updateChecksRegistry = new ArrayList<>();
 
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/repository/VersionDefinitionTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/repository/VersionDefinitionTest.java
index fc4c97d..885cb82 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/repository/VersionDefinitionTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/repository/VersionDefinitionTest.java
@@ -34,11 +34,13 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.ComponentInfo;
 import org.apache.ambari.server.state.Service;
 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.stack.RepoTag;
 import org.apache.ambari.server.state.stack.RepositoryXml;
@@ -46,6 +48,7 @@ import org.apache.ambari.server.state.stack.RepositoryXml.Os;
 import org.apache.ambari.server.state.stack.RepositoryXml.Repo;
 import org.apache.ambari.spi.RepositoryType;
 import org.apache.commons.io.FileUtils;
+import org.easymock.EasyMock;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableMap;
@@ -437,6 +440,12 @@ public class VersionDefinitionTest {
     expect(serviceHBase.getDisplayName()).andReturn("HBase").atLeastOnce();
     
expect(serviceHBase.getDesiredRepositoryVersion()).andReturn(repositoryVersion).atLeastOnce();
 
+    StackInfo stackInfo = createNiceMock(StackInfo.class);
+    expect(stackInfo.getReleaseVersion()).andReturn(new 
DefaultStackVersion()).atLeastOnce();
+
+    AmbariMetaInfo ami = createNiceMock(AmbariMetaInfo.class);
+    
expect(ami.getStack(EasyMock.anyObject(StackId.class))).andReturn(stackInfo).atLeastOnce();
+
     // !!! should never be accessed as it's not in any VDF
     Service serviceAMS = createNiceMock(Service.class);
 
@@ -446,28 +455,28 @@ public class VersionDefinitionTest {
         .put("AMBARI_METRICS", serviceAMS).build()).atLeastOnce();
 
 
-    replay(cluster, repositoryVersion, serviceHdfs, serviceHBase);
+    replay(cluster, repositoryVersion, serviceHdfs, serviceHBase, stackInfo, 
ami);
 
     File f = new 
File("src/test/resources/version_definition_test_all_services.xml");
     VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL());
-    ClusterVersionSummary summary = xml.getClusterSummary(cluster);
+    ClusterVersionSummary summary = xml.getClusterSummary(cluster, ami);
     assertEquals(2, summary.getAvailableServiceNames().size());
 
     f = new File("src/test/resources/version_definition_test_maint.xml");
     xml = VersionDefinitionXml.load(f.toURI().toURL());
-    summary = xml.getClusterSummary(cluster);
+    summary = xml.getClusterSummary(cluster, ami);
     assertEquals(0, summary.getAvailableServiceNames().size());
 
     f = new File("src/test/resources/version_definition_test_maint.xml");
     xml = VersionDefinitionXml.load(f.toURI().toURL());
     xml.release.repositoryType = RepositoryType.STANDARD;
     xml.availableServices = Collections.emptyList();
-    summary = xml.getClusterSummary(cluster);
+    summary = xml.getClusterSummary(cluster, ami);
     assertEquals(2, summary.getAvailableServiceNames().size());
 
     f = new 
File("src/test/resources/version_definition_test_maint_partial.xml");
     xml = VersionDefinitionXml.load(f.toURI().toURL());
-    summary = xml.getClusterSummary(cluster);
+    summary = xml.getClusterSummary(cluster, ami);
     assertEquals(1, summary.getAvailableServiceNames().size());
   }
 
@@ -488,6 +497,12 @@ public class VersionDefinitionTest {
     expect(serviceHBase.getDisplayName()).andReturn("HBase").atLeastOnce();
     
expect(serviceHBase.getDesiredRepositoryVersion()).andReturn(repositoryVersion).atLeastOnce();
 
+    StackInfo stackInfo = createNiceMock(StackInfo.class);
+    expect(stackInfo.getReleaseVersion()).andReturn(new 
DefaultStackVersion()).atLeastOnce();
+
+    AmbariMetaInfo ami = createNiceMock(AmbariMetaInfo.class);
+    
expect(ami.getStack(EasyMock.anyObject(StackId.class))).andReturn(stackInfo).atLeastOnce();
+
     // !!! should never be accessed as it's not in any VDF
     Service serviceAMS = createNiceMock(Service.class);
 
@@ -496,13 +511,13 @@ public class VersionDefinitionTest {
         .put("HBASE", serviceHBase)
         .put("AMBARI_METRICS", serviceAMS).build()).atLeastOnce();
 
-    replay(cluster, repositoryVersion, serviceHdfs, serviceHBase);
+    replay(cluster, repositoryVersion, serviceHdfs, serviceHBase, stackInfo, 
ami);
 
     File f = new 
File("src/test/resources/version_definition_test_maint_partial.xml");
     VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL());
     xml.release.version = "2.3.4.1";
     xml.release.build = "2";
-    ClusterVersionSummary summary = xml.getClusterSummary(cluster);
+    ClusterVersionSummary summary = xml.getClusterSummary(cluster, ami);
     assertEquals(1, summary.getAvailableServiceNames().size());
   }
 

Reply via email to