Repository: ambari
Updated Branches:
  refs/heads/branch-2.5 9388184eb -> ca006571f


AMBARI-19473 - Add Downgrade request validation to avoid accidental 
double-upgrades (jonathanhurley)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ca006571
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ca006571
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ca006571

Branch: refs/heads/branch-2.5
Commit: ca006571fb69d4eeecc921606c663a2dc90212e0
Parents: 9388184
Author: Jonathan Hurley <[email protected]>
Authored: Wed Jan 11 16:26:39 2017 -0500
Committer: Jonathan Hurley <[email protected]>
Committed: Thu Jan 12 11:39:32 2017 -0500

----------------------------------------------------------------------
 .../resources/UpgradeResourceDefinition.java    |  4 +-
 .../internal/UpgradeResourceProvider.java       | 52 ++++++-------
 .../server/state/cluster/ClusterImpl.java       |  8 +-
 .../UpgradeResourceDefinitionTest.java          |  9 +--
 .../UpgradeResourceProviderHDP22Test.java       |  2 +
 .../internal/UpgradeResourceProviderTest.java   | 78 +++++++++++++++++---
 ambari-web/app/utils/ajax/ajax.js               | 15 +---
 7 files changed, 106 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ca006571/ambari-server/src/main/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinition.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinition.java
