Skip to content

Commit 2394980

Browse files
authored
Merge pull request #1067 from douglasjacobsen/fix-workflow-variables
Fix order of default variable definition
2 parents 152d2f0 + 6423c20 commit 2394980

File tree

4 files changed

+59
-52
lines changed

4 files changed

+59
-52
lines changed

lib/ramble/ramble/application.py

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,12 @@ def clone(self):
227227
new_clone = type(self)(self._file_path)
228228
self.generated_experiments.append(new_clone)
229229

230-
if self._env_variable_sets:
231-
new_clone.set_env_variable_sets(self._env_variable_sets.copy())
232230
if self.variables:
233231
new_clone.set_variables(self.variables.copy(), self.experiment_set)
232+
if self.variants:
233+
new_clone.set_variants(self.variants)
234+
if self._env_variable_sets:
235+
new_clone.set_env_variable_sets(self._env_variable_sets.copy())
234236
if self.internals:
235237
new_clone.set_internals(self.internals.copy())
236238
if self._formatted_executables:
@@ -240,8 +242,6 @@ def clone(self):
240242
new_clone.set_template(False)
241243
new_clone.repeats.set_repeats(False, 0)
242244
new_clone.set_chained_experiments(None)
243-
if self.variants:
244-
new_clone.set_variants(self.variants)
245245

246246
return new_clone
247247

@@ -321,6 +321,11 @@ def _set_package_manager(self):
321321
}
322322
)
323323

324+
# Define any missing package manager variables
325+
for var, val in self.package_manager.selected_variables().items():
326+
if var not in self.variables:
327+
self.define_variable(var, val.default)
328+
324329
def _set_workflow_manager(self):
325330
workflow_name = conversions.canonical_none(
326331
self.object_variants.value(namespace.workflow_manager)
@@ -341,6 +346,12 @@ def _set_workflow_manager(self):
341346
"\tramble list --type workflow_managers"
342347
)
343348

349+
if self.workflow_manager is not None:
350+
# Define any missing workflow manager variables
351+
for var, val in self.workflow_manager.selected_variables().items():
352+
if var not in self.variables:
353+
self.define_variable(var, val.default)
354+
344355
def set_success_list(self, success_criteria):
345356
self.success_list = ramble.success_criteria.ScopedCriteriaList()
346357

@@ -386,6 +397,26 @@ def set_env_variable_sets(self, env_variable_sets):
386397

387398
self._env_variable_sets = env_variable_sets.copy()
388399

