SOLR-14115: Remove deprecated zkcli script. (#2427)
Replaced by bin/solr sub command equivalents.
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 816b634..01c7e6e 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -63,6 +63,9 @@
in favor of the new CompletableFuture based methods. Remove the related deprecated interfaces `AsyncListener` and ``Cancellable`
(James Dyer)
+* SOLR-14115: Remove deprecated zkcli script in favour of equivalent bin/solr sub commmands. (Eric Pugh)
+
+
Dependency Upgrades
---------------------
(No changes)
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkCLI.java b/solr/core/src/java/org/apache/solr/cloud/ZkCLI.java
deleted file mode 100644
index 856ef68..0000000
--- a/solr/core/src/java/org/apache/solr/cloud/ZkCLI.java
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.cloud;
-
-import static org.apache.solr.common.params.CommonParams.NAME;
-import static org.apache.solr.common.params.CommonParams.VALUE_LONG;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.lang.reflect.InvocationTargetException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.regex.Pattern;
-import javax.xml.parsers.ParserConfigurationException;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.commons.cli.PosixParser;
-import org.apache.solr.cli.CLIO;
-import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.cloud.ClusterProperties;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.ZkMaintenanceUtils;
-import org.apache.solr.common.util.Compressor;
-import org.apache.solr.common.util.StrUtils;
-import org.apache.solr.common.util.ZLibCompressor;
-import org.apache.solr.core.ConfigSetService;
-import org.apache.solr.core.CoreContainer;
-import org.apache.solr.core.NodeConfig;
-import org.apache.solr.core.SolrXmlConfig;
-import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.KeeperException;
-import org.xml.sax.SAXException;
-
-public class ZkCLI implements CLIO {
-
- private static final String MAKEPATH = "makepath";
- private static final String PUT = "put";
- private static final String PUT_FILE = "putfile";
- private static final String GET = "get";
- private static final String GET_FILE = "getfile";
- private static final String DOWNCONFIG = "downconfig";
- private static final String ZK_CLI_NAME = "ZkCLI";
- private static final String HELP = "help";
- private static final String LINKCONFIG = "linkconfig";
- private static final String CONFDIR = "confdir";
- private static final String CONFNAME = "confname";
- private static final String ZKHOST = "zkhost";
- private static final String RUNZK = "runzk";
- private static final String SOLRHOME = "solrhome";
- private static final String BOOTSTRAP = "bootstrap";
- static final String UPCONFIG = "upconfig";
- static final String EXCLUDE_REGEX_SHORT = "x";
- static final String EXCLUDE_REGEX = "excluderegex";
- static final String EXCLUDE_REGEX_DEFAULT = ConfigSetService.UPLOAD_FILENAME_EXCLUDE_REGEX;
- private static final String COLLECTION = "collection";
- private static final String CLEAR = "clear";
- private static final String LIST = "list";
- private static final String LS = "ls";
- private static final String CMD = "cmd";
- private static final String CLUSTERPROP = "clusterprop";
- private static final String UPDATEACLS = "updateacls";
- private static final String VERBOSE = "verbose";
-
- @VisibleForTesting
- public static void setStdout(PrintStream stdout) {
- ZkCLI.stdout = stdout;
- }
-
- private static PrintStream stdout = CLIO.getOutStream();
-
- /**
- * Allows you to perform a variety of zookeeper related tasks, such as:
- *
- * <p>Bootstrap the current configs for all collections in solr.xml.
- *
- * <p>Upload a named config set from a given directory.
- *
- * <p>Link a named config set explicity to a collection.
- *
- * <p>Clear ZooKeeper info.
- *
- * <p>If you also pass a solrPort, it will be used to start an embedded zk useful for single
- * machine, multi node tests.
- */
- public static void main(String[] args)
- throws InterruptedException,
- TimeoutException,
- IOException,
- ParserConfigurationException,
- SAXException,
- KeeperException {
-
- CommandLineParser parser = new PosixParser();
- Options options = new Options();
- options.addOption(
- Option.builder(CMD)
- .hasArg(true)
- .desc(
- "cmd to run: "
- + BOOTSTRAP
- + ", "
- + UPCONFIG
- + ", "
- + DOWNCONFIG
- + ", "
- + LINKCONFIG
- + ", "
- + MAKEPATH
- + ", "
- + PUT
- + ", "
- + PUT_FILE
- + ","
- + GET
- + ","
- + GET_FILE
- + ", "
- + LIST
- + ", "
- + CLEAR
- + ", "
- + UPDATEACLS
- + ", "
- + LS)
- .build());
-
- Option zkHostOption = new Option("z", ZKHOST, true, "ZooKeeper host address");
- options.addOption(zkHostOption);
- Option solrHomeOption =
- new Option("s", SOLRHOME, true, "for " + BOOTSTRAP + ", " + RUNZK + ": solrhome location");
- options.addOption(solrHomeOption);
-
- options.addOption(
- "d", CONFDIR, true, "for " + UPCONFIG + ": a directory of configuration files");
- options.addOption(
- "n", CONFNAME, true, "for " + UPCONFIG + ", " + LINKCONFIG + ": name of the config set");
-
- options.addOption("c", COLLECTION, true, "for " + LINKCONFIG + ": name of the collection");
-
- options.addOption(
- EXCLUDE_REGEX_SHORT,
- EXCLUDE_REGEX,
- true,
- "for " + UPCONFIG + ": files matching this regular expression won't be uploaded");
-
- options.addOption(
- "r",
- RUNZK,
- true,
- "run zk internally by passing the solr run port - only for clusters on one machine (tests, dev)");
-
- options.addOption("h", HELP, false, "bring up this help page");
- options.addOption(NAME, true, "name of the cluster property to set");
- options.addOption(VALUE_LONG, true, "value of the cluster to set");
- options.addOption("v", VERBOSE, false, "enable verbose mode");
-
- try {
- // parse the command line arguments
- CommandLine line = parser.parse(options, args);
-
- if ((line.hasOption(HELP) || !line.hasOption(ZKHOST) || !line.hasOption(CMD))
- && !line.hasOption(VERBOSE)) {
- // automatically generate the help statement
- HelpFormatter formatter = new HelpFormatter();
- formatter.printHelp(ZK_CLI_NAME, options);
- stdout.println("Examples:");
- stdout.println(
- "zkcli.sh -zkhost localhost:9983 -cmd " + BOOTSTRAP + " -" + SOLRHOME + " /opt/solr");
- stdout.println(
- "zkcli.sh -zkhost localhost:9983 -cmd "
- + UPCONFIG
- + " -"
- + CONFDIR
- + " /opt/solr/collection1/conf"
- + " -"
- + CONFNAME
- + " myconf");
- stdout.println(
- "zkcli.sh -zkhost localhost:9983 -cmd "
- + DOWNCONFIG
- + " -"
- + CONFDIR
- + " /opt/solr/collection1/conf"
- + " -"
- + CONFNAME
- + " myconf");
- stdout.println(
- "zkcli.sh -zkhost localhost:9983 -cmd "
- + LINKCONFIG
- + " -"
- + COLLECTION
- + " collection1"
- + " -"
- + CONFNAME
- + " myconf");
- stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + MAKEPATH + " /apache/solr");
- stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + PUT + " /solr.conf 'conf data'");
- stdout.println(
- "zkcli.sh -zkhost localhost:9983 -cmd "
- + PUT_FILE
- + " /clusterprops.json /User/myuser/solr/clusterprops.json");
- stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + GET + " /clusterprops.json");
- stdout.println(
- "zkcli.sh -zkhost localhost:9983 -cmd "
- + GET_FILE
- + " /clusterprops.json clusterprops.json");
- stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + CLEAR + " /solr");
- stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + LIST);
- stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + LS + " /solr/live_nodes");
- stdout.println(
- "zkcli.sh -zkhost localhost:9983 -cmd "
- + CLUSTERPROP
- + " -"
- + NAME
- + " urlScheme -"
- + VALUE_LONG
- + " https");
- stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + UPDATEACLS + " /solr");
- return;
- }
-
- // start up a tmp zk server first
- String zkServerAddress = line.getOptionValue(ZKHOST);
- String solrHome = line.getOptionValue(SOLRHOME);
- if (StrUtils.isNullOrEmpty(solrHome)) {
- solrHome = System.getProperty("solr.home");
- }
- if (line.hasOption(VERBOSE)) {
- stdout.println("Using " + SOLRHOME + "=" + solrHome);
- return;
- }
-
- String solrPort = null;
- if (line.hasOption(RUNZK)) {
- if (!line.hasOption(SOLRHOME)) {
- stdout.println("-" + SOLRHOME + " is required for " + RUNZK);
- System.exit(1);
- }
- solrPort = line.getOptionValue(RUNZK);
- }
-
- SolrZkServer zkServer = null;
- if (solrPort != null) {
- zkServer =
- new SolrZkServer(
- "true",
- null,
- new File(solrHome, "/zoo_data"),
- solrHome,
- Integer.parseInt(solrPort));
- zkServer.parseConfig();
- zkServer.start();
- }
-
- int minStateByteLenForCompression = -1;
- Compressor compressor = new ZLibCompressor();
-
- if (solrHome != null) {
- try {
- Path solrHomePath = Paths.get(solrHome);
- Properties props = new Properties();
- props.put(SolrXmlConfig.ZK_HOST, zkServerAddress);
- NodeConfig nodeConfig = NodeConfig.loadNodeConfig(solrHomePath, props);
- minStateByteLenForCompression =
- nodeConfig.getCloudConfig().getMinStateByteLenForCompression();
- String stateCompressorClass = nodeConfig.getCloudConfig().getStateCompressorClass();
- if (StrUtils.isNotNullOrEmpty(stateCompressorClass)) {
- Class<? extends Compressor> compressionClass =
- Class.forName(stateCompressorClass).asSubclass(Compressor.class);
- compressor = compressionClass.getDeclaredConstructor().newInstance();
- }
- } catch (SolrException e) {
- // Failed to load solr.xml
- stdout.println(
- "Failed to load solr.xml from ZK or SolrHome, put/get operations on compressed data will use data as is. If you intention is to read and de-compress data or compress and write data, then solr.xml must be accessible.");
- } catch (ClassNotFoundException
- | NoSuchMethodException
- | InstantiationException
- | IllegalAccessException
- | InvocationTargetException e) {
- stdout.println("Unable to find or instantiate compression class: " + e.getMessage());
- System.exit(1);
- }
- }
-
- try (SolrZkClient zkClient =
- new SolrZkClient.Builder()
- .withUrl(zkServerAddress)
- .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
- .withConnTimeOut(
- SolrZkClientTimeout.DEFAULT_ZK_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
- .withReconnectListener(() -> {})
- // .withCompressor(compressor)
- .withStateFileCompression(minStateByteLenForCompression, compressor)
- .build()) {
- if (line.getOptionValue(CMD).equalsIgnoreCase(BOOTSTRAP)) {
- if (!line.hasOption(SOLRHOME)) {
- stdout.println("-" + SOLRHOME + " is required for " + BOOTSTRAP);
- System.exit(1);
- }
-
- CoreContainer cc = new CoreContainer(Paths.get(solrHome), new Properties());
- cc.setCoreConfigService(new ZkConfigSetService(zkClient));
-
- if (!ZkController.checkChrootPath(zkServerAddress, true)) {
- stdout.println("A chroot was specified in zkHost but the znode doesn't exist. ");
- System.exit(1);
- }
-
- ConfigSetService.bootstrapConf(cc);
-
- // No need to close the CoreContainer, as it wasn't started
- // up in the first place...
-
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(UPCONFIG)) {
- if (!line.hasOption(CONFDIR) || !line.hasOption(CONFNAME)) {
- stdout.println("-" + CONFDIR + " and -" + CONFNAME + " are required for " + UPCONFIG);
- System.exit(1);
- }
- String confDir = line.getOptionValue(CONFDIR);
- String confName = line.getOptionValue(CONFNAME);
- final String excludeExpr = line.getOptionValue(EXCLUDE_REGEX, EXCLUDE_REGEX_DEFAULT);
-
- if (!ZkController.checkChrootPath(zkServerAddress, true)) {
- stdout.println("A chroot was specified in zkHost but the znode doesn't exist. ");
- System.exit(1);
- }
- final Pattern excludePattern = Pattern.compile(excludeExpr);
- ZkMaintenanceUtils.uploadToZK(
- zkClient,
- Paths.get(confDir),
- ZkMaintenanceUtils.CONFIGS_ZKNODE + "/" + confName,
- excludePattern);
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(DOWNCONFIG)) {
- if (!line.hasOption(CONFDIR) || !line.hasOption(CONFNAME)) {
- stdout.println("-" + CONFDIR + " and -" + CONFNAME + " are required for " + DOWNCONFIG);
- System.exit(1);
- }
- String confDir = line.getOptionValue(CONFDIR);
- String confName = line.getOptionValue(CONFNAME);
- ZkMaintenanceUtils.downloadFromZK(
- zkClient, ZkMaintenanceUtils.CONFIGS_ZKNODE + "/" + confName, Paths.get(confDir));
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(LINKCONFIG)) {
- if (!line.hasOption(COLLECTION) || !line.hasOption(CONFNAME)) {
- stdout.println(
- "-" + COLLECTION + " and -" + CONFNAME + " are required for " + LINKCONFIG);
- System.exit(1);
- }
- String collection = line.getOptionValue(COLLECTION);
- String confName = line.getOptionValue(CONFNAME);
-
- ZkController.linkConfSet(zkClient, collection, confName);
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(LIST)) {
- zkClient.printLayoutToStream(stdout);
- } else if (line.getOptionValue(CMD).equals(LS)) {
-
- List<String> argList = line.getArgList();
- if (argList.size() != 1) {
- stdout.println("-" + LS + " requires one arg - the path to list");
- System.exit(1);
- }
-
- StringBuilder sb = new StringBuilder();
- String path = argList.get(0);
- zkClient.printLayout(path == null ? "/" : path, 0, sb);
- stdout.println(sb);
-
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(CLEAR)) {
- List<String> arglist = line.getArgList();
- if (arglist.size() != 1) {
- stdout.println("-" + CLEAR + " requires one arg - the path to clear");
- System.exit(1);
- }
- zkClient.clean(arglist.get(0));
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(MAKEPATH)) {
- List<String> arglist = line.getArgList();
- if (arglist.size() != 1) {
- stdout.println("-" + MAKEPATH + " requires one arg - the path to make");
- System.exit(1);
- }
- if (!ZkController.checkChrootPath(zkServerAddress, true)) {
- stdout.println("A chroot was specified in zkHost but the znode doesn't exist. ");
- System.exit(1);
- }
- zkClient.makePath(arglist.get(0), true);
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(PUT)) {
- List<String> arglist = line.getArgList();
- if (arglist.size() != 2) {
- stdout.println(
- "-" + PUT + " requires two args - the path to create and the data string");
- System.exit(1);
- }
- String path = arglist.get(0);
- byte[] data = arglist.get(1).getBytes(StandardCharsets.UTF_8);
- if (shouldCompressData(data, path, minStateByteLenForCompression)) {
- // state.json should be compressed before being put to ZK
- // data = compressor.compressBytes(data, data.length / 10);
- }
- if (zkClient.exists(path, true)) {
- zkClient.setData(path, data, true);
- } else {
- zkClient.makePath(path, data, CreateMode.PERSISTENT, true);
- }
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(PUT_FILE)) {
- List<String> arglist = line.getArgList();
- if (arglist.size() != 2) {
- stdout.println(
- "-"
- + PUT_FILE
- + " requires two args - the path to create in ZK and the path to the local file");
- System.exit(1);
- }
-
- String path = arglist.get(0);
- byte[] data = Files.readAllBytes(Path.of(arglist.get(1)));
- if (shouldCompressData(data, path, minStateByteLenForCompression)) {
- // state.json should be compressed before being put to ZK
- // data = compressor.compressBytes(data, data.length / 10);
- }
- if (zkClient.exists(path, true)) {
- zkClient.setData(path, data, true);
- } else {
- if (!ZkController.checkChrootPath(zkServerAddress, true)) {
- stdout.println("A chroot was specified in zkHost but the znode doesn't exist. ");
- System.exit(1);
- }
- zkClient.makePath(path, data, CreateMode.PERSISTENT, true);
- }
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(GET)) {
- List<String> arglist = line.getArgList();
- if (arglist.size() != 1) {
- stdout.println("-" + GET + " requires one arg - the path to get");
- System.exit(1);
- }
- byte[] data = zkClient.getData(arglist.get(0), null, null, true);
- stdout.println(new String(data, StandardCharsets.UTF_8));
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(GET_FILE)) {
- List<String> arglist = line.getArgList();
- if (arglist.size() != 2) {
- stdout.println(
- "-" + GET_FILE + "requires two args - the path to get and the file to save it to");
- System.exit(1);
- }
- byte[] data = zkClient.getData(arglist.get(0), null, null, true);
- Files.write(Path.of(arglist.get(1)), data);
- } else if (line.getOptionValue(CMD).equals(UPDATEACLS)) {
- List<String> arglist = line.getArgList();
- if (arglist.size() != 1) {
- stdout.println("-" + UPDATEACLS + " requires one arg - the path to update");
- System.exit(1);
- }
- zkClient.updateACLs(arglist.get(0));
- } else if (line.getOptionValue(CMD).equalsIgnoreCase(CLUSTERPROP)) {
- if (!line.hasOption(NAME)) {
- stdout.println("-" + NAME + " is required for " + CLUSTERPROP);
- }
- if (!ZkController.checkChrootPath(zkServerAddress, true)) {
- stdout.println("A chroot was specified in zkHost but the znode doesn't exist. ");
- System.exit(1);
- }
- String propertyName = line.getOptionValue(NAME);
- // If -val option is missing, we will use the null value. This is required to maintain
- // compatibility with Collections API.
- String propertyValue = line.getOptionValue(VALUE_LONG);
- ClusterProperties props = new ClusterProperties(zkClient);
- try {
- props.setClusterProperty(propertyName, propertyValue);
- } catch (IOException ex) {
- stdout.println(
- "Unable to set the cluster property due to following error : "
- + ex.getLocalizedMessage());
- System.exit(1);
- }
- } else {
- // If not cmd matches
- stdout.println("Unknown command " + line.getOptionValue(CMD) + ". Use -h to get help.");
- System.exit(1);
- }
- } finally {
- if (solrPort != null) {
- zkServer.stop();
- }
- }
- } catch (ParseException exp) {
- stdout.println("Unexpected exception:" + exp.getMessage());
- }
- }
-
- private static boolean shouldCompressData(
- byte[] data, String path, int minStateByteLenForCompression) {
- if (path.endsWith("state.json")
- && minStateByteLenForCompression > -1
- && data.length > minStateByteLenForCompression) {
- // state.json should be compressed before being put to ZK
- return true;
- }
- return false;
- }
-}
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkConfigSetService.java b/solr/core/src/java/org/apache/solr/cloud/ZkConfigSetService.java
index 9abde09..138d729 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkConfigSetService.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkConfigSetService.java
@@ -62,7 +62,7 @@
this.zkClient = cc.getZkController().getZkClient();
}
- /** This is for ZkCLI and some tests */
+ /** This is for some tests */
public ZkConfigSetService(SolrZkClient zkClient) {
super(null, false);
this.zkController = null;
diff --git a/solr/core/src/test/org/apache/solr/cli/ZkSubcommandsTest.java b/solr/core/src/test/org/apache/solr/cli/ZkSubcommandsTest.java
index ec46f33..9ee2a7a 100644
--- a/solr/core/src/test/org/apache/solr/cli/ZkSubcommandsTest.java
+++ b/solr/core/src/test/org/apache/solr/cli/ZkSubcommandsTest.java
@@ -59,7 +59,6 @@
// TODO: This test would be a lot faster if it used a solrhome with fewer config
// files - there are a lot of them to upload
-// This was copied from org.apache.solr.cloud.ZkCLITest
public class ZkSubcommandsTest extends SolrTestCaseJ4 {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java b/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java
deleted file mode 100644
index 32170e5..0000000
--- a/solr/core/src/test/org/apache/solr/cloud/ZkCLITest.java
+++ /dev/null
@@ -1,625 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.cloud;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.PrintStream;
-import java.lang.invoke.MethodHandles;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.RegexFileFilter;
-import org.apache.commons.io.filefilter.TrueFileFilter;
-import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.cloud.ClusterProperties;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider;
-import org.apache.solr.common.cloud.ZkNodeProps;
-import org.apache.solr.common.cloud.ZkStateReader;
-import org.apache.solr.common.util.ZLibCompressor;
-import org.apache.solr.core.ConfigSetService;
-import org.apache.solr.util.ExternalPaths;
-import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.KeeperException;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-// TODO: This test would be a lot faster if it used a solrhome with fewer config
-// files - there are a lot of them to upload
-public class ZkCLITest extends SolrTestCaseJ4 {
- private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
- protected ZkTestServer zkServer;
-
- protected Path zkDir;
-
- private String solrHome;
-
- private SolrZkClient zkClient;
-
- private PrintStream originalSystemOut;
-
- protected static final String SOLR_HOME = SolrTestCaseJ4.TEST_HOME();
-
- @BeforeClass
- public static void beforeClass() {
- System.setProperty("solrcloud.skip.autorecovery", "true");
- }
-
- @AfterClass
- public static void afterClass() {
- System.clearProperty("solrcloud.skip.autorecovery");
- }
-
- @Override
- public void setUp() throws Exception {
- super.setUp();
- if (log.isInfoEnabled()) {
- log.info("####SETUP_START {}", getTestName());
- }
-
- String exampleHome = legacyExampleCollection1SolrHome();
-
- Path tmpDir = createTempDir();
- solrHome = exampleHome;
-
- originalSystemOut = System.out;
-
- zkDir = tmpDir.resolve("zookeeper/server1/data");
- log.info("ZooKeeper dataDir:{}", zkDir);
- zkServer = new ZkTestServer(zkDir);
- zkServer.run();
- System.setProperty("zkHost", zkServer.getZkAddress());
- SolrZkClient zkClient =
- new SolrZkClient.Builder()
- .withUrl(zkServer.getZkHost())
- .withTimeout(AbstractZkTestCase.TIMEOUT, TimeUnit.MILLISECONDS)
- .build();
- zkClient.makePath("/solr", false, true);
- zkClient.close();
-
- this.zkClient =
- new SolrZkClient.Builder()
- .withUrl(zkServer.getZkAddress())
- .withTimeout(AbstractZkTestCase.TIMEOUT, TimeUnit.MILLISECONDS)
- .build();
-
- if (log.isInfoEnabled()) {
- log.info("####SETUP_END {}", getTestName());
- }
- }
-
- @Test
- public void testCmdConstants() {
- assertEquals("upconfig", ZkCLI.UPCONFIG);
- assertEquals("x", ZkCLI.EXCLUDE_REGEX_SHORT);
- assertEquals("excluderegex", ZkCLI.EXCLUDE_REGEX);
- assertEquals(ConfigSetService.UPLOAD_FILENAME_EXCLUDE_REGEX, ZkCLI.EXCLUDE_REGEX_DEFAULT);
- }
-
- @Test
- public void testBootstrapWithChroot() throws Exception {
- String chroot = "/foo/bar";
- assertFalse(zkClient.exists(chroot, true));
-
- String[] args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress() + chroot,
- "-cmd",
- "bootstrap",
- "-solrhome",
- this.solrHome
- };
-
- ZkCLI.main(args);
-
- assertTrue(zkClient.exists(chroot + ZkConfigSetService.CONFIGS_ZKNODE + "/collection1", true));
- }
-
- @Test
- public void testMakePath() throws Exception {
- // test bootstrap_conf
- String[] args =
- new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "makepath", "/path/mynewpath"};
- ZkCLI.main(args);
-
- assertTrue(zkClient.exists("/path/mynewpath", true));
- }
-
- @Test
- public void testPut() throws Exception {
- // test put
- String data = "my data";
- String[] args =
- new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "put", "/data.txt", data};
- ZkCLI.main(args);
-
- zkClient.getData("/data.txt", null, null, true);
-
- assertArrayEquals(
- zkClient.getData("/data.txt", null, null, true), data.getBytes(StandardCharsets.UTF_8));
-
- // test re-put to existing
- data = "my data deux";
- args = new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "put", "/data.txt", data};
- ZkCLI.main(args);
- assertArrayEquals(
- zkClient.getData("/data.txt", null, null, true), data.getBytes(StandardCharsets.UTF_8));
- }
-
- @Test
- public void testPutCompressed() throws Exception {
- // test put compressed
- System.setProperty("solr.home", solrHome);
- System.setProperty("minStateByteLenForCompression", "0");
-
- String data = "my data";
- ZLibCompressor zLibCompressor = new ZLibCompressor();
- byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
- byte[] expected =
- random().nextBoolean()
- ? zLibCompressor.compressBytes(dataBytes)
- : zLibCompressor.compressBytes(dataBytes, dataBytes.length / 10);
- String[] args =
- new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "put", "/state.json", data};
- ZkCLI.main(args);
- assertArrayEquals(zkClient.getZooKeeper().getData("/state.json", null, null), expected);
-
- // test re-put to existing
- data = "my data deux";
- dataBytes = data.getBytes(StandardCharsets.UTF_8);
- expected =
- random().nextBoolean()
- ? zLibCompressor.compressBytes(dataBytes)
- : zLibCompressor.compressBytes(dataBytes, dataBytes.length / 10);
- args = new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "put", "/state.json", data};
- ZkCLI.main(args);
- assertArrayEquals(zkClient.getZooKeeper().getData("/state.json", null, null), expected);
- }
-
- @Test
- public void testPutFile() throws Exception {
- // test put file
- String[] args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- "putfile",
- "/foo.xml",
- SOLR_HOME + File.separator + "solr-stress-new.xml"
- };
- ZkCLI.main(args);
-
- String fromZk =
- new String(zkClient.getData("/foo.xml", null, null, true), StandardCharsets.UTF_8);
- Path locFile = Path.of(SOLR_HOME, "solr-stress-new.xml");
- String fromLoc = Files.readString(locFile);
- assertEquals("Should get back what we put in ZK", fromZk, fromLoc);
- }
-
- @Test
- public void testPutFileCompressed() throws Exception {
- // test put file compressed
- System.setProperty("solr.home", solrHome);
- System.setProperty("minStateByteLenForCompression", "0");
-
- String[] args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- "putfile",
- "/state.json",
- SOLR_HOME + File.separator + "solr-stress-new.xml"
- };
- ZkCLI.main(args);
-
- byte[] fromZk = zkClient.getZooKeeper().getData("/state.json", null, null);
- Path locFile = Path.of(SOLR_HOME, "solr-stress-new.xml");
- byte[] fromLoc = new ZLibCompressor().compressBytes(Files.readAllBytes(locFile));
- assertArrayEquals("Should get back what we put in ZK", fromLoc, fromZk);
- }
-
- @Test
- public void testPutFileNotExists() {
- // test put file
- String[] args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- "putfile",
- "/foo.xml",
- SOLR_HOME + File.separator + "not-there.xml"
- };
- NoSuchFileException e = expectThrows(NoSuchFileException.class, () -> ZkCLI.main(args));
- assertTrue(
- "Didn't find expected error message containing 'not-there.xml' in " + e.getMessage(),
- e.getMessage().contains("not-there.xml"));
- }
-
- @Test
- public void testList() throws Exception {
- zkClient.makePath("/test", true);
- String[] args = new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "list"};
-
- ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
- final PrintStream myOut = new PrintStream(byteStream, false, StandardCharsets.UTF_8);
- ZkCLI.setStdout(myOut);
-
- ZkCLI.main(args);
-
- final String standardOutput = byteStream.toString(StandardCharsets.UTF_8);
- String separator = System.lineSeparator();
- assertEquals("/ (1)" + separator + " /test (0)" + separator + separator, standardOutput);
- }
-
- @Test
- public void testLs() throws Exception {
- zkClient.makePath("/test/path", true);
- String[] args = new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "ls", "/test"};
-
- ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
- final PrintStream myOut = new PrintStream(byteStream, false, StandardCharsets.UTF_8);
- ZkCLI.setStdout(myOut);
-
- ZkCLI.main(args);
-
- final String standardOutput = byteStream.toString(StandardCharsets.UTF_8);
- String separator = System.lineSeparator();
- assertEquals(
- "/test (1)" + separator + " /test/path (0)" + separator + separator, standardOutput);
- }
-
- @Test
- public void testUpConfigLinkConfigClearZk() throws Exception {
- File tmpDir = createTempDir().toFile();
-
- // test upconfig
- String confsetname = "confsetone";
- final String[] upconfigArgs;
- if (random().nextBoolean()) {
- upconfigArgs =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- ZkCLI.UPCONFIG,
- "-confdir",
- ExternalPaths.TECHPRODUCTS_CONFIGSET,
- "-confname",
- confsetname
- };
- } else {
- final String excluderegexOption =
- (random().nextBoolean() ? "--" + ZkCLI.EXCLUDE_REGEX : "-" + ZkCLI.EXCLUDE_REGEX_SHORT);
- upconfigArgs =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- ZkCLI.UPCONFIG,
- excluderegexOption,
- ZkCLI.EXCLUDE_REGEX_DEFAULT,
- "-confdir",
- ExternalPaths.TECHPRODUCTS_CONFIGSET,
- "-confname",
- confsetname
- };
- }
- ZkCLI.main(upconfigArgs);
-
- assertTrue(zkClient.exists(ZkConfigSetService.CONFIGS_ZKNODE + "/" + confsetname, true));
-
- // print help
- // ZkCLI.main(new String[0]);
-
- // test linkconfig
- String[] args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- "linkconfig",
- "-collection",
- "collection1",
- "-confname",
- confsetname
- };
- ZkCLI.main(args);
-
- ZkNodeProps collectionProps =
- ZkNodeProps.load(
- zkClient.getData(ZkStateReader.COLLECTIONS_ZKNODE + "/collection1", null, null, true));
- assertTrue(collectionProps.containsKey("configName"));
- assertEquals(confsetname, collectionProps.getStr("configName"));
-
- // test down config
- File confDir =
- new File(
- tmpDir, "solrtest-confdropspot-" + this.getClass().getName() + "-" + System.nanoTime());
- assertFalse(confDir.exists());
-
- args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- "downconfig",
- "-confdir",
- confDir.getAbsolutePath(),
- "-confname",
- confsetname
- };
- ZkCLI.main(args);
-
- File[] files = confDir.listFiles();
- List<String> zkFiles =
- zkClient.getChildren(ZkConfigSetService.CONFIGS_ZKNODE + "/" + confsetname, null, true);
- assertEquals(files.length, zkFiles.size());
-
- File sourceConfDir = new File(ExternalPaths.TECHPRODUCTS_CONFIGSET);
- // filter out all directories starting with . (e.g. .svn)
- Collection<File> sourceFiles =
- FileUtils.listFiles(
- sourceConfDir, TrueFileFilter.INSTANCE, new RegexFileFilter("[^\\.].*"));
- for (File sourceFile : sourceFiles) {
- int indexOfRelativePath =
- sourceFile
- .getAbsolutePath()
- .lastIndexOf("sample_techproducts_configs" + File.separator + "conf");
- String relativePathofFile =
- sourceFile
- .getAbsolutePath()
- .substring(indexOfRelativePath + 33, sourceFile.getAbsolutePath().length());
- File downloadedFile = new File(confDir, relativePathofFile);
- if (ConfigSetService.UPLOAD_FILENAME_EXCLUDE_PATTERN.matcher(relativePathofFile).matches()) {
- assertFalse(
- sourceFile.getAbsolutePath()
- + " exists in ZK, downloaded:"
- + downloadedFile.getAbsolutePath(),
- downloadedFile.exists());
- } else {
- assertTrue(
- downloadedFile.getAbsolutePath()
- + " does not exist source:"
- + sourceFile.getAbsolutePath(),
- downloadedFile.exists());
- assertTrue(
- relativePathofFile + " content changed",
- FileUtils.contentEquals(sourceFile, downloadedFile));
- }
- }
-
- // test reset zk
- args = new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "clear", "/"};
- ZkCLI.main(args);
-
- assertEquals(0, zkClient.getChildren("/", null, true).size());
- }
-
- @Test
- public void testGet() throws Exception {
- String getNode = "/getNode";
- byte[] data = "getNode-data".getBytes(StandardCharsets.UTF_8);
- ByteArrayOutputStream systemOut = new ByteArrayOutputStream();
- this.zkClient.create(getNode, data, CreateMode.PERSISTENT, true);
- String[] args = new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "get", getNode};
- ZkCLI.setStdout(new PrintStream(systemOut, true, StandardCharsets.UTF_8));
- ZkCLI.main(args);
- assertArrayEquals(
- data,
- systemOut
- .toString(StandardCharsets.UTF_8)
- .replace(System.lineSeparator(), "")
- .getBytes(StandardCharsets.UTF_8));
- }
-
- @Test
- public void testGetCompressed() throws Exception {
- System.setProperty("solr.home", solrHome);
- System.setProperty("minStateByteLenForCompression", "0");
-
- String getNode = "/getNode";
- byte[] data = "getNode-data".getBytes(StandardCharsets.UTF_8);
- ZLibCompressor zLibCompressor = new ZLibCompressor();
- ByteArrayOutputStream systemOut = new ByteArrayOutputStream();
- byte[] compressedData =
- random().nextBoolean()
- ? zLibCompressor.compressBytes(data)
- : zLibCompressor.compressBytes(data, data.length / 10);
- this.zkClient.create(getNode, compressedData, CreateMode.PERSISTENT, true);
- String[] args = new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "get", getNode};
- ZkCLI.setStdout(new PrintStream(systemOut, true, StandardCharsets.UTF_8));
- ZkCLI.main(args);
- assertArrayEquals(
- data,
- systemOut
- .toString(StandardCharsets.UTF_8)
- .replace(System.lineSeparator(), "")
- .getBytes(StandardCharsets.UTF_8));
- }
-
- @Test
- public void testGetFile() throws Exception {
- Path tmpDir = createTempDir();
-
- String getNode = "/getFileNode";
- byte[] data = "getFileNode-data".getBytes(StandardCharsets.UTF_8);
- this.zkClient.create(getNode, data, CreateMode.PERSISTENT, true);
-
- Path file =
- tmpDir.resolve("solrtest-getfile-" + this.getClass().getName() + "-" + System.nanoTime());
- String[] args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- "getfile",
- getNode,
- file.toAbsolutePath().toString()
- };
- ZkCLI.main(args);
-
- assertArrayEquals(data, Files.readAllBytes(file));
- }
-
- @Test
- public void testGetFileCompressed() throws Exception {
- Path tmpDir = createTempDir();
-
- String getNode = "/getFileNode";
- byte[] data = "getFileNode-data".getBytes(StandardCharsets.UTF_8);
- ZLibCompressor zLibCompressor = new ZLibCompressor();
- byte[] compressedData =
- random().nextBoolean()
- ? zLibCompressor.compressBytes(data)
- : zLibCompressor.compressBytes(data, data.length / 10);
- this.zkClient.create(getNode, compressedData, CreateMode.PERSISTENT, true);
-
- Path file =
- tmpDir.resolve("solrtest-getfile-" + this.getClass().getName() + "-" + System.nanoTime());
- String[] args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- "getfile",
- getNode,
- file.toAbsolutePath().toString()
- };
- ZkCLI.main(args);
-
- assertArrayEquals(data, Files.readAllBytes(file));
- }
-
- @Test
- public void testGetFileNotExists() throws Exception {
- String getNode = "/getFileNotExistsNode";
-
- File file = createTempFile("newfile", null).toFile();
- String[] args =
- new String[] {
- "-zkhost", zkServer.getZkAddress(), "-cmd", "getfile", getNode, file.getAbsolutePath()
- };
- KeeperException e = expectThrows(KeeperException.class, () -> ZkCLI.main(args));
- assertEquals(e.code(), KeeperException.Code.NONODE);
- }
-
- public void testInvalidZKAddress() throws SolrException {
- SolrException ex =
- expectThrows(
- SolrException.class,
- () ->
- new SolrZkClient.Builder()
- .withUrl("----------:33332")
- .withTimeout(100, TimeUnit.MILLISECONDS)
- .build());
- zkClient.close();
- }
-
- @Test
- public void testSetClusterProperty() throws Exception {
- ClusterProperties properties = new ClusterProperties(zkClient);
- // add property urlScheme=http
- String[] args =
- new String[] {
- "-zkhost",
- zkServer.getZkAddress(),
- "-cmd",
- "CLUSTERPROP",
- "-name",
- "urlScheme",
- "-val",
- "http"
- };
- ZkCLI.main(args);
- assertEquals("http", properties.getClusterProperty("urlScheme", "none"));
-
- // remove it again
- args =
- new String[] {
- "-zkhost", zkServer.getZkAddress(), "-cmd", "CLUSTERPROP", "-name", "urlScheme"
- };
- ZkCLI.main(args);
- assertNull(properties.getClusterProperty("urlScheme", (String) null));
- }
-
- @Test
- public void testUpdateAcls() throws Exception {
- try {
- System.setProperty(
- SolrZkClient.ZK_ACL_PROVIDER_CLASS_NAME_VM_PARAM_NAME,
- VMParamsAllAndReadonlyDigestZkACLProvider.class.getName());
- System.setProperty(
- VMParamsAllAndReadonlyDigestZkACLProvider.DEFAULT_DIGEST_READONLY_USERNAME_VM_PARAM_NAME,
- "user");
- System.setProperty(
- VMParamsAllAndReadonlyDigestZkACLProvider.DEFAULT_DIGEST_READONLY_PASSWORD_VM_PARAM_NAME,
- "pass");
-
- String[] args = new String[] {"-zkhost", zkServer.getZkAddress(), "-cmd", "updateacls", "/"};
- ZkCLI.main(args);
- } finally {
- // Need to clear these before we open the next SolrZkClient
- System.clearProperty(SolrZkClient.ZK_ACL_PROVIDER_CLASS_NAME_VM_PARAM_NAME);
- System.clearProperty(
- VMParamsAllAndReadonlyDigestZkACLProvider.DEFAULT_DIGEST_READONLY_USERNAME_VM_PARAM_NAME);
- System.clearProperty(
- VMParamsAllAndReadonlyDigestZkACLProvider.DEFAULT_DIGEST_READONLY_PASSWORD_VM_PARAM_NAME);
- }
-
- boolean excepted = false;
- try (SolrZkClient zkClient =
- new SolrZkClient.Builder()
- .withUrl(zkServer.getZkAddress())
- .withTimeout(
- AbstractDistribZkTestBase.DEFAULT_CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)
- .build()) {
- zkClient.getData("/", null, null, true);
- } catch (KeeperException.NoAuthException e) {
- excepted = true;
- }
- assertTrue("Did not fail to read.", excepted);
- }
-
- @Override
- public void tearDown() throws Exception {
- if (zkClient != null) {
- zkClient.close();
- }
- if (zkServer != null) {
- zkServer.shutdown();
- }
- System.clearProperty("solr.home");
- System.clearProperty("minStateByteLenForCompression");
- System.setOut(originalSystemOut);
- super.tearDown();
- }
-}
diff --git a/solr/packaging/test/test_zk.bats b/solr/packaging/test/test_zk.bats
index c3b1cae..00ad93d 100644
--- a/solr/packaging/test/test_zk.bats
+++ b/solr/packaging/test/test_zk.bats
@@ -94,24 +94,6 @@
}
-@test "zkcli.sh gets 'solrhome' from 'solr.home' system property" {
- sleep 1
- run "${SOLR_TIP}/server/scripts/cloud-scripts/zkcli.sh" -v
- local extracted_solrhome=$(echo "$output" | grep -oE "solrhome=[^ ]+")
- # remove 'solrhome='
- local path_value=${extracted_solrhome#*=}
- [[ $path_value == *"/server/scripts/cloud-scripts/../../solr" ]] || [[ $path_value == *"/server/solr" ]]
-}
-
-@test "zkcli.sh gets 'solrhome' from 'solrhome' command line option" {
- sleep 1
- run "${SOLR_TIP}/server/scripts/cloud-scripts/zkcli.sh" -v -s /path/to/solr/home
- local extracted_solrhome=$(echo "$output" | grep -oE "solrhome=[^ ]+")
- # remove 'solrhome='
- local path_value=${extracted_solrhome#*=}
- [[ $path_value == "/path/to/solr/home" ]]
-}
-
@test "bin/solr zk cp gets 'solrhome' from '--solr-home' command line option" {
touch afile.txt
@@ -123,7 +105,6 @@
# The -DminStateByteLenForCompression variable substitution on solr start is not seen
# by the ZkCpTool.java, so therefore we do not have compression unless solr.xml is directly edited.
#assert_output --partial 'Compression of state.json has been enabled'
-
-
+
rm afile.txt
}
diff --git a/solr/server/README.md b/solr/server/README.md
index 0c26546..dd93b00 100644
--- a/solr/server/README.md
+++ b/solr/server/README.md
@@ -56,8 +56,7 @@
server/scripts/cloud-scripts
- Command-line utility for working with ZooKeeper when running in SolrCloud mode, see zkcli.sh / .cmd for
- usage information.
+ Command-line utility for working with snapshots using snapshotscli.sh
server/solr
@@ -111,4 +110,3 @@
"resources".
It is also possible to setup log4j or other popular logging frameworks.
-
diff --git a/solr/server/scripts/cloud-scripts/zkcli.bat b/solr/server/scripts/cloud-scripts/zkcli.bat
deleted file mode 100644
index 0eb40fa..0000000
--- a/solr/server/scripts/cloud-scripts/zkcli.bat
+++ /dev/null
@@ -1,27 +0,0 @@
-@echo off
-REM You can override pass the following parameters to this script:
-REM
-
-set JVM=java
-
-REM Find location of this script
-
-set SDIR=%~dp0
-if "%SDIR:~-1%"=="\" set SDIR=%SDIR:~0,-1%
-set SOLR_INSTALL_DIR=%SDIR%\..\..\..
-set SOLR_HOME=%SOLR_INSTALL_DIR%\server\solr
-
-set "LOG4J_CONFIG=file:///%SDIR%\..\..\resources\log4j2-console.xml"
-
-REM Settings for ZK ACL
-REM set SOLR_ZK_CREDS_AND_ACLS=-DzkACLProvider=org.apache.solr.common.cloud.DigestZkACLProvider ^
-REM -DzkCredentialsProvider=org.apache.solr.common.cloud.DigestZkCredentialsProvider ^
-REM -DzkCredentialsInjector=org.apache.solr.common.cloud.VMParamsZkCredentialsInjector ^
-REM -DzkDigestUsername=admin-user -DzkDigestPassword=CHANGEME-ADMIN-PASSWORD ^
-REM -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=CHANGEME-READONLY-PASSWORD
-REM optionally, you can use using a a Java properties file 'zkDigestCredentialsFile'
-REM ...
-REM -DzkDigestCredentialsFile=/path/to/zkDigestCredentialsFile.properties
-REM ...
-"%JVM%" %SOLR_ZK_CREDS_AND_ACLS% %ZKCLI_JVM_FLAGS% -Dlog4j.configurationFile="%LOG4J_CONFIG%" -Dsolr.home=%SOLR_HOME% ^
--classpath "%SDIR%\..\..\solr-webapp\webapp\WEB-INF\lib\*;%SDIR%\..\..\lib\ext\*;%SDIR%\..\..\lib\*" org.apache.solr.cloud.ZkCLI %*
diff --git a/solr/server/scripts/cloud-scripts/zkcli.sh b/solr/server/scripts/cloud-scripts/zkcli.sh
deleted file mode 100755
index c9dd7a5..0000000
--- a/solr/server/scripts/cloud-scripts/zkcli.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-echo "WARNING: The zkcli.sh script has been deprecated in favour of the bin/solr equivalent commands."
-
-# You can override pass the following parameters to this script:
-#
-
-JVM="java"
-
-# Find location of this script
-
-sdir="`dirname \"$0\"`"
-
-log4j_config="file:$sdir/../../resources/log4j2-console.xml"
-
-solr_home="$sdir/../../solr"
-
-# Settings for ZK ACL
-#SOLR_ZK_CREDS_AND_ACLS="-DzkACLProvider=org.apache.solr.common.cloud.DigestZkACLProvider \
-# -DzkCredentialsProvider=org.apache.solr.common.cloud.DigestZkCredentialsProvider \
-# -DzkCredentialsInjector=org.apache.solr.common.cloud.VMParamsZkCredentialsInjector \
-# -DzkDigestUsername=admin-user -DzkDigestPassword=CHANGEME-ADMIN-PASSWORD \
-# -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=CHANGEME-READONLY-PASSWORD"
-# optionally, you can use using a a Java properties file 'zkDigestCredentialsFile'
-#...
-# -DzkDigestCredentialsFile=/path/to/zkDigestCredentialsFile.properties
-#...
-PATH=$JAVA_HOME/bin:$PATH $JVM $SOLR_ZK_CREDS_AND_ACLS $ZKCLI_JVM_FLAGS -Dlog4j.configurationFile=$log4j_config -Dsolr.home=$solr_home \
--classpath "$sdir/../../solr-webapp/webapp/WEB-INF/lib/*:$sdir/../../lib/ext/*:$sdir/../../lib/*" org.apache.solr.cloud.ZkCLI ${1+"$@"}
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/zookeeper-utilities.adoc b/solr/solr-ref-guide/modules/deployment-guide/pages/zookeeper-utilities.adoc
index 6b84871..daf6641 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/zookeeper-utilities.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/zookeeper-utilities.adoc
@@ -24,17 +24,7 @@
The ZooKeeper specific commands are provided by the xref:solr-control-script-reference.adoc[Solr Control Script].
-.Solr's zkcli.sh vs ZooKeeper's zkCli.sh
-[IMPORTANT]
-====
-The deprecated `zkcli.sh` provided by Solr is not the same as the https://zookeeper.apache.org/doc/current/zookeeperStarted.html#sc_ConnectingToZooKeeper[`zkCli.sh` included in ZooKeeper distributions].
-
-ZooKeeper's `zkCli.sh` provides a completely general, application-agnostic shell for manipulating data in ZooKeeper.
-
-`zkcli.sh` has been deprecated in favour of the `bin/solr` equivalent commands which should be used instead. It is no longer referenced in the Reference Guide.
-====
-
-== Using Solr's ZooKeeper CLI
+== Using Solr's CLI with ZooKeeper
Use the `help` option to get a list of available ZooKeeper specifc commands from the script itself, as in `bin/solr zk -h`.