index 7018818..192da67 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinition.java
@@ -28,7 +28,6 @@ import java.util.Collections;
  */
 public class UpgradeResourceDefinition extends SimpleResourceDefinition {
 
-  public static String DOWNGRADE_DIRECTIVE           = "downgrade";
   public static String SKIP_SERVICE_CHECKS_DIRECTIVE = "skip_service_checks";
 
   /**
@@ -39,6 +38,7 @@ public class UpgradeResourceDefinition extends 
SimpleResourceDefinition {
         "upgrade",
         "upgrades",
         Collections.singleton(Resource.Type.UpgradeGroup),
-        Collections.singletonMap(DirectiveType.CREATE, 
Arrays.asList(DOWNGRADE_DIRECTIVE, SKIP_SERVICE_CHECKS_DIRECTIVE)));
+        Collections.singletonMap(DirectiveType.CREATE,
+            Arrays.asList(SKIP_SERVICE_CHECKS_DIRECTIVE)));
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca006571/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 a67bffa..873892d 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
@@ -48,7 +48,6 @@ import org.apache.ambari.server.actionmanager.RequestFactory;
 import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
-import org.apache.ambari.server.api.resources.UpgradeResourceDefinition;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.ActionExecutionContext;
@@ -372,16 +371,17 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
           "manage upgrade and downgrade");
     }
 
-    final Map<String, String> 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<UpgradeEntity>() {
       @Override
       public UpgradeEntity invoke() throws AmbariException, 
AuthorizationException {
 
+        final String directionProperty = (String) 
requestMap.get(UPGRADE_DIRECTION);
+        if (StringUtils.isEmpty(directionProperty)) {
+          throw new AmbariException(String.format("%s is required", 
UPGRADE_DIRECTION));
+        }
+
+        final Direction direction = Direction.valueOf(directionProperty);
+
         // Default to ROLLING upgrade, but attempt to read from properties.
         UpgradeType upgradeType = UpgradeType.ROLLING;
         if (requestMap.containsKey(UPGRADE_TYPE)) {
@@ -1744,9 +1744,9 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
         // Remove relevant upgrade entity
         try {
           Cluster cluster = clusters.get().getClusterById(clusterId);
-          UpgradeEntity lastUpgradeItemForCluster = 
s_upgradeDAO.findLastUpgradeOrDowngradeForCluster(cluster.getClusterId());
-          lastUpgradeItemForCluster.setSuspended(true);
-          s_upgradeDAO.merge(lastUpgradeItemForCluster);
+          UpgradeEntity upgradeEntity = 
s_upgradeDAO.findUpgradeByRequestId(requestId);
+          upgradeEntity.setSuspended(true);
+          s_upgradeDAO.merge(upgradeEntity);
 
           cluster.setUpgradeEntity(null);
         } catch (AmbariException e) {
@@ -1986,14 +1986,19 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
 
       String clusterName = (String) requestMap.get(UPGRADE_CLUSTER_NAME);
       String version = (String) requestMap.get(UPGRADE_VERSION);
+      String direction = (String) requestMap.get(UPGRADE_DIRECTION);
 
-      if (null == clusterName) {
+      if (StringUtils.isBlank(clusterName)) {
         throw new AmbariException(String.format("%s is required", 
UPGRADE_CLUSTER_NAME));
       }
 
-      if (null == version) {
+      if (StringUtils.isBlank(version)) {
         throw new AmbariException(String.format("%s is required", 
UPGRADE_VERSION));
       }
+
+      if (StringUtils.isBlank(direction)) {
+        throw new AmbariException(String.format("%s is required", 
UPGRADE_DIRECTION));
+      }
     }
   }
 
@@ -2017,22 +2022,13 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
       boolean failOnCheckWarnings = Boolean.parseBoolean((String) 
requestMap.get(UPGRADE_FAIL_ON_CHECK_WARNINGS));
       String preferredUpgradePack = requestMap.containsKey(UPGRADE_PACK) ? 
(String) requestMap.get(UPGRADE_PACK) : null;
 
-      // Validate there isn't an direction == upgrade/downgrade already in 
progress.
-      List<UpgradeEntity> upgrades = 
s_upgradeDAO.findUpgrades(cluster.getClusterId());
-      for (UpgradeEntity entity : upgrades) {
-        if (entity.getDirection() == direction) {
-          Map<Long, HostRoleCommandStatusSummaryDTO> 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)
-            );
-          }
-        }
+      // verify that there is not an upgrade or downgrade that is in progress 
or suspended
+      UpgradeEntity existingUpgrade = cluster.getUpgradeInProgress();
+      if( null != existingUpgrade ){
+        throw new AmbariException(
+            String.format("Unable to perform %s as another %s (request ID %s) 
is in progress.",
+                direction.getText(false), direction.getText(false),
+                existingUpgrade.getRequestId().longValue()));
       }
 
       // skip this check if it's a downgrade or we are instructed to skip it

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca006571/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 42f5fc0..f99ddf7 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -1023,12 +1023,10 @@ public class ClusterImpl implements Cluster {
         return mostRecentUpgrade;
       }
 
-      List<HostRoleStatus> UNFINISHED_STATUSES = new ArrayList<>();
-      UNFINISHED_STATUSES.add(HostRoleStatus.PENDING);
-      UNFINISHED_STATUSES.add(HostRoleStatus.ABORTED);
-
+      // look for any item from the prior upgrade which is still in progress
+      // (not failed, completed, or aborted)
       List<HostRoleCommandEntity> commands = 
hostRoleCommandDAO.findByRequestIdAndStatuses(
-          mostRecentUpgrade.getRequestId(), UNFINISHED_STATUSES);
+          mostRecentUpgrade.getRequestId(), 
HostRoleStatus.IN_PROGRESS_STATUSES);
 
       if (!commands.isEmpty()) {
         return mostRecentUpgrade;

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca006571/ambari-server/src/test/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinitionTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinitionTest.java
index e2db813..4c601ac 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinitionTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/UpgradeResourceDefinitionTest.java
@@ -18,13 +18,13 @@
 
 package org.apache.ambari.server.api.resources;
 
+
 import org.apache.ambari.server.controller.spi.Resource;
 import org.junit.Test;
-
-import java.util.HashSet;
-
 import static org.junit.Assert.assertEquals;
 
+import com.google.common.collect.Sets;
+
 /**
  * UpgradeResourceDefinition tests.
  */
@@ -52,8 +52,7 @@ public class UpgradeResourceDefinitionTest {
   public void testGetCreateDirectives() {
     ResourceDefinition resourceDefinition = new UpgradeResourceDefinition();
 
-    assertEquals(
-        new HashSet<String>() 
{{add(UpgradeResourceDefinition.DOWNGRADE_DIRECTIVE); 
add(UpgradeResourceDefinition.SKIP_SERVICE_CHECKS_DIRECTIVE);}},
+    
assertEquals(Sets.newHashSet(UpgradeResourceDefinition.SKIP_SERVICE_CHECKS_DIRECTIVE),
         resourceDefinition.getCreateDirectives());
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca006571/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
index 1747b28..e803529 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderHDP22Test.java
@@ -74,6 +74,7 @@ import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.stack.upgrade.Direction;
 import org.apache.ambari.server.topology.TopologyManager;
 import org.apache.ambari.server.utils.StageUtils;
 import org.apache.ambari.server.view.ViewRegistry;
@@ -242,6 +243,7 @@ public class UpgradeResourceProviderHDP22Test {
     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.4.2");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca006571/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 e2ea4e5..3776c0c 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
@@ -46,16 +46,17 @@ import org.apache.ambari.server.actionmanager.ActionManager;
 import org.apache.ambari.server.actionmanager.HostRoleCommand;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.actionmanager.Stage;
-import org.apache.ambari.server.api.resources.UpgradeResourceDefinition;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.audit.AuditLogger;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.AmbariServer;
+import org.apache.ambari.server.controller.ResourceProviderFactory;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.RequestStatus;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
@@ -145,6 +146,7 @@ public class UpgradeResourceProviderTest {
   private AmbariMetaInfo ambariMetaInfo;
   private TopologyManager topologyManager;
   private ConfigFactory configFactory;
+  private HostRoleCommandDAO hrcDAO;
 
   @Before
   public void before() throws Exception {
@@ -185,6 +187,7 @@ public class UpgradeResourceProviderTest {
     upgradeDao = injector.getInstance(UpgradeDAO.class);
     requestDao = injector.getInstance(RequestDAO.class);
     repoVersionDao = injector.getInstance(RepositoryVersionDAO.class);
+    hrcDAO = injector.getInstance(HostRoleCommandDAO.class);
 
     AmbariEventPublisher publisher = 
createNiceMock(AmbariEventPublisher.class);
     replay(publisher);
@@ -297,6 +300,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_SC_FAILURES, 
Boolean.TRUE.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_MANUAL_VERIFICATION, 
Boolean.FALSE.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
Boolean.TRUE.toString());
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
     Request request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
@@ -357,6 +361,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_TYPE, 
UpgradeType.ROLLING.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_MANUAL_VERIFICATION, 
Boolean.TRUE.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
Boolean.TRUE.toString());
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
     Request request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
@@ -402,6 +407,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_SC_FAILURES, 
Boolean.TRUE.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_MANUAL_VERIFICATION, 
Boolean.TRUE.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
Boolean.TRUE.toString());
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
     Request request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
@@ -554,6 +560,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.1.1.1");
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     // tests skipping SC failure options
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_FAILURES, "true");
@@ -637,9 +644,9 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.1.1.1");
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.DOWNGRADE.name());
 
     Map<String, String> requestInfoProperties = new HashMap<String, String>();
-    requestInfoProperties.put(UpgradeResourceDefinition.DOWNGRADE_DIRECTIVE, 
"true");
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
 
@@ -671,6 +678,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.1.1.1");
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
 
@@ -680,6 +688,12 @@ public class UpgradeResourceProviderTest {
     List<UpgradeEntity> upgrades = 
upgradeDao.findUpgrades(cluster.getClusterId());
     assertEquals(1, upgrades.size());
 
+    UpgradeEntity upgrade = upgrades.get(0);
+
+    // now abort the upgrade so another can be created
+    abortUpgrade(upgrade.getRequestId());
+
+    // create another upgrade which should fail
     requestProps = new HashMap<>();
     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2");
@@ -693,14 +707,15 @@ public class UpgradeResourceProviderTest {
       // !!! expected
     }
 
+    // fix the properties and try again
     requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.0.0");
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
     requestProps.put(UpgradeResourceProvider.UPGRADE_FROM_VERSION, "2.1.1.0");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.DOWNGRADE.name());
 
     Map<String, String> requestInfoProperties = new HashMap<>();
-    requestInfoProperties.put(UpgradeResourceDefinition.DOWNGRADE_DIRECTIVE, 
"true");
 
     request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), 
requestInfoProperties);
     RequestStatus status = upgradeResourceProvider.createResources(request);
@@ -750,6 +765,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, 
"upgrade_nonrolling_new_stack");
     requestProps.put(UpgradeResourceProvider.UPGRADE_TYPE, "NON_ROLLING");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
 
