You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2014/11/21 20:45:29 UTC

ambari git commit: AMBARI-8406. Upgrade Execute: implement proper RESTART commands (ncole)

Repository: ambari
Updated Branches:
  refs/heads/trunk d0b8bed79 -> 1c655c792


AMBARI-8406. Upgrade Execute: implement proper RESTART commands (ncole)


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

Branch: refs/heads/trunk
Commit: 1c655c7920c46d392b1ee8b8eeee38b97613fd62
Parents: d0b8bed
Author: Nate Cole <nc...@hortonworks.com>
Authored: Thu Nov 20 21:19:53 2014 -0500
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Fri Nov 21 14:19:33 2014 -0500

----------------------------------------------------------------------
 .../AmbariCustomCommandExecutionHelper.java     | 81 +++++++++++++++++++-
 .../AmbariManagementControllerImpl.java         | 67 ++--------------
 .../server/controller/ExecuteCommandJson.java   | 56 ++++++++++++++
 .../internal/UpgradeResourceProvider.java       | 61 +++++++++++++--
 .../AmbariManagementControllerImplTest.java     | 54 +++++++------
 5 files changed, 229 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1c655c79/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index 4103621..4382c9f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@ -18,15 +18,26 @@
 
 package org.apache.ambari.server.controller;
 
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMPONENT_CATEGORY;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CUSTOM_COMMAND;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_NAME;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JAVA_HOME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JCE_NAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_LOCATION;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_NAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MYSQL_JDBC_URL;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.ORACLE_JDBC_URL;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST;
 
 import java.util.ArrayList;
@@ -71,7 +82,6 @@ import org.apache.ambari.server.state.CustomCommandDefinition;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostComponentAdminState;
 import org.apache.ambari.server.state.MaintenanceState;
-
 import org.apache.ambari.server.state.stack.OsFamily;
 import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpInProgressEvent;
 import org.apache.ambari.server.utils.StageUtils;
@@ -891,6 +901,75 @@ public class AmbariCustomCommandExecutionHelper {
     return repoInfo;
   }
 
+
+  /**
+   * Helper method to fill execution command information
+   * @param actionExecutionContext the context
+   * @param cluster the cluster for the command
+   * @return a wrapper of the imporant JSON structures to add to a stage.
+   */
+  public ExecuteCommandJson getCommandJson(ActionExecutionContext actionExecContext,
+      Cluster cluster) throws AmbariException {
+
+    Map<String, String> commandParamsStage = StageUtils.getCommandParamsStage(actionExecContext);
+    Map<String, String> hostParamsStage = new HashMap<String, String>();
+    Map<String, Set<String>> clusterHostInfo;
+    String clusterHostInfoJson = "{}";
+
+    if (null != cluster) {
+      clusterHostInfo = StageUtils.getClusterHostInfo(
+        clusters.getHostsForCluster(cluster.getClusterName()), cluster);
+      hostParamsStage = createDefaultHostParams(cluster);
+      StackId stackId = cluster.getDesiredStackVersion();
+      String componentName = null;
+      String serviceName = null;
+      if (actionExecContext.getOperationLevel() != null) {
+        componentName = actionExecContext.getOperationLevel().getHostComponentName();
+        serviceName = actionExecContext.getOperationLevel().getServiceName();
+      }
+      if (serviceName != null && componentName != null) {
+        ComponentInfo componentInfo = ambariMetaInfo.getComponent(
+                stackId.getStackName(), stackId.getStackVersion(),
+                serviceName, componentName);
+        List<String> clientsToUpdateConfigsList = componentInfo.getClientsToUpdateConfigs();
+        if (clientsToUpdateConfigsList == null) {
+          clientsToUpdateConfigsList = new ArrayList<String>();
+          clientsToUpdateConfigsList.add("*");
+        }
+        String clientsToUpdateConfigs = gson.toJson(clientsToUpdateConfigsList);
+        hostParamsStage.put(CLIENTS_TO_UPDATE_CONFIGS, clientsToUpdateConfigs);
+      }
+      clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo);
+    }
+
+    String hostParamsStageJson = StageUtils.getGson().toJson(hostParamsStage);
+    String commandParamsStageJson = StageUtils.getGson().toJson(commandParamsStage);
+
+    return new ExecuteCommandJson(clusterHostInfoJson, commandParamsStageJson,
+        hostParamsStageJson);
+  }
+
+  Map<String, String> createDefaultHostParams(Cluster cluster) {
+    StackId stackId = cluster.getDesiredStackVersion();
+    TreeMap<String, String> hostLevelParams = new TreeMap<String, String>();
+    hostLevelParams.put(JDK_LOCATION, managementController.getJdkResourceUrl());
+    hostLevelParams.put(JAVA_HOME, managementController.getJavaHome());
+    hostLevelParams.put(JDK_NAME, managementController.getJDKName());
+    hostLevelParams.put(JCE_NAME, managementController.getJCEName());
+    hostLevelParams.put(STACK_NAME, stackId.getStackName());
+    hostLevelParams.put(STACK_VERSION, stackId.getStackVersion());
+    hostLevelParams.put(DB_NAME, managementController.getServerDB());
+    hostLevelParams.put(MYSQL_JDBC_URL, managementController.getMysqljdbcUrl());
+    hostLevelParams.put(ORACLE_JDBC_URL, managementController.getOjdbcUrl());
+    hostLevelParams.put(DB_DRIVER_FILENAME, configs.getMySQLJarName());
+    hostLevelParams.putAll(managementController.getRcaParameters());
+
+    return hostLevelParams;
+  }
+
+
+
+
   private ServiceComponent getServiceComponent ( ActionExecutionContext actionExecutionContext,
                                                 RequestResourceFilter resourceFilter){
     try {

http://git-wip-us.apache.org/repos/asf/ambari/blob/1c655c79/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 9d3a1f8..8f90cf4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -25,23 +25,14 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER_FILENAME;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_NAME;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOOKS_FOLDER;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JAVA_HOME;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JCE_NAME;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_LOCATION;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_NAME;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MYSQL_JDBC_URL;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.ORACLE_JDBC_URL;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_LIST;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_PACKAGE_FOLDER;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST;
 
 import java.io.File;
@@ -1795,7 +1786,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
           clusters.getHostsForCluster(cluster.getClusterName()), cluster);
 
       String clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo);
