@@ -28,9 +28,9 @@ from pathlib import Path
2828SBATCH_MAGIC = " #SBATCH"
2929
3030
31- class _SbatchOpt ():
32- def __init__ (self , short_opt , long_opt ,
33- our_attr_name , attr_param = None , is_boolean = False ,
31+ class SbatchOpt ():
32+ def __init__ (self , short_opt = None , long_opt = None ,
33+ our_attr_name = None , attr_param = None , is_boolean = False ,
3434 has_optional_args = False ):
3535 self .short_opt = short_opt
3636 self .long_opt = long_opt
@@ -39,102 +39,124 @@ class _SbatchOpt():
3939 self .is_boolean = is_boolean
4040 self .has_optional_args = has_optional_args
4141
42+ def set (self , val , desc , overwrite ):
43+ if self .our_attr_name is None :
44+ return None
45+
46+ if getattr (desc, self .our_attr_name) is None or overwrite:
47+ val = self .attr_param if val is None else val
48+ setattr (desc, self .our_attr_name, val)
49+
50+
51+ class SbatchOptGresFlags (SbatchOpt ):
52+
53+ def __init__ (self , *args , **kwargs ):
54+ super ().__init__(* args, ** kwargs)
55+
56+ def set (self , val , desc , overwrite ):
57+ for flag in val.split(" ," ):
58+ flag = flag.casefold()
59+
60+ if flag == " enforce-binding" or flag == " disable-binding" :
61+ if desc.gres_binding is None or overwrite:
62+ desc.gres_binding = flag
63+
4264
4365# Sorted by occurrence in the sbatch manpage - keep in order.
4466SBATCH_OPTIONS = [
45- _SbatchOpt (" A" , " account" , " account" ),
46- _SbatchOpt (None , " acctg-freq" , " accounting_gather_frequency" ),
47- _SbatchOpt (" a" , " array" , " array" ),
48- _SbatchOpt (None , " batch" , " batch_constraints" ),
49- _SbatchOpt (None , " bb" , " burst_buffer" ),
50- _SbatchOpt (None , " bbf" , " burst_buffer_file" ),
51- _SbatchOpt (" b" , " begin" , " begin_time" ),
52- _SbatchOpt (" D" , " chdir" , " working_directory" ),
53- _SbatchOpt (None , " cluster-constraint" , " cluster_constraints" ),
54- _SbatchOpt (" M" , " clusters" , " clusters" ),
55- _SbatchOpt (None , " comment" ," comment" ),
56- _SbatchOpt (" C" , " constraint" , " constraints" ),
57- _SbatchOpt (None , " container" , " container" ),
58- _SbatchOpt (None , " contiguous" , " requires_contiguous_nodes" ),
59- _SbatchOpt (" S" , " core-spec" , " cores_reserved_for_system" ),
60- _SbatchOpt (None , " cores-per-socket" , " cores_per_socket" ),
61- _SbatchOpt (None , " cpu-freq" , " cpu_frequency" ),
62- _SbatchOpt (None , " cpus-per-gpu" , " cpus_per_gpu" ),
63- _SbatchOpt (" c" , " cpus-per-task" , " cpus_per_task" ),
64- _SbatchOpt (None , " deadline" , " deadline" ),
65- _SbatchOpt (None , " delay-boot" , " delay_boot_time" ),
66- _SbatchOpt (" d" , " dependency" , " dependencies" ),
67- _SbatchOpt (" m" , " distribution" , " distribution" ),
68- _SbatchOpt (" e" , " error" , " standard_error" ),
69- _SbatchOpt (" x" , " exclude" , " excluded_nodes" ),
70- _SbatchOpt (None , " exclusive" , " resource_sharing" , " no" ),
71- _SbatchOpt (None , " export" , " environment" ),
72- _SbatchOpt (None , " export-file" , None ),
73- _SbatchOpt (" B" , " extra-node-info" , None ),
74- _SbatchOpt (None , " get-user-env" , " get_user_environment" ),
75- _SbatchOpt (None , " gid" , " group_id" ),
76- _SbatchOpt (None , " gpu-bind" , " gpu_binding" ),
77- _SbatchOpt (None , " gpu-freq" , None ),
78- _SbatchOpt (" G" , " gpus" , " gpus" ),
79- _SbatchOpt (None , " gpus-per-node" , " gpus_per_node" ),
80- _SbatchOpt (None , " gpus-per-socket" , " gpus_per_socket" ),
81- _SbatchOpt (None , " gpus-per-socket" , " gpus_per_task" ),
82- _SbatchOpt (None , " gres" , " gres_per_node" ),
83- _SbatchOpt (None , " gres-flags" , " gres_binding " ),
84- _SbatchOpt (None , " hint" , None ),
85- _SbatchOpt (" H" , " hold" , " priority" , 0 ),
86- _SbatchOpt (None , " ignore-pbs" , None ),
87- _SbatchOpt (" i" , " input" , " standard_in" ),
88- _SbatchOpt (" J" , " job-name" , " name" ),
89- _SbatchOpt (None , " kill-on-invalid-dep" , " kill_on_invalid_dependency" ),
90- _SbatchOpt (" L" , " licenses" , " licenses" ),
91- _SbatchOpt (None , " mail-type" , " mail_types" ),
92- _SbatchOpt (None , " mail-user" , " mail_user" ),
93- _SbatchOpt (None , " mcs-label" , " mcs_label" ),
94- _SbatchOpt (None , " mem" , " memory_per_node" ),
95- _SbatchOpt (None , " mem-bind" , None ),
96- _SbatchOpt (None , " mem-per-cpu" , " memory_per_cpu" ),
97- _SbatchOpt (None , " mem-per-gpu" , " memory_per_gpu" ),
98- _SbatchOpt (None , " mincpus" , " min_cpus_per_node" ),
99- _SbatchOpt (None , " network" , " network" ),
100- _SbatchOpt (None , " nice" , " nice" ),
101- _SbatchOpt (" k" , " no-kill" , " kill_on_node_fail" , False ),
102- _SbatchOpt (None , " no-requeue" , " is_requeueable" , False ),
103- _SbatchOpt (" F" , " nodefile" , None ),
104- _SbatchOpt (" w" , " nodelist" , " required_nodes" ),
105- _SbatchOpt (" N" , " nodes" , " nodes" ),
106- _SbatchOpt (" n" , " ntasks" , " ntasks" ),
107- _SbatchOpt (None , " ntasks-per-core" , " ntasks_per_core" ),
108- _SbatchOpt (None , " ntasks-per-gpu" , " ntasks_per_gpu" ),
109- _SbatchOpt (None , " ntasks-per-node" , " ntasks_per_node" ),
110- _SbatchOpt (None , " ntasks-per-socket" , " ntasks_per_socket" ),
111- _SbatchOpt (None , " open-mode" , " log_files_open_mode" ),
112- _SbatchOpt (" o" , " output" , " standard_output" ),
113- _SbatchOpt (" O" , " overcommit" , " overcommit" , True ),
114- _SbatchOpt (" s" , " oversubscribe" , " resource_sharing" , " yes" ),
115- _SbatchOpt (" p" , " partition" , " partition" ),
116- _SbatchOpt (None , " power" , " power_options" ),
117- _SbatchOpt (None , " prefer" , None ),
118- _SbatchOpt (None , " priority" , " priority" ),
119- _SbatchOpt (None , " profile" , " profile_types" ),
120- _SbatchOpt (None , " propagate" , None ),
121- _SbatchOpt (" q" , " qos" , " qos" ),
122- _SbatchOpt (None , " reboot" , " requires_node_reboot" , True ),
123- _SbatchOpt (None , " requeue" , " is_requeueable" , True ),
124- _SbatchOpt (None , " reservation" , " reservations" ),
125- _SbatchOpt (None , " signal" , " signal" ),
126- _SbatchOpt (None , " sockets-per-node" , " sockets_per_node" ),
127- _SbatchOpt (None , " spread-job" , " spreads_over_nodes" , True ),
128- _SbatchOpt (None , " switches" , " switches" ),
129- _SbatchOpt (None , " thread-spec" , " threads_reserved_for_system" ),
130- _SbatchOpt (None , " threads-per-core" , " threads_per_core" ),
131- _SbatchOpt (" t" , " time" , " time_limit" ),
132- _SbatchOpt (None , " time-min" , " time_limit_min" ),
133- _SbatchOpt (None , " tmp" , " temporary_disk_per_node" ),
134- _SbatchOpt (None , " uid" , " user_id" ),
135- _SbatchOpt (None , " use-min-nodes" , " use_min_nodes" , True ),
136- _SbatchOpt (None , " wait-all-nodes" , " wait_all_nodes" , True ),
137- _SbatchOpt (None , " wckey" , " wckey" ),
67+ SbatchOpt (" A" , " account" , " account" ),
68+ SbatchOpt (None , " acctg-freq" , " accounting_gather_frequency" ),
69+ SbatchOpt (" a" , " array" , " array" ),
70+ SbatchOpt (None , " batch" , " batch_constraints" ),
71+ SbatchOpt (None , " bb" , " burst_buffer" ),
72+ SbatchOpt (None , " bbf" , " burst_buffer_file" ),
73+ SbatchOpt (" b" , " begin" , " begin_time" ),
74+ SbatchOpt (" D" , " chdir" , " working_directory" ),
75+ SbatchOpt (None , " cluster-constraint" , " cluster_constraints" ),
76+ SbatchOpt (" M" , " clusters" , " clusters" ),
77+ SbatchOpt (None , " comment" ," comment" ),
78+ SbatchOpt (" C" , " constraint" , " constraints" ),
79+ SbatchOpt (None , " container" , " container" ),
80+ SbatchOpt (None , " contiguous" , " requires_contiguous_nodes" ),
81+ SbatchOpt (" S" , " core-spec" , " cores_reserved_for_system" ),
82+ SbatchOpt (None , " cores-per-socket" , " cores_per_socket" ),
83+ SbatchOpt (None , " cpu-freq" , " cpu_frequency" ),
84+ SbatchOpt (None , " cpus-per-gpu" , " cpus_per_gpu" ),
85+ SbatchOpt (" c" , " cpus-per-task" , " cpus_per_task" ),
86+ SbatchOpt (None , " deadline" , " deadline" ),
87+ SbatchOpt (None , " delay-boot" , " delay_boot_time" ),
88+ SbatchOpt (" d" , " dependency" , " dependencies" ),
89+ SbatchOpt (" m" , " distribution" , " distribution" ),
90+ SbatchOpt (" e" , " error" , " standard_error" ),
91+ SbatchOpt (" x" , " exclude" , " excluded_nodes" ),
92+ SbatchOpt (None , " exclusive" , " resource_sharing" , " no" ),
93+ SbatchOpt (None , " export" , " environment" ),
94+ SbatchOpt (None , " export-file" , None ),
95+ SbatchOpt (" B" , " extra-node-info" , None ),
96+ SbatchOpt (None , " get-user-env" , " get_user_environment" ),
97+ SbatchOpt (None , " gid" , " group_id" ),
98+ SbatchOpt (None , " gpu-bind" , " gpu_binding" ),
99+ SbatchOpt (None , " gpu-freq" , None ),
100+ SbatchOpt (" G" , " gpus" , " gpus" ),
101+ SbatchOpt (None , " gpus-per-node" , " gpus_per_node" ),
102+ SbatchOpt (None , " gpus-per-socket" , " gpus_per_socket" ),
103+ SbatchOpt (None , " gpus-per-socket" , " gpus_per_task" ),
104+ SbatchOpt (None , " gres" , " gres_per_node" ),
105+ SbatchOptGresFlags (None , " gres-flags" ),
106+ SbatchOpt (None , " hint" , None ),
107+ SbatchOpt (" H" , " hold" , " priority" , 0 ),
108+ SbatchOpt (None , " ignore-pbs" , None ),
109+ SbatchOpt (" i" , " input" , " standard_in" ),
110+ SbatchOpt (" J" , " job-name" , " name" ),
111+ SbatchOpt (None , " kill-on-invalid-dep" , " kill_on_invalid_dependency" ),
112+ SbatchOpt (" L" , " licenses" , " licenses" ),
113+ SbatchOpt (None , " mail-type" , " mail_types" ),
114+ SbatchOpt (None , " mail-user" , " mail_user" ),
115+ SbatchOpt (None , " mcs-label" , " mcs_label" ),
116+ SbatchOpt (None , " mem" , " memory_per_node" ),
117+ SbatchOpt (None , " mem-bind" , None ),
118+ SbatchOpt (None , " mem-per-cpu" , " memory_per_cpu" ),
119+ SbatchOpt (None , " mem-per-gpu" , " memory_per_gpu" ),
120+ SbatchOpt (None , " mincpus" , " min_cpus_per_node" ),
121+ SbatchOpt (None , " network" , " network" ),
122+ SbatchOpt (None , " nice" , " nice" ),
123+ SbatchOpt (" k" , " no-kill" , " kill_on_node_fail" , False ),
124+ SbatchOpt (None , " no-requeue" , " is_requeueable" , False ),
125+ SbatchOpt (" F" , " nodefile" , None ),
126+ SbatchOpt (" w" , " nodelist" , " required_nodes" ),
127+ SbatchOpt (" N" , " nodes" , " nodes" ),
128+ SbatchOpt (" n" , " ntasks" , " ntasks" ),
129+ SbatchOpt (None , " ntasks-per-core" , " ntasks_per_core" ),
130+ SbatchOpt (None , " ntasks-per-gpu" , " ntasks_per_gpu" ),
131+ SbatchOpt (None , " ntasks-per-node" , " ntasks_per_node" ),
132+ SbatchOpt (None , " ntasks-per-socket" , " ntasks_per_socket" ),
133+ SbatchOpt (None , " open-mode" , " log_files_open_mode" ),
134+ SbatchOpt (" o" , " output" , " standard_output" ),
135+ SbatchOpt (" O" , " overcommit" , " overcommit" , True ),
136+ SbatchOpt (" s" , " oversubscribe" , " resource_sharing" , " yes" ),
137+ SbatchOpt (" p" , " partition" , " partition" ),
138+ SbatchOpt (None , " power" , " power_options" ),
139+ SbatchOpt (None , " prefer" , None ),
140+ SbatchOpt (None , " priority" , " priority" ),
141+ SbatchOpt (None , " profile" , " profile_types" ),
142+ SbatchOpt (None , " propagate" , None ),
143+ SbatchOpt (" q" , " qos" , " qos" ),
144+ SbatchOpt (None , " reboot" , " requires_node_reboot" , True ),
145+ SbatchOpt (None , " requeue" , " is_requeueable" , True ),
146+ SbatchOpt (None , " reservation" , " reservations" ),
147+ SbatchOpt (None , " signal" , " signal" ),
148+ SbatchOpt (None , " sockets-per-node" , " sockets_per_node" ),
149+ SbatchOpt (None , " spread-job" , " spreads_over_nodes" , True ),
150+ SbatchOpt (None , " switches" , " switches" ),
151+ SbatchOpt (None , " thread-spec" , " threads_reserved_for_system" ),
152+ SbatchOpt (None , " threads-per-core" , " threads_per_core" ),
153+ SbatchOpt (" t" , " time" , " time_limit" ),
154+ SbatchOpt (None , " time-min" , " time_limit_min" ),
155+ SbatchOpt (None , " tmp" , " temporary_disk_per_node" ),
156+ SbatchOpt (None , " uid" , " user_id" ),
157+ SbatchOpt (None , " use-min-nodes" , " use_min_nodes" , True ),
158+ SbatchOpt (None , " wait-all-nodes" , " wait_all_nodes" , True ),
159+ SbatchOpt (None , " wckey" , " wckey" ),
138160]
139161
140162
@@ -178,7 +200,7 @@ def _find_opt(opt):
178200 if opt == sbopt.short_opt or opt == sbopt.long_opt:
179201 return sbopt
180202
181- return None
203+ return SbatchOpt()
182204
183205
184206def _parse_opts_from_batch_script (desc , script , overwrite ):
@@ -194,11 +216,4 @@ def _parse_opts_from_batch_script(desc, script, overwrite):
194216 if line.startswith(SBATCH_MAGIC):
195217 flag, val = _parse_line(line)
196218 opt = _find_opt(flag)
197-
198- if not opt or opt.our_attr_name is None :
199- # Not supported
200- continue
201-
202- if getattr (desc, opt.our_attr_name) is None or overwrite:
203- val = opt.attr_param if val is None else val
204- setattr (desc, opt.our_attr_name, val)
219+ opt.set(val, desc, overwrite)
0 commit comments