From 47a429d85d2c98846559be140b21f21f8aa469cc Mon Sep 17 00:00:00 2001 From: Federico Ressi Date: Tue, 27 Aug 2019 07:24:15 +0200 Subject: [PATCH] Use tobiko.makedirs instead of os.makedirs to avoid concurrency problems Change-Id: I691cb03e401bc340f13b3388eff7a5565e6f0940 --- tobiko/__init__.py | 3 +++ tobiko/common/{utils/file.py => _os.py} | 8 ++++---- tobiko/fault/config.py | 4 ++-- tobiko/openstack/glance/_image.py | 5 ++--- tobiko/openstack/stacks/_nova.py | 4 +--- 5 files changed, 12 insertions(+), 12 deletions(-) rename tobiko/common/{utils/file.py => _os.py} (85%) diff --git a/tobiko/__init__.py b/tobiko/__init__.py index 5cfec0d8f..e7d6e23a8 100644 --- a/tobiko/__init__.py +++ b/tobiko/__init__.py @@ -19,6 +19,7 @@ from tobiko.common import _fixture from tobiko.common import _logging from tobiko.common.managers import testcase as testcase_manager from tobiko.common.managers import loader as loader_manager +from tobiko.common import _os from tobiko.common import _select from tobiko.common import _skip @@ -53,6 +54,8 @@ CaptureLogFixture = _logging.CaptureLogFixture load_object = loader_manager.load_object load_module = loader_manager.load_module +makedirs = _os.makedirs + discover_testcases = testcase_manager.discover_testcases Selection = _select.Selection diff --git a/tobiko/common/utils/file.py b/tobiko/common/_os.py similarity index 85% rename from tobiko/common/utils/file.py rename to tobiko/common/_os.py index 295b46ed8..76661cfb6 100644 --- a/tobiko/common/utils/file.py +++ b/tobiko/common/_os.py @@ -21,7 +21,7 @@ from oslo_log import log LOG = log.getLogger(__name__) -def makedirs(path, mode=0o777, exist_ok=True): +def makedirs(name, mode=0o777, exist_ok=True): """Creates directory and its parents if directory doesn't exists. This emulates Python3 os.makedirs behavior[1] @@ -29,7 +29,7 @@ def makedirs(path, mode=0o777, exist_ok=True): [1] https://docs.python.org/3/library/os.html#os.makedirs) """ try: - os.makedirs(path, mode) - except os.error: - if not exist_ok: + os.makedirs(name, mode) + except Exception: + if not exist_ok or not os.path.isdir(name): raise diff --git a/tobiko/fault/config.py b/tobiko/fault/config.py index c5b87d945..57c473af1 100644 --- a/tobiko/fault/config.py +++ b/tobiko/fault/config.py @@ -19,8 +19,8 @@ import jinja2 from oslo_log import log +import tobiko from tobiko.fault import constants as fault_const -from tobiko.common.utils import file as file_utils from tobiko.openstack import nova @@ -49,7 +49,7 @@ class FaultConfig(object): def generate_config_file(self): """Generates os-faults configuration file.""" LOG.info("Generating os-fault configuration file.") - file_utils.makedirs(self.DEFAULT_CONF_PATH) + tobiko.makedirs(self.DEFAULT_CONF_PATH) rendered_conf = self.get_rendered_configuration() with open(self.DEFAULT_CONF_FILE, "w") as f: f.write(rendered_conf) diff --git a/tobiko/openstack/glance/_image.py b/tobiko/openstack/glance/_image.py index 173b70655..3ce31d70d 100644 --- a/tobiko/openstack/glance/_image.py +++ b/tobiko/openstack/glance/_image.py @@ -357,9 +357,8 @@ class URLGlanceImageFixture(FileGlanceImageFixture): def _download_image_file(self, image_file, chunks, expected_size): image_dir = os.path.dirname(image_file) - if not os.path.isdir(image_dir): - LOG.debug('Creating image directory: %r', image_dir) - os.makedirs(image_dir) + LOG.debug('Ensure image directory exists: %r', image_dir) + tobiko.makedirs(image_dir) fd, temp_file = tempfile.mkstemp(dir=image_dir) with io.open(fd, 'wb', io.DEFAULT_BUFFER_SIZE) as image_data: diff --git a/tobiko/openstack/stacks/_nova.py b/tobiko/openstack/stacks/_nova.py index 0fa99df28..9a85963c6 100644 --- a/tobiko/openstack/stacks/_nova.py +++ b/tobiko/openstack/stacks/_nova.py @@ -54,9 +54,7 @@ class KeyPairStackFixture(heat.HeatStackFixture): key_file = os.path.realpath(self.key_file) if not os.path.isfile(key_file): key_dir = os.path.dirname(key_file) - if not os.path.isdir(key_dir): - os.makedirs(key_dir) - assert os.path.isdir(key_dir) + tobiko.makedirs(key_dir) try: sh.local_execute(['ssh-keygen', '-f', key_file, '-P', '']) except sh.ShellCommandFailed: