You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by ka...@apache.org on 2014/03/07 03:09:05 UTC

[3/3] git commit: [HELIX-398] Prevent helix-admin-webapp from running helix-core tests

[HELIX-398] Prevent helix-admin-webapp from running helix-core tests


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

Branch: refs/heads/helix-0.6.2-release
Commit: 24eacbc92f03b1b71528861a6b1ecf473c8c5231
Parents: 44c6736
Author: Kanak Biscuitwala <ka...@apache.org>
Authored: Thu Mar 6 15:37:49 2014 -0800
Committer: Kanak Biscuitwala <ka...@apache.org>
Committed: Thu Mar 6 17:50:46 2014 -0800

----------------------------------------------------------------------
 helix-admin-webapp/src/test/conf/testng.xml     |    3 +-
 .../org/apache/helix/tools/AdminTestBase.java   |   91 --
 .../org/apache/helix/tools/AdminTestHelper.java |   69 --
 .../tools/TestHelixAdminScenariosRest.java      | 1112 -----------------
 .../apache/helix/tools/TestResetInstance.java   |  117 --
 .../helix/tools/TestResetPartitionState.java    |  192 ---
 .../apache/helix/tools/TestResetResource.java   |  118 --
 .../org/apache/helix/webapp/AdminTestBase.java  |   92 ++
 .../apache/helix/webapp/AdminTestHelper.java    |   69 ++
 .../webapp/TestClusterManagementWebapp.java     |    1 -
 .../webapp/TestHelixAdminScenariosRest.java     | 1118 ++++++++++++++++++
 .../apache/helix/webapp/TestResetInstance.java  |  117 ++
 .../helix/webapp/TestResetPartitionState.java   |  194 +++
 .../apache/helix/webapp/TestResetResource.java  |  118 ++
 14 files changed, 1709 insertions(+), 1702 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/conf/testng.xml
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/conf/testng.xml b/helix-admin-webapp/src/test/conf/testng.xml
index cba086f..31da4e0 100644
--- a/helix-admin-webapp/src/test/conf/testng.xml
+++ b/helix-admin-webapp/src/test/conf/testng.xml
@@ -21,8 +21,7 @@ under the License.
 <suite name="Suite" parallel="none">
   <test name="Test" preserve-order="false">
     <packages>