-      String HostParamsJson = StageUtils.getGson().toJson(createDefaultHostParams(cluster));
+      String HostParamsJson = StageUtils.getGson().toJson(
+          customCommandExecutionHelper.createDefaultHostParams(cluster));
 
       Stage stage = createNewStage(requestStages.getLastStageId() + 1, cluster,
           requestStages.getId(), requestProperties.get(REQUEST_CONTEXT_PROPERTY),
@@ -2024,23 +2016,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     return null;
   }
 
-  TreeMap<String, String> createDefaultHostParams(Cluster cluster) {
-    StackId stackId = cluster.getDesiredStackVersion();
-    TreeMap<String, String> hostLevelParams = new TreeMap<String, String>();
-    hostLevelParams.put(JDK_LOCATION, getJdkResourceUrl());
-    hostLevelParams.put(JAVA_HOME, getJavaHome());
-    hostLevelParams.put(JDK_NAME, getJDKName());
-    hostLevelParams.put(JCE_NAME, getJCEName());
-    hostLevelParams.put(STACK_NAME, stackId.getStackName());
-    hostLevelParams.put(STACK_VERSION, stackId.getStackVersion());
-    hostLevelParams.put(DB_NAME, getServerDB());
-    hostLevelParams.put(MYSQL_JDBC_URL, getMysqljdbcUrl());
-    hostLevelParams.put(ORACLE_JDBC_URL, getOjdbcUrl());
-    hostLevelParams.put(DB_DRIVER_FILENAME, configs.getMySQLJarName());
-    hostLevelParams.putAll(getRcaParameters());
-
-    return hostLevelParams;
-  }
 
   @Transactional
   void updateServiceStates(
@@ -3036,42 +3011,12 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
       actionExecutionHelper.validateAction(actionRequest);
     }
 
