1515
1616class EnvBatch (EnvBase ):
1717
18- def __init__ (self , case_root = None , infile = "env_batch.xml" ):
18+ def __init__ (self , case_root = None , infile = "env_batch.xml" , schema = None ):
1919 """
2020 initialize an object interface to file env_batch.xml in the case directory
2121 """
2222 self ._batchtype = None
2323 # This arbitrary setting should always be overwritten
2424 self ._default_walltime = "00:20:00"
25- schema = os .path .join (get_cime_root (), "config" , "xml_schemas" , "env_batch.xsd" )
25+ if not schema :
26+ schema = os .path .join (get_cime_root (), "config" , "xml_schemas" , "env_batch.xsd" )
2627 super (EnvBatch ,self ).__init__ (case_root , infile , schema = schema )
2728
2829 # pylint: disable=arguments-differ
@@ -32,21 +33,6 @@ def set_value(self, item, value, subgroup=None, ignore_type=False):
3233 """
3334 val = None
3435
35- if item == "JOB_WALLCLOCK_TIME" :
36- #Most systems use %H:%M:%S format for wallclock but LSF
37- #uses %H:%M this code corrects the value passed in to be
38- #the correct format - if we find we have more exceptions
39- #than this we may need to generalize this further
40- walltime_format = self .get_value ("walltime_format" , subgroup = None )
41- if walltime_format is not None and walltime_format .count (":" ) != value .count (":" ): # pylint: disable=maybe-no-member
42- if value .count (":" ) == 1 :
43- t_spec = "%H:%M"
44- elif value .count (":" ) == 2 :
45- t_spec = "%H:%M:%S"
46- else :
47- expect (False , "could not interpret format for wallclock time {}" .format (value ))
48- value = format_time (walltime_format , t_spec , value )
49-
5036 if item == "JOB_QUEUE" :
5137 expect (value in self ._get_all_queue_names () or ignore_type ,
5238 "Unknown Job Queue specified use --force to set" )
@@ -214,14 +200,16 @@ def make_batch_script(self, input_template, job, case, outfile=None):
214200 # make sure batch script is exectuble
215201 os .chmod (output_name , os .stat (output_name ).st_mode | stat .S_IXUSR | stat .S_IXGRP | stat .S_IXOTH )
216202
217- def set_job_defaults (self , batch_jobs , case ):
203+ def set_job_defaults (self , batch_jobs , case , env_workflow = None ):
218204 if self ._batchtype is None :
219205 self ._batchtype = self .get_batch_system_type ()
220206
221207 if self ._batchtype == "none" :
222208 return
223-
224- known_jobs = self .get_jobs ()
209+ if env_workflow :
210+ known_jobs = env_workflow .get_jobs ()
211+ else :
212+ known_jobs = self .get_jobs ()
225213
226214 for job , jsect in batch_jobs :
227215 if job not in known_jobs :
@@ -281,9 +269,12 @@ def set_job_defaults(self, batch_jobs, case):
281269 walltime = specs [3 ]
282270
283271 walltime = self ._default_walltime if walltime is None else walltime # last-chance fallback
284-
285- self .set_value ("JOB_QUEUE" , queue , subgroup = job , ignore_type = specs is None )
286- self .set_value ("JOB_WALLCLOCK_TIME" , walltime , subgroup = job )
272+ if env_workflow :
273+ env_workflow .set_value ("JOB_QUEUE" , queue , subgroup = job , ignore_type = specs is None )
274+ env_workflow .set_value ("JOB_WALLCLOCK_TIME" , walltime , subgroup = job )
275+ else :
276+ self .set_value ("JOB_QUEUE" , queue , subgroup = job , ignore_type = specs is None )
277+ self .set_value ("JOB_WALLCLOCK_TIME" , walltime , subgroup = job )
287278 logger .debug ("Job {} queue {} walltime {}" .format (job , queue , walltime ))
288279
289280 def _match_attribs (self , attribs , case , queue ):
@@ -426,8 +417,11 @@ def get_submit_args(self, case, job):
426417
427418 def submit_jobs (self , case , no_batch = False , job = None , user_prereq = None , skip_pnl = False ,
428419 allow_fail = False , resubmit_immediate = False , mail_user = None , mail_type = None ,
429- batch_args = None , dry_run = False ):
430- alljobs = self .get_jobs ()
420+ batch_args = None , dry_run = False , runwithcylc = False ):
421+ if runwithcylc :
422+ alljobs = [job ]
423+ else :
424+ alljobs = self .get_jobs ()
431425 startindex = 0
432426 jobs = []
433427 firstjob = job
@@ -439,15 +433,20 @@ def submit_jobs(self, case, no_batch=False, job=None, user_prereq=None, skip_pnl
439433 logger .debug ( "Index {:d} job {} startindex {:d}" .format (index , job , startindex ))
440434 if index < startindex :
441435 continue
442- try :
443- prereq = self .get_value ('prereq' , subgroup = job , resolved = False )
444- if prereq is None or job == firstjob or (dry_run and prereq == "$BUILD_COMPLETE" ):
445- prereq = True
446- else :
447- prereq = case .get_resolved_value (prereq )
448- prereq = eval (prereq )
449- except :
450- expect (False ,"Unable to evaluate prereq expression '{}' for job '{}'" .format (self .get_value ('prereq' ,subgroup = job ), job ))
436+ jobfile = get_batch_script_for_job (job )
437+ if not os .path .isfile (jobfile ):
438+ logger .info ("Jobfile {} not found in case, skipping job step" .format (jobfile ))
439+ prereq = False
440+ else :
441+ try :
442+ prereq = self .get_value ('prereq' , subgroup = job , resolved = False )
443+ if prereq is None or job == firstjob or (dry_run and prereq == "$BUILD_COMPLETE" ):
444+ prereq = True
445+ else :
446+ prereq = case .get_resolved_value (prereq )
447+ prereq = eval (prereq )
448+ except :
449+ expect (False ,"Unable to evaluate prereq expression '{}' for job '{}'" .format (self .get_value ('prereq' ,subgroup = job ), job ))
451450
452451 if prereq :
453452 jobs .append ((job , self .get_value ('dependency' , subgroup = job )))
@@ -489,7 +488,7 @@ def submit_jobs(self, case, no_batch=False, job=None, user_prereq=None, skip_pnl
489488 resubmit_immediate = resubmit_immediate ,
490489 dep_jobs = dep_jobs ,
491490 allow_fail = allow_fail ,
492- no_batch = no_batch ,
491+ no_batch = no_batch or runwithcylc ,
493492 mail_user = mail_user ,
494493 mail_type = mail_type ,
495494 batch_args = batch_args ,
@@ -874,6 +873,14 @@ def make_all_batch_files(self, case):
874873 machdir = case .get_value ("MACHDIR" )
875874 logger .info ("Creating batch scripts" )
876875 for job in self .get_jobs ():
877- input_batch_script = os .path .join (machdir ,self .get_value ('template' , subgroup = job ))
878- logger .info ("Writing {} script from input template {}" .format (job , input_batch_script ))
879- self .make_batch_script (input_batch_script , job , case )
876+ template = self .get_value ('template' , subgroup = job )
877+ template = template .replace ('$CASEROOT' , self ._caseroot )
878+ if os .path .isabs (template ):
879+ input_batch_script = template
880+ else :
881+ input_batch_script = os .path .join (machdir ,template )
882+ if os .path .isfile (input_batch_script ):
883+ logger .info ("Writing {} script from input template {}" .format (job , input_batch_script ))
884+ self .make_batch_script (input_batch_script , job , case )
885+ else :
886+ logger .warning ("Input template file {} for job {} does not exist or cannot be read." .format (input_batch_script , job ))
0 commit comments