Repository: ambari Updated Branches: refs/heads/trunk 46fb0471c -> e58e53fab
AMBARI-9027. Create Downgrade Pack for 2.2.* to 2.2.* (ncole) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e58e53fa Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e58e53fa Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e58e53fa Branch: refs/heads/trunk Commit: e58e53fab4ed4c83d5e0b7248e6b7900a3505157 Parents: 46fb047 Author: Nate Cole <[email protected]> Authored: Wed Jan 7 11:48:47 2015 -0500 Committer: Nate Cole <[email protected]> Committed: Wed Jan 7 15:04:01 2015 -0500 ---------------------------------------------------------------------- .../internal/UpgradeResourceProvider.java | 23 +++++- .../ambari/server/state/UpgradeHelper.java | 60 +++++++++++++-- .../ambari/server/state/stack/UpgradePack.java | 11 ++- .../state/stack/upgrade/ClusterGrouping.java | 3 +- .../state/stack/upgrade/ColocatedGrouping.java | 15 ++-- .../server/state/stack/upgrade/Grouping.java | 7 +- .../stack/upgrade/StageWrapperBuilder.java | 26 ++++++- .../stacks/HDP/2.2/upgrades/upgrade-2.2.xml | 12 +++ .../internal/UpgradeResourceProviderTest.java | 2 +- .../ambari/server/state/UpgradeHelperTest.java | 43 +++++++++-- .../server/state/stack/UpgradePackTest.java | 80 +++++++------------- .../stacks/HDP/2.1.1/upgrades/upgrade_test.xml | 10 ++- 12 files changed, 205 insertions(+), 87 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/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 2b580f6..9eb0d4b 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 @@ -17,7 +17,9 @@ */ package org.apache.ambari.server.controller.internal; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_LOCATION; +import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER; import java.util.ArrayList; import java.util.Arrays; @@ -81,9 +83,6 @@ import org.apache.ambari.server.utils.StageUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER; - import com.google.inject.Inject; import com.google.inject.Provider; @@ -96,11 +95,13 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider protected static final String UPGRADE_CLUSTER_NAME = "Upgrade/cluster_name"; protected static final String UPGRADE_VERSION = "Upgrade/repository_version"; protected static final String UPGRADE_REQUEST_ID = "Upgrade/request_id"; + protected static final String UPGRADE_FORCE_DOWNGRADE = "Upgrade/force_downgrade"; private static final Set<String> PK_PROPERTY_IDS = new HashSet<String>( Arrays.asList(UPGRADE_REQUEST_ID, UPGRADE_CLUSTER_NAME)); private static final Set<String> PROPERTY_IDS = new HashSet<String>(); + private static final Map<Resource.Type, String> KEY_PROPERTY_IDS = new HashMap<Resource.Type, String>(); @Inject @@ -125,6 +126,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider PROPERTY_IDS.add(UPGRADE_CLUSTER_NAME); PROPERTY_IDS.add(UPGRADE_VERSION); PROPERTY_IDS.add(UPGRADE_REQUEST_ID); + PROPERTY_IDS.add(UPGRADE_FORCE_DOWNGRADE); // !!! boo for (String requestPropertyId : RequestResourceProvider.PROPERTY_IDS) { @@ -173,6 +175,10 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider } }); + if (null == entity) { + throw new SystemException("Could not load upgrade"); + } + notifyCreate(Resource.Type.Upgrade, request); Resource res = new ResourceImpl(Resource.Type.Upgrade); @@ -366,7 +372,16 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider MasterHostResolver mhr = new MasterHostResolver(cluster); UpgradeHelper helper = new UpgradeHelper(); - List<UpgradeGroupHolder> groups = helper.createUpgrade(cluster, mhr, pack); + String forceDowngrade = (String) requestMap.get(UPGRADE_FORCE_DOWNGRADE); + + List<UpgradeGroupHolder> groups = null; + + if (null != forceDowngrade && Boolean.parseBoolean(forceDowngrade)) { + groups = helper.createDowngrade(cluster, mhr, pack); + } else { + groups = helper.createUpgrade(cluster, mhr, pack); + } + if (groups.isEmpty()) { throw new AmbariException("There are no upgrade groupings available"); } http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/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 ae793be..ac30762 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 @@ -19,6 +19,7 @@ package org.apache.ambari.server.state; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -61,22 +62,55 @@ public class UpgradeHelper { private static Logger LOG = LoggerFactory.getLogger(UpgradeHelper.class); /** + * Generates a list of UpgradeGroupHolder items that are used to execute a downgrade + * @param cluster the cluster + * @param mhr Master Host Resolver needed to get master and secondary + * hosts of several components like NAMENODE + * @param upgradePack the upgrade pack + * @return the list of holders + */ + public List<UpgradeGroupHolder> createDowngrade(Cluster cluster, MasterHostResolver mhr, UpgradePack upgradePack) throws AmbariException { + return createSequence(cluster, mhr, upgradePack, false); + } + + /** * Generates a list of UpgradeGroupHolder items that are used to execute an upgrade - * @param cluster the cluster - * @param mhr Master Host Resolver needed to get master and secondary hosts of several components like NAMENODE + * @param cluster the cluster + * @param mhr Master Host Resolver needed to get master and secondary + * hosts of several components like NAMENODE * @param upgradePack the upgrade pack * @return the list of holders */ public List<UpgradeGroupHolder> createUpgrade(Cluster cluster, MasterHostResolver mhr, UpgradePack upgradePack) throws AmbariException { + return createSequence(cluster, mhr, upgradePack, true); + } + + + /** + * Generates a list of UpgradeGroupHolder items that are used to execute an upgrade + * @param cluster the cluster + * @param mhr Master Host Resolver needed to get master and secondary + * hosts of several components like NAMENODE + * @param upgradePack the upgrade pack + * @param forUpgrade {@code true} if the sequence is for an upgrade, {@code false} if for a downgrade + * @return the list of holders + * + */ + private List<UpgradeGroupHolder> createSequence(Cluster cluster, + MasterHostResolver mhr, UpgradePack upgradePack, boolean forUpgrade) + throws AmbariException { Map<String, Map<String, ProcessingComponent>> allTasks = upgradePack.getTasks(); List<UpgradeGroupHolder> groups = new ArrayList<UpgradeGroupHolder>(); + int idx = 0; + for (Grouping group : upgradePack.getGroups()) { if (ClusterGrouping.class.isInstance(group)) { UpgradeGroupHolder groupHolder = getClusterGroupHolder(cluster, (ClusterGrouping) group); if (null != groupHolder) { groups.add(groupHolder); + idx++; continue; } } @@ -89,7 +123,15 @@ public class UpgradeHelper { StageWrapperBuilder builder = group.getBuilder(); - for (UpgradePack.OrderService service : group.services) { + List<UpgradePack.OrderService> services = group.services; + + if (!forUpgrade) { + List<UpgradePack.OrderService> reverse = new ArrayList<UpgradePack.OrderService>(services); + Collections.reverse(reverse); + services = reverse; + } + + for (UpgradePack.OrderService service : services) { if (!allTasks.containsKey(service.serviceName)) { continue; @@ -125,10 +167,12 @@ public class UpgradeHelper { throw new AmbariException(MessageFormat.format("Could not find active and standby namenodes using hosts: {0}", StringUtils.join(hostsType.hosts, ", ").toString())); } - builder.add(hostsType, service.serviceName, svc.isClientOnlyService(), pc); + builder.add(hostsType, service.serviceName, forUpgrade, + svc.isClientOnlyService(), pc); } else { - builder.add(hostsType, service.serviceName, svc.isClientOnlyService(), pc); + builder.add(hostsType, service.serviceName, forUpgrade, + svc.isClientOnlyService(), pc); } } } @@ -137,7 +181,11 @@ public class UpgradeHelper { if (!proxies.isEmpty()) { groupHolder.items = proxies; - groups.add(groupHolder); + if (forUpgrade) { + groups.add(groupHolder); + } else { + groups.add(idx, groupHolder); + } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java index 736a99c..1662baa 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java @@ -29,7 +29,6 @@ import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; -import org.apache.ambari.server.state.stack.upgrade.Batch; import org.apache.ambari.server.state.stack.upgrade.Grouping; import org.apache.ambari.server.state.stack.upgrade.Task; @@ -131,6 +130,11 @@ public class UpgradePack { @XmlElement(name="task") public List<Task> preTasks; + @XmlElementWrapper(name="pre-downgrade") + @XmlElement(name="task") + public List<Task> preDowngradeTasks; + + @XmlElementWrapper(name="upgrade") @XmlElement(name="task") public List<Task> tasks; @@ -139,8 +143,9 @@ public class UpgradePack { @XmlElement(name="task") public List<Task> postTasks; - @XmlElement(name="batch") - public Batch batch; + @XmlElementWrapper(name="post-downgrade") + @XmlElement(name="task") + public List<Task> postDowngradeTasks; } http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/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 a9acafb..ef605ec 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 @@ -90,7 +90,8 @@ public class ClusterGrouping extends Grouping { } @Override - public void add(HostsType hostsType, String service, boolean clientOnly, ProcessingComponent pc) { + public void add(HostsType hostsType, String service, + boolean forUpgrade, boolean clientOnly, ProcessingComponent pc) { // !!! no-op in this case } http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/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 2c6a6e2..0d19b76 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 @@ -66,7 +66,8 @@ public class ColocatedGrouping extends Grouping { } @Override - public void add(HostsType hostsType, String service, boolean clientOnly, ProcessingComponent pc) { + public void add(HostsType hostsType, String service, + boolean forUpgrade, boolean clientOnly, ProcessingComponent pc) { int count = Double.valueOf(Math.ceil( (double) batch.percent / 100 * hostsType.hosts.size())).intValue(); @@ -86,11 +87,13 @@ public class ColocatedGrouping extends Grouping { TaskProxy proxy = null; - if (null != pc.preTasks && pc.preTasks.size() > 0) { + List<Task> tasks = resolveTasks(forUpgrade, true, pc); + + if (null != tasks && tasks.size() > 0) { proxy = new TaskProxy(); proxy.clientOnly = clientOnly; proxy.message = getStageText("Preparing", pc.name, Collections.singleton(host)); - proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, singleHostsType, pc.preTasks)); + proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, singleHostsType, tasks)); proxy.service = service; proxy.component = pc.name; targetList.add(proxy); @@ -112,12 +115,14 @@ public class ColocatedGrouping extends Grouping { } } - if (null != pc.postTasks && pc.postTasks.size() > 0) { + tasks = resolveTasks(forUpgrade, false, pc); + + if (null != tasks && tasks.size() > 0) { proxy = new TaskProxy(); proxy.clientOnly = clientOnly; proxy.component = pc.name; proxy.service = service; - proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, singleHostsType, pc.postTasks)); + proxy.tasks.addAll(TaskWrapperBuilder.getTaskList(service, pc.name, singleHostsType, tasks)); proxy.message = getStageText("Completing", pc.name, Collections.singleton(host)); targetList.add(proxy); } http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/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 3a7a0bf..b4a75ae 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 @@ -74,9 +74,10 @@ public class Grouping { * @param pc the ProcessingComponent derived from the upgrade pack. */ @Override - public void add(HostsType hostsType, String service, boolean clientOnly, ProcessingComponent pc) { + public void add(HostsType hostsType, String service, + boolean forUpgrade, boolean clientOnly, ProcessingComponent pc) { - List<TaskBucket> buckets = buckets(pc.preTasks); + List<TaskBucket> buckets = buckets(resolveTasks(forUpgrade, true, pc)); for (TaskBucket bucket : buckets) { List<TaskWrapper> preTasks = TaskWrapperBuilder.getTaskList(service, pc.name, hostsType, bucket.tasks); Set<String> preTasksEffectiveHosts = TaskWrapperBuilder.getEffectiveHosts(preTasks); @@ -102,7 +103,7 @@ public class Grouping { } } - buckets = buckets(pc.postTasks); + buckets = buckets(resolveTasks(forUpgrade, false, pc)); for (TaskBucket bucket : buckets) { List<TaskWrapper> postTasks = TaskWrapperBuilder.getTaskList(service, pc.name, hostsType, bucket.tasks); Set<String> postTasksEffectiveHosts = TaskWrapperBuilder.getEffectiveHosts(postTasks); http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/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 c0cf756..ee02a12 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 @@ -33,10 +33,12 @@ public abstract class StageWrapperBuilder { * * @param hostsType the hosts, along with their type * @param service the service name + * @param forUpgrade {@code true} when performing an upgrade, {@code false} for a downgrade * @param clientOnly whether the service is client only, no service checks * @param pc the ProcessingComponent derived from the upgrade pack */ - public abstract void add(HostsType hostsType, String service, boolean clientOnly, ProcessingComponent pc); + public abstract void add(HostsType hostsType, String service, + boolean forUpgrade, boolean clientOnly, ProcessingComponent pc); /** * Builds the stage wrappers. @@ -58,5 +60,27 @@ public abstract class StageWrapperBuilder { 1 == hosts.size() ? "" : " hosts"); } + /** + * Determine the list of tasks given these rules + * <ul> + * <li>When performing an upgrade, only use upgrade tasks</li> + * <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 preTasks {@code true} if loading pre-upgrade or pre-downgrade + * @param pc the processing component holding task definitions + * @return + */ + protected List<Task> resolveTasks(boolean forUpgrade, boolean preTasks, ProcessingComponent pc) { + if (forUpgrade) { + return preTasks ? pc.preTasks : pc.postTasks; + } else { + return preTasks ? + (null == pc.preDowngradeTasks ? pc.preTasks : pc.preDowngradeTasks) : + (null == pc.postDowngradeTasks ? pc.postTasks : pc.postDowngradeTasks); + } + } + } http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/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 73563cb..4549da0 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 @@ -320,6 +320,18 @@ <value>10010</value> </task> </pre-upgrade> + + <pre-downgrade> + <task xsi:type="manual"> + <message>The HiveServer port will now change to 10000. Ensure that this port is available on each HiveServer instance.</message> + </task> + + <task xsi:type="configure"> + <type>hive-site</type> + <key>hive.server2.thrift.port</key> + <value>10000</value> + </task> + </pre-downgrade> <upgrade> <task xsi:type="restart" /> http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java index 15c0c0c..2bb34d6 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java @@ -174,7 +174,7 @@ public class UpgradeResourceProviderTest { assertTrue(group.getItems().get(0).getText().contains("Preparing")); assertTrue(group.getItems().get(1).getText().contains("Restarting")); - assertTrue(group.getItems().get(2).getText().contains("Completing")); + assertTrue(group.getItems().get(2).getText().contains("Updating")); assertTrue(group.getItems().get(3).getText().contains("Service Check")); ActionManager am = injector.getInstance(ActionManager.class); http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/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 3266d9e..53505f2 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 @@ -77,7 +77,7 @@ public class UpgradeHelperTest { } @Test - public void testOrchestration() throws Exception { + public void testUpgradeOrchestration() throws Exception { Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", "bar"); assertTrue(upgrades.isEmpty()); @@ -88,12 +88,9 @@ public class UpgradeHelperTest { Cluster cluster = makeCluster(); - UpgradeHelper helper = new UpgradeHelper(); List<UpgradeGroupHolder> groups = helper.createUpgrade(cluster, m_masterHostResolver, upgrade); - - assertEquals(5, groups.size()); assertEquals("PRE_CLUSTER", groups.get(0).name); @@ -116,6 +113,42 @@ public class UpgradeHelperTest { } @Test + public void testDowngradeOrchestration() throws Exception { + Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", "bar"); + assertTrue(upgrades.isEmpty()); + + upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1"); + assertTrue(upgrades.containsKey("upgrade_test")); + UpgradePack upgrade = upgrades.get("upgrade_test"); + assertNotNull(upgrade); + + Cluster cluster = makeCluster(); + + UpgradeHelper helper = new UpgradeHelper(); + List<UpgradeGroupHolder> groups = helper.createDowngrade(cluster, m_masterHostResolver, upgrade); + + assertEquals(5, groups.size()); + + assertEquals("PRE_CLUSTER", groups.get(0).name); + assertEquals("CORE_SLAVES", groups.get(1).name); + assertEquals("CORE_MASTER", groups.get(2).name); + assertEquals("ZOOKEEPER", groups.get(3).name); + + UpgradeGroupHolder postGroup = groups.get(4); + assertEquals(postGroup.name, "POST_CLUSTER"); + assertEquals(postGroup.title, "Finalize Upgrade"); + assertEquals(postGroup.items.size(), 3); + assertEquals(postGroup.items.get(0).getText(), "Confirm Finalize"); + assertEquals(postGroup.items.get(1).getText(), "Execute HDFS Finalize"); + assertEquals(postGroup.items.get(2).getText(), "Save Cluster State"); + assertEquals(postGroup.items.get(2).getType(), StageWrapper.Type.SERVER_SIDE_ACTION); + + assertEquals(9, groups.get(1).items.size()); + assertEquals(8, groups.get(2).items.size()); + assertEquals(6, groups.get(3).items.size()); + } + + @Test public void testBuckets() throws Exception { Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("foo", "bar"); assertTrue(upgrades.isEmpty()); @@ -134,10 +167,8 @@ public class UpgradeHelperTest { UpgradeGroupHolder group = groups.iterator().next(); assertEquals(7, group.items.size()); - } - /** * Create an HA cluster * @throws AmbariException http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java index df6c8ac..cf191d5 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/UpgradePackTest.java @@ -17,14 +17,23 @@ */ package org.apache.ambari.server.state.stack; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.orm.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; +import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent; +import org.apache.ambari.server.state.stack.upgrade.RestartTask; +import org.apache.ambari.server.state.stack.upgrade.Task; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -67,40 +76,20 @@ public class UpgradePackTest { @Test public void testUpgradeParsing() throws Exception { - /* Map<String, UpgradePack> upgrades = ambariMetaInfo.getUpgradePacks("HDP", "2.1.1"); assertTrue(upgrades.size() > 0); + assertTrue(upgrades.containsKey("upgrade_test")); - Map<String, List<String>> expectedOrder = new LinkedHashMap<String, List<String>>() {{ - put("ZOOKEEPER", Arrays.asList("ZOOKEEPER_SERVER", "ZOOKEEPER_CLIENT")); - put("HDFS", Arrays.asList("JOURNALNODE", "NAMENODE", "DATANODE")); - }}; - - - UpgradePack up = upgrades.values().iterator().next(); + UpgradePack up = upgrades.get("upgrade_test"); assertEquals("2.2.*", up.getTarget()); - // !!! test the orders - assertEquals(expectedOrder.size(), up.getOrder().size()); - - int i = 0; - for (Entry<String, List<String>> entry : expectedOrder.entrySet()) { - assertTrue(up.getOrder().containsKey(entry.getKey())); - assertEquals(i++, indexOf(up.getOrder(), entry.getKey())); - - int j = 0; - for (String comp : entry.getValue()) { - assertEquals(comp, up.getOrder().get(entry.getKey()).get(j++)); - } - } - Map<String, List<String>> expectedStages = new LinkedHashMap<String, List<String>>() {{ put("ZOOKEEPER", Arrays.asList("ZOOKEEPER_SERVER")); put("HDFS", Arrays.asList("NAMENODE", "DATANODE")); }}; // !!! test the tasks - i = 0; + int i = 0; for (Entry<String, List<String>> entry : expectedStages.entrySet()) { assertTrue(up.getTasks().containsKey(entry.getKey())); assertEquals(i++, indexOf(up.getTasks(), entry.getKey())); @@ -120,39 +109,26 @@ public class UpgradePackTest { assertTrue(up.getTasks().get("HDFS").containsKey("NAMENODE")); ProcessingComponent pc = up.getTasks().get("HDFS").get("NAMENODE"); - assertNull(pc.batch); - assertNull(pc.preTasks); - assertNull(pc.postTasks); + assertNotNull(pc.preTasks); + assertNotNull(pc.postTasks); assertNotNull(pc.tasks); - assertEquals(3, pc.tasks.size()); - - assertEquals(Task.Type.EXECUTE, pc.tasks.get(0).getType()); - assertEquals(ExecuteTask.class, pc.tasks.get(0).getClass()); - assertEquals("su - {hdfs-user} -c 'dosomething'", - ExecuteTask.class.cast(pc.tasks.get(0)).command); - - assertEquals(Task.Type.CONFIGURE, pc.tasks.get(1).getType()); - assertEquals(ConfigureTask.class, pc.tasks.get(1).getClass()); - assertEquals("hdfs-site", - ConfigureTask.class.cast(pc.tasks.get(1)).configType); - assertEquals("myproperty", - ConfigureTask.class.cast(pc.tasks.get(1)).key); - assertEquals("mynewvalue", - ConfigureTask.class.cast(pc.tasks.get(1)).value); - - assertEquals(Task.Type.MANUAL, pc.tasks.get(2).getType()); - assertEquals(ManualTask.class, pc.tasks.get(2).getClass()); - assertEquals("Update your database", - ManualTask.class.cast(pc.tasks.get(2)).message); + assertNull(pc.preDowngradeTasks); + assertNull(pc.postDowngradeTasks); + assertEquals(1, pc.tasks.size()); + + assertEquals(Task.Type.RESTART, pc.tasks.get(0).getType()); + assertEquals(RestartTask.class, pc.tasks.get(0).getClass()); + assertTrue(up.getTasks().containsKey("ZOOKEEPER")); assertTrue(up.getTasks().get("ZOOKEEPER").containsKey("ZOOKEEPER_SERVER")); pc = up.getTasks().get("HDFS").get("DATANODE"); - assertNotNull(pc.batch); -// assertEquals(Batch.Type.CONDITIONAL, pc.batch.getType()); -// assertEquals(15, ConditionalBatch.class.cast(pc.batch).initial); -// assertEquals(50, ConditionalBatch.class.cast(pc.batch).remaining); + assertNotNull(pc.preDowngradeTasks); + assertEquals(0, pc.preDowngradeTasks.size()); + assertNotNull(pc.postDowngradeTasks); + assertEquals(1, pc.postDowngradeTasks.size()); + pc = up.getTasks().get("ZOOKEEPER").get("ZOOKEEPER_SERVER"); assertNotNull(pc.preTasks); @@ -161,10 +137,6 @@ public class UpgradePackTest { assertEquals(1, pc.postTasks.size()); assertNotNull(pc.tasks); assertEquals(1, pc.tasks.size()); - assertNotNull(pc.batch); -// assertEquals(Batch.Type.COUNT, pc.batch.getType()); -// assertEquals(2, CountBatch.class.cast(pc.batch).count); - */ } http://git-wip-us.apache.org/repos/asf/ambari/blob/e58e53fa/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml index bf608ec..2c57907 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml +++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_test.xml @@ -104,9 +104,7 @@ <task xsi:type="restart" /> </upgrade> <post-upgrade> - <task xsi:type="execute"> - <command>ls</command> - </task> + <task xsi:type="configure" /> </post-upgrade> </component> </service> @@ -135,9 +133,15 @@ </post-upgrade> </component> <component name="DATANODE"> + <pre-downgrade /> <upgrade> <task xsi:type="restart" /> </upgrade> + <post-downgrade> + <task xsi:type="manual"> + <message>Manual Downgrade</message> + </task> + </post-downgrade> </component> </service> <service name="YARN">
