Skip to content

Commit 2776043

Browse files
authored
Merge pull request #4679 from jedwards4b/refine_hidden_workflow_flag
improve functionality of hidden workflow flag
2 parents 0cc20bf + b05eada commit 2776043

File tree

2 files changed

+47
-51
lines changed

2 files changed

+47
-51
lines changed

CIME/XML/env_batch.py

Lines changed: 35 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ def __init__(self, case_root=None, infile="env_batch.xml", read_only=False):
3232
initialize an object interface to file env_batch.xml in the case directory
3333
"""
3434
self._batchtype = None
35-
self._hidden_batch_script = {}
3635
# This arbitrary setting should always be overwritten
3736
self._default_walltime = "00:20:00"
3837
schema = os.path.join(utils.get_schema_path(), "env_batch.xsd")
3938
super(EnvBatch, self).__init__(
4039
case_root, infile, schema=schema, read_only=read_only
4140
)
4241
self._batchtype = self.get_batch_system_type()
42+
self._env_workflow = None
4343

4444
# pylint: disable=arguments-differ
4545
def set_value(self, item, value, subgroup=None, ignore_type=False):
@@ -205,14 +205,16 @@ def set_batch_system(self, batchobj, batch_system_type=None):
205205
lock_file(os.path.basename(batchobj.filename), self._caseroot)
206206

207207
def get_job_overrides(self, job, case):
208-
env_workflow = case.get_env("workflow")
208+
if not self._env_workflow:
209+
self._env_workflow = case.get_env("workflow")
209210
(
210211
total_tasks,
211212
num_nodes,
212213
tasks_per_node,
213214
thread_count,
214215
ngpus_per_node,
215-
) = env_workflow.get_job_specs(case, job)
216+
) = self._env_workflow.get_job_specs(case, job)
217+
216218
overrides = {}
217219

218220
if total_tasks:
@@ -258,27 +260,12 @@ def make_batch_script(self, input_template, job, case, outfile=None):
258260
subgroup=job,
259261
overrides=overrides,
260262
)
261-
env_workflow = case.get_env("workflow")
262-
263-
hidden = env_workflow.get_value("hidden", subgroup=job)
264-
# case.st_archive is not hidden for backward compatibility
265-
if (
266-
(job != "case.st_archive" and hidden is None)
267-
or hidden == "True"
268-
or hidden == "true"
269-
):
270-
self._hidden_batch_script[job] = True
271-
else:
272-
self._hidden_batch_script[job] = False
263+
if not self._env_workflow:
264+
self._env_workflow = case.get_env("workflow")
273265

274266
output_name = (
275267
get_batch_script_for_job(
276-
job,
277-
hidden=(
278-
self._hidden_batch_script[job]
279-
if job in self._hidden_batch_script
280-
else None
281-
),
268+
job, hidden=self._env_workflow.hidden_job(case, job)
282269
)
283270
if outfile is None
284271
else outfile
@@ -299,8 +286,10 @@ def set_job_defaults(self, batch_jobs, case):
299286

300287
if self._batchtype == "none":
301288
return
302-
env_workflow = case.get_env("workflow")
303-
known_jobs = env_workflow.get_jobs()
289+
290+
if not self._env_workflow:
291+
self._env_workflow = case.get_env("workflow")
292+
known_jobs = self._env_workflow.get_jobs()
304293

305294
for job, jsect in batch_jobs:
306295
if job not in known_jobs:
@@ -457,11 +446,13 @@ def set_job_defaults(self, batch_jobs, case):
457446
seconds = convert_to_seconds(walltime)
458447
full_bab_time = convert_to_babylonian_time(seconds)
459448
walltime = format_time(walltime_format, "%H:%M:%S", full_bab_time)
449+
if not self._env_workflow:
450+
self._env_workflow = case.get_env("workflow")
460451

461-
env_workflow.set_value(
452+
self._env_workflow.set_value(
462453
"JOB_QUEUE", self.text(queue), subgroup=job, ignore_type=False
463454
)
464-
env_workflow.set_value("JOB_WALLCLOCK_TIME", walltime, subgroup=job)
455+
self._env_workflow.set_value("JOB_WALLCLOCK_TIME", walltime, subgroup=job)
465456
logger.debug(
466457
"Job {} queue {} walltime {}".format(job, self.text(queue), walltime)
467458
)
@@ -764,20 +755,19 @@ def submit_jobs(
764755
waiting to resubmit at the end of the first sequence
765756
workflow is a logical indicating whether only "job" is submitted or the workflow sequence starting with "job" is submitted
766757
"""
767-
env_workflow = case.get_env("workflow")
758+
768759
external_workflow = case.get_value("EXTERNAL_WORKFLOW")
769-
alljobs = env_workflow.get_jobs()
760+
if not self._env_workflow:
761+
self._env_workflow = case.get_env("workflow")
762+
alljobs = self._env_workflow.get_jobs()
770763
alljobs = [
771764
j
772765
for j in alljobs
773766
if os.path.isfile(
774767
os.path.join(
775768
self._caseroot,
776769
get_batch_script_for_job(
777-
j,
778-
hidden=self._hidden_batch_script[j]
779-
if j in self._hidden_batch_script
780-
else None,
770+
j, hidden=self._env_workflow.hidden_job(case, j)
781771
),
782772
)
783773
)
@@ -796,7 +786,9 @@ def submit_jobs(
796786
if index < startindex:
797787
continue
798788
try:
799-
prereq = env_workflow.get_value("prereq", subgroup=job, resolved=False)
789+
prereq = self._env_workflow.get_value(
790+
"prereq", subgroup=job, resolved=False
791+
)
800792
if (
801793
external_workflow
802794
or prereq is None
@@ -815,7 +807,9 @@ def submit_jobs(
815807
),
816808
)
817809
if prereq:
818-
jobs.append((job, env_workflow.get_value("dependency", subgroup=job)))
810+
jobs.append(
811+
(job, self._env_workflow.get_value("dependency", subgroup=job))
812+
)
819813

820814
if self._batchtype == "cobalt":
821815
break
@@ -1100,6 +1094,7 @@ def _submit_single_job(
11001094
set_continue_run=resubmit_immediate,
11011095
submit_resubmits=workflow and not resubmit_immediate,
11021096
)
1097+
11031098
if batch_system == "lsf" and not batch_env_flag:
11041099
sequence = (
11051100
run_args,
@@ -1108,11 +1103,7 @@ def _submit_single_job(
11081103
batchredirect,
11091104
get_batch_script_for_job(
11101105
job,
1111-
hidden=(
1112-
self._hidden_batch_script[job]
1113-
if job in self._hidden_batch_script
1114-
else None
1115-
),
1106+
hidden=self._env_workflow.hidden_job(case, job),
11161107
),
11171108
)
11181109
elif batch_env_flag:
@@ -1125,11 +1116,7 @@ def _submit_single_job(
11251116
self._caseroot,
11261117
get_batch_script_for_job(
11271118
job,
1128-
hidden=(
1129-
self._hidden_batch_script[job]
1130-
if job in self._hidden_batch_script
1131-
else None
1132-
),
1119+
hidden=self._env_workflow.hidden_job(case, job),
11331120
),
11341121
),
11351122
)
@@ -1142,11 +1129,7 @@ def _submit_single_job(
11421129
self._caseroot,
11431130
get_batch_script_for_job(
11441131
job,
1145-
hidden=(
1146-
self._hidden_batch_script[job]
1147-
if job in self._hidden_batch_script
1148-
else None
1149-
),
1132+
hidden=self._env_workflow.hidden_job(case, job),
11501133
),
11511134
),
11521135
run_args,
@@ -1439,12 +1422,13 @@ def compare_xml(self, other):
14391422

14401423
def make_all_batch_files(self, case):
14411424
machdir = case.get_value("MACHDIR")
1442-
env_workflow = case.get_env("workflow")
14431425
logger.info("Creating batch scripts")
1444-
jobs = env_workflow.get_jobs()
1426+
if not self._env_workflow:
1427+
self._env_workflow = case.get_env("workflow")
1428+
jobs = self._env_workflow.get_jobs()
14451429
for job in jobs:
14461430
template = case.get_resolved_value(
1447-
env_workflow.get_value("template", subgroup=job)
1431+
self._env_workflow.get_value("template", subgroup=job)
14481432
)
14491433
if os.path.isabs(template):
14501434
input_batch_script = template

CIME/XML/env_workflow.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from CIME.XML.standard_module_setup import *
66
from CIME.XML.env_base import EnvBase
77
from CIME.utils import get_cime_root
8+
89
import re, math
910

1011
logger = logging.getLogger(__name__)
@@ -21,6 +22,7 @@ def __init__(self, case_root=None, infile="env_workflow.xml", read_only=False):
2122
# schema = os.path.join(get_cime_root(), "CIME", "config", "xml_schemas", "env_workflow.xsd")
2223
# TODO: define schema for this file
2324
schema = None
25+
self._hidden = {}
2426
super(EnvWorkflow, self).__init__(
2527
case_root, infile, schema=schema, read_only=read_only
2628
)
@@ -89,7 +91,17 @@ def get_type_info(self, vid):
8991
)
9092
return type_info
9193

94+
def hidden_job(self, case, job):
95+
if job not in self._hidden:
96+
self.get_job_specs(case, job)
97+
return self._hidden[job]
98+
9299
def get_job_specs(self, case, job):
100+
hidden = self.get_value("hidden", subgroup=job)
101+
self._hidden[job] = (hidden is None and job != "case.st_archive") or (
102+
hidden is not None and hidden.lower() == "true"
103+
)
104+
93105
task_count = case.get_resolved_value(self.get_value("task_count", subgroup=job))
94106
tasks_per_node = case.get_resolved_value(
95107
self.get_value("tasks_per_node", subgroup=job)

0 commit comments

Comments
 (0)