// 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.

= Ignite CLI Tool

The Ignite CLI tool uses REST API as a communication protocol between the node and the CLI,
allowing you to configure the node. By default, the CLI tool runs in the REPL (Read Eval Print Loop) mode, but you can also execute commands without entering it.

Below is a list of Ignite CLI tool commands with short descriptions:

== Installation and Usage

You can find detailed installation guide in the link:quick-start/getting-started-guide[Getting Started] tutorial. The tutorial also includes some basic usage examples.

== Command Options

The following commands can be executed in REPL mode of the command line tool:

[cols="1,1,3",opts="header", stripes=none]
|===
| Command| Parameters | Description
| `bootsrap` || Installs Ignite core modules locally. Previously `init`.
| `clear` || Clears the terminal.
| `cli config` || Gets all CLI tool configuration values.
| `cli config get` | `<config key-value>` | Gets the value of the specified CLI tool configuration.
| `cli config set` | `<config key-value>` | Sets the value of the specified CLI tool configuration.
| `cluster init` | `[--cluster-url] <--meta-storage-node> [--cmg-node]`| Initializes the cluster on the specified URL.
| `cluster show` | `[--cluster-url]` | Displays the detailed status of the specified cluster.
| `cluster config show` | `[--cluster-url] [--selector]` | Gets the configuration of the specified cluster.
| `cluster config update` | `[--cluster-url] <config in HOCON format>` | Updates the configuration of the cluster with the provided configuration in HOCON format.
| `connect` | [--cluster-url] | Connects to the specified cluster, or `localhost:3000` if no cluster url is specified. All subsequent commands use the specified cluster url.
| `disconnect` || Disconnects from the cluster.
| `exit` || Stops current interactive session.
| `help` | `<command>` | Provides information on available commands, or for specific command if the `command` parameter is specified.
| `node classpath` || Shows the current classpath used by Ignite nodes.
| `node config show` | `[--node-url][--selector]` | Gets the local node configuration.
|`node config update` | `[--node-url] <config in HOCON format>` | Updates the local node configuration with the provided configuration in HOCON format.
| `node list` || Shows the list of currently running local Ignite nodes.
| `node start` | `[--config] <nodeName>` | Starts an Ignite node locally.
| `node stop` | `<nodeName>` | Stops a locally running Ignite node.
| `status` | `--cluster-url` |Shows the status of the default cluster, or a different one if cluster-url is provided.
| `sql` | `[--cluster-url][--script-file] <query>` | Executes the specified SQL query.
| `version` || Displays current CLI tool version.
|===

== Non-interactive Mode

The following commands can be executed in non-REPL mode of the command-line tool:

[cols="1,1,3",opts="header", stripes=none]
|===
| Command| Parameters | Description
| `ignite cli config` || Gets all CLI tool configuration values.
| `ignite cli config get` | `<config key-value>` | Gets the value of the specified CLI tool configuration.
| `ignite cli config set` | `<config key-value>` | Sets the value of the specified CLI tool configuration.
| `ignite bootsrap` || Installs Ignite core modules locally. Previously `init`.
| `ignite cluster config show` | `[--cluster-url] [--selector]` | Gets the configuration of the specified cluster.
| `ignite cluster config update` | `[--cluster-url] <config in HOCON format>` | Sets the configuration of the cluster with the provided configuration in HOCON format.
| `ignite cluster init` | `[--cluster-url] <--meta-storage-node> [--cmg-node]`| Initializes the cluster on the specified URL.
| `ignite cluster show` | `[--cluster-url]` | Displays the detailed status of the specified cluster.
| `ignite help` | `<command>` | Provides information on available commands, or for specific command if the `command` parameter is specified.
| `ignite node classpath` || Shows the current classpath used by Ignite nodes.
| `ignite node config show` | `[--node-url][--selector]` | Gets the local node configuration.
| `ignite node list` || Shows the list of currently running local Ignite nodes.
| `ignite node start` | `[--config] <nodeName>` | Starts an Ignite node locally.
| `ignite node stop` | `<nodeName>` | Stops a locally running Ignite node.
|`ignite node config update` | `[--node-url] <config in HOCON format>` | Updates the local node configuration with the provided configuration in HOCON format.
| `ignite status` | `--cluster-url` |Shows the status of the default cluster, or a different one if cluster-url is provided.
| `ignite sql` | `[--cluster-url][--script-file] <query>` | Executes the specified SQL query.
| `ignite version` || Displays current CLI tool version.
|===