This is an automated email from the ASF dual-hosted git repository.
namelchev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new ff1c7ed548e IGNITE-22203 Refactor CommandHandler, remove unnecessary
code (#11343)
ff1c7ed548e is described below
commit ff1c7ed548e0af1fbf2b9a26e3c1c476002e6eb7
Author: Nikita Amelchev <[email protected]>
AuthorDate: Tue May 14 17:55:19 2024 +0300
IGNITE-22203 Refactor CommandHandler, remove unnecessary code (#11343)
---
.../internal/commandline/CliCommandInvoker.java | 12 +-
.../internal/commandline/CommandHandler.java | 140 ++++++--------
.../commandline/CommandHandlerParsingTest.java | 209 ++++++++++-----------
3 files changed, 161 insertions(+), 200 deletions(-)
diff --git
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CliCommandInvoker.java
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CliCommandInvoker.java
index aa7d4ec6333..816910569fa 100644
---
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CliCommandInvoker.java
+++
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CliCommandInvoker.java
@@ -47,7 +47,7 @@ import static
org.apache.ignite.internal.commandline.CommandHandler.DFLT_HOST;
*/
public class CliCommandInvoker<A extends IgniteDataTransferObject> extends
CommandInvoker<A> implements AutoCloseable {
/** Client configuration. */
- private GridClientConfiguration clientCfg;
+ private final GridClientConfiguration clientCfg;
/** Client. */
private GridClient client;
@@ -221,14 +221,4 @@ public class CliCommandInvoker<A extends
IgniteDataTransferObject> extends Comma
return compute.balancer().balancedNode(nodes);
}
-
- /** */
- public void clientConfiguration(GridClientConfiguration clientCfg) {
- this.clientCfg = clientCfg;
- }
-
- /** */
- public GridClientConfiguration clientConfiguration() {
- return clientCfg;
- }
}
diff --git
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
index ca73e41bd0e..03193621665 100644
---
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
+++
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
@@ -255,81 +255,79 @@ public class CommandHandler {
cmdName =
toFormattedCommandName(args.cmdPath().peekLast().getClass()).toUpperCase();
- try (CliCommandInvoker<A> invoker = new
CliCommandInvoker<>(args.command(), args.commandArg(),
getClientConfiguration(args))) {
- int tryConnectMaxCnt = 3;
+ int tryConnectMaxCnt = 3;
- boolean suppliedAuth = !F.isEmpty(args.userName()) &&
!F.isEmpty(args.password());
+ boolean suppliedAuth = !F.isEmpty(args.userName()) &&
!F.isEmpty(args.password());
- boolean credentialsRequested = false;
+ boolean credentialsRequested = false;
- while (true) {
- try {
- if (!invoker.prepare(logger::info))
- return EXIT_CODE_OK;
+ while (true) {
+ try (
+ CliCommandInvoker<A> invoker =
+ new CliCommandInvoker<>(args.command(),
args.commandArg(), getClientConfiguration(args))
+ ) {
+ if (!invoker.prepare(logger::info))
+ return EXIT_CODE_OK;
- if (!args.autoConfirmation()) {
- if (!confirm(invoker.confirmationPrompt())) {
- logger.info("Operation cancelled.");
+ if (!args.autoConfirmation()) {
+ if (!confirm(invoker.confirmationPrompt())) {
+ logger.info("Operation cancelled.");
- return EXIT_CODE_OK;
- }
+ return EXIT_CODE_OK;
}
+ }
+
+ logger.info("Command [" + cmdName + "] started");
+ logger.info("Arguments: " + argumentsToString(rawArgs));
+ logger.info(U.DELIM);
+
+ String deprecationMsg =
args.command().deprecationMessage(args.commandArg());
+
+ if (deprecationMsg != null)
+ logger.warning(deprecationMsg);
- logger.info("Command [" + cmdName + "] started");
- logger.info("Arguments: " +
argumentsToString(rawArgs));
- logger.info(U.DELIM);
-
- String deprecationMsg =
args.command().deprecationMessage(args.commandArg());
-
- if (deprecationMsg != null)
- logger.warning(deprecationMsg);
-
- if (args.command() instanceof HelpCommand)
- printUsage(logger, args.cmdPath().peekLast());
- else {
- try {
- if (args.command() instanceof
BeforeNodeStartCommand)
- lastOperationRes =
invoker.invokeBeforeNodeStart(logger::info);
- else
- lastOperationRes =
invoker.invoke(logger::info, args.verbose());
- }
- catch (Throwable e) {
- logger.error("Failed to perform operation.");
- logger.error(CommandLogger.errorMessage(e));
-
- throw e;
- }
+ if (args.command() instanceof HelpCommand)
+ printUsage(logger, args.cmdPath().peekLast());
+ else {
+ try {
+ if (args.command() instanceof
BeforeNodeStartCommand)
+ lastOperationRes =
invoker.invokeBeforeNodeStart(logger::info);
+ else
+ lastOperationRes =
invoker.invoke(logger::info, args.verbose());
}
+ catch (Throwable e) {
+ logger.error("Failed to perform operation.");
+ logger.error(CommandLogger.errorMessage(e));
- break;
- }
- catch (Throwable e) {
- if (!isAuthError(e))
throw e;
+ }
+ }
- if (suppliedAuth)
- throw new GridClientAuthenticationException("Wrong
credentials.");
+ break;
+ }
+ catch (Throwable e) {
+ if (!isAuthError(e))
+ throw e;
- if (tryConnectMaxCnt == 0) {
- throw new
GridClientAuthenticationException("Maximum number of " +
- "retries exceeded");
- }
+ if (suppliedAuth)
+ throw new GridClientAuthenticationException("Wrong
credentials.");
- logger.info(credentialsRequested ?
- "Authentication error, please try again." :
- "This cluster requires authentication.");
+ if (tryConnectMaxCnt == 0)
+ throw new GridClientAuthenticationException("Maximum
number of retries exceeded");
- if (credentialsRequested)
- tryConnectMaxCnt--;
+ logger.info(credentialsRequested ?
+ "Authentication error, please try again." :
+ "This cluster requires authentication.");
- invoker.clientConfiguration(getClientConfiguration(
- retrieveUserName(args,
invoker.clientConfiguration()),
- new String(requestPasswordFromConsole("password:
")),
- args
- ));
+ if (credentialsRequested)
+ tryConnectMaxCnt--;
- credentialsRequested = true;
- }
+ if (F.isEmpty(args.userName()))
+ args.userName(requestDataFromConsole("user: "));
+
+ args.password(new
String(requestPasswordFromConsole("password: ")));
+
+ credentialsRequested = true;
}
}
@@ -514,30 +512,6 @@ public class CommandHandler {
return sb.toString();
}
- /**
- * Does one of three things:
- * <ul>
- * <li>returns user name from connection parameters if it is
there;</li>
- * <li>returns user name from client configuration if it is there;</li>
- * <li>requests user input and returns entered name.</li>
- * </ul>
- *
- * @param args Connection parameters.
- * @param clientCfg Client configuration.
- * @throws IgniteCheckedException If security credetials cannot be
provided from client configuration.
- */
- private String retrieveUserName(
- ConnectionAndSslParameters args,
- GridClientConfiguration clientCfg
- ) throws IgniteCheckedException {
- if (!F.isEmpty(args.userName()))
- return args.userName();
- else if (clientCfg.getSecurityCredentialsProvider() == null)
- return requestDataFromConsole("user: ");
- else
- return
(String)clientCfg.getSecurityCredentialsProvider().credentials().getLogin();
- }
-
/**
* @param args Common arguments.
* @return Thin client configuration to connect to cluster.
diff --git
a/modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
b/modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
index fb9f51ff9e2..ba4bb926417 100644
---
a/modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
+++
b/modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
@@ -47,33 +47,37 @@ import
org.apache.ignite.internal.management.ShutdownPolicyCommandArg;
import org.apache.ignite.internal.management.SystemViewCommand;
import org.apache.ignite.internal.management.WarmUpCommand;
import org.apache.ignite.internal.management.api.Argument;
-import org.apache.ignite.internal.management.api.BeforeNodeStartCommand;
import org.apache.ignite.internal.management.api.Command;
import org.apache.ignite.internal.management.api.CommandsRegistry;
-import org.apache.ignite.internal.management.api.ComputeCommand;
import org.apache.ignite.internal.management.api.EnumDescription;
-import org.apache.ignite.internal.management.api.HelpCommand;
-import org.apache.ignite.internal.management.api.LocalCommand;
import org.apache.ignite.internal.management.api.Positional;
-import org.apache.ignite.internal.management.baseline.BaselineAddCommand;
-import org.apache.ignite.internal.management.baseline.BaselineAddCommandArg;
-import org.apache.ignite.internal.management.baseline.BaselineCommand;
-import org.apache.ignite.internal.management.baseline.BaselineRemoveCommand;
-import org.apache.ignite.internal.management.baseline.BaselineSetCommand;
+import org.apache.ignite.internal.management.baseline.AbstractBaselineCommand;
+import
org.apache.ignite.internal.management.baseline.BaselineAutoAdjustCommand;
+import org.apache.ignite.internal.management.baseline.BaselineVersionCommand;
+import org.apache.ignite.internal.management.cache.CacheClearCommand;
+import org.apache.ignite.internal.management.cache.CacheClearCommandArg;
import org.apache.ignite.internal.management.cache.CacheCommand;
+import org.apache.ignite.internal.management.cache.CacheDestroyCommand;
+import org.apache.ignite.internal.management.cache.CacheDestroyCommandArg;
import org.apache.ignite.internal.management.cache.CacheFindGarbageCommandArg;
import
org.apache.ignite.internal.management.cache.CacheScheduleIndexesRebuildCommandArg;
import
org.apache.ignite.internal.management.cache.CacheValidateIndexesCommandArg;
import org.apache.ignite.internal.management.cdc.CdcCommand;
+import
org.apache.ignite.internal.management.cdc.CdcDeleteLostSegmentLinksCommand;
import org.apache.ignite.internal.management.consistency.ConsistencyCommand;
import
org.apache.ignite.internal.management.defragmentation.DefragmentationCommand;
+import
org.apache.ignite.internal.management.encryption.EncryptionChangeCacheKeyCommand;
+import
org.apache.ignite.internal.management.encryption.EncryptionChangeMasterKeyCommand;
import org.apache.ignite.internal.management.encryption.EncryptionCommand;
import org.apache.ignite.internal.management.kill.KillCommand;
import org.apache.ignite.internal.management.meta.MetaCommand;
+import org.apache.ignite.internal.management.meta.MetaRemoveCommand;
+import org.apache.ignite.internal.management.meta.MetaUpdateCommand;
import org.apache.ignite.internal.management.metric.MetricCommand;
import
org.apache.ignite.internal.management.performancestatistics.PerformanceStatisticsCommand;
import org.apache.ignite.internal.management.property.PropertyCommand;
import org.apache.ignite.internal.management.snapshot.SnapshotCommand;
+import org.apache.ignite.internal.management.snapshot.SnapshotRestoreCommand;
import org.apache.ignite.internal.management.tx.TxCommand;
import org.apache.ignite.internal.management.tx.TxCommandArg;
import org.apache.ignite.internal.management.tx.TxSortOrder;
@@ -81,6 +85,7 @@ import org.apache.ignite.internal.management.wal.WalCommand;
import org.apache.ignite.internal.management.wal.WalDeleteCommandArg;
import org.apache.ignite.internal.management.wal.WalPrintCommand;
import
org.apache.ignite.internal.management.wal.WalPrintCommand.WalPrintCommandArg;
+import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.testframework.GridTestUtils;
@@ -105,7 +110,6 @@ import static
org.apache.ignite.internal.management.api.CommandUtils.cmdText;
import static
org.apache.ignite.internal.management.api.CommandUtils.executable;
import static
org.apache.ignite.internal.management.api.CommandUtils.visitCommandParams;
import static org.apache.ignite.testframework.GridTestUtils.assertThrows;
-import static org.apache.ignite.util.CdcCommandTest.DELETE_LOST_SEGMENT_LINKS;
import static
org.apache.ignite.util.GridCommandHandlerIndexingCheckSizeTest.CACHE;
import static org.apache.ignite.util.SystemViewCommandTest.NODE_ID;
import static org.junit.Assert.assertArrayEquals;
@@ -439,122 +443,115 @@ public class CommandHandlerParsingTest {
*/
@Test
public <A extends IgniteDataTransferObject> void
testParseAutoConfirmationFlag() {
- new IgniteCommandRegistry().commands().forEachRemaining(e -> {
- Command<A, ?> cmdL = (Command<A, ?>)e.getValue();
-
- // SET_STATE command has mandatory argument used in confirmation
message.
- CliCommandInvoker<A> cmd = cmdL.getClass() != SetStateCommand.class
- ? new CliCommandInvoker<>(cmdL, null, null)
- : new CliCommandInvoker<>(parseArgs(asList(cmdText(cmdL),
"ACTIVE")).command(), null, null);
-
- if (!(cmd instanceof ComputeCommand)
- && !(cmd instanceof LocalCommand)
- && !(cmd instanceof BeforeNodeStartCommand)
- && !(cmd instanceof HelpCommand)) {
- return;
- }
-
- try {
- if (cmdL.confirmationPrompt(cmdL.argClass().newInstance()) ==
null)
- return;
- }
- catch (InstantiationException | IllegalAccessException ex) {
- throw new IgniteException(ex);
- }
-
- ConnectionAndSslParameters args;
+ new IgniteCommandRegistry().commands()
+ .forEachRemaining(e ->
checkParseAutoConfirmationFlag(e.getValue(), null));
+ }
- if (cmdL.getClass() == SetStateCommand.class)
- args = parseArgs(asList(cmdText(cmdL), "ACTIVE"));
- else if (cmdL.getClass() == ChangeTagCommand.class)
- args = parseArgs(asList(cmdText(cmdL), "newTagValue"));
- else if (cmdL.getClass() == WarmUpCommand.class)
- args = parseArgs(asList(cmdText(cmdL), "--stop"));
- else if (cmdL.getClass() == CdcCommand.class)
- args = parseArgs(asList(cmdText(cmdL),
DELETE_LOST_SEGMENT_LINKS, NODE_ID, UUID.randomUUID().toString()));
- else
- args = parseArgs(asList(cmdText(cmdL)));
+ /** */
+ private <A extends IgniteDataTransferObject> void
checkParseAutoConfirmationFlag(
+ Command<A, ?> cmd,
+ CommandsRegistry<A, ?> parent
+ ) {
+ if (cmd instanceof CommandsRegistry) {
+ ((CommandsRegistry<A, ?>)cmd).commands().forEachRemaining(
+ e -> checkParseAutoConfirmationFlag((Command<A,
?>)e.getValue(), (CommandsRegistry<A, ?>)cmd));
+ }
- checkCommonParametersCorrectlyParsed(cmdL, args, false);
+ if (!executable(cmd))
+ return;
- if (cmdL.getClass() == DeactivateCommand.class) {
- args = parseArgs(asList(cmdText(cmdL), "--yes"));
+ try {
+ A arg;
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
+ if (cmd.getClass() == CacheDestroyCommand.class) {
+ CacheDestroyCommandArg a = new CacheDestroyCommandArg();
- args = parseArgs(asList(cmdText(cmdL), "--force", "--yes"));
+ a.caches(F.asArray("cache1"));
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
+ arg = (A)a;
}
- else if (cmdL.getClass() == SetStateCommand.class) {
- for (String newState : asList("ACTIVE_READ_ONLY", "ACTIVE",
"INACTIVE")) {
- args = parseArgs(asList(cmdText(cmdL), newState, "--yes"));
-
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
-
- ClusterState argState =
(((SetStateCommandArg)args.commandArg())).state();
+ else if (cmd.getClass() == CacheClearCommand.class) {
+ CacheClearCommandArg a = new CacheClearCommandArg();
- assertEquals(newState, argState.toString());
- }
+ a.caches(F.asArray("cache1"));
- for (String newState : asList("ACTIVE_READ_ONLY", "ACTIVE",
"INACTIVE")) {
- args = parseArgs(asList(cmdText(cmdL), newState,
"--force", "--yes"));
-
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
+ arg = (A)a;
+ }
+ else
+ arg = cmd.argClass().newInstance();
- ClusterState argState =
(((SetStateCommandArg)args.commandArg())).state();
+ if (cmd.confirmationPrompt(arg) == null)
+ return;
+ }
+ catch (InstantiationException | IllegalAccessException ex) {
+ throw new IgniteException(ex);
+ }
- assertEquals(newState, argState.toString());
- }
- }
- else if (cmdL.getClass() == BaselineCommand.class) {
- for (String baselineAct : asList("add", "remove", "set")) {
- args = parseArgs(asList(cmdText(cmdL), baselineAct,
"c_id1,c_id2", "--yes"));
+ CommandHandler.CommandName cmdPrinter = new
CommandHandler.CommandName();
+
+ if (parent != null)
+ cmdPrinter.accept(parent);
+
+ cmdPrinter.accept(cmd);
+
+ String[] cmdText = cmdPrinter.name.substring(1).split(" ");
+
+ ConnectionAndSslParameters<A> args;
+
+ if (cmd.getClass() == SetStateCommand.class)
+ cmdText = F.concat(cmdText, "ACTIVE");
+ else if (cmd.getClass() == ChangeTagCommand.class)
+ cmdText = F.concat(cmdText, "newTagValue");
+ else if (cmd.getClass() == CdcDeleteLostSegmentLinksCommand.class)
+ cmdText = F.concat(cmdText, NODE_ID, UUID.randomUUID().toString());
+ else if (cmd.getClass() == BaselineVersionCommand.class)
+ cmdText = F.concat(cmdText, "1");
+ else if (cmd.getClass() == BaselineAutoAdjustCommand.class)
+ cmdText = F.concat(cmdText, "enable");
+ else if
(AbstractBaselineCommand.class.isAssignableFrom(cmd.getClass()))
+ cmdText = F.concat(cmdText, "consistentId1");
+ else if (cmd.getClass() == CacheDestroyCommand.class || cmd.getClass()
== CacheClearCommand.class)
+ cmdText = F.concat(cmdText, "--caches", "cache1");
+ else if (cmd.getClass() == EncryptionChangeMasterKeyCommand.class)
+ cmdText = F.concat(cmdText, "masterKeyName1");
+ else if (cmd.getClass() == EncryptionChangeCacheKeyCommand.class)
+ cmdText = F.concat(cmdText, "cacheGroup1");
+ else if (cmd.getClass() == SnapshotRestoreCommand.class)
+ cmdText = F.concat(cmdText, "snp1");
+ else if (cmd.getClass() == MetaUpdateCommand.class)
+ return;
+ else if (cmd.getClass() == MetaRemoveCommand.class)
+ cmdText = F.concat(cmdText, "--typeId", "1");
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
+ args = parseArgs(asList(cmdText));
- BaselineAddCommandArg arg =
(BaselineAddCommandArg)args.commandArg();
+ checkCommonParametersCorrectlyParsed(cmd, args, false);
- if (baselineAct.equals("add"))
- assertEquals(BaselineAddCommand.class,
args.command().getClass());
- else if (baselineAct.equals("remove"))
- assertEquals(BaselineRemoveCommand.class,
args.command().getClass());
- else if (baselineAct.equals("set"))
- assertEquals(BaselineSetCommand.class,
args.command().getClass());
+ args = parseArgs(asList(F.concat(cmdText, "--yes")));
- assertEquals(new HashSet<>(asList("c_id1", "c_id2")), new
HashSet<>(Arrays.asList(arg.consistentIDs())));
- }
- }
- else if (cmdL.getClass() == TxCommand.class) {
- args = parseArgs(asList(cmdText(cmdL), "--xid", "xid1",
"--min-duration", "10", "--kill", "--yes"));
+ checkCommonParametersCorrectlyParsed(cmd, args, true);
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
+ if (cmd.getClass() == DeactivateCommand.class) {
+ args = parseArgs(asList(F.concat(cmdText, "--force", "--yes")));
- TxCommandArg txTaskArg = (TxCommandArg)args.commandArg();
+ checkCommonParametersCorrectlyParsed(cmd, args, true);
+ }
+ else if (cmd.getClass() == SetStateCommand.class) {
+ ClusterState argState =
(((SetStateCommandArg)args.commandArg())).state();
- assertEquals("xid1", txTaskArg.xid());
- assertEquals(10_000, txTaskArg.minDuration().longValue());
- assertTrue(txTaskArg.kill());
- }
- else if (cmdL.getClass() == ChangeTagCommand.class) {
- args = parseArgs(asList(cmdText(cmdL), "newTagValue",
"--yes"));
+ assertEquals("ACTIVE", argState.toString());
+ }
+ else if (cmd.getClass() == TxCommand.class) {
+ args = parseArgs(asList(F.concat(cmdText, "--xid", "xid1",
"--min-duration", "10", "--kill", "--yes")));
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
- }
- else if (cmdL.getClass() == WarmUpCommand.class) {
- args = parseArgs(asList(cmdText(cmdL), "--stop", "--yes"));
+ checkCommonParametersCorrectlyParsed(cmd, args, true);
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
- }
- else if (cmdL.getClass() == CdcCommand.class) {
- args = parseArgs(asList(cmdText(cmdL),
DELETE_LOST_SEGMENT_LINKS,
- NODE_ID, UUID.randomUUID().toString(), "--yes"));
+ TxCommandArg txTaskArg = (TxCommandArg)args.commandArg();
- checkCommonParametersCorrectlyParsed(cmdL, args, true);
- }
- else
- fail("Unknown command: " + cmd);
- });
+ assertEquals("xid1", txTaskArg.xid());
+ assertEquals(10_000, txTaskArg.minDuration().longValue());
+ assertTrue(txTaskArg.kill());
+ }
}
/** */
@@ -1346,7 +1343,7 @@ public class CommandHandlerParsingTest {
* @param args Raw arg list.
* @return Common parameters container object.
*/
- private ConnectionAndSslParameters parseArgs(List<String> args) {
+ private <A extends IgniteDataTransferObject> ConnectionAndSslParameters<A>
parseArgs(List<String> args) {
return new ArgumentParser(setupTestLogger(), new
IgniteCommandRegistry()).parseAndValidate(args);
}