Skip to content

Commit 68780fc

Browse files
committed
Addes tests and changed the way to generate for Hades.
1 parent e1db348 commit 68780fc

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

smartdispatch/job_generator.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,14 @@ def generate_pbs(self):
116116
class HadesJobGenerator(JobGenerator):
117117

118118
def generate_pbs(self):
119-
self.queue.nb_cpus_per_node = self.queue.nb_gpus_per_node
120-
self.queue.nb_gpus_per_node = 0
121-
# Hades does not follow gpus standard and use ppn instead
119+
pbs_list = JobGenerator.generate_pbs(self)
120+
121+
for pbs in pbs_list:
122+
gpus = re.match(".*gpus=([0-9]+)", pbs.resources['nodes']).group(1)
123+
pbs.resources['nodes'] = re.sub("ppn=[0-9]+", "ppn={}".format(gpus), pbs.resources['nodes'])
124+
pbs.resources['nodes'] = re.sub(":gpus=[0-9]+", "", pbs.resources['nodes'])
122125

123-
return JobGenerator.generate_pbs(self)
126+
return pbs_list
124127

125128

126129
class GuilliminJobGenerator(JobGenerator):

smartdispatch/tests/test_job_generator.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
from nose.tools import assert_true, assert_false, assert_equal, assert_raises
22

33
import os
4-
from smartdispatch.queue import Queue
5-
from smartdispatch.job_generator import JobGenerator, GuilliminJobGenerator, MammouthJobGenerator, HeliosJobGenerator
6-
from smartdispatch.job_generator import job_generator_factory
74
import unittest
85
import tempfile
96
import shutil
7+
from smartdispatch.queue import Queue
8+
from smartdispatch.job_generator import JobGenerator, job_generator_factory
9+
from smartdispatch.job_generator import HeliosJobGenerator, HadesJobGenerator
10+
from smartdispatch.job_generator import GuilliminJobGenerator, MammouthJobGenerator
1011

1112

1213
class TestJobGenerator(unittest.TestCase):
@@ -165,6 +166,36 @@ def test_generate_pbs_odd_nb_commands(self):
165166
assert_true("gpus=6" in job_generator.generate_pbs()[0].__str__())
166167

167168

169+
class TestHadesQueue(unittest.TestCase):
170+
171+
def setUp(self):
172+
self.queue = Queue("@hades", "hades")
173+
174+
self.commands4 = ["echo 1", "echo 2", "echo 3", "echo 4"]
175+
self.pbs4 = HadesJobGenerator(self.queue, self.commands4).generate_pbs()
176+
177+
# 8 commands chosen because there is 8 cores but still should be split because there is 6 gpu
178+
self.commands8 = ["echo 1", "echo 2", "echo 3", "echo 4", "echo 5", "echo 6", "echo 7", "echo 8"]
179+
self.pbs8 = HadesJobGenerator(self.queue, self.commands8).generate_pbs()
180+
181+
def test_generate_pbs_ppn(self):
182+
assert_true("ppn={}".format(len(self.commands4)) in self.pbs4[0].__str__())
183+
184+
def test_generate_pbs_no_gpus_used(self):
185+
# Hades use ppn instead og the gpus flag and breaks if gpus is there
186+
assert_false("gpus=" in self.pbs4[0].__str__())
187+
188+
def test_pbs_split_1_job(self):
189+
assert_equal(len(self.pbs4), 1)
190+
191+
def test_pbs_split_2_job(self):
192+
assert_equal(len(self.pbs8), 2)
193+
194+
def test_pbs_split_2_job_nb_commands(self):
195+
assert_true("ppn=6" in self.pbs8[0].__str__())
196+
assert_true("ppn=2" in self.pbs8[1].__str__())
197+
198+
168199
def test_job_generator_factory():
169200
queue = {"queue_name": "qtest"}
170201
commands = []
@@ -177,8 +208,12 @@ def test_job_generator_factory():
177208
job_generator = job_generator_factory(queue, commands, cluster_name="helios")
178209
assert_true(isinstance(job_generator, HeliosJobGenerator))
179210

211+
job_generator = job_generator_factory(queue, commands, cluster_name="hades")
212+
assert_true(isinstance(job_generator, HadesJobGenerator))
213+
180214
job_generator = job_generator_factory(queue, commands, cluster_name=None)
181215
assert_true(isinstance(job_generator, JobGenerator))
182216
assert_true(not isinstance(job_generator, GuilliminJobGenerator))
183217
assert_true(not isinstance(job_generator, MammouthJobGenerator))
184218
assert_true(not isinstance(job_generator, HeliosJobGenerator))
219+
assert_true(not isinstance(job_generator, HadesJobGenerator))

0 commit comments

Comments
 (0)