-    Map<String, String> commandParamsStage = StageUtils.getCommandParamsStage(actionExecContext);
-    Map<String, String> hostParamsStage = new HashMap<String, String>();
-    Map<String, Set<String>> clusterHostInfo;
-    String clusterHostInfoJson = "{}";
-
-    if (null != cluster) {
-      clusterHostInfo = StageUtils.getClusterHostInfo(
-        clusters.getHostsForCluster(cluster.getClusterName()), cluster);
-      hostParamsStage = createDefaultHostParams(cluster);
-      StackId stackId = cluster.getDesiredStackVersion();
-      String componentName = null;
-      String serviceName = null;
-      if (actionExecContext.getOperationLevel() != null) {
-        componentName = actionExecContext.getOperationLevel().getHostComponentName();
-        serviceName = actionExecContext.getOperationLevel().getServiceName();
-      }
-      if (serviceName != null && componentName != null) {
-        ComponentInfo componentInfo = ambariMetaInfo.getComponent(
-                stackId.getStackName(), stackId.getStackVersion(),
-                serviceName, componentName);
-        List<String> clientsToUpdateConfigsList = componentInfo.getClientsToUpdateConfigs();
-        if (clientsToUpdateConfigsList == null) {
-          clientsToUpdateConfigsList = new ArrayList<String>();
-          clientsToUpdateConfigsList.add("*");
-        }
-        String clientsToUpdateConfigs = gson.toJson(clientsToUpdateConfigsList);
-        hostParamsStage.put(CLIENTS_TO_UPDATE_CONFIGS, clientsToUpdateConfigs);
-      }
-      clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo);
-    }
-
-    String hostParamsStageJson = StageUtils.getGson().toJson(hostParamsStage);
-    String commandParamsStageJson = StageUtils.getGson().toJson(commandParamsStage);
+    ExecuteCommandJson jsons = customCommandExecutionHelper.getCommandJson(
+        actionExecContext, cluster);
 
     Stage stage = createNewStage(0, cluster, actionManager.getNextRequestId(), requestContext,
-      clusterHostInfoJson, commandParamsStageJson, hostParamsStageJson);
+      jsons.getClusterHostInfo(), jsons.getCommandParamsForStage(),
+        jsons.getHostParamsForStage());
 
     if (actionRequest.isCommand()) {
       customCommandExecutionHelper.addExecutionCommandsToStage(actionExecContext, stage, requestProperties);

http://git-wip-us.apache.org/repos/asf/ambari/blob/1c655c79/ambari-server/src/main/java/org/apache/ambari/server/controller/ExecuteCommandJson.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ExecuteCommandJson.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ExecuteCommandJson.java
new file mode 100644
index 0000000..e3f87d9
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ExecuteCommandJson.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller;
+
+/**
+ * Wraps the strings needed when creating a stage for a custom command or action.
+ */
+public class ExecuteCommandJson {
+
+  private String clusterHostJson;
+  private String commandParamsJson;
+  private String hostParamsJson;
+
+  ExecuteCommandJson(String clusterHosts, String commandParams, String hostParams) {
+    clusterHostJson = clusterHosts;
+    commandParamsJson = commandParams;
+    hostParamsJson = hostParams;
+  }
+
+  /**
+   * @return the host params
+   */
+  public String getHostParamsForStage() {
+    return hostParamsJson;
+  }
+
+  /**
+   * @return the command params
+   */
+  public String getCommandParamsForStage() {
+    return commandParamsJson;
+  }
+
+  /**
+   * @return the cluster host info
+   */
+  public String getClusterHostInfo() {
+    return clusterHostJson;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1c655c79/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 9138ec2..eb2ad76 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
@@ -39,7 +39,9 @@ import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.ActionExecutionContext;
 import org.apache.ambari.server.controller.AmbariActionExecutionHelper;
+import org.apache.ambari.server.controller.AmbariCustomCommandExecutionHelper;
 import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ExecuteCommandJson;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -95,6 +97,9 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
   private static Provider<StageFactory> stageFactory;
   @Inject
   private static Provider<AmbariActionExecutionHelper> actionExecutionHelper;
+  @Inject
+  private static Provider<AmbariCustomCommandExecutionHelper> commandExecutionHelper;
+
 
 
   static {
@@ -218,6 +223,13 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
     return resource;
   }
 
+  /**
+   * Validates a singular API request.
+   *
+   * @param requestMap the map of properties
+   * @return the validated upgrade pack
+   * @throws AmbariException
+   */
   private UpgradePack validateRequest(Map<String, Object> requestMap) throws AmbariException {
     String clusterName = (String) requestMap.get(UPGRADE_CLUSTER_NAME);
     String version = (String) requestMap.get(UPGRADE_VERSION);
@@ -307,7 +319,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
             components.get(componentName).getServiceComponentHosts().keySet());
 
         preUpgrades.addAll(buildUpgradeStages(pc, true, groupings));
-        restart.addAll(buildRollingRestart(pc, groupings));
+        restart.addAll(buildRollingRestart(serviceName, pc, groupings));
         postUpgrades.addAll(buildUpgradeStages(pc, false, groupings));
       }
     }
@@ -397,7 +409,8 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
    * @param hostGroups a list of the host groupings
    * @return the list of stages that need to be created
    */
-  private List<StageHolder> buildRollingRestart(ProcessingComponent pc, List<Set<String>> hostGroups) {
+  private List<StageHolder> buildRollingRestart(String serviceName, ProcessingComponent pc,
+      List<Set<String>> hostGroups) {
     List<StageHolder> stages = new ArrayList<StageHolder>();
 
     String textFormat = "Restarting %s on %d host(s), Phase %d/%d";
@@ -406,6 +419,8 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
     for (Set<String> hostGroup : hostGroups) {
       // !!! each of these is its own stage
       StageHolder stage = new StageHolder();
+      stage.service = serviceName;
+      stage.component = pc.name;
       stage.hosts = hostGroup;
       stage.upgradeItemEntity = new UpgradeItemEntity();
       stage.upgradeItemEntity.setText(String.format(textFormat, pc.name,
@@ -465,6 +480,8 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
   }
 
   private static class StageHolder {
+    private String service;
+    private String component;
     private TaskHolder taskHolder;
     private UpgradeItemEntity upgradeItemEntity;
     private Set<String> hosts;
@@ -506,7 +523,6 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
     if (0L == stageId) {
       stageId = 1L;
     }
-
     stage.setStageId(stageId);
 
     // add each host to this stage
@@ -523,7 +539,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
         params);
     actionContext.setTimeout(Short.valueOf((short)60));
 
-    // !!! TODO validate the action is valid
+    // !!! TODO verify the action is valid
 
     actionExecutionHelper.get().addExecutionCommandsToStage(actionContext, stage);
 
@@ -540,9 +556,42 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
   private void createRestartStage(Cluster cluster, RequestStageContainer request,
       StageHolder holder) throws AmbariException {
 
-    // !!! TODO make a restart command
-    createUpgradeTaskStage(cluster, request, holder);
+    // add each host to this stage
+    RequestResourceFilter filter = new RequestResourceFilter(holder.service, holder.component,
+        new ArrayList<String>(holder.hosts));
+
+    ActionExecutionContext actionContext = new ActionExecutionContext(
+        cluster.getClusterName(), "RESTART",
+        Collections.singletonList(filter),
+        Collections.<String, String>emptyMap());
+    actionContext.setTimeout(Short.valueOf((short)-1));
 
+    ExecuteCommandJson jsons = commandExecutionHelper.get().getCommandJson(
+        actionContext, cluster);
+
+    Stage stage = stageFactory.get().createNew(request.getId().longValue(),
+        "/tmp/ambari",
+        cluster.getClusterName(),
+        cluster.getClusterId(),
+        holder.upgradeItemEntity.getText(),
+        jsons.getClusterHostInfo(),
+        jsons.getCommandParamsForStage(),
+        jsons.getHostParamsForStage());
+
+    long stageId = request.getLastStageId() + 1;
+    if (0L == stageId) {
+      stageId = 1L;
+    }
+    stage.setStageId(stageId);
+
+    // !!! TODO verify the action is valid
+
+    Map<String, String> requestParams = new HashMap<String, String>();
+    requestParams.put("command", "RESTART");
+
+    commandExecutionHelper.get().addExecutionCommandsToStage(actionContext, stage, requestParams);
+
+    request.addStages(Collections.singletonList(stage));
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/1c655c79/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
index e068508..4b19443 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
@@ -119,62 +119,62 @@ public class AmbariManagementControllerImplTest {
     injector.injectMembers(capture(controllerCapture));
     expect(injector.getInstance(Gson.class)).andReturn(null);
     expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(null);
-    
+
     //replay
     replay(injector);
-    
-    
+
+
     AmbariManagementControllerImpl controller = new AmbariManagementControllerImpl(null, null, injector);
-    
+
     class AmbariConfigsSetter{
        public void setConfigs(AmbariManagementController controller, String masterProtocol, String masterHostname, Integer masterPort) throws Exception{
          // masterProtocol
          Class<?> c = controller.getClass();
          Field f = c.getDeclaredField("masterProtocol");
          f.setAccessible(true);
-         
+
          Field modifiersField = Field.class.getDeclaredField("modifiers");
          modifiersField.setAccessible(true);
          modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
-         
+
          f.set(controller, masterProtocol);
-         
+
          // masterHostname
          f = c.getDeclaredField("masterHostname");
          f.setAccessible(true);
-         
+
          modifiersField = Field.class.getDeclaredField("modifiers");
          modifiersField.setAccessible(true);
          modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
-         
+
          f.set(controller, masterHostname);
-         
+
          // masterPort
          f = c.getDeclaredField("masterPort");
          f.setAccessible(true);
-         
+
          modifiersField = Field.class.getDeclaredField("modifiers");
          modifiersField.setAccessible(true);
          modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
-         
+
          f.set(controller, masterPort);
        }
     }
 
     AmbariConfigsSetter ambariConfigsSetter = new AmbariConfigsSetter();
-    
+
     ambariConfigsSetter.setConfigs(controller, "http", "hostname", 8080);
     assertEquals("http://hostname:8080/jdk_path", controller.getAmbariServerURI("/jdk_path"));
-    
+
     ambariConfigsSetter.setConfigs(controller, "https", "somesecuredhost", 8443);
     assertEquals("https://somesecuredhost:8443/mysql_path", controller.getAmbariServerURI("/mysql_path"));
 
     ambariConfigsSetter.setConfigs(controller, "https", "othersecuredhost", 8443);
     assertEquals("https://othersecuredhost:8443/oracle/ojdbc/", controller.getAmbariServerURI("/oracle/ojdbc/"));
-    
+
     verify(injector);
   }
-  
+
   @Test
   public void testGetClusters() throws Exception {
     // member state mocks
@@ -584,7 +584,7 @@ public class AmbariManagementControllerImplTest {
 
     MaintenanceStateHelper maintHelper = createNiceMock(MaintenanceStateHelper.class);
     expect(maintHelper.getEffectiveState(componentHost)).andReturn(MaintenanceState.OFF).anyTimes();
-    
+
     // requests
     ServiceComponentHostRequest request1 = new ServiceComponentHostRequest(
         "cluster1", null, "component1", "host1", null);
@@ -595,7 +595,7 @@ public class AmbariManagementControllerImplTest {
     // expectations
     // constructor init
     injector.injectMembers(capture(controllerCapture));
-    
+
     expect(injector.getInstance(Gson.class)).andReturn(null);
     expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(maintHelper).anyTimes();
 
@@ -850,7 +850,7 @@ public class AmbariManagementControllerImplTest {
     injector.injectMembers(capture(controllerCapture));
     expect(injector.getInstance(Gson.class)).andReturn(null);
     expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(maintHelper).anyTimes();
-    
+
     // getHostComponent
     expect(clusters.getCluster("cluster1")).andReturn(cluster).times(3);
     expect(clusters.getClustersForHost("host1")).andReturn(Collections.singleton(cluster)).anyTimes();
@@ -927,7 +927,7 @@ public class AmbariManagementControllerImplTest {
     final ServiceComponentHost componentHost2 = createNiceMock(ServiceComponentHost.class);
     ServiceComponentHostResponse response1 = createNiceMock(ServiceComponentHostResponse.class);
     ServiceComponentHostResponse response2 = createNiceMock(ServiceComponentHostResponse.class);
-    
+
     MaintenanceStateHelper maintHelper = createNiceMock(MaintenanceStateHelper.class);
     expect(maintHelper.getEffectiveState(
       anyObject(ServiceComponentHost.class),
@@ -1456,6 +1456,7 @@ public class AmbariManagementControllerImplTest {
     Injector injector = createNiceMock(Injector.class);
     Configuration configuration = createNiceMock(Configuration.class);
 
+
     expect(cluster.getDesiredStackVersion()).andReturn(stackId);
     expect(stackId.getStackName()).andReturn(SOME_STACK_NAME).anyTimes();
     expect(stackId.getStackVersion()).andReturn(SOME_STACK_VERSION).anyTimes();
@@ -1483,8 +1484,17 @@ public class AmbariManagementControllerImplTest {
     f.setAccessible(true);
     f.set(ambariManagementControllerImpl, configuration);
 
-    TreeMap<String, String> defaultHostParams =
-            ambariManagementControllerImpl.createDefaultHostParams(cluster);
+    AmbariCustomCommandExecutionHelper helper = new AmbariCustomCommandExecutionHelper();
+    Class<?> helperClass = AmbariCustomCommandExecutionHelper.class;
+    f = helperClass.getDeclaredField("managementController");
+    f.setAccessible(true);
+    f.set(helper, ambariManagementControllerImpl);
+
+    f = helperClass.getDeclaredField("configs");
+    f.setAccessible(true);
+    f.set(helper, configuration);
+
+    Map<String, String> defaultHostParams = helper.createDefaultHostParams(cluster);
 
     assertEquals(defaultHostParams.size(), 10);
     assertEquals(defaultHostParams.get(DB_DRIVER_FILENAME), MYSQL_JAR);