Skip to content

Commit ecf30dc

Browse files
committed
Merged PR 291029: Automatically launch server on docker and run tests on it
Related work items: #577200 # Conflicts: # tests/test_operator.py
1 parent 3561a0c commit ecf30dc

File tree

12 files changed

+253
-129
lines changed

12 files changed

+253
-129
lines changed

ansys/dpf/core/__init__.py

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,28 +71,19 @@
7171

7272
# Setup data directory
7373
USER_DATA_PATH = None
74-
EXAMPLES_PATH = None
75-
if os.environ.get("DPF_DOCKER", False): # pragma: no cover
76-
# Running DPF within docker (likely for CI)
77-
# path must be relative to DPF directory
78-
#
79-
# assumes the following docker mount:
80-
# -v /tmp:/dpf/_cache
81-
EXAMPLES_PATH = "/tmp"
82-
else:
83-
try:
84-
import appdirs
74+
LOCAL_DOWNLOADED_EXAMPLES_PATH = None
75+
try:
76+
import appdirs
8577

86-
USER_DATA_PATH = appdirs.user_data_dir("ansys-dpf-core")
87-
if not os.path.exists(USER_DATA_PATH): # pragma: no cover
88-
os.makedirs(USER_DATA_PATH)
89-
90-
EXAMPLES_PATH = os.path.join(USER_DATA_PATH, "examples")
91-
if not os.path.exists(EXAMPLES_PATH): # pragma: no cover
92-
os.makedirs(EXAMPLES_PATH)
93-
except: # pragma: no cover
94-
pass
78+
USER_DATA_PATH = appdirs.user_data_dir("ansys-dpf-core")
79+
if not os.path.exists(USER_DATA_PATH): # pragma: no cover
80+
os.makedirs(USER_DATA_PATH)
9581

82+
LOCAL_DOWNLOADED_EXAMPLES_PATH = os.path.join(USER_DATA_PATH, "examples")
83+
if not os.path.exists(LOCAL_DOWNLOADED_EXAMPLES_PATH): # pragma: no cover
84+
os.makedirs(LOCAL_DOWNLOADED_EXAMPLES_PATH)
85+
except: # pragma: no cover
86+
pass
9687

9788
SERVER = None
9889

ansys/dpf/core/examples/downloads.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
import os
44
import urllib.request
55

6-
from ansys.dpf.core import EXAMPLES_PATH
76

87
EXAMPLE_REPO = "https://github.com/pyansys/example-data/raw/master/result_files/"
98

109

1110
def delete_downloads():
1211
"""Delete all downloaded examples to free space or update the files"""
13-
shutil.rmtree(EXAMPLES_PATH)
14-
os.makedirs(EXAMPLES_PATH)
12+
from ansys.dpf.core import LOCAL_DOWNLOADED_EXAMPLES_PATH
13+
shutil.rmtree(LOCAL_DOWNLOADED_EXAMPLES_PATH)
14+
os.makedirs(LOCAL_DOWNLOADED_EXAMPLES_PATH)
1515

1616

1717
def _get_file_url(directory, filename):
@@ -20,11 +20,15 @@ def _get_file_url(directory, filename):
2020

2121
def _retrieve_file(url, filename, directory):
2222
"""Download a file from a url"""
23+
from ansys.dpf.core import LOCAL_DOWNLOADED_EXAMPLES_PATH, path_utilities
24+
2325
# First check if file has already been downloaded
24-
local_path = os.path.join(EXAMPLES_PATH, directory, os.path.basename(filename))
26+
local_path = os.path.join(LOCAL_DOWNLOADED_EXAMPLES_PATH, directory, os.path.basename(filename))
2527
local_path_no_zip = local_path.replace(".zip", "")
2628
if os.path.isfile(local_path_no_zip) or os.path.isdir(local_path_no_zip):
27-
return local_path_no_zip
29+
return path_utilities.to_server_os(local_path_no_zip.replace(
30+
LOCAL_DOWNLOADED_EXAMPLES_PATH,
31+
path_utilities.downloaded_example_path()))
2832