@@ -760,7 +776,8 @@ public class UpgradeResourceProviderTest {
     List<UpgradeEntity> upgrades = 
upgradeDao.findUpgrades(cluster.getClusterId());
     assertEquals(1, upgrades.size());
 
-    List<UpgradeGroupEntity> groups = upgrades.get(0).getUpgradeGroups();
+    UpgradeEntity upgrade = upgrades.get(0);
+    List<UpgradeGroupEntity> groups = upgrade.getUpgradeGroups();
     boolean isHiveGroupFound = false;
     boolean isZKGroupFound = false;
 
@@ -780,6 +797,9 @@ public class UpgradeResourceProviderTest {
     isZKGroupFound = false;
     sch.setVersion("2.2.0.0");
 
+    // now abort the upgrade so another can be created
+    abortUpgrade(upgrade.getRequestId());
+
     // create downgrade with one upgraded service
     StackId stackId = new StackId("HDP", "2.2.0");
     cluster.setDesiredStackVersion(stackId, true);
@@ -789,9 +809,9 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, 
"upgrade_nonrolling_new_stack");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
     requestProps.put(UpgradeResourceProvider.UPGRADE_FROM_VERSION, "2.2.0.0");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.DOWNGRADE.name());
 
     Map<String, String> requestInfoProperties = new HashMap<>();
