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

zstan 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 5da618acdca IGNITE-28759 [ducktests] Bump ducktape to 0.15 and Ignite 
to 2.18 (#13226)
5da618acdca is described below

commit 5da618acdca5a6b787f886c2a904a73b8b8c6f78
Author: Maksim Davydov <[email protected]>
AuthorDate: Wed Sep 9 15:13:50 2026 +0300

    IGNITE-28759 [ducktests] Bump ducktape to 0.15 and Ignite to 2.18 (#13226)
---
 modules/ducktests/README.md                        |  2 +-
 modules/ducktests/tests/docker/Dockerfile          |  4 +--
 modules/ducktests/tests/docker/ducker-ignite       | 29 ++++++++++++++++------
 modules/ducktests/tests/docker/requirements.txt    |  2 +-
 modules/ducktests/tests/docker/run_tests.sh        | 15 +++++++++--
 .../tests/ignitetest/utils/ignite_test.py          | 10 ++++++--
 .../ducktests/tests/ignitetest/utils/version.py    |  6 ++++-
 7 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/modules/ducktests/README.md b/modules/ducktests/README.md
index 2c4d2b690aa..b52c22c8a02 100644
--- a/modules/ducktests/README.md
+++ b/modules/ducktests/README.md
@@ -171,7 +171,7 @@ You can modify test environments at execution time using 
global flags injected t
 | Global Parameter Key | Definition | Example Configuration |
 |---------------------|------------|----------------------|
 | **cluster_size** | Controls the cluster size for tests. Overrides the 
default num_nodes value passed in the @cluster annotation. Default value is 
determined by the test framework. | ```{"cluster_size": 13}``` |
-| **ignite_versions** | List of Ignite versions for testing. Tests run for 
each version in the list. Values are folder names in /opt/ (e.g., "ignite-dev" 
for master branch, "ignite-2.17.0" for release). Default is determined by test 
annotations. | ```{"ignite_versions": ["ignite-dev", "ignite-2.17.0"]}``` |
+| **ignite_versions** | List of Ignite versions for testing. Tests run for 
each version in the list. Values are folder names in /opt/ (e.g., "ignite-dev" 
for master branch, "ignite-2.18.0" for release). Default is determined by test 
annotations. | ```{"ignite_versions": ["ignite-dev", "ignite-2.18.0"]}``` |
 | **failure_detection_timeout** | Timeout in milliseconds for failure 
detection in discovery. Used to detect node failures in the cluster. Default 
value is 10000 ms (10 seconds). | ```{"failure_detection_timeout": 20000}``` |
 
 #### Security & Authentication
diff --git a/modules/ducktests/tests/docker/Dockerfile 
b/modules/ducktests/tests/docker/Dockerfile
index db6f4222f0e..ba151879bbf 100644
--- a/modules/ducktests/tests/docker/Dockerfile
+++ b/modules/ducktests/tests/docker/Dockerfile
@@ -16,7 +16,7 @@
 # =====================================================================
 # GLOBAL ARGS (Must be declared at the very top, before any FROM)
 # =====================================================================
-ARG python_version="3.13"
+ARG python_version="3.11"
 ARG jdk_version="eclipse-temurin:17"
 
 # ---------------------------------------------------------------------
@@ -127,7 +127,7 @@ ARG APACHE_MIRROR="https://apache-mirror.rbc.ru/pub/apache/";
 ARG APACHE_ARCHIVE="https://archive.apache.org/dist/";
 
 # Install Ignite
-RUN for v in "2.7.6" "2.17.0"; \
+RUN for v in "2.7.6" "2.18.0"; \
     do cd /opt; \
     curl -O $APACHE_ARCHIVE/ignite/$v/apache-ignite-$v-bin.zip;\
     unzip apache-ignite-$v-bin.zip && mv /opt/apache-ignite-$v-bin 
/opt/ignite-$v; \
diff --git a/modules/ducktests/tests/docker/ducker-ignite 
b/modules/ducktests/tests/docker/ducker-ignite
index 6285f91fb3f..5c204f02bb8 100755
--- a/modules/ducktests/tests/docker/ducker-ignite
+++ b/modules/ducktests/tests/docker/ducker-ignite
@@ -45,7 +45,10 @@ default_num_nodes=4
 default_jdk="openjdk:17"
 
 # The default Python version.
-default_python="3.13"
+default_python="3.11"
+
+# The default behavior for using Docker build cache.
+default_no_cache="false"
 
 # The default ducker-ignite image name.
 default_image_name="ducker-ignite"
@@ -63,8 +66,10 @@ Usage: ${script_path} [command] [options]
 help|-h|--help
     Display this help message
 
-build [-j|--jdk JDK] [-p|--python PYTHON_VERSION] [-c|--context] [image-name]
-    Build a docker image that represents ducker node. Image is tagged with 
specified ${image_name}.
+build [-j|--jdk JDK] [-p|--python PYTHON_VERSION] [--no-cache] [-c|--context] 
[image-name]
+    Build a docker image that represents ducker node. Image is tagged with the 
specified image name.
+    If the image name is omitted, it defaults to 
${default_image_name}-<jdk>-py<python-version>,
+    so that images built with different JDK or Python versions do not 
overwrite each other.
 
     If --jdk is specified then we will use this argument as base image for 
ducker docker images.
     Otherwise ${default_jdk} is used.
@@ -72,6 +77,8 @@ build [-j|--jdk JDK] [-p|--python PYTHON_VERSION] 
[-c|--context] [image-name]
     If --python is specified, its value will be used to extract the Python 
runtime for the Docker images.
     Otherwise, ${default_python} will be used.
 
+    If --no-cache is specified, the Docker image will be rebuilt from scratch 
without using cached layers.
+
     If --context is specified then build docker image from this path. Context 
directory must contain Dockerfile.
 
 up [-n|--num-nodes NUM_NODES] [-f|--force] [docker-image]
@@ -254,6 +261,12 @@ ducker_build_image() {
     local docker_context="${1}"
     local image_name="${2}"
 
+    # Determine if we should bypass the Docker build cache
+    local extra_build_args=""
+    if [[ "${no_cache}" == "true" ]]; then
+        extra_build_args="--no-cache"
+    fi
+
     # Use SECONDS, a builtin bash variable that gets incremented each second, 
to measure the docker
     # build duration.
     SECONDS=0
@@ -261,7 +274,7 @@ ducker_build_image() {
     must_pushd "${ducker_dir}"
     # Tip: if you are scratching your head for some dependency problems that 
are referring to an old code version
     # (for example java.lang.NoClassDefFoundError), add --no-cache flag to the 
build shall give you a clean start.
-    must_do -v -o docker build --network=host 
--memory="${docker_build_memory_limit}" \
+    must_do -v -o docker build ${extra_build_args} --network=host 
--memory="${docker_build_memory_limit}" \
         --build-arg USER_UID=$(id -u) --build-arg USER_GID=$(id -g) \
         --build-arg "ducker_creator=${user_name}" --build-arg 
"jdk_version=${jdk_version}" \
         --build-arg "python_version=${python_version}" -t "${image_name}" \
@@ -288,6 +301,7 @@ ducker_build() {
         case "${1}" in
             -j|--jdk) set_once jdk_version "${2}" "the OpenJDK base image"; 
shift 2;;
             -p|--python) set_once python_version "${2}" "the Python version"; 
shift 2;;
+            --no-cache) set_once no_cache "true" "the --no-cache flag"; shift;;
             -c|--context) docker_context="${2}"; shift 2;;
             *) set_once image_name "${1}" "docker image name"; shift;;
         esac
