You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2018/12/18 18:45:44 UTC

[3/6] lucene-solr:master: SOLR-13079: refactor and harden common 'suspend-trigger' patern in autoscaling test setup

SOLR-13079: refactor and harden common 'suspend-trigger' patern in autoscaling test setup


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/73299f0f
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/73299f0f
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/73299f0f

Branch: refs/heads/master
Commit: 73299f0f220c44f9696e7deeb720440f9a2b0cdd
Parents: dcd4a28
Author: Chris Hostetter <ho...@apache.org>
Authored: Tue Dec 18 11:28:31 2018 -0700
Committer: Chris Hostetter <ho...@apache.org>
Committed: Tue Dec 18 11:28:31 2018 -0700

----------------------------------------------------------------------
 .../org/apache/solr/cloud/CloudTestUtils.java   | 132 +++++++++++++++
 .../solr/cloud/ReplaceNodeNoTargetTest.java     |   6 +-
 .../org/apache/solr/cloud/TestUtilizeNode.java  |   5 +-
 .../apache/solr/cloud/TestWithCollection.java   |  16 +-
 .../AutoAddReplicasPlanActionTest.java          |   7 +-
 .../autoscaling/AutoScalingHandlerTest.java     | 163 +++++++------------
 .../autoscaling/ComputePlanActionTest.java      |  26 +--
 .../autoscaling/ExecutePlanActionTest.java      |   3 +-
 .../autoscaling/HttpTriggerListenerTest.java    |   7 +-
 .../cloud/autoscaling/IndexSizeTriggerTest.java |  44 ++---
 .../MetricTriggerIntegrationTest.java           |  23 ++-
 .../NodeAddedTriggerIntegrationTest.java        |  24 ++-
 .../NodeLostTriggerIntegrationTest.java         |  23 +--
 .../NodeMarkersRegistrationTest.java            |  23 +--
 .../autoscaling/RestoreTriggerStateTest.java    |  19 +--
 .../ScheduledMaintenanceTriggerTest.java        |  11 +-
 .../ScheduledTriggerIntegrationTest.java        |  22 +--
 .../SearchRateTriggerIntegrationTest.java       |  63 ++++---
 .../autoscaling/SystemLogListenerTest.java      |   9 +-
 .../solr/cloud/autoscaling/TestPolicyCloud.java |  18 +-
 .../TriggerCooldownIntegrationTest.java         |  24 ++-
 .../autoscaling/TriggerIntegrationTest.java     |  34 ++--
 .../TriggerSetPropertiesIntegrationTest.java    |  18 +-
 .../cloud/autoscaling/sim/SimCloudManager.java  |  12 +-
 .../sim/TestSimComputePlanAction.java           |  16 +-
 .../sim/TestSimExecutePlanAction.java           |   4 +-
 .../autoscaling/sim/TestSimExtremeIndexing.java |   5 +-
 .../autoscaling/sim/TestSimLargeCluster.java    |  52 ++----
 .../autoscaling/sim/TestSimPolicyCloud.java     |  16 +-
 .../sim/TestSimTriggerIntegration.java          |  66 ++++----
 .../org/apache/solr/cloud/rule/RulesTest.java   |   4 +-
 .../admin/AutoscalingHistoryHandlerTest.java    |  25 ++-
 .../apache/solr/util/TestSolrCLIRunExample.java |   4 +-
 33 files changed, 468 insertions(+), 456 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/CloudTestUtils.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/CloudTestUtils.java b/solr/core/src/test/org/apache/solr/cloud/CloudTestUtils.java
index bb74967..498cdba 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CloudTestUtils.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CloudTestUtils.java
@@ -21,20 +21,37 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
 
