Return-Path:
X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
by cust-asf2.ponee.io (Postfix) with ESMTP id A3535200BB3
for ; Wed, 2 Nov 2016 20:26:24 +0100 (CET)
Received: by cust-asf.ponee.io (Postfix)
id A1BE8160AFB; Wed, 2 Nov 2016 19:26:24 +0000 (UTC)
Delivered-To: archive-asf-public@cust-asf.ponee.io
Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
by cust-asf.ponee.io (Postfix) with SMTP id 74E8A160AF0
for ; Wed, 2 Nov 2016 20:26:22 +0100 (CET)
Received: (qmail 55317 invoked by uid 500); 2 Nov 2016 19:26:21 -0000
Mailing-List: contact commits-help@ambari.apache.org; run by ezmlm
Precedence: bulk
List-Help:
List-Unsubscribe:
List-Post:
List-Id:
Reply-To: ambari-dev@ambari.apache.org
Delivered-To: mailing list commits@ambari.apache.org
Received: (qmail 55308 invoked by uid 99); 2 Nov 2016 19:26:21 -0000
Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23)
by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 02 Nov 2016 19:26:21 +0000
Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33)
id 5EAD7E0BB1; Wed, 2 Nov 2016 19:26:21 +0000 (UTC)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
From: jonathanhurley@apache.org
To: commits@ambari.apache.org
Message-Id:
X-Mailer: ASF-Git Admin Mailer
Subject: ambari git commit: AMBARI-18685 - Add validations and attributes to
support HOST_ORDERED upgrades (jonathanhurley)
Date: Wed, 2 Nov 2016 19:26:21 +0000 (UTC)
archived-at: Wed, 02 Nov 2016 19:26:24 -0000
Repository: ambari
Updated Branches:
refs/heads/branch-feature-AMBARI-18634 464d3d5ce -> cfe738d4b
AMBARI-18685 - Add validations and attributes to support HOST_ORDERED upgrades (jonathanhurley)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/cfe738d4
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/cfe738d4
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/cfe738d4
Branch: refs/heads/branch-feature-AMBARI-18634
Commit: cfe738d4bfeeb7a34681691b3f4ba13a4e29aa97
Parents: 464d3d5
Author: Jonathan Hurley
Authored: Wed Nov 2 09:38:37 2016 -0400
Committer: Jonathan Hurley
Committed: Wed Nov 2 15:25:41 2016 -0400
----------------------------------------------------------------------
.../internal/UpgradeResourceProvider.java | 562 ++++++++++++++-----
.../ambari/server/state/UpgradeContext.java | 128 ++++-
.../ambari/server/state/UpgradeHelper.java | 3 +-
.../state/stack/upgrade/HostOrderGrouping.java | 20 +
.../state/stack/upgrade/HostOrderItem.java | 101 ++++
.../stack/upgrade/StageWrapperBuilder.java | 3 +-
.../AmbariManagementControllerTest.java | 2 +-
.../internal/UpgradeResourceProviderTest.java | 56 ++
.../ambari/server/state/UpgradeHelperTest.java | 186 +++---
.../stack/upgrade/StageWrapperBuilderTest.java | 7 +-
.../upgrades/upgrade_test_host_ordered.xml | 44 ++
11 files changed, 862 insertions(+), 250 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/cfe738d4/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 d83aaa2..02c05d9 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
@@ -24,6 +24,7 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.VERSION;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
@@ -89,6 +90,7 @@ 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.Host;
import org.apache.ambari.server.state.Service;
import org.apache.ambari.server.state.ServiceComponent;
import org.apache.ambari.server.state.ServiceInfo;
@@ -103,6 +105,9 @@ import org.apache.ambari.server.state.stack.UpgradePack;
import org.apache.ambari.server.state.stack.upgrade.ConfigureTask;
import org.apache.ambari.server.state.stack.upgrade.Direction;
import org.apache.ambari.server.state.stack.upgrade.Grouping;
+import org.apache.ambari.server.state.stack.upgrade.HostOrderGrouping;
+import org.apache.ambari.server.state.stack.upgrade.HostOrderItem;
+import org.apache.ambari.server.state.stack.upgrade.HostOrderItem.HostOrderActionType;
import org.apache.ambari.server.state.stack.upgrade.ManualTask;
import org.apache.ambari.server.state.stack.upgrade.ServerSideActionTask;
import org.apache.ambari.server.state.stack.upgrade.StageWrapper;
@@ -175,6 +180,27 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
*/
protected static final String UPGRADE_SKIP_MANUAL_VERIFICATION = "Upgrade/skip_manual_verification";
+ /**
+ * When creating an upgrade of type {@link UpgradeType#HOST_ORDERED}, this
+ * specifies the order in which the hosts are upgraded.
+ *
+ *
+ *
+ * "host_order": [
+ * { "hosts":
+ * [ "c6401.ambari.apache.org, "c6402.ambari.apache.org", "c6403.ambari.apache.org" ],
+ * "service_checks": ["ZOOKEEPER"]
+ * },
+ * {
+ * "hosts": [ "c6404.ambari.apache.org, "c6405.ambari.apache.org"],
+ * "service_checks": ["ZOOKEEPER", "KAFKA"]
+ * }
+ * ]
+ *
+ *
+ */
+ protected static final String UPGRADE_HOST_ORDERED_HOSTS = "Upgrade/host_order";
+
/*
* Lifted from RequestResourceProvider
*/
@@ -279,6 +305,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
PROPERTY_IDS.add(UPGRADE_SKIP_MANUAL_VERIFICATION);
PROPERTY_IDS.add(UPGRADE_SKIP_PREREQUISITE_CHECKS);
PROPERTY_IDS.add(UPGRADE_FAIL_ON_CHECK_WARNINGS);
+ PROPERTY_IDS.add(UPGRADE_HOST_ORDERED_HOSTS);
PROPERTY_IDS.add(REQUEST_CONTEXT_ID);
PROPERTY_IDS.add(REQUEST_CREATE_TIME_ID);
@@ -336,23 +363,34 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
}
final Map requestInfoProps = request.getRequestInfoProperties();
+ final String forceDowngrade = requestInfoProps.get(UpgradeResourceDefinition.DOWNGRADE_DIRECTIVE);
+
+ final Direction direction = Boolean.parseBoolean(forceDowngrade) ? Direction.DOWNGRADE
+ : Direction.UPGRADE;
UpgradeEntity entity = createResources(new Command() {
@Override
public UpgradeEntity invoke() throws AmbariException, AuthorizationException {
- String forceDowngrade = requestInfoProps.get(UpgradeResourceDefinition.DOWNGRADE_DIRECTIVE);
- if (null == clusterName) {
- throw new AmbariException(String.format("%s is required", UPGRADE_CLUSTER_NAME));
+ // Default to ROLLING upgrade, but attempt to read from properties.
+ UpgradeType upgradeType = UpgradeType.ROLLING;
+ if (requestMap.containsKey(UPGRADE_TYPE)) {
+ try {
+ upgradeType = UpgradeType.valueOf(requestMap.get(UPGRADE_TYPE).toString());
+ } catch (Exception e) {
+ throw new AmbariException(String.format("Property %s has an incorrect value of %s.",
+ UPGRADE_TYPE, requestMap.get(UPGRADE_TYPE)));
+ }
}
- Direction direction = Boolean.parseBoolean(forceDowngrade) ? Direction.DOWNGRADE
- : Direction.UPGRADE;
+ final UpgradeContext upgradeContext = new UpgradeContext(cluster, upgradeType, direction,
+ requestMap);
- UpgradePack up = validateRequest(direction, requestMap);
+ UpgradePack upgradePack = validateRequest(upgradeContext);
+ upgradeContext.setUpgradePack(upgradePack);
try {
- return createUpgrade(cluster, direction, up, requestMap);
+ return createUpgrade(upgradeContext);
} catch (Exception e) {
LOG.error("Error appears during upgrade task submitting", e);
@@ -589,11 +627,11 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
* @return the validated upgrade pack
* @throws AmbariException
*/
- private UpgradePack validateRequest(Direction direction, Map requestMap)
- throws AmbariException {
- String clusterName = (String) requestMap.get(UPGRADE_CLUSTER_NAME);
- String version = (String) requestMap.get(UPGRADE_VERSION);
- String versionForUpgradePack = (String) requestMap.get(UPGRADE_FROM_VERSION);
+ private UpgradePack validateRequest(UpgradeContext upgradeContext) throws AmbariException {
+ Cluster cluster = upgradeContext.getCluster();
+ Direction direction = upgradeContext.getDirection();
+ Map requestMap = upgradeContext.getUpgradeRequest();
+ UpgradeType upgradeType = upgradeContext.getType();
/**
* For the unit tests tests, there are multiple upgrade packs for the same type, so
@@ -601,119 +639,20 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
*/
String preferredUpgradePackName = (String) requestMap.get(UPGRADE_PACK);
- // Default to ROLLING upgrade, but attempt to read from properties.
- UpgradeType upgradeType = UpgradeType.ROLLING;
- if (requestMap.containsKey(UPGRADE_TYPE)) {
- try {
- upgradeType = UpgradeType.valueOf(requestMap.get(UPGRADE_TYPE).toString());
- } catch(Exception e){
- throw new AmbariException(String.format("Property %s has an incorrect value of %s.", UPGRADE_TYPE, requestMap.get(UPGRADE_TYPE)));
- }
- }
-
- if (null == clusterName) {
- throw new AmbariException(String.format("%s is required", UPGRADE_CLUSTER_NAME));
- }
-
- if (null == version) {
- throw new AmbariException(String.format("%s is required", UPGRADE_VERSION));
- }
+ String version = (String) requestMap.get(UPGRADE_VERSION);
+ String versionForUpgradePack = (String) requestMap.get(UPGRADE_FROM_VERSION);
- Cluster cluster = getManagementController().getClusters().getCluster(clusterName);
- UpgradePack pack = s_upgradeHelper.suggestUpgradePack(clusterName, versionForUpgradePack, version, direction, upgradeType, preferredUpgradePackName);
+ UpgradePack pack = s_upgradeHelper.suggestUpgradePack(cluster.getClusterName(),
+ versionForUpgradePack, version, direction, upgradeType, preferredUpgradePackName);
- // Do not insert here additional checks! Wrap them to separate functions.
- // Pre-req checks, function generate exceptions if something going wrong
- validatePreRequest(cluster, direction, version, requestMap);
+ // the validator will throw an exception if the upgrade request is not valid
+ UpgradeRequestValidator upgradeRequestValidator = buildValidator(upgradeType);
+ upgradeRequestValidator.validate(upgradeContext, pack);
return pack;
}
/**
- * Pre-req checks.
- * @param cluster Cluster
- * @param direction Direction of upgrade
- * @param repoVersion target repository version
- * @param requestMap request arguments
- * @throws AmbariException
- */
- private void validatePreRequest(Cluster cluster, Direction direction, String repoVersion, Map requestMap)
- throws AmbariException {
- boolean skipPrereqChecks = Boolean.parseBoolean((String) requestMap.get(UPGRADE_SKIP_PREREQUISITE_CHECKS));
- boolean failOnCheckWarnings = Boolean.parseBoolean((String) requestMap.get(UPGRADE_FAIL_ON_CHECK_WARNINGS));
- String preferredUpgradePack = requestMap.containsKey(UPGRADE_PACK) ? (String) requestMap.get(UPGRADE_PACK) : null;
-
- UpgradeType upgradeType = UpgradeType.ROLLING;
- if (requestMap.containsKey(UPGRADE_TYPE)) {
- try {
- upgradeType = UpgradeType.valueOf(requestMap.get(UPGRADE_TYPE).toString());
- } catch(Exception e){
- throw new AmbariException(String.format("Property %s has an incorrect value of %s.", UPGRADE_TYPE, requestMap.get(UPGRADE_TYPE)));
- }
- }
-
- // Validate there isn't an direction == upgrade/downgrade already in progress.
- List upgrades = s_upgradeDAO.findUpgrades(cluster.getClusterId());
- for (UpgradeEntity entity : upgrades) {
- if (entity.getDirection() == direction) {
- Map summary = s_hostRoleCommandDAO.findAggregateCounts(
- entity.getRequestId());
- CalculatedStatus calc = CalculatedStatus.statusFromStageSummary(summary, summary.keySet());
- HostRoleStatus status = calc.getStatus();
- if (!HostRoleStatus.getCompletedStates().contains(status)) {
- throw new AmbariException(
- String.format("Unable to perform %s as another %s is in progress. %s request %d is in %s",
- direction.getText(false), direction.getText(false), direction.getText(true),
- entity.getRequestId().longValue(), status)
- );
- }
- }
- }
-
- if (direction.isUpgrade() && !skipPrereqChecks) {
- // Validate pre-req checks pass
- PreUpgradeCheckResourceProvider preUpgradeCheckResourceProvider = (PreUpgradeCheckResourceProvider)
- getResourceProvider(Resource.Type.PreUpgradeCheck);
- Predicate preUpgradeCheckPredicate = new PredicateBuilder().property(
- PreUpgradeCheckResourceProvider.UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID).equals(cluster.getClusterName()).and().property(
- PreUpgradeCheckResourceProvider.UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID).equals(repoVersion).and().property(
- PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID).equals(upgradeType).and().property(
- PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID).equals(preferredUpgradePack).toPredicate();
- Request preUpgradeCheckRequest = PropertyHelper.getReadRequest();
-
- Set preUpgradeCheckResources;
- try {
- preUpgradeCheckResources = preUpgradeCheckResourceProvider.getResources(
- preUpgradeCheckRequest, preUpgradeCheckPredicate);
- } catch (NoSuchResourceException|SystemException|UnsupportedPropertyException|NoSuchParentResourceException e) {
- throw new AmbariException(
- String.format("Unable to perform %s. Prerequisite checks could not be run",
- direction.getText(false)));
- }
-
- List failedResources = new LinkedList();
- if (preUpgradeCheckResources != null) {
- for (Resource res : preUpgradeCheckResources) {
- PrereqCheckStatus prereqCheckStatus = (PrereqCheckStatus) res.getPropertyValue(
- PreUpgradeCheckResourceProvider.UPGRADE_CHECK_STATUS_PROPERTY_ID);
-
- if (prereqCheckStatus == PrereqCheckStatus.FAIL
- || (failOnCheckWarnings && prereqCheckStatus == PrereqCheckStatus.WARNING)) {
- failedResources.add(res);
- }
- }
- }
-
- if (!failedResources.isEmpty()) {
- Gson gson = new Gson();
- throw new AmbariException(
- String.format("Unable to perform %s. Prerequisite checks failed %s",
- direction.getText(false), gson.toJson(failedResources)));
- }
- }
- }
-
- /**
* Inject variables into the
* {@link org.apache.ambari.server.orm.entities.UpgradeItemEntity}, whose
* tasks may use strings like {{configType/propertyName}} that need to be
@@ -759,26 +698,19 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
* could lead to database deadlock issues. Instead, only the creation of the
* actual entities is wrapped in a {@link Transactional} block.
*
- * @param cluster
- * @param direction
- * @param pack
- * @param requestMap
+ * @param upgradeContext
* @return
* @throws AmbariException
* @throws AuthorizationException
*/
- protected UpgradeEntity createUpgrade(Cluster cluster, Direction direction, UpgradePack pack,
- Map requestMap) throws AmbariException, AuthorizationException {
+ protected UpgradeEntity createUpgrade(UpgradeContext upgradeContext)
+ throws AmbariException, AuthorizationException {
- // Default to ROLLING upgrade, but attempt to read from properties.
- UpgradeType upgradeType = UpgradeType.ROLLING;
- if (requestMap.containsKey(UPGRADE_TYPE)) {
- try {
- upgradeType = UpgradeType.valueOf(requestMap.get(UPGRADE_TYPE).toString());
- } catch(Exception e){
- throw new AmbariException(String.format("Property %s has an incorrect value of %s.", UPGRADE_TYPE, requestMap.get(UPGRADE_TYPE)));
- }
- }
+ UpgradePack pack = upgradeContext.getUpgradePack();
+ Cluster cluster = upgradeContext.getCluster();
+ Direction direction = upgradeContext.getDirection();
+ Map requestMap = upgradeContext.getUpgradeRequest();
+ UpgradeType upgradeType = upgradeContext.getType();
ConfigHelper configHelper = getManagementController().getConfigHelper();
String userName = getManagementController().getAuthName();
@@ -818,17 +750,18 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
break;
}
- UpgradeContext ctx = new UpgradeContext(resolver, sourceStackId, targetStackId, version,
- direction, pack.getType());
- ctx.setSupportedServices(supportedServices);
- ctx.setScope(scope);
+ upgradeContext.setResolver(resolver);
+ upgradeContext.setSourceAndTargetStacks(sourceStackId, targetStackId);
+ upgradeContext.setVersion(version);
+ upgradeContext.setSupportedServices(supportedServices);
+ upgradeContext.setScope(scope);
if (direction.isDowngrade()) {
if (requestMap.containsKey(UPGRADE_FROM_VERSION)) {
- ctx.setDowngradeFromVersion((String) requestMap.get(UPGRADE_FROM_VERSION));
+ upgradeContext.setDowngradeFromVersion((String) requestMap.get(UPGRADE_FROM_VERSION));
} else {
UpgradeEntity lastUpgradeItemForCluster = s_upgradeDAO.findLastUpgradeForCluster(cluster.getClusterId());
- ctx.setDowngradeFromVersion(lastUpgradeItemForCluster.getToVersion());
+ upgradeContext.setDowngradeFromVersion(lastUpgradeItemForCluster.getToVersion());
}
}
@@ -854,11 +787,11 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
skipManualVerification = Boolean.parseBoolean((String) requestMap.get(UPGRADE_SKIP_MANUAL_VERIFICATION));
}
- ctx.setAutoSkipComponentFailures(skipComponentFailures);
- ctx.setAutoSkipServiceCheckFailures(skipServiceCheckFailures);
- ctx.setAutoSkipManualVerification(skipManualVerification);
+ upgradeContext.setAutoSkipComponentFailures(skipComponentFailures);
+ upgradeContext.setAutoSkipServiceCheckFailures(skipServiceCheckFailures);
+ upgradeContext.setAutoSkipManualVerification(skipManualVerification);
- List groups = s_upgradeHelper.createSequence(pack, ctx);
+ List groups = s_upgradeHelper.createSequence(pack, upgradeContext);
if (groups.isEmpty()) {
throw new AmbariException("There are no groupings available");
@@ -934,9 +867,11 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
// the same host, break them out into individual stages.
for (TaskWrapper taskWrapper : wrapper.getTasks()) {
for (Task task : taskWrapper.getTasks()) {
- if(ctx.isManualVerificationAutoSkipped() && task.getType() == Task.Type.MANUAL) {
+ if (upgradeContext.isManualVerificationAutoSkipped()
+ && task.getType() == Task.Type.MANUAL) {
continue;
}
+
UpgradeItemEntity itemEntity = new UpgradeItemEntity();
itemEntity.setText(wrapper.getText());
@@ -947,17 +882,17 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
// At this point, need to change the effective Stack Id so that subsequent tasks run on the newer value.
if (upgradeType == UpgradeType.NON_ROLLING && UpdateStackGrouping.class.equals(group.groupClass)) {
if (direction.isUpgrade()) {
- ctx.setEffectiveStackId(ctx.getTargetStackId());
+ upgradeContext.setEffectiveStackId(upgradeContext.getTargetStackId());
} else {
- ctx.setEffectiveStackId(ctx.getOriginalStackId());
+ upgradeContext.setEffectiveStackId(upgradeContext.getOriginalStackId());
}
} else if (UpdateStackGrouping.class.equals(group.groupClass)) {
- ctx.setEffectiveStackId(ctx.getTargetStackId());
+ upgradeContext.setEffectiveStackId(upgradeContext.getTargetStackId());
}
injectVariables(configHelper, cluster, itemEntity);
- makeServerSideStage(ctx, req, itemEntity, (ServerSideActionTask) task, skippable,
- supportsAutoSkipOnFailure, allowRetry, pack, configUpgradePack);
+ makeServerSideStage(upgradeContext, req, itemEntity, (ServerSideActionTask) task,
+ skippable, supportsAutoSkipOnFailure, allowRetry, pack, configUpgradePack);
}
}
} else {
@@ -970,8 +905,8 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
injectVariables(configHelper, cluster, itemEntity);
// upgrade items match a stage
- createStage(ctx, req, itemEntity, wrapper, skippable, supportsAutoSkipOnFailure,
- allowRetry);
+ createStage(upgradeContext, req, itemEntity, wrapper, skippable,
+ supportsAutoSkipOnFailure, allowRetry);
}
}
@@ -1331,9 +1266,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
*/
private void applyAdditionalParameters(StageWrapper wrapper, Map commandParams) {
if (wrapper.getParams() != null) {
- Iterator it = wrapper.getParams().entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry pair = (Map.Entry) it.next();
+ for (Map.Entry pair : wrapper.getParams().entrySet()) {
if (!commandParams.containsKey(pair.getKey())) {
commandParams.put(pair.getKey(), pair.getValue());
}
@@ -1830,6 +1763,57 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
}
/**
+ * Builds the list of {@link HostOrderItem}s from the upgrade request. If the
+ * upgrade request does not contain the hosts
+ *
+ * @param requestMap
+ * the map of properties from the request (not {@code null}).
+ * @return the ordered list of actions to orchestrate for the
+ * {@link UpgradeType#HOST_ORDERED} upgrade.
+ * @throws AmbariException
+ * if the request properties are not valid.
+ */
+ @SuppressWarnings("unchecked")
+ private List extractHostOrderItemsFromRequest(Map requestMap)
+ throws AmbariException {
+ // ewwww
+ Set