This is an automated email from the ASF dual-hosted git repository.

wernerdv 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 04f29e65055 IGNITE-28982 Enable rolling upgrade in testcontainers 
compatibility tests
04f29e65055 is described below

commit 04f29e650552b1627833542a4cd0951724ae1cff
Author: Aleksandr Chesnokov <[email protected]>
AuthorDate: Fri Aug 28 11:17:15 2026 +0300

    IGNITE-28982 Enable rolling upgrade in testcontainers compatibility tests
---
 modules/compatibility/DEVNOTES.md                  |  3 +-
 .../plugins/TestCompatibilityPluginProvider.java   | 32 +++++++++++----
 .../testcontainers/IgniteContainer.java            |  6 +++
 .../{test-config.xml => common-test-config.xml}    |  5 +--
 .../test/resources/docker/target-test-config.xml   | 28 ++++++++++++++
 .../src/test/resources/docker/test-config.xml      | 45 +++-------------------
 6 files changed, 67 insertions(+), 52 deletions(-)

diff --git a/modules/compatibility/DEVNOTES.md 
b/modules/compatibility/DEVNOTES.md
index 539080553a5..c24950f5918 100644
--- a/modules/compatibility/DEVNOTES.md
+++ b/modules/compatibility/DEVNOTES.md
@@ -88,7 +88,8 @@ Run `IgniteRebalanceOnUpgradeTest` from your IDE or via 
Maven. The source versio
 All nodes stay in Docker containers throughout the test. Each node is upgraded 
in-place:
 1. The container is gracefully stopped (`docker stop`).
 2. Source jars in `/opt/ignite/apache-ignite/libs/` are replaced by target 
jars from the host.
-3. The container is restarted (`docker start`).
+3. The source Spring entry config is replaced by the target config.
+4. The container is restarted (`docker start`).
 
 The Docker image for the source cluster is the same as in LOCAL mode — only 
one image is needed.
 The target-version jars are provided from the host filesystem.
diff --git 
a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/plugins/TestCompatibilityPluginProvider.java
 
b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/plugins/TestCompatibilityPluginProvider.java
index 3ea8a567491..60e0e1d24fb 100644
--- 
a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/plugins/TestCompatibilityPluginProvider.java
+++ 
b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/plugins/TestCompatibilityPluginProvider.java
@@ -23,8 +23,8 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteKernal;
-import org.apache.ignite.internal.IgniteNodeAttributes;
 import 
org.apache.ignite.internal.processors.nodevalidation.DiscoveryNodeValidationProcessor;
+import 
org.apache.ignite.internal.processors.rollingupgrade.RollingUpgradeProcessor;
 import org.apache.ignite.plugin.CachePluginContext;
 import org.apache.ignite.plugin.CachePluginProvider;
 import org.apache.ignite.plugin.ExtensionRegistry;
@@ -34,14 +34,27 @@ import org.apache.ignite.plugin.PluginProvider;
 import org.apache.ignite.plugin.PluginValidationException;
 import org.jetbrains.annotations.Nullable;
 
