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

ivandasch 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 04df1ff4a7c IGNITE-20903 [ducktests] Support running on JDK 17 (#11059)
04df1ff4a7c is described below

commit 04df1ff4a7cfe710415818e7f9d3e3af460b1c70
Author: Ivan Daschinskiy <[email protected]>
AuthorDate: Thu Nov 23 12:18:15 2023 +0300

    IGNITE-20903 [ducktests] Support running on JDK 17 (#11059)
---
 modules/ducktests/tests/certs/functions.sh         |   4 +-
 modules/ducktests/tests/docker/Dockerfile          |  12 +-
 .../ducktests/tests/ignitetest/services/spark.py   | 175 ---------------------
 .../ignitetest/services/utils/ignite_aware.py      |   4 +-
 .../tests/ignitetest/services/utils/jmx_utils.py   |   6 +-
 .../tests/ignitetest/services/utils/jvm_utils.py   |  41 +++++
 .../ignitetest/tests/persistence_upgrade_test.py   |   5 +
 .../ducktests/tests/ignitetest/tests/smoke_test.py |  10 --
 .../ducktests/tests/ignitetest/utils/version.py    |   6 +-
 9 files changed, 62 insertions(+), 201 deletions(-)

diff --git a/modules/ducktests/tests/certs/functions.sh 
b/modules/ducktests/tests/certs/functions.sh
index 9a6235a85d1..0caef590632 100644
--- a/modules/ducktests/tests/certs/functions.sh
+++ b/modules/ducktests/tests/certs/functions.sh
@@ -29,7 +29,7 @@ function makeRoot() {
     rm -f "${ALIAS}.pem"
 
     keytool -genkeypair -keystore "${ALIAS}.jks" -alias "${ALIAS}" -dname 
"${DNAME}" -ext bc:c -storepass "${PSWD}" \
-     -keypass "${PSWD}" -storetype JKS -noprompt -v
+     -keypass "${PSWD}" -storetype JKS -keyalg RSA -noprompt -v
 
     keytool -keystore "${ALIAS}.jks" -storepass "${PSWD}" -keypass "${PSWD}" 
-alias "${ALIAS}" -exportcert \
      -rfc -file "${ALIAS}.pem" -v
@@ -50,7 +50,7 @@ function makeCA() {
     rm -f "${ALIAS}.pem"
 
     keytool -genkeypair -keystore "${ALIAS}.jks" -alias "${ALIAS}" -dname 
"${DNAME}" -ext bc:c -storepass "${PSWD}" \
-     -keypass "${PSWD}" -storetype JKS -noprompt -v
+     -keypass "${PSWD}" -storetype JKS -keyalg RSA -noprompt -v
 
     keytool -storepass "${PSWD}" -keypass "${PSWD}" -keystore "${ALIAS}.jks" 
-certreq -alias "${ALIAS}" \
       | keytool -storepass "${PSWD}" -keypass "${PSWD}" -keystore 
"${ROOT}.jks" -gencert -alias "${ROOT}" \
diff --git a/modules/ducktests/tests/docker/Dockerfile 
b/modules/ducktests/tests/docker/Dockerfile
index 22007352f50..b09e8d00b70 100644
--- a/modules/ducktests/tests/docker/Dockerfile
+++ b/modules/ducktests/tests/docker/Dockerfile
@@ -49,7 +49,7 @@ ARG APACHE_MIRROR="https://apache-mirror.rbc.ru/pub/apache/";
 ARG APACHE_ARCHIVE="https://archive.apache.org/dist/";
 
 # Install binary test dependencies.
-RUN for v in "2.7.6" "2.8.0" "2.8.1" "2.9.0" "2.9.1" "2.10.0" "2.11.0" 
"2.11.1" "2.12.0" "2.13.0" "2.14.0"; \
+RUN for v in "2.7.6" "2.15.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;\
@@ -67,14 +67,6 @@ RUN cd /opt && curl -O 
$APACHE_ARCHIVE/zookeeper/$ZOOKEEPER_NAME/$ZOOKEEPER_RELE
  && tar xvf $ZOOKEEPER_RELEASE_ARTIFACT && rm $ZOOKEEPER_RELEASE_ARTIFACT
 RUN mv /opt/$ZOOKEEPER_RELEASE_NAME /opt/$ZOOKEEPER_NAME
 
-# Install spark
-ARG SPARK_VERSION="2.3.4"
-ARG SPARK_NAME="spark-$SPARK_VERSION"
-ARG SPARK_RELEASE_NAME="spark-$SPARK_VERSION-bin-hadoop2.7"
-
-RUN cd /opt && curl -O 
$APACHE_ARCHIVE/spark/$SPARK_NAME/$SPARK_RELEASE_NAME.tgz && tar xvf 
$SPARK_RELEASE_NAME.tgz && rm $SPARK_RELEASE_NAME.tgz
-RUN mv /opt/$SPARK_RELEASE_NAME /opt/$SPARK_NAME
-
 # The version of Kibosh to use for testing.
 # If you update this, also update vagrant/base.sh
 ARG KIBOSH_VERSION="8841dd392e6fbf02986e2fb1f1ebf04df344b65a"
@@ -94,7 +86,7 @@ RUN cd /opt && curl -OL 
https://github.com/jiaqi/jmxterm/releases/download/v$JMX
 RUN useradd -ms /bin/bash ducker \
     && mkdir -p /home/ducker/ \
     && rsync -aiq /root/.ssh/ /home/ducker/.ssh \
-    && chown -R ducker /home/ducker/ /mnt/ /var/log/ \
+    && chown -R ducker /home/ducker/ /mnt/ /var/log/ /opt \
     && echo "LANG=C.UTF-8" >> /home/ducker/.ssh/environment \
     && echo "PATH=$(runuser -l ducker -c 'echo $PATH'):$JAVA_HOME/bin" >> 
/home/ducker/.ssh/environment \
     && echo 'PATH=$PATH:'"$JAVA_HOME/bin" >> /home/ducker/.profile \
diff --git a/modules/ducktests/tests/ignitetest/services/spark.py 
b/modules/ducktests/tests/ignitetest/services/spark.py
deleted file mode 100644
index bcc200d7b63..00000000000
--- a/modules/ducktests/tests/ignitetest/services/spark.py
+++ /dev/null
@@ -1,175 +0,0 @@
-# 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.
-
-"""
-This module contains spark service class.
-"""
-
-import os.path
-from distutils.version import LooseVersion
-
-from ducktape.cluster.remoteaccount import RemoteCommandError
-
-from ignitetest.services.utils.ducktests_service import DucktestsService
-from ignitetest.services.utils.log_utils import monitor_log
-from ignitetest.services.utils.path import PathAware
-
-
-class SparkService(DucktestsService, PathAware):
-    """
-    Start a spark node.
-    """
-    def __init__(self, context, num_nodes=3, version=LooseVersion("2.3.4")):
-        """
-        :param context: test context
-        :param num_nodes: number of Ignite nodes.
-        """
-        super().__init__(context, num_nodes)
-
-        self.log_level = "DEBUG"
-        self._version = version
-        self.init_logs_attribute()
-
-    @property
-    def product(self):
-        return "%s-%s" % ("spark", self._version)
-
-    @property
-    def globals(self):
-        return self.context.globals
-
-    @property
-    def config_file(self):
-        return None
-
-    @property
-    def log_config_file(self):
-        return None
-
-    def start(self, **kwargs):
-        super().start(**kwargs)
-
-        self.logger.info("Waiting for Spark to start...")
-
-    def start_cmd(self, node):
-        """
-        Prepare command to start Spark nodes
-        """
-        if node == self.nodes[0]:
-            script = "start-master.sh"
-        else:
-            script = "start-slave.sh 
spark://{spark_master}:7077".format(spark_master=self.nodes[0].account.hostname)
-
-        start_script = os.path.join(self.home_dir, "sbin", script)
-
-        cmd = "export SPARK_LOG_DIR={spark_dir}; 
".format(spark_dir=self.persistent_root)
-        cmd += "export SPARK_WORKER_DIR={spark_dir}; 
".format(spark_dir=self.persistent_root)
-        cmd += "{start_script} &".format(start_script=start_script)
-
-        return cmd
-
-    def init_logs_attribute(self):
-        for node in self.nodes:
-            self.logs["master_logs" + node.account.hostname] = {
-                "path": self.master_log_path(node),
-                "collect_default": True
-            }
-            self.logs["worker_logs" + node.account.hostname] = {
-                "path": self.slave_log_path(node),
-                "collect_default": True
-            }
-
-    def start_node(self, node, **kwargs):
-        self.init_persistent(node)
-
-        cmd = self.start_cmd(node)
-        self.logger.debug("Attempting to start SparkService on %s with 
command: %s" % (str(node.account), cmd))
-
-        if node == self.nodes[0]:
-            log_file = self.master_log_path(node)
-            log_msg = "Started REST server for submitting applications"
-        else:
-            log_file = self.slave_log_path(node)
-            log_msg = "Successfully registered with master"
-
-        self.logger.debug("Monitoring - %s" % log_file)
-
-        timeout_sec = 30
-        with monitor_log(node, log_file) as monitor:
-            node.account.ssh(cmd)
-            monitor.wait_until(log_msg, timeout_sec=timeout_sec, 
backoff_sec=.1,
-                               err_msg="Spark doesn't start at %d seconds" % 
timeout_sec)
-
-        if len(self.pids(node)) == 0:
-            raise Exception("No process ids recorded on node %s" % 
node.account.hostname)
-
-    def stop_node(self, node, force_stop=False, **kwargs):
-        if force_stop:
-            node.account.kill_java_processes(self.java_class_name(node), 
clean_shutdown=False, allow_fail=True)
-        else:
-            if node == self.nodes[0]:
-                node.account.ssh(os.path.join(self.home_dir, "sbin", 
"stop-master.sh"))
-            else:
-                node.account.ssh(os.path.join(self.home_dir, "sbin", 
"stop-slave.sh"))
-
-    def clean_node(self, node, **kwargs):
-        """
-        Clean spark persistence files
-        """
-        super().clean_node(node, **kwargs)
-
-        node.account.ssh("rm -rf -- %s" % self.persistent_root, 
allow_fail=False)
-
-    def pids(self, node):
-        """
-        :return: list of service pids on specific node
-        """
-        try:
-            cmd = "jcmd | grep -e %s | awk '{print $1}'" % 
self.java_class_name(node)
-            return list(node.account.ssh_capture(cmd, allow_fail=True, 
callback=int))
-        except (RemoteCommandError, ValueError):
-            return []
-
-    def java_class_name(self, node):
-        """
-        :param node: Spark node.
-        :return: Class name depending on node type (master or slave).
-        """
-        if node == self.nodes[0]:
-            return "org.apache.spark.deploy.master.Master"
-
-        return "org.apache.spark.deploy.worker.Worker"
-
-    def master_log_path(self, node):
-        """
-        :param node: Spark master node.
-        :return: Path to log file.
-        """
-        return 
"{SPARK_LOG_DIR}/spark-{userID}-org.apache.spark.deploy.master.Master-{instance}-{host}.out".format(
-            SPARK_LOG_DIR=self.persistent_root,
-            userID=node.account.user,
-            instance=1,
-            host=node.account.hostname)
-
-    def slave_log_path(self, node):
-        """
-        :param node: Spark slave node.
-        :return: Path to log file.
-        """
-        return 
"{SPARK_LOG_DIR}/spark-{userID}-org.apache.spark.deploy.worker.Worker-{instance}-{host}.out".format(
-            SPARK_LOG_DIR=self.persistent_root,
-            userID=node.account.user,
-            instance=1,
-            host=node.account.hostname)
diff --git a/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py 
b/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
index dbbe5787411..98b7692d83c 100644
--- a/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
+++ b/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
@@ -38,13 +38,13 @@ from ignitetest.services.utils.background_thread import 
BackgroundThreadService
 from ignitetest.services.utils.concurrent import CountDownLatch, AtomicValue
 from ignitetest.services.utils.ignite_spec import resolve_spec, 
SHARED_PREPARED_FILE
 from ignitetest.services.utils.jmx_utils import ignite_jmx_mixin, JmxClient
-from ignitetest.services.utils.jvm_utils import JvmProcessMixin
+from ignitetest.services.utils.jvm_utils import JvmProcessMixin, 
JvmVersionMixin
 from ignitetest.services.utils.log_utils import monitor_log
 from ignitetest.services.utils.path import IgnitePathAware
 from ignitetest.utils.enum import constructible
 
 
-class IgniteAwareService(BackgroundThreadService, IgnitePathAware, 
JvmProcessMixin, metaclass=ABCMeta):
+class IgniteAwareService(BackgroundThreadService, IgnitePathAware, 
JvmProcessMixin, JvmVersionMixin, metaclass=ABCMeta):
     """
     The base class to build services aware of Ignite.
     """
diff --git a/modules/ducktests/tests/ignitetest/services/utils/jmx_utils.py 
b/modules/ducktests/tests/ignitetest/services/utils/jmx_utils.py
index 462e513ac02..e01bb4c7d6e 100644
--- a/modules/ducktests/tests/ignitetest/services/utils/jmx_utils.py
+++ b/modules/ducktests/tests/ignitetest/services/utils/jmx_utils.py
@@ -21,6 +21,7 @@ import os
 import re
 
 from ignitetest.services.utils.decorators import memoize
+from ignitetest.services.utils.jvm_utils import java_version, 
java_major_version
 
 
 def ignite_jmx_mixin(node, service):
@@ -60,13 +61,16 @@ class JmxClient:
         self.node = node
         self.install_root = node.install_root
         self.pid = node.pids[0]
+        self.java_major = java_major_version(java_version(self.node))
 
     @property
     def jmx_util_cmd(self):
         """
         :return: jmxterm prepared command line invocation.
         """
-        return os.path.join(f"java -jar {self.install_root}/jmxterm.jar -v 
silent -n")
+        extra_flag = "--add-exports 
jdk.jconsole/sun.tools.jconsole=ALL-UNNAMED" if self.java_major >= 15 else ""
+
+        return os.path.join(f"java {extra_flag} -jar 
{self.install_root}/jmxterm.jar -v silent -n")
 
     @memoize
     def find_mbean(self, pattern, negative_pattern=None, domain='org.apache'):
diff --git a/modules/ducktests/tests/ignitetest/services/utils/jvm_utils.py 
b/modules/ducktests/tests/ignitetest/services/utils/jvm_utils.py
index a1175712f4c..eaab8566285 100644
--- a/modules/ducktests/tests/ignitetest/services/utils/jvm_utils.py
+++ b/modules/ducktests/tests/ignitetest/services/utils/jvm_utils.py
@@ -16,6 +16,9 @@
 """
 This module contains JVM utilities.
 """
+
+from ignitetest.services.utils.decorators import memoize
+
 DEFAULT_HEAP = "768M"
 
 JVM_PARAMS_GC_G1 = "-XX:+UseG1GC -XX:MaxGCPauseMillis=100 " \
@@ -74,6 +77,31 @@ def merge_jvm_settings(src_settings, additionals):
     return listed
 
 
+def java_major_version(version):
+    """
+    :param version: Full java version
+    :return: Java major version
+    """
+    if version:
+        version = version.split('.')
+
+        return int(version[1]) if version[0] == '1' else int(version[0])
+
+    return -1
+
+
+def java_version(node):
+    """
+    :param node: Ducktape cluster node
+    :return: java version
+    """
+    cmd = r"java -version 2>&1 | awk -F[\"\-] '/version/ {print $2}'"
+
+    raw_version = list(node.account.ssh_capture(cmd, allow_fail=False))
+
+    return raw_version[0].strip() if raw_version else ''
+
+
 def _to_map(params):
     """"""
     assert isinstance(params, (str, list)), "JVM params an be string or list 
only."
@@ -107,6 +135,7 @@ class JvmProcessMixin:
     """
     Mixin to work with JVM processes
     """
+
     @staticmethod
     def pids(node, java_class):
         """
@@ -118,3 +147,15 @@ class JvmProcessMixin:
         cmd = "ps -C java -wwo pid,args | grep '%s' | awk -F' ' '{print $1}'" 
% java_class
 
         return [int(pid) for pid in node.account.ssh_capture(cmd, 
allow_fail=True)]
+
+
+class JvmVersionMixin:
+    """
+    Mixin to get java version on node.
+    """
+    @memoize
+    def java_version(self):
+        """
+        :return: Full java version of service.
+        """
+        return java_version(self.nodes[0])
diff --git 
a/modules/ducktests/tests/ignitetest/tests/persistence_upgrade_test.py 
b/modules/ducktests/tests/ignitetest/tests/persistence_upgrade_test.py
index a6e144db79e..21ff78bb01c 100644
--- a/modules/ducktests/tests/ignitetest/tests/persistence_upgrade_test.py
+++ b/modules/ducktests/tests/ignitetest/tests/persistence_upgrade_test.py
@@ -22,6 +22,7 @@ from ignitetest.services.ignite_app import 
IgniteApplicationService
 from ignitetest.services.utils.control_utility import ControlUtility
 from ignitetest.services.utils.ignite_configuration import 
IgniteConfiguration, DataStorageConfiguration
 from ignitetest.services.utils.ignite_configuration.data_storage import 
DataRegionConfiguration
+from ignitetest.services.utils.jvm_utils import java_major_version
 from ignitetest.services.utils.ssl.ssl_params import is_ssl_enabled
 from ignitetest.utils import cluster, ignite_versions, ignore_if
 from ignitetest.utils.ignite_test import IgniteTest
@@ -52,6 +53,10 @@ class PersistenceUpgradeTest(IgniteTest):
                             "DataLoaderAndCheckerApplication"
         )
 
+        java_version = service.java_version()
+        if java_major_version(java_version) > 11:
+            return f"Skipped on java {java_version}"
+
         for version in versions:
             service.config = IgniteConfiguration(
                 
data_storage=DataStorageConfiguration(default=DataRegionConfiguration(persistence_enabled=True)),
diff --git a/modules/ducktests/tests/ignitetest/tests/smoke_test.py 
b/modules/ducktests/tests/ignitetest/tests/smoke_test.py
index bd5d91e15ae..7ace6ac9228 100644
--- a/modules/ducktests/tests/ignitetest/tests/smoke_test.py
+++ b/modules/ducktests/tests/ignitetest/tests/smoke_test.py
@@ -19,7 +19,6 @@ This module contains smoke tests that checks that services 
work
 
 from ignitetest.services.ignite import IgniteService
 from ignitetest.services.ignite_app import IgniteApplicationService
-from ignitetest.services.spark import SparkService
 from ignitetest.services.utils.ignite_configuration.discovery import 
from_ignite_cluster
 from ignitetest.services.utils.ignite_configuration import IgniteConfiguration
 from ignitetest.services.zk.zookeeper import ZookeeperService
@@ -67,15 +66,6 @@ class SmokeServicesTest(IgniteTest):
         app.stop()
         ignite.stop()
 
-    @cluster(num_nodes=2)
-    def test_spark_start_stop(self):
-        """
-        Test that SparkService correctly start and stop
-        """
-        spark = SparkService(self.test_context, num_nodes=2)
-        spark.start()
-        spark.stop()
-
     @cluster(num_nodes=3)
     def test_zk_start_stop(self):
         """
diff --git a/modules/ducktests/tests/ignitetest/utils/version.py 
b/modules/ducktests/tests/ignitetest/utils/version.py
index e886ba938bb..df25dbca5fd 100644
--- a/modules/ducktests/tests/ignitetest/utils/version.py
+++ b/modules/ducktests/tests/ignitetest/utils/version.py
@@ -108,7 +108,11 @@ LATEST_2_13 = V_2_13_0
 V_2_14_0 = IgniteVersion("2.14.0")
 LATEST_2_14 = V_2_14_0
 
+# 2.15.x versions
+V_2_15_0 = IgniteVersion("2.15.0")
+LATEST_2_15 = V_2_15_0
+
 # if you updated the LATEST version
 # please check DEV version in 'tests/ignitetest/__init__.py'
-LATEST = LATEST_2_14
+LATEST = LATEST_2_15
 OLDEST = V_2_7_6

Reply via email to