You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ep...@apache.org on 2024/10/09 23:55:08 UTC
(solr) branch branch_9x updated (9ef97f95a22 -> 3877d923ab5)
This is an automated email from the ASF dual-hosted git repository.
epugh pushed a change to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git
from 9ef97f95a22 SOLR-17480: Use --data-home everywhere (#2747)
new eab78120bf8 SOLR-17479: Deprecate the single letter options (#2748)
new 3877d923ab5 Updates from backport SOLR-17479
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../src/java/org/apache/solr/cli/AssertTool.java | 149 ++++++++++++++++++---
.../src/java/org/apache/solr/cli/ZkLsTool.java | 3 +-
.../test/org/apache/solr/cli/AssertToolTest.java | 30 ++---
solr/packaging/test/test_assert.bats | 2 +-
solr/packaging/test/test_placement_plugin.bats | 8 +-
.../pages/solr-control-script-reference.adoc | 48 +++----
6 files changed, 178 insertions(+), 62 deletions(-)
(solr) 01/02: SOLR-17479: Deprecate the single letter options (#2748)
Posted by ep...@apache.org.
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
commit eab78120bf8da966cacb365af3f90466946d37c3
Author: Eric Pugh <ep...@opensourceconnections.com>
AuthorDate: Wed Oct 9 10:48:43 2024 -0600
SOLR-17479: Deprecate the single letter options (#2748)
---------
Co-authored-by: Christos Malliaridis <c....@gmail.com>
(cherry picked from commit af54816e6ce51e22c0d73164fa871bca7126e3fe)
---
.../src/java/org/apache/solr/cli/AssertTool.java | 161 +++++++++++++++++++--
.../test/org/apache/solr/cli/AssertToolTest.java | 30 ++--
solr/packaging/test/test_assert.bats | 2 +-
solr/packaging/test/test_placement_plugin.bats | 8 +-
.../pages/solr-control-script-reference.adoc | 48 +++---
5 files changed, 189 insertions(+), 60 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/cli/AssertTool.java b/solr/core/src/java/org/apache/solr/cli/AssertTool.java
index 640297de057..15341e77582 100644
--- a/solr/core/src/java/org/apache/solr/cli/AssertTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/AssertTool.java
@@ -65,15 +65,24 @@ public class AssertTool extends ToolBase {
return List.of(
Option.builder("R")
.desc("Asserts that we are NOT the root user.")
- .longOpt("not-root")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --not-root instead")
+ .get())
.build(),
- Option.builder("r").desc("Asserts that we are the root user.").longOpt("root").build(),
- Option.builder()
- .desc("Asserts that Solr is NOT running on a certain URL. Default timeout is 1000ms.")
- .longOpt("not-started")
- .hasArg(true)
- .argName("url")
+ Option.builder().desc("Asserts that we are NOT the root user.").longOpt("not-root").build(),
+ Option.builder("r")
+ .desc("Asserts that we are the root user.")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --root instead")
+ .get())
.build(),
+ Option.builder().desc("Asserts that we are the root user.").longOpt("root").build(),
Option.builder("S")
.desc("Asserts that Solr is NOT running on a certain URL. Default timeout is 1000ms.")
.deprecated(
@@ -86,8 +95,8 @@ public class AssertTool extends ToolBase {
.argName("url")
.build(),
Option.builder()
- .desc("Asserts that Solr is running on a certain URL. Default timeout is 1000ms.")
- .longOpt("started")
+ .desc("Asserts that Solr is NOT running on a certain URL. Default timeout is 1000ms.")
+ .longOpt("not-started")
.hasArg(true)
.argName("url")
.build(),
@@ -102,6 +111,12 @@ public class AssertTool extends ToolBase {
.hasArg(true)
.argName("url")
.build(),
+ Option.builder()
+ .desc("Asserts that Solr is running on a certain URL. Default timeout is 1000ms.")
+ .longOpt("started")
+ .hasArg(true)
+ .argName("url")
+ .build(),
Option.builder()
.desc("Asserts that we run as same user that owns <directory>.")
.longOpt("same-user")
@@ -109,18 +124,52 @@ public class AssertTool extends ToolBase {
.argName("directory")
.build(),
Option.builder("x")
+ .desc("Asserts that directory <directory> exists.")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --exists instead")
+ .get())
+ .hasArg(true)
+ .argName("directory")
+ .build(),
+ Option.builder()
.desc("Asserts that directory <directory> exists.")
.longOpt("exists")
.hasArg(true)
.argName("directory")
.build(),
Option.builder("X")
+ .desc("Asserts that directory <directory> does NOT exist.")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --not-exists instead")
+ .get())
+ .hasArg(true)
+ .argName("directory")
+ .build(),
+ Option.builder()
.desc("Asserts that directory <directory> does NOT exist.")
.longOpt("not-exists")
.hasArg(true)
.argName("directory")
.build(),
Option.builder("c")
+ .desc(
+ "Asserts that Solr is running in cloud mode. Also fails if Solr not running. URL should be for root Solr path.")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --cloud instead")
+ .get())
+ .hasArg(true)
+ .argName("url")
+ .build(),
+ Option.builder()
.desc(
"Asserts that Solr is running in cloud mode. Also fails if Solr not running. URL should be for root Solr path.")
.longOpt("cloud")
@@ -128,6 +177,18 @@ public class AssertTool extends ToolBase {
.argName("url")
.build(),
Option.builder("C")
+ .desc(
+ "Asserts that Solr is not running in cloud mode. Also fails if Solr not running. URL should be for root Solr path.")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --not-cloud instead")
+ .get())
+ .hasArg(true)
+ .argName("url")
+ .build(),
+ Option.builder()
.desc(
"Asserts that Solr is not running in cloud mode. Also fails if Solr not running. URL should be for root Solr path.")
.longOpt("not-cloud")
@@ -135,12 +196,35 @@ public class AssertTool extends ToolBase {
.argName("url")
.build(),
Option.builder("m")
+ .desc("Exception message to be used in place of the default error message.")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --message instead")
+ .get())
+ .hasArg(true)
+ .argName("message")
+ .build(),
+ Option.builder()
.desc("Exception message to be used in place of the default error message.")
.longOpt("message")
.hasArg(true)
.argName("message")
.build(),
Option.builder("t")
+ .desc("Timeout in ms for commands supporting a timeout.")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --timeout instead")
+ .get())
+ .hasArg(true)
+ .type(Long.class)
+ .argName("ms")
+ .build(),
+ Option.builder()
.desc("Timeout in ms for commands supporting a timeout.")
.longOpt("timeout")
.hasArg(true)
@@ -148,6 +232,15 @@ public class AssertTool extends ToolBase {
.argName("ms")
.build(),
Option.builder("e")
+ .desc("Return an exit code instead of printing error message on assert fail.")
+ .deprecated(
+ DeprecatedAttributes.builder()
+ .setForRemoval(true)
+ .setSince("9.8")
+ .setDescription("Use --exitcode instead")
+ .get())
+ .build(),
+ Option.builder()
.desc("Return an exit code instead of printing error message on assert fail.")
.longOpt("exitcode")
.build());
@@ -209,44 +302,84 @@ public class AssertTool extends ToolBase {
if (cli.hasOption("m")) {
message = cli.getOptionValue("m");
}
+ if (cli.hasOption("message")) {
+ message = cli.getOptionValue("message");
+ }
if (cli.hasOption("t")) {
timeoutMs = Long.parseLong(cli.getOptionValue("t"));
}
+ if (cli.hasOption("timeout")) {
+ timeoutMs = Long.parseLong(cli.getOptionValue("timeout"));
+ }
if (cli.hasOption("e")) {
useExitCode = true;
}
+ if (cli.hasOption("exitcode")) {
+ useExitCode = true;
+ }
int ret = 0;
- if (cli.hasOption("r")) {
+ if (cli.hasOption("root") || cli.hasOption("r")) {
ret += assertRootUser();
}
- if (cli.hasOption("R")) {
+ if (cli.hasOption("not-root") || cli.hasOption("R")) {
ret += assertNotRootUser();
}
if (cli.hasOption("x")) {
ret += assertFileExists(cli.getOptionValue("x"));
}
+ if (cli.hasOption("exists")) {
+ ret += assertFileExists(cli.getOptionValue("exists"));
+ }
if (cli.hasOption("X")) {
ret += assertFileNotExists(cli.getOptionValue("X"));
}
+ if (cli.hasOption("not-exists")) {
+ ret += assertFileNotExists(cli.getOptionValue("not-exists"));
+ }
if (cli.hasOption("same-user")) {
ret += sameUser(cli.getOptionValue("same-user"));
}
- if (cli.hasOption("s") || cli.hasOption("started")) {
+ if (cli.hasOption("s")) {
ret +=
- assertSolrRunning(SolrCLI.getOptionWithDeprecatedAndDefault(cli, "started", "s", null));
+ assertSolrRunning(
+ cli.getOptionValue("s"), cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
}
- if (cli.hasOption("S") || cli.hasOption("not-started")) {
+ if (cli.hasOption("started")) {
+ ret +=
+ assertSolrRunning(
+ cli.getOptionValue("started"),
+ cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ }
+ if (cli.hasOption("S")) {
ret +=
assertSolrNotRunning(
SolrCLI.getOptionWithDeprecatedAndDefault(cli, "not-started", "S", null));
}
+ if (cli.hasOption("not-started")) {
+ ret +=
+ assertSolrNotRunning(
+ cli.getOptionValue("not-started"),
+ cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ }
if (cli.hasOption("c")) {
ret += assertSolrRunningInCloudMode(cli.getOptionValue("c"));
}
+ if (cli.hasOption("cloud")) {
+ ret +=
+ assertSolrRunningInCloudMode(
+ SolrCLI.normalizeSolrUrl(cli.getOptionValue("cloud")),
+ cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ }
if (cli.hasOption("C")) {
ret += assertSolrNotRunningInCloudMode(cli.getOptionValue("C"));
}
+ if (cli.hasOption("not-cloud")) {
+ ret +=
+ assertSolrNotRunningInCloudMode(
+ SolrCLI.normalizeSolrUrl(cli.getOptionValue("not-cloud")),
+ cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ }
return ret;
}
diff --git a/solr/core/src/test/org/apache/solr/cli/AssertToolTest.java b/solr/core/src/test/org/apache/solr/cli/AssertToolTest.java
index 87ada1cfdcf..d0757f5acc4 100644
--- a/solr/core/src/test/org/apache/solr/cli/AssertToolTest.java
+++ b/solr/core/src/test/org/apache/solr/cli/AssertToolTest.java
@@ -45,7 +45,7 @@ public class AssertToolTest extends SolrCloudTestCase {
final int numAssertionsFailed = runAssertToolWithArgs(args);
- assertEquals("Expected AssertTool to raise an error", numAssertionsFailed, 100);
+ assertEquals("Expected AssertTool to raise an error", 100, numAssertionsFailed);
}
@Test
@@ -56,7 +56,7 @@ public class AssertToolTest extends SolrCloudTestCase {
final int numAssertionsFailed = runAssertToolWithArgs(args);
assertEquals(
- "Expected AssertTool to pass assertion that directory exists", numAssertionsFailed, 0);
+ "Expected AssertTool to pass assertion that directory exists", 0, numAssertionsFailed);
}
@Test
@@ -70,7 +70,7 @@ public class AssertToolTest extends SolrCloudTestCase {
final int numAssertionsFailed = runAssertToolWithArgs(args);
assertEquals(
- "Expected AssertTool to fail assertion that directory exists", numAssertionsFailed, 1);
+ "Expected AssertTool to fail assertion that directory exists", 1, numAssertionsFailed);
}
@Test
@@ -82,8 +82,8 @@ public class AssertToolTest extends SolrCloudTestCase {
assertEquals(
"Expected AssertTool to fail assertion that directory doesnt exist",
- numAssertionsFailed,
- 1);
+ 1,
+ numAssertionsFailed);
}
@Test
@@ -96,8 +96,8 @@ public class AssertToolTest extends SolrCloudTestCase {
assertEquals(
"Expected AssertTool to fail assertion that directory doesnt exist",
- numAssertionsFailed,
- 0);
+ 0,
+ numAssertionsFailed);
}
@Test
@@ -109,8 +109,8 @@ public class AssertToolTest extends SolrCloudTestCase {
assertEquals(
"Expected AssertTool to pass assertion when Solr is running on provided URL",
- numAssertionsFailed,
- 0);
+ 0,
+ numAssertionsFailed);
}
@Test
@@ -122,8 +122,8 @@ public class AssertToolTest extends SolrCloudTestCase {
assertEquals(
"Expected AssertTool to fail assertion when Solr isn't running on provided URL",
- numAssertionsFailed,
- 1);
+ 1,
+ numAssertionsFailed);
}
@Test
@@ -135,8 +135,8 @@ public class AssertToolTest extends SolrCloudTestCase {
assertEquals(
"Expected AssertTool to fail assertion when Solr is running on provided URL",
- numAssertionsFailed,
- 1);
+ 1,
+ numAssertionsFailed);
}
@Test
@@ -148,8 +148,8 @@ public class AssertToolTest extends SolrCloudTestCase {
assertEquals(
"Expected AssertTool to pass assertion when Solr isn't running on provided URL",
- numAssertionsFailed,
- 0);
+ 0,
+ numAssertionsFailed);
}
private int runAssertToolWithArgs(String[] args) throws Exception {
diff --git a/solr/packaging/test/test_assert.bats b/solr/packaging/test/test_assert.bats
index 6d6fdb4c3a0..007a147e9ed 100644
--- a/solr/packaging/test/test_assert.bats
+++ b/solr/packaging/test/test_assert.bats
@@ -40,5 +40,5 @@ teardown() {
run solr assert --cloud http://localhost:${SOLR_PORT}
assert_output --partial "ERROR: Solr is not running in cloud mode"
- run ! solr assert --cloud http://localhost:${SOLR_PORT} -e
+ run ! solr assert --cloud http://localhost:${SOLR_PORT} --exitcode
}
diff --git a/solr/packaging/test/test_placement_plugin.bats b/solr/packaging/test/test_placement_plugin.bats
index 1f9ce85d10d..6187f6b8256 100644
--- a/solr/packaging/test/test_placement_plugin.bats
+++ b/solr/packaging/test/test_placement_plugin.bats
@@ -31,8 +31,8 @@ teardown() {
@test "Affinity placement plugin using sysprop" {
run solr start -c -Dsolr.placementplugin.default=affinity
- solr assert -c http://localhost:${SOLR_PORT}/solr -t 3000
- run solr create_collection -c COLL_NAME
+ solr assert --cloud http://localhost:${SOLR_PORT} --timeout 3000
+ run solr create -c COLL_NAME
collection_exists COLL_NAME
assert_file_contains "${SOLR_LOGS_DIR}/solr.log" 'Default replica placement plugin set in solr\.placementplugin\.default to affinity'
}
@@ -40,8 +40,8 @@ teardown() {
@test "Random placement plugin using ENV" {
export SOLR_PLACEMENTPLUGIN_DEFAULT=random
run solr start -c
- solr assert -c http://localhost:${SOLR_PORT}/solr -t 3000
- run solr create_collection -c COLL_NAME
+ solr assert --cloud http://localhost:${SOLR_PORT} --timeout 3000
+ run solr create -c COLL_NAME
collection_exists COLL_NAME
assert_file_contains "${SOLR_LOGS_DIR}/solr.log" 'Default replica placement plugin set in solr\.placementplugin\.default to random'
}
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc b/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
index 38341c44f0d..c856d5525c5 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
@@ -498,32 +498,28 @@ The basic usage of `bin/solr assert` is:
[source, plain]
----
$ bin/solr assert -h
-usage: bin/solr assert [-m <message>] [-e] [-rR] [--started <url>] [-not-started <url>] [-c
- <url>] [-C <url>] [-u <dir>] [-x <dir>] [-X <dir>]
- -c,---cloud <url> Asserts that Solr is running in cloud mode.
- Also fails if Solr not running. URL should
- be for root Solr path.
- -C,--not-cloud <url> Asserts that Solr is not running in cloud
- mode. Also fails if Solr not running. URL
- should be for root Solr path.
- -e,--exitcode Return an exit code instead of printing
- error message on assert fail.
- -m,--message <message> Exception message to be used in place of
- the default error message.
- -R,--not-root Asserts that we are NOT the root user.
- -r,--root Asserts that we are the root user.
- -S,--not-started <url> Asserts that Solr is NOT running on a
- certain URL. Default timeout is 1000ms.
- -s,--started <url> Asserts that Solr is running on a certain
- URL. Default timeout is 1000ms.
- -t,--timeout <ms> Timeout in ms for commands supporting a
- timeout.
- -u,--same-user <directory> Asserts that we run as same user that owns
- <directory>.
- -x,--exists <directory> Asserts that directory <directory> exists.
- -X,--not-exists <directory> Asserts that directory <directory> does NOT
- exist.
- -u,--credentials <user:pass> Username and password for Basic authentication.
+usage: bin/solr assert [--cloud <url>] [--exists <directory>] [--exitcode] [-h] [--message <message>] [--not-cloud
+ <url>] [--not-exists <directory>] [--not-root] [--not-started <url>] [--root] [--same-user <directory>]
+ [--started <url>] [--timeout <ms>] [-u <credentials>] [--verbose]
+
+List of options:
+ --cloud <url> Asserts that Solr is running in cloud mode. Also fails if Solr not running. URL
+ should be for root Solr path.
+ --exists <directory> Asserts that directory <directory> exists.
+ --exitcode Return an exit code instead of printing error message on assert fail.
+ -h,--help Print this message.
+ --message <message> Exception message to be used in place of the default error message.
+ --not-cloud <url> Asserts that Solr is not running in cloud mode. Also fails if Solr not running. URL
+ should be for root Solr path.
+ --not-exists <directory> Asserts that directory <directory> does NOT exist.
+ --not-root Asserts that we are NOT the root user.
+ --not-started <url> Asserts that Solr is NOT running on a certain URL. Default timeout is 1000ms.
+ --root Asserts that we are the root user.
+ --same-user <directory> Asserts that we run as same user that owns <directory>.
+ --started <url> Asserts that Solr is running on a certain URL. Default timeout is 1000ms.
+ --timeout <ms> Timeout in ms for commands supporting a timeout.
+ -u,--credentials <credentials> Credentials in the format username:password. Example: --credentials solr:SolrRocks
+ --verbose Enable verbose command output.
----
=== Healthcheck
(solr) 02/02: Updates from backport SOLR-17479
Posted by ep...@apache.org.
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
commit 3877d923ab5318f83d2b14eb7076dd688c509ae7
Author: Eric Pugh <ep...@opensourceconnections.com>
AuthorDate: Wed Oct 9 17:54:59 2024 -0600
Updates from backport SOLR-17479
---
.../src/java/org/apache/solr/cli/AssertTool.java | 24 +++++-----------------
.../src/java/org/apache/solr/cli/ZkLsTool.java | 3 ++-
2 files changed, 7 insertions(+), 20 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/cli/AssertTool.java b/solr/core/src/java/org/apache/solr/cli/AssertTool.java
index 15341e77582..4474c2f744f 100644
--- a/solr/core/src/java/org/apache/solr/cli/AssertTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/AssertTool.java
@@ -341,15 +341,10 @@ public class AssertTool extends ToolBase {
ret += sameUser(cli.getOptionValue("same-user"));
}
if (cli.hasOption("s")) {
- ret +=
- assertSolrRunning(
- cli.getOptionValue("s"), cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ ret += assertSolrRunning(cli.getOptionValue("s"));
}
if (cli.hasOption("started")) {
- ret +=
- assertSolrRunning(
- cli.getOptionValue("started"),
- cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ ret += assertSolrRunning(cli.getOptionValue("started"));
}
if (cli.hasOption("S")) {
ret +=
@@ -357,28 +352,19 @@ public class AssertTool extends ToolBase {
SolrCLI.getOptionWithDeprecatedAndDefault(cli, "not-started", "S", null));
}
if (cli.hasOption("not-started")) {
- ret +=
- assertSolrNotRunning(
- cli.getOptionValue("not-started"),
- cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ ret += assertSolrNotRunning(cli.getOptionValue("not-started"));
}
if (cli.hasOption("c")) {
ret += assertSolrRunningInCloudMode(cli.getOptionValue("c"));
}
if (cli.hasOption("cloud")) {
- ret +=
- assertSolrRunningInCloudMode(
- SolrCLI.normalizeSolrUrl(cli.getOptionValue("cloud")),
- cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ ret += assertSolrRunningInCloudMode(cli.getOptionValue("cloud"));
}
if (cli.hasOption("C")) {
ret += assertSolrNotRunningInCloudMode(cli.getOptionValue("C"));
}
if (cli.hasOption("not-cloud")) {
- ret +=
- assertSolrNotRunningInCloudMode(
- SolrCLI.normalizeSolrUrl(cli.getOptionValue("not-cloud")),
- cli.getOptionValue(SolrCLI.OPTION_CREDENTIALS.getLongOpt()));
+ ret += assertSolrNotRunningInCloudMode(cli.getOptionValue("not-cloud"));
}
return ret;
}
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 0e4693e76e9..4b83140b529 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java
@@ -75,7 +75,8 @@ public class ZkLsTool extends ToolBase {
+ " from ZooKeeper at "
+ zkHost
+ " recursive: "
- + recursive, cli);
+ + recursive,
+ cli);
stdout.print(zkClient.listZnode(znode, recursive));
} catch (Exception e) {
log.error("Could not complete ls operation for reason: ", e);