Skip to content

Commit bbe20f5

Browse files
authored
macOS fixes (#1028)
set tmpdir_prefix in macOS-with-docker friendly way normalize use of tmpdir_prefix
1 parent 45d6236 commit bbe20f5

File tree

11 files changed

+155
-146
lines changed

11 files changed

+155
-146
lines changed

cwltool/command_line_tool.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -492,13 +492,15 @@ def rm_pending_output_callback(output_callbacks, jobcachepending,
492492
json_dumps(builder.bindings, indent=4))
493493
dockerReq, _ = self.get_requirement("DockerRequirement")
494494
if dockerReq is not None and runtimeContext.use_container:
495-
out_prefix = getdefault(runtimeContext.tmp_outdir_prefix, 'tmp')
495+
out_dir, out_prefix = os.path.split(
496+
runtimeContext.tmp_outdir_prefix)
496497
j.outdir = runtimeContext.outdir or \
497-
tempfile.mkdtemp(prefix=out_prefix) # type: ignore
498-
tmpdir_prefix = getdefault(runtimeContext.tmpdir_prefix, 'tmp')
498+
tempfile.mkdtemp(prefix=out_prefix, dir=out_dir)
499+
tmpdir_dir, tmpdir_prefix = os.path.split(
500+
runtimeContext.tmpdir_prefix)
499501
j.tmpdir = runtimeContext.tmpdir or \
500-
tempfile.mkdtemp(prefix=tmpdir_prefix) # type: ignore
501-
j.stagedir = tempfile.mkdtemp(prefix=tmpdir_prefix)
502+
tempfile.mkdtemp(prefix=tmpdir_prefix, dir=tmpdir_dir)
503+
j.stagedir = tempfile.mkdtemp(prefix=tmpdir_prefix, dir=tmpdir_dir)
502504
else:
503505
j.outdir = builder.outdir
504506
j.tmpdir = builder.tmpdir

cwltool/docker.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,8 @@ def add_writable_file_volume(self,
231231
# which is already going to be mounted
232232
shutil.copy(volume.resolved, host_outdir_tgt)
233233
else:
234-
tmpdir = tempfile.mkdtemp(dir=tmpdir_prefix)
234+
tmp_dir, tmp_prefix = os.path.split(tmpdir_prefix)
235+
tmpdir = tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir)
235236
file_copy = os.path.join(
236237
tmpdir, os.path.basename(volume.resolved))
237238
shutil.copy(volume.resolved, file_copy)
@@ -249,8 +250,9 @@ def add_writable_directory_volume(self,
249250
if volume.resolved.startswith("_:"):
250251
# Synthetic directory that needs creating first
251252
if not host_outdir_tgt:
253+
tmp_dir, tmp_prefix = os.path.split(tmpdir_prefix)
252254
new_dir = os.path.join(
253-
tempfile.mkdtemp(dir=tmpdir_prefix),
255+
tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir),
254256
os.path.basename(volume.target))
255257
self.append_volume(runtime, new_dir, volume.target,
256258
writable=True)
@@ -262,7 +264,8 @@ def add_writable_directory_volume(self,
262264
writable=True)
263265
else:
264266
if not host_outdir_tgt:
265-
tmpdir = tempfile.mkdtemp(dir=tmpdir_prefix)
267+
tmp_dir, tmp_prefix = os.path.split(tmpdir_prefix)
268+
tmpdir = tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir)
266269
new_dir = os.path.join(
267270
tmpdir, os.path.basename(volume.resolved))
268271
shutil.copytree(volume.resolved, new_dir)
@@ -355,7 +358,8 @@ def create_runtime(self,
355358
"please check it first")
356359
exit(2)
357360
else:
358-
cidfile_dir = tempfile.mkdtemp(dir=runtimeContext.tmpdir_prefix)
361+
tmp_dir, tmp_prefix = os.path.split(runtimeContext.tmpdir_prefix)
362+
cidfile_dir = tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir)
359363