-      <package name="org.apache.helix.webapp"/>
-      <package name="org.apache.helix.tools"/>
+      <package name="org.apache.helix.webapp.*"/>
     </packages>
   </test>
 </suite>

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/tools/AdminTestBase.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/tools/AdminTestBase.java b/helix-admin-webapp/src/test/java/org/apache/helix/tools/AdminTestBase.java
deleted file mode 100644
index c9ebed0..0000000
--- a/helix-admin-webapp/src/test/java/org/apache/helix/tools/AdminTestBase.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.apache.helix.tools;
-
-/*
- * 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.
- */
-
-import java.util.logging.Level;
-
-import org.I0Itec.zkclient.ZkServer;
-import org.apache.helix.TestHelper;
-import org.apache.helix.manager.zk.ZNRecordSerializer;
-import org.apache.helix.manager.zk.ZkClient;
-import org.apache.helix.tools.AdminTestHelper.AdminThread;
-import org.apache.helix.util.ZKClientPool;
-import org.apache.log4j.Logger;
-import org.restlet.Client;
-import org.restlet.data.Protocol;
-import org.testng.AssertJUnit;
-import org.testng.annotations.AfterSuite;
-import org.testng.annotations.BeforeSuite;
-
-public class AdminTestBase {
-  private static Logger LOG = Logger.getLogger(AdminTestBase.class);
-  public static final String ZK_ADDR = "localhost:2187";
-  protected final static int ADMIN_PORT = 2202;
-
-  protected static ZkServer _zkServer;
-  protected static ZkClient _gZkClient;
-  protected static ClusterSetup _gSetupTool;
-  protected static Client _gClient;
-
-  static AdminThread _adminThread;
-
-  @BeforeSuite
-  public void beforeSuite() throws Exception {
-    // TODO: use logging.properties file to config java.util.logging.Logger levels
-    java.util.logging.Logger topJavaLogger = java.util.logging.Logger.getLogger("");
-    topJavaLogger.setLevel(Level.WARNING);
-
-    // start zk
-    _zkServer = TestHelper.startZkServer(ZK_ADDR);
-    AssertJUnit.assertTrue(_zkServer != null);
-    ZKClientPool.reset();
-
-    _gZkClient = new ZkClient(ZK_ADDR);
-    _gZkClient.setZkSerializer(new ZNRecordSerializer());
-    _gSetupTool = new ClusterSetup(ZK_ADDR);
-
-    // start admin
-    _adminThread = new AdminThread(ZK_ADDR, ADMIN_PORT);
-    _adminThread.start();
-
-    // create a client
-    _gClient = new Client(Protocol.HTTP);
-
-    // wait for the web service to start
-    Thread.sleep(100);
-  }
-
-  @AfterSuite
-  public void afterSuite() {
-    // System.out.println("START AdminTestBase.afterSuite() at " + new
-    // Date(System.currentTimeMillis()));
-    // stop admin
-    _adminThread.stop();
-
-    // stop zk
-    ZKClientPool.reset();
-    _gZkClient.close();
-
-    TestHelper.stopZkServer(_zkServer);
-    // System.out.println("END AdminTestBase.afterSuite() at " + new
-    // Date(System.currentTimeMillis()));
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/tools/AdminTestHelper.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/tools/AdminTestHelper.java b/helix-admin-webapp/src/test/java/org/apache/helix/tools/AdminTestHelper.java
deleted file mode 100644
index 93ff213..0000000
--- a/helix-admin-webapp/src/test/java/org/apache/helix/tools/AdminTestHelper.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.apache.helix.tools;
-
-/*
- * 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.
- */
-
-import java.util.concurrent.CountDownLatch;
-
-import org.apache.helix.webapp.HelixAdminWebApp;
-
-public class AdminTestHelper {
-
-  public static class AdminThread {
-    Thread _adminThread;
-    CountDownLatch _stopCountDown = new CountDownLatch(1);
-    String _zkAddr;
-    int _port;
-
-    public AdminThread(String zkAddr, int port) {
-      _zkAddr = zkAddr;
-      _port = port;
-    }
-
-    public void start() {
-      Thread adminThread = new Thread(new Runnable() {
-        @Override
-        public void run() {
-          HelixAdminWebApp app = null;
-          try {
-            app = new HelixAdminWebApp(_zkAddr, _port);
-            app.start();
-            // Thread.currentThread().join();
-            _stopCountDown.await();
-          } catch (Exception e) {
-            e.printStackTrace();
-          } finally {
-            if (app != null) {
-              // System.err.println("Stopping HelixAdminWebApp");
-              app.stop();
-            }
-          }
-        }
-      });
-
-      adminThread.setDaemon(true);
-      adminThread.start();
-    }
-
-    public void stop() {
-      _stopCountDown.countDown();
-    }
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestHelixAdminScenariosRest.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestHelixAdminScenariosRest.java b/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestHelixAdminScenariosRest.java
deleted file mode 100644
index 0680764..0000000
--- a/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestHelixAdminScenariosRest.java
+++ /dev/null
@@ -1,1112 +0,0 @@
-package org.apache.helix.tools;
-
-/*
- * 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.
- */
-
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.helix.HelixAdmin;
-import org.apache.helix.HelixDataAccessor;
-import org.apache.helix.ZNRecord;
-import org.apache.helix.integration.manager.ClusterControllerManager;
-import org.apache.helix.integration.manager.ClusterDistributedController;
-import org.apache.helix.integration.manager.MockParticipantManager;
-import org.apache.helix.manager.zk.ZKUtil;
-import org.apache.helix.model.ExternalView;
-import org.apache.helix.model.IdealState;
-import org.apache.helix.model.IdealState.IdealStateProperty;
-import org.apache.helix.model.InstanceConfig;
-import org.apache.helix.model.LiveInstance;
-import org.apache.helix.tools.ClusterStateVerifier.BestPossAndExtViewZkVerifier;
-import org.apache.helix.tools.ClusterStateVerifier.MasterNbInExtViewVerifier;
-import org.apache.helix.webapp.RestAdminApplication;
-import org.apache.helix.webapp.resources.ClusterRepresentationUtil;
-import org.apache.helix.webapp.resources.InstancesResource.ListInstancesWrapper;
-import org.apache.helix.webapp.resources.JsonParameters;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.restlet.Component;
-import org.restlet.Request;
-import org.restlet.Response;
-import org.restlet.data.MediaType;
-import org.restlet.data.Method;
-import org.restlet.data.Reference;
-import org.restlet.data.Status;
-import org.restlet.representation.Representation;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Simulate all the admin tasks needed by using command line tool
- */
-public class TestHelixAdminScenariosRest extends AdminTestBase {
-  RestAdminApplication _adminApp;
-  Component _component;
-  String _tag1 = "tag1123";
-  String _tag2 = "tag212334";
-
-  public static String ObjectToJson(Object object) throws JsonGenerationException,
-      JsonMappingException, IOException {
-    ObjectMapper mapper = new ObjectMapper();
-    SerializationConfig serializationConfig = mapper.getSerializationConfig();
-    serializationConfig.set(SerializationConfig.Feature.INDENT_OUTPUT, true);
-
-    StringWriter sw = new StringWriter();
-    mapper.writeValue(sw, object);
-
-    return sw.toString();
-  }
-
-  public static <T extends Object> T JsonToObject(Class<T> clazz, String jsonString)
-      throws JsonParseException, JsonMappingException, IOException {
-    StringReader sr = new StringReader(jsonString);
-    ObjectMapper mapper = new ObjectMapper();
-    return mapper.readValue(sr, clazz);
-  }
-
-  static String assertSuccessPostOperation(String url, Map<String, String> jsonParameters,
-      boolean hasException) throws IOException {
-    Reference resourceRef = new Reference(url);
-
-    Request request = new Request(Method.POST, resourceRef);
-    request.setEntity(
-        JsonParameters.JSON_PARAMETERS + "="
-            + ClusterRepresentationUtil.ObjectToJson(jsonParameters), MediaType.APPLICATION_ALL);
-    Response response = _gClient.handle(request);
-    Representation result = response.getEntity();
-    StringWriter sw = new StringWriter();
-    result.write(sw);
-
-    Assert.assertTrue(response.getStatus().getCode() == Status.SUCCESS_OK.getCode());
-    Assert.assertTrue(hasException == sw.toString().toLowerCase().contains("exception"));
-    return sw.toString();
-  }
-
-  static String assertSuccessPostOperation(String url, Map<String, String> jsonParameters,
-      Map<String, String> extraForm, boolean hasException) throws IOException {
-    Reference resourceRef = new Reference(url);
-
-    Request request = new Request(Method.POST, resourceRef);
-    String entity =
-        JsonParameters.JSON_PARAMETERS + "="
-            + ClusterRepresentationUtil.ObjectToJson(jsonParameters);
-    for (String key : extraForm.keySet()) {
-      entity = entity + "&" + (key + "=" + extraForm.get(key));
-    }
-    request.setEntity(entity, MediaType.APPLICATION_ALL);
-    Response response = _gClient.handle(request);
-    Representation result = response.getEntity();
-    StringWriter sw = new StringWriter();
-    result.write(sw);
-
-    Assert.assertTrue(response.getStatus().getCode() == Status.SUCCESS_OK.getCode());
-    Assert.assertTrue(hasException == sw.toString().toLowerCase().contains("exception"));
-    return sw.toString();
-  }
-
-  void deleteUrl(String url, boolean hasException) throws IOException {
-    Reference resourceRef = new Reference(url);
-    Request request = new Request(Method.DELETE, resourceRef);
-    Response response = _gClient.handle(request);
-    Representation result = response.getEntity();
-    StringWriter sw = new StringWriter();
-    result.write(sw);
-    Assert.assertTrue(hasException == sw.toString().toLowerCase().contains("exception"));
-  }
-
-  String getUrl(String url) throws IOException {
-    Reference resourceRef = new Reference(url);
-    Request request = new Request(Method.GET, resourceRef);
-    Response response = _gClient.handle(request);
-    Representation result = response.getEntity();
-    StringWriter sw = new StringWriter();
-    result.write(sw);
-    return sw.toString();
-  }
-
-  String getClusterUrl(String cluster) {
-    return "http://localhost:" + ADMIN_PORT + "/clusters" + "/" + cluster;
-  }
-
-  String getInstanceUrl(String cluster, String instance) {
-    return "http://localhost:" + ADMIN_PORT + "/clusters/" + cluster + "/instances/" + instance;
-  }
-
-  String getResourceUrl(String cluster, String resourceGroup) {
-    return "http://localhost:" + ADMIN_PORT + "/clusters/" + cluster + "/resourceGroups/"
-        + resourceGroup;
-  }
-
-  void assertClusterSetupException(String command) {
-    boolean exceptionThrown = false;
-    try {
-      ClusterSetup.processCommandLineArgs(command.split(" "));
-    } catch (Exception e) {
-      exceptionThrown = true;
-    }
-    Assert.assertTrue(exceptionThrown);
-  }
-
-  private Map<String, String> addClusterCmd(String clusterName) {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.CLUSTER_NAME, clusterName);
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.addCluster);
-
-    return parameters;
-  }
-
-  private void addCluster(String clusterName) throws IOException {
-    String url = "http://localhost:" + ADMIN_PORT + "/clusters";
-    String response = assertSuccessPostOperation(url, addClusterCmd(clusterName), false);
-    Assert.assertTrue(response.contains(clusterName));
-  }
-
-  @Test
-  public void testAddCluster() throws Exception {
-    String url = "http://localhost:" + ADMIN_PORT + "/clusters";
-
-    // Normal add
-    String response = assertSuccessPostOperation(url, addClusterCmd("clusterTest"), false);
-    Assert.assertTrue(response.contains("clusterTest"));
-
-    // malformed cluster name
-    response = assertSuccessPostOperation(url, addClusterCmd("/ClusterTest"), true);
-
-    // Add the grand cluster
-    response = assertSuccessPostOperation(url, addClusterCmd("Klazt3rz"), false);
-    Assert.assertTrue(response.contains("Klazt3rz"));
-
-    response = assertSuccessPostOperation(url, addClusterCmd("\\ClusterTest"), false);
-    Assert.assertTrue(response.contains("\\ClusterTest"));
-
-    // Add already exist cluster
-    response = assertSuccessPostOperation(url, addClusterCmd("clusterTest"), true);
-
-    // delete cluster without resource and instance
-    Assert.assertTrue(ZKUtil.isClusterSetup("Klazt3rz", _gZkClient));
-    Assert.assertTrue(ZKUtil.isClusterSetup("clusterTest", _gZkClient));
-    Assert.assertTrue(ZKUtil.isClusterSetup("\\ClusterTest", _gZkClient));
-
-    String clusterUrl = getClusterUrl("\\ClusterTest");
-    deleteUrl(clusterUrl, false);
-
-    String clustersUrl = "http://localhost:" + ADMIN_PORT + "/clusters";
-    response = getUrl(clustersUrl);
-
-    clusterUrl = getClusterUrl("clusterTest1");
-    deleteUrl(clusterUrl, false);
-    response = getUrl(clustersUrl);
-    Assert.assertFalse(response.contains("clusterTest1"));
-
-    clusterUrl = getClusterUrl("clusterTest");
-    deleteUrl(clusterUrl, false);
-    response = getUrl(clustersUrl);
-    Assert.assertFalse(response.contains("clusterTest"));
-
-    clusterUrl = getClusterUrl("clusterTestOK");
-    deleteUrl(clusterUrl, false);
-
-    Assert.assertFalse(_gZkClient.exists("/clusterTest"));
-    Assert.assertFalse(_gZkClient.exists("/clusterTest1"));
-    Assert.assertFalse(_gZkClient.exists("/clusterTestOK"));
-
-    response = assertSuccessPostOperation(url, addClusterCmd("clusterTest1"), false);
-    response = getUrl(clustersUrl);
-    Assert.assertTrue(response.contains("clusterTest1"));
-  }
-
-  private Map<String, String> addResourceCmd(String resourceName, String stateModelDef,
-      int partition) {
-    Map<String, String> parameters = new HashMap<String, String>();
-
-    parameters.put(JsonParameters.RESOURCE_GROUP_NAME, resourceName);
-    parameters.put(JsonParameters.STATE_MODEL_DEF_REF, stateModelDef);
-    parameters.put(JsonParameters.PARTITIONS, "" + partition);
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.addResource);
-
-    return parameters;
-  }
-
-  private void addResource(String clusterName, String resourceName, int partitions)
-      throws IOException {
-    final String reourcesUrl =
-        "http://localhost:" + ADMIN_PORT + "/clusters/" + clusterName + "/resourceGroups";
-    String response =
-        assertSuccessPostOperation(reourcesUrl,
-            addResourceCmd(resourceName, "MasterSlave", partitions), false);
-    Assert.assertTrue(response.contains(resourceName));
-  }
-
-  @Test
-  public void testAddResource() throws Exception {
-    final String clusterName = "clusterTestAddResource";
-    addCluster(clusterName);
-
-    String reourcesUrl =
-        "http://localhost:" + ADMIN_PORT + "/clusters/" + clusterName + "/resourceGroups";
-    String response =
-        assertSuccessPostOperation(reourcesUrl, addResourceCmd("db_22", "MasterSlave", 144), false);
-    Assert.assertTrue(response.contains("db_22"));
-
-    response =
-        assertSuccessPostOperation(reourcesUrl, addResourceCmd("db_11", "MasterSlave", 44), false);
-    Assert.assertTrue(response.contains("db_11"));
-
-    // Add duplicate resource
-    response =
-        assertSuccessPostOperation(reourcesUrl, addResourceCmd("db_22", "OnlineOffline", 55), true);
-
-    // drop resource now
-    String resourceUrl = getResourceUrl(clusterName, "db_11");
-    deleteUrl(resourceUrl, false);
-    Assert.assertFalse(_gZkClient.exists("/" + clusterName + "/IDEALSTATES/db_11"));
-
-    response =
-        assertSuccessPostOperation(reourcesUrl, addResourceCmd("db_11", "MasterSlave", 44), false);
-    Assert.assertTrue(response.contains("db_11"));
-
-    Assert.assertTrue(_gZkClient.exists("/" + clusterName + "/IDEALSTATES/db_11"));
-
-    response =
-        assertSuccessPostOperation(reourcesUrl, addResourceCmd("db_33", "MasterSlave", 44), false);
-    Assert.assertTrue(response.contains("db_33"));
-
-    response =
-        assertSuccessPostOperation(reourcesUrl, addResourceCmd("db_44", "MasterSlave", 44), false);
-    Assert.assertTrue(response.contains("db_44"));
-  }
-
-  private Map<String, String> activateClusterCmd(String grandClusterName, boolean enabled) {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.GRAND_CLUSTER, grandClusterName);
-    parameters.put(JsonParameters.ENABLED, "" + enabled);
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.activateCluster);
-
-    return parameters;
-  }
-
-  @Test
-  public void testDeactivateCluster() throws Exception {
-    final String clusterName = "clusterTestDeactivateCluster";
-    final String controllerClusterName = "controllerClusterTestDeactivateCluster";
-
-    Map<String, MockParticipantManager> participants =
-        new HashMap<String, MockParticipantManager>();
-    Map<String, ClusterDistributedController> distControllers =
-        new HashMap<String, ClusterDistributedController>();
-
-    // setup cluster
-    addCluster(clusterName);
-    addInstancesToCluster(clusterName, "localhost:123", 6, null);
-    addResource(clusterName, "db_11", 16);
-    rebalanceResource(clusterName, "db_11");
-
-    addCluster(controllerClusterName);
-    addInstancesToCluster(controllerClusterName, "controller_900", 2, null);
-
-    // start mock nodes
-    for (int i = 0; i < 6; i++) {
-      String instanceName = "localhost_123" + i;
-      MockParticipantManager participant =
-          new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      participant.syncStart();
-      participants.put(instanceName, participant);
-    }
-
-    // start controller nodes
-    for (int i = 0; i < 2; i++) {
-      String controllerName = "controller_900" + i;
-      ClusterDistributedController distController =
-          new ClusterDistributedController(ZK_ADDR, controllerClusterName, controllerName);
-      distController.syncStart();
-      distControllers.put(controllerName, distController);
-    }
-
-    String clusterUrl = getClusterUrl(clusterName);
-
-    // activate cluster
-    assertSuccessPostOperation(clusterUrl, activateClusterCmd(controllerClusterName, true), false);
-    boolean verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            controllerClusterName));
-    Assert.assertTrue(verifyResult);
-
-    verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-
-    // deactivate cluster
-    assertSuccessPostOperation(clusterUrl, activateClusterCmd(controllerClusterName, false), false);
-    Thread.sleep(6000);
-    Assert.assertFalse(_gZkClient.exists("/" + controllerClusterName + "/IDEALSTATES/"
-        + clusterName));
-
-    HelixDataAccessor accessor = participants.get("localhost_1231").getHelixDataAccessor();
-    String path = accessor.keyBuilder().controllerLeader().getPath();
-    Assert.assertFalse(_gZkClient.exists(path));
-
-    deleteUrl(clusterUrl, true);
-    Assert.assertTrue(_gZkClient.exists("/" + clusterName));
-
-    // leader node should be gone
-    for (MockParticipantManager participant : participants.values()) {
-      participant.syncStop();
-    }
-    deleteUrl(clusterUrl, false);
-
-    Assert.assertFalse(_gZkClient.exists("/" + clusterName));
-
-    // clean up
-    for (ClusterDistributedController controller : distControllers.values()) {
-      controller.syncStop();
-    }
-
-    for (MockParticipantManager participant : participants.values()) {
-      participant.syncStop();
-    }
-  }
-
-  private Map<String, String> addIdealStateCmd() {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.addIdealState);
-
-    return parameters;
-  }
-
-  @Test
-  public void testDropAddResource() throws Exception {
-    final String clusterName = "clusterTestDropAddResource";
-
-    // setup cluster
-    addCluster(clusterName);
-    addResource(clusterName, "db_11", 22);
-    addInstancesToCluster(clusterName, "localhost_123", 6, null);
-    rebalanceResource(clusterName, "db_11");
-    ZNRecord record = _gSetupTool._admin.getResourceIdealState(clusterName, "db_11").getRecord();
-    String x = ObjectToJson(record);
-
-    FileWriter fos = new FileWriter("/tmp/temp.log");
-    PrintWriter pw = new PrintWriter(fos);
-    pw.write(x);
-    pw.close();
-
-    ClusterControllerManager controller =
-        new ClusterControllerManager(ZK_ADDR, clusterName, "controller_9900");
-    controller.syncStart();
-
-    // start mock nodes
-    Map<String, MockParticipantManager> participants =
-        new HashMap<String, MockParticipantManager>();
-    for (int i = 0; i < 6; i++) {
-      String instanceName = "localhost_123" + i;
-      MockParticipantManager participant =
-          new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      participant.syncStart();
-      participants.put(instanceName, participant);
-    }
-    boolean verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-
-    String resourceUrl = getResourceUrl(clusterName, "db_11");
-    deleteUrl(resourceUrl, false);
-
-    verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-    addResource(clusterName, "db_11", 22);
-
-    String idealStateUrl = getResourceUrl(clusterName, "db_11") + "/idealState";
-    Map<String, String> extraform = new HashMap<String, String>();
-    extraform.put(JsonParameters.NEW_IDEAL_STATE, x);
-    assertSuccessPostOperation(idealStateUrl, addIdealStateCmd(), extraform, false);
-
-    verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-
-    ZNRecord record2 = _gSetupTool._admin.getResourceIdealState(clusterName, "db_11").getRecord();
-    Assert.assertTrue(record2.equals(record));
-
-    // clean up
-    controller.syncStop();
-    for (MockParticipantManager participant : participants.values()) {
-      participant.syncStop();
-    }
-  }
-
-  private Map<String, String> addInstanceCmd(String instances) {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.INSTANCE_NAMES, instances);
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.addInstance);
-
-    return parameters;
-  }
-
-  private Map<String, String> expandClusterCmd() {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.expandCluster);
-
-    return parameters;
-  }
-
-  @Test
-  public void testExpandCluster() throws Exception {
-
-    final String clusterName = "clusterTestExpandCluster";
-
-    // setup cluster
-    addCluster(clusterName);
-    addInstancesToCluster(clusterName, "localhost:123", 6, null);
-    addResource(clusterName, "db_11", 22);
-    rebalanceResource(clusterName, "db_11");
-
-    ClusterControllerManager controller =
-        new ClusterControllerManager(ZK_ADDR, clusterName, "controller_9900");
-    controller.syncStart();
-
-    // start mock nodes
-    Map<String, MockParticipantManager> participants =
-        new HashMap<String, MockParticipantManager>();
-    for (int i = 0; i < 6; i++) {
-      String instanceName = "localhost_123" + i;
-      MockParticipantManager participant =
-          new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      participant.syncStart();
-      participants.put(instanceName, participant);
-    }
-
-    boolean verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-
-    String clusterUrl = getClusterUrl(clusterName);
-    String instancesUrl = clusterUrl + "/instances";
-
-    String instances = "localhost:12331;localhost:12341;localhost:12351;localhost:12361";
-    String response = assertSuccessPostOperation(instancesUrl, addInstanceCmd(instances), false);
-    String[] hosts = instances.split(";");
-    for (String host : hosts) {
-      Assert.assertTrue(response.contains(host.replace(':', '_')));
-    }
-
-    response = assertSuccessPostOperation(clusterUrl, expandClusterCmd(), false);
-
-    for (int i = 3; i <= 6; i++) {
-      String instanceName = "localhost_123" + i + "1";
-      MockParticipantManager participant =
-          new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      participant.syncStart();
-      participants.put(instanceName, participant);
-    }
-
-    verifyResult =
-        ClusterStateVerifier
-            .verifyByZkCallback(new MasterNbInExtViewVerifier(ZK_ADDR, clusterName));
-    Assert.assertTrue(verifyResult);
-
-    verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-
-    // clean up
-    controller.syncStop();
-    for (MockParticipantManager participant : participants.values()) {
-      participant.syncStop();
-    }
-  }
-
-  private Map<String, String> enablePartitionCmd(String resourceName, String partitions,
-      boolean enabled) {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.enablePartition);
-    parameters.put(JsonParameters.ENABLED, "" + enabled);
-    parameters.put(JsonParameters.PARTITION, partitions);
-    parameters.put(JsonParameters.RESOURCE, resourceName);
-
-    return parameters;
-  }
-
-  @Test
-  public void testEnablePartitions() throws IOException, InterruptedException {
-    final String clusterName = "clusterTestEnablePartitions";
-
-    // setup cluster
-    addCluster(clusterName);
-    addInstancesToCluster(clusterName, "localhost:123", 6, null);
-    addResource(clusterName, "db_11", 22);
-    rebalanceResource(clusterName, "db_11");
-
-    ClusterControllerManager controller =
-        new ClusterControllerManager(ZK_ADDR, clusterName, "controller_9900");
-    controller.syncStart();
-
-    // start mock nodes
-    Map<String, MockParticipantManager> participants =
-        new HashMap<String, MockParticipantManager>();
-    for (int i = 0; i < 6; i++) {
-      String instanceName = "localhost_123" + i;
-      MockParticipantManager participant =
-          new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      participant.syncStart();
-      participants.put(instanceName, participant);
-    }
-
-    HelixDataAccessor accessor = participants.get("localhost_1231").getHelixDataAccessor();
-    // drop node should fail as not disabled
-    String hostName = "localhost_1231";
-    String instanceUrl = getInstanceUrl(clusterName, hostName);
-    ExternalView ev = accessor.getProperty(accessor.keyBuilder().externalView("db_11"));
-
-    String response =
-        assertSuccessPostOperation(instanceUrl,
-            enablePartitionCmd("db_11", "db_11_0;db_11_11", false), false);
-    Assert.assertTrue(response.contains("DISABLED_PARTITION"));
-    Assert.assertTrue(response.contains("db_11_0"));
-    Assert.assertTrue(response.contains("db_11_11"));
-
-    boolean verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-
-    ev = accessor.getProperty(accessor.keyBuilder().externalView("db_11"));
-    Assert.assertEquals(ev.getStateMap("db_11_0").get(hostName), "OFFLINE");
-    Assert.assertEquals(ev.getStateMap("db_11_11").get(hostName), "OFFLINE");
-
-    response =
-        assertSuccessPostOperation(instanceUrl,
-            enablePartitionCmd("db_11", "db_11_0;db_11_11", true), false);
-    Assert.assertFalse(response.contains("db_11_0"));
-    Assert.assertFalse(response.contains("db_11_11"));
-
-    verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-
-    ev = accessor.getProperty(accessor.keyBuilder().externalView("db_11"));
-    Assert.assertEquals(ev.getStateMap("db_11_0").get(hostName), "MASTER");
-    Assert.assertEquals(ev.getStateMap("db_11_11").get(hostName), "SLAVE");
-
-    // clean up
-    controller.syncStop();
-    for (MockParticipantManager participant : participants.values()) {
-      participant.syncStop();
-    }
-  }
-
-  private Map<String, String> enableInstanceCmd(boolean enabled) {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.enableInstance);
-    parameters.put(JsonParameters.ENABLED, "" + enabled);
-    return parameters;
-  }
-
-  private Map<String, String> swapInstanceCmd(String oldInstance, String newInstance) {
-    Map<String, String> parameters = new HashMap<String, String>();
-
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.swapInstance);
-    parameters.put(JsonParameters.OLD_INSTANCE, oldInstance);
-    parameters.put(JsonParameters.NEW_INSTANCE, newInstance);
-
-    return parameters;
-  }
-
-  @Test
-  public void testInstanceOperations() throws Exception {
-    final String clusterName = "clusterTestInstanceOperations";
-
-    // setup cluster
-    addCluster(clusterName);
-    addInstancesToCluster(clusterName, "localhost:123", 6, null);
-    addResource(clusterName, "db_11", 8);
-    rebalanceResource(clusterName, "db_11");
-
-    ClusterControllerManager controller =
-        new ClusterControllerManager(ZK_ADDR, clusterName, "controller_9900");
-    controller.syncStart();
-
-    // start mock nodes
-    Map<String, MockParticipantManager> participants =
-        new HashMap<String, MockParticipantManager>();
-    for (int i = 0; i < 6; i++) {
-      String instanceName = "localhost_123" + i;
-      MockParticipantManager participant =
-          new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      participant.syncStart();
-      participants.put(instanceName, participant);
-    }
-
-    HelixDataAccessor accessor;
-    // drop node should fail as not disabled
-    String instanceUrl = getInstanceUrl(clusterName, "localhost_1232");
-    deleteUrl(instanceUrl, true);
-
-    // disabled node
-    String response = assertSuccessPostOperation(instanceUrl, enableInstanceCmd(false), false);
-    Assert.assertTrue(response.contains("false"));
-
-    // Cannot drop / swap
-    deleteUrl(instanceUrl, true);
-
-    String instancesUrl = getClusterUrl(clusterName) + "/instances";
-    response =
-        assertSuccessPostOperation(instancesUrl,
-            swapInstanceCmd("localhost_1232", "localhost_12320"), true);
-
-    // disconnect the node
-    participants.get("localhost_1232").syncStop();
-
-    // add new node then swap instance
-    response = assertSuccessPostOperation(instancesUrl, addInstanceCmd("localhost_12320"), false);
-    Assert.assertTrue(response.contains("localhost_12320"));
-
-    // swap instance. The instance get swapped out should not exist anymore
-    response =
-        assertSuccessPostOperation(instancesUrl,
-            swapInstanceCmd("localhost_1232", "localhost_12320"), false);
-    Assert.assertTrue(response.contains("localhost_12320"));
-    Assert.assertFalse(response.contains("localhost_1232\""));
-
-    accessor = participants.get("localhost_1231").getHelixDataAccessor();
-    String path = accessor.keyBuilder().instanceConfig("localhost_1232").getPath();
-    Assert.assertFalse(_gZkClient.exists(path));
-
-    MockParticipantManager newParticipant =
-        new MockParticipantManager(ZK_ADDR, clusterName, "localhost_12320");
-    newParticipant.syncStart();
-    participants.put("localhost_12320", newParticipant);
-
-    boolean verifyResult =
-        ClusterStateVerifier
-            .verifyByZkCallback(new MasterNbInExtViewVerifier(ZK_ADDR, clusterName));
-    Assert.assertTrue(verifyResult);
-
-    // clean up
-    controller.syncStop();
-    for (MockParticipantManager participant : participants.values()) {
-      participant.syncStop();
-    }
-  }
-
-  @Test
-  public void testStartCluster() throws Exception {
-    final String clusterName = "clusterTestStartCluster";
-    final String controllerClusterName = "controllerClusterTestStartCluster";
-
-    Map<String, MockParticipantManager> participants =
-        new HashMap<String, MockParticipantManager>();
-    Map<String, ClusterDistributedController> distControllers =
-        new HashMap<String, ClusterDistributedController>();
-
-    // setup cluster
-    addCluster(clusterName);
-    addInstancesToCluster(clusterName, "localhost:123", 6, null);
-    addResource(clusterName, "db_11", 8);
-    rebalanceResource(clusterName, "db_11");
-
-    addCluster(controllerClusterName);
-    addInstancesToCluster(controllerClusterName, "controller_900", 2, null);
-
-    // start mock nodes
-    for (int i = 0; i < 6; i++) {
-      String instanceName = "localhost_123" + i;
-      MockParticipantManager participant =
-          new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      participant.syncStart();
-      participants.put(instanceName, participant);
-    }
-
-    // start controller nodes
-    for (int i = 0; i < 2; i++) {
-      String controllerName = "controller_900" + i;
-      ClusterDistributedController distController =
-          new ClusterDistributedController(ZK_ADDR, controllerClusterName, controllerName);
-      distController.syncStart();
-      distControllers.put(controllerName, distController);
-    }
-    Thread.sleep(100);
-
-    // activate clusters
-    // wrong grand clustername
-    String clusterUrl = getClusterUrl(clusterName);
-    assertSuccessPostOperation(clusterUrl, activateClusterCmd("nonExistCluster", true), true);
-
-    // wrong cluster name
-    clusterUrl = getClusterUrl("nonExistCluster");
-    assertSuccessPostOperation(clusterUrl, activateClusterCmd(controllerClusterName, true), true);
-
-    clusterUrl = getClusterUrl(clusterName);
-    assertSuccessPostOperation(clusterUrl, activateClusterCmd(controllerClusterName, true), false);
-    Thread.sleep(500);
-
-    deleteUrl(clusterUrl, true);
-
-    // verify leader node
-    HelixDataAccessor accessor = distControllers.get("controller_9001").getHelixDataAccessor();
-    LiveInstance controllerLeader = accessor.getProperty(accessor.keyBuilder().controllerLeader());
-    Assert.assertTrue(controllerLeader.getInstanceName().startsWith("controller_900"));
-
-    accessor = participants.get("localhost_1232").getHelixDataAccessor();
-    LiveInstance leader = accessor.getProperty(accessor.keyBuilder().controllerLeader());
-    for (int i = 0; i < 5; i++) {
-      if (leader != null) {
-        break;
-      }
-      Thread.sleep(1000);
-      leader = accessor.getProperty(accessor.keyBuilder().controllerLeader());
-    }
-    Assert.assertTrue(leader.getInstanceName().startsWith("controller_900"));
-
-    boolean verifyResult =
-        ClusterStateVerifier
-            .verifyByZkCallback(new MasterNbInExtViewVerifier(ZK_ADDR, clusterName));
-    Assert.assertTrue(verifyResult);
-
-    verifyResult =
-        ClusterStateVerifier.verifyByZkCallback(new BestPossAndExtViewZkVerifier(ZK_ADDR,
-            clusterName));
-    Assert.assertTrue(verifyResult);
-    Thread.sleep(1000);
-
-    // clean up
-    for (ClusterDistributedController controller : distControllers.values()) {
-      controller.syncStop();
-    }
-    for (MockParticipantManager participant : participants.values()) {
-      participant.syncStop();
-    }
-  }
-
-  private Map<String, String> rebalanceCmd(int replicas, String prefix, String tag) {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.REPLICAS, "" + replicas);
-    if (prefix != null) {
-      parameters.put(JsonParameters.RESOURCE_KEY_PREFIX, prefix);
-    }
-    if (tag != null) {
-      parameters.put(ClusterSetup.instanceGroupTag, tag);
-    }
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.rebalance);
-
-    return parameters;
-  }
-
-  private void rebalanceResource(String clusterName, String resourceName) throws IOException {
-    String resourceUrl = getResourceUrl(clusterName, resourceName);
-    String idealStateUrl = resourceUrl + "/idealState";
-
-    assertSuccessPostOperation(idealStateUrl, rebalanceCmd(3, null, null), false);
-  }
-
-  @Test
-  public void testRebalanceResource() throws Exception {
-    // add a normal cluster
-    final String clusterName = "clusterTestRebalanceResource";
-    addCluster(clusterName);
-
-    addInstancesToCluster(clusterName, "localhost:123", 3, _tag1);
-    addResource(clusterName, "db_11", 44);
-
-    String resourceUrl = getResourceUrl(clusterName, "db_11");
-
-    String idealStateUrl = resourceUrl + "/idealState";
-    String response = assertSuccessPostOperation(idealStateUrl, rebalanceCmd(3, null, null), false);
-    ZNRecord record = JsonToObject(ZNRecord.class, response);
-    Assert.assertTrue(record.getId().equalsIgnoreCase("db_11"));
-    Assert.assertEquals(record.getListField("db_11_0").size(), 3);
-    Assert.assertEquals(record.getMapField("db_11_0").size(), 3);
-
-    deleteUrl(resourceUrl, false);
-
-    // re-add and rebalance
-    final String reourcesUrl =
-        "http://localhost:" + ADMIN_PORT + "/clusters/" + clusterName + "/resourceGroups";
-
-    response = getUrl(reourcesUrl);
-    Assert.assertFalse(response.contains("db_11"));
-
-    addResource(clusterName, "db_11", 48);
-    idealStateUrl = resourceUrl + "/idealState";
-    response = assertSuccessPostOperation(idealStateUrl, rebalanceCmd(3, null, null), false);
-    record = JsonToObject(ZNRecord.class, response);
-    Assert.assertTrue(record.getId().equalsIgnoreCase("db_11"));
-    Assert.assertEquals(record.getListField("db_11_0").size(), 3);
-    Assert.assertEquals(record.getMapField("db_11_0").size(), 3);
-
-    // rebalance with key prefix
-    addResource(clusterName, "db_22", 55);
-    resourceUrl = getResourceUrl(clusterName, "db_22");
-    idealStateUrl = resourceUrl + "/idealState";
-    response = assertSuccessPostOperation(idealStateUrl, rebalanceCmd(2, "alias", null), false);
-    record = JsonToObject(ZNRecord.class, response);
-    Assert.assertTrue(record.getId().equalsIgnoreCase("db_22"));
-    Assert.assertEquals(record.getListField("alias_0").size(), 2);
-    Assert.assertEquals(record.getMapField("alias_0").size(), 2);
-    Assert.assertTrue((((String) (record.getMapFields().keySet().toArray()[0])))
-        .startsWith("alias_"));
-    Assert.assertFalse(response.contains(IdealStateProperty.INSTANCE_GROUP_TAG.toString()));
-
-    addResource(clusterName, "db_33", 44);
-    resourceUrl = getResourceUrl(clusterName, "db_33");
-    idealStateUrl = resourceUrl + "/idealState";
-    response = assertSuccessPostOperation(idealStateUrl, rebalanceCmd(2, null, _tag1), false);
-
-    Assert.assertTrue(response.contains(IdealStateProperty.INSTANCE_GROUP_TAG.toString()));
-    Assert.assertTrue(response.contains(_tag1));
-    for (int i = 0; i < 6; i++) {
-      String instance = "localhost_123" + i;
-      if (i < 3) {
-        Assert.assertTrue(response.contains(instance));
-      } else {
-        Assert.assertFalse(response.contains(instance));
-      }
-    }
-
-    addResource(clusterName, "db_44", 44);
-    resourceUrl = getResourceUrl(clusterName, "db_44");
-    idealStateUrl = resourceUrl + "/idealState";
-    response = assertSuccessPostOperation(idealStateUrl, rebalanceCmd(2, "alias", _tag1), false);
-    Assert.assertTrue(response.contains(IdealStateProperty.INSTANCE_GROUP_TAG.toString()));
-    Assert.assertTrue(response.contains(_tag1));
-
-    record = JsonToObject(ZNRecord.class, response);
-    Assert.assertTrue((((String) (record.getMapFields().keySet().toArray()[0])))
-        .startsWith("alias_"));
-
-    for (int i = 0; i < 6; i++) {
-      String instance = "localhost_123" + i;
-      if (i < 3) {
-        Assert.assertTrue(response.contains(instance));
-      } else {
-        Assert.assertFalse(response.contains(instance));
-      }
-    }
-  }
-
-  private void addInstancesToCluster(String clusterName, String instanceNamePrefix, int n,
-      String tag) throws IOException {
-    Map<String, String> parameters = new HashMap<String, String>();
-    final String clusterUrl = getClusterUrl(clusterName);
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.addInstance);
-
-    // add instances to cluster
-    String instancesUrl = clusterUrl + "/instances";
-    for (int i = 0; i < n; i++) {
-
-      parameters.put(JsonParameters.INSTANCE_NAME, instanceNamePrefix + i);
-      String response = assertSuccessPostOperation(instancesUrl, parameters, false);
-      Assert.assertTrue(response.contains((instanceNamePrefix + i).replace(':', '_')));
-    }
-
-    // add tag to instance
-    if (tag != null && !tag.isEmpty()) {
-      parameters.clear();
-      parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.addInstanceTag);
-      parameters.put(ClusterSetup.instanceGroupTag, tag);
-      for (int i = 0; i < n; i++) {
-        String instanceUrl = instancesUrl + "/" + (instanceNamePrefix + i).replace(':', '_');
-        String response = assertSuccessPostOperation(instanceUrl, parameters, false);
-        Assert.assertTrue(response.contains(_tag1));
-      }
-    }
-
-  }
-
-  private Map<String, String> addInstanceTagCmd(String tag) {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.addInstanceTag);
-    parameters.put(ClusterSetup.instanceGroupTag, tag);
-
-    return parameters;
-  }
-
-  private Map<String, String> removeInstanceTagCmd(String tag) {
-    Map<String, String> parameters = new HashMap<String, String>();
-    parameters.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.removeInstanceTag);
-    parameters.put(ClusterSetup.instanceGroupTag, tag);
-
-    return parameters;
-  }
-
-  @Test
-  public void testAddInstance() throws Exception {
-    final String clusterName = "clusterTestAddInstance";
-
-    // add normal cluster
-    addCluster(clusterName);
-
-    String clusterUrl = getClusterUrl(clusterName);
-
-    // Add instances to cluster
-    String instancesUrl = clusterUrl + "/instances";
-    addInstancesToCluster(clusterName, "localhost:123", 3, null);
-
-    String instances = "localhost:1233;localhost:1234;localhost:1235;localhost:1236";
-    String response = assertSuccessPostOperation(instancesUrl, addInstanceCmd(instances), false);
-    for (int i = 3; i <= 6; i++) {
-      Assert.assertTrue(response.contains("localhost_123" + i));
-    }
-
-    // delete one node without disable
-    String instanceUrl = instancesUrl + "/localhost_1236";
-    deleteUrl(instanceUrl, true);
-    response = getUrl(instancesUrl);
-    Assert.assertTrue(response.contains("localhost_1236"));
-
-    // delete non-exist node
-    instanceUrl = instancesUrl + "/localhost_12367";
-    deleteUrl(instanceUrl, true);
-    response = getUrl(instancesUrl);
-    Assert.assertFalse(response.contains("localhost_12367"));
-
-    // disable node
-    instanceUrl = instancesUrl + "/localhost_1236";
-    response = assertSuccessPostOperation(instanceUrl, enableInstanceCmd(false), false);
-    Assert.assertTrue(response.contains("false"));
-
-    deleteUrl(instanceUrl, false);
-
-    // add controller cluster
-    final String controllerClusterName = "controllerClusterTestAddInstance";
-    addCluster(controllerClusterName);
-
-    // add node to controller cluster
-    String controllers = "controller:9000;controller:9001";
-    String controllerUrl = getClusterUrl(controllerClusterName) + "/instances";
-    response = assertSuccessPostOperation(controllerUrl, addInstanceCmd(controllers), false);
-    Assert.assertTrue(response.contains("controller_9000"));
-    Assert.assertTrue(response.contains("controller_9001"));
-
-    // add a duplicated host
-    response = assertSuccessPostOperation(instancesUrl, addInstanceCmd("localhost:1234"), true);
-
-    // add/remove tags
-    for (int i = 0; i < 4; i++) {
-      instanceUrl = instancesUrl + "/localhost_123" + i;
-      response = assertSuccessPostOperation(instanceUrl, addInstanceTagCmd(_tag1), false);
-      Assert.assertTrue(response.contains(_tag1));
-    }
-
-    instanceUrl = instancesUrl + "/localhost_1233";
-    response = assertSuccessPostOperation(instanceUrl, removeInstanceTagCmd(_tag1), false);
-    Assert.assertFalse(response.contains(_tag1));
-  }
-
-  @Test
-  public void testGetResources() throws IOException {
-    final String clusterName = "TestTagAwareness_testGetResources";
-    final String TAG = "tag";
-    final String URL_BASE =
-        "http://localhost:" + ADMIN_PORT + "/clusters/" + clusterName + "/resourceGroups";
-
-    _gSetupTool.addCluster(clusterName, true);
-    HelixAdmin admin = _gSetupTool.getClusterManagementTool();
-
-    // Add a tagged resource
-    IdealState taggedResource = new IdealState("taggedResource");
-    taggedResource.setInstanceGroupTag(TAG);
-    taggedResource.setStateModelDefRef("OnlineOffline");
-    admin.addResource(clusterName, taggedResource.getId(), taggedResource);
-
-    // Add an untagged resource
-    IdealState untaggedResource = new IdealState("untaggedResource");
-    untaggedResource.setStateModelDefRef("OnlineOffline");
-    admin.addResource(clusterName, untaggedResource.getId(), untaggedResource);
-
-    // Now make a REST call for all resources
-    Reference resourceRef = new Reference(URL_BASE);
-    Request request = new Request(Method.GET, resourceRef);
-    Response response = _gClient.handle(request);
-    ZNRecord responseRecord =
-        ClusterRepresentationUtil.JsonToObject(ZNRecord.class, response.getEntityAsText());
-
-    // Ensure that the tagged resource has information and the untagged one doesn't
-    Assert.assertNotNull(responseRecord.getMapField("ResourceTags"));
-    Assert
-        .assertEquals(TAG, responseRecord.getMapField("ResourceTags").get(taggedResource.getId()));
-    Assert.assertFalse(responseRecord.getMapField("ResourceTags").containsKey(
-        untaggedResource.getId()));
-  }
-
-  @Test
-  public void testGetInstances() throws IOException {
-    final String clusterName = "TestTagAwareness_testGetResources";
-    final String[] TAGS = {
-        "tag1", "tag2"
-    };
-    final String URL_BASE =
-        "http://localhost:" + ADMIN_PORT + "/clusters/" + clusterName + "/instances";
-
-    _gSetupTool.addCluster(clusterName, true);
-    HelixAdmin admin = _gSetupTool.getClusterManagementTool();
-
-    // Add 4 participants, each with differint tag characteristics
-    InstanceConfig instance1 = new InstanceConfig("localhost_1");
-    instance1.addTag(TAGS[0]);
-    admin.addInstance(clusterName, instance1);
-    InstanceConfig instance2 = new InstanceConfig("localhost_2");
-    instance2.addTag(TAGS[1]);
-    admin.addInstance(clusterName, instance2);
-    InstanceConfig instance3 = new InstanceConfig("localhost_3");
-    instance3.addTag(TAGS[0]);
-    instance3.addTag(TAGS[1]);
-    admin.addInstance(clusterName, instance3);
-    InstanceConfig instance4 = new InstanceConfig("localhost_4");
-    admin.addInstance(clusterName, instance4);
-
-    // Now make a REST call for all resources
-    Reference resourceRef = new Reference(URL_BASE);
-    Request request = new Request(Method.GET, resourceRef);
-    Response response = _gClient.handle(request);
-    ListInstancesWrapper responseWrapper =
-        ClusterRepresentationUtil.JsonToObject(ListInstancesWrapper.class,
-            response.getEntityAsText());
-    Map<String, List<String>> tagInfo = responseWrapper.tagInfo;
-
-    // Ensure tag ownership is reported correctly
-    Assert.assertTrue(tagInfo.containsKey(TAGS[0]));
-    Assert.assertTrue(tagInfo.containsKey(TAGS[1]));
-    Assert.assertTrue(tagInfo.get(TAGS[0]).contains("localhost_1"));
-    Assert.assertFalse(tagInfo.get(TAGS[0]).contains("localhost_2"));
-    Assert.assertTrue(tagInfo.get(TAGS[0]).contains("localhost_3"));
-    Assert.assertFalse(tagInfo.get(TAGS[0]).contains("localhost_4"));
-    Assert.assertFalse(tagInfo.get(TAGS[1]).contains("localhost_1"));
-    Assert.assertTrue(tagInfo.get(TAGS[1]).contains("localhost_2"));
-    Assert.assertTrue(tagInfo.get(TAGS[1]).contains("localhost_3"));
-    Assert.assertFalse(tagInfo.get(TAGS[1]).contains("localhost_4"));
-  }
-}

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetInstance.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetInstance.java b/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetInstance.java
deleted file mode 100644
index fd12080..0000000
--- a/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetInstance.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.apache.helix.tools;
-
-/*
- * 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.
- */
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.helix.TestHelper;
-import org.apache.helix.integration.manager.ClusterControllerManager;
-import org.apache.helix.integration.manager.MockParticipantManager;
-import org.apache.helix.mock.participant.ErrTransition;
-import org.apache.helix.tools.ClusterSetup;
-import org.apache.helix.tools.ClusterStateVerifier;
-import org.apache.helix.webapp.resources.JsonParameters;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class TestResetInstance extends AdminTestBase {
-  @Test
-  public void testResetInstance() throws Exception {
-    String className = TestHelper.getTestClassName();
-    String methodName = TestHelper.getTestMethodName();
-    String clusterName = className + "_" + methodName;
-    final int n = 5;
-
-    System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
-
-    TestHelper.setupCluster(clusterName, ZK_ADDR, 12918, // participant port
-        "localhost", // participant name prefix
-        "TestDB", // resource name prefix
-        1, // resources
-        10, // partitions per resource
-        n, // number of nodes
-        3, // replicas
-        "MasterSlave", true); // do rebalance
-
-    // start controller
-    ClusterControllerManager controller = new ClusterControllerManager(ZK_ADDR, clusterName, "controller_0");
-    controller.syncStart();
-
-    Map<String, Set<String>> errPartitions = new HashMap<String, Set<String>>() {
-      {
-        put("SLAVE-MASTER", TestHelper.setOf("TestDB0_4"));
-        put("OFFLINE-SLAVE", TestHelper.setOf("TestDB0_8"));
-      }
-    };
-
-    // start mock participants
-    MockParticipantManager[] participants = new MockParticipantManager[n];
-    for (int i = 0; i < n; i++) {
-      String instanceName = "localhost_" + (12918 + i);
-
-      if (i == 0) {
-        participants[i] =
-            new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-        participants[i].setTransition(new ErrTransition(errPartitions));
-      } else {
-        participants[i] = new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      }
-      participants[i].syncStart();
-    }
-
-    // verify cluster
-    Map<String, Map<String, String>> errStateMap = new HashMap<String, Map<String, String>>();
-    errStateMap.put("TestDB0", new HashMap<String, String>());
-    errStateMap.get("TestDB0").put("TestDB0_4", "localhost_12918");
-    errStateMap.get("TestDB0").put("TestDB0_8", "localhost_12918");
-    boolean result =
-        ClusterStateVerifier
-            .verifyByZkCallback((new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR,
-                clusterName, errStateMap)));
-    Assert.assertTrue(result, "Cluster verification fails");
-
-    // reset node "localhost_12918"
-    participants[0].setTransition(null);
-    String hostName = "localhost_12918";
-    String instanceUrl =
-        "http://localhost:" + ADMIN_PORT + "/clusters/" + clusterName + "/instances/" + hostName;
-
-    Map<String, String> paramMap = new HashMap<String, String>();
-    paramMap.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.resetInstance);
-    TestHelixAdminScenariosRest.assertSuccessPostOperation(instanceUrl, paramMap, false);
-
-    result =
-        ClusterStateVerifier
-            .verifyByZkCallback((new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR,
-                clusterName)));
-    Assert.assertTrue(result, "Cluster verification fails");
-
-    // clean up
-    controller.syncStop();
-    for (int i = 0; i < 5; i++) {
-      participants[i].syncStop();
-    }
-
-    System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis()));
-  }
-}

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetPartitionState.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetPartitionState.java b/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetPartitionState.java
deleted file mode 100644
index 4d54bd7..0000000
--- a/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetPartitionState.java
+++ /dev/null
@@ -1,192 +0,0 @@
-package org.apache.helix.tools;
-
-/*
- * 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.
- */
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.helix.NotificationContext;
-import org.apache.helix.PropertyKey.Builder;
-import org.apache.helix.TestHelper;
-import org.apache.helix.ZNRecord;
-import org.apache.helix.integration.manager.ClusterControllerManager;
-import org.apache.helix.integration.manager.MockParticipantManager;
-import org.apache.helix.manager.zk.ZKHelixDataAccessor;
-import org.apache.helix.manager.zk.ZkBaseDataAccessor;
-import org.apache.helix.mock.participant.ErrTransition;
-import org.apache.helix.model.LiveInstance;
-import org.apache.helix.model.Message;
-import org.apache.helix.webapp.resources.JsonParameters;
-import org.apache.log4j.Logger;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class TestResetPartitionState extends AdminTestBase {
-  private final static Logger LOG = Logger.getLogger(TestResetPartitionState.class);
-
-  String getClusterUrl(String cluster) {
-    return "http://localhost:" + ADMIN_PORT + "/clusters" + "/" + cluster;
-  }
-
-  String getInstanceUrl(String cluster, String instance) {
-    return "http://localhost:" + ADMIN_PORT + "/clusters/" + cluster + "/instances/" + instance;
-  }
-
-  String getResourceUrl(String cluster, String resourceGroup) {
-    return "http://localhost:" + ADMIN_PORT + "/clusters/" + cluster + "/resourceGroups/"
-        + resourceGroup;
-  }
-
-  AtomicInteger _errToOfflineInvoked = new AtomicInteger(0);
-
-  class ErrTransitionWithResetCnt extends ErrTransition {
-    public ErrTransitionWithResetCnt(Map<String, Set<String>> errPartitions) {
-      super(errPartitions);
-    }
-
-    @Override
-    public void doTransition(Message message, NotificationContext context) {
-      super.doTransition(message, context);
-      String fromState = message.getFromState();
-      String toState = message.getToState();
-      if (fromState.equals("ERROR") && toState.equals("OFFLINE")) {
-        // System.err.println("doReset() invoked");
-        _errToOfflineInvoked.incrementAndGet();
-      }
-    }
-  }
-
-  @Test()
-  public void testResetPartitionState() throws Exception {
-    String className = TestHelper.getTestClassName();
-    String methodName = TestHelper.getTestMethodName();
-    String clusterName = className + "_" + methodName;
-    final int n = 5;
-
-    System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
-
-    TestHelper.setupCluster(clusterName, ZK_ADDR, 12918, // participant port
-        "localhost", // participant name prefix
-        "TestDB", // resource name prefix
-        1, // resources
-        10, // partitions per resource
-        n, // number of nodes
-        3, // replicas
-        "MasterSlave", true); // do rebalance
-
-    // start controller
-    ClusterControllerManager controller = new ClusterControllerManager(ZK_ADDR, clusterName, "controller_0");
-    controller.syncStart();
-
-    Map<String, Set<String>> errPartitions = new HashMap<String, Set<String>>();
-    errPartitions.put("SLAVE-MASTER", TestHelper.setOf("TestDB0_4"));
-    errPartitions.put("OFFLINE-SLAVE", TestHelper.setOf("TestDB0_8"));
-
-    // start mock participants
-    MockParticipantManager[] participants = new MockParticipantManager[n];
-    for (int i = 0; i < n; i++) {
-      String instanceName = "localhost_" + (12918 + i);
-
-      if (i == 0) {
-        participants[i] =
-            new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-        participants[i].setTransition(new ErrTransition(errPartitions));
-      } else {
-        participants[i] = new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      }
-      participants[i].syncStart();
-    }
-
-    // verify cluster
-    Map<String, Map<String, String>> errStateMap = new HashMap<String, Map<String, String>>();
-    errStateMap.put("TestDB0", new HashMap<String, String>());
-    errStateMap.get("TestDB0").put("TestDB0_4", "localhost_12918");
-    errStateMap.get("TestDB0").put("TestDB0_8", "localhost_12918");
-    boolean result =
-        ClusterStateVerifier
-            .verifyByZkCallback((new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR,
-                clusterName, errStateMap)));
-    Assert.assertTrue(result, "Cluster verification fails");
-
-    // reset a non-exist partition, should throw exception
-    String hostName = "localhost_12918";
-    String instanceUrl = getInstanceUrl(clusterName, hostName);
-
-    Map<String, String> paramMap = new HashMap<String, String>();
-    paramMap.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.resetPartition);
-    paramMap.put(JsonParameters.PARTITION, "TestDB0_nonExist");
-    paramMap.put(JsonParameters.RESOURCE, "TestDB0");
-    LOG.info("IGNORABLE exception: test reset non-exist partition");
-    TestHelixAdminScenariosRest.assertSuccessPostOperation(instanceUrl, paramMap, true);
-
-    // reset 2 error partitions
-    errPartitions.clear();
-    participants[0].setTransition(new ErrTransitionWithResetCnt(errPartitions));
-    clearStatusUpdate(clusterName, "localhost_12918", "TestDB0", "TestDB0_4");
-    _errToOfflineInvoked.set(0);
-
-    paramMap.put(JsonParameters.PARTITION, "TestDB0_4 TestDB0_8");
-    TestHelixAdminScenariosRest.assertSuccessPostOperation(instanceUrl, paramMap, false);
-
-    for (int i = 0; i < 10; i++) {
-      Thread.sleep(400); // wait reset to be done
-      LOG.info("IGNORABLE exception: test reset non-error partition");
-      TestHelixAdminScenariosRest.assertSuccessPostOperation(instanceUrl, paramMap, true);
-
-      result =
-          ClusterStateVerifier
-              .verifyByZkCallback(new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR,
-                  clusterName));
-      if (result == true) {
-        break;
-      }
-    }
-
-    Assert.assertTrue(result);
-    Assert.assertEquals(_errToOfflineInvoked.get(), 2, "reset() should be invoked 2 times");
-
-    // clean up
-    controller.syncStop();
-    for (int i = 0; i < 5; i++) {
-      participants[i].syncStop();
-    }
-
-    System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis()));
-  }
-
-  private void clearStatusUpdate(String clusterName, String instance, String resource,
-      String partition) {
-    // clear status update for error partition so verify() will not fail on
-    // old errors
-    ZKHelixDataAccessor accessor =
-        new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_gZkClient));
-    Builder keyBuilder = accessor.keyBuilder();
-
-    LiveInstance liveInstance = accessor.getProperty(keyBuilder.liveInstance(instance));
-    accessor.removeProperty(keyBuilder.stateTransitionStatus(instance, liveInstance.getSessionId(),
-        resource, partition));
-
-  }
-
-  // TODO: throw exception in reset()
-}

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetResource.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetResource.java b/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetResource.java
deleted file mode 100644
index db9e9bb..0000000
--- a/helix-admin-webapp/src/test/java/org/apache/helix/tools/TestResetResource.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.apache.helix.tools;
-
-/*
- * 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.
- */
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.helix.TestHelper;
-import org.apache.helix.integration.manager.ClusterControllerManager;
-import org.apache.helix.integration.manager.MockParticipantManager;
-import org.apache.helix.mock.participant.ErrTransition;
-import org.apache.helix.tools.ClusterSetup;
-import org.apache.helix.tools.ClusterStateVerifier;
-import org.apache.helix.webapp.resources.JsonParameters;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class TestResetResource extends AdminTestBase {
-  @Test
-  public void testResetNode() throws Exception {
-    String className = TestHelper.getTestClassName();
-    String methodName = TestHelper.getTestMethodName();
-    String clusterName = className + "_" + methodName;
-    final int n = 5;
-
-    System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
-
-    TestHelper.setupCluster(clusterName, ZK_ADDR, 12918, // participant port
-        "localhost", // participant name prefix
-        "TestDB", // resource name prefix
-        1, // resources
-        10, // partitions per resource
-        n, // number of nodes
-        3, // replicas
-        "MasterSlave", true); // do rebalance
-
-    // start controller
-    ClusterControllerManager controller = new ClusterControllerManager(ZK_ADDR, clusterName, "controller_0");
-    controller.syncStart();
-
-    Map<String, Set<String>> errPartitions = new HashMap<String, Set<String>>() {
-      {
-        put("SLAVE-MASTER", TestHelper.setOf("TestDB0_4"));
-        put("OFFLINE-SLAVE", TestHelper.setOf("TestDB0_8"));
-      }
-    };
-
-    // start mock participants
-    MockParticipantManager[] participants = new MockParticipantManager[n];
-    for (int i = 0; i < n; i++) {
-      String instanceName = "localhost_" + (12918 + i);
-
-      if (i == 0) {
-        participants[i] =
-            new MockParticipantManager(ZK_ADDR, clusterName, instanceName); 
-        participants[i].setTransition(new ErrTransition(errPartitions));
-      } else {
-        participants[i] = new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
-      }
-      participants[i].syncStart();
-    }
-
-    // verify cluster
-    Map<String, Map<String, String>> errStateMap = new HashMap<String, Map<String, String>>();
-    errStateMap.put("TestDB0", new HashMap<String, String>());
-    errStateMap.get("TestDB0").put("TestDB0_4", "localhost_12918");
-    errStateMap.get("TestDB0").put("TestDB0_8", "localhost_12918");
-    boolean result =
-        ClusterStateVerifier
-            .verifyByZkCallback((new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR,
-                clusterName, errStateMap)));
-    Assert.assertTrue(result, "Cluster verification fails");
-
-    // reset resource "TestDB0"
-    participants[0].setTransition(null);
-    String resourceName = "TestDB0";
-    String resourceUrl =
-        "http://localhost:" + ADMIN_PORT + "/clusters/" + clusterName + "/resourceGroups/"
-            + resourceName;
-
-    Map<String, String> paramMap = new HashMap<String, String>();
-    paramMap.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.resetResource);
-    TestHelixAdminScenariosRest.assertSuccessPostOperation(resourceUrl, paramMap, false);
-
-    result =
-        ClusterStateVerifier
-            .verifyByZkCallback((new ClusterStateVerifier.BestPossAndExtViewZkVerifier(ZK_ADDR,
-                clusterName)));
-    Assert.assertTrue(result, "Cluster verification fails");
-
-    // clean up
-    controller.syncStop();
-    for (int i = 0; i < 5; i++) {
-      participants[i].syncStop();
-    }
-
-    System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis()));
-  }
-}

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/webapp/AdminTestBase.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/AdminTestBase.java b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/AdminTestBase.java
new file mode 100644
index 0000000..5b4411b
--- /dev/null
+++ b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/AdminTestBase.java
@@ -0,0 +1,92 @@
+package org.apache.helix.webapp;
+
+/*
+ * 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.
+ */
+
+import java.util.logging.Level;
+
+import org.I0Itec.zkclient.ZkServer;
+import org.apache.helix.TestHelper;
+import org.apache.helix.manager.zk.ZNRecordSerializer;
+import org.apache.helix.manager.zk.ZkClient;
+import org.apache.helix.tools.ClusterSetup;
+import org.apache.helix.util.ZKClientPool;
+import org.apache.helix.webapp.AdminTestHelper.AdminThread;
+import org.apache.log4j.Logger;
+import org.restlet.Client;
+import org.restlet.data.Protocol;
+import org.testng.AssertJUnit;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeSuite;
+
+public class AdminTestBase {
+  private static Logger LOG = Logger.getLogger(AdminTestBase.class);
+  public static final String ZK_ADDR = "localhost:2187";
+  protected final static int ADMIN_PORT = 2202;
+
+  protected static ZkServer _zkServer;
+  protected static ZkClient _gZkClient;
+  protected static ClusterSetup _gSetupTool;
+  protected static Client _gClient;
+
+  static AdminThread _adminThread;
+
+  @BeforeSuite
+  public void beforeSuite() throws Exception {
+    // TODO: use logging.properties file to config java.util.logging.Logger levels
+    java.util.logging.Logger topJavaLogger = java.util.logging.Logger.getLogger("");
+    topJavaLogger.setLevel(Level.WARNING);
+
+    // start zk
+    _zkServer = TestHelper.startZkServer(ZK_ADDR);
+    AssertJUnit.assertTrue(_zkServer != null);
+    ZKClientPool.reset();
+
+    _gZkClient = new ZkClient(ZK_ADDR);
+    _gZkClient.setZkSerializer(new ZNRecordSerializer());
+    _gSetupTool = new ClusterSetup(ZK_ADDR);
+
+    // start admin
+    _adminThread = new AdminThread(ZK_ADDR, ADMIN_PORT);
+    _adminThread.start();
+
+    // create a client
+    _gClient = new Client(Protocol.HTTP);
+
+    // wait for the web service to start
+    Thread.sleep(100);
+  }
+
+  @AfterSuite
+  public void afterSuite() {
+    // System.out.println("START AdminTestBase.afterSuite() at " + new
+    // Date(System.currentTimeMillis()));
+    // stop admin
+    _adminThread.stop();
+
+    // stop zk
+    ZKClientPool.reset();
+    _gZkClient.close();
+
+    TestHelper.stopZkServer(_zkServer);
+    // System.out.println("END AdminTestBase.afterSuite() at " + new
+    // Date(System.currentTimeMillis()));
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/webapp/AdminTestHelper.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/AdminTestHelper.java b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/AdminTestHelper.java
new file mode 100644
index 0000000..9f6946d
--- /dev/null
+++ b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/AdminTestHelper.java
@@ -0,0 +1,69 @@
+package org.apache.helix.webapp;
+
+/*
+ * 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.
+ */
+
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.helix.webapp.HelixAdminWebApp;
+
+public class AdminTestHelper {
+
+  public static class AdminThread {
+    Thread _adminThread;
+    CountDownLatch _stopCountDown = new CountDownLatch(1);
+    String _zkAddr;
+    int _port;
+
+    public AdminThread(String zkAddr, int port) {
+      _zkAddr = zkAddr;
+      _port = port;
+    }
+
+    public void start() {
+      Thread adminThread = new Thread(new Runnable() {
+        @Override
+        public void run() {
+          HelixAdminWebApp app = null;
+          try {
+            app = new HelixAdminWebApp(_zkAddr, _port);
+            app.start();
+            // Thread.currentThread().join();
+            _stopCountDown.await();
+          } catch (Exception e) {
+            e.printStackTrace();
+          } finally {
+            if (app != null) {
+              // System.err.println("Stopping HelixAdminWebApp");
+              app.stop();
+            }
+          }
+        }
+      });
+
+      adminThread.setDaemon(true);
+      adminThread.start();
+    }
+
+    public void stop() {
+      _stopCountDown.countDown();
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/helix/blob/24eacbc9/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestClusterManagementWebapp.java
----------------------------------------------------------------------
diff --git a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestClusterManagementWebapp.java b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestClusterManagementWebapp.java
index 1fba6df..b645dfd 100644
--- a/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestClusterManagementWebapp.java
+++ b/helix-admin-webapp/src/test/java/org/apache/helix/webapp/TestClusterManagementWebapp.java
@@ -30,7 +30,6 @@ import org.apache.helix.PropertyPathConfig;
 import org.apache.helix.PropertyType;
 import org.apache.helix.ZNRecord;
 import org.apache.helix.model.InstanceConfig.InstanceConfigProperty;
-import org.apache.helix.tools.AdminTestBase;
 import org.apache.helix.tools.ClusterSetup;
 import org.apache.helix.webapp.resources.ClusterRepresentationUtil;
 import org.apache.helix.webapp.resources.InstancesResource.ListInstancesWrapper;