This is an automated email from the ASF dual-hosted git repository.
timoninmaxim 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 3d7383662e2 IGNITE-27010 Implement control.sh status command for
rolling upgrade (#12521)
3d7383662e2 is described below
commit 3d7383662e275e67df90e2cc613b682d1869df79
Author: Aleksandr Chesnokov <[email protected]>
AuthorDate: Wed Dec 3 13:11:02 2025 +0300
IGNITE-27010 Implement control.sh status command for rolling upgrade
(#12521)
---
.../ignite/util/RollingUpgradeCommandTest.java | 118 +++++++++++++++++++++
.../rollingupgrade/RollingUpgradeCommand.java | 3 +-
.../RollingUpgradeStatusCommand.java | 87 +++++++++++++++
...skResult.java => RollingUpgradeStatusNode.java} | 95 ++++++++++-------
.../rollingupgrade/RollingUpgradeStatusTask.java | 72 +++++++++++++
.../rollingupgrade/RollingUpgradeTaskResult.java | 27 +++++
...ridCommandHandlerClusterByClassTest_help.output | 4 +
...andHandlerClusterByClassWithSSLTest_help.output | 4 +
8 files changed, 370 insertions(+), 40 deletions(-)
diff --git
a/modules/control-utility/src/test/java/org/apache/ignite/util/RollingUpgradeCommandTest.java
b/modules/control-utility/src/test/java/org/apache/ignite/util/RollingUpgradeCommandTest.java
index b924fb4186f..4d7b52dc7b9 100644
---
a/modules/control-utility/src/test/java/org/apache/ignite/util/RollingUpgradeCommandTest.java
+++
b/modules/control-utility/src/test/java/org/apache/ignite/util/RollingUpgradeCommandTest.java
@@ -17,11 +17,21 @@
package org.apache.ignite.util;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
import
org.apache.ignite.internal.management.rollingupgrade.RollingUpgradeCommand;
+import
org.apache.ignite.internal.management.rollingupgrade.RollingUpgradeStatusCommand;
+import
org.apache.ignite.internal.management.rollingupgrade.RollingUpgradeStatusNode;
import
org.apache.ignite.internal.management.rollingupgrade.RollingUpgradeTaskResult;
import org.apache.ignite.lang.IgniteProductVersion;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.junit.Test;
+import static java.util.stream.Collectors.toList;
import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_BUILD_VER;
import static
org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK;
@@ -39,6 +49,9 @@ public class RollingUpgradeCommandTest extends
GridCommandHandlerClusterByClassA
/** */
public static final String ROLLING_UPGRADE = "--rolling-upgrade";
+ /** */
+ public static final String STATUS = "status";
+
/** {@inheritDoc} */
@Override protected void beforeTestsStarted() throws Exception {
super.beforeTestsStarted();
@@ -177,4 +190,109 @@ public class RollingUpgradeCommandTest extends
GridCommandHandlerClusterByClassA
assertTrue(crd.context().rollingUpgrade().enabled());
}
+
+ /** */
+ @Test
+ public void testStatusWhenDisabled() {
+ int res = execute(ROLLING_UPGRADE, STATUS);
+
+ assertEquals(EXIT_CODE_OK, res);
+
+ RollingUpgradeTaskResult taskRes =
(RollingUpgradeTaskResult)lastOperationResult;
+
+ assertNull(taskRes.errorMessage());
+ assertNull(taskRes.currentVersion());
+ assertNull(taskRes.targetVersion());
+
+ assertNull(taskRes.nodes());
+
+ RollingUpgradeStatusCommand statusCmd = new
RollingUpgradeStatusCommand();
+
+ List<String> lines = new ArrayList<>();
+
+ statusCmd.printResult(null, taskRes, lines::add);
+
+ List<String> expectedLines = new ArrayList<>();
+
+ expectedLines.add("Rolling upgrade status: disabled");
+
+ assertEquals(expectedLines, lines);
+ }
+
+ /** */
+ @Test
+ public void testStatusWhenEnabled() throws Exception {
+ IgniteProductVersion curVer =
IgniteProductVersion.fromString(crd.localNode().attribute(ATTR_BUILD_VER));
+
+ String targetVerStr = curVer.major() + "." + (curVer.minor() + 1) +
"." + curVer.maintenance();
+ IgniteProductVersion targetVer =
IgniteProductVersion.fromString(targetVerStr);
+
+ execute(ROLLING_UPGRADE, ENABLE, targetVerStr);
+
+ Consumer<IgniteConfiguration> cfgC = cfg -> {
+ TcpDiscoverySpi discoSpi = new TcpDiscoverySpi() {
+ @Override public void setNodeAttributes(Map<String, Object>
attrs, IgniteProductVersion ver) {
+ super.setNodeAttributes(attrs, ver);
+ attrs.put(ATTR_BUILD_VER, targetVerStr);
+ }
+ };
+
+
discoSpi.setIpFinder(((TcpDiscoverySpi)cfg.getDiscoverySpi()).getIpFinder());
+ cfg.setDiscoverySpi(discoSpi);
+ };
+
+ try (IgniteEx ignored = startGrid(SERVER_NODE_CNT + 1, cfgC)) {
+ int res = execute(ROLLING_UPGRADE, STATUS);
+
+ assertEquals(EXIT_CODE_OK, res);
+ }
+
+ RollingUpgradeTaskResult taskRes =
(RollingUpgradeTaskResult)lastOperationResult;
+
+ assertNull(taskRes.errorMessage());
+ assertEquals(curVer, taskRes.currentVersion());
+ assertEquals(targetVer, taskRes.targetVersion());
+
+ List<RollingUpgradeStatusNode> nodes = taskRes.nodes();
+
+ assertNotNull(nodes);
+ assertEquals(SERVER_NODE_CNT + 2, nodes.size());
+
+ List<RollingUpgradeStatusNode> oldNodes = nodes.stream().filter(node
-> node.version().equals(curVer)).collect(toList());
+
+ List<RollingUpgradeStatusNode> newNodes = nodes.stream().filter(node
-> node.version().equals(targetVer)).collect(toList());
+
+ assertEquals(SERVER_NODE_CNT + 1, oldNodes.size());
+ assertEquals(1, newNodes.size());
+
+ RollingUpgradeStatusCommand statusCmd = new
RollingUpgradeStatusCommand();
+
+ List<String> lines = new ArrayList<>();
+
+ statusCmd.printResult(null, taskRes, lines::add);
+
+ List<String> expectedLines = new ArrayList<>();
+
+ expectedLines.add("Rolling upgrade status: enabled");
+ expectedLines.add("Current version: " + curVer);
+ expectedLines.add("Target version: " + targetVer);
+
+ expectedLines.add("Version " + curVer + ":");
+ oldNodes.forEach(node -> expectedLines.add(" Node[id=" +
node.uuid() +
+ ", consistentId=" + node.consistentId() +
+ ", addrs=" + node.addresses() +
+ ", order=" + node.order() +
+ ", isClient=" + node.client() +
+ "]"));
+
+ expectedLines.add("Version " + targetVer + ":");
+ newNodes.forEach(node -> expectedLines.add(" Node[id=" +
node.uuid() +
+ ", consistentId=" + node.consistentId() +
+ ", addrs=" + node.addresses() +
+ ", order=" + node.order() +
+ ", isClient=" + node.client() +
+ "]"));
+
+ assertEquals(expectedLines, lines);
+ }
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeCommand.java
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeCommand.java
index c68f0378998..9ac1b41822c 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeCommand.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeCommand.java
@@ -25,7 +25,8 @@ public class RollingUpgradeCommand extends
CommandRegistryImpl {
public RollingUpgradeCommand() {
super(
new RollingUpgradeEnableCommand(),
- new RollingUpgradeDisableCommand()
+ new RollingUpgradeDisableCommand(),
+ new RollingUpgradeStatusCommand()
);
}
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusCommand.java
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusCommand.java
new file mode 100644
index 00000000000..a46d63b6ec5
--- /dev/null
+++
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusCommand.java
@@ -0,0 +1,87 @@
+/*
+ * 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.management.rollingupgrade;
+
+import java.util.Collection;
+import java.util.TreeMap;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.internal.management.api.ComputeCommand;
+import org.apache.ignite.internal.management.api.NoArg;
+import org.apache.ignite.lang.IgniteExperimental;
+
+import static
org.apache.ignite.internal.management.api.CommandUtils.coordinatorOrNull;
+
+/** Command to get status of rolling upgrade mode. */
+@IgniteExperimental
+public class RollingUpgradeStatusCommand implements ComputeCommand<NoArg,
RollingUpgradeTaskResult> {
+ /** {@inheritDoc} */
+ @Override public String description() {
+ return "Get status of rolling upgrade mode";
+ }
+
+ /** {@inheritDoc} */
+ @Override public Class<NoArg> argClass() {
+ return NoArg.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Class<RollingUpgradeStatusTask> taskClass() {
+ return RollingUpgradeStatusTask.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void printResult(NoArg arg, RollingUpgradeTaskResult res,
Consumer<String> printer) {
+ printer.accept("Rolling upgrade status: " + (res.targetVersion() !=
null ? "enabled" : "disabled"));
+
+ if (res.targetVersion() == null)
+ return;
+
+ printer.accept("Current version: " + res.currentVersion());
+ printer.accept("Target version: " + res.targetVersion());
+
+ if (res.nodes() == null || res.nodes().isEmpty()) {
+ printer.accept("No nodes information available");
+ return;
+ }
+
+ res.nodes().stream()
+ .collect(Collectors.groupingBy(RollingUpgradeStatusNode::version,
TreeMap::new, Collectors.toList()))
+ .forEach((ver, nodes) -> {
+ printer.accept("Version " + ver + ":");
+ nodes.forEach(node -> printer.accept(" Node[id=" +
node.uuid() +
+ ", consistentId=" + node.consistentId() +
+ ", addrs=" + node.addresses() +
+ ", order=" + node.order() +
+ ", isClient=" + node.client() +
+ "]"));
+ });
+ }
+
+ /** {@inheritDoc} */
+ @Override public Collection<ClusterNode> nodes(Collection<ClusterNode>
nodes, NoArg arg) {
+ Collection<ClusterNode> coordinator = coordinatorOrNull(nodes);
+
+ if (coordinator == null)
+ throw new IgniteException("Could not find coordinator among nodes:
" + nodes);
+
+ return coordinator;
+ }
+}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeTaskResult.java
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusNode.java
similarity index 50%
copy from
modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeTaskResult.java
copy to
modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusNode.java
index 178120654c2..eb22b9c5b19 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeTaskResult.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusNode.java
@@ -20,83 +20,100 @@ package
org.apache.ignite.internal.management.rollingupgrade;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import java.util.Collection;
+import java.util.UUID;
+import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.dto.IgniteDataTransferObject;
-import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteProductVersion;
-/** */
-public class RollingUpgradeTaskResult extends IgniteDataTransferObject {
+import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_BUILD_VER;
+
+/** Node status information for rolling upgrade. */
+public class RollingUpgradeStatusNode extends IgniteDataTransferObject {
/** */
private static final long serialVersionUID = 0L;
/** */
- private IgniteProductVersion curVer;
+ private UUID uuid;
/** */
- private IgniteProductVersion targetVer;
+ private Object consistentId;
/** */
- private String errMsg;
+ private Collection<String> addresses;
/** */
- public RollingUpgradeTaskResult(IgniteProductVersion curVer,
IgniteProductVersion targetVer, String errMsg) {
- this.curVer = curVer;
- this.targetVer = targetVer;
- this.errMsg = errMsg;
- }
+ private IgniteProductVersion ver;
+
+ /** */
+ private long order;
+
+ /** */
+ private boolean client;
/** */
- public RollingUpgradeTaskResult() {
+ public RollingUpgradeStatusNode() {
// No-op.
}
/** */
- public IgniteProductVersion currentVersion() {
- return curVer;
+ public RollingUpgradeStatusNode(ClusterNode node) {
+ ver = IgniteProductVersion.fromString(node.attribute(ATTR_BUILD_VER));
+ uuid = node.id();
+ consistentId = node.consistentId();
+ addresses = node.addresses();
+ order = node.order();
+ client = node.isClient();
}
- /** */
- public void currentVersion(IgniteProductVersion curVer) {
- this.curVer = curVer;
+ /** {@inheritDoc} */
+ @Override protected void writeExternalData(ObjectOutput out) throws
IOException {
+ out.writeObject(ver);
+ U.writeUuid(out, uuid);
+ out.writeObject(consistentId);
+ U.writeCollection(out, addresses);
+ out.writeLong(order);
+ out.writeBoolean(client);
}
- /** */
- public IgniteProductVersion targetVersion() {
- return targetVer;
+ /** {@inheritDoc} */
+ @Override protected void readExternalData(ObjectInput in) throws
IOException, ClassNotFoundException {
+ ver = (IgniteProductVersion)in.readObject();
+ uuid = U.readUuid(in);
+ consistentId = in.readObject();
+ addresses = U.readCollection(in);
+ order = in.readLong();
+ client = in.readBoolean();
}
/** */
- public void targetVersion(IgniteProductVersion targetVer) {
- this.targetVer = targetVer;
+ public IgniteProductVersion version() {
+ return ver;
}
/** */
- public String errorMessage() {
- return errMsg;
+ public Collection<String> addresses() {
+ return addresses;
}
/** */
- public void errorMessage(String errMsg) {
- this.errMsg = errMsg;
+ public UUID uuid() {
+ return uuid;
}
- /** {@inheritDoc} */
- @Override protected void writeExternalData(ObjectOutput out) throws
IOException {
- out.writeObject(curVer);
- out.writeObject(targetVer);
- U.writeString(out, errMsg);
+ /** */
+ public Object consistentId() {
+ return consistentId;
}
- /** {@inheritDoc} */
- @Override protected void readExternalData(ObjectInput in) throws
IOException, ClassNotFoundException {
- this.curVer = (IgniteProductVersion)in.readObject();
- this.targetVer = (IgniteProductVersion)in.readObject();
- this.errMsg = U.readString(in);
+ /** */
+ public long order() {
+ return order;
}
- /** {@inheritDoc} */
- @Override public String toString() {
- return S.toString(RollingUpgradeTaskResult.class, this);
+ /** */
+ public boolean client() {
+ return client;
}
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusTask.java
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusTask.java
new file mode 100644
index 00000000000..af5084748f8
--- /dev/null
+++
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeStatusTask.java
@@ -0,0 +1,72 @@
+/*
+ * 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.management.rollingupgrade;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.management.api.NoArg;
+import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.lang.IgnitePair;
+import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
+import org.apache.ignite.lang.IgniteProductVersion;
+
+/** Task to obtain rolling upgrade status. */
+@GridInternal
+public class RollingUpgradeStatusTask extends VisorOneNodeTask<NoArg,
RollingUpgradeTaskResult> {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** {@inheritDoc} */
+ @Override protected VisorJob<NoArg, RollingUpgradeTaskResult> job(NoArg
arg) {
+ return new RollingUpgradeStatusJob(arg, debug);
+ }
+
+ /** */
+ private static class RollingUpgradeStatusJob extends VisorJob<NoArg,
RollingUpgradeTaskResult> {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** */
+ protected RollingUpgradeStatusJob(NoArg arg, boolean debug) {
+ super(arg, debug);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected RollingUpgradeTaskResult run(NoArg arg) throws
IgniteException {
+ IgnitePair<IgniteProductVersion> vers =
ignite.context().rollingUpgrade().versions();
+
+ List<RollingUpgradeStatusNode> nodes = null;
+
+ if (vers != null && vers.get2() != null)
+ nodes = ignite.context().discovery().allNodes().stream()
+ .map(node -> new RollingUpgradeStatusNode(node))
+ .collect(Collectors.toList());
+
+ RollingUpgradeTaskResult res = new RollingUpgradeTaskResult(
+ vers == null ? null : vers.get1(),
+ vers == null ? null : vers.get2(),
+ null,
+ nodes
+ );
+
+ return res;
+ }
+ }
+}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeTaskResult.java
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeTaskResult.java
index 178120654c2..99e9b593712 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeTaskResult.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeTaskResult.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.management.rollingupgrade;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import java.util.List;
import org.apache.ignite.internal.dto.IgniteDataTransferObject;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -39,11 +40,25 @@ public class RollingUpgradeTaskResult extends
IgniteDataTransferObject {
/** */
private String errMsg;
+ /** */
+ private List<RollingUpgradeStatusNode> nodes;
+
/** */
public RollingUpgradeTaskResult(IgniteProductVersion curVer,
IgniteProductVersion targetVer, String errMsg) {
+ this(curVer, targetVer, errMsg, null);
+ }
+
+ /** */
+ public RollingUpgradeTaskResult(
+ IgniteProductVersion curVer,
+ IgniteProductVersion targetVer,
+ String errMsg,
+ List<RollingUpgradeStatusNode> nodes
+ ) {
this.curVer = curVer;
this.targetVer = targetVer;
this.errMsg = errMsg;
+ this.nodes = nodes;
}
/** */
@@ -81,11 +96,22 @@ public class RollingUpgradeTaskResult extends
IgniteDataTransferObject {
this.errMsg = errMsg;
}
+ /** */
+ public List<RollingUpgradeStatusNode> nodes() {
+ return nodes;
+ }
+
+ /** */
+ public void nodes(List<RollingUpgradeStatusNode> nodes) {
+ this.nodes = nodes;
+ }
+
/** {@inheritDoc} */
@Override protected void writeExternalData(ObjectOutput out) throws
IOException {
out.writeObject(curVer);
out.writeObject(targetVer);
U.writeString(out, errMsg);
+ U.writeCollection(out, nodes);
}
/** {@inheritDoc} */
@@ -93,6 +119,7 @@ public class RollingUpgradeTaskResult extends
IgniteDataTransferObject {
this.curVer = (IgniteProductVersion)in.readObject();
this.targetVer = (IgniteProductVersion)in.readObject();
this.errMsg = U.readString(in);
+ this.nodes = U.readList(in);
}
/** {@inheritDoc} */
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 9bf90f38eac..a456cc42598 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
@@ -383,6 +383,10 @@ If the file name isn't specified the output file name is:
'<typeId>.bin':
Disable rolling upgrade mode. All nodes in the cluster must be running the
same version:
control.(sh|bat) --rolling-upgrade disable
+ [EXPERIMENTAL]
+ Get status of rolling upgrade mode:
+ control.(sh|bat) --rolling-upgrade status
+
Print system view content:
control.(sh|bat) --system-view system_view_name [--node-id
node_id|--node-ids nodeId1,nodeId2,..|--all-nodes]
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 21cef2d908e..bdd83c95836 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
@@ -383,6 +383,10 @@ If the file name isn't specified the output file name is:
'<typeId>.bin':
Disable rolling upgrade mode. All nodes in the cluster must be running the
same version:
control.(sh|bat) --rolling-upgrade disable
+ [EXPERIMENTAL]
+ Get status of rolling upgrade mode:
+ control.(sh|bat) --rolling-upgrade status
+
Print system view content:
control.(sh|bat) --system-view system_view_name [--node-id
node_id|--node-ids nodeId1,nodeId2,..|--all-nodes]