360364
cidfile_name = datetime.datetime.now().strftime("%Y%m%d%H%M%S-%f") + ".cid"
361365
if runtimeContext.cidfile_prefix is not None:

cwltool/job.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,9 @@ def create_file_and_add_volume(self,
519519
): # type: (...) -> Text
520520
"""Create the file and add a mapping."""
521521
if not host_outdir_tgt:
522+
tmp_dir, tmp_prefix = os.path.split(tmpdir_prefix)
522523
new_file = os.path.join(
523-
tempfile.mkdtemp(dir=tmpdir_prefix),
524+
tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir),
524525
os.path.basename(volume.resolved))
525526
writable = True if volume.type == "CreateWritableFile" else False
526527
if secret_store:
@@ -688,7 +689,8 @@ def docker_monitor(self, cidfile, tmpdir_prefix, cleanup_cidfile, process):
688689
except OSError:
689690
cid = None
690691
max_mem = self.docker_get_memory(cid)
691-
stats_file = tempfile.NamedTemporaryFile(dir=tmpdir_prefix)
692+
tmp_dir, tmp_prefix = os.path.split(tmpdir_prefix)
693+
stats_file = tempfile.NamedTemporaryFile(prefix=tmp_prefix, dir=tmp_dir)
692694
with open(stats_file.name, mode="w") as stats_file_handle:
693695
stats_proc = subprocess.Popen(
694696
['docker', 'stats', '--no-trunc', '--format', '{{.MemPerc}}',

cwltool/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ def my_represent_none(self, data): # pylint: disable=unused-argument
754754
default_mac_path = "/private/tmp/docker_tmp"
755755
if runtimeContext.tmp_outdir_prefix == DEFAULT_TMP_PREFIX:
756756
runtimeContext.tmp_outdir_prefix = default_mac_path
757+
if runtimeContext.tmpdir_prefix == DEFAULT_TMP_PREFIX:
758+
runtimeContext.tmpdir_prefix = default_mac_path
757759

758760
for dirprefix in ("tmpdir_prefix", "tmp_outdir_prefix", "cachedir"):
759761
if getattr(runtimeContext, dirprefix) and getattr(runtimeContext, dirprefix) != DEFAULT_TMP_PREFIX:

cwltool/provenance.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,9 @@ def __init__(self, temp_prefix_ro="tmp", orcid='', full_name=''):
947947
self.temp_prefix = temp_prefix_ro
948948
self.orcid = '' if not orcid else _valid_orcid(orcid)
949949
self.full_name = full_name
950-
self.folder = os.path.abspath(tempfile.mkdtemp(prefix=temp_prefix_ro)) # type: Text
950+
tmp_dir, tmp_prefix = os.path.split(temp_prefix_ro)
951+
self.folder = os.path.abspath(tempfile.mkdtemp(prefix=tmp_prefix,
952+
dir=tmp_dir)) # type: Text
951953
self.closed = False
952954
# map of filename "data/de/alsdklkas": 12398123 bytes
953955
self.bagged_size = {} # type: Dict
@@ -1394,8 +1396,9 @@ def add_data_file(self, from_fp, timestamp=None, content_type=None):
13941396
# type: (IO, Optional[datetime.datetime], Optional[str]) -> Text
13951397
"""Copy inputs to data/ folder."""
13961398
self.self_check()
1399+
tmp_dir, tmp_prefix = os.path.split(self.temp_prefix)
13971400
with tempfile.NamedTemporaryFile(
1398-
prefix=self.temp_prefix, delete=False) as tmp:
1401+
prefix=tmp_prefix, dir=tmp_dir, delete=False) as tmp:
13991402
checksum = checksum_copy(from_fp, tmp)
14001403

14011404
# Calculate hash-based file path

cwltool/singularity.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,9 @@ def add_writable_file_volume(self,
202202
runtime, volume.resolved, volume.target, writable=True)
203203
ensure_writable(volume.resolved)
204204
else:
205+
tmp_dir, tmp_prefix = os.path.split(tmpdir_prefix)
205206
file_copy = os.path.join(
206-
tempfile.mkdtemp(dir=tmpdir_prefix),
207+
tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir),
207208
os.path.basename(volume.resolved))
208209
shutil.copy(volume.resolved, file_copy)
209210
#volume.resolved = file_copy
@@ -221,8 +222,9 @@ def add_writable_directory_volume(self,
221222
if host_outdir_tgt is not None:
222223
new_dir = host_outdir_tgt
223224
else:
225+
tmp_dir, tmp_prefix = os.path.split(tmpdir_prefix)
224226
new_dir = os.path.join(
225-
tempfile.mkdtemp(dir=tmpdir_prefix),
227+
tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir),
226228
os.path.basename(volume.resolved))
227229
os.makedirs(new_dir, 0o0755)
228230
else:
@@ -235,8 +237,9 @@ def add_writable_directory_volume(self,
235237
ensure_writable(host_outdir_tgt)
236238
else:
237239
if not self.inplace_update:
240+
tmp_dir, tmp_prefix = os.path.split(tmpdir_prefix)
238241
dir_copy = os.path.join(
239-
tempfile.mkdtemp(dir=tmpdir_prefix),
242+
tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir),
240243
os.path.basename(volume.resolved))
241244
shutil.copytree(volume.resolved, dir_copy)
242245
source = dir_copy

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ universal = 1
99
test=pytest
1010