-/**
- * Creates {@link DisabledValidationProcessor} to allow for nodes with 
different
- * versions {@link IgniteNodeAttributes#ATTR_BUILD_VER} join to topology.
- */
+/** Provides node validation for compatibility tests. */
 public class TestCompatibilityPluginProvider implements PluginProvider {
     /** */
     private GridKernalContext kCtx;
 
+    /** Rolling upgrade support flag. */
+    private boolean rollingUpgradeSupported;
+
+    /** Auto-enable rolling upgrade flag. */
+    private final boolean autoEnableRollingUpgrade;
+
+    /** */
+    public TestCompatibilityPluginProvider() {
+        this(false);
+    }
+
+    /** @param autoEnableRollingUpgrade Auto-enable rolling upgrade flag. */
+    public TestCompatibilityPluginProvider(boolean autoEnableRollingUpgrade) {
+        this.autoEnableRollingUpgrade = autoEnableRollingUpgrade;
+    }
+
     /** {@inheritDoc} */
     @Override public String name() {
         return "TestCompatibilityPlugin";
@@ -79,7 +92,8 @@ public class TestCompatibilityPluginProvider implements 
PluginProvider {
 
     /** {@inheritDoc} */
     @Override public void onIgniteStart() throws IgniteCheckedException {
-        // No-op.
+        if (autoEnableRollingUpgrade && rollingUpgradeSupported)
+            kCtx.rollingUpgrade().enableVersionUpgrade();
     }
 
     /** {@inheritDoc} */
@@ -108,7 +122,11 @@ public class TestCompatibilityPluginProvider implements 
PluginProvider {
             try {
                 
Class.forName("org.apache.ignite.internal.processors.rollingupgrade.RollingUpgradeProcessor");
 
-                return new DisabledRollingUpgradeProcessor(kCtx);
+                rollingUpgradeSupported = true;
+
+                return autoEnableRollingUpgrade
+                    ? new RollingUpgradeProcessor(kCtx)
+                    : new DisabledRollingUpgradeProcessor(kCtx);
             }
             catch (ClassNotFoundException ignore) {
                 return new DisabledValidationProcessor(kCtx);
diff --git 
a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/testcontainers/IgniteContainer.java
 
b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/testcontainers/IgniteContainer.java
index 1f08e917a09..c4de0cc88ae 100644
--- 
a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/testcontainers/IgniteContainer.java
+++ 
b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/testcontainers/IgniteContainer.java
@@ -101,6 +101,9 @@ public class IgniteContainer extends 
GenericContainer<IgniteContainer> {
     /** Config path in container. */
     private static final String CFG_PATH = ROOT_DIR_PATH + 
"config/test-config.xml";
 
+    /** Common config path in container. */
+    private static final String COMMON_CFG_PATH = ROOT_DIR_PATH + 
"config/common-test-config.xml";
+
     /** */
     private static final Pattern CLUSTER_STATE_PATTERN = 
Pattern.compile("Cluster state: (ACTIVE|INACTIVE)");
 
@@ -197,6 +200,7 @@ public class IgniteContainer extends 
GenericContainer<IgniteContainer> {
             withCreateContainerCmdModifier(cmd -> cmd.withUser(uidGid));
         }
 
+        
withCopyFileToContainer(forClasspathResource("docker/common-test-config.xml"), 
COMMON_CFG_PATH);
         
withCopyFileToContainer(forClasspathResource("docker/test-config.xml"), 
CFG_PATH);
         
withCopyFileToContainer(forHostPath(testClassesJar().getAbsolutePath()), 
LIBS_DIR_PATH + "test-classes.jar");
 
@@ -261,6 +265,8 @@ public class IgniteContainer extends 
GenericContainer<IgniteContainer> {
         if (!Boolean.TRUE.equals(resp.isRunning()) && resp.getExitCodeLong() 
!= null && resp.getExitCodeLong() != 0)
             throw new IllegalStateException("Failed to clean and extract libs: 
" + err);
 
+        
copyFileToContainer(forClasspathResource("docker/target-test-config.xml"), 
CFG_PATH);
+
         stopGraceful();
 
         LOGGER.info("Starting container {} with target libraries...", 
hostname);
diff --git a/modules/compatibility/src/test/resources/docker/test-config.xml 
b/modules/compatibility/src/test/resources/docker/common-test-config.xml
similarity index 92%
copy from modules/compatibility/src/test/resources/docker/test-config.xml
copy to modules/compatibility/src/test/resources/docker/common-test-config.xml
index 66d3ca00e44..5d6bbbd54d0 100644
--- a/modules/compatibility/src/test/resources/docker/test-config.xml
+++ b/modules/compatibility/src/test/resources/docker/common-test-config.xml
@@ -22,15 +22,12 @@
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd";>
-    <bean id="grid.cfg" 
class="org.apache.ignite.configuration.IgniteConfiguration">
+    <bean id="grid.cfg.base" 
class="org.apache.ignite.configuration.IgniteConfiguration" abstract="true">
         <property name="consistentId" 
value="#{systemProperties['node.consistent.id']}"/>
         <property name="addressResolver">
             <bean 
class="org.apache.ignite.compatibility.testframework.testcontainers.ContainerAddressResolver"/>
         </property>
         <property name="failureDetectionTimeout" value="#{5000L}"/>
-        <property name="pluginProviders">
-            <bean 
class="org.apache.ignite.compatibility.testframework.plugins.TestCompatibilityPluginProvider"/>
-        </property>
         <property name="dataStorageConfiguration">
             <bean 
class="org.apache.ignite.configuration.DataStorageConfiguration">
                 <property name="defaultDataRegionConfiguration">
diff --git 
a/modules/compatibility/src/test/resources/docker/target-test-config.xml 
b/modules/compatibility/src/test/resources/docker/target-test-config.xml
new file mode 100644
index 00000000000..01f55c4b1e4
--- /dev/null
+++ b/modules/compatibility/src/test/resources/docker/target-test-config.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans
+       http://www.springframework.org/schema/beans/spring-beans.xsd";>
+    <import resource="common-test-config.xml"/>
+
+    <bean id="grid.cfg" parent="grid.cfg.base"/>
+</beans>
diff --git a/modules/compatibility/src/test/resources/docker/test-config.xml 
b/modules/compatibility/src/test/resources/docker/test-config.xml
index 66d3ca00e44..6c9458e7f6c 100644
--- a/modules/compatibility/src/test/resources/docker/test-config.xml
+++ b/modules/compatibility/src/test/resources/docker/test-config.xml
@@ -22,47 +22,12 @@
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd";>
-    <bean id="grid.cfg" 
class="org.apache.ignite.configuration.IgniteConfiguration">
-        <property name="consistentId" 
value="#{systemProperties['node.consistent.id']}"/>
-        <property name="addressResolver">
-            <bean 
class="org.apache.ignite.compatibility.testframework.testcontainers.ContainerAddressResolver"/>
-        </property>
-        <property name="failureDetectionTimeout" value="#{5000L}"/>
+    <import resource="common-test-config.xml"/>
+
+    <bean id="grid.cfg" parent="grid.cfg.base">
         <property name="pluginProviders">
-            <bean 
class="org.apache.ignite.compatibility.testframework.plugins.TestCompatibilityPluginProvider"/>
-        </property>
-        <property name="dataStorageConfiguration">
-            <bean 
class="org.apache.ignite.configuration.DataStorageConfiguration">
-                <property name="defaultDataRegionConfiguration">
-                    <bean 
class="org.apache.ignite.configuration.DataRegionConfiguration">
-                        <property name="name" value="testRegion"/>
-                        <property name="initialSize" value="#{1L * 1024 * 1024 
* 1024}"/>
-                        <property name="maxSize" value="#{10L * 1024 * 1024 * 
1024}"/>
-                        <property name="persistenceEnabled" value="true"/>
-                    </bean>
-                </property>
-            </bean>
-        </property>
-        <property name="discoverySpi">
-            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
-                <property name="localPort" value="47500"/>
-                <property name="socketTimeout" value="1000"/>
-                <property name="ipFinder">
-                    <bean 
class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
-                        <property name="addresses">
-                            <list>
-                                <value>node1:47500</value>
-                                <value>node2:47500</value>
-                                <value>node3:47500</value>
-                            </list>
-                        </property>
-                    </bean>
-                </property>
-            </bean>
-        </property>
-        <property name="communicationSpi">
-            <bean 
class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
-                <property name="localPort" value="47100"/>
+            <bean 
class="org.apache.ignite.compatibility.testframework.plugins.TestCompatibilityPluginProvider">
+                <constructor-arg value="true"/>
             </bean>
         </property>
     </bean>

Reply via email to