2933
# grab the correct url retriever
3034
urlretrieve = urllib.request.urlretrieve
@@ -35,21 +39,14 @@ def _retrieve_file(url, filename, directory):
3539

3640
# Perform download
3741
_, resp = urlretrieve(url, local_path)
38-
return local_path
42+
return path_utilities.to_server_os(local_path.replace(
43+
LOCAL_DOWNLOADED_EXAMPLES_PATH,
44+
path_utilities.downloaded_example_path()))
3945

4046

4147
def _download_file(directory, filename):
4248
url = _get_file_url(directory, filename)
4349
local_path = _retrieve_file(url, filename, directory)
44-
45-
if os.environ.get("DPF_DOCKER", False): # pragma: no cover
46-
# override path if running on docker as path must be relative
47-
# to docker mount
48-
#
49-
# Assumes the following mapping in docker
50-
# DWN_CSH=/tmp/dpf_cache
51-
# -v $DWN_CSH:/dpf/_cache
52-
local_path = os.path.join("/dpf/_cache", directory, filename)
5350
return local_path
5451

5552

ansys/dpf/core/path_utilities.py

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
from ansys.dpf import core
1+
import os
22

3+
from ansys.dpf.core import server as server_module
34

4-
def join(left_path, right_path, server=None):
5+
6+
def join(*args, **kwargs):
57
"""Join two strings to form a path, following the server
68
architecture.
79
Using a server version below 3.0, please ensure that the
@@ -10,11 +12,11 @@ def join(left_path, right_path, server=None):
1012
1113
Parameters
1214
----------
13-
left_path : str
14-
Left part of the final requested path.
15+
args : str, DPFServer
16+
Path to join and optionally a server.
1517
16-
right_path : str
17-
Right path of the final requested path.
18+
kwargs : DPFServer
19+
server=.
1820
1921
server : Server
2022
Specific server to use.
@@ -25,15 +27,53 @@ def join(left_path, right_path, server=None):
2527
left_path + right_path concatenated into a single string value.
2628
2729
"""
30+
server = None
31+
parts = []
32+
for a in args:
33+
if isinstance(a, str) and len(a) > 0:
34+
parts.append(a)
35+
elif isinstance(a, server_module.DpfServer):
36+
server = a
37+
if "server" in kwargs:
38+
server = kwargs["server"]
2839
if not server:
29-
server = core.SERVER
40+
server = server_module._global_server()
3041
if not server:
31-
raise RuntimeError("A server must be connected to use this method.")
42+
if server_module.RUNNING_DOCKER["use_docker"]:
43+
current_os = "posix"
44+
else:
45+
return os.path.join(*args)
46+
else:
47+
current_os = server.os
3248

33-
os_info = server.os
49+
if len(parts) == 0:
50+
return ""
3451
separator = "\\"
35-
if os_info == 'posix':
52+
if current_os == 'posix':
3653
separator = "/"
37-
38-
path_to_return = left_path + separator + right_path
54+
path_to_return = parts[0]
55+
for ipath in range(1, len(parts)):
56+
path_to_return += separator + parts[ipath]
3957
return path_to_return
58+
59+
def to_server_os(path, server=None):
60+
if not server:
61+
server = server_module._global_server()
62+
if not server:
63+
return path
64+
if server.os == 'posix':
65+
return path.replace("\\", "/")
66+
else:
67+
return path.replace("/", "\\")
68+
69+
def downloaded_example_path(server = None):
70+
on_docker = server_module.RUNNING_DOCKER["use_docker"]
71+
if not server:
72+
server = server_module._global_server()
73+
if server:
74+
on_docker = server.on_docker
75+
if on_docker: # pragma: no cover
76+
return "/tmp/downloaded_examples"
77+
else:
78+
from ansys.dpf.core import LOCAL_DOWNLOADED_EXAMPLES_PATH
79+
return LOCAL_DOWNLOADED_EXAMPLES_PATH

0 commit comments

Comments
 (0)