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