@@ -295,7 +309,8 @@ ducker_build() {
 
     [[ -n "${jdk_version}" ]] || jdk_version="${default_jdk}"
     [[ -n "${python_version}" ]] || python_version="${default_python}"
-    [[ -n "${image_name}" ]] || 
image_name="${default_image_name}-${jdk_version/:/-}"
+    [[ -n "${no_cache}" ]] || no_cache="${default_no_cache}"
+    [[ -n "${image_name}" ]] || 
image_name="${default_image_name}-${jdk_version/:/-}-py${python_version}"
     [[ -n "${docker_context}" ]] || docker_context="${ducker_dir}"
 
     ducker_build_image "${docker_context}" "${image_name}"
@@ -368,7 +383,7 @@ ducker_up() {
         esac
     done
     [[ -n "${num_nodes}" ]] || num_nodes="${default_num_nodes}"
-    [[ -n "${image_name}" ]] || 
image_name="${default_image_name}-${default_jdk/:/-}"
+    [[ -n "${image_name}" ]] || 
image_name="${default_image_name}-${default_jdk/:/-}-py${default_python}"
     [[ "${num_nodes}" =~ ^-?[0-9]+$ ]] || \
         die "ducker_up: the number of nodes must be an integer."
     [[ "${num_nodes}" -gt 0 ]] || die "ducker_up: the number of nodes must be 
greater than 0."
@@ -662,7 +677,7 @@ ducker_compare() {
         esac
     done
 
-    [ -n "${image_name}" ] || 
image_name="${default_image_name}-${default_jdk/:/-}"
+    [ -n "${image_name}" ] || 
image_name="${default_image_name}-${default_jdk/:/-}-py${default_python}"
 
     cmp -s "${ducker_dir}/build/image_${image_name}.build" 
"${ducker_dir}/build/image_id.up"
     local ret="$?"
diff --git a/modules/ducktests/tests/docker/requirements.txt 
b/modules/ducktests/tests/docker/requirements.txt
index 6f96304e5b2..1fc5cac411e 100644
--- a/modules/ducktests/tests/docker/requirements.txt
+++ b/modules/ducktests/tests/docker/requirements.txt
@@ -14,6 +14,6 @@
 # limitations under the License.
 
 filelock==3.8.2
-ducktape==0.13.0
+ducktape==0.15.0
 looseversion==1.3.0
 tcconfig==0.29.1
diff --git a/modules/ducktests/tests/docker/run_tests.sh 
b/modules/ducktests/tests/docker/run_tests.sh
index b23ca856dcd..ec4236bfdf4 100755
--- a/modules/ducktests/tests/docker/run_tests.sh
+++ b/modules/ducktests/tests/docker/run_tests.sh
@@ -25,11 +25,14 @@ IGNITE_NUM_CONTAINERS=${IGNITE_NUM_CONTAINERS:-13}
 
 # Image name to run nodes
 JDK_VERSION="${JDK_VERSION:-17}"
+PYTHON_VERSION="${PYTHON_VERSION:-3.11}"
 IMAGE_PREFIX="ducker-ignite-eclipse-temurin"
 
 ###
 # DuckerTest parameters are specified with options to the script
 
+NO_CACHE_FLAG=""
+
 # Path to ducktests
 TC_PATHS="./ignitetest/"
 # Global parameters to pass to ducktape util with --global param
@@ -81,6 +84,12 @@ The options are as follows:
 --jdk
     Set jdk version to build, default is 17
 
+--python
+    Set python version to build, default is 3.11
+
+--no-cache
+    Rebuild the Docker image from scratch without using cached layers.
+
 --image
     Set custom docker image to run tests on.
 
@@ -134,6 +143,8 @@ while [[ $# -ge 1 ]]; do
         -r|--repeat) REPEAT="$2"; shift 2;;
         --subnet) SUBNET="--subnet $2"; shift 2;;
         --jdk) JDK_VERSION="$2"; shift 2;;
+        --python) PYTHON_VERSION="$2"; shift 2;;
+        --no-cache) NO_CACHE_FLAG="--no-cache"; shift;;
         --image) IMAGE_NAME="$2"; shift 2;;
         --test-runner-timeout) TEST_RUNNER_TIMEOUT="$2"; shift 2;;
         -f|--force) FORCE=$1; shift;;
