Jelajahi Sumber

AMBARI-3364. Refactor Role to a class from an enum. (ncole)

Nate Cole 11 tahun lalu
induk
melakukan
62011714fe

+ 116 - 67
ambari-server/src/main/java/org/apache/ambari/server/Role.java

@@ -18,71 +18,120 @@
 
 package org.apache.ambari.server;
 
-//This enumerates all the roles that the server can handle.
-//Each component or a job maps to a particular role.
-public enum Role {
-  HCFS_SERVICE_CHECK, 
-  HCFS_CLIENT,
-  PEERSTATUS,
-  ZOOKEEPER_SERVER,
-  ZOOKEEPER_CLIENT,
-  NAMENODE,
-  NAMENODE_SERVICE_CHECK,
-  DATANODE,
-  HDFS_SERVICE_CHECK,
-  SECONDARY_NAMENODE,
-  HDFS_CLIENT,
-  HBASE_MASTER,
-  HBASE_REGIONSERVER,
-  HBASE_CLIENT,
-  JOBTRACKER,
-  TASKTRACKER,
-  MAPREDUCE_CLIENT,
-  MAPREDUCE2_CLIENT,
-  JAVA_JCE,
-  HADOOP_CLIENT,
-  JOBTRACKER_SERVICE_CHECK,
-  MAPREDUCE_SERVICE_CHECK,
-  MAPREDUCE2_SERVICE_CHECK,
-  ZOOKEEPER_SERVICE_CHECK,
-  ZOOKEEPER_QUORUM_SERVICE_CHECK,
-  HBASE_SERVICE_CHECK,
-  MYSQL_SERVER,
-  HIVE_SERVER,
-  HIVE_METASTORE,
-  HIVE_CLIENT,
-  HIVE_SERVICE_CHECK,
-  HCAT,
-  HCAT_SERVICE_CHECK,
-  OOZIE_CLIENT,
-  OOZIE_SERVER,
-  OOZIE_SERVICE_CHECK,
-  PIG,
-  PIG_SERVICE_CHECK,
-  SQOOP,
-  SQOOP_SERVICE_CHECK,
-  WEBHCAT_SERVER,
-  WEBHCAT_SERVICE_CHECK,
-  DASHBOARD,
-  DASHBOARD_SERVICE_CHECK,
-  NAGIOS_SERVER,
-  GANGLIA_SERVER,
-  GANGLIA_MONITOR,
-  GMOND_SERVICE_CHECK,
-  GMETAD_SERVICE_CHECK,
-  MONITOR_WEBSERVER,
-  DECOMMISSION_DATANODE,
-  HUE_SERVER,
-  AMBARI_SERVER_ACTION,
-  RESOURCEMANAGER,
-  RESOURCEMANAGER_SERVICE_CHECK,
-  HISTORYSERVER_SERVICE_CHECK,
-  NODEMANAGER,
-  YARN_SERVICE_CHECK,
-  YARN_CLIENT,
-  HISTORYSERVER,
-  TEZ_CLIENT,
-  FLUME_SERVER,
-  JOURNALNODE,
-  ZKFC
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Role defines the components that are available to Ambari.  It has a few
+ * similar mechanisms to an enum.
+ */
+public class Role {
+  
+  private static final Map<String, Role> roles = new ConcurrentHashMap<String, Role>();
+  
+  /**
+   * @param name the role name
+   * @return a Role instance, never <code>null</code>
+   */
+  public static Role valueOf(String name) {
+    if (roles.containsKey(name))
+      return roles.get(name);
+
+    Role role = new Role(name);
+    roles.put(name, role);
+    return role;    
+  }
+  
+  /**
+   * @return a collection of all defined Role instances
+   */
+  public static Collection<Role> values() {
+    return Collections.unmodifiableCollection(roles.values());
+  }  
+  
+  public static final Role AMBARI_SERVER_ACTION = valueOf("AMBARI_SERVER_ACTION"); 
+  public static final Role DATANODE = valueOf("DATANODE");
+  public static final Role DECOMMISSION_DATANODE = valueOf("DECOMMISSION_DATANODE");
+  public static final Role FLUME_SERVER = valueOf("FLUME_SERVER");
+  public static final Role GANGLIA_MONITOR = valueOf("GANGLIA_MONITOR");
+  public static final Role GANGLIA_SERVER = valueOf("GANGLIA_SERVER");
+  public static final Role HBASE_CLIENT = valueOf("HBASE_CLIENT");
+  public static final Role HBASE_MASTER = valueOf("HBASE_MASTER");
+  public static final Role HBASE_REGIONSERVER = valueOf("HBASE_REGIONSERVER");
+  public static final Role HBASE_SERVICE_CHECK = valueOf("HBASE_SERVICE_CHECK");
+  public static final Role HCAT = valueOf("HCAT");
+  public static final Role HCAT_SERVICE_CHECK = valueOf("HCAT_SERVICE_CHECK");
+  public static final Role HCFS_CLIENT = valueOf("HCFS_CLIENT");
+  public static final Role HCFS_SERVICE_CHECK = valueOf("HCFS_SERVICE_CHECK");
+  public static final Role HDFS_CLIENT = valueOf("HDFS_CLIENT");
+  public static final Role HDFS_SERVICE_CHECK = valueOf("HDFS_SERVICE_CHECK");
+  public static final Role HISTORYSERVER = valueOf("HISTORYSERVER");
+  public static final Role HIVE_CLIENT = valueOf("HIVE_CLIENT");
+  public static final Role HIVE_METASTORE = valueOf("HIVE_METASTORE");
+  public static final Role HIVE_SERVER = valueOf("HIVE_SERVER");
+  public static final Role HIVE_SERVICE_CHECK = valueOf("HIVE_SERVICE_CHECK");
+  public static final Role JOBTRACKER = valueOf("JOBTRACKER");
+  public static final Role NODEMANAGER = valueOf("NODEMANAGER");
+  public static final Role OOZIE_CLIENT = valueOf("OOZIE_CLIENT");
+  public static final Role OOZIE_SERVER = valueOf("OOZIE_SERVER");
+  public static final Role PEERSTATUS = valueOf("PEERSTATUS");
+  public static final Role PIG = valueOf("PIG");
+  public static final Role PIG_SERVICE_CHECK = valueOf("PIG_SERVICE_CHECK");
+  public static final Role RESOURCEMANAGER = valueOf("RESOURCEMANAGER");
+  public static final Role SECONDARY_NAMENODE = valueOf("SECONDARY_NAMENODE");
+  public static final Role SQOOP = valueOf("SQOOP");
+  public static final Role SQOOP_SERVICE_CHECK = valueOf("SQOOP_SERVICE_CHECK");
+  public static final Role HUE_SERVER = valueOf("HUE_SERVER");
+  public static final Role JOURNALNODE = valueOf("JOURNALNODE");
+  public static final Role MAPREDUCE_CLIENT = valueOf("MAPREDUCE_CLIENT");
+  public static final Role MAPREDUCE_SERVICE_CHECK = valueOf("MAPREDUCE_SERVICE_CHECK");
+  public static final Role MAPREDUCE2_SERVICE_CHECK = valueOf("MAPREDUCE2_SERVICE_CHECK");
+  public static final Role MYSQL_SERVER = valueOf("MYSQL_SERVER");
+  public static final Role NAGIOS_SERVER = valueOf("NAGIOS_SERVER");
+  public static final Role NAMENODE = valueOf("NAMENODE");
+  public static final Role NAMENODE_SERVICE_CHECK = valueOf("NAMENODE_SERVICE_CHECK");
+  public static final Role OOZIE_SERVICE_CHECK = valueOf("OOZIE_SERVICE_CHECK");
+  public static final Role TASKTRACKER = valueOf("TASKTRACKER");
+  public static final Role WEBHCAT_SERVER = valueOf("WEBHCAT_SERVER");
+  public static final Role WEBHCAT_SERVICE_CHECK = valueOf("WEBHCAT_SERVICE_CHECK");
+  public static final Role YARN_SERVICE_CHECK = valueOf("YARN_SERVICE_CHECK");
+  public static final Role ZKFC = valueOf("ZKFC");
+  public static final Role ZOOKEEPER_CLIENT = valueOf("ZOOKEEPER_CLIENT");
+  public static final Role ZOOKEEPER_QUORUM_SERVICE_CHECK = valueOf("ZOOKEEPER_QUORUM_SERVICE_CHECK");
+  public static final Role ZOOKEEPER_SERVER = valueOf("ZOOKEEPER_SERVER");
+  
+
+  private String name = null;
+  
+  private Role(String roleName) {
+    name = roleName;
+  }
+  
+  /**
+   * @return the name given to the role
+   */
+  public String name() {
+    return name;
+  }
+
+  @Override
+  public String toString() {
+    return name;
+  }
+  
+  @Override
+  public int hashCode() {
+    return name.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (null == o || !Role.class.equals(o.getClass()))
+      return false;
+    
+    return this == o || name.equals(((Role) o).name);
+  }
+
 }

+ 18 - 6
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionScheduler.java

@@ -17,7 +17,12 @@
  */
 package org.apache.ambari.server.actionmanager;
 
-import com.google.inject.persist.UnitOfWork;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.ServiceComponentNotFoundException;
@@ -27,12 +32,19 @@ import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.controller.HostsMap;
 import org.apache.ambari.server.serveraction.ServerAction;
 import org.apache.ambari.server.serveraction.ServerActionManager;
-import org.apache.ambari.server.state.*;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.HostState;
+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.fsm.InvalidStateTransitionException;
 import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpFailedEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import java.util.*;
+
+import com.google.inject.persist.UnitOfWork;
 
 /**
  * This class encapsulates the action scheduler thread.
@@ -167,7 +179,7 @@ class ActionScheduler implements Runnable {
 
         //Schedule what we have so far
         for (ExecutionCommand cmd : commandsToSchedule) {
-          if (cmd.getRole() == Role.AMBARI_SERVER_ACTION) {
+          if (Role.valueOf(cmd.getRole()).equals(Role.AMBARI_SERVER_ACTION)) {
             try {
               long now = System.currentTimeMillis();
               String hostName = cmd.getHostname();
@@ -191,7 +203,7 @@ class ActionScheduler implements Runnable {
             } catch (InvalidStateTransitionException e) {
               LOG.warn("Could not schedule host role " + cmd.toString(), e);
               db.abortHostRole(cmd.getHostname(), s.getRequestId(), s.getStageId(),
-                  cmd.getRole());
+                  Role.valueOf(cmd.getRole()));
             }
           }
         }
@@ -312,7 +324,7 @@ class ActionScheduler implements Runnable {
             LOG.warn("Host:" + host + ", role:" + roleStr + ", actionId:"
                 + s.getActionId() + " expired");
             db.timeoutHostRole(host, s.getRequestId(), s.getStageId(),
-                c.getRole());
+                Role.valueOf(c.getRole()));
             //Reinitialize status
             status = s.getHostRoleStatus(host, roleStr);
             ServiceComponentHostOpFailedEvent timeoutEvent =

+ 2 - 2
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Stage.java

@@ -197,7 +197,7 @@ public class Stage {
     cmd.setClusterName(clusterName);
     cmd.setServiceName(serviceName);
     cmd.setCommandId(this.getActionId());
-    cmd.setRole(role);
+    cmd.setRole(role.name());
     cmd.setRoleCommand(command);
     Map<String, HostRoleCommand> hrcMap = this.hostRoleCommands.get(host);
     if (hrcMap == null) {
@@ -236,7 +236,7 @@ public class Stage {
     cmd.setClusterName(clusterName);
     cmd.setServiceName("");
     cmd.setCommandId(this.getActionId());
-    cmd.setRole(role);
+    cmd.setRole(role.name());
     cmd.setRoleCommand(command);
 
     Map<String, String> roleParams = new HashMap<String, String>();

+ 3 - 3
ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java

@@ -44,7 +44,7 @@ public class ExecutionCommand extends AgentCommand {
   private long taskId;
   private String commandId;
   private String hostname;
-  private Role role;
+  private String role;
   private Map<String, String> hostLevelParams = new HashMap<String, String>();
   private Map<String, String> roleParams = null;
   private RoleCommand roleCommand;
@@ -103,12 +103,12 @@ public class ExecutionCommand extends AgentCommand {
   }
 
   @JsonProperty("role")
-  public Role getRole() {
+  public String getRole() {
     return role;
   }
 
   @JsonProperty("role")
-  public void setRole(Role role) {
+  public void setRole(String role) {
     this.role = role;
   }
 

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java

@@ -136,7 +136,7 @@ public class HostRoleCommandDAO {
         "AND command.stageId=?3 AND command.role=?4 " +
         "ORDER BY command.taskId", HostRoleCommandEntity.class);
 
-    return daoUtils.selectList(query, hostName, requestId, stageId, role);
+    return daoUtils.selectList(query, hostName, requestId, stageId, role.name());
   }
 
   @Transactional

+ 25 - 9
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostRoleCommandEntity.java

@@ -18,16 +18,33 @@
 
 package org.apache.ambari.server.orm.entities;
 
+import static org.apache.commons.lang.StringUtils.defaultString;
+
+import java.util.Arrays;
+
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.commons.lang.ArrayUtils;
 
-import javax.persistence.*;
-import java.util.Arrays;
-
-import static org.apache.commons.lang.StringUtils.defaultString;
-
 @Table(name = "host_role_command")
 @Entity
 @TableGenerator(name = "host_role_command_id_generator",
@@ -57,8 +74,7 @@ public class HostRoleCommandEntity {
   private String hostName;
 
   @Column(name = "role")
-  @Enumerated(EnumType.STRING)
-  private Role role;
+  private String role;
 
   @Column(name = "event", length = 32000)
   @Basic
@@ -143,11 +159,11 @@ public class HostRoleCommandEntity {
   }
 
   public Role getRole() {
-    return role;
+    return Role.valueOf(this.role);
   }
 
   public void setRole(Role role) {
-    this.role = role;
+    this.role = role.name();
   }
 
   public String getEvent() {

+ 13 - 6
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RoleSuccessCriteriaEntity.java

@@ -18,9 +18,17 @@
 
 package org.apache.ambari.server.orm.entities;
 
-import org.apache.ambari.server.Role;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
 
-import javax.persistence.*;
+import org.apache.ambari.server.Role;
 
 @IdClass(org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntityPK.class)
 @Table(name = "role_success_criteria")
@@ -37,8 +45,7 @@ public class RoleSuccessCriteriaEntity {
 
   @Id
   @Column(name = "role")
-  @Enumerated(EnumType.STRING)
-  private Role role;
+  private String role;
 
   @Basic
   @Column(name = "success_factor", nullable = false)
@@ -65,11 +72,11 @@ public class RoleSuccessCriteriaEntity {
   }
 
   public Role getRole() {
-    return role;
+    return Role.valueOf(role);
   }
 
   public void setRole(Role role) {
-    this.role = role;
+    this.role = role.name();
   }
 
   public Double getSuccessFactor() {

+ 6 - 8
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RoleSuccessCriteriaEntityPK.java

@@ -18,13 +18,12 @@
 
 package org.apache.ambari.server.orm.entities;
 
-import org.apache.ambari.server.Role;
+import java.io.Serializable;
 
 import javax.persistence.Column;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
 import javax.persistence.Id;
-import java.io.Serializable;
+
+import org.apache.ambari.server.Role;
 
 @SuppressWarnings("serial")
 public class RoleSuccessCriteriaEntityPK implements Serializable {
@@ -52,17 +51,16 @@ public class RoleSuccessCriteriaEntityPK implements Serializable {
     this.stageId = stageId;
   }
 
-  private Role role;
+  private String role;
 
   @Column(name = "role")
-  @Enumerated(EnumType.STRING)
   @Id
   public Role getRole() {
-    return role;
+    return Role.valueOf(role);
   }
 
   public void setRole(Role role) {
-    this.role = role;
+    this.role = role.name();
   }
 
   @Override

+ 2 - 2
ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java

@@ -2666,7 +2666,7 @@ public class AmbariManagementControllerTest {
     for (Stage s : stages) {
       for (List<ExecutionCommandWrapper> list : s.getExecutionCommands().values()) {
         for (ExecutionCommandWrapper ecw : list) {
-          if (ecw.getExecutionCommand().getRole().name().contains("SERVICE_CHECK")) {
+          if (ecw.getExecutionCommand().getRole().contains("SERVICE_CHECK")) {
             Map<String, String> hostParams = ecw.getExecutionCommand().getHostLevelParams();
             Assert.assertNotNull(hostParams);
             Assert.assertTrue(hostParams.size() > 0);
@@ -3580,7 +3580,7 @@ public class AmbariManagementControllerTest {
     assertEquals(task.getTaskId(), hostRoleCommand.getTaskId());
     assertEquals(actionRequest.getServiceName(), hostRoleCommand.getExecutionCommandWrapper().getExecutionCommand().getServiceName());
     assertEquals(actionRequest.getClusterName(), hostRoleCommand.getExecutionCommandWrapper().getExecutionCommand().getClusterName());
-    assertEquals(actionRequest.getActionName(), hostRoleCommand.getExecutionCommandWrapper().getExecutionCommand().getRole().name());
+    assertEquals(actionRequest.getActionName(), hostRoleCommand.getExecutionCommandWrapper().getExecutionCommand().getRole());
     assertEquals(Role.HDFS_CLIENT.name(), hostRoleCommand.getEvent().getEvent().getServiceComponentName());
     assertEquals(actionRequest.getParameters(), hostRoleCommand.getExecutionCommandWrapper().getExecutionCommand().getRoleParams());
     assertNotNull(hostRoleCommand.getExecutionCommandWrapper().getExecutionCommand().getConfigurations());

+ 31 - 27
ambari-server/src/test/java/org/apache/ambari/server/metadata/RoleCommandOrderTest.java

@@ -18,37 +18,38 @@
 
 package org.apache.ambari.server.metadata;
 
-import com.google.gson.Gson;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.persist.PersistService;
-import static junit.framework.Assert.*;
-import static org.easymock.EasyMock.*;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Set;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
+import org.apache.ambari.server.metadata.RoleCommandOrder.RoleCommandPair;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
-import org.apache.ambari.server.orm.entities.*;
-import org.apache.ambari.server.state.HostState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
-import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.cluster.ClusterImpl;
 import org.codehaus.jackson.annotate.JsonAutoDetect;
 import org.codehaus.jackson.annotate.JsonMethod;
 import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import org.apache.ambari.server.metadata.RoleCommandOrder.RoleCommandPair;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.persist.PersistService;
 
 public class RoleCommandOrderTest {
 
@@ -203,22 +204,25 @@ public class RoleCommandOrderTest {
 
     InputStream testJsonIS = getClass().getClassLoader().
             getResourceAsStream(TEST_RCO_DATA_FILE);
+    
     ObjectMapper mapper = new ObjectMapper();
-    Map<String,Object> testData = mapper.readValue(testJsonIS, Map.class);
+    Map<String,Object> testData = mapper.readValue(testJsonIS,
+        new TypeReference<Map<String,Object>>() {});
+        
     rco.addDependencies(testData);
 
     mapper.setVisibility(JsonMethod.ALL, JsonAutoDetect.Visibility.ANY);
     String dump = mapper.writeValueAsString(rco.getDependencies());
+    
     String expected = "{\"RoleCommandPair{role=SECONDARY_NAMENODE, " +
-            "cmd=UPGRADE}\":[{\"role\":\"NAMENODE\",\"cmd\":\"UPGRADE\"}]," +
-            "\"RoleCommandPair{role=SECONDARY_NAMENODE, cmd=START}\":" +
-            "[{\"role\":\"NAMENODE\",\"cmd\":\"START\"}]," +
-            "\"RoleCommandPair{role=DATANODE, cmd=STOP}\":" +
-            "[{\"role\":\"HBASE_MASTER\",\"cmd\":\"STOP\"}," +
-            "{\"role\":\"RESOURCEMANAGER\",\"cmd\":\"STOP\"}," +
-            "{\"role\":\"TASKTRACKER\",\"cmd\":\"STOP\"},{\"role\":" +
-            "\"NODEMANAGER\",\"cmd\":\"STOP\"},{\"role\":\"HISTORYSERVER\"," +
-            "\"cmd\":\"STOP\"},{\"role\":\"JOBTRACKER\",\"cmd\":\"STOP\"}]}";
+        "cmd=UPGRADE}\":[{\"role\":{\"name\":\"NAMENODE\"},\"cmd\":\"UPGRADE\"}]," +
+        "\"RoleCommandPair{role=SECONDARY_NAMENODE, cmd=START}\":[{\"role\":{\"name\":\"NAMENODE\"}," +
+    		"\"cmd\":\"START\"}],\"RoleCommandPair{role=DATANODE, cmd=STOP}\":[{\"role\":" +
+        "{\"name\":\"HBASE_MASTER\"},\"cmd\":\"STOP\"},{\"role\":{\"name\":\"RESOURCEMANAGER\"}," +
+    		"\"cmd\":\"STOP\"},{\"role\":{\"name\":\"TASKTRACKER\"},\"cmd\":\"STOP\"}," +
+        "{\"role\":{\"name\":\"NODEMANAGER\"},\"cmd\":\"STOP\"},{\"role\":{\"name\":\"HISTORYSERVER\"}," +
+    		"\"cmd\":\"STOP\"},{\"role\":{\"name\":\"JOBTRACKER\"},\"cmd\":\"STOP\"}]}";
+
     assertEquals(expected, dump);
   }