diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/AbstractCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/AbstractCommand.java new file mode 100644 index 0000000000000..ea4191ea1d231 --- /dev/null +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/AbstractCommand.java @@ -0,0 +1,39 @@ +/* + * 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; + +import java.util.logging.Logger; + +import org.apache.ignite.internal.client.GridClientConfiguration; + +/** + * {@inheritDoc} + */ +public abstract class AbstractCommand implements Command { + + /** Use verbose mode or not. */ + protected boolean verbose; + + /** + * {@inheritDoc} + */ + @Override public Object execute(GridClientConfiguration clientCfg, Logger log, boolean verbose) throws Exception { + this.verbose = verbose; + return this.execute(clientCfg, log); + } +} diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ActivateCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ActivateCommand.java index d1fb112ebf634..d2d12ca88fcef 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ActivateCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ActivateCommand.java @@ -32,7 +32,7 @@ * @deprecated Use {@link ClusterStateChangeCommand} instead. */ @Deprecated -public class ActivateCommand implements Command { +public class ActivateCommand extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { Command.usage(logger, "Activate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", ACTIVATE); diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/BaselineCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/BaselineCommand.java index b377b711382d8..53994d20507df 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/BaselineCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/BaselineCommand.java @@ -18,12 +18,18 @@ package org.apache.ignite.internal.commandline; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; +import java.util.function.Function; import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientNode; @@ -37,8 +43,10 @@ import org.apache.ignite.internal.visor.baseline.VisorBaselineTask; import org.apache.ignite.internal.visor.baseline.VisorBaselineTaskArg; import org.apache.ignite.internal.visor.baseline.VisorBaselineTaskResult; +import org.apache.ignite.internal.visor.util.VisorTaskUtils; import static java.lang.Boolean.TRUE; +import static java.util.Collections.singletonMap; import static org.apache.ignite.internal.commandline.CommandHandler.DELIM; import static org.apache.ignite.internal.commandline.CommandList.BASELINE; import static org.apache.ignite.internal.commandline.CommandLogger.DOUBLE_INDENT; @@ -50,7 +58,7 @@ /** * Commands associated with baseline functionality. */ -public class BaselineCommand implements Command { +public class BaselineCommand extends AbstractCommand { /** Arguments. */ private BaselineArguments baselineArgs; @@ -58,7 +66,8 @@ public class BaselineCommand implements Command { @Override public void printUsage(Logger logger) { final String constistIds = "consistentId1[,consistentId2,....,consistentIdN]"; - Command.usage(logger, "Print cluster baseline topology:", BASELINE); + Command.usage(logger, "Print cluster baseline topology:", BASELINE, + singletonMap("verbose", "Show the full list of node ips."), optional("--verbose")); Command.usage(logger, "Add nodes into baseline topology:", BASELINE, BaselineSubcommands.ADD.text(), constistIds, optional(CMD_AUTO_CONFIRMATION)); Command.usage(logger, "Remove nodes from baseline topology:", BASELINE, BaselineSubcommands.REMOVE.text(), @@ -166,13 +175,38 @@ else if (res.getRemainingTimeToBaselineAdjust() < 0) Map srvs = res.getServers(); // if task runs on a node with VisorBaselineNode of old version (V1) we'll get order=null for all nodes. + Function extractFormattedAddrs = node -> { + Stream sortedByIpHosts = + Optional.ofNullable(node) + .map(addrs -> node.getAddrs()) + .orElse(Collections.emptyList()) + .stream() + .sorted(Comparator + .comparing(resolvedAddr -> new VisorTaskUtils.SortableAddress(resolvedAddr.address()))) + .map(resolvedAddr -> { + if (!resolvedAddr.hostname().equals(resolvedAddr.address())) + return resolvedAddr.hostname() + "/" + resolvedAddr.address(); + else + return resolvedAddr.address(); + }); + if (verbose) { + String hosts = String.join(",", sortedByIpHosts.collect(Collectors.toList())); + + if (!hosts.isEmpty()) + return ", Addresses=" + hosts; + else + return ""; + } else + return sortedByIpHosts.findFirst().map(ip -> ", Address=" + ip).orElse(""); + }; String crdStr = srvs.values().stream() // check for not null .filter(node -> node.getOrder() != null) .min(Comparator.comparing(VisorBaselineNode::getOrder)) // format - .map(crd -> " (Coordinator: ConsistentId=" + crd.getConsistentId() + ", Order=" + crd.getOrder() + ")") + .map(crd -> " (Coordinator: ConsistentId=" + crd.getConsistentId() + extractFormattedAddrs.apply(crd) + + ", Order=" + crd.getOrder() + ")") .orElse(""); logger.info("Current topology version: " + res.getTopologyVersion() + crdStr); @@ -190,7 +224,8 @@ else if (res.getRemainingTimeToBaselineAdjust() < 0) String order = srvNode != null ? ", Order=" + srvNode.getOrder() : ""; - logger.info(DOUBLE_INDENT + "ConsistentId=" + node.getConsistentId() + state + order); + logger.info(DOUBLE_INDENT + "ConsistentId=" + node.getConsistentId() + + extractFormattedAddrs.apply(srvNode) + state + order); } logger.info(DELIM); diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ClusterChangeTagCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ClusterChangeTagCommand.java index 58e5f05a6d3dd..f5b8c10218dac 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ClusterChangeTagCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ClusterChangeTagCommand.java @@ -35,7 +35,7 @@ /** * Command to access cluster ID and tag functionality. */ -public class ClusterChangeTagCommand implements Command { +public class ClusterChangeTagCommand extends AbstractCommand { /** */ private static final String ERR_NO_NEW_TAG_PROVIDED = "Please provide new tag."; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 33580881f1e5e..0e92cca2cb90f 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -35,7 +35,7 @@ /** * Command to change cluster state. */ -public class ClusterStateChangeCommand implements Command { +public class ClusterStateChangeCommand extends AbstractCommand { /** Flag of forced cluster deactivation. */ static final String FORCE_COMMAND = "--force"; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/Command.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/Command.java index 12f85a0e07247..fe667b0033f56 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/Command.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/Command.java @@ -186,6 +186,22 @@ public static String extendToLen(String s, int targetLen) { */ public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception; + /** + * Actual command execution with verbose mode if needed. + * Implement it if your command supports verbose mode. + * + * @see Command#execute(GridClientConfiguration, Logger) + * + * @param clientCfg Thin client configuration if connection to cluster is necessary. + * @param logger Logger to use. + * @param verbose Use verbose mode or not + * @return Result of operation (mostly usable for tests). + * @throws Exception If error occur. + */ + default Object execute(GridClientConfiguration clientCfg, Logger logger, boolean verbose) throws Exception { + return execute(clientCfg, logger); + } + /** * Prepares confirmation for the command. * 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 fbfc14a948324..a612e1c15102e 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 @@ -269,7 +269,7 @@ public int execute(List rawArgs) { logger.info("Arguments: " + String.join(" ", rawArgs)); logger.info(DELIM); - lastOperationRes = command.execute(clientCfg, logger); + lastOperationRes = command.execute(clientCfg, logger, args.verbose()); break; } diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 10d0fe56235d3..750001662ce60 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -33,7 +33,7 @@ * @deprecated Use {@link ClusterStateChangeCommand} instead. */ @Deprecated -public class DeactivateCommand implements Command { +public class DeactivateCommand extends AbstractCommand { /** Cluster name. */ private String clusterName; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ShutdownPolicyCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ShutdownPolicyCommand.java index 3830bdb713ba7..4ef6833a00375 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ShutdownPolicyCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/ShutdownPolicyCommand.java @@ -34,7 +34,7 @@ /** * Command for change or display policy for shutdown. */ -public class ShutdownPolicyCommand implements Command { +public class ShutdownPolicyCommand extends AbstractCommand { /** Arguments. */ private ShutdownPolicyArgument shutdownPolicyArgument; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/StateCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/StateCommand.java index 7084f2fe4af33..f19637ba2a2c5 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/StateCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/StateCommand.java @@ -29,7 +29,7 @@ /** * Command to print cluster state. */ -public class StateCommand implements Command { +public class StateCommand extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { Command.usage(logger, "Print current cluster state:", STATE); diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/TracingConfigurationCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/TracingConfigurationCommand.java index d8a9673ea57eb..a9d16543f8d04 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/TracingConfigurationCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/TracingConfigurationCommand.java @@ -50,7 +50,7 @@ /** * Commands associated with tracing configuration functionality. */ -public class TracingConfigurationCommand implements Command { +public class TracingConfigurationCommand extends AbstractCommand { /** Arguments. */ private TracingConfigurationArguments args; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java index fbe89f22ee1fd..e266f592f28c7 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java @@ -61,7 +61,7 @@ /** * Transaction commands. */ -public class TxCommands implements Command { +public class TxCommands extends AbstractCommand { /** Arguments */ private VisorTxTaskArg args; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/WalCommands.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/WalCommands.java index 2919470db4a1b..783318cebb3cb 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/WalCommands.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/WalCommands.java @@ -44,7 +44,7 @@ /** * Wal commands. */ -public class WalCommands implements Command> { +public class WalCommands extends AbstractCommand> { /** */ static final String WAL_PRINT = "print"; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/WarmUpCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/WarmUpCommand.java index 2219c5abf446a..3f03e2c4bdced 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/WarmUpCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/WarmUpCommand.java @@ -31,7 +31,7 @@ /** * Command for interacting with warm-up. */ -public class WarmUpCommand implements Command { +public class WarmUpCommand extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { Command.usage(logger, "Stop warm-up:", WARM_UP, WarmUpCommandArg.STOP.argName()); diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommands.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommands.java index 681c238eb55d7..778280da11ae8 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommands.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommands.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -42,7 +43,7 @@ /** * High-level "cache" command implementation. */ -public class CacheCommands implements Command { +public class CacheCommands extends AbstractCommand { /** Empty group name. */ public static final String EMPTY_GROUP_NAME = "no_group"; @@ -75,7 +76,7 @@ public class CacheCommands implements Command { if (command == null) throw new IllegalStateException("Unknown command " + subcommand); - return command.execute(clientCfg, logger); + return command.execute(clientCfg, logger, verbose); } /** {@inheritDoc} */ diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheContention.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheContention.java index 6f7062057e090..35e658498b416 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheContention.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheContention.java @@ -21,6 +21,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -39,7 +40,7 @@ /** * Cache contention detection subcommand. */ -public class CacheContention implements Command { +public class CacheContention extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { String description = "Show the keys that are point of contention for multiple transactions."; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheDistribution.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheDistribution.java index 4b5f3b9813fa6..1def122d1ea34 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheDistribution.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheDistribution.java @@ -23,6 +23,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandHandler; @@ -46,7 +47,7 @@ /** * Would collect and print info about how data is spread between nodes and partitions. */ -public class CacheDistribution implements Command { +public class CacheDistribution extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { String CACHES = "cacheName1,...,cacheNameN"; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesForceRebuild.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesForceRebuild.java index ace4baebcd0d0..c1415ce11c616 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesForceRebuild.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesForceRebuild.java @@ -25,6 +25,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.TaskExecutor; @@ -50,7 +51,7 @@ /** * Cache subcommand that triggers indexes force rebuild. */ -public class CacheIndexesForceRebuild implements Command { +public class CacheIndexesForceRebuild extends AbstractCommand { /** Command parsed arguments. */ private Arguments args; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesList.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesList.java index b31ea5a71e70a..11d317662441d 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesList.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesList.java @@ -27,6 +27,7 @@ import java.util.regex.PatternSyntaxException; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.TaskExecutor; @@ -47,7 +48,7 @@ /** * Cache subcommand that allows to show indexes. */ -public class CacheIndexesList implements Command { +public class CacheIndexesList extends AbstractCommand { /** Command parsed arguments. */ private Arguments args; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesRebuildStatus.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesRebuildStatus.java index 0ec662e9f966f..4bf4115237ac7 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesRebuildStatus.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheIndexesRebuildStatus.java @@ -23,6 +23,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.TaskExecutor; @@ -41,7 +42,7 @@ /** * Cache subcommand that allows to show caches that have */ -public class CacheIndexesRebuildStatus implements Command { +public class CacheIndexesRebuildStatus extends AbstractCommand { /** Command parsed arguments. */ private Arguments args; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheValidateIndexes.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheValidateIndexes.java index d467b82208de3..fb2ffae5d70e9 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheValidateIndexes.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheValidateIndexes.java @@ -26,6 +26,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -62,7 +63,7 @@ /** * Validate indexes command. */ -public class CacheValidateIndexes implements Command { +public class CacheValidateIndexes extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { String CACHES = "cacheName1,...,cacheNameN"; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheViewer.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheViewer.java index 859a815df9bf0..95171c9c99944 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheViewer.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CacheViewer.java @@ -26,6 +26,7 @@ import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientException; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.OutputFormat; @@ -68,7 +69,7 @@ /** * Command to show caches on cluster. */ -public class CacheViewer implements Command { +public class CacheViewer extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { String description = "Show information about caches, groups or sequences that match a regular expression. " + diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CheckIndexInlineSizes.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CheckIndexInlineSizes.java index 7821d07a56b58..457f189afb054 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CheckIndexInlineSizes.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/CheckIndexInlineSizes.java @@ -30,6 +30,7 @@ import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientNode; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.cache.check_indexes_inline_size.CheckIndexInlineSizesResult; import org.apache.ignite.internal.commandline.cache.check_indexes_inline_size.CheckIndexInlineSizesTask; @@ -44,7 +45,7 @@ /** * Command for check secondary indexes inline size on the different nodes. */ -public class CheckIndexInlineSizes implements Command { +public class CheckIndexInlineSizes extends AbstractCommand { /** Success message. */ public static final String INDEXES_INLINE_SIZE_ARE_THE_SAME = "All secondary indexes have the same effective inline size on all cluster nodes."; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/FindAndDeleteGarbage.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/FindAndDeleteGarbage.java index 7fa625b7f019b..b2c97a3615fe5 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/FindAndDeleteGarbage.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/FindAndDeleteGarbage.java @@ -24,6 +24,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -44,7 +45,7 @@ /** * Command to find and delete garbage which could left after destroying caches in shared group. */ -public class FindAndDeleteGarbage implements Command { +public class FindAndDeleteGarbage extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { String GROUPS = "groupName1,...,groupNameN"; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/IdleVerify.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/IdleVerify.java index 7f4ecb05d2c0d..29b3447cb1a07 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/IdleVerify.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/IdleVerify.java @@ -32,6 +32,7 @@ import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.client.GridClientNode; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.argument.CommandArgUtils; @@ -65,7 +66,7 @@ /** * */ -public class IdleVerify implements Command { +public class IdleVerify extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { String CACHES = "cacheName1,...,cacheNameN"; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/ResetLostPartitions.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/ResetLostPartitions.java index dc35436196b28..34fb57a81ba99 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/ResetLostPartitions.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/cache/ResetLostPartitions.java @@ -21,6 +21,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTask; @@ -34,7 +35,7 @@ /** * Command for reseting lost partition state. */ -public class ResetLostPartitions implements Command> { +public class ResetLostPartitions extends AbstractCommand> { /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { String CACHES = "cacheName1,...,cacheNameN"; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java index b4ca6e4606c3b..c0e59a32f2358 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; @@ -34,7 +35,7 @@ /** * */ -public class DiagnosticCommand implements Command { +public class DiagnosticCommand extends AbstractCommand { /** */ private DiagnosticSubCommand subcommand; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java index 5d91227762939..18d3d5db6eddc 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java @@ -26,6 +26,7 @@ import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -52,7 +53,7 @@ /** * */ -public class PageLocksCommand implements Command { +public class PageLocksCommand extends AbstractCommand { /** */ private Arguments arguments; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/encryption/EncryptionCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/encryption/EncryptionCommand.java index eae804979c2c7..5cbd723ddf73d 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/encryption/EncryptionCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/encryption/EncryptionCommand.java @@ -20,6 +20,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -37,7 +38,7 @@ * * @see EncryptionSubcommand */ -public class EncryptionCommand implements Command { +public class EncryptionCommand extends AbstractCommand { /** Subcommand. */ EncryptionSubcommand cmd; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/MetadataCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/MetadataCommand.java index 180d5ec9fb2be..7eeab1f5bf487 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/MetadataCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/MetadataCommand.java @@ -19,6 +19,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.meta.subcommands.MetadataRemoveCommand; @@ -37,7 +38,7 @@ /** * */ -public class MetadataCommand implements Command { +public class MetadataCommand extends AbstractCommand { /** * */ diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataAbstractSubCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataAbstractSubCommand.java index dded0fdb41243..8111a023861d8 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataAbstractSubCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataAbstractSubCommand.java @@ -26,6 +26,7 @@ import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientDisconnectedException; import org.apache.ignite.internal.client.GridClientNode; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -37,7 +38,7 @@ public abstract class MetadataAbstractSubCommand< MetadataArgsDto extends IgniteDataTransferObject, MetadataResultDto extends IgniteDataTransferObject> - implements Command { + extends AbstractCommand { /** Filesystem. */ protected static final FileSystem FS = FileSystems.getDefault(); diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataHelpCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataHelpCommand.java index 35db8f254468d..da93f4f5fbbce 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataHelpCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/meta/subcommands/MetadataHelpCommand.java @@ -19,12 +19,12 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClientConfiguration; -import org.apache.ignite.internal.commandline.Command; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.meta.MetadataCommand; import org.apache.ignite.internal.commandline.meta.MetadataSubCommandsList; /** */ -public class MetadataHelpCommand implements Command { +public class MetadataHelpCommand extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger log) { throw new UnsupportedOperationException("printUsage"); diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/metric/MetricCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/metric/MetricCommand.java index a409111f2e406..861a8b9d196f4 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/metric/MetricCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/metric/MetricCommand.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -42,7 +43,7 @@ import static org.apache.ignite.internal.visor.systemview.VisorSystemViewTask.SimpleType.STRING; /** Represents command for metric values printing. */ -public class MetricCommand implements Command { +public class MetricCommand extends AbstractCommand { /** * Argument for the metric values obtainig task. * @see VisorMetricTask diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/PropertyCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/PropertyCommand.java index bee355f348d28..1f2c694e69b30 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/PropertyCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/PropertyCommand.java @@ -19,6 +19,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.processors.configuration.distributed.DistributedChangeableProperty; @@ -33,7 +34,7 @@ /** * Command to manage distributed properties (see {@link DistributedChangeableProperty}) */ -public class PropertyCommand implements Command { +public class PropertyCommand extends AbstractCommand { /** * */ diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/subcommands/PropertyAbstractSubCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/subcommands/PropertyAbstractSubCommand.java index 251ae21d54507..f852459b9b6d3 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/subcommands/PropertyAbstractSubCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/subcommands/PropertyAbstractSubCommand.java @@ -24,6 +24,7 @@ import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientDisconnectedException; import org.apache.ignite.internal.client.GridClientNode; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -35,7 +36,7 @@ public abstract class PropertyAbstractSubCommand< MetadataArgsDto extends IgniteDataTransferObject, MetadataResultDto extends IgniteDataTransferObject> - implements Command { + extends AbstractCommand { /** */ private MetadataArgsDto args; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/subcommands/PropertyHelpCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/subcommands/PropertyHelpCommand.java index 61f3080d1b077..29de3ec0a24b3 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/subcommands/PropertyHelpCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/property/subcommands/PropertyHelpCommand.java @@ -19,12 +19,12 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClientConfiguration; -import org.apache.ignite.internal.commandline.Command; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.meta.MetadataCommand; import org.apache.ignite.internal.commandline.meta.MetadataSubCommandsList; /** */ -public class PropertyHelpCommand implements Command { +public class PropertyHelpCommand extends AbstractCommand { /** {@inheritDoc} */ @Override public void printUsage(Logger log) { throw new UnsupportedOperationException("printUsage"); diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/query/KillCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/query/KillCommand.java index 38b170d210a3f..af2dbd565751a 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/query/KillCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/query/KillCommand.java @@ -23,6 +23,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -69,7 +70,7 @@ * @see ComputeMXBean * @see TransactionsMXBean */ -public class KillCommand implements Command { +public class KillCommand extends AbstractCommand { /** Command argument. */ private Object taskArgs; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/snapshot/SnapshotCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/snapshot/SnapshotCommand.java index 2c77e6997aae5..2f9597e5838f4 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/snapshot/SnapshotCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/snapshot/SnapshotCommand.java @@ -20,6 +20,7 @@ import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -41,7 +42,7 @@ * @see SnapshotMXBean * @see IgniteSnapshotManager */ -public class SnapshotCommand implements Command { +public class SnapshotCommand extends AbstractCommand { /** Command argument. */ private Object taskArgs; diff --git a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/systemview/SystemViewCommand.java b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/systemview/SystemViewCommand.java index cef934477002f..14b544f8304a5 100644 --- a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/systemview/SystemViewCommand.java +++ b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/systemview/SystemViewCommand.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.commandline.AbstractCommand; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; import org.apache.ignite.internal.commandline.CommandLogger; @@ -49,7 +50,7 @@ import static org.apache.ignite.internal.visor.systemview.VisorSystemViewTask.SimpleType.STRING; /** Represents command for {@link SystemView} content printing. */ -public class SystemViewCommand implements Command { +public class SystemViewCommand extends AbstractCommand { /** Column separator. */ public static final String COLUMN_SEPARATOR = " "; diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index a2ddf0b218730..5970ae43b4386 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.io.Serializable; +import java.lang.reflect.Field; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; @@ -606,13 +607,49 @@ private void setState(Ignite ignite, ClusterState state, String strState, String */ @Test public void testBaselineCollect() throws Exception { - Ignite ignite = startGrids(1); + Ignite ignite = startGrid( + optimize(getConfiguration(getTestIgniteInstanceName(0))).setLocalHost("0.0.0.0")); + + Field addresses = ignite.cluster().node().getClass().getDeclaredField("addrs"); + addresses.setAccessible(true); + addresses.set(ignite.cluster().node(), Arrays.asList("127.0.0.1", "0:0:0:0:0:0:0:1", "10.19.112.175", "188.166.164.247")); + Field hostNames = ignite.cluster().node().getClass().getDeclaredField("hostNames"); + hostNames.setAccessible(true); + hostNames.set(ignite.cluster().node(), Arrays.asList("10.19.112.175.hostname")); assertFalse(ignite.cluster().active()); ignite.cluster().active(true); - assertEquals(EXIT_CODE_OK, execute("--baseline")); + injectTestSystemOut(); + + { // non verbose mode + assertEquals(EXIT_CODE_OK, execute("--baseline")); + + List nodesInfo = findBaselineNodesInfo(); + assertEquals(1, nodesInfo.size()); + assertContains(log, nodesInfo.get(0), "Address=188.166.164.247.hostname/188.166.164.247, "); + } + + { // verbose mode + assertEquals(EXIT_CODE_OK, execute("--verbose", "--baseline")); + + List nodesInfo = findBaselineNodesInfo(); + assertEquals(1, nodesInfo.size()); + assertContains(log, nodesInfo.get(0), "Addresses=188.166.164.247.hostname/188.166.164.247,10.19.112.175.hostname/10.19.112.175"); + } + + { // empty resolved addresses + addresses.set(ignite.cluster().node(), Collections.emptyList()); + hostNames.set(ignite.cluster().node(), Collections.emptyList()); + + assertEquals(EXIT_CODE_OK, execute("--verbose", "--baseline")); + + List nodesInfo = findBaselineNodesInfo(); + assertEquals(1, nodesInfo.size()); + assertContains(log, nodesInfo.get(0), "ConsistentId=" + + grid(0).cluster().localNode().consistentId() + ", State="); + } assertEquals(1, ignite.cluster().currentBaselineTopology().size()); } @@ -637,7 +674,7 @@ public void testBaselineCollectCrd() throws Exception { String crdStr = findCrdInfo(); assertEquals("(Coordinator: ConsistentId=" + - grid(0).cluster().localNode().consistentId() + ", Order=1)", crdStr); + grid(0).cluster().localNode().consistentId() + ", Address=127.0.0.1.hostname/127.0.0.1" + ", Order=1)", crdStr); stopGrid(0); @@ -646,7 +683,7 @@ public void testBaselineCollectCrd() throws Exception { crdStr = findCrdInfo(); assertEquals("(Coordinator: ConsistentId=" + - grid(1).cluster().localNode().consistentId() + ", Order=2)", crdStr); + grid(1).cluster().localNode().consistentId() + ", Address=127.0.0.1.hostname/127.0.0.1" + ", Order=2)", crdStr); startGrid(0); @@ -655,7 +692,7 @@ public void testBaselineCollectCrd() throws Exception { crdStr = findCrdInfo(); assertEquals("(Coordinator: ConsistentId=" + - grid(1).cluster().localNode().consistentId() + ", Order=2)", crdStr); + grid(1).cluster().localNode().consistentId() + ", Address=127.0.0.1.hostname/127.0.0.1" + ", Order=2)", crdStr); stopGrid(1); @@ -664,7 +701,7 @@ public void testBaselineCollectCrd() throws Exception { crdStr = findCrdInfo(); assertEquals("(Coordinator: ConsistentId=" + - grid(0).cluster().localNode().consistentId() + ", Order=4)", crdStr); + grid(0).cluster().localNode().consistentId() + ", Address=127.0.0.1.hostname/127.0.0.1" + ", Order=4)", crdStr); } /** @@ -682,6 +719,30 @@ private String findCrdInfo() { return crdStr.substring(0, crdStr.indexOf('\n')).trim(); } + /** + * @return utility information about baseline nodes + */ + private List findBaselineNodesInfo() { + String outStr = testOut.toString(); + + int i = outStr.indexOf("Baseline nodes:"); + + assertTrue("Baseline nodes information is not found", i != -1); + + int j = outStr.indexOf("\n", i) + 1; + + int beginOfNodeDesc = -1; + + List nodesInfo = new ArrayList<>(); + + while ((beginOfNodeDesc = outStr.indexOf("ConsistentId=", j) ) != -1) { + j = outStr.indexOf("\n", beginOfNodeDesc); + nodesInfo.add(outStr.substring(beginOfNodeDesc, j).trim()); + } + + return nodesInfo; + } + /** * @param ignites Ignites. * @return Local node consistent ID. diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java index 949e9c6f6ed7c..148e86dbe4b96 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java @@ -1935,6 +1935,19 @@ public final class IgniteSystemProperties { defaults = "" + DFLT_DUMP_TX_COLLISIONS_INTERVAL) public static final String IGNITE_DUMP_TX_COLLISIONS_INTERVAL = "IGNITE_DUMP_TX_COLLISIONS_INTERVAL"; + /** + * Set to true only during the junit tests. + * Signals that the cluster is running in a test environment. + * + * Can be used for changing behaviour of tightly coupled code pieces during the tests. + * Use it as a last resort only, prefer another toolchain like DI, mocks and etc. if possible + */ + @SystemProperty(value = "Set to true only during the junit tests. " + + "Can be used for changing behaviour of tightly coupled code pieces during the tests. " + + "Use it as a last resort only, prefer another toolchain like DI, mocks and etc. if possible", + type = Boolean.class) + public static final String IGNITE_TEST_ENV = "IGNITE_TEST_ENV"; + /** * Enforces singleton. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/baseline/VisorBaselineNode.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/baseline/VisorBaselineNode.java index 9f4b39f2db3f0..c3187be58a291 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/visor/baseline/VisorBaselineNode.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/baseline/VisorBaselineNode.java @@ -20,12 +20,17 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; +import java.net.InetAddress; +import java.util.Collection; +import java.util.Collections; import java.util.Map; import org.apache.ignite.cluster.BaselineNode; +import org.apache.ignite.internal.dto.IgniteDataTransferObject; import org.apache.ignite.internal.managers.discovery.IgniteClusterNode; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.internal.visor.VisorDataTransferObject; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -44,6 +49,12 @@ public class VisorBaselineNode extends VisorDataTransferObject { /** */ private @Nullable Long order; + /** + * Resolved list of (ip, hostname) pairs + * (if ip has no resolved host, hostname will be the string representation of ip). + */ + private @NotNull Collection addrs = Collections.emptyList(); + /** * Default constructor. */ @@ -56,18 +67,20 @@ public VisorBaselineNode() { * * @param node Baseline node. */ - public VisorBaselineNode(BaselineNode node) { + public VisorBaselineNode(BaselineNode node, @NotNull Collection resolvedInetAddrs) { consistentId = String.valueOf(node.consistentId()); attrs = node.attributes(); //Baseline topology returns instances of DetachedClusternode - if (node instanceof IgniteClusterNode) + if (node instanceof IgniteClusterNode) { order = ((IgniteClusterNode)node).order(); + addrs = resolvedInetAddrs; + } } /** {@inheritDoc} */ @Override public byte getProtocolVersion() { - return V2; + return V3; } /** @@ -91,11 +104,20 @@ public Map getAttributes() { return order; } + /** + * + * @return Collection with resolved pairs ip->hostname + */ + public @NotNull Collection getAddrs() { + return addrs; + } + /** {@inheritDoc} */ @Override protected void writeExternalData(ObjectOutput out) throws IOException { U.writeString(out, consistentId); U.writeMap(out, attrs); out.writeObject(order); + U.writeCollection(out, addrs); } /** {@inheritDoc} */ @@ -105,10 +127,70 @@ public Map getAttributes() { if (protoVer >= V2) order = (Long)in.readObject(); + + if (protoVer >= V3) { + Collection inputAddrs = U.readCollection(in); + if (inputAddrs != null) addrs = inputAddrs; + } } /** {@inheritDoc} */ @Override public String toString() { return S.toString(VisorBaselineNode.class, this); } + + /** + * Simple data class for storing (hostname, address) pairs + */ + public static class ResolvedAddresses extends IgniteDataTransferObject { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + private String hostname; + + /** Textual representation of IP address. */ + private String addr; + + /** + * @param inetAddr Inet address. + */ + ResolvedAddresses(InetAddress inetAddr) { + this.hostname = inetAddr.getHostName(); + this.addr = inetAddr.getHostAddress(); + } + + /** + * Default constructor. + */ + public ResolvedAddresses() { + } + + /** {@inheritDoc} */ + @Override protected void writeExternalData(ObjectOutput out) throws IOException { + U.writeString(out, hostname); + U.writeString(out, addr); + } + + /** {@inheritDoc} */ + @Override protected void readExternalData(byte protoVer, ObjectInput in) + throws IOException, ClassNotFoundException { + hostname = U.readString(in); + addr = U.readString(in); + } + + /** + * @return Hostname. + */ + public String hostname() { + return hostname; + } + + /** + * @return Textual representation of IP address. + */ + public String address() { + return addr; + } + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/baseline/VisorBaselineTaskResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/baseline/VisorBaselineTaskResult.java index 769100828217a..a9b62e10f64eb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/visor/baseline/VisorBaselineTaskResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/baseline/VisorBaselineTaskResult.java @@ -20,10 +20,21 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; import java.util.Map; +import java.util.Set; import java.util.TreeMap; + +import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.cluster.BaselineNode; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.managers.discovery.IgniteClusterNode; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; @@ -75,7 +86,7 @@ private static Map toMap(Collection map = new TreeMap<>(); for (BaselineNode node : nodes) { - VisorBaselineNode dto = new VisorBaselineNode(node); + VisorBaselineNode dto = new VisorBaselineNode(node, Collections.emptyList()); map.put(dto.getConsistentId(), dto); } @@ -83,6 +94,80 @@ private static Map toMap(Collectionhostname pairs. + */ + private static Map toMapWithResolvedAddresses(Collection nodes) { + if (F.isEmpty(nodes)) + return null; + + Map map = new TreeMap<>(); + + for (BaselineNode node : nodes) { + Collection addrs = new ArrayList<>(); + + if (node instanceof IgniteClusterNode) { + for (InetAddress inetAddress: resolveInetAddresses((ClusterNode)node)) + addrs.add(new VisorBaselineNode.ResolvedAddresses(inetAddress)); + } + + VisorBaselineNode dto = new VisorBaselineNode(node, addrs); + + map.put(dto.getConsistentId(), dto); + } + + return map; + } + + /** + * @return Resolved inet addresses of node + */ + private static Collection resolveInetAddresses(ClusterNode node) { + Set res = new HashSet<>(node.addresses().size()); + + Iterator hostNamesIt = node.hostNames().iterator(); + + for (String addr : node.addresses()) { + String hostName = hostNamesIt.hasNext() ? hostNamesIt.next() : null; + + InetAddress inetAddr = null; + + if (!F.isEmpty(hostName)) { + try { + if (IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_TEST_ENV)) { + // 127.0.0.1.hostname will be resolved to 127.0.0.1 + if (hostName.endsWith(".hostname")) { + String ipStr = hostName.substring(0, hostName.length() - ".hostname".length()); + inetAddr = InetAddress.getByAddress(hostName, InetAddress.getByName(ipStr).getAddress()); + } + } + else + inetAddr = InetAddress.getByName(hostName); + } + catch (UnknownHostException ignored) { + } + } + + if (inetAddr == null || inetAddr.isLoopbackAddress()) { + try { + if (IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_TEST_ENV)) + // 127.0.0.1 will be reverse-resolved to 127.0.0.1.hostname + inetAddr = InetAddress.getByAddress(addr + ".hostname", InetAddress.getByName(addr).getAddress()); + else + inetAddr = InetAddress.getByName(addr); + } + catch (UnknownHostException ignored) { + } + } + + if (inetAddr != null) + res.add(inetAddr); + } + + return res; + } + /** * Constructor. * @@ -104,7 +189,7 @@ public VisorBaselineTaskResult( this.active = active; this.topVer = topVer; this.baseline = toMap(baseline); - this.servers = toMap(servers); + this.servers = toMapWithResolvedAddresses(servers); this.autoAdjustSettings = autoAdjustSettings; this.remainingTimeToBaselineAdjust = remainingTimeToBaselineAdjust; this.baselineAdjustInProgress = baselineAdjustInProgress; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java index 03f9ecd986d57..5fecd01189244 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorTaskUtils.java @@ -1107,7 +1107,7 @@ public static boolean joinTimedOut(String msg) { * IPv4, private IPv4, IPv4 local host, IPv6. * Lower addresses first. */ - private static class SortableAddress implements Comparable { + public static class SortableAddress implements Comparable { /** */ private int type; @@ -1122,7 +1122,7 @@ private static class SortableAddress implements Comparable { * * @param addr Address as string. */ - private SortableAddress(String addr) { + public SortableAddress(String addr) { this.addr = addr; if (addr.indexOf(':') > 0) diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java index 3fa2aaf3772f8..d2f044b04f386 100755 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java @@ -156,6 +156,7 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_CLIENT_CACHE_CHANGE_MESSAGE_TIMEOUT; import static org.apache.ignite.IgniteSystemProperties.IGNITE_DISCO_FAILED_CLIENT_RECONNECT_DELAY; import static org.apache.ignite.IgniteSystemProperties.IGNITE_LOG_CLASSPATH_CONTENT_ON_STARTUP; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_TEST_ENV; import static org.apache.ignite.IgniteSystemProperties.IGNITE_TO_STRING_INCLUDE_SENSITIVE; import static org.apache.ignite.IgniteSystemProperties.IGNITE_UPDATE_NOTIFIER; import static org.apache.ignite.IgniteSystemProperties.getBoolean; @@ -281,6 +282,7 @@ public String getName() { System.setProperty(IGNITE_DISCO_FAILED_CLIENT_RECONNECT_DELAY, "1"); System.setProperty(IGNITE_CLIENT_CACHE_CHANGE_MESSAGE_TIMEOUT, "1000"); System.setProperty(IGNITE_LOG_CLASSPATH_CONTENT_ON_STARTUP, "false"); + System.setProperty(IGNITE_TEST_ENV, "true"); S.setIncludeSensitiveSupplier(() -> getBoolean(IGNITE_TO_STRING_INCLUDE_SENSITIVE, true)); diff --git a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output index e84d8fb87815b..2806cd60552cc 100644 --- a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output +++ b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output @@ -27,7 +27,10 @@ This utility can do the following commands: ACTIVE_READ_ONLY - Activate cluster. Cache updates are denied. Print cluster baseline topology: - control.(sh|bat) --baseline + control.(sh|bat) --baseline [--verbose] + + Parameters: + verbose - Show the full list of node ips. Add nodes into baseline topology: control.(sh|bat) --baseline add consistentId1[,consistentId2,....,consistentIdN] [--yes] diff --git a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output index e84d8fb87815b..2806cd60552cc 100644 --- a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output +++ b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output @@ -27,7 +27,10 @@ This utility can do the following commands: ACTIVE_READ_ONLY - Activate cluster. Cache updates are denied. Print cluster baseline topology: - control.(sh|bat) --baseline + control.(sh|bat) --baseline [--verbose] + + Parameters: + verbose - Show the full list of node ips. Add nodes into baseline topology: control.(sh|bat) --baseline add consistentId1[,consistentId2,....,consistentIdN] [--yes]