You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2022/11/11 10:46:24 UTC

[ignite-3] branch main updated: IGNITE-17977 Add support for '--help' option to all CLI commands (#1315)

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

ptupitsyn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 3c13c03d70 IGNITE-17977 Add support for '--help' option to all CLI commands (#1315)
3c13c03d70 is described below

commit 3c13c03d70eb2cbee0abf56fd017a4c42705c105
Author: Ivan Gagarkin <ga...@gmail.com>
AuthorDate: Fri Nov 11 14:46:19 2022 +0400

    IGNITE-17977 Add support for '--help' option to all CLI commands (#1315)
---
 .../topology/ItTopologyCommandInitializedClusterTest.java   |  1 -
 .../ItTopologyCommandNotInitializedClusterTest.java         |  1 -
 .../internal/cli/commands/cluster/ClusterCommand.java       |  5 +++--
 .../internal/cli/commands/cluster/ClusterReplCommand.java   |  5 +++--
 .../{ => cluster}/topology/LogicalTopologyCommand.java      |  2 +-
 .../{ => cluster}/topology/LogicalTopologyReplCommand.java  |  2 +-
 .../{ => cluster}/topology/PhysicalTopologyCommand.java     |  2 +-
 .../{ => cluster}/topology/PhysicalTopologyReplCommand.java |  2 +-
 .../commands/{ => cluster}/topology/TopologyCommand.java    |  7 +++++--
 .../{ => cluster}/topology/TopologyReplCommand.java         |  7 +++++--
 .../ignite/internal/cli/commands/node/NodeCommand.java      | 10 ++++++++--
 .../ignite/internal/cli/commands/node/NodeReplCommand.java  | 10 ++++++++--
 .../cli/commands/node/config/NodeConfigCommand.java         |  5 ++++-
 .../cli/commands/node/config/NodeConfigReplCommand.java     |  5 ++++-
 .../cli/commands/node/metric/NodeMetricCommand.java         |  6 +++++-
 .../cli/commands/node/metric/NodeMetricReplCommand.java     |  6 +++++-
 .../cli/core/repl/executor/IgnitePicocliCommands.java       |  5 +++++
 .../cli/core/repl/executor/RegistryCommandExecutor.java     | 13 +++++++++++--
 .../internal/cli/core/repl/executor/ReplExecutor.java       |  3 +--
 .../internal/cli/commands/UrlOptionsNegativeTest.java       |  8 ++++----
 20 files changed, 75 insertions(+), 30 deletions(-)

diff --git a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/cluster/topology/ItTopologyCommandInitializedClusterTest.java b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/cluster/topology/ItTopologyCommandInitializedClusterTest.java
index c42c186dda..770c0b6e61 100644
--- a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/cluster/topology/ItTopologyCommandInitializedClusterTest.java
+++ b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/cluster/topology/ItTopologyCommandInitializedClusterTest.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.cli.commands.cluster.topology;
 import static org.junit.jupiter.api.Assertions.assertAll;
 
 import org.apache.ignite.internal.cli.commands.CliCommandTestInitializedIntegrationBase;
-import org.apache.ignite.internal.cli.commands.topology.TopologyCommand;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
 
diff --git a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/cluster/topology/ItTopologyCommandNotInitializedClusterTest.java b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/cluster/topology/ItTopologyCommandNotInitializedClusterTest.java
index 4af17214b5..c03ff780d7 100644
--- a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/cluster/topology/ItTopologyCommandNotInitializedClusterTest.java
+++ b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/cluster/topology/ItTopologyCommandNotInitializedClusterTest.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.cli.commands.cluster.topology;
 import static org.junit.jupiter.api.Assertions.assertAll;
 
 import org.apache.ignite.internal.cli.commands.CliCommandTestNotInitializedIntegrationBase;
-import org.apache.ignite.internal.cli.commands.topology.TopologyCommand;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
 
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/ClusterCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/ClusterCommand.java
index b17b336caf..d49573368d 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/ClusterCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/ClusterCommand.java
@@ -17,10 +17,11 @@
 
 package org.apache.ignite.internal.cli.commands.cluster;
 
+import org.apache.ignite.internal.cli.commands.BaseCommand;
 import org.apache.ignite.internal.cli.commands.cluster.config.ClusterConfigCommand;
 import org.apache.ignite.internal.cli.commands.cluster.init.ClusterInitCommand;
 import org.apache.ignite.internal.cli.commands.cluster.status.ClusterStatusCommand;
-import org.apache.ignite.internal.cli.commands.topology.TopologyCommand;
+import org.apache.ignite.internal.cli.commands.cluster.topology.TopologyCommand;
 import picocli.CommandLine.Command;
 
 /**
@@ -34,5 +35,5 @@ import picocli.CommandLine.Command;
                 TopologyCommand.class
         },
         description = "Manages an Ignite cluster")
-public class ClusterCommand {
+public class ClusterCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/ClusterReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/ClusterReplCommand.java
index 9c1f72fd35..2dfa09c3d5 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/ClusterReplCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/ClusterReplCommand.java
@@ -17,10 +17,11 @@
 
 package org.apache.ignite.internal.cli.commands.cluster;
 
+import org.apache.ignite.internal.cli.commands.BaseCommand;
 import org.apache.ignite.internal.cli.commands.cluster.config.ClusterConfigReplCommand;
 import org.apache.ignite.internal.cli.commands.cluster.init.ClusterInitReplCommand;
 import org.apache.ignite.internal.cli.commands.cluster.status.ClusterStatusReplCommand;
-import org.apache.ignite.internal.cli.commands.topology.TopologyReplCommand;
+import org.apache.ignite.internal.cli.commands.cluster.topology.TopologyReplCommand;
 import picocli.CommandLine.Command;
 
 /**
@@ -34,5 +35,5 @@ import picocli.CommandLine.Command;
                 TopologyReplCommand.class
         },
         description = "Manages an Ignite cluster")
-public class ClusterReplCommand {
+public class ClusterReplCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/LogicalTopologyCommand.java
similarity index 97%
rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyCommand.java
rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/LogicalTopologyCommand.java
index ac3342edfe..f4b994aeb6 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/LogicalTopologyCommand.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cli.commands.topology;
+package org.apache.ignite.internal.cli.commands.cluster.topology;
 
 import jakarta.inject.Inject;
 import java.util.concurrent.Callable;
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/LogicalTopologyReplCommand.java
similarity index 97%
rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyReplCommand.java
rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/LogicalTopologyReplCommand.java
index c0040eda3a..37c0f7f7a7 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyReplCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/LogicalTopologyReplCommand.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cli.commands.topology;
+package org.apache.ignite.internal.cli.commands.cluster.topology;
 
 import jakarta.inject.Inject;
 import org.apache.ignite.internal.cli.call.cluster.topology.LogicalTopologyCall;
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/PhysicalTopologyCommand.java
similarity index 97%
rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyCommand.java
rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/PhysicalTopologyCommand.java
index 4bf9fdf704..a28f3fc274 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/PhysicalTopologyCommand.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cli.commands.topology;
+package org.apache.ignite.internal.cli.commands.cluster.topology;
 
 import jakarta.inject.Inject;
 import java.util.concurrent.Callable;
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/PhysicalTopologyReplCommand.java
similarity index 97%
rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyReplCommand.java
rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/PhysicalTopologyReplCommand.java
index 97f61c6ee2..b72f450f55 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyReplCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/PhysicalTopologyReplCommand.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cli.commands.topology;
+package org.apache.ignite.internal.cli.commands.cluster.topology;
 
 import jakarta.inject.Inject;
 import org.apache.ignite.internal.cli.call.cluster.topology.PhysicalTopologyCall;
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/TopologyCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/TopologyCommand.java
similarity index 84%
rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/TopologyCommand.java
rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/TopologyCommand.java
index 5c4245d7b6..a8e1655a56 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/TopologyCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/TopologyCommand.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cli.commands.topology;
+package org.apache.ignite.internal.cli.commands.cluster.topology;
 
 import org.apache.ignite.internal.cli.commands.BaseCommand;
 import picocli.CommandLine.Command;
@@ -24,6 +24,9 @@ import picocli.CommandLine.Command;
  * Command that prints ignite cluster topology.
  */
 @Command(name = "topology", description = "Prints topology information",
-        subcommands = {PhysicalTopologyCommand.class, LogicalTopologyCommand.class })
+        subcommands = {
+                PhysicalTopologyCommand.class,
+                LogicalTopologyCommand.class
+        })
 public class TopologyCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/TopologyReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/TopologyReplCommand.java
similarity index 84%
rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/TopologyReplCommand.java
rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/TopologyReplCommand.java
index fe94769cd7..deafb8913a 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/TopologyReplCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/topology/TopologyReplCommand.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cli.commands.topology;
+package org.apache.ignite.internal.cli.commands.cluster.topology;
 
 import org.apache.ignite.internal.cli.commands.BaseCommand;
 import picocli.CommandLine.Command;
@@ -24,6 +24,9 @@ import picocli.CommandLine.Command;
  * Command that prints ignite cluster topology in REPL mode.
  */
 @Command(name = "topology", description = "Prints topology information",
-        subcommands = {PhysicalTopologyReplCommand.class, LogicalTopologyReplCommand.class })
+        subcommands = {
+                PhysicalTopologyReplCommand.class,
+                LogicalTopologyReplCommand.class
+        })
 public class TopologyReplCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/NodeCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/NodeCommand.java
index bdaa852210..949f8d2ed3 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/NodeCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/NodeCommand.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.cli.commands.node;
 
+import org.apache.ignite.internal.cli.commands.BaseCommand;
 import org.apache.ignite.internal.cli.commands.node.config.NodeConfigCommand;
 import org.apache.ignite.internal.cli.commands.node.metric.NodeMetricCommand;
 import org.apache.ignite.internal.cli.commands.node.status.NodeStatusCommand;
@@ -25,7 +26,12 @@ import picocli.CommandLine.Command;
 
 /** Node command. */
 @Command(name = "node",
-        subcommands = {NodeConfigCommand.class, NodeStatusCommand.class, NodeVersionCommand.class, NodeMetricCommand.class},
+        subcommands = {
+                NodeConfigCommand.class,
+                NodeStatusCommand.class,
+                NodeVersionCommand.class,
+                NodeMetricCommand.class
+        },
         description = "Node operations")
-public class NodeCommand {
+public class NodeCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/NodeReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/NodeReplCommand.java
index 3f880f0732..f66615a7f6 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/NodeReplCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/NodeReplCommand.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.cli.commands.node;
 
+import org.apache.ignite.internal.cli.commands.BaseCommand;
 import org.apache.ignite.internal.cli.commands.node.config.NodeConfigReplCommand;
 import org.apache.ignite.internal.cli.commands.node.metric.NodeMetricReplCommand;
 import org.apache.ignite.internal.cli.commands.node.status.NodeStatusReplCommand;
@@ -25,7 +26,12 @@ import picocli.CommandLine.Command;
 
 /** Node command in REPL mode. */
 @Command(name = "node",
-        subcommands = {NodeConfigReplCommand.class, NodeStatusReplCommand.class, NodeVersionReplCommand.class, NodeMetricReplCommand.class},
+        subcommands = {
+                NodeConfigReplCommand.class,
+                NodeStatusReplCommand.class,
+                NodeVersionReplCommand.class,
+                NodeMetricReplCommand.class
+        },
         description = "Node operations")
-public class NodeReplCommand {
+public class NodeReplCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigCommand.java
index b72f2198da..7a6dcc8561 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigCommand.java
@@ -24,7 +24,10 @@ import picocli.CommandLine.Command;
  * Node config command.
  */
 @Command(name = "config",
-        subcommands = {NodeConfigShowCommand.class, NodeConfigUpdateCommand.class},
+        subcommands = {
+                NodeConfigShowCommand.class,
+                NodeConfigUpdateCommand.class
+        },
         description = "Node config operations")
 public class NodeConfigCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigReplCommand.java
index 44c6202cce..b2d0724a6d 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigReplCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigReplCommand.java
@@ -24,7 +24,10 @@ import picocli.CommandLine.Command;
  * Node config command in REPL mode.
  */
 @Command(name = "config",
-        subcommands = {NodeConfigShowReplCommand.class, NodeConfigUpdateReplCommand.class},
+        subcommands = {
+                NodeConfigShowReplCommand.class,
+                NodeConfigUpdateReplCommand.class
+        },
         description = "Node config operations")
 public class NodeConfigReplCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricCommand.java
index 752dad0028..0a43305964 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricCommand.java
@@ -22,7 +22,11 @@ import picocli.CommandLine.Command;
 
 /** Node metric command. */
 @Command(name = "metric",
-        subcommands = {NodeMetricEnableCommand.class, NodeMetricDisableCommand.class, NodeMetricListCommand.class},
+        subcommands = {
+                NodeMetricEnableCommand.class,
+                NodeMetricDisableCommand.class,
+                NodeMetricListCommand.class
+        },
         description = "Node metric operations")
 public class NodeMetricCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricReplCommand.java
index 2a2154b7b4..7f253c6a76 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricReplCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricReplCommand.java
@@ -22,7 +22,11 @@ import picocli.CommandLine.Command;
 
 /** Node metric command in REPL. */
 @Command(name = "metric",
-        subcommands = {NodeMetricEnableReplCommand.class, NodeMetricDisableReplCommand.class, NodeMetricListReplCommand.class},
+        subcommands = {
+                NodeMetricEnableReplCommand.class,
+                NodeMetricDisableReplCommand.class,
+                NodeMetricListReplCommand.class
+        },
         description = "Node metric operations")
 public class NodeMetricReplCommand extends BaseCommand {
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
index 21c7596995..db4d26ef35 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
@@ -73,6 +73,11 @@ public class IgnitePicocliCommands implements CommandRegistry {
         }
     }
 
+    /** Returns the usage help message as a String. */
+    public String usageMessage() {
+        return cmd.getUsageMessage();
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean hasCommand(String command) {
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/RegistryCommandExecutor.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/RegistryCommandExecutor.java
index 7e8f342a5b..ba3b0d095f 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/RegistryCommandExecutor.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/RegistryCommandExecutor.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.cli.core.repl.executor;
 
 
+import java.util.function.Supplier;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
@@ -35,15 +36,19 @@ public class RegistryCommandExecutor implements Call<StringCallInput, Object> {
 
     private final Parser parser;
 
+    private final Supplier<String> usageMessage;
+
     /**
      * Constructor.
      *
      * @param systemRegistry {@link SystemRegistry} instance.
      * @param parser A {@link Parser} used to create {@code systemRegistry}.
+     * @param usage A {@link Supplier} used to provide help message.
      */
-    public RegistryCommandExecutor(SystemRegistry systemRegistry, Parser parser) {
+    public RegistryCommandExecutor(SystemRegistry systemRegistry, Parser parser, Supplier<String> usage) {
         this.systemRegistry = systemRegistry;
         this.parser = parser;
+        this.usageMessage = usage;
     }
 
     /**
@@ -55,7 +60,11 @@ public class RegistryCommandExecutor implements Call<StringCallInput, Object> {
     @Override
     public CallOutput<Object> execute(StringCallInput input) {
         try {
-            Object executionResult = systemRegistry.execute(input.getString());
+            String line = input.getString();
+            if (line.trim().equals("help")) {
+                return DefaultCallOutput.success(usageMessage.get());
+            }
+            Object executionResult = systemRegistry.execute(line);
             if (executionResult == null) {
                 return DefaultCallOutput.empty();
             }
diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/ReplExecutor.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/ReplExecutor.java
index 5e333de399..0240d990fd 100644
--- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/ReplExecutor.java
+++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/ReplExecutor.java
@@ -89,7 +89,6 @@ public class ReplExecutor {
             IgnitePicocliCommands picocliCommands = createPicocliCommands(repl);
             SystemRegistryImpl registry = new SystemRegistryImpl(parser, terminal, workDirProvider, null);
             registry.setCommandRegistries(picocliCommands);
-            registry.register("help", picocliCommands);
 
             LineReader reader = createReader(repl.getCompleter() != null
                     ? new AggregateCompleter(registry.completer(), repl.getCompleter())
@@ -98,7 +97,7 @@ public class ReplExecutor {
                 reader.variable(LineReader.HISTORY_FILE, StateFolderProvider.getStateFile(repl.getHistoryFileName()));
             }
 
-            RegistryCommandExecutor executor = new RegistryCommandExecutor(registry, parser);
+            RegistryCommandExecutor executor = new RegistryCommandExecutor(registry, parser, picocliCommands::usageMessage);
             TailTipWidgets widgets = repl.isTailTipWidgetsEnabled() ? createWidgets(registry, reader) : null;
 
             QuestionAskerFactory.setReadWriter(new JlineQuestionWriterReader(reader, widgets));
diff --git a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/UrlOptionsNegativeTest.java b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/UrlOptionsNegativeTest.java
index d06340e546..d8af870e95 100644
--- a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/UrlOptionsNegativeTest.java
+++ b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/UrlOptionsNegativeTest.java
@@ -39,6 +39,10 @@ import org.apache.ignite.internal.cli.commands.cluster.init.ClusterInitCommand;
 import org.apache.ignite.internal.cli.commands.cluster.init.ClusterInitReplCommand;
 import org.apache.ignite.internal.cli.commands.cluster.status.ClusterStatusCommand;
 import org.apache.ignite.internal.cli.commands.cluster.status.ClusterStatusReplCommand;
+import org.apache.ignite.internal.cli.commands.cluster.topology.LogicalTopologyCommand;
+import org.apache.ignite.internal.cli.commands.cluster.topology.LogicalTopologyReplCommand;
+import org.apache.ignite.internal.cli.commands.cluster.topology.PhysicalTopologyCommand;
+import org.apache.ignite.internal.cli.commands.cluster.topology.PhysicalTopologyReplCommand;
 import org.apache.ignite.internal.cli.commands.connect.ConnectCommand;
 import org.apache.ignite.internal.cli.commands.node.config.NodeConfigShowCommand;
 import org.apache.ignite.internal.cli.commands.node.config.NodeConfigShowReplCommand;
@@ -52,10 +56,6 @@ import org.apache.ignite.internal.cli.commands.node.metric.NodeMetricListCommand
 import org.apache.ignite.internal.cli.commands.node.metric.NodeMetricListReplCommand;
 import org.apache.ignite.internal.cli.commands.node.status.NodeStatusCommand;
 import org.apache.ignite.internal.cli.commands.node.status.NodeStatusReplCommand;
-import org.apache.ignite.internal.cli.commands.topology.LogicalTopologyCommand;
-import org.apache.ignite.internal.cli.commands.topology.LogicalTopologyReplCommand;
-import org.apache.ignite.internal.cli.commands.topology.PhysicalTopologyCommand;
-import org.apache.ignite.internal.cli.commands.topology.PhysicalTopologyReplCommand;
 import org.apache.ignite.internal.cli.config.ini.IniConfigManager;
 import org.apache.ignite.internal.cli.core.repl.context.CommandLineContextProvider;
 import org.junit.jupiter.api.DisplayName;