Skip to content

Commit 46ccda1

Browse files
committed
tmp commit
1 parent 1d82eb9 commit 46ccda1

6 files changed

Lines changed: 141 additions & 15 deletions

File tree

tests/translators_loggers/build_docker_docker_images.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
set -e
44

5-
for backend in "dask" "parsl" "nextflow" "airflow" "bash" "taskvine" "cwl" "pegasus" "swiftt"; do
5+
for backend in "dask" "parsl" "nextflow" "airflow" "bash" "taskvine" "makeflow" "cwl" "pegasus" "swiftt"; do
66
echo "Building $backend Docker image..."
77
docker build --platform linux/amd64 -t wfcommons/wfcommons-testing-$backend -f Dockerfile.$backend .
88
done

tests/translators_loggers/test_translators_loggers.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from wfcommons.wfbench import AirflowTranslator
3232
from wfcommons.wfbench import BashTranslator
3333
from wfcommons.wfbench import TaskVineTranslator
34+
from wfcommons.wfbench import MakeflowTranslator
3435
from wfcommons.wfbench import CWLTranslator
3536
from wfcommons.wfbench import PegasusTranslator
3637
from wfcommons.wfbench import SwiftTTranslator
@@ -105,6 +106,7 @@ def _additional_setup_swiftt(container):
105106
"airflow": noop,
106107
"bash": noop,
107108
"taskvine": _additional_setup_taskvine,
109+
"makeflow": noop,
108110
"cwl": noop,
109111
"pegasus": _additional_setup_pegasus,
110112
"swiftt": _additional_setup_swiftt,
@@ -161,6 +163,14 @@ def run_workflow_taskvine(container, num_tasks, str_dirpath):
161163
assert (exit_code == 0)
162164
assert (output.decode().count("completed") == num_tasks)
163165

166+
def run_workflow_makeflow(container, num_tasks, str_dirpath):
167+
# Run the workflow!
168+
exit_code, output = container.exec_run(cmd=["bash", "-c", "makeflow ./workflow.makeflow"], stdout=True, stderr=True)
169+
# Check sanity
170+
assert (exit_code == 0)
171+
sys.stderr.write("SHOULD BE CHECKING SANITY")
172+
# assert (output.decode().count("completed") == num_tasks)
173+
164174
def run_workflow_cwl(container, num_tasks, str_dirpath):
165175
# Run the workflow!
166176
# Note that the input file is hardcoded and Blast-specific
@@ -194,6 +204,7 @@ def run_workflow_swiftt(container, num_tasks, str_dirpath):
194204
"airflow": run_workflow_airflow,
195205
"bash": run_workflow_bash,
196206
"taskvine": run_workflow_taskvine,
207+
"makeflow": run_workflow_makeflow,
197208
"cwl": run_workflow_cwl,
198209
"pegasus": run_workflow_pegasus,
199210
"swiftt": run_workflow_swiftt,
@@ -206,6 +217,7 @@ def run_workflow_swiftt(container, num_tasks, str_dirpath):
206217
"airflow": AirflowTranslator,
207218
"bash": BashTranslator,
208219
"taskvine": TaskVineTranslator,
220+
"makeflow": MakeflowTranslator,
209221
"cwl": CWLTranslator,
210222
"pegasus": PegasusTranslator,
211223
"swiftt": SwiftTTranslator,
@@ -217,15 +229,16 @@ class TestTranslators:
217229
@pytest.mark.parametrize(
218230
"backend",
219231
[
220-
"swiftt",
221-
"dask",
222-
"parsl",
223-
"nextflow",
224-
"airflow",
225-
"bash",
226-
"taskvine",
227-
"cwl",
228-
"pegasus",
232+
# "swiftt",
233+
# "dask",
234+
# "parsl",
235+
# "nextflow",
236+
# "airflow",
237+
# "bash",
238+
# "taskvine",
239+
"makeflow",
240+
# "cwl",
241+
# "pegasus",
229242
])
230243
@pytest.mark.unit
231244
# @pytest.mark.skip(reason="tmp")

wfcommons/wfbench/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
# (at your option) any later version.
1010

1111
from .bench import WorkflowBenchmark
12-
from .translator import AirflowTranslator, DaskTranslator, NextflowTranslator, ParslTranslator, PegasusTranslator, SwiftTTranslator, TaskVineTranslator, CWLTranslator, BashTranslator, PyCompssTranslator
12+
from .translator import AirflowTranslator, DaskTranslator, NextflowTranslator, ParslTranslator, PegasusTranslator, SwiftTTranslator, TaskVineTranslator, MakeflowTranslator, CWLTranslator, BashTranslator, PyCompssTranslator

