AMBARI-20957. Remove cluster_version use (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/aaa821cc Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/aaa821cc Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/aaa821cc Branch: refs/heads/branch-feature-AMBARI-12556 Commit: aaa821cc2455a29b1e83caf5eab98272053d5aa5 Parents: 15c04ed Author: Nate Cole <nc...@hortonworks.com> Authored: Mon May 8 15:29:14 2017 -0400 Committer: Nate Cole <nc...@hortonworks.com> Committed: Tue May 9 10:31:50 2017 -0400 ---------------------------------------------------------------------- .../apache/ambari/annotations/Experimental.java | 5 + .../ambari/server/StateRecoveryManager.java | 30 +- .../ambari/server/agent/ExecutionCommand.java | 5 + .../server/checks/AbstractCheckDescriptor.java | 4 - .../HardcodedStackVersionPropertiesCheck.java | 55 +- .../server/checks/InstallPackagesCheck.java | 16 +- .../YarnTimelineServerStatePreservingCheck.java | 6 +- .../controller/AmbariActionExecutionHelper.java | 54 +- .../AmbariCustomCommandExecutionHelper.java | 88 +-- .../AmbariManagementControllerImpl.java | 68 +- .../server/controller/KerberosHelperImpl.java | 4 +- .../ClusterStackVersionResourceProvider.java | 215 +++--- .../internal/HostResourceProvider.java | 19 +- .../HostStackVersionResourceProvider.java | 1 - .../RepositoryVersionResourceProvider.java | 54 +- .../internal/ServiceResourceProvider.java | 19 +- .../internal/UpgradeResourceProvider.java | 10 +- .../DistributeRepositoriesActionListener.java | 9 - .../upgrade/HostVersionOutOfSyncListener.java | 91 +-- .../listeners/upgrade/StackVersionListener.java | 9 +- .../server/orm/dao/ClusterVersionDAO.java | 233 ------- .../ambari/server/orm/dao/HostVersionDAO.java | 22 + .../server/orm/entities/ClusterEntity.java | 17 - .../orm/entities/ClusterVersionEntity.java | 217 ------ .../server/orm/entities/HostVersionEntity.java | 5 +- .../orm/entities/RepositoryVersionEntity.java | 11 - .../ServiceComponentDesiredStateEntity.java | 2 +- .../upgrades/FinalizeUpgradeAction.java | 3 - .../apache/ambari/server/stack/RepoUtil.java | 6 +- .../stack/UpdateActiveRepoVersionOnStartup.java | 49 +- .../org/apache/ambari/server/state/Cluster.java | 82 +-- .../server/state/cluster/ClusterImpl.java | 658 +------------------ .../server/state/cluster/ClustersImpl.java | 13 - .../services/RetryUpgradeActionService.java | 7 - .../server/upgrade/UpgradeCatalog220.java | 5 +- .../main/resources/Ambari-DDL-Derby-CREATE.sql | 13 - .../main/resources/Ambari-DDL-MySQL-CREATE.sql | 12 - .../main/resources/Ambari-DDL-Oracle-CREATE.sql | 12 - .../resources/Ambari-DDL-Postgres-CREATE.sql | 13 - .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql | 13 - .../resources/Ambari-DDL-SQLServer-CREATE.sql | 13 - .../src/main/resources/META-INF/persistence.xml | 2 - .../ambari/server/StateRecoveryManagerTest.java | 66 +- .../server/agent/HeartbeatProcessorTest.java | 31 +- .../server/agent/HeartbeatTestHelper.java | 4 - .../server/agent/TestHeartbeatHandler.java | 31 +- .../server/agent/TestHeartbeatMonitor.java | 14 +- .../server/checks/InstallPackagesCheckTest.java | 26 +- ...duce2JobHistoryStatePreservingCheckTest.java | 7 - ...nTimelineServerStatePreservingCheckTest.java | 11 - .../configuration/RecoveryConfigHelperTest.java | 23 +- .../AmbariManagementControllerImplTest.java | 40 +- .../AmbariManagementControllerTest.java | 37 -- ...ClusterStackVersionResourceProviderTest.java | 136 ++-- ...leRepositoryVersionResourceProviderTest.java | 3 - .../internal/HostResourceProviderTest.java | 7 - .../RepositoryVersionResourceProviderTest.java | 74 +-- .../internal/ServiceResourceProviderTest.java | 43 +- .../StackDefinedPropertyProviderTest.java | 3 - .../UpgradeResourceProviderHDP22Test.java | 318 --------- .../internal/UpgradeResourceProviderTest.java | 8 +- .../UpgradeSummaryResourceProviderTest.java | 2 - .../apache/ambari/server/events/EventsTest.java | 3 - .../HostVersionOutOfSyncListenerTest.java | 95 ++- .../upgrade/StackVersionListenerTest.java | 6 - .../apache/ambari/server/orm/OrmTestHelper.java | 47 +- .../server/orm/dao/ClusterVersionDAOTest.java | 264 -------- .../server/orm/dao/HostVersionDAOTest.java | 34 +- .../orm/dao/RepositoryVersionDAOTest.java | 35 - .../ComponentVersionCheckActionTest.java | 60 +- .../upgrades/ConfigureActionTest.java | 6 - .../upgrades/UpgradeActionTest.java | 45 +- .../UpdateActiveRepoVersionOnStartupTest.java | 60 +- .../ambari/server/state/CheckHelperTest.java | 2 - .../server/state/ServiceComponentTest.java | 3 - .../ambari/server/state/UpgradeHelperTest.java | 21 +- .../state/cluster/ClusterDeadlockTest.java | 3 - .../cluster/ClusterEffectiveVersionTest.java | 305 --------- .../server/state/cluster/ClusterTest.java | 514 ++------------- .../state/cluster/ClustersDeadlockTest.java | 3 - .../server/state/cluster/ClustersTest.java | 26 +- .../ConcurrentServiceConfigVersionTest.java | 3 - ...omponentHostConcurrentWriteDeadlockTest.java | 2 - .../ambari/server/state/host/HostTest.java | 6 +- .../services/RetryUpgradeActionServiceTest.java | 4 - .../svccomphost/ServiceComponentHostTest.java | 26 +- .../server/upgrade/UpgradeCatalog220Test.java | 106 +-- .../server/upgrade/UpgradeCatalog242Test.java | 22 +- 88 files changed, 704 insertions(+), 4051 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java b/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java index f51991c..18e5db7 100644 --- a/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java +++ b/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java @@ -39,4 +39,9 @@ public @interface Experimental { * @return */ ExperimentalFeature feature(); + + /** + * Any notes to why the annotation is used or any other action that may be useful. + */ + String comment() default ""; } http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java b/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java index 26e5be8..5a13fb3 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java @@ -20,10 +20,10 @@ package org.apache.ambari.server; import java.util.List; -import org.apache.ambari.server.orm.dao.ClusterVersionDAO; import org.apache.ambari.server.orm.dao.HostVersionDAO; -import org.apache.ambari.server.orm.entities.ClusterVersionEntity; +import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO; import org.apache.ambari.server.orm.entities.HostVersionEntity; +import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity; import org.apache.ambari.server.state.RepositoryVersionState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,14 +42,12 @@ public class StateRecoveryManager { private HostVersionDAO hostVersionDAO; @Inject - private ClusterVersionDAO clusterVersionDAO; - + private ServiceComponentDesiredStateDAO serviceComponentDAO; public void doWork() { checkHostAndClusterVersions(); } - void checkHostAndClusterVersions() { List<HostVersionEntity> hostVersions = hostVersionDAO.findAll(); for (HostVersionEntity hostVersion : hostVersions) { @@ -66,18 +64,20 @@ public class StateRecoveryManager { } } - List<ClusterVersionEntity> clusterVersions = clusterVersionDAO.findAll(); - for (ClusterVersionEntity clusterVersion : clusterVersions) { - if (clusterVersion.getState().equals(RepositoryVersionState.INSTALLING)) { - clusterVersion.setState(RepositoryVersionState.INSTALL_FAILED); + List<ServiceComponentDesiredStateEntity> components = serviceComponentDAO.findAll(); + for (ServiceComponentDesiredStateEntity component : components) { + if (RepositoryVersionState.INSTALLING == component.getRepositoryState()) { + component.setRepositoryState(RepositoryVersionState.INSTALL_FAILED); + serviceComponentDAO.merge(component); String msg = String.format( - "Recovered state of cluster version %s for cluster %s from %s to %s", - clusterVersion.getRepositoryVersion().getDisplayName(), - clusterVersion.getClusterEntity().getClusterName(), - RepositoryVersionState.INSTALLING, - RepositoryVersionState.INSTALL_FAILED); + "Recovered state of cluster %s of component %s/%s for version %s from %s to %s", + component.getClusterId(), + component.getServiceName(), + component.getComponentName(), + component.getDesiredRepositoryVersion().getDisplayName(), + RepositoryVersionState.INSTALLING, + RepositoryVersionState.INSTALL_FAILED); LOG.warn(msg); - clusterVersionDAO.merge(clusterVersion); } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java index 63eb660..4ab50ea 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java @@ -502,5 +502,10 @@ public class ExecutionCommand extends AgentCommand { @Deprecated @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) String REPO_VERSION_ID = "repository_version_id"; + + /** + * Put on hostLevelParams to indicate the version that the component should be. + */ + String CURRENT_VERSION = "current_version"; } } http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 707c756..2fc1787 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 @@ -28,7 +28,6 @@ import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.PrereqCheckRequest; -import org.apache.ambari.server.orm.dao.ClusterVersionDAO; import org.apache.ambari.server.orm.dao.HostVersionDAO; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; import org.apache.ambari.server.orm.dao.UpgradeDAO; @@ -65,9 +64,6 @@ public abstract class AbstractCheckDescriptor { Provider<Clusters> clustersProvider; @Inject - Provider<ClusterVersionDAO> clusterVersionDAOProvider; - - @Inject Provider<HostVersionDAO> hostVersionDaoProvider; @Inject http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java index 314d1a7..bec7c9f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java @@ -27,18 +27,14 @@ import java.util.regex.Pattern; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.controller.PrereqCheckRequest; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; -import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Config; -import org.apache.ambari.server.state.ConfigHelper; import org.apache.ambari.server.state.DesiredConfig; import org.apache.ambari.server.state.stack.PrereqCheckStatus; import org.apache.ambari.server.state.stack.PrerequisiteCheck; import org.apache.ambari.server.state.stack.upgrade.UpgradeType; +import org.apache.commons.lang.StringUtils; -import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; /** @@ -53,12 +49,6 @@ import com.google.inject.Singleton; required = { UpgradeType.ROLLING, UpgradeType.NON_ROLLING, UpgradeType.HOST_ORDERED }) public class HardcodedStackVersionPropertiesCheck extends AbstractCheckDescriptor { - @Inject - private Provider<Clusters> m_clusters; - - @Inject - private Provider<ConfigHelper> m_config_helper_provider; - public HardcodedStackVersionPropertiesCheck() { super(CheckDescription.HARDCODED_STACK_VERSION_PROPERTIES_CHECK); } @@ -67,18 +57,13 @@ public class HardcodedStackVersionPropertiesCheck extends AbstractCheckDescripto public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException { - String stackName = request.getTargetStackId().getStackName(); - RepositoryVersionEntity rve = repositoryVersionDaoProvider.get(). - findByStackNameAndVersion(stackName, request.getRepositoryVersion()); - - Cluster cluster = m_clusters.get().getCluster(request.getClusterName()); + Cluster cluster = clustersProvider.get().getCluster(request.getClusterName()); - String currentHdpVersion = cluster.getCurrentClusterVersion().getRepositoryVersion().getVersion(); - - Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs(); + Set<String> versions = new HashSet<>(); Set<String> failures = new HashSet<>(); + Set<String> failedVersions = new HashSet<>(); - Pattern searchPattern = getHardcodeSearchPattern(currentHdpVersion); + Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs(); for (Entry<String, DesiredConfig> configEntry : desiredConfigs.entrySet()) { String configType = configEntry.getKey(); DesiredConfig desiredConfig = configEntry.getValue(); @@ -86,23 +71,31 @@ public class HardcodedStackVersionPropertiesCheck extends AbstractCheckDescripto Map<String, String> properties = config.getProperties(); for (Entry<String, String> property : properties.entrySet()) { - if (stringContainsVersionHardcode(property.getValue(), searchPattern)) { - failures.add(String.format(" %s/%s", - configType, property.getKey())); + + // !!! this code is already iterating every config property, so an extra loop for the small-ish + // numbers of repository versions won't add that much more overhead + for (String version : versions) { + Pattern searchPattern = getHardcodeSearchPattern(version); + if (stringContainsVersionHardcode(property.getValue(), searchPattern)) { + failedVersions.add(version); + failures.add(String.format("%s/%s found a hardcoded value %s", + configType, property.getKey(), version)); + } } } + } - if (failures.size() > 0) { - prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING); - String failReason = getFailReason(prerequisiteCheck, request); + if (failures.size() > 0) { + prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING); + String failReason = getFailReason(prerequisiteCheck, request); - prerequisiteCheck.setFailReason(String.format(failReason, currentHdpVersion)); - prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failures)); + prerequisiteCheck.setFailReason(String.format(failReason, StringUtils.join(failedVersions, ','))); + prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failures)); - } else { - prerequisiteCheck.setStatus(PrereqCheckStatus.PASS); - } + } else { + prerequisiteCheck.setStatus(PrereqCheckStatus.PASS); } + } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java index 2c20762..ac2116f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java @@ -24,7 +24,6 @@ import java.util.Set; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.controller.PrereqCheckRequest; -import org.apache.ambari.server.orm.entities.ClusterVersionEntity; import org.apache.ambari.server.orm.entities.HostVersionEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; @@ -75,8 +74,6 @@ public class InstallPackagesCheck extends AbstractCheckDescriptor { return; } - final ClusterVersionEntity clusterVersion = clusterVersionDAOProvider.get().findByClusterAndStackAndVersion( - clusterName, targetStackId, repoVersion); final Set<String> failedHosts = new HashSet<>(); for (Host host : cluster.getHosts()) { @@ -98,16 +95,9 @@ public class InstallPackagesCheck extends AbstractCheckDescriptor { prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failedHosts)); prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL); prerequisiteCheck.setFailReason(message); - } else if (clusterVersion.getState() == RepositoryVersionState.INSTALL_FAILED) { - String message = MessageFormat.format("Cluster [{0},{1},{2},{3}] is in INSTALL_FAILED state because " + - "Install Packages failed. Please re-run Install Packages even if you placed the failed hosts " + - "in Maintenance mode.", cluster.getClusterName(), targetStackId.getStackName(), - targetStackId.getStackVersion(), repoVersion); - LinkedHashSet<String> failedOn = new LinkedHashSet<>(); - failedOn.add(cluster.getClusterName()); - prerequisiteCheck.setFailedOn(failedOn); - prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL); - prerequisiteCheck.setFailReason(message); + return; } + + prerequisiteCheck.setStatus(PrereqCheckStatus.PASS); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 2200a45..d8dba96 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 @@ -23,6 +23,7 @@ import java.util.Map; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.controller.PrereqCheckRequest; import org.apache.ambari.server.state.Cluster; +import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.stack.PrereqCheckStatus; import org.apache.ambari.server.state.stack.PrerequisiteCheck; import org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig; @@ -83,8 +84,9 @@ public class YarnTimelineServerStatePreservingCheck extends AbstractCheckDescrip String minStackVersion = minStack[1]; String stackName = cluster.getCurrentStackVersion().getStackName(); if (minStackName.equals(stackName)) { - String currentClusterRepositoryVersion = cluster.getCurrentClusterVersion().getRepositoryVersion().getVersion(); - return VersionUtils.compareVersions(currentClusterRepositoryVersion, minStackVersion) >= 0; + Service yarnService = cluster.getService("YARN"); + String currentRepositoryVersion = yarnService.getDesiredRepositoryVersion().getVersion(); + return VersionUtils.compareVersions(currentRepositoryVersion, minStackVersion) >= 0; } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java index 835d607..9fb77e8 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java @@ -47,13 +47,13 @@ import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.customactions.ActionDefinition; -import org.apache.ambari.server.orm.dao.ClusterVersionDAO; -import org.apache.ambari.server.orm.entities.ClusterVersionEntity; 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.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ComponentInfo; +import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponentHost; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackId; @@ -91,8 +91,6 @@ public class AmbariActionExecutionHelper { private MaintenanceStateHelper maintenanceStateHelper; @Inject private Configuration configs; - @Inject - private ClusterVersionDAO clusterVersionDAO; /** * Validates the request to execute an action. @@ -457,7 +455,12 @@ public class AmbariActionExecutionHelper { for (Map.Entry<String, String> previousDBConnectorName : configs.getPreviousDatabaseConnectorNames().entrySet()) { hostLevelParams.put(previousDBConnectorName.getKey(), previousDBConnectorName.getValue()); } - addRepoInfoToHostLevelParams(cluster, hostLevelParams, hostName); + + if (StringUtils.isNotBlank(serviceName)) { + Service service = cluster.getService(serviceName); + addRepoInfoToHostLevelParams(service.getDesiredRepositoryVersion(), hostLevelParams, hostName); + } + Map<String, String> roleParams = execCmd.getRoleParams(); if (roleParams == null) { @@ -519,38 +522,35 @@ public class AmbariActionExecutionHelper { * * */ - private void addRepoInfoToHostLevelParams(Cluster cluster, Map<String, String> hostLevelParams, String hostName) throws AmbariException { - if (null == cluster) { + private void addRepoInfoToHostLevelParams(RepositoryVersionEntity repositoryVersion, + Map<String, String> hostLevelParams, String hostName) throws AmbariException { + if (null == repositoryVersion) { return; } JsonObject rootJsonObject = new JsonObject(); JsonArray repositories = new JsonArray(); - ClusterVersionEntity clusterVersionEntity = clusterVersionDAO.findByClusterAndStateCurrent( - cluster.getClusterName()); - if (clusterVersionEntity != null && clusterVersionEntity.getRepositoryVersion() != null) { - String hostOsFamily = clusters.getHost(hostName).getOsFamily(); - for (OperatingSystemEntity operatingSystemEntity : clusterVersionEntity.getRepositoryVersion().getOperatingSystems()) { - // ostype in OperatingSystemEntity it's os family. That should be fixed - // in OperatingSystemEntity. - if (operatingSystemEntity.getOsType().equals(hostOsFamily)) { - for (RepositoryEntity repositoryEntity : operatingSystemEntity.getRepositories()) { - JsonObject repositoryInfo = new JsonObject(); - repositoryInfo.addProperty("base_url", repositoryEntity.getBaseUrl()); - repositoryInfo.addProperty("repo_name", repositoryEntity.getName()); - repositoryInfo.addProperty("repo_id", repositoryEntity.getRepositoryId()); - - repositories.add(repositoryInfo); - } - rootJsonObject.add("repositories", repositories); + + String hostOsFamily = clusters.getHost(hostName).getOsFamily(); + for (OperatingSystemEntity operatingSystemEntity : repositoryVersion.getOperatingSystems()) { + // ostype in OperatingSystemEntity it's os family. That should be fixed + // in OperatingSystemEntity. + if (operatingSystemEntity.getOsType().equals(hostOsFamily)) { + for (RepositoryEntity repositoryEntity : operatingSystemEntity.getRepositories()) { + JsonObject repositoryInfo = new JsonObject(); + repositoryInfo.addProperty("base_url", repositoryEntity.getBaseUrl()); + repositoryInfo.addProperty("repo_name", repositoryEntity.getName()); + repositoryInfo.addProperty("repo_id", repositoryEntity.getRepositoryId()); + + repositories.add(repositoryInfo); } + rootJsonObject.add("repositories", repositories); } } hostLevelParams.put(REPO_INFO, rootJsonObject.toString()); - StackId stackId = cluster.getCurrentStackVersion(); - hostLevelParams.put(STACK_NAME, stackId.getStackName()); - hostLevelParams.put(STACK_VERSION, stackId.getStackVersion()); + hostLevelParams.put(STACK_NAME, repositoryVersion.getStackName()); + hostLevelParams.put(STACK_VERSION, repositoryVersion.getStackVersion()); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 1d43093..617d7c0 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 @@ -76,10 +76,7 @@ import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.metadata.ActionMetadata; -import org.apache.ambari.server.orm.dao.ClusterVersionDAO; import org.apache.ambari.server.orm.dao.HostRoleCommandDAO; -import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO; -import org.apache.ambari.server.orm.entities.ClusterVersionEntity; import org.apache.ambari.server.orm.entities.OperatingSystemEntity; import org.apache.ambari.server.orm.entities.RepositoryEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; @@ -96,7 +93,6 @@ import org.apache.ambari.server.state.HostState; import org.apache.ambari.server.state.MaintenanceState; import org.apache.ambari.server.state.PropertyInfo.PropertyType; import org.apache.ambari.server.state.RepositoryInfo; -import org.apache.ambari.server.state.RepositoryVersionState; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentHost; @@ -178,15 +174,8 @@ public class AmbariCustomCommandExecutionHelper { private OsFamily os_family; @Inject - private ClusterVersionDAO clusterVersionDAO; - - @Inject private HostRoleCommandDAO hostRoleCommandDAO; - @Inject - private ServiceComponentDesiredStateDAO serviceComponentDAO; - - private Map<String, Map<String, Map<String, String>>> configCredentialsForService = new HashMap<>(); protected static final String SERVICE_CHECK_COMMAND_NAME = "SERVICE_CHECK"; @@ -338,8 +327,6 @@ public class AmbariCustomCommandExecutionHelper { StackInfo stackInfo = ambariMetaInfo.getStack (stackId.getStackName(), stackId.getStackVersion()); - ClusterVersionEntity effectiveClusterVersion = cluster.getEffectiveClusterVersion(); - CustomCommandDefinition customCommandDefinition = null; ComponentInfo ci = serviceInfo.getComponentByName(componentName); if(ci != null){ @@ -493,8 +480,17 @@ public class AmbariCustomCommandExecutionHelper { commandParams.put(SERVICE_PACKAGE_FOLDER, serviceInfo.getServicePackageFolder()); commandParams.put(HOOKS_FOLDER, stackInfo.getStackHooksFolder()); - if (effectiveClusterVersion != null) { - commandParams.put(KeyNames.VERSION, effectiveClusterVersion.getRepositoryVersion().getVersion()); + RepositoryVersionEntity repoVersion = null; + if (null != component) { + repoVersion = component.getDesiredRepositoryVersion(); + } + + if (null == repoVersion && null != clusterService) { + repoVersion = clusterService.getDesiredRepositoryVersion(); + } + + if (repoVersion != null) { + commandParams.put(KeyNames.VERSION, repoVersion.getVersion()); } Map<String, String> roleParams = execCmd.getRoleParams(); @@ -1370,36 +1366,15 @@ public class AmbariCustomCommandExecutionHelper { // !!! try to find the component repo first if (null != component) { repositoryEntity = component.getDesiredRepositoryVersion(); - } - - if (null == component) { + } else { LOG.info("Service component not passed in, attempt to resolve the repository for cluster {}", cluster.getClusterName()); } - if (null == repositoryEntity) { - - ClusterVersionEntity cve = cluster.getCurrentClusterVersion(); - - if (null == cve) { - List<ClusterVersionEntity> list = clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), - RepositoryVersionState.INIT); + if (null == repositoryEntity && null != component) { + Service service = cluster.getService(component.getServiceName()); - if (!list.isEmpty()) { - if (list.size() > 1) { - throw new AmbariException(String.format("The cluster can only be initialized by one version: %s found", - list.size())); - } else { - cve = list.get(0); - } - } - } - - if (null != cve && null != cve.getRepositoryVersion()) { - repositoryEntity = cve.getRepositoryVersion(); - } else { - LOG.info("Cluster {} has no specific Repository Versions. Using stack-defined values", cluster.getClusterName()); - } + repositoryEntity = service.getDesiredRepositoryVersion(); } if (null == repositoryEntity) { @@ -1429,16 +1404,18 @@ public class AmbariCustomCommandExecutionHelper { String clusterHostInfoJson = "{}"; if (null != cluster) { - clusterHostInfo = StageUtils.getClusterHostInfo( - cluster); + clusterHostInfo = StageUtils.getClusterHostInfo(cluster); + // Important, because this runs during Stack Uprade, it needs to use the effective Stack Id. - hostParamsStage = createDefaultHostParams(cluster, stackId); + hostParamsStage = createDefaultHostParams(cluster, null); + String componentName = null; String serviceName = null; if (actionExecContext.getOperationLevel() != null) { componentName = actionExecContext.getOperationLevel().getHostComponentName(); serviceName = actionExecContext.getOperationLevel().getServiceName(); } + if (serviceName != null && componentName != null) { ComponentInfo componentInfo = ambariMetaInfo.getComponent( stackId.getStackName(), stackId.getStackVersion(), @@ -1473,12 +1450,16 @@ public class AmbariCustomCommandExecutionHelper { hostParamsStageJson); } - Map<String, String> createDefaultHostParams(Cluster cluster) throws AmbariException { + Map<String, String> createDefaultHostParams(Cluster cluster, RepositoryVersionEntity repositoryVersion) throws AmbariException { StackId stackId = cluster.getDesiredStackVersion(); - return createDefaultHostParams(cluster, stackId); - } + if (null == stackId && null != repositoryVersion) { + stackId = repositoryVersion.getStackId(); + } + + if (null == stackId) { + throw new AmbariException(String.format("Could not find desired stack id for cluster %s", cluster.getClusterName())); + } - Map<String, String> createDefaultHostParams(Cluster cluster, StackId stackId) throws AmbariException{ TreeMap<String, String> hostLevelParams = new TreeMap<>(); hostLevelParams.put(JDK_LOCATION, managementController.getJdkResourceUrl()); hostLevelParams.put(JAVA_HOME, managementController.getJavaHome()); @@ -1501,14 +1482,10 @@ public class AmbariCustomCommandExecutionHelper { String notManagedHdfsPathList = gson.toJson(notManagedHdfsPathSet); hostLevelParams.put(NOT_MANAGED_HDFS_PATH_LIST, notManagedHdfsPathList); - ClusterVersionEntity clusterVersionEntity = clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName()); - if (clusterVersionEntity == null) { - List<ClusterVersionEntity> clusterVersionEntityList = clusterVersionDAO - .findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLING); - if (!clusterVersionEntityList.isEmpty()) { - clusterVersionEntity = clusterVersionEntityList.iterator().next(); - } + if (null != repositoryVersion) { + hostLevelParams.put(KeyNames.CURRENT_VERSION, repositoryVersion.getVersion()); } + for (Map.Entry<String, String> dbConnectorName : configs.getDatabaseConnectorNames().entrySet()) { hostLevelParams.put(dbConnectorName.getKey(), dbConnectorName.getValue()); } @@ -1516,9 +1493,6 @@ public class AmbariCustomCommandExecutionHelper { hostLevelParams.put(previousDBConnectorName.getKey(), previousDBConnectorName.getValue()); } - if (clusterVersionEntity != null) { - hostLevelParams.put("current_version", clusterVersionEntity.getRepositoryVersion().getVersion()); - } return hostLevelParams; } http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 e2bd50f..ab9b879 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 @@ -110,7 +110,6 @@ import org.apache.ambari.server.metadata.ActionMetadata; import org.apache.ambari.server.metadata.RoleCommandOrder; import org.apache.ambari.server.metadata.RoleCommandOrderProvider; import org.apache.ambari.server.orm.dao.ClusterDAO; -import org.apache.ambari.server.orm.dao.ClusterVersionDAO; import org.apache.ambari.server.orm.dao.ExtensionDAO; import org.apache.ambari.server.orm.dao.ExtensionLinkDAO; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; @@ -119,7 +118,6 @@ import org.apache.ambari.server.orm.dao.StackDAO; import org.apache.ambari.server.orm.dao.WidgetDAO; import org.apache.ambari.server.orm.dao.WidgetLayoutDAO; import org.apache.ambari.server.orm.entities.ClusterEntity; -import org.apache.ambari.server.orm.entities.ClusterVersionEntity; import org.apache.ambari.server.orm.entities.ExtensionEntity; import org.apache.ambari.server.orm.entities.ExtensionLinkEntity; import org.apache.ambari.server.orm.entities.HostEntity; @@ -171,7 +169,6 @@ import org.apache.ambari.server.state.PropertyDependencyInfo; import org.apache.ambari.server.state.PropertyInfo; import org.apache.ambari.server.state.PropertyInfo.PropertyType; import org.apache.ambari.server.state.RepositoryInfo; -import org.apache.ambari.server.state.RepositoryVersionState; import org.apache.ambari.server.state.SecurityType; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; @@ -303,8 +300,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle @Inject private CredentialStoreService credentialStoreService; @Inject - private ClusterVersionDAO clusterVersionDAO; - @Inject private SettingDAO settingDAO; private MaintenanceStateHelper maintenanceStateHelper; @@ -495,17 +490,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } // Create cluster widgets and layouts initializeWidgetsAndLayouts(c, null); - - if (null != versionEntity) { - ClusterVersionDAO clusterVersionDAO = injector.getInstance(ClusterVersionDAO.class); - - ClusterVersionEntity clusterVersion = clusterVersionDAO.findByClusterAndStackAndVersion(request.getClusterName(), stackId, - request.getRepositoryVersion()); - - if (null == clusterVersion) { - c.createClusterVersion(stackId, versionEntity.getVersion(), getAuthName(), RepositoryVersionState.INIT); - } - } } @Override @@ -1719,8 +1703,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle cluster.setCurrentStackVersion(desiredVersion); } - // Stack Upgrade: unlike the workflow for creating a cluster, updating a cluster via the API will not - // create any ClusterVersionEntity changes because those have to go through the Stack Upgrade process. boolean requiresHostListUpdate = request.getHostNames() != null && !request.getHostNames().isEmpty(); @@ -2193,7 +2175,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle Map<String, String> commandParamsInp, ServiceComponentHostEvent event, boolean skipFailure, - ClusterVersionEntity effectiveClusterVersion, + RepositoryVersionEntity repoVersion, boolean isUpgradeSuspended, DatabaseType databaseType, Map<String, DesiredConfig> clusterDesiredConfigs @@ -2316,8 +2298,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle commandParams.put(MAX_DURATION_OF_RETRIES, Integer.toString(retryMaxTime)); commandParams.put(COMMAND_RETRY_ENABLED, Boolean.toString(retryEnabled)); - if (effectiveClusterVersion != null) { - commandParams.put(VERSION, effectiveClusterVersion.getRepositoryVersion().getVersion()); + if (repoVersion != null) { + commandParams.put(VERSION, repoVersion.getVersion()); } if (script.getTimeout() > 0) { scriptCommandTimeout = String.valueOf(script.getTimeout()); @@ -2369,20 +2351,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle hostParams.put(REPO_INFO, repoInfo); hostParams.putAll(getRcaParameters()); - // use the effective cluster version here since this command might happen - // in the context of an upgrade and we should send the repo ID which matches - // the version being send down - RepositoryVersionEntity repoVersion = null; - if (null != effectiveClusterVersion) { - repoVersion = effectiveClusterVersion.getRepositoryVersion(); - } else { - List<ClusterVersionEntity> list = clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), - RepositoryVersionState.INIT); - if (1 == list.size()) { - repoVersion = list.get(0).getRepositoryVersion(); - } - } - if (null != repoVersion) { try { VersionDefinitionXml xml = repoVersion.getRepositoryXml(); @@ -2473,6 +2441,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle execCmd.setAvailableServicesFromServiceInfoMap(ambariMetaInfo.getServices(stackId.getStackName(), stackId.getStackVersion())); execCmd.setRepositoryFile(customCommandExecutionHelper.getCommandRepository(cluster, component, host)); + hostParams.put(KeyNames.CURRENT_VERSION, repoVersion.getVersion()); if ((execCmd != null) && (execCmd.getConfigurationTags().containsKey("cluster-env"))) { LOG.debug("AmbariManagementControllerImpl.createHostAction: created ExecutionCommand for host {}, role {}, roleCommand {}, and command ID {}, with cluster-env tags {}", @@ -2598,9 +2567,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle return requestStages; } - // caching effective cluster version - ClusterVersionEntity effectiveClusterVersion = cluster.getEffectiveClusterVersion(); - // caching upgrade suspended boolean isUpgradeSuspended = cluster.isUpgradeSuspended(); @@ -2627,7 +2593,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle String clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo); String hostParamsJson = StageUtils.getGson().toJson( - customCommandExecutionHelper.createDefaultHostParams(cluster)); + customCommandExecutionHelper.createDefaultHostParams(cluster, null)); Stage stage = createNewStage(requestStages.getLastStageId(), cluster, requestStages.getId(), requestProperties.get(REQUEST_CONTEXT_PROPERTY), @@ -2924,6 +2890,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle requestParameters = new HashMap<>(); } requestParameters.put(CLUSTER_PHASE_PROPERTY, requestProperties.get(CLUSTER_PHASE_PROPERTY)); + } Map<String, Map<String, String>> configurations = new TreeMap<>(); @@ -2943,8 +2910,11 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle LOG.info("Skipping create of INSTALL task for {} on {}.", scHost.getServiceComponentName(), scHost.getHostName()); scHost.setState(State.INSTALLED); } else { + // !!! can never be null + RepositoryVersionEntity repoVersion = serviceComponent.getDesiredRepositoryVersion(); + createHostAction(cluster, stage, scHost, configurations, configurationAttributes, configTags, - roleCommand, requestParameters, event, skipFailure, effectiveClusterVersion, isUpgradeSuspended, + roleCommand, requestParameters, event, skipFailure, repoVersion, isUpgradeSuspended, databaseType, clusterDesiredConfigs); } @@ -3068,7 +3038,11 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle RoleCommand roleCommand) throws AmbariException { Map<String, Set<String>> clusterHostInfo = StageUtils.getClusterHostInfo(cluster); String clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo); - Map<String, String> hostParamsCmd = customCommandExecutionHelper.createDefaultHostParams(cluster); + + + Map<String, String> hostParamsCmd = customCommandExecutionHelper.createDefaultHostParams( + cluster, scHost.getServiceComponent().getDesiredRepositoryVersion()); + Stage stage = createNewStage(0, cluster, 1, "", clusterHostInfoJson, "{}", ""); @@ -3081,12 +3055,19 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle configurationAttributes = new TreeMap<>(); - ClusterVersionEntity effectiveClusterVersion = cluster.getEffectiveClusterVersion(); + RepositoryVersionEntity repoVersion = null; + if (null != scHost.getServiceComponent().getDesiredRepositoryVersion()) { + repoVersion = scHost.getServiceComponent().getDesiredRepositoryVersion(); + } else { + Service service = cluster.getService(scHost.getServiceName()); + repoVersion = service.getDesiredRepositoryVersion(); + } + boolean isUpgradeSuspended = cluster.isUpgradeSuspended(); DatabaseType databaseType = configs.getDatabaseType(); Map<String, DesiredConfig> clusterDesiredConfigs = cluster.getDesiredConfigs(); createHostAction(cluster, stage, scHost, configurations, configurationAttributes, configTags, - roleCommand, null, null, false, effectiveClusterVersion, isUpgradeSuspended, databaseType, + roleCommand, null, null, false, repoVersion, isUpgradeSuspended, databaseType, clusterDesiredConfigs); ExecutionCommand ec = stage.getExecutionCommands().get(scHost.getHostName()).get(0).getExecutionCommand(); @@ -4010,6 +3991,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle if (null != cluster) { stackId = cluster.getDesiredStackVersion(); } + ExecuteCommandJson jsons = customCommandExecutionHelper.getCommandJson(actionExecContext, cluster, stackId); String commandParamsForStage = jsons.getCommandParamsForStage(); http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java index 6687942..8a5731b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java @@ -1689,7 +1689,7 @@ public class KerberosHelperImpl implements KerberosHelper { // Gather data needed to create stages and tasks... Map<String, Set<String>> clusterHostInfo = StageUtils.getClusterHostInfo(cluster); String clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo); - Map<String, String> hostParams = customCommandExecutionHelper.createDefaultHostParams(cluster); + Map<String, String> hostParams = customCommandExecutionHelper.createDefaultHostParams(cluster, null); String hostParamsJson = StageUtils.getGson().toJson(hostParams); String ambariServerHostname = StageUtils.getHostName(); ServiceComponentHostServerActionEvent event = new ServiceComponentHostServerActionEvent( @@ -1889,7 +1889,7 @@ public class KerberosHelperImpl implements KerberosHelper { // Gather data needed to create stages and tasks... Map<String, Set<String>> clusterHostInfo = StageUtils.getClusterHostInfo(cluster); String clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo); - Map<String, String> hostParams = customCommandExecutionHelper.createDefaultHostParams(cluster); + Map<String, String> hostParams = customCommandExecutionHelper.createDefaultHostParams(cluster, null); String hostParamsJson = StageUtils.getGson().toJson(hostParams); String ambariServerHostname = StageUtils.getHostName(); ServiceComponentHostServerActionEvent event = new ServiceComponentHostServerActionEvent( http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 fd52a3f..774ba0c 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 @@ -35,7 +35,6 @@ import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; import org.apache.ambari.server.StaticallyInject; import org.apache.ambari.server.actionmanager.ActionManager; -import org.apache.ambari.server.actionmanager.HostRoleCommandFactory; import org.apache.ambari.server.actionmanager.RequestFactory; import org.apache.ambari.server.actionmanager.Stage; import org.apache.ambari.server.actionmanager.StageFactory; @@ -56,11 +55,9 @@ import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException; 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.ClusterVersionDAO; import org.apache.ambari.server.orm.dao.HostComponentStateDAO; import org.apache.ambari.server.orm.dao.HostVersionDAO; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; -import org.apache.ambari.server.orm.entities.ClusterVersionEntity; import org.apache.ambari.server.orm.entities.HostVersionEntity; import org.apache.ambari.server.orm.entities.OperatingSystemEntity; import org.apache.ambari.server.orm.entities.RepositoryEntity; @@ -68,7 +65,6 @@ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.StackEntity; import org.apache.ambari.server.orm.entities.UpgradeEntity; import org.apache.ambari.server.security.authorization.RoleAuthorization; -import org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ComponentInfo; @@ -81,6 +77,7 @@ import org.apache.ambari.server.state.repository.VersionDefinitionXml; import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.ambari.server.utils.StageUtils; import org.apache.ambari.server.utils.VersionUtils; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; @@ -88,7 +85,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.Inject; -import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.persist.Transactional; @@ -156,18 +152,12 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou .build(); @Inject - private static ClusterVersionDAO clusterVersionDAO; - - @Inject private static HostVersionDAO hostVersionDAO; @Inject private static RepositoryVersionDAO repositoryVersionDAO; @Inject - private static HostRoleCommandFactory hostRoleCommandFactory; - - @Inject private static Provider<AmbariActionExecutionHelper> actionExecutionHelper; @Inject @@ -180,20 +170,15 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou private static Configuration configuration; @Inject - private static Injector injector; - - @Inject private static HostComponentStateDAO hostComponentStateDAO; @Inject private static RepositoryVersionHelper repoVersionHelper; - /** - * We have to include such a hack here, because if we - * make finalizeUpgradeAction field static and request injection - * for it, there will be a circle dependency error - */ - private FinalizeUpgradeAction finalizeUpgradeAction = injector.getInstance(FinalizeUpgradeAction.class); + + + @Inject + private static Provider<Clusters> clusters; /** * Constructor. @@ -208,70 +193,107 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou } @Override + @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES, + comment = "this is a fake response until the UI no longer uses the endpoint") public Set<Resource> getResourcesAuthorized(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException { final Set<Resource> resources = new HashSet<>(); + final Set<String> requestedIds = getRequestPropertyIds(request, predicate); final Set<Map<String, Object>> propertyMaps = getPropertyMaps(predicate); - List<ClusterVersionEntity> requestedEntities = new ArrayList<>(); - for (Map<String, Object> propertyMap: propertyMaps) { - final String clusterName = propertyMap.get(CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID).toString(); - final Long id; - if (propertyMap.get(CLUSTER_STACK_VERSION_ID_PROPERTY_ID) == null && propertyMaps.size() == 1) { - requestedEntities = clusterVersionDAO.findByCluster(clusterName); - } else { - try { - id = Long.parseLong(propertyMap.get(CLUSTER_STACK_VERSION_ID_PROPERTY_ID).toString()); - } catch (Exception ex) { - throw new SystemException("Stack version should have numerical id"); - } - final ClusterVersionEntity entity = clusterVersionDAO.findByPK(id); - if (entity == null) { - throw new NoSuchResourceException("There is no stack version with id " + id); - } else { - requestedEntities.add(entity); - } + if (1 != propertyMaps.size()) { + throw new SystemException("Cannot request more than one resource"); + } + + Map<String, Object> propertyMap = propertyMaps.iterator().next(); + + String clusterName = propertyMap.get(CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID).toString(); + final Cluster cluster; + try { + cluster = clusters.get().getCluster(clusterName); + } catch (AmbariException e) { + throw new SystemException(e.getMessage(), e); + } + + Set<Long> requestedEntities = new HashSet<>(); + + if (propertyMap.containsKey(CLUSTER_STACK_VERSION_ID_PROPERTY_ID)) { + Long id = Long.parseLong(propertyMap.get(CLUSTER_STACK_VERSION_ID_PROPERTY_ID).toString()); + requestedEntities.add(id); + } else { + cluster.getCurrentStackVersion(); + List<RepositoryVersionEntity> entities = repositoryVersionDAO.findByStack(cluster.getCurrentStackVersion()); + + for (RepositoryVersionEntity entity : entities) { + requestedEntities.add(entity.getId()); } } - for (ClusterVersionEntity entity: requestedEntities) { + if (requestedEntities.isEmpty()) { + throw new SystemException("Could not find any repositories to show"); + } + + + for (Long repositoryVersionId : requestedEntities) { final Resource resource = new ResourceImpl(Resource.Type.ClusterStackVersion); - final Map<String, List<String>> hostStates = new HashMap<>(); + RepositoryVersionEntity repositoryVersion = repositoryVersionDAO.findByPK(repositoryVersionId); + + final Map<RepositoryVersionState, List<String>> hostStates = new HashMap<>(); for (RepositoryVersionState state: RepositoryVersionState.values()) { - hostStates.put(state.name(), new ArrayList<String>()); + hostStates.put(state, new ArrayList<String>()); } - StackEntity repoVersionStackEntity = entity.getRepositoryVersion().getStack(); + StackEntity repoVersionStackEntity = repositoryVersion.getStack(); StackId repoVersionStackId = new StackId(repoVersionStackEntity); for (HostVersionEntity hostVersionEntity : hostVersionDAO.findByClusterStackAndVersion( - entity.getClusterEntity().getClusterName(), repoVersionStackId, - entity.getRepositoryVersion().getVersion())) { + clusterName, repoVersionStackId, repositoryVersion.getVersion())) { - hostStates.get(hostVersionEntity.getState().name()).add(hostVersionEntity.getHostName()); + hostStates.get(hostVersionEntity.getState()).add(hostVersionEntity.getHostName()); } - StackId stackId = new StackId(entity.getRepositoryVersion().getStack()); - RepositoryVersionEntity repoVerEntity = repositoryVersionDAO.findByStackAndVersion( - stackId, entity.getRepositoryVersion().getVersion()); - - setResourceProperty(resource, CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID, entity.getClusterEntity().getClusterName(), requestedIds); + setResourceProperty(resource, CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds); setResourceProperty(resource, CLUSTER_STACK_VERSION_HOST_STATES_PROPERTY_ID, hostStates, requestedIds); - setResourceProperty(resource, CLUSTER_STACK_VERSION_ID_PROPERTY_ID, entity.getId(), requestedIds); - setResourceProperty(resource, CLUSTER_STACK_VERSION_STACK_PROPERTY_ID, stackId.getStackName(), requestedIds); - setResourceProperty(resource, CLUSTER_STACK_VERSION_STATE_PROPERTY_ID, entity.getState().name(), requestedIds); - setResourceProperty(resource, CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID, stackId.getStackVersion(), requestedIds); - if (repoVerEntity!=null) { - Long repoVersionId = repoVerEntity.getId(); - setResourceProperty(resource, CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID, repoVersionId, requestedIds); + setResourceProperty(resource, CLUSTER_STACK_VERSION_ID_PROPERTY_ID, repositoryVersion.getId(), requestedIds); + setResourceProperty(resource, CLUSTER_STACK_VERSION_STACK_PROPERTY_ID, repoVersionStackId.getStackName(), requestedIds); + setResourceProperty(resource, CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID, repoVersionStackId.getStackVersion(), requestedIds); + + + @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES, + comment = "this is a fake status until the UI can handle services that are on their own") + RepositoryVersionState finalState = null; + + for (RepositoryVersionState state : EnumSet.of(RepositoryVersionState.INSTALLING, + RepositoryVersionState.INSTALL_FAILED, RepositoryVersionState.OUT_OF_SYNC)) { + + if (CollectionUtils.isNotEmpty(hostStates.get(state))) { + finalState = state; + break; + } } + if (null == finalState) { + int count = cluster.getClusterSize(); + + for (RepositoryVersionState state : EnumSet.of(RepositoryVersionState.INSTALLED, RepositoryVersionState.CURRENT)) { + if (count == CollectionUtils.size(hostStates.get(state))) { + finalState = state; + break; + } + } + } + // !!! end ExperimentalFeature + + setResourceProperty(resource, CLUSTER_STACK_VERSION_STATE_PROPERTY_ID, finalState, requestedIds); + setResourceProperty(resource, CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID, repositoryVersion.getId(), requestedIds); + if (predicate == null || predicate.evaluate(resource)) { resources.add(resource); } } + return resources; } @@ -380,86 +402,47 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou StackId stackId, boolean forceInstalled, Map<String, Object> propertyMap) throws AmbariException, SystemException { - final String clusterName = cluster.getClusterName(); - final String authName = getManagementController().getAuthName(); final String desiredRepoVersion = repoVersionEntity.getVersion(); - ClusterVersionEntity clusterVersionEntity = clusterVersionDAO.findByClusterAndStackAndVersion( - clusterName, stackId, desiredRepoVersion); - // get all of the hosts eligible for stack distribution List<Host> hosts = Lists.newArrayList(cluster.getHosts()); - /* - If there is a repository that is already ATTEMPTED to be installed and the version - is GREATER than the one trying to install, we must fail (until we can support that via Patch Upgrades) - For example: + for (Host host : hosts) { + for (HostVersionEntity hostVersion : host.getAllHostVersions()) { + RepositoryVersionEntity hostRepoVersion = hostVersion.getRepositoryVersion(); - 1. Install 2.3.0.0 - 2. Register and Install 2.5.0.0 (with or without package-version; it gets computed correctly) - 3. Register 2.4 (without package-version) - - Installation of 2.4 will fail because the way agents invoke installation is to - install by name. if the package-version is not known, then the 'newest' is ALWAYS installed. - In this case, 2.5.0.0. 2.4 is never picked up. - */ - for (ClusterVersionEntity clusterVersion : clusterVersionDAO.findByCluster(cluster.getClusterName())) { - RepositoryVersionEntity clusterRepoVersion = clusterVersion.getRepositoryVersion(); - - int compare = compareVersions(clusterRepoVersion.getVersion(), desiredRepoVersion); + // !!! ignore stack differences + if (!hostRepoVersion.getStackName().equals(repoVersionEntity.getStackName())) { + continue; + } - // ignore earlier versions - if (compare <= 0) { - continue; - } + int compare = compareVersions(hostRepoVersion.getVersion(), desiredRepoVersion); - // !!! the version is greater to the one to install + // ignore earlier versions + if (compare <= 0) { + continue; + } - // if the stacks are different, then don't fail (further check same-stack version strings) - if (!StringUtils.equals(clusterRepoVersion.getStackName(), repoVersionEntity.getStackName())) { - continue; - } + // !!! the version is greater to the one to install - // if there is no backing VDF for the desired version, allow the operation (legacy behavior) - if (null == versionDefinitionXml) { - continue; - } + // if there is no backing VDF for the desired version, allow the operation (legacy behavior) + if (null == versionDefinitionXml) { + continue; + } - // backing VDF does not define the package version for any of the hosts, cannot install (allows a VDF with package-version) - for (Host host : hosts) { if (StringUtils.isBlank(versionDefinitionXml.getPackageVersion(host.getOsFamily()))) { String msg = String.format("Ambari cannot install version %s. Version %s is already installed.", - desiredRepoVersion, clusterRepoVersion.getVersion()); + desiredRepoVersion, hostRepoVersion.getVersion()); throw new IllegalArgumentException(msg); } } } - RepositoryVersionState repositoryVersionState = RepositoryVersionState.INSTALLING; - if (forceInstalled) { - repositoryVersionState = RepositoryVersionState.INSTALLED; - } - - // if there is no cluster version entity, then create one - if (clusterVersionEntity == null) { - try { - // Create/persist new cluster stack version - clusterVersionEntity = cluster.createClusterVersion(stackId, desiredRepoVersion, authName, - repositoryVersionState); - } catch (AmbariException e) { - throw new SystemException( - String.format("Can not create cluster stack version %s for cluster %s", - desiredRepoVersion, clusterName), e); - } - } else { - // Move cluster version into the specified state (retry installation) - cluster.transitionClusterVersion(stackId, desiredRepoVersion, repositoryVersionState); - } // the cluster will create/update all of the host versions to the correct state List<Host> hostsNeedingInstallCommands = cluster.transitionHostsToInstalling( - clusterVersionEntity, repoVersionEntity, versionDefinitionXml, forceInstalled); + repoVersionEntity, versionDefinitionXml, forceInstalled); RequestStatusResponse response = null; if (!forceInstalled) { @@ -709,7 +692,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou hostComponentStateDAO.updateVersions(target.getVersion()); hostVersionDAO.updateVersions(target, current); - clusterVersionDAO.updateVersions(clusterId, target, current); +// clusterVersionDAO.updateVersions(clusterId, target, current); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java index c244107..7014f08 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java @@ -39,7 +39,6 @@ import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.controller.ConfigurationRequest; import org.apache.ambari.server.controller.HostRequest; import org.apache.ambari.server.controller.HostResponse; -import org.apache.ambari.server.controller.MaintenanceStateHelper; import org.apache.ambari.server.controller.RequestStatusResponse; import org.apache.ambari.server.controller.ServiceComponentHostRequest; import org.apache.ambari.server.controller.spi.NoSuchParentResourceException; @@ -159,9 +158,6 @@ public class HostResourceProvider extends AbstractControllerResourceProvider { HOST_NAME_PROPERTY_ID})); @Inject - private MaintenanceStateHelper maintenanceStateHelper; - - @Inject private OsFamily osFamily; @Inject @@ -525,9 +521,6 @@ public class HostResourceProvider extends AbstractControllerResourceProvider { } clusters.updateHostWithClusterAndAttributes(hostClustersMap, hostAttributes); - for (String clusterName : allClusterSet) { - clusters.getCluster(clusterName).recalculateAllClusterVersionStates(); - } } private void createHostResource(Clusters clusters, Set<String> duplicates, @@ -803,12 +796,9 @@ public class HostResourceProvider extends AbstractControllerResourceProvider { } } - if (clusterName != null && !clusterName.isEmpty()) { - clusters.getCluster(clusterName).recalculateAllClusterVersionStates(); - if (rackChange) { - // Authorization check for this update was performed before we got to this point. - controller.registerRackChange(clusterName); - } + if (StringUtils.isNotBlank(clusterName) && rackChange) { + // Authorization check for this update was performed before we got to this point. + controller.registerRackChange(clusterName); } //todo: if attempt was made to update a property other than those @@ -931,9 +921,6 @@ public class HostResourceProvider extends AbstractControllerResourceProvider { } } clusters.publishHostsDeletion(allClustersWithHosts, hostNames); - for (String clustername : hostsClusters) { - clusters.getCluster(clustername).recalculateAllClusterVersionStates(); - } } private void validateHostInDeleteFriendlyState(HostRequest hostRequest, Clusters clusters, boolean forceDelete) throws AmbariException { http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java index 71b9b6b..2e03a22 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java @@ -489,7 +489,6 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource if (!forceInstallOnNonMemberHost) { hostVersEntity.setState(RepositoryVersionState.INSTALLING); hostVersionDAO.merge(hostVersEntity); - cluster.recalculateClusterVersionState(repoVersionEnt); } req.persist(); } catch (AmbariException e) { http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 d2f3f8d..a0a3666 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 @@ -25,6 +25,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import org.apache.ambari.server.AmbariException; @@ -43,10 +44,10 @@ import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException; 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.ClusterVersionDAO; +import org.apache.ambari.server.orm.dao.HostVersionDAO; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; import org.apache.ambari.server.orm.dao.StackDAO; -import org.apache.ambari.server.orm.entities.ClusterVersionEntity; +import org.apache.ambari.server.orm.entities.HostVersionEntity; import org.apache.ambari.server.orm.entities.OperatingSystemEntity; import org.apache.ambari.server.orm.entities.RepositoryEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; @@ -55,7 +56,6 @@ import org.apache.ambari.server.security.authorization.AuthorizationException; import org.apache.ambari.server.security.authorization.AuthorizationHelper; import org.apache.ambari.server.security.authorization.ResourceType; import org.apache.ambari.server.security.authorization.RoleAuthorization; -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.ServiceInfo; @@ -64,14 +64,13 @@ import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.repository.ManifestServiceInfo; import org.apache.ambari.server.state.repository.VersionDefinitionXml; import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; -import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.gson.Gson; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.persist.Transactional; /** @@ -141,23 +140,20 @@ public class RepositoryVersionResourceProvider extends AbstractAuthorizedResourc private RepositoryVersionDAO repositoryVersionDAO; @Inject - private ClusterVersionDAO clusterVersionDAO; - - @Inject private AmbariMetaInfo ambariMetaInfo; @Inject private RepositoryVersionHelper repositoryVersionHelper; - @Inject - private Provider<Clusters> clusters; - /** * Data access object used for lookup up stacks. */ @Inject private StackDAO stackDAO; + @Inject + HostVersionDAO hostVersionDAO; + /** * Create a new resource provider. * @@ -398,22 +394,34 @@ public class RepositoryVersionResourceProvider extends AbstractAuthorizedResourc throw new NoSuchResourceException("There is no repository version with id " + id); } - StackEntity stackEntity = entity.getStack(); - String stackName = stackEntity.getStackName(); - String stackVersion = stackEntity.getStackVersion(); - - final List<ClusterVersionEntity> clusterVersionEntities = clusterVersionDAO.findByStackAndVersion( - stackName, stackVersion, entity.getVersion()); - - final List<RepositoryVersionState> forbiddenToDeleteStates = Lists.newArrayList( + final Set<RepositoryVersionState> forbiddenToDeleteStates = Sets.newHashSet( RepositoryVersionState.CURRENT, RepositoryVersionState.INSTALLED, RepositoryVersionState.INSTALLING); - for (ClusterVersionEntity clusterVersionEntity : clusterVersionEntities) { - if (clusterVersionEntity.getRepositoryVersion().getId().equals(id) && forbiddenToDeleteStates.contains(clusterVersionEntity.getState())) { - throw new SystemException("Repository version can't be deleted as it is " + - clusterVersionEntity.getState().name() + " on cluster " + clusterVersionEntity.getClusterEntity().getClusterName()); + + List<HostVersionEntity> hostVersions = hostVersionDAO.findByRepositoryAndStates( + entity, forbiddenToDeleteStates); + + if (CollectionUtils.isNotEmpty(hostVersions)) { + Map<RepositoryVersionState, Set<String>> hostsInUse = new HashMap<>(); + + for (HostVersionEntity hostVersion : hostVersions) { + if (!hostsInUse.containsKey(hostVersion.getState())) { + hostsInUse.put(hostVersion.getState(), new HashSet<String>()); + } + + hostsInUse.get(hostVersion.getState()).add(hostVersion.getHostName()); } + + Set<String> errors = new HashSet<>(); + for (Entry<RepositoryVersionState, Set<String>> entry : hostsInUse.entrySet()) { + errors.add(String.format("%s on %s", entry.getKey(), StringUtils.join(entry.getValue(), ", "))); + } + + + throw new SystemException( + String.format("Repository version can't be deleted as it is used by the following hosts: %s", + StringUtils.join(errors, ';'))); } entitiesToBeRemoved.add(entity); http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java index c611037..664ba42 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java @@ -74,6 +74,7 @@ import org.apache.ambari.server.state.ServiceComponentHost; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.State; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; @@ -423,13 +424,25 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider String desiredStack = request.getDesiredStack(); String desiredRepositoryVersion = request.getDesiredRepositoryVersion(); RepositoryVersionEntity repositoryVersion = null; - if( StringUtils.isNotBlank(desiredStack) && StringUtils.isNotBlank(desiredRepositoryVersion)){ + if (StringUtils.isNotBlank(desiredStack) && StringUtils.isNotBlank(desiredRepositoryVersion)){ repositoryVersion = repositoryVersionDAO.findByStackAndVersion(new StackId(desiredStack), desiredRepositoryVersion); } + if (null == desiredStack) { + desiredStack = cluster.getDesiredStackVersion().toString(); + } + + if (null == repositoryVersion) { + List<RepositoryVersionEntity> allVersions = repositoryVersionDAO.findByStack(new StackId(desiredStack)); + + if (CollectionUtils.isNotEmpty(allVersions)) { + repositoryVersion = allVersions.get(0); + } + } + if (null == repositoryVersion) { - repositoryVersion = cluster.getCurrentClusterVersion().getRepositoryVersion(); + throw new AmbariException(String.format("Could not find any repositories defined by %s", desiredStack)); } Service s = cluster.addService(request.getServiceName(), repositoryVersion); @@ -630,7 +643,7 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider // Setting Maintenance state for service if (null != request.getMaintenanceState()) { - if(!AuthorizationHelper.isAuthorized(ResourceType.CLUSTER, cluster.getResourceId(), RoleAuthorization.SERVICE_TOGGLE_MAINTENANCE)) { + if (!AuthorizationHelper.isAuthorized(ResourceType.CLUSTER, cluster.getResourceId(), RoleAuthorization.SERVICE_TOGGLE_MAINTENANCE)) { throw new AuthorizationException("The authenticated user is not authorized to toggle the maintainence state of services"); } http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 b49b66e..7ca6164 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 @@ -36,6 +36,8 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; import org.apache.ambari.server.RoleCommand; @@ -755,6 +757,8 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider upgradeContext.setSupportedServices(supportedServices); upgradeContext.setScope(scope); + @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES, + comment = "Check for any other way downgrade to get set, if required") String downgradeFromVersion = null; if (direction.isDowngrade()) { @@ -767,6 +771,10 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider downgradeFromVersion = lastUpgradeItemForCluster.getToVersion(); } + if (null == downgradeFromVersion) { + throw new AmbariException("When downgrading, the downgrade version must be specified"); + } + upgradeContext.setDowngradeFromVersion(downgradeFromVersion); } @@ -919,7 +927,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider if (null != downgradeFromVersion) { entity.setFromVersion(downgradeFromVersion); } else { - entity.setFromVersion(cluster.getCurrentClusterVersion().getRepositoryVersion().getVersion()); + entity.setFromVersion(""); } entity.setToVersion(version); http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java index 3fda160..5199787 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java @@ -19,7 +19,6 @@ package org.apache.ambari.server.events.listeners.upgrade; import java.util.List; -import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.EagerSingleton; import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.bootstrap.DistributeRepositoriesStructuredOutput; @@ -29,7 +28,6 @@ import org.apache.ambari.server.orm.dao.HostVersionDAO; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; import org.apache.ambari.server.orm.entities.HostVersionEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; -import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.RepositoryVersionState; import org.apache.ambari.server.state.StackId; @@ -178,13 +176,6 @@ public class DistributeRepositoriesActionListener { if (hostVersion.getState() == RepositoryVersionState.INSTALLING) { hostVersion.setState(newHostState); hostVersionDAO.get().merge(hostVersion); - // Update state of a cluster stack version - try { - Cluster cluster = clusters.get().getClusterById(clusterId); - cluster.recalculateClusterVersionState(hostVersion.getRepositoryVersion()); - } catch (AmbariException e) { - LOG.error("Cannot get cluster with Id " + clusterId.toString() + " to recalculate its ClusterVersion.", e); - } } } }