+import org.apache.lucene.util.LuceneTestCase;
+
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
+import org.apache.solr.client.solrj.request.RequestWriter;
+import org.apache.solr.client.solrj.request.RequestWriter.StringPayloadContentWriter;
+import org.apache.solr.client.solrj.request.V2Request;
+import org.apache.solr.client.solrj.response.SolrResponseBase;
+
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.CollectionStatePredicate;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.util.TimeOut;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.junit.Assert;
+
+import static org.apache.solr.common.params.CommonParams.JSON_MIME;
+
 
 /**
  * Some useful methods for SolrCloud tests.
@@ -172,4 +189,119 @@ public class CloudTestUtils {
       }
     };
   }
+  
+  /**
+   * Wait for a particular named trigger to be scheduled.
+   * <p>
+   * This is a convenience method that polls the autoscaling API looking for a trigger with the 
+   * specified name using the {@link #DEFAULT_TIMEOUT}.  It is particularly useful for tests 
+   * that want to know when the Overseer has finished scheduling the automatic triggers on startup.
+   * </p>
+   *
+   * @param cloudManager current instance of {@link SolrCloudManager}
+   * @param triggerName the name of the trigger we need to see sheduled in order to return successfully
+   */
+  public static long waitForTriggerToBeScheduled(final SolrCloudManager cloudManager,
+                                                 final String triggerName)
+    throws InterruptedException, TimeoutException, IOException {
+
+    TimeOut timeout = new TimeOut(DEFAULT_TIMEOUT, TimeUnit.SECONDS, cloudManager.getTimeSource());
+    while (!timeout.hasTimedOut()) {
+      final SolrResponse response = cloudManager.request(AutoScalingRequest.create(SolrRequest.METHOD.GET, null));
+      final Map<String,?> triggers = (Map<String,?>) response.getResponse().get("triggers");
+      Assert.assertNotNull("null triggers in response from autoscaling request", triggers);
+      
+      if ( triggers.containsKey(triggerName) ) {
+        return timeout.timeElapsed(TimeUnit.MILLISECONDS);
+      }
+      timeout.sleep(100);
+    }
+    throw new TimeoutException("Never saw trigger with name: " + triggerName);
+  }
+
+  /**
+   * Suspends the trigger with the specified name
+   * <p>
+   * This is a convenience method that sends a <code>suspend-trigger</code> command to the autoscaling
+   * API for the specified trigger.  It is particularly useful for tests that may need to disable automatic
+   * triggers such as <code>.scheduled_maintenance</code> in order to test their own
+   * triggers.
+   * </p>
+   *
+   * @param cloudManager current instance of {@link SolrCloudManager}
+   * @param triggerName the name of the trigger to suspend.  This must already be scheduled.
+   */
+  public static void suspendTrigger(final SolrCloudManager cloudManager,
+                                    final String triggerName) throws IOException {
+    
+    final SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST,
+                                                      "{'suspend-trigger' : {'name' : '"+triggerName+"'} }");
+    final SolrResponse rsp = cloudManager.request(req);
+    final String result = rsp.getResponse().get("result").toString();
+    Assert.assertEquals("Unexpected 'result' in response: " + rsp,
+                        "success", result);
+  }
+  
+  /**
+   * Helper class for sending (JSON) autoscaling requests that can randomize between V1 and V2 requests
+   */
+  public static class AutoScalingRequest extends SolrRequest {
+
+    /**
+     * Creates a request using a randomized root path (V1 vs V2)
+     *
+     * @param m HTTP Method to use
+     * @aram message JSON payload, may be null
+     */
+    public static SolrRequest create(SolrRequest.METHOD m, String message) {
+      return create(m, null, message);
+    }
+    /**
+     * Creates a request using a randomized root path (V1 vs V2)
+     *
+     * @param m HTTP Method to use
+     * @param subPath optional sub-path under <code>"$ROOT/autoscaling"</code>. may be null, 
+     *        otherwise must start with "/"
+     * @param message JSON payload, may be null
+     */
+    public static SolrRequest create(SolrRequest.METHOD m, String subPath, String message) {
+      final boolean useV1 = LuceneTestCase.random().nextBoolean();
+      String path = useV1 ? "/admin/autoscaling" : "/cluster/autoscaling";
+      if (null != subPath) {
+        assert subPath.startsWith("/");
+        path += subPath;
+      }
+      return useV1
+        ? new AutoScalingRequest(m, path, message)
+        : new V2Request.Builder(path).withMethod(m).withPayload(message).build();
+    }
+    
+    protected final String message;
+
+    /**
+     * Simple request
+     * @param m HTTP Method to use
+     * @param path path to send request to
+     * @param message JSON payload, may be null
+     */
+    private AutoScalingRequest(METHOD m, String path, String message) {
+      super(m, path);
+      this.message = message;
+    }
+
+    @Override
+    public SolrParams getParams() {
+      return null;
+    }
+
+    @Override
+    public RequestWriter.ContentWriter getContentWriter(String expectedType) {
+      return message == null ? null : new StringPayloadContentWriter(message, JSON_MIME);
+    }
+
+    @Override
+    protected SolrResponse createResponse(SolrClient client) {
+      return new SolrResponseBase();
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeNoTargetTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeNoTargetTest.java b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeNoTargetTest.java
index 6fd2b89..6778a15 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeNoTargetTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeNoTargetTest.java
@@ -31,13 +31,15 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
 import org.apache.solr.client.solrj.response.CoreAdminResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
+
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.solr.cloud.ReplaceNodeTest.createReplaceNodeRequest;
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
+
 @LuceneTestCase.AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-11067")
 public class ReplaceNodeNoTargetTest extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -69,7 +71,7 @@ public class ReplaceNodeNoTargetTest extends SolrCloudTestCase {
     String setClusterPolicyCommand = "{" +
         " 'set-cluster-policy': [" +
         "      {'replica':'<5', 'shard': '#EACH', 'node': '#ANY'}]}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     solrClient.request(req);
 
     log.info("Creating collection...");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java b/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java
index 5a28211..e51263a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java
@@ -26,6 +26,7 @@ import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.util.NamedList;
@@ -36,8 +37,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
-
 @LogLevel("org.apache.solr.cloud.autoscaling=DEBUG;org.apache.solr.cloud.Overseer=DEBUG;org.apache.solr.cloud.overseer=DEBUG;org.apache.solr.client.solrj.impl.SolrClientDataProvider=DEBUG;org.apache.solr.client.solrj.cloud.autoscaling.PolicyHelper=TRACE")
 public class TestUtilizeNode extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -114,7 +113,7 @@ public class TestUtilizeNode extends SolrCloudTestCase {
       "}";
     log.info("Setting new policy to blacklist jettyX ({}) port={}",
              jettyX.getNodeName(), jettyX.getLocalPort());
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     NamedList<Object> response = cloudClient.request(req);
     assertEquals(req + " => " + response,
                  "success", response.get("result").toString());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/TestWithCollection.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestWithCollection.java b/solr/core/src/test/org/apache/solr/cloud/TestWithCollection.java
index 15a32da..512207a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestWithCollection.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestWithCollection.java
@@ -17,7 +17,6 @@
 
 package org.apache.solr.cloud;
 
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
 import static org.apache.solr.common.params.CollectionAdminParams.WITH_COLLECTION;
 
 import java.io.IOException;
@@ -36,6 +35,7 @@ import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.autoscaling.ActionContext;
 import org.apache.solr.cloud.autoscaling.ComputePlanAction;
 import org.apache.solr.cloud.autoscaling.ExecutePlanAction;
@@ -133,7 +133,7 @@ public class TestWithCollection extends SolrCloudTestCase {
         "      {'cores':'<10', 'node':'#ANY'}," +
         "    ]" +
         "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     solrClient.request(req);
 
     String chosenNode = cluster.getRandomJetty(random()).getNodeName();
@@ -252,7 +252,7 @@ public class TestWithCollection extends SolrCloudTestCase {
         "      {'replica':'<2', 'node':'#ANY'}," +
         "    ]" +
         "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     solrClient.request(req);
 
     String chosenNode = cluster.getRandomJetty(random()).getNodeName();
@@ -293,7 +293,7 @@ public class TestWithCollection extends SolrCloudTestCase {
         "      {'replica':'<2', 'node':'#ANY'}," +
         "    ]" +
         "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     solrClient.request(req);
 
     String chosenNode = cluster.getRandomJetty(random()).getNodeName();
@@ -343,7 +343,7 @@ public class TestWithCollection extends SolrCloudTestCase {
         "      {'replica':'<2', 'node':'#ANY'}," +
         "    ]" +
         "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     solrClient.request(req);
 
     String chosenNode = cluster.getRandomJetty(random()).getNodeName();
@@ -405,7 +405,7 @@ public class TestWithCollection extends SolrCloudTestCase {
         "      {'replica':'<2', 'node':'#ANY'}," +
         "    ]" +
         "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     solrClient.request(req);
 
     String chosenNode = cluster.getRandomJetty(random()).getNodeName();
@@ -431,7 +431,7 @@ public class TestWithCollection extends SolrCloudTestCase {
         "{'name' : 'compute', 'class' : '" + CapturingAction.class.getName() + "'}" +
         "]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     solrClient.request(req);
 
     Optional<JettySolrRunner> other = cluster.getJettySolrRunners()
@@ -522,7 +522,7 @@ public class TestWithCollection extends SolrCloudTestCase {
         "      {'replica':'<2', 'node':'#ANY'}," +
         "    ]" +
         "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     solrClient.request(req);
 
     String chosenNode = cluster.getJettySolrRunner(0).getNodeName();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoAddReplicasPlanActionTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoAddReplicasPlanActionTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoAddReplicasPlanActionTest.java
index be917e6..c1b8513 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoAddReplicasPlanActionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoAddReplicasPlanActionTest.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.cloud.autoscaling;
 
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
-
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -34,6 +32,7 @@ import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.V2Request;
 import org.apache.solr.cloud.CloudDescriptor;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ClusterStateUtil;
@@ -113,7 +112,7 @@ public class AutoAddReplicasPlanActionTest extends SolrCloudTestCase{
         "'removeListeners': true" +
         "}" +
         "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, removeTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, removeTriggerCommand);
     NamedList response = cluster.getSolrClient().request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -148,7 +147,7 @@ public class AutoAddReplicasPlanActionTest extends SolrCloudTestCase{
         "'set-cluster-preferences': [" +
         "{'minimize': 'cores','precision': 0}]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPreferencesCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPreferencesCommand);
     
     // you can hit a stale connection from pool when restarting jetty
     try (CloudSolrClient cloudClient = new CloudSolrClient.Builder(Collections.singletonList(cluster.getZkServer().getZkAddress()),

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
index fd3f563..296fde7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
@@ -25,23 +25,18 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.cloud.autoscaling.Policy;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.client.solrj.request.RequestWriter;
-import org.apache.solr.client.solrj.request.RequestWriter.StringPayloadContentWriter;
-import org.apache.solr.client.solrj.request.V2Request;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.params.AutoScalingParams;
-import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.TimeSource;
 import org.apache.solr.common.util.Utils;
@@ -54,7 +49,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.solr.common.cloud.ZkStateReader.SOLR_AUTOSCALING_CONF_PATH;
-import static org.apache.solr.common.params.CommonParams.JSON_MIME;
 import static org.apache.solr.common.util.Utils.getObjectByPath;
 
 /**
@@ -96,19 +90,6 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
     }
   }
 
-  public static SolrRequest createAutoScalingRequest(SolrRequest.METHOD m, String message) {
-    return createAutoScalingRequest(m, null, message);
-  }
-
-  static SolrRequest createAutoScalingRequest(SolrRequest.METHOD m, String subPath, String message) {
-    boolean useV1 = random().nextBoolean();
-    String path = useV1 ? "/admin/autoscaling" : "/cluster/autoscaling";
-    path += subPath != null ? subPath : "";
-    return useV1
-        ? new AutoScalingRequest(m, path, message)
-        : new V2Request.Builder(path).withMethod(m).withPayload(message).build();
-  }
-
   @Before
   public void beforeTest() throws Exception {
     // clear any persisted auto scaling configuration
@@ -129,11 +110,11 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t}\n" +
         "}";
     // these should be no-ops because there are no triggers, and it should succeed
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendEachCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, suspendEachCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     assertEquals(response.get("changed").toString(), "[]");
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeEachCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, resumeEachCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     assertEquals(response.get("changed").toString(), "[]");
@@ -144,7 +125,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'event' : 'nodeLost'," +
         "'waitFor' : '10m'," +
         "'enabled' : true}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -156,7 +137,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'enabled' : true" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -165,7 +146,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"name\" : \"node_lost_trigger\"\n" +
         "\t}\n" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     assertEquals(response.get("changed").toString(), "[node_lost_trigger]");
@@ -190,7 +171,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : '" + Policy.EACH + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     List<String> changed = (List<String>) response.get("changed");
@@ -213,7 +194,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'node_added_trigger'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     changed = (List<String>) response.get("changed");
@@ -236,7 +217,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : '" + Policy.EACH + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     changed = (List<String>) response.get("changed");
@@ -260,7 +241,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'timeout' : '1h'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     changed = (List<String>) response.get("changed");
@@ -291,7 +272,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'compute_plan'," +
         "'class' : 'solr.ComputePlanAction'" +
         "}]}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
 
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
@@ -316,7 +297,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'waitFor' : '20m'," +
         "'enabled' : false" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -344,7 +325,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'url' : 'http://xyz.com/on_node_lost?node={$LOST_NODE_NAME}'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -362,7 +343,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'node_lost_trigger'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, removeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, removeTriggerCommand);
     try {
       solrClient.request(req);
       fail("expected exception");
@@ -377,7 +358,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"name\" : \"xyz\"\n" +
         "\t}\n" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, removeListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, removeListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -391,7 +372,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'node_lost_trigger'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, removeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, removeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -410,7 +391,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'url' : 'http://xyz.com/on_node_lost?node={$LOST_NODE_NAME}'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     try {
       solrClient.request(req);
       fail("should have thrown Exception");
@@ -433,7 +414,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "    ]" +
         "}";
     try {
-      SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+      SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
       solrClient.request(req);
       fail("expect exception");
     } catch (HttpSolrClient.RemoteExecutionException e) {
@@ -460,7 +441,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'compute_plan'," +
         "'class' : 'solr.ComputePlanAction'" +
         "}]}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
 
     try {
       solrClient.request(req);
@@ -484,7 +465,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'compute_plan'," +
         "'class' : 'solr.ComputePlanAction'" +
         "}]}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
 
     try {
       solrClient.request(req);
@@ -508,7 +489,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'foo' : 'bar'," +
         "'class' : 'solr.ComputePlanAction'" +
         "}]}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
 
     try {
       solrClient.request(req);
@@ -531,7 +512,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'compute_plan'," +
         "'class' : 'solr.ComputePlanAction'" +
         "}]}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
 
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
@@ -548,7 +529,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'url' : 'http://xyz.com/on_node_lost?node={$LOST_NODE_NAME}'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     try {
       solrClient.request(req);
       fail("should have thrown Exception");
@@ -573,7 +554,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "      {'replica':'<2', 'shard': '#EACH', 'node': '#ANY'}" +
         "    ]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setPolicyCommand);
     NamedList<Object> response = null;
     try {
       solrClient.request(req);
@@ -594,7 +575,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "      {'replica':'<2', 'shard': '#EACH', 'node': '#ANY'}" +
         "    ]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -611,7 +592,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "      {'replica':'<2', 'shard': '#EACH', 'node': '#ANY'}" +
         "    ]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -622,7 +603,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
 
     // remove policy
     String removePolicyCommand = "{remove-policy : policy1}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, removePolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, removePolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -637,7 +618,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "        {'maximize': 'freedisk','precision': 100}," +
         "        {'minimize': 'sysLoadAvg','precision': 10}]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setPreferencesCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setPreferencesCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -650,7 +631,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         " 'set-cluster-preferences': [" +
         "        {'minimize': 'sysLoadAvg','precision': 10}]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setPreferencesCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setPreferencesCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -665,7 +646,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "      {'nodeRole':'!overseer', 'replica':0}" +
         "    ]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -687,7 +668,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'waitFor' : '0s'," +
         "'enabled' : true" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -696,7 +677,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "      {'cores':'<10', 'node':'#ANY'}," +
         "      {'replica':'<3', 'shard': '#EACH', 'node': '#ANY'}]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -707,7 +688,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "        {'minimize': 'sysLoadAvg','precision': 10}," +
         "        {'minimize': 'heapUsage','precision': 10}]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setPreferencesCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setPreferencesCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -715,11 +696,11 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "    'xyz':[{'replica':'<2', 'shard': '#EACH', 'node': '#ANY'}]," +
         "    'policy1':[{'replica':'<2', 'shard': '#EACH', 'node': '#ANY'}]," +
         "    'policy2':[{'replica':'<7', 'shard': '#EACH', 'node': '#ANY'}]}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     response = solrClient.request(req);
 
     Map triggers = (Map) response.get("triggers");
@@ -746,7 +727,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
     assertNotNull(policies.get("xyz"));
     assertNotNull(policies.get("policy1"));
 
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, "/diagnostics", null);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, "/diagnostics", null);
     response = solrClient.request(req);
 
     Map<String, Object> diagnostics = (Map<String, Object>) response.get("diagnostics");
@@ -784,7 +765,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "      {'replica':'<4', 'shard': '#EACH', 'node': '#ANY'}"+
         "    ]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, tempClusterPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, tempClusterPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -796,12 +777,12 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
     assertTrue(adminResponse.isSuccess());
 
     // reset the original cluster policy
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
     // get the diagnostics output again
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, "/diagnostics", null);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, "/diagnostics", null);
     response = solrClient.request(req);
     diagnostics = (Map<String, Object>) response.get("diagnostics");
     sortedNodes = (List) diagnostics.get("sortedNodes");
@@ -829,12 +810,12 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
           if (l != null && l.contains(runner1.getNodeName())) return true;
           return false;
         },
-        createAutoScalingRequest(SolrRequest.METHOD.GET, "/diagnostics", null),
+        AutoScalingRequest.create(SolrRequest.METHOD.GET, "/diagnostics", null),
         200,
         20,
         runner1.getNodeName() + " could not come up ");
 
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, "/suggestions", null);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, "/suggestions", null);
     response = solrClient.request(req);
     List l = (List) response.get("suggestions");
     assertNotNull(l);
@@ -864,7 +845,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
             "'waitFor' : '0s'," +
             "'enabled' : true" +
             "}}";
-        SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+        SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
         NamedList<Object> response = null;
         try {
           response = solrClient.request(req);
@@ -882,7 +863,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
     t2.start();
     boolean await = updateLatch.await(60, TimeUnit.SECONDS);
     assertTrue("not all updates executed in time, remaining=" + updateLatch.getCount(), await);
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     NamedList<Object> response = solrClient.request(req);
 
     Map triggers = (Map) response.get("triggers");
@@ -913,14 +894,14 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
     String setPolicyCommand = "{'set-policy': {" +
         "    'nodelete':[" +
         "      {'nodeRole':'overseer', 'replica':0}]}}";
-    solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, setPolicyCommand));
+    solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, setPolicyCommand));
     CollectionAdminRequest.createCollection("COLL1", "conf", 1, 1)
         .setPolicy("nodelete")
         .process(cluster.getSolrClient());
     String removePolicyCommand = "{remove-policy : nodelete}";
-    createAutoScalingRequest(SolrRequest.METHOD.POST, removePolicyCommand);
+    AutoScalingRequest.create(SolrRequest.METHOD.POST, removePolicyCommand);
     try {
-      solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, removePolicyCommand));
+      solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, removePolicyCommand));
       fail("should have failed");
     } catch (HttpSolrClient.RemoteExecutionException e) {
       assertTrue(String.valueOf(getObjectByPath(e.getMetaData(), true, "error/details[0]/errorMessages[0]"))
@@ -939,8 +920,8 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"pqr\" : \"abc\"\n" +
         "\t}\n" +
         "}";
-    solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, setPropertiesCommand));
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, setPropertiesCommand));
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     NamedList<Object> response = solrClient.request(req);
     Map properties = (Map) response.get("properties");
     assertNotNull(properties);
@@ -952,8 +933,8 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"xyz\" : 123\n" +
         "\t}\n" +
         "}";
-    solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, setPropertiesCommand));
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, setPropertiesCommand));
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     response = solrClient.request(req);
     properties = (Map) response.get("properties");
     assertNotNull(properties);
@@ -966,8 +947,8 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"xyz\" : 456\n" +
         "\t}\n" +
         "}";
-    solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, setPropertiesCommand));
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, setPropertiesCommand));
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     response = solrClient.request(req);
     properties = (Map) response.get("properties");
     assertNotNull(properties);
@@ -980,8 +961,8 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"xyz\" : null\n" +
         "\t}\n" +
         "}";
-    solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, setPropertiesCommand));
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, setPropertiesCommand));
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     response = solrClient.request(req);
     properties = (Map) response.get("properties");
     assertNotNull(properties);
@@ -996,8 +977,8 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"" + AutoScalingParams.ACTION_THROTTLE_PERIOD_SECONDS + "\" : 5\n" +
         "\t}\n" +
         "}";
-    solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, setPropertiesCommand));
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, setPropertiesCommand));
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     response = solrClient.request(req);
     properties = (Map) response.get("properties");
     assertNotNull(properties);
@@ -1013,42 +994,18 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
     CloudSolrClient solrClient = cluster.getSolrClient();
     String setPropertiesCommand = "{'set-cluster-policy': [" +
         "{'cores': '<4','node': '#ANY'}]}";
-    solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, setPropertiesCommand));
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, setPropertiesCommand));
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     NamedList<Object> response = solrClient.request(req);
     assertEquals("<4", Utils.getObjectByPath(response,false,"cluster-policy[0]/cores"));
     assertEquals("#ANY", Utils.getObjectByPath(response,false,"cluster-policy[0]/node"));
     setPropertiesCommand = "{'set-cluster-policy': [" +
         "{'cores': '<3','node': '#ANY'}]}";
-    solrClient.request(createAutoScalingRequest(SolrRequest.METHOD.POST, setPropertiesCommand));
-    req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+    solrClient.request(AutoScalingRequest.create(SolrRequest.METHOD.POST, setPropertiesCommand));
+    req = AutoScalingRequest.create(SolrRequest.METHOD.GET, null);
     response = solrClient.request(req);
     assertEquals("<3", Utils.getObjectByPath(response,false,"cluster-policy[0]/cores"));
     assertEquals("#ANY", Utils.getObjectByPath(response,false,"cluster-policy[0]/node"));
 
   }
-
-  static class AutoScalingRequest extends SolrRequest {
-    protected final String message;
-
-    AutoScalingRequest(METHOD m, String path, String message) {
-      super(m, path);
-      this.message = message;
-    }
-
-    @Override
-    public SolrParams getParams() {
-      return null;
-    }
-
-    @Override
-    public RequestWriter.ContentWriter getContentWriter(String expectedType) {
-      return message == null ? null : new StringPayloadContentWriter(message, JSON_MIME);
-    }
-
-    @Override
-    protected SolrResponse createResponse(SolrClient client) {
-      return null;
-    }
-  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/ComputePlanActionTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/ComputePlanActionTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/ComputePlanActionTest.java
index 7227c8c..8b5efd7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/ComputePlanActionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/ComputePlanActionTest.java
@@ -40,6 +40,7 @@ import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.SolrClientNodeStateProvider;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
@@ -62,7 +63,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
 import static org.apache.solr.common.params.CollectionParams.CollectionAction.MOVEREPLICA;
 
 /**
@@ -121,7 +121,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "      {'nodeRole':'overseer', 'replica':0}" +
         "    ]" +
         "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -130,7 +130,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "{'minimize': 'cores'}," +
         "{'maximize': 'freedisk','precision': 100}]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPreferencesCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPreferencesCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -186,7 +186,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "'actions' : [{'name':'compute_plan', 'class' : 'solr.ComputePlanAction'}," +
         "{'name':'test','class':'" + ComputePlanActionTest.AssertingTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -271,7 +271,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "'actions' : [{'name':'compute_plan', 'class' : 'solr.ComputePlanAction'}," +
         "{'name':'test','class':'" + ComputePlanActionTest.AssertingTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -340,7 +340,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "'actions' : [{'name':'compute_plan', 'class' : 'solr.ComputePlanAction'}," +
         "{'name':'test','class':'" + ComputePlanActionTest.AssertingTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -352,7 +352,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "      {'nodeRole':'overseer', 'replica':0}" +
         "    ]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -371,7 +371,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "      {'nodeRole':'overseer', 'replica':0}" +
         "    ]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -449,7 +449,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "'actions' : [{'name':'compute_plan', 'class' : 'solr.ComputePlanAction', 'collections' : 'testSelected1,testSelected2'}," +
         "{'name':'test','class':'" + ComputePlanActionTest.AssertingTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -546,7 +546,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "'actions' : [{'name':'compute_plan', 'class' : 'solr.ComputePlanAction'}," +
         "{'name':'test','class':'" + AssertingTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -557,7 +557,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "      {'nodeRole':'overseer', 'replica':0}" +
         "    ]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -641,7 +641,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "{'name':'execute_plan','class':'solr.ExecutePlanAction'}" +
         "{'name':'test','class':'" + AssertingTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -652,7 +652,7 @@ public class ComputePlanActionTest extends SolrCloudTestCase {
         "      {'nodeRole':'overseer', 'replica':0}" +
         "    ]" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setClusterPolicyCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/ExecutePlanActionTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/ExecutePlanActionTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/ExecutePlanActionTest.java
index 9ca38fd..d6e44ca 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/ExecutePlanActionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/ExecutePlanActionTest.java
@@ -32,6 +32,7 @@ import org.apache.solr.client.solrj.cloud.autoscaling.TriggerEventType;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
@@ -185,7 +186,7 @@ public class ExecutePlanActionTest extends SolrCloudTestCase {
         "'actions' : [{'name':'compute_plan', 'class' : 'solr.ComputePlanAction'}," +
         "{'name':'execute_plan','class':'solr.ExecutePlanAction'}]" +
         "}}";
-    SolrRequest req = AutoScalingHandlerTest.createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/HttpTriggerListenerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/HttpTriggerListenerTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/HttpTriggerListenerTest.java
index 26c13b0..cb10457 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/HttpTriggerListenerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/HttpTriggerListenerTest.java
@@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.util.LogLevel;
@@ -42,8 +43,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
-
 /**
  *
  */
@@ -89,7 +88,7 @@ public class HttpTriggerListenerTest extends SolrCloudTestCase {
         "{'name':'test','class':'" + TestDummyAction.class.getName() + "'}" +
         "]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -107,7 +106,7 @@ public class HttpTriggerListenerTest extends SolrCloudTestCase {
         "'header.X-Foo' : '${config.name:invalid}'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/IndexSizeTriggerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/IndexSizeTriggerTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/IndexSizeTriggerTest.java
index ce22430..4c5c24e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/IndexSizeTriggerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/IndexSizeTriggerTest.java
@@ -41,6 +41,7 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.cloud.CloudTestUtils;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.cloud.autoscaling.sim.SimCloudManager;
 import org.apache.solr.common.SolrInputDocument;
@@ -62,7 +63,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
 import static org.apache.solr.common.cloud.ZkStateReader.SOLR_AUTOSCALING_CONF_PATH;
 
 /**
@@ -275,7 +275,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'actions' : [{'name' : 'compute_plan', 'class' : 'solr.ComputePlanAction'}," +
         "{'name' : 'execute_plan', 'class' : '" + ExecutePlanAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -290,7 +290,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'class' : '" + CapturingTriggerListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -303,7 +303,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'class' : '" + FinishedProcessingListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -320,7 +320,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'name' : 'index_size_trigger2'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -404,7 +404,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'actions' : [{'name' : 'compute_plan', 'class' : 'solr.ComputePlanAction'}," +
         "{'name' : 'execute_plan', 'class' : '" + ExecutePlanAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -419,7 +419,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'class' : '" + CapturingTriggerListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -432,7 +432,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'class' : '" + FinishedProcessingListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -448,7 +448,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'name' : 'index_size_trigger3'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals("success", response.get("result").toString());
 
@@ -550,7 +550,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'actions' : [{'name' : 'compute_plan', 'class' : 'solr.ComputePlanAction'}," +
         "{'name' : 'execute_plan', 'class' : '" + ExecutePlanAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -565,7 +565,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'class' : '" + CapturingTriggerListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -578,7 +578,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'class' : '" + FinishedProcessingListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -588,7 +588,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'name' : 'index_size_trigger4'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -645,7 +645,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'name' : 'index_size_trigger4'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -668,7 +668,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
     solrClient.request(ur, collectionName);
 
     // resume trigger
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -733,7 +733,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'enabled' : false," +
         "'actions' : [{'name' : 'compute_plan', 'class' : 'solr.ComputePlanAction'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -748,7 +748,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'class' : '" + CapturingTriggerListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -761,7 +761,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'class' : '" + FinishedProcessingListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -778,7 +778,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'name' : 'index_size_trigger5'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -793,7 +793,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'name' : 'index_size_trigger5'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -823,7 +823,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'enabled' : true," +
         "'actions' : [{'name' : 'compute_plan', 'class' : 'solr.ComputePlanAction'}]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -836,7 +836,7 @@ public class IndexSizeTriggerTest extends SolrCloudTestCase {
         "'name' : 'index_size_trigger5'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/MetricTriggerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/MetricTriggerIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/MetricTriggerIntegrationTest.java
index 418a626..13e04cc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/MetricTriggerIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/MetricTriggerIntegrationTest.java
@@ -27,13 +27,14 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.client.solrj.cloud.autoscaling.AutoScalingConfig;
 import org.apache.solr.client.solrj.cloud.autoscaling.TriggerEventProcessorStage;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.cloud.CloudTestUtils;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.DocCollection;
@@ -49,7 +50,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
 import static org.apache.solr.cloud.autoscaling.TriggerIntegrationTest.WAIT_FOR_DELTA_NANOS;
 
 /**
@@ -72,14 +72,11 @@ public class MetricTriggerIntegrationTest extends SolrCloudTestCase {
     configureCluster(2)
         .addConfig("conf", configset("cloud-minimal"))
         .configure();
-    // disable .scheduled_maintenance
-    String suspendTriggerCommand = "{" +
-        "'suspend-trigger' : {'name' : '.scheduled_maintenance'}" +
-        "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
-    SolrClient solrClient = cluster.getSolrClient();
-    NamedList<Object> response = solrClient.request(req);
-    assertEquals(response.get("result").toString(), "success");
+
+    // disable .scheduled_maintenance (once it exists)
+    CloudTestUtils.waitForTriggerToBeScheduled(cluster.getOpenOverseer().getSolrCloudManager(), ".scheduled_maintenance");
+    CloudTestUtils.suspendTrigger(cluster.getOpenOverseer().getSolrCloudManager(), ".scheduled_maintenance");
+
     triggerFiredLatch = new CountDownLatch(1);
   }
 
@@ -121,7 +118,7 @@ public class MetricTriggerIntegrationTest extends SolrCloudTestCase {
         "{'name':'test','class':'" + MetricAction.class.getName() + "'}" +
         "]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -135,7 +132,7 @@ public class MetricTriggerIntegrationTest extends SolrCloudTestCase {
         "'class' : '" + TestTriggerListener.class.getName() + "'" +
         "}" +
         "}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand1);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setListenerCommand1);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -191,7 +188,7 @@ public class MetricTriggerIntegrationTest extends SolrCloudTestCase {
         "{'name':'test','class':'" + MetricAction.class.getName() + "'}" +
         "]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeAddedTriggerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeAddedTriggerIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeAddedTriggerIntegrationTest.java
index bce3ea1..9d798e2 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeAddedTriggerIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeAddedTriggerIntegrationTest.java
@@ -25,12 +25,13 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.cloud.CloudTestUtils;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.Overseer;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -47,7 +48,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
 import static org.apache.solr.cloud.autoscaling.ScheduledTriggers.DEFAULT_SCHEDULED_TRIGGER_DELAY_SECONDS;
 import static org.apache.solr.cloud.autoscaling.TriggerIntegrationTest.WAIT_FOR_DELTA_NANOS;
 import static org.apache.solr.common.cloud.ZkStateReader.SOLR_AUTOSCALING_CONF_PATH;
@@ -83,14 +83,10 @@ public class NodeAddedTriggerIntegrationTest extends SolrCloudTestCase {
     configureCluster(2)
         .addConfig("conf", configset("cloud-minimal"))
         .configure();
-    // disable .scheduled_maintenance
-    String suspendTriggerCommand = "{" +
-        "'suspend-trigger' : {'name' : '.scheduled_maintenance'}" +
-        "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
-    SolrClient solrClient = cluster.getSolrClient();
-    NamedList<Object> response = solrClient.request(req);
-    assertEquals(response.get("result").toString(), "success");
+    
+    // disable .scheduled_maintenance (once it exists)
+    CloudTestUtils.waitForTriggerToBeScheduled(cluster.getOpenOverseer().getSolrCloudManager(), ".scheduled_maintenance");
+    CloudTestUtils.suspendTrigger(cluster.getOpenOverseer().getSolrCloudManager(), ".scheduled_maintenance");
 
     NamedList<Object> overSeerStatus = cluster.getSolrClient().request(CollectionAdminRequest.getOverseerStatus());
     String overseerLeader = (String) overSeerStatus.get("leader");
@@ -148,7 +144,7 @@ public class NodeAddedTriggerIntegrationTest extends SolrCloudTestCase {
         "'enabled' : true," +
         "'actions' : [{'name':'test','class':'" + TestTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -175,7 +171,7 @@ public class NodeAddedTriggerIntegrationTest extends SolrCloudTestCase {
         "'enabled' : true," +
         "'actions' : [{'name':'test','class':'" + TestTriggerAction.class.getName() + "'}]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -204,7 +200,7 @@ public class NodeAddedTriggerIntegrationTest extends SolrCloudTestCase {
         "'enabled' : true," +
         "'actions' : [{'name':'test','class':'" + TestTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -235,7 +231,7 @@ public class NodeAddedTriggerIntegrationTest extends SolrCloudTestCase {
         "'enabled' : true," +
         "'actions' : [{'name':'test','class':'" + TestTriggerAction.class.getName() + "'}]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/73299f0f/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeLostTriggerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeLostTriggerIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeLostTriggerIntegrationTest.java
index 1e75b89..d0d1958 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeLostTriggerIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/NodeLostTriggerIntegrationTest.java
@@ -25,12 +25,13 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.cloud.CloudTestUtils;
+import org.apache.solr.cloud.CloudTestUtils.AutoScalingRequest;
 import org.apache.solr.cloud.Overseer;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -47,7 +48,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
 import static org.apache.solr.cloud.autoscaling.ScheduledTriggers.DEFAULT_SCHEDULED_TRIGGER_DELAY_SECONDS;
 import static org.apache.solr.cloud.autoscaling.TriggerIntegrationTest.WAIT_FOR_DELTA_NANOS;
 import static org.apache.solr.common.cloud.ZkStateReader.SOLR_AUTOSCALING_CONF_PATH;
@@ -80,14 +80,9 @@ public class NodeLostTriggerIntegrationTest extends SolrCloudTestCase {
     .addConfig("conf", configset("cloud-minimal"))
     .configure();
     
-    // disable .scheduled_maintenance
-    String suspendTriggerCommand = "{" +
-        "'suspend-trigger' : {'name' : '.scheduled_maintenance'}" +
-        "}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
-    SolrClient solrClient = cluster.getSolrClient();
-    NamedList<Object> response = solrClient.request(req);
-    assertEquals(response.get("result").toString(), "success");
+    // disable .scheduled_maintenance (once it exists)
+    CloudTestUtils.waitForTriggerToBeScheduled(cluster.getOpenOverseer().getSolrCloudManager(), ".scheduled_maintenance");
+    CloudTestUtils.suspendTrigger(cluster.getOpenOverseer().getSolrCloudManager(), ".scheduled_maintenance");
 
     NamedList<Object> overSeerStatus = cluster.getSolrClient().request(CollectionAdminRequest.getOverseerStatus());
     String overseerLeader = (String) overSeerStatus.get("leader");
@@ -156,7 +151,7 @@ public class NodeLostTriggerIntegrationTest extends SolrCloudTestCase {
         "'enabled' : true," +
         "'actions' : [{'name':'test','class':'" + TestTriggerAction.class.getName() + "'}]" +
         "}}";
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -188,7 +183,7 @@ public class NodeLostTriggerIntegrationTest extends SolrCloudTestCase {
         "'enabled' : true," +
         "'actions' : [{'name':'test','class':'" + TestTriggerAction.class.getName() + "'}]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -226,7 +221,7 @@ public class NodeLostTriggerIntegrationTest extends SolrCloudTestCase {
         nonOverseerLeaderIndex = i;
       }
     }
-    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    SolrRequest req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -260,7 +255,7 @@ public class NodeLostTriggerIntegrationTest extends SolrCloudTestCase {
         "'enabled' : true," +
         "'actions' : [{'name':'test','class':'" + TestTriggerAction.class.getName() + "'}]" +
         "}}";
-    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
+    req = AutoScalingRequest.create(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");