wfcommons/wfbench/translator/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@
1818
from .pycompss import PyCompssTranslator
1919
from .swift_t import SwiftTTranslator
2020
from .taskvine import TaskVineTranslator
21+
from .makeflow import MakeflowTranslator
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# Copyright (c) 2024-2025 The WfCommons Team.
5+
#
6+
# This program is free software: you can redistribute it and/or modify
7+
# it under the terms of the GNU General Public License as published by
8+
# the Free Software Foundation, either version 3 of the License, or
9+
# (at your option) any later version.
10+
11+
import pathlib
12+
import shutil
13+
14+
from logging import Logger
15+
from typing import Optional, Union
16+
17+
from .abstract_translator import Translator
18+
from ...common import Workflow
19+
20+
this_dir = pathlib.Path(__file__).resolve().parent
21+
22+
23+
class MakeflowTranslator(Translator):
24+
"""
25+
A WfFormat parser for creating Makeflow workflow applications.
26+
27+
:param workflow: Workflow benchmark object or path to the workflow benchmark JSON instance.
28+
:type workflow: Union[Workflow, pathlib.Path],
29+
:param logger: The logger where to log information/warning or errors (optional).
30+
:type logger: Logger
31+
"""
32+
def __init__(self,
33+
workflow: Union[Workflow, pathlib.Path],
34+
logger: Optional[Logger] = None) -> None:
35+
"""Create an object of the translator."""
36+
super().__init__(workflow, logger)
37+
self._script = ""
38+
39+
def translate(self, output_folder: pathlib.Path) -> None:
40+
"""
41+
Translate a workflow benchmark description (WfFormat) into an actual workflow application.
42+
43+
:param output_folder: The path to the folder in which the workflow benchmark will be generated.
44+
:type output_folder: pathlib.Path
45+
"""
46+
47+
# Generate code
48+
self._generate_code()
49+
50+
# write benchmark files
51+
output_folder.mkdir(parents=True)
52+
with open(output_folder.joinpath("workflow.makeflow"), "w") as fp:
53+
fp.write(self._script)
54+
55+
# additional files
56+
self._copy_binary_files(output_folder)
57+
self._generate_input_files(output_folder)
58+
59+
# README file
60+
self._write_readme_file(output_folder)
61+
62+
def _generate_code(self):
63+
"""
64+
Generate the Makeflow code
65+
66+
:return: the code
67+
:rtype: str
68+
"""
69+
self._script = "# Makeflow workflow specification\n\n"
70+
for task_name, task in self.workflow.tasks.items():
71+
make_clause = ""
72+
# output files
73+
for output_file in task.output_files:
74+
make_clause += f"{output_file.file_id} "
75+
make_clause += ": "
76+
# input files
77+
for input_file in task.input_files:
78+
make_clause += f"{input_file.file_id} "
79+
make_clause += "\n"
80+
make_clause += "\t"
81+
make_clause += task.program + " " + " ".join(task.args)
82+
make_clause += "\n"
83+
self._script += make_clause + "\n\n"
84+
return
85+
86+
# OLD CODE FOR TASK VINE...
87+
# args = []
88+
# for a in task.args:
89+
# if "--output-files" in a:
90+
# args.append(f"--output-files {output_spec}")
91+
# elif "--input-files" in a:
92+
# args.append(f"--input-files {input_spec}")
93+
# else:
94+
# args.append(a)
95+
# args = " ".join(f"{a}" for a in args)
96+
97+
98+
def _write_readme_file(self, output_folder: pathlib.Path) -> None:
99+
"""
100+
Write the README file.
101+
102+
:param output_folder: The path of the output folder.
103+
:type output_folder: pathlib.Path
104+
"""
105+
readme_file_path = output_folder.joinpath("README")
106+
with open(readme_file_path, "w") as out:
107+
out.write(f"In directory {str(output_folder)}:\n")
108+
out.write(f" - The Makeflow input file: "
109+
f" workflow.makeflow\n")
110+
out.write(f" - Run the workflow: "
111+
f" makeflow workflow.makeflow\n")

wfcommons/wfbench/translator/taskvine.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def __init__(self,
3434
logger: Optional[Logger] = None) -> None:
3535
"""Create an object of the translator."""
3636
super().__init__(workflow, logger)
37+
self._script = ""
3738
self.parsed_tasks = []
3839
self.task_counter = 1
3940
self.output_files_map = {}
@@ -45,16 +46,16 @@ def translate(self, output_folder: pathlib.Path) -> None:
4546
:param output_folder: The path to the folder in which the workflow benchmark will be generated.
4647
:type output_folder: pathlib.Path
4748
"""
48-
self.script = "# workflow tasks\n"
49+
self._script = "# workflow tasks\n"
4950

5051
# add tasks per level
5152
self.next_level = self.root_task_names.copy()
5253
while self.next_level:
5354
self.next_level = self._add_level_tasks(self.next_level)
54-
self.script += "wait_for_tasks_completion()\n"
55+
self._script += "wait_for_tasks_completion()\n"
5556

5657
# generate code
57-
run_workflow_code = self._merge_codelines("templates/taskvine_template.py", self.script)
58+
run_workflow_code = self._merge_codelines("templates/taskvine_template.py", self._script)
5859

5960
# generate Flowcept code
6061
if self.workflow.workflow_id is not None:
@@ -156,7 +157,7 @@ def _add_task(self, task_name: str, parent_task: Optional[str] = None) -> list[s
156157
args = " ".join(f"{a}" for a in args)
157158

158159
# write task
159-
self.script += f"t_{self.task_counter} = vine.Task('{task.program} {args}')\n" \
160+
self._script += f"t_{self.task_counter} = vine.Task('{task.program} {args}')\n" \
160161
f"t_{self.task_counter}.set_cores(1)\n{task_script}"
161162

162163
self.task_counter += 1

0 commit comments

Comments
 (0)