-    requestInfoProperties.put(UpgradeResourceDefinition.DOWNGRADE_DIRECTIVE, 
"true");
 
     request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), 
requestInfoProperties);
     RequestStatus status = upgradeResourceProvider.createResources(request);
@@ -929,6 +949,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.2.3");
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, 
"upgrade_direction");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
 
@@ -949,6 +970,8 @@ public class UpgradeResourceProviderTest {
       Assert.assertFalse(item.getText().toLowerCase().contains("downgrade"));
     }
 
+    // now abort the upgrade so another can be created
+    abortUpgrade(upgrade.getRequestId());
 
     requestProps.clear();
     // Now perform a downgrade
@@ -957,11 +980,9 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, 
"upgrade_direction");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
     requestProps.put(UpgradeResourceProvider.UPGRADE_FROM_VERSION, "2.2.2.3");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.DOWNGRADE.name());
 
-    Map<String, String> requestInfoProps = new HashMap<String, String>();
-    requestInfoProps.put("downgrade", "true");
-
-    request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), 
requestInfoProps);
+    request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
     upgradeResourceProvider.createResources(request);
 
     upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
@@ -1056,6 +1077,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.0.0");
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
 
@@ -1209,7 +1231,13 @@ public class UpgradeResourceProviderTest {
    * @return the provider
    */
   private UpgradeResourceProvider createProvider(AmbariManagementController 
amc) {
-    return new UpgradeResourceProvider(amc);
+    ResourceProviderFactory factory = 
injector.getInstance(ResourceProviderFactory.class);
+    AbstractControllerResourceProvider.init(factory);
+
+    Resource.Type type = Type.Upgrade;
+    return (UpgradeResourceProvider) 
AbstractControllerResourceProvider.getResourceProvider(type,
+        PropertyHelper.getPropertyIds(type), 
PropertyHelper.getKeyPropertyIds(type),
+        amc);
   }
 
   private RequestStatus testCreateResources() throws Exception {
@@ -1224,6 +1252,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.1.1.1");
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_test");
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
"true");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
 
@@ -1405,11 +1434,12 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_TYPE, 
UpgradeType.ROLLING.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_MANUAL_VERIFICATION, 
Boolean.FALSE.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
Boolean.TRUE.toString());
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     // this will cause a NPE when creating the upgrade, allowing us to test
     // rollback
     UpgradeResourceProvider upgradeResourceProvider = createProvider(amc);
