You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2018/03/21 04:10:58 UTC

ignite git commit: IGNITE-7864 Control utility: Added confirm on dangerous operations.

Repository: ignite
Updated Branches:
  refs/heads/master 70a3ae9d9 -> a50f5f71e


IGNITE-7864 Control utility: Added confirm on dangerous operations.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a50f5f71
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a50f5f71
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a50f5f71

Branch: refs/heads/master
Commit: a50f5f71ef20cbb26437197c7a7ea61e499f4db9
Parents: 70a3ae9
Author: Sergey Kosarev <ma...@gmail.com>
Authored: Wed Mar 21 11:11:01 2018 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Wed Mar 21 11:11:01 2018 +0700

----------------------------------------------------------------------
 .../ignite/internal/commandline/Arguments.java  |  22 +-
 .../ignite/internal/commandline/Command.java    |  65 ++++
 .../internal/commandline/CommandHandler.java    | 369 ++++++++++++-------
 .../commandline/CommandHandlerParsingTest.java  |  28 +-
 .../ignite/util/GridCommandHandlerTest.java     |  98 +++--
 5 files changed, 383 insertions(+), 199 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a50f5f71/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
index 6a9a3f7..23c8eec 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
@@ -22,7 +22,7 @@ package org.apache.ignite.internal.commandline;
  */
 public class Arguments {
     /** Command. */
-    private String cmd;
+    private Command cmd;
 
     /** Host. */
     private String host;
@@ -36,6 +36,9 @@ public class Arguments {
     /** Password. */
     private String pwd;
 
+    /** Force option is used for auto confirmation. */
+    private boolean force;
+
     /**
      * Action for baseline command.
      */
@@ -54,9 +57,12 @@ public class Arguments {
      * @param pwd Password.
      * @param baselineAct Baseline action.
      * @param baselineArgs Baseline args.
+     * @param force Force flag.
      */
-    public Arguments(String cmd, String host, String port, String user, String pwd, String baselineAct,
-        String baselineArgs) {
+    public Arguments(Command cmd, String host, String port, String user, String pwd,
+        String baselineAct, String baselineArgs,
+        boolean force
+    ) {
         this.cmd = cmd;
         this.host = host;
         this.port = port;
@@ -64,12 +70,13 @@ public class Arguments {
         this.pwd = pwd;
         this.baselineAct = baselineAct;
         this.baselineArgs = baselineArgs;
+        this.force = force;
     }
 
     /**
      * @return command
      */
-    public String command() {
+    public Command command() {
         return cmd;
     }
 
@@ -114,4 +121,11 @@ public class Arguments {
     public String baselineArguments() {
         return baselineArgs;
     }
+
+    /**
+     * @return Force option.
+     */
+    public boolean force() {
+        return force;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a50f5f71/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java
new file mode 100644
index 0000000..e73a24f
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java
@@ -0,0 +1,65 @@
+/*
+ * 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.ignite.internal.commandline;
+
+/**
+ * Command.
+ */
+public enum Command {
+    /** */
+    ACTIVATE("--activate"),
+
+    /** */
+    DEACTIVATE("--deactivate"),
+
+    /** */
+    STATE("--state"),
+
+    /** */
+    BASELINE("--baseline");
+
+    /** */
+    private final String text;
+
+    /**
+     * @param text Text.
+     */
+    Command(String text) {
+        this.text = text;
+    }
+
+    /**
+     * @param text Command text.
+     * @return Command for the text.
+     */
+    public static Command of(String text) {
+        for (Command cmd : Command.values()) {
+            if (cmd.text().equalsIgnoreCase(text))
+                return cmd;
+        }
+
+        return null;
+    }
+
+    /**
+     * @return Command text.
+     */
+    public String text() {
+        return text;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/a50f5f71/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
index 5895ad2..5993f59 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Scanner;
 import org.apache.ignite.internal.client.GridClient;
 import org.apache.ignite.internal.client.GridClientAuthenticationException;
 import org.apache.ignite.internal.client.GridClientClosedException;
@@ -50,6 +51,10 @@ import org.jetbrains.annotations.NotNull;
 
 import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
+import static org.apache.ignite.internal.commandline.Command.ACTIVATE;
+import static org.apache.ignite.internal.commandline.Command.BASELINE;
+import static org.apache.ignite.internal.commandline.Command.DEACTIVATE;
+import static org.apache.ignite.internal.commandline.Command.STATE;
 import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.ADD;
 import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.COLLECT;
 import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.REMOVE;
@@ -88,6 +93,9 @@ public class CommandHandler {
     private static final String BASELINE_REMOVE = "remove";
 
     /** */
+    private static final String BASELINE_COLLECT = "collect";
+
+    /** */
     private static final String BASELINE_SET = "set";
 
     /** */
@@ -96,32 +104,32 @@ public class CommandHandler {
     /** */
     private static final String DELIM = "--------------------------------------------------------------------------------";
 
-    /** */
-    static final String CMD_ACTIVATE = "--activate";
+    /** Force option is used for auto confirmation. */
+    private static final String CMD_FORCE = "--force";
 
     /** */
-    static final String CMD_BASE_LINE = "--baseline";
+    public static final int EXIT_CODE_OK = 0;
 
     /** */
-    static final String CMD_DEACTIVATE = "--deactivate";
+    public static final int EXIT_CODE_INVALID_ARGUMENTS = 1;
 
     /** */
-    static final String CMD_STATE = "--state";
+    public static final int EXIT_CODE_CONNECTION_FAILED = 2;
 
     /** */
-    public static final int EXIT_CODE_OK = 0;
+    public static final int ERR_AUTHENTICATION_FAILED = 3;
 
     /** */
-    public static final int EXIT_CODE_INVALID_ARGUMENTS = 1;
+    public static final int EXIT_CODE_UNEXPECTED_ERROR = 4;
 
     /** */
-    public static final int EXIT_CODE_CONNECTION_FAILED = 2;
+    private static final Scanner IN = new Scanner(System.in);
 
     /** */
-    public static final int ERR_AUTHENTICATION_FAILED = 3;
+    private Iterator<String> argsIt;
 
     /** */
-    public static final int EXIT_CODE_UNEXPECTED_ERROR = 4;
+    private String peekedArg;
 
     /**
      * Output specified string to console.
@@ -133,6 +141,18 @@ public class CommandHandler {
     }
 
     /**
+     * Provides a prompt, then reads a single line of text from the console.
+     *
+     * @param prompt text
+     * @return A string containing the line read from the console
+     */
+    private String readLine(String prompt) {
+        System.out.print(prompt);
+
+        return IN.nextLine();
+    }
+
+    /**
      * Output empty line.
      */
     private void nl() {
@@ -167,119 +187,56 @@ public class CommandHandler {
     }
 
     /**
-     * Extract next argument.
+     * Requests interactive user confirmation if forthcoming operation is dangerous.
      *
-     * @param it Arguments iterator.
-     * @param err Error message.
-     * @return Next argument value.
+     * @param args Arguments.
+     * @return {@code true} if operation confirmed (or not needed), {@code false} otherwise.
      */
-    private String nextArg(Iterator<String> it, String err) {
-        if (it.hasNext()) {
-            String arg = it.next();
-
-            if (arg.startsWith("--"))
-                throw new IllegalArgumentException("Unexpected argument: " + arg);
+    private boolean confirm(Arguments args) {
+        String prompt = confirmationPrompt(args);
 
-            return arg;
-        }
+        if (prompt == null)
+            return true;
 
-        throw new IllegalArgumentException(err);
+        return "y".equalsIgnoreCase(readLine(prompt));
     }
 
     /**
-     * Parses and validates arguments.
-     *
-     * @param rawArgs Array of arguments.
-     * @return Arguments bean.
-     * @throws IllegalArgumentException In case arguments aren't valid.
+     * @param args Arguments.
+     * @return Prompt text if confirmation needed, otherwise {@code null}.
      */
-    @NotNull Arguments parseAndValidate(String... rawArgs) {
-        String host = DFLT_HOST;
-
-        String port = DFLT_PORT;
-
-        String user = null;
-
-        String pwd = null;
-
-        String baselineAct = "";
-
-        String baselineArgs = "";
+    private String confirmationPrompt(Arguments args) {
+        if (args.force())
+            return null;
 
-        List<String> commands = new ArrayList<>();
+        String str = null;
 
-        Iterator<String> it = Arrays.asList(rawArgs).iterator();
-
-        while (it.hasNext()) {
-            String str = it.next().toLowerCase();
-
-            switch (str) {
-                case CMD_HOST:
-                    host = nextArg(it, "Expected host name");
-                    break;
-
-                case CMD_PORT:
-                    port = nextArg(it, "Expected port number");
-
-                    try {
-                        int p = Integer.parseInt(port);
-
-                        if (p <= 0 || p > 65535)
-                            throw new IllegalArgumentException("Invalid value for port: " + port);
-                    }
-                    catch (NumberFormatException ignored) {
-                        throw new IllegalArgumentException("Invalid value for port: " + port);
-                    }
-                    break;
-
-                case CMD_USER:
-                    user = nextArg(it, "Expected user name");
-                    break;
-
-                case CMD_PASSWORD:
-                    pwd = nextArg(it, "Expected password");
-                    break;
-
-                case CMD_ACTIVATE:
-                case CMD_DEACTIVATE:
-                case CMD_STATE:
-                    commands.add(str);
-                    break;
-
-                case CMD_BASE_LINE:
-                    commands.add(CMD_BASE_LINE);
-
-                    if (it.hasNext()) {
-                        baselineAct = it.next().toLowerCase();
-
-                        if (BASELINE_ADD.equals(baselineAct) || BASELINE_REMOVE.equals(baselineAct) ||
-                            BASELINE_SET.equals(baselineAct) || BASELINE_SET_VERSION.equals(baselineAct))
-                            baselineArgs = nextArg(it, "Expected baseline arguments");
-                        else
-                            throw new IllegalArgumentException("Unexpected argument for " + CMD_BASE_LINE + ": "
-                                + baselineAct);
-                    }
+        switch (args.command()) {
+            case DEACTIVATE:
+                str = "Warning: the command will deactivate a cluster.";
+                break;
 
-            }
+            case BASELINE:
+                if (!BASELINE_COLLECT.equals(args.baselineAction()))
+                    str = "Warning: the command will perform changes in baseline.";
         }
 
-        int sz = commands.size();
-
-        if (sz < 1)
-            throw new IllegalArgumentException("No action was specified");
-
-        if (sz > 1)
-            throw new IllegalArgumentException("Only one action can be specified, but found: " + sz);
-
-        String cmd = commands.get(0);
-
-        boolean hasUsr = F.isEmpty(user);
-        boolean hasPwd = F.isEmpty(pwd);
+        return str == null ? null : str + "\nPress 'y' to continue...";
+    }
 
-        if (hasUsr != hasPwd)
-            throw new IllegalArgumentException("Both user and password should be specified");
+    /**
+     * @param rawArgs Arguments.
+     */
+    private void initArgIterator(List<String> rawArgs) {
+        argsIt = rawArgs.iterator();
+        peekedArg = null;
+    }
 
-        return new Arguments(cmd, host, port, user, pwd, baselineAct, baselineArgs);
+    /**
+     * @return Returns {@code true} if the iteration has more elements.
+     */
+    private boolean hasNextArg() {
+        return peekedArg != null || argsIt.hasNext();
     }
 
     /**
@@ -393,8 +350,9 @@ public class CommandHandler {
                 baselineVersion(client, baselineArgs);
                 break;
 
-            default:
+            case BASELINE_COLLECT:
                 baselinePrint(client);
+                break;
         }
     }
 
@@ -597,38 +555,189 @@ public class CommandHandler {
      * Print command usage.
      *
      * @param desc Command description.
-     * @param cmd Command.
+     * @param args Arguments.
      */
-    private void usage(String desc, String cmd) {
+    private void usage(String desc, Command cmd, String... args) {
         log(desc);
-        log("    control.sh [--host HOST_OR_IP] [--port PORT] [--user USER] [--password PASSWORD] " + cmd);
+        log("    control.sh [--host HOST_OR_IP] [--port PORT] [--user USER] [--password PASSWORD] " + cmd.text() + String.join("", args));
         nl();
     }
 
     /**
+     * Extract next argument.
+     *
+     * @param err Error message.
+     * @return Next argument value.
+     */
+    private String nextArg(String err) {
+        if (peekedArg != null) {
+            String res = peekedArg;
+
+            peekedArg = null;
+
+            return res;
+        }
+
+        if (argsIt.hasNext())
+            return argsIt.next();
+
+        throw new IllegalArgumentException(err);
+    }
+
+    /**
+     * Returns the next argument in the iteration, without advancing the iteration.
+     *
+     * @return Next argument value or {@code null} if no next argument.
+     */
+    private String peekNextArg() {
+        if (peekedArg == null && argsIt.hasNext())
+            peekedArg = argsIt.next();
+
+        return peekedArg;
+    }
+
+    /**
+     * Parses and validates arguments.
+     *
+     * @param rawArgs Array of arguments.
+     * @return Arguments bean.
+     * @throws IllegalArgumentException In case arguments aren't valid.
+     */
+    @NotNull Arguments parseAndValidate(List<String> rawArgs) {
+        String host = DFLT_HOST;
+
+        String port = DFLT_PORT;
+
+        String user = null;
+
+        String pwd = null;
+
+        String baselineAct = "";
+
+        String baselineArgs = "";
+
+        boolean force = false;
+
+        List<Command> commands = new ArrayList<>();
+
+        initArgIterator(rawArgs);
+
+        while (hasNextArg()) {
+            String str = nextArg("").toLowerCase();
+
+            Command cmd = Command.of(str);
+
+            if (cmd != null) {
+                switch (cmd) {
+                    case ACTIVATE:
+                    case DEACTIVATE:
+                    case STATE:
+                        commands.add(Command.of(str));
+                        break;
+
+                    case BASELINE:
+                        commands.add(BASELINE);
+
+                        baselineAct = BASELINE_COLLECT; //default baseline action
+
+                        str = peekNextArg();
+
+                        if (str != null) {
+                            str = str.toLowerCase();
+
+                            if (BASELINE_ADD.equals(str) || BASELINE_REMOVE.equals(str) ||
+                                BASELINE_SET.equals(str) || BASELINE_SET_VERSION.equals(str)) {
+                                baselineAct = nextArg("Expected baseline action");
+
+                                baselineArgs = nextArg("Expected baseline arguments");
+                            }
+                        }
+                }
+            }
+            else {
+                switch (str) {
+                    case CMD_HOST:
+                        host = nextArg("Expected host name");
+                        break;
+
+                    case CMD_PORT:
+                        port = nextArg("Expected port number");
+
+                        try {
+                            int p = Integer.parseInt(port);
+
+                            if (p <= 0 || p > 65535)
+                                throw new IllegalArgumentException("Invalid value for port: " + port);
+                        }
+                        catch (NumberFormatException ignored) {
+                            throw new IllegalArgumentException("Invalid value for port: " + port);
+                        }
+                        break;
+
+                    case CMD_USER:
+                        user = nextArg("Expected user name");
+                        break;
+
+                    case CMD_PASSWORD:
+                        pwd = nextArg("Expected password");
+                        break;
+
+                    case CMD_FORCE:
+                        force = true;
+                        break;
+                    default:
+                        throw new IllegalArgumentException("Unexpected argument: " + str);
+                }
+            }
+        }
+
+        int sz = commands.size();
+
+        if (sz < 1)
+            throw new IllegalArgumentException("No action was specified");
+
+        if (sz > 1)
+            throw new IllegalArgumentException("Only one action can be specified, but found: " + sz);
+
+        Command cmd = commands.get(0);
+
+        boolean hasUsr = F.isEmpty(user);
+        boolean hasPwd = F.isEmpty(pwd);
+
+        if (hasUsr != hasPwd)
+            throw new IllegalArgumentException("Both user and password should be specified");
+
+        return new Arguments(cmd, host, port, user, pwd, baselineAct, baselineArgs, force);
+    }
+
+    /**
      * Parse and execute command.
      *
      * @param rawArgs Arguments to parse and execute.
      * @return Exit code.
      */
-    public int execute(String... rawArgs) {
+    public int execute(List<String> rawArgs) {
         log("Control utility [ver. " + ACK_VER_STR + "]");
         log(COPYRIGHT);
         log("User: " + System.getProperty("user.name"));
         log(DELIM);
 
         try {
-            if (F.isEmpty(rawArgs) || (rawArgs.length == 1 && CMD_HELP.equalsIgnoreCase(rawArgs[0]))) {
+            if (F.isEmpty(rawArgs) || (rawArgs.size() == 1 && CMD_HELP.equalsIgnoreCase(rawArgs.get(0)))) {
                 log("This utility can do the following commands:");
 
-                usage("  Activate cluster:", CMD_ACTIVATE);
-                usage("  Deactivate cluster:", CMD_DEACTIVATE);
-                usage("  Print current cluster state:", CMD_STATE);
-                usage("  Print cluster baseline topology:", CMD_BASE_LINE);
-                usage("  Add nodes into baseline topology:", CMD_BASE_LINE + " add consistentId1[,consistentId2,....,consistentIdN]");
-                usage("  Remove nodes from baseline topology:", CMD_BASE_LINE + " remove consistentId1[,consistentId2,....,consistentIdN]");
-                usage("  Set baseline topology:", CMD_BASE_LINE + " set consistentId1[,consistentId2,....,consistentIdN]");
-                usage("  Set baseline topology based on version:", CMD_BASE_LINE + " version topologyVersion");
+                usage("  Activate cluster:", ACTIVATE);
+                usage("  Deactivate cluster:", DEACTIVATE, " [--force]");
+                usage("  Print current cluster state:", STATE);
+                usage("  Print cluster baseline topology:", BASELINE);
+                usage("  Add nodes into baseline topology:", BASELINE, " add consistentId1[,consistentId2,....,consistentIdN] [--force]");
+                usage("  Remove nodes from baseline topology:", BASELINE, " remove consistentId1[,consistentId2,....,consistentIdN] [--force]");
+                usage("  Set baseline topology:", BASELINE, " set consistentId1[,consistentId2,....,consistentIdN] [--force]");
+                usage("  Set baseline topology based on version:", BASELINE, " version topologyVersion [--force]");
+
+                log("By default cluster deactivation and changes in baseline topology commands request interactive confirmation. ");
+                log("  --force option can be used to execute commands without prompting for confirmation.");
+                nl();
 
                 log("Default values:");
                 log("    HOST_OR_IP=" + DFLT_HOST);
@@ -647,6 +756,12 @@ public class CommandHandler {
 
             Arguments args = parseAndValidate(rawArgs);
 
+            if (!confirm(args)) {
+                log("Operation canceled.");
+
+                return EXIT_CODE_OK;
+            }
+
             GridClientConfiguration cfg = new GridClientConfiguration();
 
             cfg.setServers(Collections.singletonList(args.host() + ":" + args.port()));
@@ -659,19 +774,19 @@ public class CommandHandler {
             try (GridClient client = GridClientFactory.start(cfg)) {
 
                 switch (args.command()) {
-                    case CMD_ACTIVATE:
+                    case ACTIVATE:
                         activate(client);
                         break;
 
-                    case CMD_DEACTIVATE:
+                    case DEACTIVATE:
                         deactivate(client);
                         break;
 
-                    case CMD_STATE:
+                    case STATE:
                         state(client);
                         break;
 
-                    case CMD_BASE_LINE:
+                    case BASELINE:
                         baseline(client, args.baselineAction(), args.baselineArguments());
                         break;
                 }
@@ -699,7 +814,7 @@ public class CommandHandler {
     public static void main(String[] args) {
         CommandHandler hnd = new CommandHandler();
 
-        System.exit(hnd.execute(args));
+        System.exit(hnd.execute(Arrays.asList(args)));
     }
 }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a50f5f71/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
index 1ba8b3d..cfbf1a6 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
@@ -21,10 +21,7 @@ package org.apache.ignite.internal.commandline;
 
 import junit.framework.TestCase;
 
-import static org.apache.ignite.internal.commandline.CommandHandler.CMD_ACTIVATE;
-import static org.apache.ignite.internal.commandline.CommandHandler.CMD_BASE_LINE;
-import static org.apache.ignite.internal.commandline.CommandHandler.CMD_DEACTIVATE;
-import static org.apache.ignite.internal.commandline.CommandHandler.CMD_STATE;
+import static java.util.Arrays.asList;
 import static org.apache.ignite.internal.commandline.CommandHandler.DFLT_HOST;
 import static org.apache.ignite.internal.commandline.CommandHandler.DFLT_PORT;
 
@@ -32,18 +29,15 @@ import static org.apache.ignite.internal.commandline.CommandHandler.DFLT_PORT;
  * Tests Command Handler parsing arguments.
  */
 public class CommandHandlerParsingTest extends TestCase {
-    /** Commands to test. */
-    private static final String[] Commands = new String[] {CMD_STATE, CMD_ACTIVATE, CMD_DEACTIVATE, CMD_BASE_LINE};
-
     /**
      * Test parsing and validation for user and password arguments
      */
     public void testParseAndValidateUserAndPassword() {
         CommandHandler hnd = new CommandHandler();
 
-        for (String cmd : Commands) {
+        for (Command cmd : Command.values()) {
             try {
-                hnd.parseAndValidate("--user");
+                hnd.parseAndValidate(asList("--user"));
 
                 fail("expected exception: Expected user name");
             }
@@ -52,7 +46,7 @@ public class CommandHandlerParsingTest extends TestCase {
             }
 
             try {
-                hnd.parseAndValidate("--password");
+                hnd.parseAndValidate(asList("--password"));
 
                 fail("expected exception: Expected password");
             }
@@ -61,7 +55,7 @@ public class CommandHandlerParsingTest extends TestCase {
             }
 
             try {
-                hnd.parseAndValidate("--user", "testUser", cmd);
+                hnd.parseAndValidate(asList("--user", "testUser", cmd.text()));
 
                 fail("expected exception: Both user and password should be specified");
             }
@@ -70,7 +64,7 @@ public class CommandHandlerParsingTest extends TestCase {
             }
 
             try {
-                hnd.parseAndValidate("--password", "testPass", cmd);
+                hnd.parseAndValidate(asList("--password", "testPass", cmd.text()));
 
                 fail("expected exception: Both user and password should be specified");
             }
@@ -78,7 +72,7 @@ public class CommandHandlerParsingTest extends TestCase {
                 e.printStackTrace();
             }
 
-            Arguments args = hnd.parseAndValidate("--user", "testUser", "--password", "testPass", cmd);
+            Arguments args = hnd.parseAndValidate(asList("--user", "testUser", "--password", "testPass", cmd.text()));
 
             assertEquals("testUser", args.user());
             assertEquals("testPass", args.password());
@@ -92,21 +86,21 @@ public class CommandHandlerParsingTest extends TestCase {
     public void testHostAndPort() {
         CommandHandler hnd = new CommandHandler();
 
-        for (String cmd : Commands) {
-            Arguments args = hnd.parseAndValidate(cmd);
+        for (Command cmd : Command.values()) {
+            Arguments args = hnd.parseAndValidate(asList(cmd.text()));
 
             assertEquals(cmd, args.command());
             assertEquals(DFLT_HOST, args.host());
             assertEquals(DFLT_PORT, args.port());
 
-            args = hnd.parseAndValidate("--port", "12345", "--host", "test-host", cmd);
+            args = hnd.parseAndValidate(asList("--port", "12345", "--host", "test-host", cmd.text()));
 
             assertEquals(cmd, args.command());
             assertEquals("test-host", args.host());
             assertEquals("12345", args.port());
 
             try {
-                hnd.parseAndValidate("--port", "wrong-port", cmd);
+                hnd.parseAndValidate(asList("--port", "wrong-port", cmd.text()));
 
                 fail("expected exception: Invalid value for port:");
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a50f5f71/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index 0be131b..d5051d7 100644
--- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -18,6 +18,8 @@
 package org.apache.ignite.util;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.configuration.ConnectorConfiguration;
@@ -85,22 +87,30 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     public void testActivate() throws Exception {
         Ignite ignite = startGrids(1);
 
-        assertFalse(ignite.active());
+        assertFalse(ignite.cluster().active());
 
-        CommandHandler cmd = new CommandHandler();
+        assertEquals(EXIT_CODE_OK, execute("--activate"));
 
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--activate"));
+        assertTrue(ignite.cluster().active());
+    }
 
-        assertTrue(ignite.active());
+    /**
+     * @param args Arguments.
+     * @return Result of execution.
+     */
+    protected int execute(String... args) {
+        return execute(new ArrayList<>(Arrays.asList(args)));
     }
 
     /**
-     * @param cmd CommandHandler
-     * @param args arguments
-     * @return result of execution
+     * @param args Arguments.
+     * @return Result of execution
      */
-    protected int execute(CommandHandler cmd, String... args) {
-        return cmd.execute(args);
+    protected int execute(ArrayList<String> args) {
+        // Add force to avoid interactive confirmation
+        args.add("--force");
+
+        return new CommandHandler().execute(args);
     }
 
     /**
@@ -111,17 +121,15 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     public void testDeactivate() throws Exception {
         Ignite ignite = startGrids(1);
 
-        assertFalse(ignite.active());
-
-        ignite.active(true);
+        assertFalse(ignite.cluster().active());
 
-        assertTrue(ignite.active());
+        ignite.cluster().active(true);
 
-        CommandHandler cmd = new CommandHandler();
+        assertTrue(ignite.cluster().active());
 
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--deactivate"));
+        assertEquals(EXIT_CODE_OK, execute("--deactivate"));
 
-        assertFalse(ignite.active());
+        assertFalse(ignite.cluster().active());
     }
 
     /**
@@ -132,15 +140,13 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     public void testState() throws Exception {
         Ignite ignite = startGrids(1);
 
-        assertFalse(ignite.active());
-
-        CommandHandler cmd = new CommandHandler();
+        assertFalse(ignite.cluster().active());
 
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--state"));
+        assertEquals(EXIT_CODE_OK, execute("--state"));
 
-        ignite.active(true);
+        ignite.cluster().active(true);
 
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--state"));
+        assertEquals(EXIT_CODE_OK, execute("--state"));
     }
 
     /**
@@ -151,13 +157,11 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     public void testBaselineCollect() throws Exception {
         Ignite ignite = startGrids(1);
 
-        assertFalse(ignite.active());
+        assertFalse(ignite.cluster().active());
 
-        ignite.active(true);
+        ignite.cluster().active(true);
 
-        CommandHandler cmd = new CommandHandler();
-
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline"));
+        assertEquals(EXIT_CODE_OK, execute("--baseline"));
 
         assertEquals(1, ignite.cluster().currentBaselineTopology().size());
     }
@@ -189,16 +193,14 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     public void testBaselineAdd() throws Exception {
         Ignite ignite = startGrids(1);
 
-        assertFalse(ignite.active());
-
-        ignite.active(true);
+        assertFalse(ignite.cluster().active());
 
-        CommandHandler cmd = new CommandHandler();
+        ignite.cluster().active(true);
 
         Ignite other = startGrid(2);
 
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "add", consistentIds(other)));
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "add", consistentIds(other)));
+        assertEquals(EXIT_CODE_OK, execute("--baseline", "add", consistentIds(other)));
+        assertEquals(EXIT_CODE_OK, execute("--baseline", "add", consistentIds(other)));
 
         assertEquals(2, ignite.cluster().currentBaselineTopology().size());
     }
@@ -212,18 +214,16 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
         Ignite ignite = startGrids(1);
         Ignite other = startGrid("nodeToStop");
 
-        assertFalse(ignite.active());
+        assertFalse(ignite.cluster().active());
 
-        ignite.active(true);
+        ignite.cluster().active(true);
 
         String offlineNodeConsId = consistentIds(other);
 
         stopGrid("nodeToStop");
 
-        CommandHandler cmd = new CommandHandler();
-
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline"));
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "remove", offlineNodeConsId));
+        assertEquals(EXIT_CODE_OK, execute("--baseline"));
+        assertEquals(EXIT_CODE_OK, execute("--baseline", "remove", offlineNodeConsId));
 
         assertEquals(1, ignite.cluster().currentBaselineTopology().size());
     }
@@ -236,19 +236,17 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     public void testBaselineSet() throws Exception {
         Ignite ignite = startGrids(1);
 
-        assertFalse(ignite.active());
+        assertFalse(ignite.cluster().active());
 
-        ignite.active(true);
+        ignite.cluster().active(true);
 
         Ignite other = startGrid(2);
 
-        CommandHandler cmd = new CommandHandler();
-
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "set", consistentIds(ignite, other)));
+        assertEquals(EXIT_CODE_OK, execute("--baseline", "set", consistentIds(ignite, other)));
 
         assertEquals(2, ignite.cluster().currentBaselineTopology().size());
 
-        assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute(cmd, "--baseline", "set", "invalidConsistentId"));
+        assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--baseline", "set", "invalidConsistentId"));
     }
 
     /**
@@ -259,17 +257,15 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
     public void testBaselineVersion() throws Exception {
         Ignite ignite = startGrids(1);
 
-        assertFalse(ignite.active());
-
-        ignite.active(true);
+        assertFalse(ignite.cluster().active());
 
-        CommandHandler cmd = new CommandHandler();
+        ignite.cluster().active(true);
 
         startGrid(2);
 
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline"));
+        assertEquals(EXIT_CODE_OK, execute("--baseline"));
 
-        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "version", String.valueOf(ignite.cluster().topologyVersion())));
+        assertEquals(EXIT_CODE_OK, execute("--baseline", "version", String.valueOf(ignite.cluster().topologyVersion())));
 
         assertEquals(2, ignite.cluster().currentBaselineTopology().size());
     }