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

nizhikov pushed a commit to branch ignite-ducktape
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/ignite-ducktape by this push:
     new c314e7f  IGNITE-14668 SSL certificates generation on parallel run 
(#9065)
c314e7f is described below

commit c314e7f900f3087dc7b80ac6dfce3247a144ae6f
Author: Mikhail Filatov <[email protected]>
AuthorDate: Fri May 14 11:15:43 2021 +0300

    IGNITE-14668 SSL certificates generation on parallel run (#9065)
---
 .../ignitetest/services/utils/ignite_aware.py      | 23 +++++++++++++++--
 .../tests/ignitetest/services/utils/ignite_spec.py | 30 +++++++++++++---------
 2 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py 
b/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
index c7aa560..ee47144 100644
--- a/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
+++ b/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
@@ -21,10 +21,13 @@ import re
 import signal
 import sys
 import time
+import tempfile
 from abc import ABCMeta
 from datetime import datetime
 from enum import IntEnum
+from pathlib import Path
 from threading import Thread
+from filelock import FileLock
 
 from ducktape.cluster.remoteaccount import RemoteCommandError
 from ducktape.utils.util import wait_until
@@ -32,7 +35,7 @@ from ducktape.utils.util import wait_until
 from ignitetest.services.utils import IgniteServiceType
 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
+from ignitetest.services.utils.ignite_spec import resolve_spec, 
SHARED_PREPARED_FILE
 from ignitetest.services.utils.jmx_utils import ignite_jmx_mixin
 from ignitetest.services.utils.log_utils import monitor_log
 from ignitetest.services.utils.path import IgnitePathAware
@@ -177,7 +180,7 @@ class IgniteAwareService(BackgroundThreadService, 
IgnitePathAware, metaclass=ABC
         Init shared directory. Content of shared directory must be equal on 
all test nodes.
         :param node: Ignite service node.
         """
-        local_shared_dir = self.spec.init_local_shared()
+        local_shared_dir = self._init_local_shared()
 
         if not os.path.isdir(local_shared_dir):
             self.logger.debug("Local shared dir not exists. Nothing to copy. " 
+ str(local_shared_dir))
@@ -189,6 +192,22 @@ class IgniteAwareService(BackgroundThreadService, 
IgnitePathAware, metaclass=ABC
             self.logger.debug("Copying shared file to node. " + str(file))
             node.account.copy_to(os.path.join(local_shared_dir, file), 
self.shared_root)
 
+    def _init_local_shared(self):
+        """
+        :return: path to local share folder. Files should be copied on all 
nodes in `shared_root` folder.
+        """
+        local_dir = os.path.join(tempfile.gettempdir(), 
str(self.context.session_context.session_id))
+
+        if not self.spec.is_prepare_shared_files(local_dir):
+            return local_dir
+
+        with FileLock("init_shared.lock", timeout=120):
+            if self.spec.is_prepare_shared_files(local_dir):
+                self.spec.prepare_shared_files(local_dir)
+                Path(os.path.join(local_dir, SHARED_PREPARED_FILE)).touch()
+
+        return local_dir
+
     def _prepare_configs(self, node):
         config = self.spec \
             .extend_config(self.config) \
diff --git a/modules/ducktests/tests/ignitetest/services/utils/ignite_spec.py 
b/modules/ducktests/tests/ignitetest/services/utils/ignite_spec.py
index 3a76af7..2761c3b 100644
--- a/modules/ducktests/tests/ignitetest/services/utils/ignite_spec.py
+++ b/modules/ducktests/tests/ignitetest/services/utils/ignite_spec.py
@@ -22,7 +22,6 @@ import importlib
 import json
 import os
 import subprocess
-import tempfile
 from abc import ABCMeta, abstractmethod
 
 from ignitetest.services.utils import IgniteServiceType
@@ -34,6 +33,8 @@ from ignitetest.services.utils.ssl.ssl_params import 
is_ssl_enabled
 from ignitetest.utils.ignite_test import JFR_ENABLED
 from ignitetest.utils.version import DEV_BRANCH
 
+SHARED_PREPARED_FILE = ".ignite_prepared"
+
 
 def resolve_spec(service, **kwargs):
     """
@@ -173,23 +174,30 @@ class IgniteSpec(metaclass=ABCMeta):
         """
         return self.service.config_file
 
-    def init_local_shared(self):
+    def is_prepare_shared_files(self, local_dir):
         """
-        :return: path to local share folder. Files should be copied on all 
nodes in `shared_root` folder.
+        :return True if we have something to prepare.
         """
-        local_dir = os.path.join(tempfile.gettempdir(), 
str(self.service.context.session_context.session_id))
-
         if not is_ssl_enabled(self.service.context.globals) and \
                 not (self.service.config.service_type == 
IgniteServiceType.NODE and self.service.config.ssl_params):
             self.service.logger.debug("Ssl disabled. Nothing to generate.")
-            return local_dir
+            return False
+
+        if os.path.isfile(os.path.join(local_dir, SHARED_PREPARED_FILE)):
+            self.service.logger.debug("Local shared dir already prepared. 
Exiting. " + local_dir)
+            return False
 
-        if os.path.isdir(local_dir):
-            self.service.logger.debug("Local shared dir already exists. 
Exiting. " + local_dir)
-            return local_dir
+        return True
 
+    def prepare_shared_files(self, local_dir):
+        """
+        Prepare files that should be copied on all nodes.
+        """
         self.service.logger.debug("Local shared dir not exists. Creating. " + 
local_dir)
-        os.mkdir(local_dir)
+        try:
+            os.mkdir(local_dir)
+        except FileExistsError:
+            self.service.logger.debug("Shared dir already exists, ignoring and 
continue." + local_dir)
 
         script_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 
"..", "..", "..", "certs")
 
@@ -197,8 +205,6 @@ class IgniteSpec(metaclass=ABCMeta):
         self._runcmd(f"chmod a+x {local_dir}/*.sh")
         self._runcmd(f"{local_dir}/mkcerts.sh")
 
-        return local_dir
-
     def _jvm_opts(self):
         """
         :return: line with extra JVM params for ignite.sh script: 
-J-Dparam=value -J-ea

Reply via email to