1111
[tool:pytest]
12-
addopts=--ignore cwltool/schemas
12+
addopts=--ignore cwltool/schemas --basetemp ./tmp
1313
testpaths = tests

tests/test_ext.py

Lines changed: 43 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import cwltool.process
1414

1515

16-
from .util import get_data, needs_docker, temp_dir, windows_needs_docker, get_main_output
16+
from .util import get_data, needs_docker, temp_dir, windows_needs_docker
1717

1818

1919
@needs_docker
@@ -55,8 +55,7 @@ def test_listing_v1_1():
5555

5656
@needs_docker
5757
def test_double_overwrite(tmpdir):
58-
try:
59-
tmp = tempfile.mkdtemp()
58+
with temp_dir() as tmp:
6059
tmp_name = os.path.join(tmp, "value")
6160

6261
before_value, expected_value = "1", "3"
@@ -71,96 +70,76 @@ def test_double_overwrite(tmpdir):
7170
actual_value = f.read()
7271

7372
assert actual_value == expected_value
74-
finally:
75-
shutil.rmtree(tmp)
7673

7774
@needs_docker
7875
def test_disable_file_overwrite_without_ext():
79-
try:
80-
tmp = tempfile.mkdtemp()
81-
out = tempfile.mkdtemp()
76+
with temp_dir() as tmp:
77+
with temp_dir() as out:
78+
tmp_name = os.path.join(tmp, "value")
79+
out_name = os.path.join(out, "value")
8280

83-
tmp_name = os.path.join(tmp, "value")
84-
out_name = os.path.join(out, "value")
81+
before_value, expected_value = "1", "2"
8582

86-
before_value, expected_value = "1", "2"
83+
with open(tmp_name, "w") as f:
84+
f.write(before_value)
8785

88-
with open(tmp_name, "w") as f:
89-
f.write(before_value)
86+
assert main(["--outdir", out, get_data('tests/wf/updateval.cwl'), "-r", tmp_name]) == 0
9087

91-
assert main(["--outdir", out, get_data('tests/wf/updateval.cwl'), "-r", tmp_name]) == 0
88+
with open(tmp_name, "r") as f:
89+
tmp_value = f.read()
90+
with open(out_name, "r") as f:
91+
out_value = f.read()
9292

93-
with open(tmp_name, "r") as f:
94-
tmp_value = f.read()
95-
with open(out_name, "r") as f:
96-
out_value = f.read()
97-
98-
assert tmp_value == before_value
99-
assert out_value == expected_value
100-
finally:
101-
shutil.rmtree(tmp)
102-
shutil.rmtree(out)
93+
assert tmp_value == before_value
94+
assert out_value == expected_value
10395