400+
# Extract workload environment variable sets
401+
if self.expander.workload_name in self.workloads:
402+
workload = self.workloads[self.expander.workload_name]
403+
404+
new_env_vars = {}
405+
for env_var in workload.environment_variables.values():
406+
action = "set"
407+
value = env_var.value
408+
409+
add = True
410+
for env_var_set in self._env_variable_sets:
411+
if action in env_var_set:
412+
if env_var.name in env_var_set[action].keys():
413+
add = False
414+
415+
if add:
416+
new_env_vars[env_var.name] = value
417+
418+
self._env_variable_sets.append({"set": new_env_vars})
419+
389420
def set_variables(self, variables, experiment_set):
390421
"""Set internal reference to variables
391422
@@ -405,6 +436,11 @@ def set_variables(self, variables, experiment_set):
405436
if not var.expandable:
406437
self.no_expand_vars.add(var.name)
407438

439+
# Define missing workload variables
440+
for var, val in self.selected_variables().items():
441+
if var not in self.variables:
442+
self.define_variable(var, val.default)
443+
408444
self.expander.set_no_expand_vars(self.no_expand_vars)
409445

410446
def set_internals(self, internals):
@@ -928,6 +964,11 @@ def build_modifier_instances(self):
928964
self.expander.add_no_expand_var(var)
929965
mod_inst.expander.add_no_expand_var(var)
930966

967+
# Define any missing modifier variables
968+
for var, val in mod_inst.selected_variables().items():
969+
if var not in self.variables:
970+
self.define_variable(var, val.default)
971+
931972
# Set standard variants for all modifiers
932973
obj_variants = getattr(mod_inst, "object_variants", None)
933974
if obj_variants is not None:
@@ -1083,36 +1124,6 @@ def selected_variables(self):
10831124

10841125
return wl_vars
10851126

1086-
def _set_default_experiment_variables(self):
1087-
"""Set default experiment variables (for add_expand_vars),
1088-
if they haven't been set already"""
1089-
# Set default experiment variables, if they haven't been set already
1090-
1091-
# Define variables from var_sets
1092-
for _, obj in self._objects():
1093-
for var, val in obj.selected_variables().items():
1094-
if var not in self.variables:
1095-
self.define_variable(var, val.default)
1096-
1097-
if self.expander.workload_name in self.workloads:
1098-
workload = self.workloads[self.expander.workload_name]
1099-
1100-
new_env_vars = {}
1101-
for env_var in workload.environment_variables.values():
1102-
action = "set"
1103-
value = env_var.value
1104-
1105-
add = True
1106-
for env_var_set in self._env_variable_sets:
1107-
if action in env_var_set:
1108-
if env_var.name in env_var_set[action].keys():
1109-
add = False
1110-
1111-
if add:
1112-
new_env_vars[env_var.name] = value
1113-
1114-
self._env_variable_sets.append({"set": new_env_vars})
1115-
11161127
def _define_commands(self, exec_graph, success_list=None):
11171128
"""Populate the internal list of commands based on executables
11181129
@@ -1328,7 +1339,6 @@ def add_expand_vars(self, workspace):
13281339
if not self._vars_are_expanded:
13291340
self._validate_experiment()
13301341
self._executable_graph = self._get_executable_graph(self.expander.workload_name)
1331-
self._set_default_experiment_variables()
13321342
self._set_input_path()
13331343

13341344
self._derive_variables_for_template_path(workspace)

lib/ramble/ramble/test/application.py

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -382,15 +382,15 @@ def test_set_input_path_multi_input(mutable_mock_apps_repo):
382382
assert executable_application_instance.variables["test-input3"] == input3_path
383383

384384

385-
def test_set_default_experiment_variables(mutable_mock_apps_repo):
386-
"""_set_default_experiment_variables"""
385+
def test_set_variables(mutable_mock_apps_repo):
386+
"""Test that set_variables defines workload variables"""
387387

388388
executable_application_instance = mutable_mock_apps_repo.get("basic")
389389

390390
expansion_vars = basic_exp_dict()
391+
del expansion_vars["n_ranks"]
391392

392393
# Set up the instance to pass the initial part of the function
393-
executable_application_instance.expander = ramble.expander.Expander(expansion_vars, None)
394394

395395
test_wl = ramble.workload.Workload("test_wl", executables=["foo"], inputs=["input"])
396396
test_wl2 = ramble.workload.Workload("test_wl2", executables=["bar"], inputs=["input"])
@@ -400,9 +400,8 @@ def test_set_default_experiment_variables(mutable_mock_apps_repo):
400400
executable_application_instance.internals = {}
401401

402402
executable_application_instance.inputs[_FS] = {"input": {"target_dir": "."}}
403-
executable_application_instance.variables = {}
404403

405-
executable_application_instance._set_default_experiment_variables()
404+
executable_application_instance.set_variables(expansion_vars, None)
406405

407406
assert executable_application_instance.variables["n_ranks"] == "1"
408407

@@ -414,9 +413,6 @@ def test_define_commands(mutable_mock_apps_repo):
414413

415414
expansion_vars = basic_exp_dict()
416415

417-
# Set up the instance to pass the initial part of the function
418-
executable_application_instance.expander = ramble.expander.Expander(expansion_vars, None)
419-
420416
test_wl = ramble.workload.Workload("test_wl", executables=["foo"], inputs=["input"])
421417
test_wl2 = ramble.workload.Workload("test_wl2", executables=["bar"], inputs=["input"])
422418
test_wl2.add_variable(ramble.workload.WorkloadVariable("n_ranks", default="1"))
@@ -425,14 +421,13 @@ def test_define_commands(mutable_mock_apps_repo):
425421
executable_application_instance.internals = {}
426422

427423
executable_application_instance.inputs[_FS] = {"input": {"target_dir": "."}}
428-
executable_application_instance.variables = {}
424+
executable_application_instance.set_variables(expansion_vars, None)
429425

430426
exec_graph = executable_application_instance._get_executable_graph("test_wl2")
431427

432428
executable_application_instance.set_formatted_executables(
433429
{"command": {"join_separator": "\n"}}
434430
)
435-
executable_application_instance._set_default_experiment_variables()
436431

437432
executable_application_instance.chain_prepend = []
438433
executable_application_instance._define_commands(exec_graph)
@@ -484,9 +479,6 @@ def test_derive_variables_for_template_path(mutable_mock_apps_repo, workspace_na
484479

485480
expansion_vars = basic_exp_dict()
486481

487-
# Set up the instance to pass the initial part of the function
488-
executable_application_instance.expander = ramble.expander.Expander(expansion_vars, None)
489-
490482
test_wl = ramble.workload.Workload("test_wl", executables=["foo"], inputs=["input"])
491483
test_wl2 = ramble.workload.Workload("test_wl2", executables=["bar"], inputs=["input"])
492484
test_wl2.add_variable(ramble.workload.WorkloadVariable("n_ranks", default="1"))
@@ -495,12 +487,10 @@ def test_derive_variables_for_template_path(mutable_mock_apps_repo, workspace_na
495487
executable_application_instance.internals = {}
496488

497489
executable_application_instance.inputs[_FS] = {"input": {"target_dir": "."}}
498-
executable_application_instance.variables = {}
490+
executable_application_instance.set_variables(expansion_vars, None)
499491

500492
exec_graph = executable_application_instance._get_executable_graph("test_wl2")
501493

502-
executable_application_instance._set_default_experiment_variables()
503-
504494
executable_application_instance.chain_prepend = []
505495
executable_application_instance._define_commands(exec_graph)
506496
executable_application_instance._define_formatted_executables()

var/ramble/repos/builtin/package_managers/spack-lightweight/test/spack_runner.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,8 @@ def test_new_compiler_installs(tmpdir, capsys, request):
327327
import os
328328

329329
with tmpdir.as_cwd():
330+
# compilers.yaml is written to support older spack versions.
331+
# The compiler information was changed to exist in the packages.yaml file around v1.0.0
330332
compilers_config = """
331333
compilers::
332334
- compiler:
@@ -352,6 +354,11 @@ def test_new_compiler_installs(tmpdir, capsys, request):
352354
externals:
353355
- spec: [email protected] languages=c,fortran
354356
prefix: {os.getcwd()}
357+
extra_attributes:
358+
compilers:
359+
c: /tmpdir_path/gcc
360+
cxx: /tmpdir_path/g++
361+
fortran: /tmpdir_path/gfortran
355362
buildable: false
356363
"""
357364

var/ramble/repos/builtin/workflow_managers/google-batch/workflow_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __init__(self, file_path):
7171

7272
workflow_manager_variable(
7373
name="mpi_command",
74-
default="srun {srun_args}",
74+
default="mpirun -n {n_ranks}",
7575
description="mpirun prefix, mostly served as an overridable default",
7676
)
7777

0 commit comments

Comments
 (0)