You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ad...@apache.org on 2018/06/19 03:23:37 UTC

[ambari] branch branch-2.6 updated: AMBARI-24139. Failed to force_non_member_install a stack version on hosts (#1574)

This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch branch-2.6
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-2.6 by this push:
     new dcd9f52  AMBARI-24139. Failed to force_non_member_install a stack version on hosts (#1574)
dcd9f52 is described below

commit dcd9f521ef3d1f0daca95cfe94120f894ca06e1f
Author: Doroszlai, Attila <64...@users.noreply.github.com>
AuthorDate: Tue Jun 19 05:23:33 2018 +0200

    AMBARI-24139. Failed to force_non_member_install a stack version on hosts (#1574)
---
 .../internal/HostStackVersionResourceProvider.java | 81 +++++++++-------------
 .../HostStackVersionResourceProviderTest.java      | 39 ++++++++---
 2 files changed, 63 insertions(+), 57 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
index d4c0116..3b22493 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
@@ -66,6 +66,7 @@ import org.apache.commons.lang.BooleanUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.Validate;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -437,13 +438,7 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
     RequestResourceFilter filter = new RequestResourceFilter(null, null,
             Collections.singletonList(hostName));
 
-    ActionExecutionContext actionContext = new ActionExecutionContext(
-            cluster.getClusterName(), INSTALL_PACKAGES_ACTION,
-            Collections.singletonList(filter),
-            roleParams);
-    actionContext.setTimeout(Short.valueOf(configuration.getDefaultAgentTaskTimeout(true)));
-    actionContext.setRepositoryVersion(repoVersionEnt);
-
+    ActionExecutionContext actionContext = createActionExecutionContext(cluster, repoVersionEnt, roleParams, filter, INSTALL_PACKAGES_ACTION);
     repoVersionHelper.addCommandRepositoryToContext(actionContext, osEntity);
 
     String caption = String.format(INSTALL_PACKAGES_FULL_NAME + " on host %s", hostName);
@@ -461,31 +456,21 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
       throw new SystemException("Could not build cluster topology", e);
     }
 
-    Stage stage = stageFactory.createNew(req.getId(),
-            "/tmp/ambari",
-            cluster.getClusterName(),
-            cluster.getClusterId(),
-            caption,
-            "{}",
-            StageUtils.getGson().toJson(hostLevelParams));
+    String hostLevelParamsJson = StageUtils.getGson().toJson(hostLevelParams);
+    Stage stage = createStage(cluster, req, caption, "{}", hostLevelParamsJson, clusterHostInfoJson);
+    addToStage(actionContext, stage, forceInstallOnNonMemberHost);
 
-    long stageId = req.getLastStageId() + 1;
-    if (0L == stageId) {
-      stageId = 1L;
-    }
-    stage.setStageId(stageId);
-    req.setClusterHostInfo(clusterHostInfoJson);
-    req.addStages(Collections.singletonList(stage));
+    if (forceInstallOnNonMemberHost) {
+      Map<String, String> stackSelectRoleParams = Collections.emptyMap();
+      actionContext = createActionExecutionContext(cluster, repoVersionEnt, stackSelectRoleParams, filter, STACK_SELECT_ACTION);
 
-    try {
-      actionExecutionHelper.get().addExecutionCommandsToStage(actionContext, stage, null, !forceInstallOnNonMemberHost);
-    } catch (AmbariException e) {
-      throw new SystemException("Can not modify stage", e);
-    }
+      ImmutableMap<String, String> commandParams = ImmutableMap.of(
+        "version", desiredRepoVersion
+      );
+      String commandParamsJson = StageUtils.getGson().toJson(commandParams);
+      stage = createStage(cluster, req, caption, commandParamsJson, hostLevelParamsJson, clusterHostInfoJson);
 
-    if (forceInstallOnNonMemberHost) {
-      addSelectStackStage(desiredRepoVersion, forceInstallOnNonMemberHost, cluster, filter, caption, req,
-        hostLevelParams, clusterHostInfoJson);
+      addToStage(actionContext, stage, true);
     }
 
     try {
@@ -500,23 +485,28 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
     return req;
   }
 
-  private void addSelectStackStage(String desiredRepoVersion, boolean forceInstallOnNonMemberHost, Cluster cluster,
-                                 RequestResourceFilter filter, String caption, RequestStageContainer req, Map<String, String> hostLevelParams, String clusterHostInfoJson) throws SystemException {
-    Stage stage;
-    long stageId;
-    ActionExecutionContext actionContext;
-    Map<String, String> commandParams = new HashMap<>();
-    commandParams.put("version", desiredRepoVersion);
+  private ActionExecutionContext createActionExecutionContext(Cluster cluster, RepositoryVersionEntity repoVersionEntity, Map<String, String> roleParams, RequestResourceFilter filter, String action) {
+    List<RequestResourceFilter> resourceFilters = Collections.singletonList(filter);
+    ActionExecutionContext actionContext = new ActionExecutionContext(cluster.getClusterName(), action, resourceFilters, roleParams);
+    Short timeout = Short.valueOf(configuration.getDefaultAgentTaskTimeout(true));
+    actionContext.setTimeout(timeout);
+    actionContext.setRepositoryVersion(repoVersionEntity);
+    return actionContext;
+  }
 
-    stage = stageFactory.createNew(req.getId(),
+  private Stage createStage(Cluster cluster, RequestStageContainer req, String caption,
+    String commandParamsJson, String hostLevelParamsJson, String clusterHostInfoJson
+  ) {
+    Stage stage = stageFactory.createNew(req.getId(),
       "/tmp/ambari",
       cluster.getClusterName(),
       cluster.getClusterId(),
       caption,
-      StageUtils.getGson().toJson(commandParams),
-      StageUtils.getGson().toJson(hostLevelParams));
+      commandParamsJson,
+      hostLevelParamsJson
+    );
 
-    stageId = req.getLastStageId() + 1;
+    long stageId = req.getLastStageId() + 1;
     if (0L == stageId) {
       stageId = 1L;
     }
@@ -524,20 +514,17 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
     req.setClusterHostInfo(clusterHostInfoJson);
     req.addStages(Collections.singletonList(stage));
 
-    actionContext = new ActionExecutionContext(
-      cluster.getClusterName(), STACK_SELECT_ACTION,
-      Collections.singletonList(filter),
-      Collections.<String, String>emptyMap());
-    actionContext.setTimeout(Short.valueOf(configuration.getDefaultAgentTaskTimeout(true)));
+    return stage;
+  }
 
+  private void addToStage(ActionExecutionContext context, Stage stage, boolean forceInstallOnNonMemberHost) throws SystemException {
     try {
-      actionExecutionHelper.get().addExecutionCommandsToStage(actionContext, stage, null, !forceInstallOnNonMemberHost);
+      actionExecutionHelper.get().addExecutionCommandsToStage(context, stage, null, !forceInstallOnNonMemberHost);
     } catch (AmbariException e) {
       throw new SystemException("Can not modify stage", e);
     }
   }
 
-
   private RequestStageContainer createRequest(String caption) {
     ActionManager actionManager = getManagementController().getActionManager();
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java
index 26b89d3..ed3221e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java
@@ -45,7 +45,10 @@ import java.util.Set;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.H2DatabaseCleaner;
 import org.apache.ambari.server.actionmanager.ActionManager;
+import org.apache.ambari.server.actionmanager.ExecutionCommandWrapper;
 import org.apache.ambari.server.actionmanager.HostRoleCommand;
+import org.apache.ambari.server.actionmanager.Stage;
+import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
@@ -303,7 +306,9 @@ public class HostStackVersionResourceProviderTest {
 
   @Test
   public void testCreateResources_on_host_not_belonging_To_any_cluster() throws Exception {
-    StackId stackId = new StackId("HDP", "2.0.1");
+    String stackName = "HDP";
+    String stackVersion = "2.0.1";
+    StackId stackId = new StackId(stackName, stackVersion);
 
     final Host host1 = createNiceMock("host1", Host.class);
     expect(host1.getHostName()).andReturn("host1").anyTimes();
@@ -330,10 +335,12 @@ public class HostStackVersionResourceProviderTest {
     expect(managementController.getActionManager()).andReturn(actionManager).anyTimes();
     expect(managementController.getJdkResourceUrl()).andReturn("/JdkResourceUrl").anyTimes();
     expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
-      anyObject(Map.class), anyObject(String.class))).andReturn(packages).anyTimes();
+      anyObject(Map.class), anyObject(String.class)
+    )).andReturn(packages).anyTimes();
 
     expect(resourceProviderFactory.getHostResourceProvider(anyObject(Set.class), anyObject(Map.class),
-      eq(managementController))).andReturn(csvResourceProvider).anyTimes();
+      eq(managementController)
+    )).andReturn(csvResourceProvider).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
     expect(clusters.getHost(anyObject(String.class))).andReturn(host1);
@@ -344,7 +351,8 @@ public class HostStackVersionResourceProviderTest {
     expect(
       repositoryVersionDAOMock.findByStackAndVersion(
         anyObject(StackId.class),
-        anyObject(String.class))).andReturn(repoVersion);
+        anyObject(String.class)
+      )).andReturn(repoVersion);
 
     expect(actionManager.getRequestTasks(anyLong())).andReturn(Collections.<HostRoleCommand>emptyList()).anyTimes();
     requestCapture = newCapture();
@@ -356,13 +364,15 @@ public class HostStackVersionResourceProviderTest {
 
     // replay
     replay(managementController, response, clusters, resourceProviderFactory, csvResourceProvider,
-      cluster, repositoryVersionDAOMock, configHelper, sch, actionManager, hostVersionEntityMock, hostVersionDAOMock);
+      cluster, repositoryVersionDAOMock, configHelper, sch, actionManager, hostVersionEntityMock, hostVersionDAOMock
+    );
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
       PropertyHelper.getPropertyIds(type),
       PropertyHelper.getKeyPropertyIds(type),
-      managementController);
+      managementController
+    );
 
     injector.injectMembers(provider);
 