10496
@needs_docker
10597
def test_disable_dir_overwrite_without_ext():
106-
try:
107-
tmp = tempfile.mkdtemp()
108-
out = tempfile.mkdtemp()
98+
with temp_dir() as tmp:
99+
with temp_dir() as out:
109100

110-
assert main(["--outdir", out, get_data('tests/wf/updatedir.cwl'), "-r", tmp]) == 0
101+
assert main(["--outdir", out, get_data('tests/wf/updatedir.cwl'), "-r", tmp]) == 0
111102

112-
assert not os.listdir(tmp)
113-
assert os.listdir(out)
114-
finally:
115-
shutil.rmtree(tmp)
116-
shutil.rmtree(out)
103+
assert not os.listdir(tmp)
104+
assert os.listdir(out)
117105

118106
@needs_docker
119107
def test_disable_file_creation_in_outdir_with_ext():
120-
try:
121-
tmp = tempfile.mkdtemp()
122-
out = tempfile.mkdtemp()
108+
with temp_dir() as tmp:
109+
with temp_dir() as out:
123110

124-
tmp_name = os.path.join(tmp, "value")
125-
out_name = os.path.join(out, "value")
111+
tmp_name = os.path.join(tmp, "value")
112+
out_name = os.path.join(out, "value")
126113

127-
before_value, expected_value = "1", "2"
114+
before_value, expected_value = "1", "2"
128115

129-
with open(tmp_name, "w") as f:
130-
f.write(before_value)
116+
with open(tmp_name, "w") as f:
117+
f.write(before_value)
131118

132-
params = ["--enable-ext", "--leave-outputs", "--outdir",
133-
out, get_data('tests/wf/updateval_inplace.cwl'), "-r", tmp_name]
134-
assert main(params) == 0
119+
params = ["--enable-ext", "--leave-outputs", "--outdir",
120+
out, get_data('tests/wf/updateval_inplace.cwl'), "-r", tmp_name]
121+
assert main(params) == 0
135122

136-
with open(tmp_name, "r") as f:
137-
tmp_value = f.read()
123+
with open(tmp_name, "r") as f:
124+
tmp_value = f.read()
138125

139-
assert tmp_value == expected_value
140-
assert not os.path.exists(out_name)
141-
finally:
142-
shutil.rmtree(tmp)
143-
shutil.rmtree(out)
126+
assert tmp_value == expected_value
127+
assert not os.path.exists(out_name)
144128

145129
@needs_docker
146130
def test_disable_dir_creation_in_outdir_with_ext():
147-
try:
148-
tmp = tempfile.mkdtemp()
149-
out = tempfile.mkdtemp()
150-
params = ["--enable-ext", "--leave-outputs", "--outdir",
151-
out, get_data('tests/wf/updatedir_inplace.cwl'), "-r", tmp]
152-
assert main(params) == 0
153-
154-
assert os.listdir(tmp)
155-
assert not os.listdir(out)
156-
finally:
157-
shutil.rmtree(tmp)
158-
shutil.rmtree(out)
131+
with temp_dir() as tmp:
132+
with temp_dir() as out:
133+
params = ["--enable-ext", "--leave-outputs", "--outdir",
134+
out, get_data('tests/wf/updatedir_inplace.cwl'), "-r", tmp]
135+
assert main(params) == 0
136+
137+
assert os.listdir(tmp)
138+
assert not os.listdir(out)
159139

160140
@needs_docker
161141
def test_write_write_conflict():
162142
with temp_dir('tmp') as tmp:
163-
tmp = tempfile.mkdtemp()
164143
tmp_name = os.path.join(tmp, "value")
165144

166145
before_value, expected_value = "1", "2"
@@ -178,7 +157,6 @@ def test_write_write_conflict():
178157
@pytest.mark.skip(reason="This test is non-deterministic")
179158
def test_read_write_conflict():
180159
with temp_dir('tmp') as tmp:
181-
tmp = tempfile.mkdtemp()
182160
tmp_name = os.path.join(tmp, "value")
183161

184162
with open(tmp_name, "w") as f:

0 commit comments

Comments
 (0)