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()); }