@@ -147,7 +147,13 @@ def __init__(self):
147147 self ._sched_access_in_submit = self .get_option (
148148 'sched_access_in_submit'
149149 )
150- self .addl_avail_states = set ()
150+ self .node_available_states = {
151+ 'ALLOCATED' ,
152+ 'COMPLETING' ,
153+ 'IDLE' ,
154+ 'PLANNED' ,
155+ 'RESERVED'
156+ }
151157
152158 def make_job (self , * args , ** kwargs ):
153159 return _SlurmJob (* args , ** kwargs )
@@ -324,7 +330,7 @@ def allnodes(self):
324330 'could not retrieve node information' ) from e
325331
326332 node_descriptions = completed .stdout .splitlines ()
327- return _create_nodes (node_descriptions , self . addl_avail_states )
333+ return _create_nodes (node_descriptions )
328334
329335 def _get_default_partition (self ):
330336 completed = _run_strict ('scontrol -a show -o partitions' )
@@ -440,20 +446,20 @@ def _get_reservation_nodes(self, reservation):
440446 flags_match = re .search (r'Flags=(\S+)' , completed .stdout )
441447 if flags_match :
442448 if 'MAINT' in flags_match [1 ].split (',' ):
443- self .addl_avail_states .add ('MAINTENANCE' )
449+ self .node_available_states .add ('MAINTENANCE' )
444450 else :
445451 self .log (f"could not extract the reservation flags for "
446452 f"reservation '{ reservation } '" )
447453
448454 completed = _run_strict ('scontrol -a show -o %s' % reservation_nodes )
449455 node_descriptions = completed .stdout .splitlines ()
450- return _create_nodes (node_descriptions , self . addl_avail_states )
456+ return _create_nodes (node_descriptions )
451457
452458 def _get_nodes_by_name (self , nodespec ):
453459 completed = osext .run_command ('scontrol -a show -o node %s' %
454460 nodespec )
455461 node_descriptions = completed .stdout .splitlines ()
456- return _create_nodes (node_descriptions , self . addl_avail_states )
462+ return _create_nodes (node_descriptions )
457463
458464 def _update_completion_time (self , job , timestamps ):
459465 if job ._completion_time is not None :
@@ -603,7 +609,7 @@ def _do_cancel_if_blocked(self, job, reason_descr):
603609 self .log (f'Checking if nodes { node_names !r} '
604610 f'are indeed unavailable' )
605611 nodes = self ._get_nodes_by_name (node_names )
606- if not any (n . is_down ( ) for n in nodes ):
612+ if not any (self . is_node_down ( n ) for n in nodes ):
607613 return
608614
609615 self .cancel (job )
@@ -639,6 +645,12 @@ def cancel(self, job):
639645 def finished (self , job ):
640646 return slurm_state_completed (job .state )
641647
648+ def is_node_avail (self , node ):
649+ return node .states <= self .node_available_states
650+
651+ def is_node_down (self , node ):
652+ return not self .is_node_avail (node )
653+
642654
643655@register_scheduler ('squeue' )
644656class SqueueJobScheduler (SlurmJobScheduler ):
@@ -700,19 +712,19 @@ def poll(self, *jobs):
700712 self ._cancel_if_pending_too_long (job )
701713
702714
703- def _create_nodes (descriptions , addl_avail_states = None ):
715+ def _create_nodes (descriptions ):
704716 nodes = set ()
705717 for descr in descriptions :
706718 with suppress (JobSchedulerError ):
707- nodes .add (_SlurmNode (descr , addl_avail_states = addl_avail_states ))
719+ nodes .add (_SlurmNode (descr ))
708720
709721 return nodes
710722
711723
712724class _SlurmNode (sched .Node ):
713725 '''Class representing a Slurm node.'''
714726
715- def __init__ (self , node_descr , addl_avail_states = None ):
727+ def __init__ (self , node_descr ):
716728 self ._name = self ._extract_attribute ('NodeName' , node_descr )
717729 if not self ._name :
718730 raise JobSchedulerError (
@@ -727,15 +739,6 @@ def __init__(self, node_descr, addl_avail_states=None):
727739 'State' , node_descr , sep = '+' ) or set ()
728740 self ._descr = node_descr
729741
730- self .addl_avail_states = addl_avail_states or set ()
731- self .available_states = {
732- 'ALLOCATED' ,
733- 'COMPLETING' ,
734- 'IDLE' ,
735- 'PLANNED' ,
736- 'RESERVED'
737- } | self .addl_avail_states
738-
739742 def __eq__ (self , other ):
740743 if not isinstance (other , type (self )):
741744 return NotImplemented
@@ -752,12 +755,6 @@ def in_state(self, state):
752755 def in_statex (self , state ):
753756 return self ._states == set (state .upper ().split ('+' ))
754757
755- def is_avail (self ):
756- return self ._states <= self .available_states
757-
758- def is_down (self ):
759- return not self .is_avail ()
760-
761758 def satisfies (self , slurm_constraint ):
762759 # Convert the Slurm constraint to a Python expression and evaluate it,
763760 # but restrict our syntax to accept only AND or OR constraints and
0 commit comments