AMBARI-13378. Stop-and-Start Upgrade: Merge feature branch to trunk. (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/c58162fe Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c58162fe Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c58162fe Branch: refs/heads/trunk Commit: c58162fe3538f8e4d67ad11da6f7d3c8940012a6 Parents: fa6f80a Author: Lisnichenko Dmitro <dlysniche...@hortonworks.com> Authored: Mon Oct 12 15:18:50 2015 +0300 Committer: Lisnichenko Dmitro <dlysniche...@hortonworks.com> Committed: Mon Oct 12 15:20:44 2015 +0300 ---------------------------------------------------------------------- .../server/api/services/AmbariMetaInfo.java | 21 +- .../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 | 15 +- .../checks/HostsRepositoryVersionCheck.java | 11 +- ...apReduce2JobHistoryStatePreservingCheck.java | 7 +- .../checks/SecondaryNamenodeDeletedCheck.java | 15 +- .../checks/ServicesMaintenanceModeCheck.java | 3 +- .../ServicesMapReduceDistributedCacheCheck.java | 10 +- .../ServicesNamenodeHighAvailabilityCheck.java | 13 +- .../checks/ServicesNamenodeTruncateCheck.java | 11 +- .../ServicesTezDistributedCacheCheck.java | 10 +- .../ambari/server/checks/ServicesUpCheck.java | 4 +- .../checks/ServicesYarnWorkPreservingCheck.java | 14 +- .../ambari/server/checks/UpgradeCheck.java | 8 + .../server/checks/UpgradeCheckRegistry.java | 19 + .../checks/YarnRMHighAvailabilityCheck.java | 13 +- .../YarnTimelineServerStatePreservingCheck.java | 7 +- .../AmbariCustomCommandExecutionHelper.java | 13 +- .../AmbariManagementControllerImpl.java | 6 +- .../server/controller/PrereqCheckRequest.java | 20 +- .../ClusterStackVersionResourceProvider.java | 6 +- ...atibleRepositoryVersionResourceProvider.java | 3 - .../PreUpgradeCheckResourceProvider.java | 47 +- .../RepositoryVersionResourceProvider.java | 102 ++- .../internal/UpgradeResourceProvider.java | 246 ++++-- .../ambari/server/metadata/ActionMetadata.java | 4 +- .../server/orm/dao/ClusterVersionDAO.java | 23 + .../apache/ambari/server/orm/dao/CrudDAO.java | 15 + .../ambari/server/orm/dao/HostVersionDAO.java | 42 +- .../server/orm/dao/RepositoryVersionDAO.java | 6 +- .../ambari/server/orm/dao/UpgradeDAO.java | 19 +- .../orm/entities/RepositoryVersionEntity.java | 18 +- .../server/orm/entities/UpgradeEntity.java | 89 ++ .../serveraction/upgrades/ConfigureAction.java | 23 +- .../upgrades/UpdateDesiredStackAction.java | 139 ++++ .../server/stack/ModuleFileUnmarshaller.java | 4 +- .../server/stack/StackDefinitionDirectory.java | 2 + .../ambari/server/stack/StackDirectory.java | 52 +- .../apache/ambari/server/stack/StackModule.java | 2 +- .../apache/ambari/server/state/StackInfo.java | 31 +- .../ambari/server/state/UpgradeContext.java | 50 +- .../ambari/server/state/UpgradeHelper.java | 151 +++- .../server/state/stack/ConfigUpgradePack.java | 192 +++++ .../ambari/server/state/stack/UpgradePack.java | 114 ++- .../state/stack/upgrade/ClusterGrouping.java | 27 +- .../upgrade/ConfigUpgradeChangeDefinition.java | 420 ++++++++++ .../state/stack/upgrade/ConfigureTask.java | 335 ++------ .../server/state/stack/upgrade/ExecuteTask.java | 12 + .../server/state/stack/upgrade/Grouping.java | 37 +- .../server/state/stack/upgrade/ManualTask.java | 4 + .../stack/upgrade/RepositoryVersionHelper.java | 43 +- .../state/stack/upgrade/RestartGrouping.java | 36 + .../server/state/stack/upgrade/RestartTask.java | 14 +- .../state/stack/upgrade/ServerActionTask.java | 4 + .../stack/upgrade/ServerSideActionTask.java | 7 + .../stack/upgrade/ServiceCheckGrouping.java | 46 +- .../state/stack/upgrade/ServiceCheckTask.java | 12 + .../state/stack/upgrade/StageWrapper.java | 6 +- .../stack/upgrade/StageWrapperBuilder.java | 12 +- .../state/stack/upgrade/StartGrouping.java | 36 + .../server/state/stack/upgrade/StartTask.java | 53 ++ .../state/stack/upgrade/StopGrouping.java | 36 + .../server/state/stack/upgrade/StopTask.java | 53 ++ .../ambari/server/state/stack/upgrade/Task.java | 22 +- .../stack/upgrade/UpdateStackGrouping.java | 36 + .../state/stack/upgrade/UpgradeFunction.java | 26 + .../server/state/stack/upgrade/UpgradeType.java | 36 + .../svccomphost/ServiceComponentHostImpl.java | 1 - .../main/resources/Ambari-DDL-MySQL-CREATE.sql | 3 +- .../main/resources/Ambari-DDL-Oracle-CREATE.sql | 3 +- .../resources/Ambari-DDL-Postgres-CREATE.sql | 3 +- .../Ambari-DDL-Postgres-EMBEDDED-CREATE.sql | 3 +- .../resources/Ambari-DDL-SQLServer-CREATE.sql | 3 +- .../0.96.0.2.0/package/scripts/hbase_upgrade.py | 6 +- .../HDFS/2.1.0.2.0/package/scripts/namenode.py | 15 + .../HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml | 383 +++++++++ .../stacks/HDP/2.2/upgrades/config-upgrade.xml | 55 ++ .../HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml | 469 +++++++++++ .../stacks/HDP/2.2/upgrades/upgrade-2.2.xml | 41 +- .../stacks/HDP/2.2/upgrades/upgrade-2.3.xml | 637 ++------------- .../stacks/HDP/2.3/upgrades/config-upgrade.xml | 807 +++++++++++++++++++ .../stacks/HDP/2.3/upgrades/upgrade-2.3.xml | 41 +- .../checks/ConfigurationMergeCheckTest.java | 30 - .../checks/HostsMasterMaintenanceCheckTest.java | 14 +- .../checks/HostsRepositoryVersionCheckTest.java | 5 +- .../SecondaryNamenodeDeletedCheckTest.java | 16 +- ...vicesMapReduceDistributedCacheCheckTest.java | 14 +- ...rvicesNamenodeHighAvailabilityCheckTest.java | 10 +- .../ServicesNamenodeTruncateCheckTest.java | 8 +- .../ServicesTezDistributedCacheCheckTest.java | 15 +- .../ServicesYarnWorkPreservingCheckTest.java | 10 +- .../checks/UpgradeCheckStackVersionTest.java | 170 ---- .../AmbariManagementControllerTest.java | 2 +- ...leRepositoryVersionResourceProviderTest.java | 16 + .../RepositoryVersionResourceProviderTest.java | 109 ++- .../UpgradeResourceProviderHDP22Test.java | 3 +- .../internal/UpgradeResourceProviderTest.java | 66 +- .../apache/ambari/server/orm/OrmTestHelper.java | 2 +- .../ambari/server/orm/dao/CrudDAOTest.java | 1 - .../orm/dao/RepositoryVersionDAOTest.java | 8 +- .../ambari/server/orm/dao/UpgradeDAOTest.java | 10 +- .../upgrades/ConfigureActionTest.java | 39 +- .../upgrades/UpgradeActionTest.java | 6 +- .../ambari/server/state/UpgradeHelperTest.java | 162 ++-- .../state/stack/ConfigUpgradePackTest.java | 198 +++++ .../server/state/stack/UpgradePackTest.java | 190 +++-- .../stack/upgrade/StageWrapperBuilderTest.java | 4 +- .../stacks/2.0.6/HBASE/test_hbase_master.py | 2 +- .../HDP/2.1.1/upgrades/config-upgrade.xml | 101 +++ .../HDP/2.1.1/upgrades/upgrade_bucket_test.xml | 17 +- .../HDP/2.1.1/upgrades/upgrade_direction.xml | 6 +- .../stacks/HDP/2.1.1/upgrades/upgrade_test.xml | 61 +- .../HDP/2.1.1/upgrades/upgrade_test_checks.xml | 30 +- .../2.1.1/upgrades/upgrade_test_nonrolling.xml | 182 +++++ .../HDP/2.1.1/upgrades/upgrade_to_new_stack.xml | 24 +- .../HDP/2.2.0/upgrades/config-upgrade.xml | 101 +++ .../stacks/HDP/2.2.0/upgrades/upgrade_test.xml | 21 +- .../HDP/2.2.0/upgrades/upgrade_test_checks.xml | 30 +- 123 files changed, 5244 insertions(+), 1954 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java index 561b3f4..e35e7ac 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java @@ -60,6 +60,7 @@ import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptorFactory; import org.apache.ambari.server.state.stack.Metric; import org.apache.ambari.server.state.stack.MetricDefinition; import org.apache.ambari.server.state.stack.OsFamily; +import org.apache.ambari.server.state.stack.ConfigUpgradePack; import org.apache.ambari.server.state.stack.UpgradePack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -997,7 +998,7 @@ public class AmbariMetaInfo { } return alertDefinitionFactory.getAlertDefinitions(alertsFile, - service.getName()); + service.getName()); } /** @@ -1206,6 +1207,24 @@ public class AmbariMetaInfo { } /** + * Get all upgrade config pack if it is available for a stack. + * + * @param stackName the stack name + * @param stackVersion the stack version + * @return config upgrade pack for stack or null if it is + * not defined for stack + */ + public ConfigUpgradePack getConfigUpgradePack(String stackName, String stackVersion) { + try { + StackInfo stack = getStack(stackName, stackVersion); + return stack.getConfigUpgradePack(); + } catch (AmbariException e) { + LOG.debug("Cannot load config upgrade pack for non-existent stack {}-{}", stackName, stackVersion, e); + return null; + } + } + + /** * Gets the fully compiled Kerberos descriptor for the relevant stack and version. * <p/> * All of the kerberos.json files from the specified stack (and version) are read, parsed and http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/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 2f0bc94..760a971 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; @@ -82,7 +84,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)}. * @@ -94,26 +96,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); } /** @@ -292,4 +304,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/c58162fe/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/c58162fe/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/c58162fe/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/c58162fe/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/c58162fe/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 a8600c4..a6811cb 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 @@ -43,7 +43,7 @@ import com.google.inject.Singleton; * {@link PrereqCheckStatus#WARNING} for any hosts in maintenance mode. */ @Singleton -@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 1.0f) +@UpgradeCheck(group = UpgradeCheckGroup.LIVELINESS, order = 1.0f, required = true) public class HostsHeartbeatCheck extends AbstractCheckDescriptor { static final String KEY_HOSTS_IN_MM_WARNING = "key.hosts.in.mm.warning"; http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/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 ef93337..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,21 +54,14 @@ 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); final StackId stackId = cluster.getDesiredStackVersion(); final Set<String> hostsWithMasterComponent = new HashSet<String>(); - final String upgradePackName = repositoryVersionHelper.get().getUpgradePackageName(stackId.getStackName(), stackId.getStackVersion(), request.getRepositoryVersion()); + + // TODO AMBARI-12698, need to pass the upgrade pack to use in the request, or at least the type. + final String upgradePackName = repositoryVersionHelper.get().getUpgradePackageName(stackId.getStackName(), stackId.getStackVersion(), request.getRepositoryVersion(), null); if (upgradePackName == null) { prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL); String fail = getFailReason(KEY_NO_UPGRADE_NAME, prerequisiteCheck, request); http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/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 eaa0096..00862ac 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 @@ -41,7 +41,7 @@ import com.google.inject.Singleton; * orchstration, so no warning is required. */ @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"; @@ -54,15 +54,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(); http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/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/c58162fe/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 493042f..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; } @@ -72,6 +66,11 @@ public class SecondaryNamenodeDeletedCheck extends AbstractCheckDescriptor { return true; } + // TODO AMBARI-12698, there are 2 ways to filter the prechecks. + // 1. Explictly mention them in each upgrade pack, which is more flexible, but requires adding the name of checks + // to perform in each upgrade pack. + // 2. Make each upgrade check class call a function before perform() that will determine if the check is appropriate + // given the type of upgrade. The PrereqCheckRequest object has a field for the type of upgrade. @Override public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException { Set<String> hosts = new HashSet<String>(); http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/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/c58162fe/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/c58162fe/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/c58162fe/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/c58162fe/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/c58162fe/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..09ad55d 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; @@ -150,4 +150,4 @@ public class ServicesUpCheck extends AbstractCheckDescriptor { } } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/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/c58162fe/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/c58162fe/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/c58162fe/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/c58162fe/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/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java index d80b497..9ba5a22 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java @@ -912,7 +912,7 @@ public class AmbariCustomCommandExecutionHelper { String commandDetail = getReadableCustomCommandDetail(actionExecutionContext, resourceFilter); - Map<String, String> extraParams = new HashMap<String, String>();; + Map<String, String> extraParams = new HashMap<String, String>(); String componentName = (null == resourceFilter.getComponentName()) ? null : resourceFilter.getComponentName().toLowerCase(); @@ -1036,11 +1036,12 @@ public class AmbariCustomCommandExecutionHelper { * * @param actionExecContext the context * @param cluster the cluster for the command + * @param stackId the effective stack id to use. * * @return a wrapper of the imporant JSON structures to add to a stage */ public ExecuteCommandJson getCommandJson(ActionExecutionContext actionExecContext, - Cluster cluster) throws AmbariException { + Cluster cluster, StackId stackId) throws AmbariException { Map<String, String> commandParamsStage = StageUtils.getCommandParamsStage(actionExecContext); Map<String, String> hostParamsStage = new HashMap<String, String>(); @@ -1050,8 +1051,8 @@ public class AmbariCustomCommandExecutionHelper { if (null != cluster) { clusterHostInfo = StageUtils.getClusterHostInfo( cluster); - hostParamsStage = createDefaultHostParams(cluster); - StackId stackId = cluster.getDesiredStackVersion(); + // Important, because this runs during Stack Uprade, it needs to use the effective Stack Id. + hostParamsStage = createDefaultHostParams(cluster, stackId); String componentName = null; String serviceName = null; if (actionExecContext.getOperationLevel() != null) { @@ -1095,6 +1096,10 @@ public class AmbariCustomCommandExecutionHelper { Map<String, String> createDefaultHostParams(Cluster cluster) { StackId stackId = cluster.getDesiredStackVersion(); + return createDefaultHostParams(cluster, stackId); + } + + Map<String, String> createDefaultHostParams(Cluster cluster, StackId stackId) { TreeMap<String, String> hostLevelParams = new TreeMap<String, String>(); hostLevelParams.put(JDK_LOCATION, managementController.getJdkResourceUrl()); hostLevelParams.put(JAVA_HOME, managementController.getJavaHome()); http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java index de0ae28..87e05c6 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java @@ -3348,7 +3348,11 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle actionManager, actionRequest); - ExecuteCommandJson jsons = customCommandExecutionHelper.getCommandJson(actionExecContext, cluster); + StackId stackId = null; + if (null != cluster) { + stackId = cluster.getDesiredStackVersion(); + } + ExecuteCommandJson jsons = customCommandExecutionHelper.getCommandJson(actionExecContext, cluster, stackId); String commandParamsForStage = jsons.getCommandParamsForStage(); // Ensure that the specified requestContext (if any) is set as the request context http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java index f8c5316..b8dda3a 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java @@ -23,6 +23,7 @@ import java.util.Map; import org.apache.ambari.server.checks.CheckDescription; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.stack.PrereqCheckStatus; +import org.apache.ambari.server.state.stack.upgrade.UpgradeType; /** * Represents a prerequisite check request. @@ -33,17 +34,34 @@ public class PrereqCheckRequest { private StackId m_sourceStackId; private StackId m_targetStackId; + private UpgradeType m_upgradeType; + private Map<CheckDescription, PrereqCheckStatus> m_results = new HashMap<CheckDescription, PrereqCheckStatus>(); - public PrereqCheckRequest(String clusterName) { + + public PrereqCheckRequest(String clusterName, UpgradeType upgradeType) { m_clusterName = clusterName; + m_upgradeType = upgradeType; + } + + /** + * Construct a request to performs checks before an Upgrade. + * The default type is Rolling. + * @param clusterName + */ + public PrereqCheckRequest(String clusterName) { + this(clusterName, UpgradeType.ROLLING); } public String getClusterName() { return m_clusterName; } + public UpgradeType getUpgradeType() { + return m_upgradeType; + } + public String getRepositoryVersion() { return m_repositoryVersion; } http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java index 4868ca7..abd9f4a 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 @@ -680,11 +680,9 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou throw new SystemException(detailedOutput); } } catch (AmbariException e) { - e.printStackTrace(); - throw new SystemException("Can not perform request. " + e.getMessage(), e); + throw new SystemException("Cannot perform request", e); } catch (InterruptedException e) { - e.printStackTrace(); - throw new SystemException("Can not perform request. " + e.getMessage(), e); + throw new SystemException("Cannot perform request", e); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java index 6344aa2..2a1092b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java @@ -61,7 +61,6 @@ public class CompatibleRepositoryVersionResourceProvider extends ReadOnlyResourc public static final String REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID = "CompatibleRepositoryVersions/stack_version"; public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID = "CompatibleRepositoryVersions/repository_version"; public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID = "CompatibleRepositoryVersions/display_name"; - public static final String REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID = "CompatibleRepositoryVersions/upgrade_pack"; public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID = new OperatingSystemResourceDefinition().getPluralName(); public static final String SUBRESOURCE_REPOSITORIES_PROPERTY_ID = new RepositoryResourceDefinition().getPluralName(); @@ -73,7 +72,6 @@ public class CompatibleRepositoryVersionResourceProvider extends ReadOnlyResourc REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, - REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID, SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID); static Map<Type, String> keyPropertyIds = new HashMap<Type, String>() { @@ -151,7 +149,6 @@ public class CompatibleRepositoryVersionResourceProvider extends ReadOnlyResourc setResourceProperty(resource, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, entity.getStackName(), requestedIds); setResourceProperty(resource, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, entity.getStackVersion(), requestedIds); setResourceProperty(resource, REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, entity.getDisplayName(), requestedIds); - setResourceProperty(resource, REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID, entity.getUpgradePackage(), requestedIds); setResourceProperty(resource, REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID, entity.getVersion(), requestedIds); resources.add(resource); http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/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 ce58e1e..9c429bf 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 @@ -20,30 +20,39 @@ package org.apache.ambari.server.controller.internal; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.StaticallyInject; +import org.apache.ambari.server.checks.AbstractCheckDescriptor; import org.apache.ambari.server.checks.UpgradeCheckRegistry; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.controller.PrereqCheckRequest; +import org.apache.ambari.server.controller.spi.NoSuchParentResourceException; import org.apache.ambari.server.controller.spi.NoSuchResourceException; import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.Request; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.Resource.Type; +import org.apache.ambari.server.controller.spi.SystemException; +import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; 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; /** * Resource provider for pre-upgrade checks. @@ -61,6 +70,7 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { public static final String UPGRADE_CHECK_FAILED_DETAIL_PROPERTY_ID = PropertyHelper.getPropertyId("UpgradeChecks", "failed_detail"); public static final String UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID = PropertyHelper.getPropertyId("UpgradeChecks", "check_type"); public static final String UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("UpgradeChecks", "cluster_name"); + public static final String UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID = PropertyHelper.getPropertyId("UpgradeChecks", "upgrade_type"); public static final String UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("UpgradeChecks", "repository_version"); @Inject @@ -72,6 +82,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( @@ -83,6 +96,7 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { UPGRADE_CHECK_FAILED_DETAIL_PROPERTY_ID, UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID, UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID, + UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID, UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID); @@ -106,8 +120,8 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { super(propertyIds, keyPropertyIds, managementController); } - @Override - public Set<Resource> getResources(Request request, Predicate predicate) throws NoSuchResourceException { + public Set<Resource> getResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, + NoSuchResourceException, NoSuchParentResourceException { final Set<Resource> resources = new HashSet<Resource>(); final Set<String> requestedIds = getRequestPropertyIds(request, predicate); @@ -115,6 +129,8 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { for (Map<String, Object> propertyMap: propertyMaps) { final String clusterName = propertyMap.get(UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID).toString(); + final UpgradeType upgradeType = (!propertyMap.containsKey(UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID)) ? UpgradeType.ROLLING + : (UpgradeType)propertyMap.get(UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID); final Cluster cluster; try { @@ -124,20 +140,40 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { } String stackName = cluster.getCurrentStackVersion().getStackName(); + String sourceStackVersion = cluster.getCurrentStackVersion().getStackVersion(); - final PrereqCheckRequest upgradeCheckRequest = new PrereqCheckRequest(clusterName); + final PrereqCheckRequest upgradeCheckRequest = new PrereqCheckRequest(clusterName, upgradeType); upgradeCheckRequest.setSourceStackId(cluster.getCurrentStackVersion()); 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()); } - for (PrerequisiteCheck prerequisiteCheck : checkHelper.performChecks(upgradeCheckRequest, upgradeCheckRegistry.getUpgradeChecks())) { + //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. + 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); setResourceProperty(resource, UPGRADE_CHECK_ID_PROPERTY_ID, prerequisiteCheck.getId(), requestedIds); setResourceProperty(resource, UPGRADE_CHECK_CHECK_PROPERTY_ID, prerequisiteCheck.getDescription(), requestedIds); @@ -147,6 +183,7 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider { setResourceProperty(resource, UPGRADE_CHECK_FAILED_DETAIL_PROPERTY_ID,prerequisiteCheck.getFailedDetail(), requestedIds); setResourceProperty(resource, UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID, prerequisiteCheck.getType(), requestedIds); setResourceProperty(resource, UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID, prerequisiteCheck.getClusterName(), requestedIds); + setResourceProperty(resource, UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID, upgradeType, requestedIds); if (upgradeCheckRequest.getRepositoryVersion() != null) { setResourceProperty(resource, UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID, upgradeCheckRequest.getRepositoryVersion(), requestedIds); } http://git-wip-us.apache.org/repos/asf/ambari/blob/c58162fe/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java index 06291dd..062b0cb 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java @@ -19,12 +19,14 @@ package org.apache.ambari.server.controller.internal; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import com.google.inject.Provider; import com.google.inject.persist.Transactional; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.ObjectNotFoundException; @@ -50,10 +52,13 @@ import org.apache.ambari.server.orm.entities.OperatingSystemEntity; import org.apache.ambari.server.orm.entities.RepositoryEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.StackEntity; +import org.apache.ambari.server.state.Cluster; +import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.OperatingSystemInfo; import org.apache.ambari.server.state.RepositoryVersionState; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.StackInfo; +import org.apache.ambari.server.state.stack.UpgradePack; import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; @@ -74,7 +79,6 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider public static final String REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("RepositoryVersions", "stack_version"); public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("RepositoryVersions", "repository_version"); public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("RepositoryVersions", "display_name"); - public static final String REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID = PropertyHelper.getPropertyId("RepositoryVersions", "upgrade_pack"); public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID = new OperatingSystemResourceDefinition().getPluralName(); public static final String SUBRESOURCE_REPOSITORIES_PROPERTY_ID = new RepositoryResourceDefinition().getPluralName(); @@ -93,7 +97,6 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider add(REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID); add(REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID); add(REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID); - add(REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID); add(SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID); } }; @@ -122,6 +125,9 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider @Inject private RepositoryVersionHelper repositoryVersionHelper; + @Inject + private Provider<Clusters> clusters; + /** * Data access object used for lookup up stacks. */ @@ -149,13 +155,13 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider @Override public Void invoke() throws AmbariException { final String[] requiredProperties = { - REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, - SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID, - REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, - REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, - REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID + REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, + SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID, + REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, + REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, + REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID }; - for (String propertyName: requiredProperties) { + for (String propertyName : requiredProperties) { if (properties.get(propertyName) == null) { throw new AmbariException("Property " + propertyName + " should be provided"); } @@ -215,7 +221,6 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider setResourceProperty(resource, REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, entity.getStackName(), requestedIds); setResourceProperty(resource, REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, entity.getStackVersion(), requestedIds); setResourceProperty(resource, REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, entity.getDisplayName(), requestedIds); - setResourceProperty(resource, REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID, entity.getUpgradePackage(), requestedIds); setResourceProperty(resource, REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID, entity.getVersion(), requestedIds); resources.add(resource); @@ -245,22 +250,18 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider throw new ObjectNotFoundException("There is no repository version with id " + id); } - if (StringUtils.isNotBlank(ObjectUtils.toString(propertyMap.get(REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID)))) { - StackEntity stackEntity = entity.getStack(); - String stackName = stackEntity.getStackName(); - String stackVersion = stackEntity.getStackVersion(); + // Prevent changing repo version if there's already a cluster version that has performed some meaningful action on it. + StackEntity stackEntity = entity.getStack(); + String stackName = stackEntity.getStackName(); + String stackVersion = stackEntity.getStackVersion(); - final List<ClusterVersionEntity> clusterVersionEntities = clusterVersionDAO.findByStackAndVersion( - stackName, stackVersion, entity.getVersion()); + final List<ClusterVersionEntity> clusterVersionEntities = clusterVersionDAO.findByStackAndVersion( + stackName, stackVersion, entity.getVersion()); - if (!clusterVersionEntities.isEmpty()) { - final ClusterVersionEntity firstClusterVersion = clusterVersionEntities.get(0); - throw new AmbariException("Upgrade pack can't be changed for repository version which is " + - firstClusterVersion.getState().name() + " on cluster " + firstClusterVersion.getClusterEntity().getClusterName()); - } - - final String upgradePackage = propertyMap.get(REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID).toString(); - entity.setUpgradePackage(upgradePackage); + if (!clusterVersionEntities.isEmpty()) { + final ClusterVersionEntity firstClusterVersion = clusterVersionEntities.get(0); + throw new AmbariException("Upgrade pack can't be changed for repository version which has a state of " + + firstClusterVersion.getState().name() + " on cluster " + firstClusterVersion.getClusterEntity().getClusterName()); } List<OperatingSystemEntity> operatingSystemEntities = null; @@ -287,12 +288,12 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider // Update metaInfo table as well // if (operatingSystemEntities != null) { - String stackName = entity.getStackName(); - String stackVersion = entity.getStackVersion(); + String entityStackName = entity.getStackName(); + String entityStackVersion = entity.getStackVersion(); for (OperatingSystemEntity osEntity : operatingSystemEntities) { List<RepositoryEntity> repositories = osEntity.getRepositories(); for (RepositoryEntity repository : repositories) { - ambariMetaInfo.updateRepoBaseURL(stackName, stackVersion, osEntity.getOsType(), repository.getRepositoryId(), repository.getBaseUrl()); + ambariMetaInfo.updateRepoBaseURL(entityStackName, entityStackVersion, osEntity.getOsType(), repository.getRepositoryId(), repository.getBaseUrl()); } } } @@ -366,14 +367,13 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider */ protected void validateRepositoryVersion(RepositoryVersionEntity repositoryVersion) throws AmbariException { final StackId requiredStack = new StackId(repositoryVersion.getStack()); - final String stackName = requiredStack.getStackName(); - final String stackMajorVersion = requiredStack.getStackVersion(); - final String stackFullName = requiredStack.getStackId(); - - // check that stack exists - final StackInfo stackInfo = ambariMetaInfo.getStack(stackName, stackMajorVersion); - if (stackInfo.getUpgradePacks() == null) { - throw new AmbariException("Stack " + stackFullName + " doesn't have upgrade packages"); + + final String requiredStackName = requiredStack.getStackName(); + final String requiredStackVersion = requiredStack.getStackVersion(); + final String requiredStackId = requiredStack.getStackId(); + + if (!upgradePackExists(repositoryVersion.getVersion())) { + throw new AmbariException("Stack " + requiredStackId + " doesn't have upgrade packages"); } // List of all repo urls that are already added at stack @@ -392,7 +392,7 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider // check that repositories contain only supported operating systems final Set<String> osSupported = new HashSet<String>(); - for (OperatingSystemInfo osInfo: ambariMetaInfo.getOperatingSystems(stackName, stackMajorVersion)) { + for (OperatingSystemInfo osInfo: ambariMetaInfo.getOperatingSystems(requiredStackName, requiredStackVersion)) { osSupported.add(osInfo.getOsType()); } final Set<String> osRepositoryVersion = new HashSet<String>(); @@ -412,7 +412,7 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider } for (String os: osRepositoryVersion) { if (!osSupported.contains(os)) { - throw new AmbariException("Operating system type " + os + " is not supported by stack " + stackFullName); + throw new AmbariException("Operating system type " + os + " is not supported by stack " + requiredStackId); } } @@ -423,6 +423,35 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider } /** + * Check for required upgrade pack across all stack definitions + * @param checkVersion version to check (e.g. 2.2.3.0-1111) + * @return existence flag + */ + private boolean upgradePackExists(String checkVersion) throws AmbariException{ + Collection<StackInfo> stacks = new ArrayList<StackInfo>(); + + // Search results only in the installed stacks + for (Cluster cluster:clusters.get().getClusters().values()){ + stacks.add(ambariMetaInfo.getStack(cluster.getCurrentStackVersion().getStackName(), + cluster.getCurrentStackVersion().getStackVersion())); + } + + for (StackInfo si: stacks){ + Map<String, UpgradePack> upgradePacks = si.getUpgradePacks(); + if (upgradePacks!=null) { + for (UpgradePack upgradePack: upgradePacks.values()){ + if (upgradePack.canBeApplied(checkVersion)) { + // If we found at least one match, the rest could be skipped + return true; + } + } + } + } + return false; + } + + + /** * Transforms map of json properties to repository version entity. * * @param properties json map @@ -448,7 +477,6 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider throw new AmbariException("Json structure for operating systems is incorrect", ex); } entity.setOperatingSystems(operatingSystemsJson); - entity.setUpgradePackage(repositoryVersionHelper.getUpgradePackageName(stackName, stackVersion, entity.getVersion())); return entity; }