This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new dd64a74db36 Backporting SOLR-17248 to branch_9x (#2439)
dd64a74db36 is described below

commit dd64a74db3625e7c3ad024996187e666b5158e3f
Author: Eric Pugh <[email protected]>
AuthorDate: Fri May 3 19:19:20 2024 +0200

    Backporting SOLR-17248 to branch_9x (#2439)
    
    * SOLR-17248: Refactor ZK related SolrCli tools to separate SolrZkClient 
and CloudSolrClient instantiation/usage  to fix branch_9x.
    
    Co-authored-by: Lamine <[email protected]>
    Co-authored-by: Lamine Idjeraoui <[email protected]>
---
 solr/CHANGES.txt                                   |  2 +-
 .../src/java/org/apache/solr/cli/AuthTool.java     | 34 +++----------------
 .../org/apache/solr/cli/ConfigSetDownloadTool.java | 14 +-------
 .../org/apache/solr/cli/ConfigSetUploadTool.java   | 14 +-------
 .../src/java/org/apache/solr/cli/DeleteTool.java   | 18 +++++-----
 .../java/org/apache/solr/cli/HealthcheckTool.java  | 10 +++---
 .../core/src/java/org/apache/solr/cli/SolrCLI.java | 38 +++++++++++++++++++---
 .../src/java/org/apache/solr/cli/ZkCpTool.java     |  9 +----
 .../src/java/org/apache/solr/cli/ZkLsTool.java     | 15 +--------
 .../src/java/org/apache/solr/cli/ZkMkrootTool.java | 15 +--------
 .../src/java/org/apache/solr/cli/ZkMvTool.java     | 14 +-------
 .../src/java/org/apache/solr/cli/ZkRmTool.java     | 14 +-------
 .../org/apache/solr/cloud/SolrCLIZkUtilsTest.java  |  1 +
 solr/packaging/test/test_zk.bats                   |  2 +-
 14 files changed, 62 insertions(+), 138 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index a37c4976939..df2ef5c86a7 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -32,7 +32,7 @@ Dependency Upgrades
 
 Other Changes
 ---------------------
-(No changes)
+* SOLR-17248: Refactor ZK related SolrCli tools to separate SolrZkClient and 
CloudSolrClient instantiation/usage (Lamine Idjeraoui via Eric Pugh)
 
 ==================  9.6.0 ==================
 New Features
diff --git a/solr/core/src/java/org/apache/solr/cli/AuthTool.java 
b/solr/core/src/java/org/apache/solr/cli/AuthTool.java
index c5b1153e09d..b89f996bff2 100644
--- a/solr/core/src/java/org/apache/solr/cli/AuthTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/AuthTool.java
@@ -33,13 +33,11 @@ import java.util.Arrays;
 import java.util.Base64;
 import java.util.List;
 import java.util.Locale;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.Option;
 import org.apache.lucene.util.Constants;
-import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.core.SolrCore;
@@ -203,12 +201,7 @@ public class AuthTool extends ToolBase {
 
           // check if security is already enabled or not
           if (!zkInaccessible) {
-            try (SolrZkClient zkClient =
-                new SolrZkClient.Builder()
-                    .withUrl(zkHost)
-                    .withTimeout(
-                        SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-                    .build()) {
+            try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) 
{
               checkSecurityJsonExists(zkClient);
             } catch (Exception ex) {
               CLIO.out(
@@ -223,12 +216,7 @@ public class AuthTool extends ToolBase {
         if (!updateIncludeFileOnly) {
           if (!zkInaccessible) {
             echoIfVerbose("Uploading following security.json: " + 
securityJson, cli);
-            try (SolrZkClient zkClient =
-                new SolrZkClient.Builder()
-                    .withUrl(zkHost)
-                    .withTimeout(
-                        SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-                    .build()) {
+            try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) 
{
               zkClient.setData(
                   "/security.json", 
securityJson.getBytes(StandardCharsets.UTF_8), true);
             } catch (Exception ex) {
@@ -339,11 +327,7 @@ public class AuthTool extends ToolBase {
           }
 
           // check if security is already enabled or not
-          try (SolrZkClient zkClient =
-              new SolrZkClient.Builder()
-                  .withUrl(zkHost)
-                  .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-                  .build()) {
+          try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
             checkSecurityJsonExists(zkClient);
           }
         }
@@ -391,11 +375,7 @@ public class AuthTool extends ToolBase {
 
         if (!updateIncludeFileOnly) {
           echoIfVerbose("Uploading following security.json: " + securityJson, 
cli);
-          try (SolrZkClient zkClient =
-              new SolrZkClient.Builder()
-                  .withUrl(zkHost)
-                  .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-                  .build()) {
+          try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
             zkClient.setData("/security.json", 
securityJson.getBytes(StandardCharsets.UTF_8), true);
           }
         }
@@ -486,11 +466,7 @@ public class AuthTool extends ToolBase {
 
       echoIfVerbose("Uploading following security.json: {}", cli);
 
-      try (SolrZkClient zkClient =
-          new SolrZkClient.Builder()
-              .withUrl(zkHost)
-              .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-              .build()) {
+      try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
         zkClient.setData("/security.json", 
"{}".getBytes(StandardCharsets.UTF_8), true);
       }
     }
diff --git a/solr/core/src/java/org/apache/solr/cli/ConfigSetDownloadTool.java 
b/solr/core/src/java/org/apache/solr/cli/ConfigSetDownloadTool.java
index 36535aa1ac6..6beb9b16475 100644
--- a/solr/core/src/java/org/apache/solr/cli/ConfigSetDownloadTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ConfigSetDownloadTool.java
@@ -22,10 +22,8 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
-import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -72,18 +70,8 @@ public class ConfigSetDownloadTool extends ToolBase {
   public void runImpl(CommandLine cli) throws Exception {
     SolrCLI.raiseLogLevelUnlessVerbose(cli);
     String zkHost = SolrCLI.getZkHost(cli);
-    if (zkHost == null) {
-      throw new IllegalStateException(
-          "Solr at "
-              + cli.getOptionValue("solrUrl")
-              + " is running in standalone server mode, downconfig can only be 
used when running in SolrCloud mode.\n");
-    }
 
-    try (SolrZkClient zkClient =
-        new SolrZkClient.Builder()
-            .withUrl(zkHost)
-            .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-            .build()) {
+    try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
       echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
       String confName = cli.getOptionValue("confname");
       String confDir = cli.getOptionValue("confdir");
diff --git a/solr/core/src/java/org/apache/solr/cli/ConfigSetUploadTool.java 
b/solr/core/src/java/org/apache/solr/cli/ConfigSetUploadTool.java
index ec0875923fc..d74435f2abb 100644
--- a/solr/core/src/java/org/apache/solr/cli/ConfigSetUploadTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ConfigSetUploadTool.java
@@ -20,10 +20,8 @@ import java.io.PrintStream;
 import java.lang.invoke.MethodHandles;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
-import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkMaintenanceUtils;
 import org.apache.solr.core.ConfigSetService;
@@ -79,19 +77,9 @@ public class ConfigSetUploadTool extends ToolBase {
   public void runImpl(CommandLine cli) throws Exception {
     SolrCLI.raiseLogLevelUnlessVerbose(cli);
     String zkHost = SolrCLI.getZkHost(cli);
-    if (zkHost == null) {
-      throw new IllegalStateException(
-          "Solr at "
-              + cli.getOptionValue("solrUrl")
-              + " is running in standalone server mode, upconfig can only be 
used when running in SolrCloud mode.\n");
-    }
 
     String confName = cli.getOptionValue("confname");
-    try (SolrZkClient zkClient =
-        new SolrZkClient.Builder()
-            .withUrl(zkHost)
-            .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-            .build()) {
+    try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
       echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
       Path confPath =
           ConfigSetService.getConfigsetPath(
diff --git a/solr/core/src/java/org/apache/solr/cli/DeleteTool.java 
b/solr/core/src/java/org/apache/solr/cli/DeleteTool.java
index 6477481c796..a0d0ff3ef4f 100644
--- a/solr/core/src/java/org/apache/solr/cli/DeleteTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/DeleteTool.java
@@ -21,7 +21,6 @@ import static 
org.apache.solr.common.params.CommonParams.SYSTEM_INFO_PATH;
 
 import java.io.PrintStream;
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -32,7 +31,6 @@ import org.apache.commons.cli.Option;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.impl.JsonMapResponseParser;
@@ -109,15 +107,15 @@ public class DeleteTool extends ToolBase {
   }
 
   protected void deleteCollection(CommandLine cli) throws Exception {
+    Http2SolrClient.Builder builder =
+        new Http2SolrClient.Builder()
+            .withIdleTimeout(30, TimeUnit.SECONDS)
+            .withConnectionTimeout(15, TimeUnit.SECONDS)
+            .withKeyStoreReloadInterval(-1, TimeUnit.SECONDS)
+            
.withOptionalBasicAuthCredentials(cli.getOptionValue(("credentials")));
+
     String zkHost = SolrCLI.getZkHost(cli);
-    try (CloudSolrClient cloudSolrClient =
-        new CloudHttp2SolrClient.Builder(Collections.singletonList(zkHost), 
Optional.empty())
-            .withInternalClientBuilder(
-                new Http2SolrClient.Builder()
-                    .withIdleTimeout(30, TimeUnit.SECONDS)
-                    .withKeyStoreReloadInterval(-1, TimeUnit.SECONDS)
-                    .withConnectionTimeout(15, TimeUnit.SECONDS))
-            .build()) {
+    try (CloudSolrClient cloudSolrClient = 
SolrCLI.getCloudHttp2SolrClient(zkHost, builder)) {
       echoIfVerbose("Connecting to ZooKeeper at " + zkHost, cli);
       cloudSolrClient.connect();
       deleteCollection(cloudSolrClient, cli);
diff --git a/solr/core/src/java/org/apache/solr/cli/HealthcheckTool.java 
b/solr/core/src/java/org/apache/solr/cli/HealthcheckTool.java
index 8d181b9a196..fa724eaefbd 100644
--- a/solr/core/src/java/org/apache/solr/cli/HealthcheckTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/HealthcheckTool.java
@@ -24,11 +24,9 @@ import java.io.PrintStream;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
@@ -88,9 +86,11 @@ public class HealthcheckTool extends ToolBase {
   public void runImpl(CommandLine cli) throws Exception {
     SolrCLI.raiseLogLevelUnlessVerbose(cli);
     String zkHost = SolrCLI.getZkHost(cli);
-    try (CloudHttp2SolrClient cloudSolrClient =
-        new CloudHttp2SolrClient.Builder(Collections.singletonList(zkHost), 
Optional.empty())
-            .build()) {
+    if (zkHost == null) {
+      CLIO.err("Healthcheck tool only works in Solr Cloud mode.");
+      System.exit(1);
+    }
+    try (CloudHttp2SolrClient cloudSolrClient = 
SolrCLI.getCloudHttp2SolrClient(zkHost)) {
       echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
       cloudSolrClient.connect();
       runCloudTool(cloudSolrClient, cli);
diff --git a/solr/core/src/java/org/apache/solr/cli/SolrCLI.java 
b/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
index 8d52f45c0a4..b687787ab8b 100755
--- a/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
+++ b/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
@@ -52,11 +52,13 @@ import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
 import org.apache.solr.client.solrj.request.GenericSolrRequest;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.ContentStreamBase;
@@ -97,7 +99,8 @@ public class SolrCLI implements CLIO {
       Option.builder("verbose").required(false).desc("Enable more verbose 
command output.").build();
 
   public static final Option OPTION_RECURSE =
-      Option.builder("recurse")
+      Option.builder("r")
+          .longOpt("recurse")
           .argName("recurse")
           .hasArg()
           .required(false)
@@ -578,9 +581,8 @@ public class SolrCLI implements CLIO {
                     + solrUrl
                     + ".");
       } else {
-        try (CloudSolrClient cloudSolrClient =
-            new 
CloudHttp2SolrClient.Builder(Collections.singletonList(zkHost), 
Optional.empty())
-                .build()) {
+
+        try (CloudSolrClient cloudSolrClient = 
getCloudHttp2SolrClient(zkHost)) {
           cloudSolrClient.connect();
           Set<String> liveNodes = 
cloudSolrClient.getClusterState().getLiveNodes();
           if (liveNodes.isEmpty())
@@ -638,6 +640,34 @@ public class SolrCLI implements CLIO {
     return zkHost;
   }
 
+  public static SolrZkClient getSolrZkClient(CommandLine cli) throws Exception 
{
+    return getSolrZkClient(cli, getZkHost(cli));
+  }
+
+  public static SolrZkClient getSolrZkClient(CommandLine cli, String zkHost) 
throws Exception {
+    if (zkHost == null) {
+      throw new IllegalStateException(
+          "Solr at "
+              + cli.getOptionValue("solrUrl")
+              + " is running in standalone server mode, this command can only 
be used when running in SolrCloud mode.\n");
+    }
+    return new SolrZkClient.Builder()
+        .withUrl(zkHost)
+        .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
+        .build();
+  }
+
+  public static CloudHttp2SolrClient getCloudHttp2SolrClient(String zkHost) {
+    return getCloudHttp2SolrClient(zkHost, null);
+  }
+
+  public static CloudHttp2SolrClient getCloudHttp2SolrClient(
+      String zkHost, Http2SolrClient.Builder builder) {
+    return new CloudHttp2SolrClient.Builder(Collections.singletonList(zkHost), 
Optional.empty())
+        .withInternalClientBuilder(builder)
+        .build();
+  }
+
   public static boolean safeCheckCollectionExists(String solrUrl, String 
collection) {
     boolean exists = false;
     try (var solrClient = getSolrClient(solrUrl)) {
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkCpTool.java 
b/solr/core/src/java/org/apache/solr/cli/ZkCpTool.java
index 02a4248b9c7..9eb33b9142d 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkCpTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkCpTool.java
@@ -86,12 +86,6 @@ public class ZkCpTool extends ToolBase {
   public void runImpl(CommandLine cli) throws Exception {
     SolrCLI.raiseLogLevelUnlessVerbose(cli);
     String zkHost = SolrCLI.getZkHost(cli);
-    if (zkHost == null) {
-      throw new IllegalStateException(
-          "Solr at "
-              + cli.getOptionValue("solrUrl")
-              + " is running in standalone server mode, cp can only be used 
when running in SolrCloud mode.\n");
-    }
 
     echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
     String src = cli.getOptionValue("src");
@@ -152,7 +146,7 @@ public class ZkCpTool extends ToolBase {
         } catch (SolrException e) {
           // Failed to load solr.xml
           throw new IllegalStateException(
-              "Failed to load solr.xml from ZK or SolrHome, put/get operations 
on compressed data will use data as is. If your intention is to read and 
de-compress data or compress and write data, then solr.xml must be 
accessible.");
+              "Failed to load solr.xml, put/get operations on compressed data 
will use data as is. If your intention is to read and de-compress data or 
compress and write data, then solr.xml must be accessible.");
         } catch (ClassNotFoundException
             | NoSuchMethodException
             | InstantiationException
@@ -166,7 +160,6 @@ public class ZkCpTool extends ToolBase {
     if (minStateByteLenForCompression > -1) {
       echoIfVerbose("Compression of state.json has been enabled", cli);
     }
-
     try (SolrZkClient zkClient =
         new SolrZkClient.Builder()
             .withUrl(zkHost)
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java 
b/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java
index 6809f8a7a11..1ba752d331d 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java
@@ -19,10 +19,8 @@ package org.apache.solr.cli;
 import java.io.PrintStream;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
-import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,18 +61,7 @@ public class ZkLsTool extends ToolBase {
     SolrCLI.raiseLogLevelUnlessVerbose(cli);
     String zkHost = SolrCLI.getZkHost(cli);
 
-    if (zkHost == null) {
-      throw new IllegalStateException(
-          "Solr at "
-              + cli.getOptionValue("zkHost")
-              + " is running in standalone server mode, 'zk ls' can only be 
used when running in SolrCloud mode.\n");
-    }
-
-    try (SolrZkClient zkClient =
-        new SolrZkClient.Builder()
-            .withUrl(zkHost)
-            .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-            .build()) {
+    try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
       echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
 
       String znode = cli.getOptionValue("path");
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkMkrootTool.java 
b/solr/core/src/java/org/apache/solr/cli/ZkMkrootTool.java
index 277cb388bdb..15321fef1a5 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkMkrootTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkMkrootTool.java
@@ -19,10 +19,8 @@ package org.apache.solr.cli;
 import java.io.PrintStream;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
-import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,18 +68,7 @@ public class ZkMkrootTool extends ToolBase {
     String zkHost = SolrCLI.getZkHost(cli);
     boolean failOnExists = cli.hasOption("fail-on-exists");
 
-    if (zkHost == null) {
-      throw new IllegalStateException(
-          "Solr at "
-              + cli.getOptionValue("zkHost")
-              + " is running in standalone server mode, 'zk mkroot' can only 
be used when running in SolrCloud mode.\n");
-    }
-
-    try (SolrZkClient zkClient =
-        new SolrZkClient.Builder()
-            .withUrl(zkHost)
-            .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-            .build()) {
+    try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
       echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
 
       String znode = cli.getOptionValue("path");
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkMvTool.java 
b/solr/core/src/java/org/apache/solr/cli/ZkMvTool.java
index 5578c59e777..52a663f5e4e 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkMvTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkMvTool.java
@@ -20,11 +20,9 @@ import java.io.PrintStream;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Locale;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -69,18 +67,8 @@ public class ZkMvTool extends ToolBase {
   public void runImpl(CommandLine cli) throws Exception {
     SolrCLI.raiseLogLevelUnlessVerbose(cli);
     String zkHost = SolrCLI.getZkHost(cli);
-    if (zkHost == null) {
-      throw new IllegalStateException(
-          "Solr at "
-              + cli.getOptionValue("solrUrl")
-              + " is running in standalone server mode, downconfig can only be 
used when running in SolrCloud mode.\n");
-    }
 
-    try (SolrZkClient zkClient =
-        new SolrZkClient.Builder()
-            .withUrl(zkHost)
-            .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-            .build()) {
+    try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
       echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
       String src = cli.getOptionValue("src");
       String dst = cli.getOptionValue("dst");
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkRmTool.java 
b/solr/core/src/java/org/apache/solr/cli/ZkRmTool.java
index f2590e3a347..bf7766bfb05 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkRmTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkRmTool.java
@@ -20,11 +20,9 @@ import java.io.PrintStream;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Locale;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,12 +63,6 @@ public class ZkRmTool extends ToolBase {
     SolrCLI.raiseLogLevelUnlessVerbose(cli);
     String zkHost = SolrCLI.getZkHost(cli);
 
-    if (zkHost == null) {
-      throw new IllegalStateException(
-          "Solr at "
-              + cli.getOptionValue("zkHost")
-              + " is running in standalone server mode, 'zk rm' can only be 
used when running in SolrCloud mode.\n");
-    }
     String target = cli.getOptionValue("path");
     boolean recurse = Boolean.parseBoolean(cli.getOptionValue("recurse"));
 
@@ -82,11 +74,7 @@ public class ZkRmTool extends ToolBase {
       throw new SolrServerException("You may not remove the root ZK node 
('/')!");
     }
     echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
-    try (SolrZkClient zkClient =
-        new SolrZkClient.Builder()
-            .withUrl(zkHost)
-            .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, 
TimeUnit.MILLISECONDS)
-            .build()) {
+    try (SolrZkClient zkClient = SolrCLI.getSolrZkClient(cli, zkHost)) {
       if (!recurse && zkClient.getChildren(znode, null, true).size() != 0) {
         throw new SolrServerException(
             "ZooKeeper node " + znode + " has children and recurse has NOT 
been specified.");
diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java 
b/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java
index 38f6a674dd3..f7a8da22e8f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java
@@ -60,6 +60,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
             .withUrl(zkAddr)
             .withTimeout(30000, TimeUnit.MILLISECONDS)
             .build();
+    System.setProperty("solr.solr.home", TEST_HOME());
   }
 
   @AfterClass
diff --git a/solr/packaging/test/test_zk.bats b/solr/packaging/test/test_zk.bats
index c3b1cae691d..3ac3fba6ae5 100644
--- a/solr/packaging/test/test_zk.bats
+++ b/solr/packaging/test/test_zk.bats
@@ -49,7 +49,7 @@ teardown() {
 
 @test "get zk host using solr url" {
   sleep 1
-  run solr zk ls / -solrUrl http://localhost:${SOLR_PORT}
+  run solr zk ls / -solrUrl http://localhost:${SOLR_PORT}/solr
   assert_output --partial "aliases.json"
 }
 

Reply via email to