-    upgradeResourceProvider.s_upgradeDAO = null;
+    UpgradeResourceProvider.s_upgradeDAO = null;
 
     try {
       Request request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
@@ -1442,6 +1472,7 @@ public class UpgradeResourceProviderTest {
     requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, 
"upgrade_test_host_ordered");
     requestProps.put(UpgradeResourceProvider.UPGRADE_TYPE, 
UpgradeType.HOST_ORDERED.toString());
     requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, 
Boolean.TRUE.toString());
+    requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, 
Direction.UPGRADE.name());
 
     ResourceProvider upgradeResourceProvider = createProvider(amc);
     Request request = 
PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
@@ -1488,6 +1519,31 @@ public class UpgradeResourceProviderTest {
   }
 
   /**
+   * Aborts and upgrade.
+   *
+   * @param requestId
+   * @throws Exception
+   */
+  private void abortUpgrade(long requestId) throws Exception {
+    // now abort the upgrade so another can be created
+    Map<String, Object> requestProps = new HashMap<>();
+    requestProps.put(UpgradeResourceProvider.UPGRADE_REQUEST_ID, 
String.valueOf(requestId));
+    requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_REQUEST_STATUS, 
"ABORTED");
+    requestProps.put(UpgradeResourceProvider.UPGRADE_SUSPENDED, "false");
+    Request request = PropertyHelper.getUpdateRequest(requestProps, null);
+
+    ResourceProvider upgradeResourceProvider = createProvider(amc);
+    upgradeResourceProvider.updateResources(request, null);
+
+    // !!! this is required since the ActionManager/ActionScheduler isn't
+    // running and can't remove queued PENDING - it's a cheap way of ensuring
+    // that the upgrade commands do get aborted
+    hrcDAO.updateStatusByRequestId(requestId, HostRoleStatus.ABORTED,
+        HostRoleStatus.IN_PROGRESS_STATUSES);
+  }
+
+  /**
    *
    */
   private class MockModule implements Module {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca006571/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js 
b/ambari-web/app/utils/ajax/ajax.js
index 64b6366..2ea6113 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -1711,7 +1711,8 @@ var urls = {
             "repository_version": data.value,
             "upgrade_type": data.type,
             "skip_failures": data.skipComponentFailures,
-            "skip_service_check_failures": data.skipSCFailures
+            "skip_service_check_failures": data.skipSCFailures,
+            "direction": "UPGRADE"
           }
         })
       }
@@ -1724,13 +1725,11 @@ var urls = {
     'format': function (data) {
       return {
         data: JSON.stringify({
-          "RequestInfo": {
-            "downgrade": "true"
-          },
           "Upgrade": {
             "from_version": data.from,
             "repository_version": data.value,
-            "upgrade_type": data.upgradeType
+            "upgrade_type": data.upgradeType,
+            "direction": "DOWNGRADE"
           }
         })
       }
@@ -1743,9 +1742,6 @@ var urls = {
     'format': function (data) {
       return {
         data: JSON.stringify({
-          "RequestInfo": {
-            "downgrade": data.isDowngrade
-          },
           "Upgrade": {
             "request_status": "ABORTED",
             "suspended": "false"
@@ -1761,9 +1757,6 @@ var urls = {
     'format': function (data) {
       return {
         data: JSON.stringify({
-          "RequestInfo": {
-            "downgrade": data.isDowngrade
-          },
           "Upgrade": {
             "request_status": "ABORTED",
             "suspended": "true"

Reply via email to