@@ -374,8 +384,8 @@ public class HostStackVersionResourceProviderTest {
     // add properties to the request map
     properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID, "Cluster100");
     properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_REPO_VERSION_PROPERTY_ID, "2.2.0.1-885");
-    properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_STACK_PROPERTY_ID, "HDP");
-    properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_VERSION_PROPERTY_ID, "2.0.1");
+    properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_STACK_PROPERTY_ID, stackName);
+    properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_VERSION_PROPERTY_ID, stackVersion);
     properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_HOST_NAME_PROPERTY_ID, "host1");
     Set<Map<String, String>> components = new HashSet<>();
     Map<String, String> hiveMetastoreComponent = new HashMap<>();
@@ -386,7 +396,8 @@ public class HostStackVersionResourceProviderTest {
     components.add(hiveServerstoreComponent);
     properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_COMPONENT_NAMES_PROPERTY_ID, components);
     properties.put(HostStackVersionResourceProvider.HOST_STACK_VERSION_FORCE_INSTALL_ON_NON_MEMBER_HOST_PROPERTY_ID,
-      "true");
+      "true"
+    );
 
     propertySet.add(properties);
 
@@ -398,7 +409,15 @@ public class HostStackVersionResourceProviderTest {
     // verify
     verify(managementController, response, clusters);
 
-    assertEquals(requestCapture.getValue().getStages().size(), 2);
+    org.apache.ambari.server.actionmanager.Request capturedRequest = requestCapture.getValue();
+    assertEquals(capturedRequest.getStages().size(), 2);
+    for (Stage stage : capturedRequest.getStages()) {
+      for (ExecutionCommandWrapper cmdWrapper : stage.getExecutionCommands(host1.getHostName())) {
+        Map<String, String> hostLevelParams = cmdWrapper.getExecutionCommand().getHostLevelParams();
+        assertEquals(stackName, hostLevelParams.get(ExecutionCommand.KeyNames.STACK_NAME));
+        assertEquals(stackVersion, hostLevelParams.get(ExecutionCommand.KeyNames.STACK_VERSION));
+      }
+    }
   }
 
   @Test