Skip to content

Commit 0fc56e6

Browse files
committed
Add when support to workload directive
1 parent 98da2ab commit 0fc56e6

File tree

17 files changed

+481
-159
lines changed

17 files changed

+481
-159
lines changed

lib/ramble/ramble/experiment_set.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ def _prepare_experiment(
300300
app_inst = ramble.repository.get(final_app_name).clone()
301301
app_inst.set_variables(variables, self)
302302
app_inst.set_variants(context.variants)
303+
app_inst.set_active_workload()
303304
app_inst.set_env_variable_sets(context.env_variables)
304305
app_inst.set_internals(context.internals)
305306
app_inst.set_template(context.is_template)

lib/ramble/ramble/language/application_language.py

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,14 @@ class ApplicationMeta(ramble.language.shared_language.SharedMeta):
5353

5454
@application_directive("workloads")
5555
def workload(
56-
name, executables=None, executable=None, input=None, inputs=None, tags=None, **kwargs
56+
name,
57+
executables=None,
58+
executable=None,
59+
input=None,
60+
inputs=None,
61+
tags=None,
62+
when=None,
63+
**kwargs,
5764
):
5865
"""Adds a workload to this application
5966
@@ -78,7 +85,12 @@ def _execute_workload(app):
7885
input, inputs, app.inputs, "input", "inputs", "workload"
7986
)
8087

81-
app.workloads[name] = ramble.workload.Workload(name, all_execs, all_inputs, tags)
88+
when_list = ramble.language.language_helpers.build_when_list(when, app, name, "workload")
89+
when_set = frozenset(when_list)
90+
if when_set not in app.workloads:
91+
app.workloads[when_set] = {}
92+
93+
app.workloads[when_set][name] = ramble.workload.Workload(name, all_execs, all_inputs, tags)
8294

8395
return _execute_workload
8496

@@ -105,13 +117,15 @@ def _execute_workload_groups(app):
105117

106118
# Apply any existing variables in the group to the workload
107119
for workload in workloads:
108-
if name in app.workload_group_vars:
109-
for var in app.workload_group_vars[name]:
110-
app.workloads[workload].add_variable(var)
120+
for when_set in app.workloads.keys():
121+
if workload in app.workloads[when_set]:
122+
if name in app.workload_group_vars:
123+
for var in app.workload_group_vars[name]:
124+
app.workloads[when_set][workload].add_variable(var)
111125

112-
if name in app.workload_group_env_vars:
113-
for env_var in app.workload_group_env_vars[name]:
114-
app.workloads[workload].add_environment_variable(env_var)
126+
if name in app.workload_group_env_vars:
127+
for env_var in app.workload_group_env_vars[name]:
128+
app.workloads[when_set][workload].add_environment_variable(env_var)
115129

116130
return _execute_workload_groups
117131

@@ -264,8 +278,10 @@ def _execute_workload_variable(app):
264278
**kwargs,
265279
)
266280

267-
for wl_name in all_workloads:
268-
app.workloads[wl_name].add_variable(workload_var.copy())
281+
for when_set, app_workloads in app.workloads.items():
282+
for wl_name in all_workloads:
283+
if wl_name in app_workloads:
284+
app.workloads[when_set][wl_name].add_variable(workload_var.copy())
269285

270286
if workload_group is not None:
271287
workload_group_list = app.workload_groups[workload_group]
@@ -276,9 +292,11 @@ def _execute_workload_variable(app):
276292
# Track which vars we add to, to allow us to re-apply during inheritance
277293
app.workload_group_vars[workload_group].append(workload_var.copy())
278294

279-
for wl_name in workload_group_list:
280-
# Apply the variable
281-
app.workloads[wl_name].add_variable(workload_var.copy())
295+
for when_set, app_workloads in app.workloads.items():
296+
for wl_name in workload_group_list:
297+
if wl_name in app_workloads:
298+
# Apply the variable
299+
app.workloads[when_set][wl_name].add_variable(workload_var.copy())
282300

283301
if not all_workloads and workload_group is None:
284302
raise DirectiveError("A workload or workload group is required")
@@ -310,8 +328,12 @@ def _execute_environment_variable(app):
310328
name, value=value, description=description
311329
)
312330

313-
for wl_name in all_workloads:
314-
app.workloads[wl_name].add_environment_variable(workload_env_var.copy())
331+
for when_set, app_workloads in app.workloads.items():
332+
for wl_name in all_workloads:
333+
if wl_name in app_workloads:
334+
app.workloads[when_set][wl_name].add_environment_variable(
335+
workload_env_var.copy()
336+
)
315337

316338
if workload_group is not None:
317339
workload_group_list = app.workload_groups[workload_group]
@@ -321,8 +343,11 @@ def _execute_environment_variable(app):
321343

322344
app.workload_group_env_vars[workload_group].append(workload_env_var.copy())
323345

324-
for wl_name in workload_group_list:
325-
app.workloads[wl_name].add_environment_variable(workload_env_var.copy())
346+
for when_set, app_workloads in app.workloads.items():
347+
for wl_name in workload_group_list:
348+
app.workloads[when_set][wl_name].add_environment_variable(
349+
workload_env_var.copy()
350+
)
326351

327352
if not all_workloads and workload_group is None:
328353
raise DirectiveError("A workload or workload group is required")

lib/ramble/ramble/language/language_base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ def _wrapper(*args, **_kwargs):
238238
"modifier_variable",
239239
"package_manager_variable",
240240
"workflow_manager_variable",
241+
"workload",
241242
"executable",
242243
"input_file",
243244
]:

0 commit comments

Comments
 (0)