|
@@ -17,7 +17,15 @@
|
|
*/
|
|
*/
|
|
package org.apache.ambari.server.serveraction.upgrades;
|
|
package org.apache.ambari.server.serveraction.upgrades;
|
|
|
|
|
|
-import com.google.inject.Inject;
|
|
|
|
|
|
+import java.io.PrintWriter;
|
|
|
|
+import java.io.StringWriter;
|
|
|
|
+import java.text.MessageFormat;
|
|
|
|
+import java.util.Collection;
|
|
|
|
+import java.util.HashSet;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
|
|
+import java.util.concurrent.ConcurrentMap;
|
|
|
|
|
|
import org.apache.ambari.server.AmbariException;
|
|
import org.apache.ambari.server.AmbariException;
|
|
import org.apache.ambari.server.actionmanager.HostRoleStatus;
|
|
import org.apache.ambari.server.actionmanager.HostRoleStatus;
|
|
@@ -34,17 +42,12 @@ import org.apache.ambari.server.serveraction.AbstractServerAction;
|
|
import org.apache.ambari.server.state.Cluster;
|
|
import org.apache.ambari.server.state.Cluster;
|
|
import org.apache.ambari.server.state.Clusters;
|
|
import org.apache.ambari.server.state.Clusters;
|
|
import org.apache.ambari.server.state.RepositoryVersionState;
|
|
import org.apache.ambari.server.state.RepositoryVersionState;
|
|
-import org.apache.ambari.server.state.StackId;
|
|
|
|
|
|
+import org.apache.ambari.server.state.StackId;
|
|
import org.apache.ambari.server.state.UpgradeState;
|
|
import org.apache.ambari.server.state.UpgradeState;
|
|
import org.apache.ambari.server.state.svccomphost.ServiceComponentHostSummary;
|
|
import org.apache.ambari.server.state.svccomphost.ServiceComponentHostSummary;
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
|
|
|
-import java.text.MessageFormat;
|
|
|
|
-import java.util.Collection;
|
|
|
|
-import java.util.HashSet;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Set;
|
|
|
|
-import java.util.concurrent.ConcurrentMap;
|
|
|
|
|
|
+import com.google.inject.Inject;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Action that represents finalizing the Upgrade by completing any database changes.
|
|
* Action that represents finalizing the Upgrade by completing any database changes.
|
|
@@ -71,19 +74,40 @@ public class FinalizeUpgradeAction extends AbstractServerAction {
|
|
private AmbariMetaInfo ambariMetaInfo;
|
|
private AmbariMetaInfo ambariMetaInfo;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public CommandReport execute(
|
|
|
|
- ConcurrentMap<String, Object> requestSharedDataContext)
|
|
|
|
|
|
+ public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext)
|
|
throws AmbariException, InterruptedException {
|
|
throws AmbariException, InterruptedException {
|
|
|
|
|
|
|
|
+ Map<String, String> commandParams = getExecutionCommand().getCommandParams();
|
|
|
|
+
|
|
|
|
+ boolean isDowngrade = commandParams.containsKey("upgrade_direction") &&
|
|
|
|
+ "downgrade".equals(commandParams.get("upgrade_direction").toLowerCase());
|
|
|
|
+
|
|
|
|
+ String version = commandParams.get("version");
|
|
|
|
+ String clusterName = getExecutionCommand().getClusterName();
|
|
|
|
+
|
|
|
|
+ if (isDowngrade) {
|
|
|
|
+ return executeDowngrade(clusterName, version);
|
|
|
|
+ } else {
|
|
|
|
+ return executeUpgrade(clusterName, version);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Execution path for upgrade.
|
|
|
|
+ * @param clusterName the name of the cluster the upgrade is for
|
|
|
|
+ * @param version the target version of the upgrade
|
|
|
|
+ * @return the command report
|
|
|
|
+ */
|
|
|
|
+ private CommandReport executeUpgrade(String clusterName, String version)
|
|
|
|
+ throws AmbariException, InterruptedException {
|
|
|
|
+
|
|
Set<RepositoryVersionState> allowedStates = new HashSet<RepositoryVersionState>();
|
|
Set<RepositoryVersionState> allowedStates = new HashSet<RepositoryVersionState>();
|
|
allowedStates.add(RepositoryVersionState.UPGRADED);
|
|
allowedStates.add(RepositoryVersionState.UPGRADED);
|
|
|
|
|
|
- StringBuffer outSB = new StringBuffer();
|
|
|
|
- StringBuffer errSB = new StringBuffer();
|
|
|
|
|
|
+ StringBuilder outSB = new StringBuilder();
|
|
|
|
+ StringBuilder errSB = new StringBuilder();
|
|
|
|
|
|
try {
|
|
try {
|
|
- String version = this.getExecutionCommand().getCommandParams().get("version");
|
|
|
|
- String clusterName = this.getExecutionCommand().getClusterName();
|
|
|
|
outSB.append(MessageFormat.format("Begin finalizing the upgrade of cluster {0} to version {1}\n", clusterName, version));
|
|
outSB.append(MessageFormat.format("Begin finalizing the upgrade of cluster {0} to version {1}\n", clusterName, version));
|
|
|
|
|
|
Cluster cluster = clusters.getCluster(clusterName);
|
|
Cluster cluster = clusters.getCluster(clusterName);
|
|
@@ -182,4 +206,96 @@ public class FinalizeUpgradeAction extends AbstractServerAction {
|
|
return createCommandReport(-1, HostRoleStatus.FAILED, "{}", outSB.toString(), errSB.toString());
|
|
return createCommandReport(-1, HostRoleStatus.FAILED, "{}", outSB.toString(), errSB.toString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Execution path for downgrade.
|
|
|
|
+ * @param clusterName the name of the cluster the downgrade is for
|
|
|
|
+ * @param version the target version of the downgrade
|
|
|
|
+ * @return the command report
|
|
|
|
+ */
|
|
|
|
+ private CommandReport executeDowngrade(String clusterName, String version)
|
|
|
|
+ throws AmbariException, InterruptedException {
|
|
|
|
+
|
|
|
|
+ StringBuilder out = new StringBuilder();
|
|
|
|
+ StringBuilder err = new StringBuilder();
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ Cluster cluster = clusters.getCluster(clusterName);
|
|
|
|
+ StackId stackId = cluster.getDesiredStackVersion();
|
|
|
|
+
|
|
|
|
+ // !!! find and make sure the cluster_version EXCEPT current are set back
|
|
|
|
+ out.append(String.format("Searching for current version for %s\n", clusterName));
|
|
|
|
+ ClusterVersionEntity clusterVersion = clusterVersionDAO.findByClusterAndStateCurrent(clusterName);
|
|
|
|
+ if (null == clusterVersion) {
|
|
|
|
+ throw new AmbariException("Could not find current cluster version");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ out.append(String.format("Comparing downgrade version %s to current cluster version %s\n",
|
|
|
|
+ version,
|
|
|
|
+ clusterVersion.getRepositoryVersion().getVersion()));
|
|
|
|
+
|
|
|
|
+ if (!version.equals(clusterVersion.getRepositoryVersion().getVersion())) {
|
|
|
|
+ throw new AmbariException(
|
|
|
|
+ String.format("Downgrade version %s is not the current cluster version of %s",
|
|
|
|
+ version, clusterVersion.getRepositoryVersion().getVersion()));
|
|
|
|
+ } else {
|
|
|
|
+ out.append(String.format("Downgrade version is the same as current. Searching " +
|
|
|
|
+ "for cluster versions that do not match %s\n", version));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Set<String> badVersions = new HashSet<String>();
|
|
|
|
+ // update the cluster version
|
|
|
|
+ for (ClusterVersionEntity cve : clusterVersionDAO.findByCluster(clusterName)) {
|
|
|
|
+ switch (cve.getState()) {
|
|
|
|
+ case UPGRADE_FAILED:
|
|
|
|
+ case UPGRADED:
|
|
|
|
+ case UPGRADING: {
|
|
|
|
+ badVersions.add(cve.getRepositoryVersion().getVersion());
|
|
|
|
+ cve.setState(RepositoryVersionState.INSTALLED);
|
|
|
|
+ clusterVersionDAO.merge(cve);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ out.append(String.format("Found %d other version(s) not matching downgrade: %s\n",
|
|
|
|
+ badVersions.size(), StringUtils.join(badVersions, ", ")));
|
|
|
|
+
|
|
|
|
+ Set<String> badHosts = new HashSet<String>();
|
|
|
|
+ for (String badVersion : badVersions) {
|
|
|
|
+ List<HostVersionEntity> hostVersions = hostVersionDAO.findByClusterStackAndVersion(
|
|
|
|
+ clusterName, stackId.getStackId(), badVersion);
|
|
|
|
+
|
|
|
|
+ for (HostVersionEntity hostVersion : hostVersions) {
|
|
|
|
+ badHosts.add(hostVersion.getHostName());
|
|
|
|
+ hostVersion.setState(RepositoryVersionState.INSTALLED);
|
|
|
|
+ hostVersionDAO.merge(hostVersion);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ out.append(String.format("Found %d hosts not matching downgrade version: %s\n",
|
|
|
|
+ badHosts.size(), version));
|
|
|
|
+
|
|
|
|
+ for (String badHost : badHosts) {
|
|
|
|
+ List<HostComponentStateEntity> hostComponentStates = hostComponentStateDAO.findByHost(badHost);
|
|
|
|
+ for (HostComponentStateEntity hostComponentState : hostComponentStates) {
|
|
|
|
+ hostComponentState.setUpgradeState(UpgradeState.NONE);
|
|
|
|
+ hostComponentStateDAO.merge(hostComponentState);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
|
|
|
|
+ out.toString(), err.toString());
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ StringWriter sw = new StringWriter();
|
|
|
|
+ e.printStackTrace(new PrintWriter(sw));
|
|
|
|
+ err.append(sw.toString());
|
|
|
|
+
|
|
|
|
+ return createCommandReport(-1, HostRoleStatus.FAILED, "{}",
|
|
|
|
+ out.toString(), err.toString());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|