You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2016/02/11 15:21:03 UTC
ambari git commit: AMBARI-14978. Create Upgrade Packs for Patch
Upgrades (ncole)
Repository: ambari
Updated Branches:
refs/heads/branch-dev-patch-upgrade 1809161eb -> 03bc22607
AMBARI-14978. Create Upgrade Packs for Patch Upgrades (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/03bc2260
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/03bc2260
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/03bc2260
Branch: refs/heads/branch-dev-patch-upgrade
Commit: 03bc22607d533896f44ee3d60e29aa2a08ffe31e
Parents: 1809161
Author: Nate Cole <nc...@hortonworks.com>
Authored: Wed Feb 10 15:55:25 2016 -0500
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Thu Feb 11 08:47:10 2016 -0500
----------------------------------------------------------------------
.../internal/UpgradeResourceProvider.java | 34 ++-
.../ambari/server/state/UpgradeContext.java | 11 +
.../ambari/server/state/UpgradeHelper.java | 5 +
.../state/stack/upgrade/ClusterGrouping.java | 19 +-
.../state/stack/upgrade/ColocatedGrouping.java | 36 ++-
.../server/state/stack/upgrade/Grouping.java | 47 ++--
.../stack/upgrade/StageWrapperBuilder.java | 41 ++-
.../ambari/server/state/stack/upgrade/Task.java | 7 +
.../state/stack/upgrade/UpgradeScope.java | 60 +++++
.../HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml | 1 +
.../stacks/HDP/2.2/upgrades/upgrade-2.2.xml | 1 +
.../HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml | 1 +
.../stacks/HDP/2.3/upgrades/upgrade-2.3.xml | 1 +
.../HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml | 1 +
.../stacks/HDP/2.4/upgrades/upgrade-2.4.xml | 1 +
.../src/main/resources/version_definition.xsd | 1 +
.../AmbariManagementControllerTest.java | 8 +-
.../ambari/server/state/UpgradeHelperTest.java | 100 ++++---
.../HDP/2.1.1/upgrades/upgrade_test_partial.xml | 259 +++++++++++++++++++
19 files changed, 535 insertions(+), 99 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/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 db8c079..40565c5 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
@@ -106,6 +106,7 @@ import org.apache.ambari.server.state.stack.upgrade.StageWrapper;
import org.apache.ambari.server.state.stack.upgrade.Task;
import org.apache.ambari.server.state.stack.upgrade.TaskWrapper;
import org.apache.ambari.server.state.stack.upgrade.UpdateStackGrouping;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeScope;
import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
import org.apache.ambari.server.state.svccomphost.ServiceComponentHostServerActionEvent;
import org.apache.commons.collections.CollectionUtils;
@@ -304,9 +305,9 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
String forceDowngrade = requestInfoProps.get(UpgradeResourceDefinition.DOWNGRADE_DIRECTIVE);
String clusterName = (String) requestMap.get(UPGRADE_CLUSTER_NAME);
- if (null == clusterName) {
- throw new AmbariException(String.format("%s is required", UPGRADE_CLUSTER_NAME));
- }
+ if (null == clusterName) {
+ throw new AmbariException(String.format("%s is required", UPGRADE_CLUSTER_NAME));
+ }
Cluster cluster = getManagementController().getClusters().getCluster(clusterName);
Direction direction = Boolean.parseBoolean(forceDowngrade) ? Direction.DOWNGRADE
@@ -315,15 +316,17 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
UpgradePack up = validateRequest(direction, requestMap);
try {
- return createUpgrade(cluster, direction, up, requestMap);
- } catch (Exception e){
- LOG.error("Error appears during upgrade task submitting", e);
-
- // Any error caused in the createUpgrade will initiate transaction rollback
- // As we operate inside with cluster data, any cache which belongs to cluster need to be flushed
- cluster.invalidateData();
- throw e;
- }
+ return createUpgrade(cluster, direction, up, requestMap);
+ } catch (Exception e) {
+ LOG.error("Error appears during upgrade task submitting", e);
+
+ // Any error caused in the createUpgrade will initiate transaction
+ // rollback
+ // As we operate inside with cluster data, any cache which belongs to
+ // cluster need to be flushed
+ cluster.invalidateData();
+ throw e;
+ }
}
});
@@ -706,6 +709,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
StackId targetStackId = null;
Set<String> supportedServices = new HashSet<>();
+ UpgradeScope scope = UpgradeScope.COMPLETE;
switch (direction) {
case UPGRADE:
@@ -733,6 +737,10 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
for (AvailableService available : services) {
supportedServices.add(available.getName());
}
+
+ if (!services.isEmpty()) {
+ scope = UpgradeScope.PARTIAL;
+ }
}
}
@@ -747,7 +755,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
UpgradeContext ctx = new UpgradeContext(resolver, sourceStackId, targetStackId, version,
direction, pack.getType());
ctx.setSupportedServices(supportedServices);
-
+ ctx.setScope(scope);
if (direction.isDowngrade()) {
if (requestMap.containsKey(UPGRADE_FROM_VERSION)) {
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
index 05aecac..49b2b45 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
@@ -27,6 +27,7 @@ import java.util.Set;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.stack.MasterHostResolver;
import org.apache.ambari.server.state.stack.upgrade.Direction;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeScope;
import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
/**
@@ -88,6 +89,8 @@ public class UpgradeContext {
private Set<String> m_supported = new HashSet<>();
+ private UpgradeScope m_scope = UpgradeScope.ANY;
+
/**
* Constructor.
*
@@ -378,4 +381,12 @@ public class UpgradeContext {
return false;
}
+
+ public void setScope(UpgradeScope scope) {
+ m_scope = scope;
+ }
+
+ public boolean isScoped(UpgradeScope scope) {
+ return m_scope.isScoped(scope);
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
index 0d9176d..5143bfa 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
@@ -270,6 +270,11 @@ public class UpgradeHelper {
for (Grouping group : upgradePack.getGroups(context.getDirection())) {
+ // !!! grouping is not scoped to context
+ if (!context.isScoped(group.scope)) {
+ continue;
+ }
+
UpgradeGroupHolder groupHolder = new UpgradeGroupHolder();
groupHolder.name = group.name;
groupHolder.title = group.title;
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
index 5e21da5..49bf372 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
@@ -39,6 +39,7 @@ import org.apache.ambari.server.state.Host;
import org.apache.ambari.server.state.MaintenanceState;
import org.apache.ambari.server.state.UpgradeContext;
import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
+import org.apache.commons.lang.StringUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
@@ -96,6 +97,10 @@ public class ClusterGrouping extends Grouping {
@XmlElement(name="task")
public Task task;
+
+ @XmlElement(name="scope")
+ public UpgradeScope scope = UpgradeScope.ANY;
+
}
public class ClusterBuilder extends StageWrapperBuilder {
@@ -215,8 +220,18 @@ public class ClusterGrouping extends Grouping {
String component = execution.component;
ExecuteTask et = (ExecuteTask) execution.task;
- if (null != service && !service.isEmpty() &&
- null != component && !component.isEmpty()) {
+ if (StringUtils.isNotBlank(service) && StringUtils.isNotBlank(component)) {
+
+ // !!! if the context is not scoped for the execute-stage, bail
+ if (!ctx.isScoped(execution.scope)) {
+ return null;
+ }
+
+ // !!! if the context is targeted and does not include the service, bail
+ if (!ctx.isServiceSupported(service)) {
+ return null;
+ }
+
HostsType hosts = ctx.getResolver().getMasterAndHosts(service, component);
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
index 11e9267..3705c43 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
@@ -80,11 +80,9 @@ public class ColocatedGrouping extends Grouping {
}
@Override
- public void add(UpgradeContext ctx, HostsType hostsType, String service,
+ public void add(UpgradeContext context, HostsType hostsType, String service,
boolean clientOnly, ProcessingComponent pc, Map<String, String> params) {
- boolean forUpgrade = ctx.getDirection().isUpgrade();
-
int count = Double.valueOf(Math.ceil(
(double) m_batch.percent / 100 * hostsType.hosts.size())).intValue();
@@ -103,13 +101,13 @@ public class ColocatedGrouping extends Grouping {
TaskProxy proxy = null;
- List<Task> tasks = resolveTasks(forUpgrade, true, pc);
+ List<Task> tasks = resolveTasks(context, true, pc);
if (null != tasks && tasks.size() > 0) {
proxy = new TaskProxy();
proxy.clientOnly = clientOnly;
proxy.message = getStageText("Preparing",
- ctx.getComponentDisplay(service, pc.name), Collections.singleton(host));
+ context.getComponentDisplay(service, pc.name), Collections.singleton(host));
proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, singleHostsType, tasks, params));
proxy.service = service;
proxy.component = pc.name;
@@ -117,22 +115,20 @@ public class ColocatedGrouping extends Grouping {
}
// !!! FIXME upgrade definition have only one step, and it better be a restart
- if (null != pc.tasks && 1 == pc.tasks.size()) {
- Task t = pc.tasks.get(0);
- if (RestartTask.class.isInstance(t)) {
- proxy = new TaskProxy();
- proxy.clientOnly = clientOnly;
- proxy.tasks.add(new TaskWrapper(service, pc.name, Collections.singleton(host), params, t));
- proxy.restart = true;
- proxy.service = service;
- proxy.component = pc.name;
- proxy.message = getStageText("Restarting",
- ctx.getComponentDisplay(service, pc.name), Collections.singleton(host));
- targetList.add(proxy);
- }
+ Task t = resolveTask(context, pc);
+ if (null != t && RestartTask.class.isInstance(t)) {
+ proxy = new TaskProxy();
+ proxy.clientOnly = clientOnly;
+ proxy.tasks.add(new TaskWrapper(service, pc.name, Collections.singleton(host), params, t));
+ proxy.restart = true;
+ proxy.service = service;
+ proxy.component = pc.name;
+ proxy.message = getStageText("Restarting",
+ context.getComponentDisplay(service, pc.name), Collections.singleton(host));
+ targetList.add(proxy);
}
- tasks = resolveTasks(forUpgrade, false, pc);
+ tasks = resolveTasks(context, false, pc);
if (null != tasks && tasks.size() > 0) {
proxy = new TaskProxy();
@@ -141,7 +137,7 @@ public class ColocatedGrouping extends Grouping {
proxy.service = service;
proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, singleHostsType, tasks, params));
proxy.message = getStageText("Completing",
- ctx.getComponentDisplay(service, pc.name), Collections.singleton(host));
+ context.getComponentDisplay(service, pc.name), Collections.singleton(host));
targetList.add(proxy);
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
index 5af893e..67d7fdb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Grouping.java
@@ -17,16 +17,6 @@
*/
package org.apache.ambari.server.state.stack.upgrade;
-import org.apache.ambari.server.stack.HostsType;
-import org.apache.ambari.server.state.UpgradeContext;
-import org.apache.ambari.server.state.stack.UpgradePack;
-import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
-import org.apache.ambari.server.utils.SetUtils;
-import org.apache.commons.lang.StringUtils;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlSeeAlso;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@@ -34,6 +24,17 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+
+import org.apache.ambari.server.stack.HostsType;
+import org.apache.ambari.server.state.UpgradeContext;
+import org.apache.ambari.server.state.stack.UpgradePack;
+import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
+import org.apache.ambari.server.utils.SetUtils;
+import org.apache.commons.lang.StringUtils;
+
/**
*
*/
@@ -67,6 +68,9 @@ public class Grouping {
@XmlElement(name="parallel-scheduler")
public ParallelScheduler parallelScheduler;
+ @XmlElement(name="scope")
+ public UpgradeScope scope = UpgradeScope.ANY;
+
/**
* Gets the default builder.
*/
@@ -88,44 +92,43 @@ public class Grouping {
/**
* Add stages where the restart stages are ordered
* E.g., preupgrade, restart hosts(0), ..., restart hosts(n-1), postupgrade
+ * @param context the context
* @param hostsType the order collection of hosts, which may have a master and secondary
* @param service the service name
* @param pc the ProcessingComponent derived from the upgrade pack.
* @param params additional parameters
*/
@Override
- public void add(UpgradeContext ctx, HostsType hostsType, String service,
+ public void add(UpgradeContext context, HostsType hostsType, String service,
boolean clientOnly, ProcessingComponent pc, Map<String, String> params) {
- boolean forUpgrade = ctx.getDirection().isUpgrade();
-
// Construct the pre tasks during Upgrade/Downgrade direction.
// Buckets are grouped by the type, e.g., bucket of all Execute tasks, or all Configure tasks.
- List<TaskBucket> buckets = buckets(resolveTasks(forUpgrade, true, pc));
+ List<TaskBucket> buckets = buckets(resolveTasks(context, true, pc));
for (TaskBucket bucket : buckets) {
// The TaskWrappers take into account if a task is meant to run on all, any, or master.
// A TaskWrapper may contain multiple tasks, but typically only one, and they all run on the same set of hosts.
List<TaskWrapper> preTasks = TaskWrapperBuilder.getTaskList(service, pc.name, hostsType, bucket.tasks, params);
List<List<TaskWrapper>> organizedTasks = organizeTaskWrappersBySyncRules(preTasks);
for (List<TaskWrapper> tasks : organizedTasks) {
- addTasksToStageInBatches(tasks, "Preparing", ctx, service, pc, params);
+ addTasksToStageInBatches(tasks, "Preparing", context, service, pc, params);
}
}
// Add the processing component
- if (null != pc.tasks && 1 == pc.tasks.size()) {
- Task t = pc.tasks.get(0);
+ Task t = resolveTask(context, pc);
+ if (null != t) {
TaskWrapper tw = new TaskWrapper(service, pc.name, hostsType.hosts, params, Collections.singletonList(t));
- addTasksToStageInBatches(Collections.singletonList(tw), t.getActionVerb(), ctx, service, pc, params);
+ addTasksToStageInBatches(Collections.singletonList(tw), t.getActionVerb(), context, service, pc, params);
}
// Construct the post tasks during Upgrade/Downgrade direction.
- buckets = buckets(resolveTasks(forUpgrade, false, pc));
+ buckets = buckets(resolveTasks(context, false, pc));
for (TaskBucket bucket : buckets) {
List<TaskWrapper> postTasks = TaskWrapperBuilder.getTaskList(service, pc.name, hostsType, bucket.tasks, params);
List<List<TaskWrapper>> organizedTasks = organizeTaskWrappersBySyncRules(postTasks);
for (List<TaskWrapper> tasks : organizedTasks) {
- addTasksToStageInBatches(tasks, "Completing", ctx, service, pc, params);
+ addTasksToStageInBatches(tasks, "Completing", context, service, pc, params);
}
}
@@ -157,7 +160,7 @@ public class Grouping {
subTasks.add(tw);
}
}
-
+
if (!subTasks.isEmpty()) {
groupedTasks.add(subTasks);
}
@@ -208,7 +211,7 @@ public class Grouping {
}
}
}
-
+
/**
* Determine if service checks need to be ran after the stages.
* @param upgradeContext the upgrade context
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
index e96c7ff..ec7279c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilder.java
@@ -195,23 +195,56 @@ public abstract class StageWrapperBuilder {
* <li>When performing a downgrade, use the downgrade tasks if they are defined</li>
* <li>When performing a downgrade, but no downgrade tasks exist, reuse the upgrade tasks</li>
* </ul>
- * @param forUpgrade {@code true} if resolving for an upgrade, {@code false} for downgrade
+ * @param context the upgrade context
* @param preTasks {@code true} if loading pre-upgrade or pre-downgrade
* @param pc the processing component holding task definitions
* @return A collection, potentially empty, of the tasks to run, which may contain either
* pre or post tasks if they exist, and the order depends on whether it's an upgrade or downgrade.
*/
- protected List<Task> resolveTasks(boolean forUpgrade, boolean preTasks, ProcessingComponent pc) {
+ protected List<Task> resolveTasks(final UpgradeContext context, boolean preTasks, ProcessingComponent pc) {
if (null == pc) {
return Collections.emptyList();
}
+ boolean forUpgrade = context.getDirection().isUpgrade();
+
+ final List<Task> interim;
+
if (forUpgrade) {
- return preTasks ? pc.preTasks : pc.postTasks;
+ interim = preTasks ? pc.preTasks : pc.postTasks;
} else {
- return preTasks ?
+ interim = preTasks ?
(null == pc.preDowngradeTasks ? pc.preTasks : pc.preDowngradeTasks) :
(null == pc.postDowngradeTasks ? pc.postTasks : pc.postDowngradeTasks);
}
+
+ if (null == interim || interim.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ List<Task> tasks = new ArrayList<>();
+ for (Task t : interim) {
+ if (context.isScoped(t.scope)) {
+ tasks.add(t);
+ }
+ }
+
+ return tasks;
+ }
+
+ /**
+ * The upgrade packs are written such that there is one and only one upgrade element
+ * for a component, all other directives go in (pre|post)-(upgrade|downgrade) elements.
+ * @param pc the processing component
+ * @return the single task, or {@code null} if there is none
+ */
+ protected Task resolveTask(UpgradeContext context, ProcessingComponent pc) {
+ if (null != pc.tasks && 1 == pc.tasks.size()) {
+ if (context.isScoped(pc.tasks.get(0).scope)) {
+ return pc.tasks.get(0);
+ }
+ }
+
+ return null;
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Task.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Task.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Task.java
index f365a7f..5c43c2b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Task.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/Task.java
@@ -56,6 +56,13 @@ public abstract class Task {
*/
public abstract String getActionVerb();
+ /**
+ * The scope for the task
+ */
+ @XmlElement(name = "scope")
+ public UpgradeScope scope = UpgradeScope.ANY;
+
+
@Override
public String toString() {
return getType().toString();
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/UpgradeScope.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/UpgradeScope.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/UpgradeScope.java
new file mode 100644
index 0000000..f35bd68
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/UpgradeScope.java
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.state.stack.upgrade;
+
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlEnumValue;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Indicates the scope of a group or task
+ */
+@XmlEnum
+public enum UpgradeScope {
+
+ /**
+ * Used only when completely upgrading the cluster.
+ */
+ @XmlEnumValue("COMPLETE")
+ @SerializedName("rolling_upgrade")
+ COMPLETE,
+
+ /**
+ * Used only when partially upgrading the cluster.
+ */
+ @XmlEnumValue("PARTIAL")
+ @SerializedName("partial")
+ PARTIAL,
+
+ /**
+ * Used for any scoped upgrade.
+ */
+ @XmlEnumValue("ANY")
+ @SerializedName("any")
+ ANY;
+
+ public boolean isScoped(UpgradeScope scope) {
+ if (ANY == this || ANY == scope) {
+ return true;
+ }
+
+ return this == scope;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
index 4fd3316..b82f786 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.2.xml
@@ -524,6 +524,7 @@
that are installed on the hosts but not known by Ambari.
-->
<group xsi:type="cluster" name="ALL_HOST_OPS" title="Set Version On All Hosts">
+ <scope>COMPLETE</scope>
<skippable>true</skippable>
<supports-auto-skip-failure>false</supports-auto-skip-failure>
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
index 38ee39b..7b635bf 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
@@ -332,6 +332,7 @@
</group>
<group xsi:type="cluster" name="ALL_HOST_OPS" title="Finalize Hosts">
+ <scope>COMPLETE</scope>
<execute-stage title="Update remaining HDP stack to {{version}}">
<task xsi:type="execute">
<script>scripts/ru_set_all.py</script>
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
index ac84443..2d54038 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
@@ -605,6 +605,7 @@
that are installed on the hosts but not known by Ambari.
-->
<group xsi:type="cluster" name="ALL_HOST_OPS" title="Set Version On All Hosts">
+ <scope>COMPLETE</scope>
<skippable>true</skippable>
<supports-auto-skip-failure>false</supports-auto-skip-failure>
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
index 508483e..52a735b 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
@@ -393,6 +393,7 @@
</group>
<group xsi:type="cluster" name="ALL_HOST_OPS" title="Finalize Hosts">
+ <scope>COMPLETE</scope>
<execute-stage title="Update remaining HDP stack to {{version}}">
<task xsi:type="execute">
<script>scripts/ru_set_all.py</script>
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
index 3863877..622a737 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/nonrolling-upgrade-2.4.xml
@@ -600,6 +600,7 @@
that are installed on the hosts but not known by Ambari.
-->
<group xsi:type="cluster" name="ALL_HOST_OPS" title="Set Version On All Hosts">
+ <scope>COMPLETE</scope>
<skippable>true</skippable>
<supports-auto-skip-failure>false</supports-auto-skip-failure>
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml
index e45e851..a73dc92 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/upgrade-2.4.xml
@@ -391,6 +391,7 @@
</group>
<group xsi:type="cluster" name="ALL_HOST_OPS" title="Finalize Hosts">
+ <scope>COMPLETE</scope>
<execute-stage title="Update remaining HDP stack to {{version}}">
<task xsi:type="execute">
<script>scripts/ru_set_all.py</script>
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/main/resources/version_definition.xsd
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/version_definition.xsd b/ambari-server/src/main/resources/version_definition.xsd
index 77b4203..42035de 100644
--- a/ambari-server/src/main/resources/version_definition.xsd
+++ b/ambari-server/src/main/resources/version_definition.xsd
@@ -54,6 +54,7 @@
<xs:enumeration value="ubuntu12" />
<xs:enumeration value="ubuntu14" />
<xs:enumeration value="suse11" />
+ <xs:enumeration value="amazon2015" />
</xs:restriction>
</xs:simpleType>
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index a0ac966..3e372f5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -36,9 +36,6 @@ import static org.junit.Assert.fail;
import java.io.StringReader;
import java.lang.reflect.Type;
-import java.net.ConnectException;
-import java.net.MalformedURLException;
-import java.net.UnknownHostException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -107,7 +104,6 @@ import org.apache.ambari.server.orm.entities.WidgetLayoutUserWidgetEntity;
import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.security.authorization.AuthorizationException;
import org.apache.ambari.server.security.authorization.Users;
-import org.apache.ambari.server.security.authorization.internal.InternalAuthenticationToken;
import org.apache.ambari.server.serveraction.ServerAction;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
@@ -156,6 +152,7 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.security.core.context.SecurityContextHolder;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
@@ -165,7 +162,6 @@ import com.google.inject.Injector;
import com.google.inject.persist.PersistService;
import junit.framework.Assert;
-import org.springframework.security.core.context.SecurityContextHolder;
public class AmbariManagementControllerTest {
@@ -7183,7 +7179,7 @@ public class AmbariManagementControllerTest {
Assert.assertEquals(1, responsesWithParams.size());
StackVersionResponse resp = responsesWithParams.iterator().next();
assertNotNull(resp.getUpgradePacks());
- assertEquals(8, resp.getUpgradePacks().size());
+ assertEquals(9, resp.getUpgradePacks().size());
assertTrue(resp.getUpgradePacks().contains("upgrade_test"));
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
index b15157e..d513448 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
@@ -60,6 +60,7 @@ import org.apache.ambari.server.state.stack.upgrade.ManualTask;
import org.apache.ambari.server.state.stack.upgrade.StageWrapper;
import org.apache.ambari.server.state.stack.upgrade.Task;
import org.apache.ambari.server.state.stack.upgrade.TaskWrapper;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeScope;
import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
import org.apache.ambari.server.utils.EventBusSynchronizer;
import org.easymock.EasyMock;
@@ -133,26 +134,6 @@ public class UpgradeHelperTest {
m_masterHostResolver = EasyMock.createMock(MasterHostResolver.class);
m_managementController = injector.getInstance(AmbariManagementController.class);
-// StackDAO stackDAO = injector.getInstance(StackDAO.class);
-// StackEntity stackEntity = new StackEntity();
-// stackEntity.setStackName("HDP");
-// stackEntity.setStackVersion("2.1");
-// stackDAO.create(stackEntity);
-//
-// StackEntity stackEntityTo = new StackEntity();
-// stackEntityTo.setStackName("HDP");
-// stackEntityTo.setStackVersion("2.2");
-// stackDAO.create(stackEntityTo);
-//
-// Clusters clusters = injector.getInstance(Clusters.class);
-// clusters.addCluster("c1", new StackId("HDP", "2.1"));
-//
-// RepositoryVersionDAO repositoryVersionDAO = injector.getInstance(RepositoryVersionDAO.class);
-// repositoryVersionDAO.create(stackEntity, "2.1.1", "2.1.1", "");
-// repositoryVersionDAO.create(stackEntityTo, "2.2.0", "2.2.0", "");
-//
-// replay(m_configHelper);
-
// Set the authenticated user
// TODO: remove this or replace the authenticated user to test authorization rules
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator("admin"));
@@ -260,7 +241,7 @@ public class UpgradeHelperTest {
}
@Test
- public void testSupportedServiceUpgradeOrchestration() throws Exception {
+ public void testPartialUpgradeOrchestration() throws Exception {
Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", "bar");
assertTrue(upgrades.isEmpty());
@@ -271,8 +252,8 @@ public class UpgradeHelperTest {
ComponentInfo ci = si.getComponentByName("ZOOKEEPER_SERVER");
ci.setDisplayName("ZooKeeper1 Server2");
- assertTrue(upgrades.containsKey("upgrade_test"));
- UpgradePack upgrade = upgrades.get("upgrade_test");
+ assertTrue(upgrades.containsKey("upgrade_test_partial"));
+ UpgradePack upgrade = upgrades.get("upgrade_test_partial");
assertNotNull(upgrade);
makeCluster();
@@ -280,7 +261,11 @@ public class UpgradeHelperTest {
UpgradeContext context = new UpgradeContext(m_masterHostResolver, HDP_21,
HDP_21, UPGRADE_VERSION, Direction.UPGRADE, UpgradeType.ROLLING);
context.setSupportedServices(Collections.singleton("ZOOKEEPER"));
+ context.setScope(UpgradeScope.PARTIAL);
+ List<Grouping> groupings = upgrade.getGroups(Direction.UPGRADE);
+ assertEquals(8, groupings.size());
+ assertEquals(UpgradeScope.COMPLETE, groupings.get(6).scope);
List<UpgradeGroupHolder> groups = m_upgradeHelper.createSequence(upgrade, context);
@@ -290,26 +275,77 @@ public class UpgradeHelperTest {
assertEquals("ZOOKEEPER", groups.get(1).name);
assertEquals("POST_CLUSTER", groups.get(2).name);
-
UpgradeGroupHolder group = groups.get(1);
// check that the display name is being used
assertTrue(group.items.get(1).getText().contains("ZooKeeper1 Server2"));
- assertEquals(group.items.get(5).getText(), "Service Check Zk");
+ assertEquals("Service Check Zk", group.items.get(6).getText());
UpgradeGroupHolder postGroup = groups.get(2);
assertEquals("POST_CLUSTER", postGroup.name);
assertEquals("Finalize Upgrade", postGroup.title);
- assertEquals(3, postGroup.items.size());
+ assertEquals(2, postGroup.items.size());
assertEquals("Confirm Finalize", postGroup.items.get(0).getText());
- assertEquals("Execute HDFS Finalize", postGroup.items.get(1).getText());
- assertEquals("Save Cluster State", postGroup.items.get(2).getText());
- assertEquals(StageWrapper.Type.SERVER_SIDE_ACTION, postGroup.items.get(2).getType());
+ assertEquals("Save Cluster State", postGroup.items.get(1).getText());
+ assertEquals(StageWrapper.Type.SERVER_SIDE_ACTION, postGroup.items.get(1).getType());
- assertEquals(4, groups.get(0).items.size());
- assertEquals(6, groups.get(1).items.size());
- assertEquals(3, groups.get(2).items.size());
+ assertEquals(3, groups.get(0).items.size());
+ assertEquals(7, groups.get(1).items.size());
+ assertEquals(2, groups.get(2).items.size());
}
+ @Test
+ public void testCompleteUpgradeOrchestration() throws Exception {
+ Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", "bar");
+ assertTrue(upgrades.isEmpty());
+
+ upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1");
+
+ ServiceInfo si = ambariMetaInfo.getService("HDP", "2.1.1", "ZOOKEEPER");
+ si.setDisplayName("Zk");
+ ComponentInfo ci = si.getComponentByName("ZOOKEEPER_SERVER");
+ ci.setDisplayName("ZooKeeper1 Server2");
+
+ assertTrue(upgrades.containsKey("upgrade_test_partial"));
+ UpgradePack upgrade = upgrades.get("upgrade_test_partial");
+ assertNotNull(upgrade);
+
+ makeCluster();
+
+ UpgradeContext context = new UpgradeContext(m_masterHostResolver, HDP_21,
+ HDP_21, UPGRADE_VERSION, Direction.UPGRADE, UpgradeType.ROLLING);
+ context.setSupportedServices(Collections.singleton("ZOOKEEPER"));
+ context.setScope(UpgradeScope.COMPLETE);
+
+ List<Grouping> groupings = upgrade.getGroups(Direction.UPGRADE);
+ assertEquals(8, groupings.size());
+ assertEquals(UpgradeScope.COMPLETE, groupings.get(6).scope);
+
+ List<UpgradeGroupHolder> groups = m_upgradeHelper.createSequence(upgrade, context);
+
+ assertEquals(4, groups.size());
+
+ assertEquals("PRE_CLUSTER", groups.get(0).name);
+ assertEquals("ZOOKEEPER", groups.get(1).name);
+ assertEquals("ALL_HOSTS", groups.get(2).name);
+ assertEquals("POST_CLUSTER", groups.get(3).name);
+
+ UpgradeGroupHolder group = groups.get(1);
+ // check that the display name is being used
+ assertTrue(group.items.get(1).getText().contains("ZooKeeper1 Server2"));
+ assertEquals("Service Check Zk", group.items.get(5).getText());
+
+ UpgradeGroupHolder postGroup = groups.get(3);
+ assertEquals("POST_CLUSTER", postGroup.name);
+ assertEquals("Finalize Upgrade", postGroup.title);
+ assertEquals(2, postGroup.items.size());
+ assertEquals("Confirm Finalize", postGroup.items.get(0).getText());
+ assertEquals("Save Cluster State", postGroup.items.get(1).getText());
+ assertEquals(StageWrapper.Type.SERVER_SIDE_ACTION, postGroup.items.get(1).getType());
+
+ assertEquals(3, groups.get(0).items.size());
+ assertEquals(6, groups.get(1).items.size());
+ assertEquals(1, groups.get(2).items.size());
+ }
@Test
public void testUpgradeServerActionOrchestration() throws Exception {
http://git-wip-us.apache.org/repos/asf/ambari/blob/03bc2260/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml
new file mode 100644
index 0000000..4932e92
--- /dev/null
+++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test_partial.xml
@@ -0,0 +1,259 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <target>2.2.*.*</target>
+ <target-stack>HDP-2.2.0</target-stack>
+ <type>ROLLING</type>
+
+ <prerequisite-checks>
+ <!-- List of additional pre-req checks to run in addition to the required pre-reqs -->
+ <check>org.apache.ambari.server.checks.HiveMultipleMetastoreCheck</check>
+ <check>org.apache.ambari.server.checks.MapReduce2JobHistoryStatePreservingCheck</check>
+ <check>org.apache.ambari.server.checks.SecondaryNamenodeDeletedCheck</check>
+ <check>org.apache.ambari.server.checks.ServicesMapReduceDistributedCacheCheck</check>
+ <check>org.apache.ambari.server.checks.ServicesNamenodeHighAvailabilityCheck</check>
+ <check>org.apache.ambari.server.checks.ServicesTezDistributedCacheCheck</check>
+ <check>org.apache.ambari.server.checks.ServicesYarnWorkPreservingCheck</check>
+ <check>org.apache.ambari.server.checks.YarnRMHighAvailabilityCheck</check>
+ <check>org.apache.ambari.server.checks.YarnTimelineServerStatePreservingCheck</check>
+ </prerequisite-checks>
+
+ <order>
+ <group xsi:type="cluster" name="PRE_CLUSTER" title="Pre {{direction.text.proper}}">
+ <execute-stage title="Confirm 1">
+ <task xsi:type="manual">
+ <message>Foo</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Pre Upgrade HIVE">
+ <task xsi:type="manual">
+ <message>Back stuff up.</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Finalize HDFS">
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </execute-stage>
+ <execute-stage title="Confirm 2">
+ <task xsi:type="manual">
+ <message>Foo</message>
+ </task>
+ </execute-stage>
+ </group>
+
+ <group name="ZOOKEEPER" title="Zookeeper">
+ <skippable>true</skippable>
+ <allow-retry>false</allow-retry>
+ <service name="ZOOKEEPER">
+ <component>ZOOKEEPER_SERVER</component>
+ <component>ZOOKEEPER_CLIENT</component>
+ </service>
+ </group>
+
+ <group name="CORE_MASTER" title="Core Masters">
+ <service name="HDFS">
+ <component>JOURNALNODE</component>
+ <component>NAMENODE</component>
+ </service>
+ <service name="YARN">
+ <component>RESOURCEMANAGER</component>
+ </service>
+ </group>
+
+ <group name="CORE_SLAVES" title="Core Slaves" xsi:type="colocated">
+ <skippable>true</skippable> <!-- set skippable for test -->
+ <allow-retry>false</allow-retry> <!-- set no retry for test -->
+ <service name="HDFS">
+ <component>DATANODE</component>
+ </service>
+ <service name="HBASE">
+ <component>REGIONSERVER</component>
+ </service>
+ <service name="YARN">
+ <component>NODEMANAGER</component>
+ </service>
+
+ <batch>
+ <percent>20</percent>
+ <message>Please run additional tests on {{components}}</message>
+ </batch>
+ </group>
+
+ <group name="HIVE" title="Hive">
+ <skippable>true</skippable>
+ <service name="HIVE">
+ <component>HIVE_METASTORE</component>
+ <component>HIVE_SERVER</component>
+ <component>WEBHCAT_SERVER</component>
+ </service>
+ </group>
+
+ <group name="OOZIE" title="Oozie">
+ <skippable>true</skippable>
+ <supports-auto-skip-failure>false</supports-auto-skip-failure>
+ <service-check>false</service-check>
+ <service name="OOZIE">
+ <component>OOZIE_SERVER</component>
+ <component>OOZIE_CLIENT</component>
+ </service>
+ </group>
+
+ <group xsi:type="cluster" name="ALL_HOSTS" title="All Hosts">
+ <scope>COMPLETE</scope>
+ <execute-stage title="All Hosts">
+ <task xsi:type="manual">
+ <message>Something to run on all hosts</message>
+ </task>
+ </execute-stage>
+ </group>
+
+ <group xsi:type="cluster" name="POST_CLUSTER" title="Finalize {{direction.text.proper}}">
+ <execute-stage title="Confirm Finalize">
+ <task xsi:type="manual">
+ <message>Please confirm you are ready to finalize</message>
+ </task>
+ </execute-stage>
+ <execute-stage service="HDFS" component="NAMENODE" title="Execute HDFS Finalize">
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </execute-stage>
+ <execute-stage title="Save Cluster State" service="" component="">
+ <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction">
+ </task>
+ </execute-stage>
+ </group>
+ </order>
+
+ <processing>
+ <service name="ZOOKEEPER">
+ <component name="ZOOKEEPER_SERVER">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <summary>SUMMARY OF PREPARE</summary>
+ <message>This is a manual task with a placeholder of {{foo/bar}}</message>
+ </task>
+ <task xsi:type="manual">
+ <scope>PARTIAL</scope>
+ <summary>Only partials</summary>
+ <message>This is only for partials</message>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ <post-upgrade>
+ <task xsi:type="configure" id="2.2.0" />
+ </post-upgrade>
+ </component>
+ </service>
+
+ <service name="HDFS">
+ <component name="NAMENODE">
+ <pre-upgrade>
+ <task xsi:type="execute" hosts="master">
+ <command>su - {hdfs-user} -c 'dosomething'</command>
+ </task>
+ <task xsi:type="configure" id="hdp_2_1_1_nn_pre_upgrade" />
+ <task xsi:type="manual">
+ <message>{{direction.verb.proper}} your database</message>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ <post-upgrade>
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </post-upgrade>
+ </component>
+ <component name="DATANODE">
+ <pre-downgrade />
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ <post-downgrade>
+ <task xsi:type="manual">
+ <message>Manual Downgrade</message>
+ </task>
+ </post-downgrade>
+ </component>
+ </service>
+
+ <service name="YARN">
+ <component name="RESOURCEMANAGER">
+ <pre-upgrade>
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ </pre-upgrade>
+ </component>
+ <component name="NODEMANAGER">
+ <pre-upgrade>
+ <task xsi:type="execute">
+ <command>ls</command>
+ </task>
+ <task xsi:type="configure" id="hdp_2_1_1_nm_pre_upgrade"/>
+ </pre-upgrade>
+ </component>
+ </service>
+
+ <service name="HIVE">
+ <component name="HIVE_SERVER">
+ <pre-upgrade>
+ <task xsi:type="manual">
+ <summary>HiveServer Port Availability</summary>
+ <message>The HiveServer port will now change to 10010 if hive is using a binary transfer mode or 10011 if hive is using an http transport mode. You can use "netstat -anp | grep 1001[01]" to determine if the port is available on each of following HiveServer host(s): {{hosts.all}}. If the port is not available, the process using it must be terminated.</message>
+ </task>
+ <task xsi:type="configure" id="hdp_2_1_1_set_transport_mode"/>
+ <task xsi:type="configure" id="hdp_2_1_1_hive_server_foo"/>
+ </pre-upgrade>
+ </component>
+ </service>
+
+ <service name="OOZIE">
+ <component name="OOZIE_SERVER">
+ <pre-upgrade>
+ <!-- This is important, do not remove it since UpgradeHelperTest.java :
+ testUpgradeWithMultipleTasksWithMultipleHostTypes() asserts
+ that these tasks each run on their own stage. -->
+ <task xsi:type="execute" hosts="all" sequential="true" summary="Shut down all Oozie servers">
+ <script>scripts/oozie_server.py</script>
+ <function>stop</function>
+ </task>
+
+ <task xsi:type="execute" hosts="any" sequential="true" summary="Upgrading the Oozie database and creating a new sharelib">
+ <script>scripts/oozie_server_upgrade.py</script>
+ <function>upgrade_oozie_database_and_sharelib</function>
+ </task>
+ </pre-upgrade>
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ </component>
+
+ <component name="OOZIE_CLIENT">
+ <upgrade>
+ <task xsi:type="restart-task" />
+ </upgrade>
+ </component>
+ </service>
+ </processing>
+</upgrade>