AMBARI-12703. Stop-and-Start Upgrade: Revise PreChecks (dgrinenko via dlysnichenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/df0d238a Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/df0d238a Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/df0d238a Branch: refs/heads/branch-dev-stop-all-upgrade Commit: df0d238a1541d06301b924dba56da1c7fc95912d Parents: 247e728 Author: Lisnichenko Dmitro <[email protected]> Authored: Wed Sep 16 12:31:02 2015 +0300 Committer: Lisnichenko Dmitro <[email protected]> Committed: Wed Sep 16 12:31:02 2015 +0300 ---------------------------------------------------------------------- .../server/checks/AbstractCheckDescriptor.java | 56 ++++++++++------ .../server/checks/ClientRetryPropertyCheck.java | 17 +---- .../server/checks/ConfigurationMergeCheck.java | 29 +-------- .../HiveDynamicServiceDiscoveryCheck.java | 15 +---- .../checks/HiveMultipleMetastoreCheck.java | 13 +--- .../server/checks/HostsHeartbeatCheck.java | 2 +- .../checks/HostsMasterMaintenanceCheck.java | 11 +--- .../checks/HostsRepositoryVersionCheck.java | 11 +--- ...apReduce2JobHistoryStatePreservingCheck.java | 7 +- .../checks/SecondaryNamenodeDeletedCheck.java | 10 +-- .../checks/ServicesMaintenanceModeCheck.java | 3 +- .../ServicesMapReduceDistributedCacheCheck.java | 10 +-- .../ServicesNamenodeHighAvailabilityCheck.java | 13 +--- .../checks/ServicesNamenodeTruncateCheck.java | 11 +--- .../ServicesTezDistributedCacheCheck.java | 10 +-- .../ambari/server/checks/ServicesUpCheck.java | 2 +- .../checks/ServicesYarnWorkPreservingCheck.java | 14 +--- .../ambari/server/checks/UpgradeCheck.java | 8 +++ .../server/checks/UpgradeCheckRegistry.java | 19 ++++++ .../checks/YarnRMHighAvailabilityCheck.java | 13 +--- .../YarnTimelineServerStatePreservingCheck.java | 7 +- .../PreUpgradeCheckResourceProvider.java | 30 ++++++++- .../internal/UpgradeResourceProvider.java | 67 +++----------------- .../ambari/server/state/UpgradeHelper.java | 65 ++++++++++++++++++- .../ambari/server/state/stack/UpgradePack.java | 11 ++++ .../HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml | 4 +- .../stacks/HDP/2.2/upgrades/upgrade-2.2.xml | 13 +++- .../stacks/HDP/2.2/upgrades/upgrade-2.3.xml | 12 ++++ .../stacks/HDP/2.3/upgrades/upgrade-2.3.xml | 13 ++++ .../checks/ConfigurationMergeCheckTest.java | 30 --------- .../checks/HostsMasterMaintenanceCheckTest.java | 3 - .../checks/HostsRepositoryVersionCheckTest.java | 3 - .../SecondaryNamenodeDeletedCheckTest.java | 16 +++-- ...vicesMapReduceDistributedCacheCheckTest.java | 14 ++-- ...rvicesNamenodeHighAvailabilityCheckTest.java | 10 ++- .../ServicesNamenodeTruncateCheckTest.java | 8 ++- .../ServicesTezDistributedCacheCheckTest.java | 15 +++-- .../ServicesYarnWorkPreservingCheckTest.java | 10 ++- .../UpgradeResourceProviderHDP22Test.java | 1 - .../internal/UpgradeResourceProviderTest.java | 10 ++- .../ambari/server/state/UpgradeHelperTest.java | 67 ++++++++++++++++---- .../HDP/2.1.1/upgrades/upgrade_bucket_test.xml | 15 ++++- .../HDP/2.1.1/upgrades/upgrade_direction.xml | 2 +- .../stacks/HDP/2.1.1/upgrades/upgrade_test.xml | 2 +- .../HDP/2.1.1/upgrades/upgrade_test_checks.xml | 13 +++- .../2.1.1/upgrades/upgrade_test_nonrolling.xml | 15 ++++- .../HDP/2.1.1/upgrades/upgrade_to_new_stack.xml | 15 ++++- .../stacks/HDP/2.2.0/upgrades/upgrade_test.xml | 14 +++- .../HDP/2.2.0/upgrades/upgrade_test_checks.xml | 16 ++++- 49 files changed, 435 insertions(+), 340 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java index 44cec85..649db02 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java @@ -18,7 +18,9 @@ package org.apache.ambari.server.checks; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.api.services.AmbariMetaInfo; @@ -80,7 +82,7 @@ public abstract class AbstractCheckDescriptor { /** * Tests if the prerequisite check is applicable to given cluster. This - * method's defautl logic is to ensure that the cluster stack source and + * method's default logic is to ensure that the cluster stack source and * target are compatible with the prerequisite check. When overridding this * method, call {@code super#isApplicable(PrereqCheckRequest)}. * @@ -92,26 +94,36 @@ public abstract class AbstractCheckDescriptor { * if server error happens */ public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - StackId sourceStackId = getSourceStack(); - StackId targetStackId = getTargetStack(); - - if( null == sourceStackId && null == targetStackId ) { - return true; - } - - StackId requestSourceStack = request.getSourceStackId(); - if (null != sourceStackId && null != requestSourceStack - && sourceStackId.compareTo(requestSourceStack) > 0) { - return false; - } + // this is default behaviour + return true; + } - StackId requestTargetStack = request.getTargetStackId(); - if (null != targetStackId && null != requestTargetStack - && targetStackId.compareTo(requestTargetStack) < 0) { - return false; + /** + * Same like {@code isApplicable(PrereqCheckRequest request)}, but with service presence check + * @param request + * prerequisite check request + * @param requiredServices + * set of services, which need to be present to allow check execution + * @param requiredAll + * require all services in the list or at least one need to present + * @return true if check should be performed + * @throws org.apache.ambari.server.AmbariException + * if server error happens + */ + public boolean isApplicable(PrereqCheckRequest request, List<String> requiredServices, boolean requiredAll) throws AmbariException { + final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); + Set<String> services = cluster.getServices().keySet(); + boolean serviceFound = false; + + for (String service : requiredServices) { + if (services.contains(service) && !requiredAll) { + serviceFound = true; + } else if (!services.contains(service) && requiredAll) { + return false; + } } - return true; + return !(!serviceFound && !requiredAll); } /** @@ -281,4 +293,12 @@ public abstract class AbstractCheckDescriptor { return formatted.toString(); } + + /** + * Return the optionality flag of the Upgrade Check + * @return + */ + public Boolean isRequired(){ + return getClass().getAnnotation(UpgradeCheck.class).required(); + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java index 52fca40..368bcb8 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ClientRetryPropertyCheck.java @@ -18,6 +18,7 @@ package org.apache.ambari.server.checks; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -36,7 +37,7 @@ import com.google.inject.Singleton; * client retry properties for HDFS, HIVE, and OOZIE are set. */ @Singleton -@UpgradeCheck(group = UpgradeCheckGroup.CLIENT_RETRY_PROPERTY) +@UpgradeCheck(group = UpgradeCheckGroup.CLIENT_RETRY_PROPERTY, required = true) public class ClientRetryPropertyCheck extends AbstractCheckDescriptor { static final String HIVE_CLIENT_RETRY_MISSING_KEY = "hive.client.retry.missing.key"; @@ -54,19 +55,7 @@ public class ClientRetryPropertyCheck extends AbstractCheckDescriptor { */ @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - Map<String, Service> services = cluster.getServices(); - - if (services.containsKey("HDFS") || services.containsKey("HIVE") - || services.containsKey("OOZIE")) { - return true; - } - - return false; + return super.isApplicable(request, Arrays.asList("HDFS", "HIVE", "OOZIE"), false); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java index b81ca11..a47512e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java @@ -39,7 +39,7 @@ import com.google.inject.Singleton; * Checks for configuration merge conflicts. */ @Singleton -@UpgradeCheck(order = 99.0f) +@UpgradeCheck(order = 99.0f, required = true) public class ConfigurationMergeCheck extends AbstractCheckDescriptor { @Inject @@ -49,33 +49,6 @@ public class ConfigurationMergeCheck extends AbstractCheckDescriptor { super(CheckDescription.CONFIG_MERGE); } - @Override - public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - String stackName = request.getTargetStackId().getStackName(); - String repoVersion = request.getRepositoryVersion(); - if (null == repoVersion) { - return false; - } - - RepositoryVersionEntity rve = repositoryVersionDaoProvider.get().findByStackNameAndVersion(stackName, repoVersion); - if (null == rve) { - return false; - } - - Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - - if (rve.getStackId().equals(cluster.getCurrentStackVersion())) { - return false; - } - - return true; - } - - /** * The following logic determines if a warning is generated for config merge * issues: http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java index 4ea5484..d8f51a2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java @@ -18,6 +18,7 @@ package org.apache.ambari.server.checks; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -37,7 +38,7 @@ import com.google.inject.Singleton; * is properly configured for dynamic discovery. */ @Singleton -@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f) +@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f, required = true) public class HiveDynamicServiceDiscoveryCheck extends AbstractCheckDescriptor { static final String HIVE_DYNAMIC_SERVICE_DISCOVERY_ENABLED_KEY = "hive.dynamic-service.discovery.enabled.key"; @@ -56,17 +57,7 @@ public class HiveDynamicServiceDiscoveryCheck extends AbstractCheckDescriptor { */ @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - Map<String, Service> services = cluster.getServices(); - if (services.containsKey("HIVE")) { - return true; - } - - return false; + return super.isApplicable(request, Arrays.asList("HIVE"), true); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java index c387a4b..14b8435 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java @@ -17,6 +17,7 @@ */ package org.apache.ambari.server.checks; +import java.util.Arrays; import java.util.Map; import org.apache.ambari.server.AmbariException; @@ -51,17 +52,7 @@ public class HiveMultipleMetastoreCheck extends AbstractCheckDescriptor { */ @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - Map<String, Service> services = cluster.getServices(); - if (!services.containsKey("HIVE")) { - return false; - } - - return true; + return super.isApplicable(request, Arrays.asList("HIVE"), true); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java index 6076a32..c9a352e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java @@ -34,7 +34,7 @@ import com.google.inject.Singleton; * Checks that all hosts are either in maintenance mode or heartbeating with the server. */ @Singleton -@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 1.0f) +@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 1.0f, required = true) public class HostsHeartbeatCheck extends AbstractCheckDescriptor { /** http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java index b1b6b68..39ab39f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java @@ -40,7 +40,7 @@ import com.google.inject.Singleton; * Checks that all hosts in maintenance state do not have master components. */ @Singleton -@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 1.0f) +@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 1.0f, required = true) public class HostsMasterMaintenanceCheck extends AbstractCheckDescriptor { static final String KEY_NO_UPGRADE_NAME = "no_upgrade_name"; @@ -54,15 +54,6 @@ public class HostsMasterMaintenanceCheck extends AbstractCheckDescriptor { } @Override - public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - return request.getRepositoryVersion() != null; - } - - @Override public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException { final String clusterName = request.getClusterName(); final Cluster cluster = clustersProvider.get().getCluster(clusterName); http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java index 6ebf8e1..3b965b7 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheck.java @@ -38,7 +38,7 @@ import com.google.inject.Singleton; * Checks that all hosts have particular repository version. */ @Singleton -@UpgradeCheck(group = UpgradeCheckGroup.REPOSITORY_VERSION) +@UpgradeCheck(group = UpgradeCheckGroup.REPOSITORY_VERSION, required = true) public class HostsRepositoryVersionCheck extends AbstractCheckDescriptor { static final String KEY_NO_REPO_VERSION = "no_repo_version"; @@ -51,15 +51,6 @@ public class HostsRepositoryVersionCheck extends AbstractCheckDescriptor { } @Override - public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - return request.getRepositoryVersion() != null; - } - - @Override public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException { final String clusterName = request.getClusterName(); final Cluster cluster = clustersProvider.get().getCluster(clusterName); http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java index 5f02c4f..af134d8 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java @@ -28,6 +28,7 @@ import org.apache.ambari.server.utils.VersionUtils; import org.apache.commons.lang.StringUtils; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -87,15 +88,11 @@ public class MapReduce2JobHistoryStatePreservingCheck extends AbstractCheckDescr */ @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { + if (!super.isApplicable(request, Arrays.asList("MAPREDUCE2"), true)) { return false; } final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - Map<String, Service> services = cluster.getServices(); - if (!services.containsKey("MAPREDUCE2")) { - return false; - } // Applicable only if stack not defined in MinimumApplicableStackVersion, or // version equals or exceeds the enumerated version. http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java index 2086b67..d7c27d7 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java @@ -17,6 +17,7 @@ */ package org.apache.ambari.server.checks; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -53,14 +54,7 @@ public class SecondaryNamenodeDeletedCheck extends AbstractCheckDescriptor { @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - try { - cluster.getService("HDFS"); - } catch (ServiceNotFoundException ex) { + if (!super.isApplicable(request, Arrays.asList("HDFS"), true)) { return false; } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java index 5108afd..8d578d8 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java @@ -24,7 +24,6 @@ import org.apache.ambari.server.controller.PrereqCheckRequest; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.MaintenanceState; import org.apache.ambari.server.state.Service; -import org.apache.ambari.server.state.State; import org.apache.ambari.server.state.stack.PrereqCheckStatus; import org.apache.ambari.server.state.stack.PrerequisiteCheck; @@ -34,7 +33,7 @@ import com.google.inject.Singleton; * Checks that services are in the maintenance mode. */ @Singleton -@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 2.0f) +@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 2.0f, required = true) public class ServicesMaintenanceModeCheck extends AbstractCheckDescriptor { /** http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java index be5d11a..2359919 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java @@ -18,6 +18,7 @@ package org.apache.ambari.server.checks; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -48,14 +49,7 @@ public class ServicesMapReduceDistributedCacheCheck extends AbstractCheckDescrip public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - try { - cluster.getService("YARN"); - } catch (ServiceNotFoundException ex) { + if (!super.isApplicable(request, Arrays.asList("YARN"), true)) { return false; } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java index d92f12d..44e183d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java @@ -17,6 +17,7 @@ */ package org.apache.ambari.server.checks; +import java.util.Arrays; import java.util.Map; import org.apache.ambari.server.AmbariException; @@ -46,17 +47,7 @@ public class ServicesNamenodeHighAvailabilityCheck extends AbstractCheckDescript @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - try { - cluster.getService("HDFS"); - } catch (ServiceNotFoundException ex) { - return false; - } - return true; + return super.isApplicable(request, Arrays.asList("HDFS"), true); } @Override http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java index 51369c9..3761d99 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java @@ -28,6 +28,8 @@ import org.apache.ambari.server.utils.VersionUtils; import com.google.inject.Singleton; +import java.util.Arrays; + /** * Checks that namenode high availability is enabled. */ @@ -44,14 +46,7 @@ public class ServicesNamenodeTruncateCheck extends AbstractCheckDescriptor { @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - try { - cluster.getService("HDFS"); - } catch (ServiceNotFoundException ex) { + if (!super.isApplicable(request, Arrays.asList("HDFS"), true)) { return false; } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java index 68a7103..70a9b1b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java @@ -18,6 +18,7 @@ package org.apache.ambari.server.checks; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -48,14 +49,7 @@ public class ServicesTezDistributedCacheCheck extends AbstractCheckDescriptor { @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - try { - cluster.getService("TEZ"); - } catch (ServiceNotFoundException ex) { + if (!super.isApplicable(request, Arrays.asList("TEZ"), true)) { return false; } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java index 70b8884..ea8569c 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java @@ -44,7 +44,7 @@ import com.google.inject.Singleton; * Checks that services are up. */ @Singleton -@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 2.0f) +@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 2.0f, required = true) public class ServicesUpCheck extends AbstractCheckDescriptor { private static final float SLAVE_THRESHOLD = 0.5f; http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java index a0b2b59..062c11f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java @@ -27,6 +27,8 @@ import org.apache.commons.lang.BooleanUtils; import com.google.inject.Singleton; +import java.util.Arrays; + /** * Checks that YARN has work-preserving restart enabled. */ @@ -46,17 +48,7 @@ public class ServicesYarnWorkPreservingCheck extends AbstractCheckDescriptor { */ @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - try { - cluster.getService("YARN"); - } catch (ServiceNotFoundException ex) { - return false; - } - return true; + return super.isApplicable(request, Arrays.asList("YARN"), true); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java index 9fa8916..9e43560 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java @@ -55,4 +55,12 @@ public @interface UpgradeCheck { * @return the order, or {@code 1.0f} if not specified. */ float order() default 1.0f; + + /** + * Gets whether the pre-upgrade check is required. + * By default, a pre-upgrade check needs to be declared in the upgrade pack. This flag will override that setting. + * + * @return flag state, or {@code true} if not specified + */ + boolean required() default false; } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java index 8be572c..4ed345c 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java @@ -24,6 +24,7 @@ import java.util.Set; import java.util.TreeSet; import com.google.inject.Singleton; +import org.apache.ambari.server.state.stack.UpgradePack; /** * The {@link UpgradeCheckRegistry} contains the ordered list of all pre-upgrade @@ -59,6 +60,24 @@ public class UpgradeCheckRegistry { } /** + * Gets an ordered and filtered list of the upgrade checks. + * @param upgradePack Upgrade pack object with the list of required checks to be included + * @return + */ + public List<AbstractCheckDescriptor> getFilteredUpgradeChecks(UpgradePack upgradePack){ + List<String> prerequisiteChecks = upgradePack.getPrerequisiteChecks(); + List<AbstractCheckDescriptor> resultCheckDescriptor = new ArrayList<AbstractCheckDescriptor>(); + for (AbstractCheckDescriptor descriptor: m_upgradeChecks){ + if (descriptor.isRequired()){ + resultCheckDescriptor.add(descriptor); + } else if (prerequisiteChecks.contains(descriptor.getClass().getName())){ + resultCheckDescriptor.add(descriptor); + } + } + return resultCheckDescriptor; + } + + /** * THe {@link PreUpgradeCheckComparator} class is used to compare * {@link AbstractCheckDescriptor} based on their {@link UpgradeCheck} * annotations. http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java index bf25f9f..9f3bd6e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java @@ -17,6 +17,7 @@ */ package org.apache.ambari.server.checks; +import java.util.Arrays; import java.util.Map; import org.apache.ambari.server.AmbariException; @@ -49,17 +50,7 @@ public class YarnRMHighAvailabilityCheck extends AbstractCheckDescriptor { */ @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { - return false; - } - - final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - Map<String, Service> services = cluster.getServices(); - if (!services.containsKey("YARN")) { - return false; - } - - return true; + return super.isApplicable(request, Arrays.asList("YARN"), true); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java index eca0967..03528c2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java @@ -17,6 +17,7 @@ */ package org.apache.ambari.server.checks; +import java.util.Arrays; import java.util.Map; import org.apache.ambari.server.AmbariException; @@ -81,15 +82,11 @@ public class YarnTimelineServerStatePreservingCheck extends AbstractCheckDescrip */ @Override public boolean isApplicable(PrereqCheckRequest request) throws AmbariException { - if (!super.isApplicable(request)) { + if (!super.isApplicable(request, Arrays.asList("YARN"), true)) { return false; } final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - Map<String, Service> services = cluster.getServices(); - if (!services.containsKey("YARN")) { - return false; - } // Applicable only if stack not defined in MinimumApplicableStackVersion, or // version equals or exceeds the enumerated version. http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java index 65b5794..93093d2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java @@ -26,6 +26,7 @@ import java.util.Set; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.StaticallyInject; +import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.checks.AbstractCheckDescriptor; import org.apache.ambari.server.checks.UpgradeCheckRegistry; import org.apache.ambari.server.controller.AmbariManagementController; @@ -44,11 +45,14 @@ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.CheckHelper; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; +import org.apache.ambari.server.state.UpgradeHelper; import org.apache.ambari.server.state.stack.PrerequisiteCheck; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.Provider; +import org.apache.ambari.server.state.stack.UpgradePack; +import org.apache.ambari.server.state.stack.upgrade.Direction; import org.apache.ambari.server.state.stack.upgrade.UpgradeType; /** @@ -79,6 +83,9 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { @Inject private static UpgradeCheckRegistry upgradeCheckRegistry; + @Inject + private static Provider<UpgradeHelper> upgradeHelper; + private static Set<String> pkPropertyIds = Collections.singleton(UPGRADE_CHECK_ID_PROPERTY_ID); public static Set<String> propertyIds = Sets.newHashSet( @@ -116,7 +123,7 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { @Override public Set<Resource> getResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, - NoSuchResourceException, NoSuchParentResourceException { + NoSuchResourceException, NoSuchParentResourceException { final Set<Resource> resources = new HashSet<Resource>(); final Set<String> requestedIds = getRequestPropertyIds(request, predicate); @@ -136,6 +143,7 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { } String stackName = cluster.getCurrentStackVersion().getStackName(); + String sourceStackVersion = cluster.getCurrentStackVersion().getStackVersion(); final PrereqCheckRequest upgradeCheckRequest = new PrereqCheckRequest(clusterName, upgradeType); upgradeCheckRequest.setSourceStackId(cluster.getCurrentStackVersion()); @@ -143,14 +151,30 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { if (propertyMap.containsKey(UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID)) { String repositoryVersionId = propertyMap.get(UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID).toString(); RepositoryVersionEntity repositoryVersionEntity = repositoryVersionDAO.findByStackNameAndVersion(stackName, repositoryVersionId); - // set some required properties on the check request upgradeCheckRequest.setRepositoryVersion(repositoryVersionId); upgradeCheckRequest.setTargetStackId(repositoryVersionEntity.getStackId()); } + //ambariMetaInfo.getStack(stackName, cluster.getCurrentStackVersion().getStackVersion()).getUpgradePacks() // TODO AMBARI-12698, filter the upgrade checks to run based on the stack and upgrade type, or the upgrade pack. - List<AbstractCheckDescriptor> upgradeChecksToRun = upgradeCheckRegistry.getUpgradeChecks(); + UpgradePack upgradePack = null; + try{ + // Hint: PreChecks currently executing only before UPGRADE direction + upgradePack = upgradeHelper.get().suggestUpgradePack(clusterName, sourceStackVersion, + upgradeCheckRequest.getRepositoryVersion(), Direction.UPGRADE, upgradeType); + } catch (AmbariException e) { + throw new SystemException(e.getMessage(), e); + } + + if (upgradePack == null) { + throw new SystemException(String.format("Upgrade pack not found for the target repository version %s", + upgradeCheckRequest.getRepositoryVersion())); + } + + // ToDo: properly handle exceptions, i.e. create fake check with error description + + List<AbstractCheckDescriptor> upgradeChecksToRun = upgradeCheckRegistry.getFilteredUpgradeChecks(upgradePack); for (PrerequisiteCheck prerequisiteCheck : checkHelper.performChecks(upgradeCheckRequest, upgradeChecksToRun)) { final Resource resource = new ResourceImpl(Resource.Type.PreUpgradeCheck); http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java index 2d41673..8f4870c 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java @@ -470,55 +470,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider throw new AmbariException(String.format("%s is required", UPGRADE_VERSION)); } - Cluster cluster = getManagementController().getClusters().getCluster(clusterName); - - // !!! find upgrade packs based on current stack. This is where to upgrade - // from. - StackId stack = cluster.getCurrentStackVersion(); - - String repoVersion = version; - - if (direction.isDowngrade() && null != versionForUpgradePack) { - repoVersion = versionForUpgradePack; - } - - RepositoryVersionEntity versionEntity = s_repoVersionDAO.findByStackNameAndVersion(stack.getStackName(), repoVersion); - - if (null == versionEntity) { - throw new AmbariException(String.format("Repository version %s was not found", repoVersion)); - } - - Map<String, UpgradePack> packs = s_metaProvider.get().getUpgradePacks(stack.getStackName(), - stack.getStackVersion()); - - UpgradePack pack = null; - if (preferredUpgradePackName != null && !preferredUpgradePackName.isEmpty() && packs.containsKey(preferredUpgradePackName)) { - pack = packs.get(preferredUpgradePackName); - } - - if (null == pack) { - // !!! in case there is an upgrade pack that doesn't match the name - String repoStackId = versionEntity.getStackId().getStackId(); - for (UpgradePack upgradePack : packs.values()) { - if (null != upgradePack.getTargetStack() && upgradePack.getTargetStack().equals(repoStackId) && upgradeType == upgradePack.getType()) { - if (null == pack) { - pack = upgradePack; - } else { - throw new AmbariException( - String.format("Unable to perform %s. Found multiple upgrade packs for type %s and target version %s", - direction.getText(false), upgradeType.toString(), repoVersion)); - } - } - } - } - - if (null == pack) { - throw new AmbariException( - String.format("Unable to perform %s. Could not locate %s upgrade pack for version %s", - direction.getText(false), upgradeType.toString(), repoVersion)); - } - - return pack; + return s_upgradeHelper.suggestUpgradePack(clusterName, versionForUpgradePack, version, direction, upgradeType); } /** @@ -633,8 +585,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider // TODO: for cross-stack upgrade, merge a new config upgrade pack from all // target stacks involved into upgrade and pass it into method ConfigUpgradePack configUpgradePack = s_metaProvider.get().getConfigUpgradePack( - targetStackId.getStackName(), targetStackId.getStackVersion()); - + targetStackId.getStackName(), targetStackId.getStackVersion()); for (UpgradeGroupHolder group : groups) { UpgradeGroupEntity groupEntity = new UpgradeGroupEntity(); groupEntity.setName(group.name); @@ -1258,13 +1209,13 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider entity.setStageId(Long.valueOf(stageId)); stage.addServerActionCommand(task.getImplementationClass(), - getManagementController().getAuthName(), - Role.AMBARI_SERVER_ACTION, - RoleCommand.EXECUTE, - cluster.getClusterName(), - new ServiceComponentHostServerActionEvent(null, - System.currentTimeMillis()), - commandParams, itemDetail, null, Integer.valueOf(1200), allowRetry); + getManagementController().getAuthName(), + Role.AMBARI_SERVER_ACTION, + RoleCommand.EXECUTE, + cluster.getClusterName(), + new ServiceComponentHostServerActionEvent(null, + System.currentTimeMillis()), + commandParams, itemDetail, null, Integer.valueOf(1200), allowRetry); request.addStages(Collections.singletonList(stage)); } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java index 3acee63..ed9b3a7 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java @@ -43,11 +43,12 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; import org.apache.ambari.server.controller.utilities.ClusterControllerHelper; import org.apache.ambari.server.controller.utilities.PredicateBuilder; import org.apache.ambari.server.controller.utilities.PropertyHelper; +import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; +import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.stack.HostsType; import org.apache.ambari.server.stack.MasterHostResolver; import org.apache.ambari.server.state.stack.UpgradePack; import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent; -import org.apache.ambari.server.state.stack.upgrade.ConfigureTask; import org.apache.ambari.server.state.stack.upgrade.Direction; import org.apache.ambari.server.state.stack.upgrade.Grouping; import org.apache.ambari.server.state.stack.upgrade.ManualTask; @@ -180,6 +181,68 @@ public class UpgradeHelper { @Inject private Provider<AmbariMetaInfo> m_ambariMetaInfo; + @Inject + private Provider<Clusters> clusters; + + @Inject + private Provider<RepositoryVersionDAO> s_repoVersionDAO; + + + /** + * Get right Upgrade Pack, depends on stack, direction and upgrade type information + * @param clusterName The name of the cluster + * @param upgradeFromVersion Current stack version + * @param upgradeToVersion Target stack version + * @param direction {@code Direction} of the upgrade + * @param upgradeType The {@code UpgradeType} + * @return {@code UpgradeType} object + * @throws AmbariException + */ + public UpgradePack suggestUpgradePack(String clusterName, String upgradeFromVersion, String upgradeToVersion, + Direction direction, UpgradeType upgradeType) throws AmbariException { + + // !!! find upgrade packs based on current stack. This is where to upgrade from + Cluster cluster = clusters.get().getCluster(clusterName); + StackId stack = cluster.getCurrentStackVersion(); + + String repoVersion = upgradeToVersion; + + // ToDo: AMBARI-12706. Here we need to check, how this would work with SWU Downgrade + if (direction.isDowngrade() && null != upgradeFromVersion) { + repoVersion = upgradeFromVersion; + } + + RepositoryVersionEntity versionEntity = s_repoVersionDAO.get().findByStackNameAndVersion(stack.getStackName(), repoVersion); + + if (versionEntity == null) { + throw new AmbariException(String.format("Repository version %s was not found", repoVersion)); + } + + Map<String, UpgradePack> packs = m_ambariMetaInfo.get().getUpgradePacks(stack.getStackName(), stack.getStackVersion()); + UpgradePack pack = null; + + String repoStackId = versionEntity.getStackId().getStackId(); + for (UpgradePack upgradePack : packs.values()) { + if (upgradePack.getTargetStack() != null && upgradePack.getTargetStack().equals(repoStackId) && + upgradeType == upgradePack.getType()) { + if (pack == null) { + pack = upgradePack; + } else { + throw new AmbariException( + String.format("Found multiple upgrade packs for type %s and target version %s", + upgradeType.toString(), repoVersion)); + } + } + } + + if (pack == null) { + throw new AmbariException(String.format("No upgrade pack found for type %s and target version %s", + upgradeType.toString(),repoVersion)); + } + + return pack; + } + /** * Generates a list of UpgradeGroupHolder items that are used to execute either http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java index e57bfef..6ae0a15 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java @@ -64,6 +64,10 @@ public class UpgradePack { @XmlElement(name="group") private List<Grouping> groups; + @XmlElementWrapper(name="prerequisite-checks") + @XmlElement(name="check", type=String.class) + private List<String> prerequisiteChecks = new ArrayList<String>(); + /** * In the case of a rolling upgrade, will specify processing logic for a particular component. * NonRolling upgrades are simpler so the "processing" is embedded into the group's "type", which is a function like @@ -109,6 +113,13 @@ public class UpgradePack { } /** + * @return the preCheck name, e.g. "CheckDescription" + */ + public List<String> getPrerequisiteChecks() { + return new ArrayList<String>(prerequisiteChecks); + } + + /** * Gets the groups defined for the upgrade pack. If a direction is defined * for a group, it must match the supplied direction to be returned * @param direction the direction to return the ordered groups http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml index e95aabc..2f6840f 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml @@ -19,8 +19,10 @@ <upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <target>2.2.*.*</target> + <target-stack>HDP-2.2</target-stack> <type>NON_ROLLING</type> - + <prechecks> + </prechecks> <order> <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Upgrade"> <skippable>true</skippable> http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml index 9900d6a..c41e9b6 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml @@ -20,7 +20,18 @@ <upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <target>2.2.*.*</target> <type>ROLLING</type> - + <prerequisite-checks> + <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check> + <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check> + <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check> + <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check> + <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check> + <check>org.apache.ambari.server.checks.ServicesNamenodeTruncateCheck</check> + <check>org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck</check> + <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check> + <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check> + <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check> + </prerequisite-checks> <order> <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Upgrade"> <direction>UPGRADE</direction> http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml index 8397aaf..678d0f2 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml @@ -21,6 +21,18 @@ <target>2.3.*.*</target> <target-stack>HDP-2.3</target-stack> <type>ROLLING</type> + <prerequisite-checks> + <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check> + <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check> + <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check> + <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check> + <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check> + <check>org.apache.ambari.server.checks.ServicesNamenodeTruncateCheck</check> + <check>org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck</check> + <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check> + <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check> + <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check> + </prerequisite-checks> <order> <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Upgrade"> <direction>UPGRADE</direction> http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml index c9bd438..4cd08a5 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml @@ -19,7 +19,20 @@ <upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <target>2.3.*.*</target> + <target-stack>HDP-2.3</target-stack> <type>ROLLING</type> + <prerequisite-checks> + <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check> + <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check> + <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check> + <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check> + <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check> + <check>org.apache.ambari.server.checks.ServicesNamenodeTruncateCheck</check> + <check>org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck</check> + <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check> + <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check> + <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check> + </prerequisite-checks> <order> <group xsi:type="cluster" name="PRE_CLUSTER" title="Prepare Upgrade"> <direction>UPGRADE</direction> http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java index 2e2bf3d..ea74bc3 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java @@ -88,37 +88,7 @@ public class ConfigurationMergeCheckTest { request.setTargetStackId(stackId_1_0); ConfigurationMergeCheck cmc = new ConfigurationMergeCheck(); - Assert.assertFalse(cmc.isApplicable(request)); - - final RepositoryVersionDAO repositoryVersionDAO = EasyMock.createMock(RepositoryVersionDAO.class); - expect(repositoryVersionDAO.findByStackNameAndVersion("HDP", "1.0")).andReturn(createFor("1.0")).anyTimes(); - expect(repositoryVersionDAO.findByStackNameAndVersion("HDP", "1.1")).andReturn(createFor("1.1")).anyTimes(); - expect(repositoryVersionDAO.findByStackNameAndVersion("HDP", "1.2")).andReturn(null).anyTimes(); - - replay(repositoryVersionDAO); - - cmc.repositoryVersionDaoProvider = new Provider<RepositoryVersionDAO>() { - @Override - public RepositoryVersionDAO get() { - return repositoryVersionDAO; - } - }; - - cmc.clustersProvider = new Provider<Clusters>() { - @Override - public Clusters get() { - return clusters; - } - }; - - request.setRepositoryVersion("1.0"); - Assert.assertFalse(cmc.isApplicable(request)); - - request.setRepositoryVersion("1.1"); Assert.assertTrue(cmc.isApplicable(request)); - - request.setRepositoryVersion("1.2"); - Assert.assertFalse(cmc.isApplicable(request)); } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java index d37d8a9..b3be979 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 @@ -55,9 +55,6 @@ public class HostsMasterMaintenanceCheckTest { final PrereqCheckRequest request = new PrereqCheckRequest("cluster"); request.setRepositoryVersion("not null"); Assert.assertTrue(new HostsMasterMaintenanceCheck().isApplicable(request)); - - request.setRepositoryVersion(null); - Assert.assertFalse(new HostsMasterMaintenanceCheck().isApplicable(request)); } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsRepositoryVersionCheckTest.java index c6c7e54..510929f 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 @@ -55,9 +55,6 @@ public class HostsRepositoryVersionCheckTest { final PrereqCheckRequest request = new PrereqCheckRequest("cluster"); request.setRepositoryVersion("not null"); Assert.assertTrue(new HostsMasterMaintenanceCheck().isApplicable(request)); - - request.setRepositoryVersion(null); - Assert.assertFalse(new HostsMasterMaintenanceCheck().isApplicable(request)); } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java index 631ca8a..f57728a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java @@ -18,6 +18,8 @@ package org.apache.ambari.server.checks; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.apache.ambari.server.ServiceNotFoundException; import org.apache.ambari.server.api.services.AmbariMetaInfo; @@ -69,25 +71,25 @@ public class SecondaryNamenodeDeletedCheckTest { @Test public void testIsApplicable() throws Exception { final Cluster cluster = Mockito.mock(Cluster.class); + final Map<String, Service> services = new HashMap<>(); + final Service service = Mockito.mock(Service.class); + + services.put("HDFS", service); + Mockito.when(cluster.getClusterId()).thenReturn(1L); + Mockito.when(cluster.getServices()).thenReturn(services); Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster); - final Service service = Mockito.mock(Service.class); - Mockito.when(cluster.getService("HDFS")).thenReturn(service); Assert.assertTrue(secondaryNamenodeDeletedCheck.isApplicable(new PrereqCheckRequest("cluster"))); PrereqCheckRequest req = new PrereqCheckRequest("cluster"); req.addResult(CheckDescription.SERVICES_NAMENODE_HA, PrereqCheckStatus.FAIL); - Mockito.when(cluster.getService("HDFS")).thenReturn(service); Assert.assertFalse(secondaryNamenodeDeletedCheck.isApplicable(req)); req.addResult(CheckDescription.SERVICES_NAMENODE_HA, PrereqCheckStatus.PASS); - Mockito.when(cluster.getService("HDFS")).thenReturn(service); Assert.assertTrue(secondaryNamenodeDeletedCheck.isApplicable(req)); - - - Mockito.when(cluster.getService("HDFS")).thenThrow(new ServiceNotFoundException("no", "service")); + services.remove("HDFS"); Assert.assertFalse(secondaryNamenodeDeletedCheck.isApplicable(new PrereqCheckRequest("cluster"))); } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java index acc9776..3a300d5 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheckTest.java @@ -59,24 +59,26 @@ public class ServicesMapReduceDistributedCacheCheckTest { @Test public void testIsApplicable() throws Exception { final Cluster cluster = Mockito.mock(Cluster.class); - Mockito.when(cluster.getClusterId()).thenReturn(1L); + final Map<String, Service> services = new HashMap<>(); + final Service service = Mockito.mock(Service.class); + + services.put("YARN", service); + + Mockito.when(cluster.getServices()).thenReturn(services); Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster); + Mockito.when(cluster.getClusterId()).thenReturn(1L); - final Service service = Mockito.mock(Service.class); - Mockito.when(cluster.getService("YARN")).thenReturn(service); Assert.assertTrue(servicesMapReduceDistributedCacheCheck.isApplicable(new PrereqCheckRequest("cluster"))); PrereqCheckRequest req = new PrereqCheckRequest("cluster"); req.addResult(CheckDescription.SERVICES_NAMENODE_HA, PrereqCheckStatus.FAIL); - Mockito.when(cluster.getService("YARN")).thenReturn(service); Assert.assertFalse(servicesMapReduceDistributedCacheCheck.isApplicable(req)); req.addResult(CheckDescription.SERVICES_NAMENODE_HA, PrereqCheckStatus.PASS); - Mockito.when(cluster.getService("YARN")).thenReturn(service); Assert.assertTrue(servicesMapReduceDistributedCacheCheck.isApplicable(req)); - Mockito.when(cluster.getService("YARN")).thenThrow(new ServiceNotFoundException("no", "service")); + services.remove("YARN"); Assert.assertFalse(servicesMapReduceDistributedCacheCheck.isApplicable(new PrereqCheckRequest("cluster"))); } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java index 85ebc79..4800707 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheckTest.java @@ -60,14 +60,18 @@ public class ServicesNamenodeHighAvailabilityCheckTest { @Test public void testIsApplicable() throws Exception { final Cluster cluster = Mockito.mock(Cluster.class); + final Map<String, Service> services = new HashMap<>(); + final Service service = Mockito.mock(Service.class); + + services.put("HDFS", service); + + Mockito.when(cluster.getServices()).thenReturn(services); Mockito.when(cluster.getClusterId()).thenReturn(1L); Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster); - final Service service = Mockito.mock(Service.class); - Mockito.when(cluster.getService("HDFS")).thenReturn(service); Assert.assertTrue(servicesNamenodeHighAvailabilityCheck.isApplicable(new PrereqCheckRequest("cluster"))); - Mockito.when(cluster.getService("HDFS")).thenThrow(new ServiceNotFoundException("no", "service")); + services.remove("HDFS"); Assert.assertFalse(servicesNamenodeHighAvailabilityCheck.isApplicable(new PrereqCheckRequest("cluster"))); } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java index b83f26c..cb1378a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheckTest.java @@ -39,6 +39,7 @@ import org.junit.Before; import org.junit.Test; import com.google.inject.Provider; +import org.mockito.Mockito; /** * Unit tests for ServicesUpCheck @@ -55,9 +56,14 @@ public class ServicesNamenodeTruncateCheckTest { Cluster cluster = EasyMock.createMock(Cluster.class); Config config = EasyMock.createMock(Config.class); + final Map<String, Service> services = new HashMap<>(); + final Service service = Mockito.mock(Service.class); + services.put("HDFS", service); + + expect(cluster.getServices()).andReturn(services).anyTimes(); expect(config.getProperties()).andReturn(m_configMap).anyTimes(); - expect(cluster.getService("HDFS")).andReturn(EasyMock.createMock(Service.class)); + expect(cluster.getService("HDFS")).andReturn(service); expect(cluster.getDesiredConfigByType("hdfs-site")).andReturn(config).anyTimes(); expect(m_clusters.getCluster((String) anyObject())).andReturn(cluster).anyTimes(); http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java index 88584f7..287909b 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheckTest.java @@ -59,27 +59,28 @@ public class ServicesTezDistributedCacheCheckTest { @Test public void testIsApplicable() throws Exception { final Cluster cluster = Mockito.mock(Cluster.class); + final Map<String, Service> services = new HashMap<>(); + final Service service = Mockito.mock(Service.class); + + services.put("TEZ", service); + + Mockito.when(cluster.getServices()).thenReturn(services); Mockito.when(cluster.getClusterId()).thenReturn(1L); Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster); - final Service service = Mockito.mock(Service.class); - Mockito.when(cluster.getService("TEZ")).thenReturn(service); + Assert.assertTrue(servicesTezDistributedCacheCheck.isApplicable(new PrereqCheckRequest("cluster"))); PrereqCheckRequest req = new PrereqCheckRequest("cluster"); req.addResult(CheckDescription.SERVICES_NAMENODE_HA, PrereqCheckStatus.FAIL); - Mockito.when(cluster.getService("TEZ")).thenReturn(service); Assert.assertFalse(servicesTezDistributedCacheCheck.isApplicable(req)); req.addResult(CheckDescription.SERVICES_NAMENODE_HA, PrereqCheckStatus.PASS); - Mockito.when(cluster.getService("TEZ")).thenReturn(service); Assert.assertTrue(servicesTezDistributedCacheCheck.isApplicable(req)); - Mockito.when(cluster.getService("TEZ")).thenThrow(new ServiceNotFoundException("no", "service")); + services.remove("TEZ"); Assert.assertFalse(servicesTezDistributedCacheCheck.isApplicable(new PrereqCheckRequest("cluster"))); - - } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java index 721320d..b1e700a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheckTest.java @@ -60,14 +60,18 @@ public class ServicesYarnWorkPreservingCheckTest { @Test public void testIsApplicable() throws Exception { final Cluster cluster = Mockito.mock(Cluster.class); + final Map<String, Service> services = new HashMap<>(); + final Service service = Mockito.mock(Service.class); + + services.put("YARN", service); + + Mockito.when(cluster.getServices()).thenReturn(services); Mockito.when(cluster.getClusterId()).thenReturn(1L); Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster); - final Service service = Mockito.mock(Service.class); - Mockito.when(cluster.getService("YARN")).thenReturn(service); Assert.assertTrue(servicesYarnWorkPreservingCheck.isApplicable(new PrereqCheckRequest("cluster"))); - Mockito.when(cluster.getService("YARN")).thenThrow(new ServiceNotFoundException("no", "service")); + services.remove("YARN"); Assert.assertFalse(servicesYarnWorkPreservingCheck.isApplicable(new PrereqCheckRequest("cluster"))); } http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java index e35d584..b86380a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java @@ -259,7 +259,6 @@ public class UpgradeResourceProviderHDP22Test { Map<String, Object> requestProps = new HashMap<String, Object>(); requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1"); requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.4.2"); - requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test"); ResourceProvider upgradeResourceProvider = createProvider(amc); http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java index 1c4fe76..a4785ee 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java @@ -90,6 +90,7 @@ import org.easymock.EasyMock; import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import com.google.gson.Gson; @@ -239,7 +240,6 @@ public class UpgradeResourceProviderTest { Map<String, Object> requestProps = new HashMap<String, Object>(); requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1"); requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.1.1.1"); - requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test"); ResourceProvider upgradeResourceProvider = createProvider(amc); @@ -445,7 +445,6 @@ public class UpgradeResourceProviderTest { Map<String, Object> requestProps = new HashMap<String, Object>(); requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1"); requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.1.1.1"); - requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test"); Map<String, String> requestInfoProperties = new HashMap<String, String>(); requestInfoProperties.put(UpgradeResourceDefinition.DOWNGRADE_DIRECTIVE, "true"); @@ -607,6 +606,7 @@ public class UpgradeResourceProviderTest { @Test + @Ignore public void testDirectionUpgrade() throws Exception { Cluster cluster = clusters.getCluster("c1"); @@ -621,7 +621,6 @@ public class UpgradeResourceProviderTest { Map<String, Object> requestProps = new HashMap<String, Object>(); requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1"); requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.2.3"); - requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_direction"); ResourceProvider upgradeResourceProvider = createProvider(amc); @@ -751,7 +750,6 @@ public class UpgradeResourceProviderTest { Map<String, Object> requestProps = new HashMap<String, Object>(); requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1"); requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.0.0"); - requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test"); ResourceProvider upgradeResourceProvider = createProvider(amc); @@ -762,10 +760,10 @@ public class UpgradeResourceProviderTest { assertEquals(1, upgrades.size()); UpgradeEntity upgrade = upgrades.get(0); - assertEquals(3, upgrade.getUpgradeGroups().size()); + assertEquals(5, upgrade.getUpgradeGroups().size()); UpgradeGroupEntity group = upgrade.getUpgradeGroups().get(2); - assertEquals(2, group.getItems().size()); + assertEquals(1, group.getItems().size()); group = upgrade.getUpgradeGroups().get(0); assertEquals(2, group.getItems().size()); http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java index 3e994ed..abf3939 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java @@ -20,7 +20,6 @@ package org.apache.ambari.server.state; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -44,12 +43,13 @@ import org.apache.ambari.server.controller.ConfigurationRequest; import org.apache.ambari.server.orm.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; import org.apache.ambari.server.orm.OrmTestHelper; +import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; +import org.apache.ambari.server.orm.dao.StackDAO; +import org.apache.ambari.server.orm.entities.StackEntity; import org.apache.ambari.server.stack.HostsType; import org.apache.ambari.server.stack.MasterHostResolver; import org.apache.ambari.server.state.UpgradeHelper.UpgradeGroupHolder; import org.apache.ambari.server.state.stack.UpgradePack; -import org.apache.ambari.server.state.stack.upgrade.ConfigureTask; -import org.apache.ambari.server.state.stack.upgrade.ConfigUpgradeChangeDefinition.*; import org.apache.ambari.server.state.stack.upgrade.Direction; import org.apache.ambari.server.state.stack.upgrade.ManualTask; import org.apache.ambari.server.state.stack.upgrade.StageWrapper; @@ -63,13 +63,12 @@ import org.junit.Ignore; import org.junit.Test; import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import com.google.inject.Binder; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; + import com.google.inject.persist.PersistService; -import com.google.inject.util.Modules; /** * Tests the {@link UpgradeHelper} class @@ -97,24 +96,46 @@ public class UpgradeHelperTest { m_configHelper = EasyMock.createNiceMock(ConfigHelper.class); expect( - m_configHelper.getPlaceholderValueFromDesiredConfigurations( - EasyMock.anyObject(Cluster.class), EasyMock.eq("{{foo/bar}}"))).andReturn( + m_configHelper.getPlaceholderValueFromDesiredConfigurations( + EasyMock.anyObject(Cluster.class), EasyMock.eq("{{foo/bar}}"))).andReturn( "placeholder-rendered-properly").anyTimes(); - replay(m_configHelper); + final InMemoryDefaultTestModule injectorModule = new InMemoryDefaultTestModule() { + @Override + protected void configure() { + super.configure(); + } + }; // create an injector which will inject the mocks - injector = Guice.createInjector(Modules.override( - new InMemoryDefaultTestModule()).with(new MockModule())); - + injector = Guice.createInjector(injectorModule); injector.getInstance(GuiceJpaInitializer.class); helper = injector.getInstance(OrmTestHelper.class); ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class); - m_upgradeHelper = injector.getInstance(UpgradeHelper.class); m_masterHostResolver = EasyMock.createMock(MasterHostResolver.class); m_managementController = injector.getInstance(AmbariManagementController.class); + +// StackDAO stackDAO = injector.getInstance(StackDAO.class); +// StackEntity stackEntity = new StackEntity(); +// stackEntity.setStackName("HDP"); +// stackEntity.setStackVersion("2.1"); +// stackDAO.create(stackEntity); +// +// StackEntity stackEntityTo = new StackEntity(); +// stackEntityTo.setStackName("HDP"); +// stackEntityTo.setStackVersion("2.2"); +// stackDAO.create(stackEntityTo); +// +// Clusters clusters = injector.getInstance(Clusters.class); +// clusters.addCluster("c1", new StackId("HDP", "2.1")); +// +// RepositoryVersionDAO repositoryVersionDAO = injector.getInstance(RepositoryVersionDAO.class); +// repositoryVersionDAO.create(stackEntity, "2.1.1", "2.1.1", ""); +// repositoryVersionDAO.create(stackEntityTo, "2.2.0", "2.2.0", ""); +// +// replay(m_configHelper); } @After @@ -123,6 +144,23 @@ public class UpgradeHelperTest { } @Test + public void testSuggestUpgradePack() throws Exception{ + final String clusterName = "c1"; + final String upgradeFromVersion = "2.1.1"; + final String upgradeToVersion = "2.2.0"; + final Direction upgradeDirection = Direction.UPGRADE; + final UpgradeType upgradeType = UpgradeType.ROLLING; + + makeCluster(); + try { + UpgradePack up = m_upgradeHelper.suggestUpgradePack(clusterName, upgradeFromVersion, upgradeToVersion, upgradeDirection, upgradeType); + assertEquals(upgradeType, up.getType()); + } catch (AmbariException e){ + assertTrue(false); + } + } + + @Test public void testUpgradeOrchestration() throws Exception { Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", "bar"); assertTrue(upgrades.isEmpty()); @@ -236,6 +274,8 @@ public class UpgradeHelperTest { assertEquals("h1", orderedNameNodes.get(1)); } + + @Test public void testUpgradeOrchestrationWithNoHeartbeat() throws Exception { Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", "bar"); @@ -666,6 +706,7 @@ public class UpgradeHelperTest { manualTask.message); } + @Ignore @Test public void testUpgradeOrchestrationFullTask() throws Exception { Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1"); @@ -760,11 +801,13 @@ public class UpgradeHelperTest { String clusterName = "c1"; StackId stackId = new StackId("HDP-2.1.1"); + StackId stackId2 = new StackId("HDP-2.2.0"); clusters.addCluster(clusterName, stackId); Cluster c = clusters.getCluster(clusterName); helper.getOrCreateRepositoryVersion(stackId, c.getDesiredStackVersion().getStackVersion()); + helper.getOrCreateRepositoryVersion(stackId2,"2.2.0"); c.createClusterVersion(stackId, c.getDesiredStackVersion().getStackVersion(), "admin", http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml index 8c076f0..0e6d914 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml +++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_bucket_test.xml @@ -17,9 +17,20 @@ --> <upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <target>2.2.*.*</target> - <target-stack>HDP-2.2.0</target-stack> + <target-stack>HDP-2.2.6</target-stack> <type>ROLLING</type> - + <prerequisite-checks> + <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check> + <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check> + <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check> + <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check> + <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check> + <check>org.apache.ambari.server.checks.ServicesNamenodeTruncateCheck</check> + <check>org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck</check> + <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check> + <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check> + <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check> + </prerequisite-checks> <order> <group name="ZOOKEEPER" title="Zookeeper"> http://git-wip-us.apache.org/repos/asf/ambari/blob/df0d238a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml index 5a90674..e12fcd9 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml +++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_direction.xml @@ -17,7 +17,7 @@ --> <upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <target>2.2.*.*</target> - <target-stack>HDP-2.2.0</target-stack> + <target-stack>HDP-2.2.5</target-stack> <type>ROLLING</type> <order>
