Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions reframe/core/schedulers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -334,3 +334,9 @@ def finished(self):
raise JobNotStartedError('cannot poll an unstarted job')

return self.scheduler.finished(self)


class Node(abc.ABC):
@abc.abstractmethod
def is_available(self):
'''Return ``True`` if this node is available, ``False`` otherwise.'''
12 changes: 10 additions & 2 deletions reframe/core/schedulers/local.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ def emit_preamble(self, job):
return []

def allnodes(self):
return [socket.gethostname()]
return [_LocalNode(socket.gethostname())]

def filternodes(self, job, nodes):
return [socket.gethostname()]
return [_LocalNode(socket.gethostname())]

def _kill_all(self, job):
'''Send SIGKILL to all the processes of the spawned job.'''
Expand Down Expand Up @@ -169,3 +169,11 @@ def finished(self, job):
return False

return True


class _LocalNode(sched.Node):
def __init__(self, name):
self._name = name

def is_available(self):
return True
12 changes: 6 additions & 6 deletions reframe/core/schedulers/slurm.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ def allnodes(self):
raise JobError('could not retrieve node information') from e

node_descriptions = completed.stdout.splitlines()
return create_nodes(node_descriptions)
return _create_nodes(node_descriptions)

def _get_default_partition(self):
completed = _run_strict('scontrol -a show -o partitions')
Expand Down Expand Up @@ -272,13 +272,13 @@ def _get_reservation_nodes(self, reservation):

completed = _run_strict('scontrol -a show -o %s' % reservation_nodes)
node_descriptions = completed.stdout.splitlines()
return create_nodes(node_descriptions)
return _create_nodes(node_descriptions)

def _get_nodes_by_name(self, nodespec):
completed = os_ext.run_command('scontrol -a show -o node %s' %
nodespec)
node_descriptions = completed.stdout.splitlines()
return create_nodes(node_descriptions)
return _create_nodes(node_descriptions)

def _set_nodelist(self, job, nodespec):
if job.nodelist is not None:
Expand Down Expand Up @@ -485,16 +485,16 @@ def cancel(self, job):
self._cancelled = True


def create_nodes(descriptions):
def _create_nodes(descriptions):
nodes = set()
for descr in descriptions:
with suppress(JobError):
nodes.add(SlurmNode(descr))
nodes.add(_SlurmNode(descr))

return nodes


class SlurmNode:
class _SlurmNode(sched.Node):
'''Class representing a Slurm node.'''

def __init__(self, node_descr):
Expand Down
24 changes: 15 additions & 9 deletions unittests/test_schedulers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from reframe.core.launchers.registry import getlauncher
from reframe.core.schedulers import Job
from reframe.core.schedulers.registry import getscheduler
from reframe.core.schedulers.slurm import SlurmNode, create_nodes
from reframe.core.schedulers.slurm import _SlurmNode, _create_nodes


class _TestJob(abc.ABC):
Expand Down Expand Up @@ -304,8 +304,14 @@ def test_cancel_term_ignore(self):
self.assertProcessDied(sleep_pid)

def test_guess_num_tasks(self):
# We want to trigger bug #1087 (Github), that's we set allocation
# policy to idle.
self.testjob.num_tasks = 0
assert self.testjob.guess_num_tasks() == 1
self.testjob._sched_flex_alloc_nodes = 'idle'
self.prepare()
self.testjob.submit()
self.testjob.wait()
assert self.testjob.num_tasks == 1


class TestSlurmJob(_TestJob, unittest.TestCase):
Expand Down Expand Up @@ -611,7 +617,7 @@ def create_dummy_nodes(obj):

'Node invalid_node2 not found']

return create_nodes(node_descriptions)
return _create_nodes(node_descriptions)

def create_reservation_nodes(self, res):
return {n for n in self.testjob.scheduler.allnodes()
Expand Down Expand Up @@ -906,15 +912,15 @@ def setUp(self):
'failed [reframe_user@01 Jan 2018]'
)

self.allocated_node = SlurmNode(allocated_node_description)
self.allocated_node_copy = SlurmNode(allocated_node_description)
self.idle_node = SlurmNode(idle_node_description)
self.idle_drained = SlurmNode(idle_drained_node_description)
self.no_partition_node = SlurmNode(no_partition_node_description)
self.allocated_node = _SlurmNode(allocated_node_description)
self.allocated_node_copy = _SlurmNode(allocated_node_description)
self.idle_node = _SlurmNode(idle_node_description)
self.idle_drained = _SlurmNode(idle_drained_node_description)
self.no_partition_node = _SlurmNode(no_partition_node_description)

def test_no_node_name(self):
with self.assertRaises(JobError):
SlurmNode(self.no_name_node_description)
_SlurmNode(self.no_name_node_description)

def test_states(self):
self.assertEqual(self.allocated_node.states, {'ALLOCATED'})
Expand Down