@@ -142,8 +153,8 @@ while [[ $# -ge 1 ]]; do
 done
 
 if [ -z "$IMAGE_NAME" ]; then
-    IMAGE_NAME="$IMAGE_PREFIX-$JDK_VERSION"
-    "$SCRIPT_DIR"/ducker-ignite build -j "eclipse-temurin:$JDK_VERSION" 
$IMAGE_NAME || die "ducker-ignite build failed"
+    IMAGE_NAME="$IMAGE_PREFIX-$JDK_VERSION-py$PYTHON_VERSION"
+    "$SCRIPT_DIR"/ducker-ignite build -j "eclipse-temurin:$JDK_VERSION" -p 
"$PYTHON_VERSION" $NO_CACHE_FLAG $IMAGE_NAME || die "ducker-ignite build failed"
 else
     echo "[WARN] Used non-default image $IMAGE_NAME. Be sure you use actual 
version of the image. " \
          "Otherwise build it with 'ducker-ignite build' command"
diff --git a/modules/ducktests/tests/ignitetest/utils/ignite_test.py 
b/modules/ducktests/tests/ignitetest/utils/ignite_test.py
index d2a71c50e83..336fc6c34df 100644
--- a/modules/ducktests/tests/ignitetest/utils/ignite_test.py
+++ b/modules/ducktests/tests/ignitetest/utils/ignite_test.py
@@ -33,8 +33,14 @@ SAFEPOINT_LOGS_ENABLED = "safepoint_log_enabled"
 
 class IgniteTestContext(TestContext):
     def __init__(self, test_context):
-        super().__init__()
-        self.__dict__.update(**test_context.__dict__)
+        super().__init__(**test_context.__dict__)
+
+        # TestContext.__init__ sets up its own state (normalized `file`, a 
copy of `cluster_use_metadata`,
+        # a fresh ServiceRegistry) - keep it, and only carry over the 
attributes it does not know about,
+        # for example the ones added by a fork's context class.
+        for name, value in test_context.__dict__.items():
+            if name not in self.__dict__:
+                setattr(self, name, value)
 
     @property
     def available_cluster_size(self):
diff --git a/modules/ducktests/tests/ignitetest/utils/version.py 
b/modules/ducktests/tests/ignitetest/utils/version.py
index 238b02d97fd..d7f8ad22463 100644
--- a/modules/ducktests/tests/ignitetest/utils/version.py
+++ b/modules/ducktests/tests/ignitetest/utils/version.py
@@ -120,7 +120,11 @@ LATEST_2_16 = V_2_16_0
 V_2_17_0 = IgniteVersion("2.17.0")
 LATEST_2_17 = V_2_17_0
 
+# 2.18.x versions
+V_2_18_0 = IgniteVersion("2.18.0")
+LATEST_2_18 = V_2_18_0
+
 # if you updated the LATEST version
 # please check DEV version in 'tests/ignitetest/__init__.py'
-LATEST = LATEST_2_17
+LATEST = LATEST_2_18
 OLDEST = V_2_7_6

Reply via email to