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 <6454655+adorosz...@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