@@ -33,28 +33,49 @@ def tmp_cwd() -> Generator[None, None, None]:
33
33
finally :
34
34
os .chdir (cwd )
35
35
36
+ def simple_role () -> specs .Role :
37
+ return specs .Role (
38
+ name = "foo" ,
39
+ image = "/some/path" ,
40
+ entrypoint = "echo" ,
41
+ args = ["hello slurm" , "test" ],
42
+ env = {
43
+ "FOO" : "bar" ,
44
+ },
45
+ num_replicas = 5 ,
46
+ resource = specs .Resource (
47
+ cpu = 2 ,
48
+ memMB = 10 ,
49
+ gpu = 3 ,
50
+ ),
51
+ )
52
+
53
+ def simple_app () -> specs .AppDef :
54
+ return specs .AppDef (
55
+ name = "foo" ,
56
+ roles = [
57
+ specs .Role (
58
+ name = "a" ,
59
+ image = "/some/path" ,
60
+ entrypoint = "echo" ,
61
+ args = [specs .macros .replica_id , f"hello { specs .macros .app_id } " ],
62
+ num_replicas = 2 ,
63
+ ),
64
+ specs .Role (
65
+ name = "b" ,
66
+ image = "/some/path" ,
67
+ entrypoint = "echo" ,
68
+ ),
69
+ ],
70
+ )
36
71
37
72
class SlurmSchedulerTest (unittest .TestCase ):
38
73
def test_create_scheduler (self ) -> None :
39
74
scheduler = create_scheduler ("foo" )
40
75
self .assertIsInstance (scheduler , SlurmScheduler )
41
76
42
77
def test_replica_request (self ) -> None :
43
- role = specs .Role (
44
- name = "foo" ,
45
- image = "/some/path" ,
46
- entrypoint = "echo" ,
47
- args = ["hello slurm" , "test" ],
48
- env = {
49
- "FOO" : "bar" ,
50
- },
51
- num_replicas = 5 ,
52
- resource = specs .Resource (
53
- cpu = 2 ,
54
- memMB = 10 ,
55
- gpu = 3 ,
56
- ),
57
- )
78
+ role = simple_role ()
58
79
sbatch , srun = SlurmReplicaRequest .from_role (
59
80
"role-0" , role , cfg = {}
60
81
).materialize ()
@@ -79,9 +100,9 @@ def test_replica_request(self) -> None:
79
100
],
80
101
)
81
102
82
- # test nomem option
103
+ def test_replica_request_nomem ( self ) -> None :
83
104
sbatch , srun = SlurmReplicaRequest .from_role (
84
- "role-name" , role , cfg = {"nomem" : True }
105
+ "role-name" , simple_role () , cfg = {"nomem" : True }
85
106
).materialize ()
86
107
self .assertEqual (
87
108
sbatch ,
@@ -93,6 +114,15 @@ def test_replica_request(self) -> None:
93
114
],
94
115
)
95
116
117
+ def test_replica_request_constraint (self ) -> None :
118
+ sbatch , srun = SlurmReplicaRequest .from_role (
119
+ "role-name" , simple_role (), cfg = {"constraint" : "orange" }
120
+ ).materialize ()
121
+ self .assertIn (
122
+ "--constraint=orange" ,
123
+ sbatch ,
124
+ )
125
+
96
126
def test_replica_request_app_id (self ) -> None :
97
127
role = specs .Role (
98
128
name = "foo" ,
@@ -132,23 +162,7 @@ def test_replica_request_run_config(self) -> None:
132
162
133
163
def test_dryrun_multi_role (self ) -> None :
134
164
scheduler = create_scheduler ("foo" )
135
- app = specs .AppDef (
136
- name = "foo" ,
137
- roles = [
138
- specs .Role (
139
- name = "a" ,
140
- image = "/some/path" ,
141
- entrypoint = "echo" ,
142
- args = [specs .macros .replica_id , f"hello { specs .macros .app_id } " ],
143
- num_replicas = 2 ,
144
- ),
145
- specs .Role (
146
- name = "b" ,
147
- image = "/some/path" ,
148
- entrypoint = "echo" ,
149
- ),
150
- ],
151
- )
165
+ app = simple_app ()
152
166
info = scheduler .submit_dryrun (app , cfg = {})
153
167
req = info .request
154
168
self .assertIsInstance (req , SlurmBatchRequest )
@@ -344,3 +358,30 @@ def test_log_iter(self, run: MagicMock) -> None:
344
358
)
345
359
)
346
360
self .assertEqual (logs , ["hello" , "world" ])
361
+
362
+ def test_dryrun_comment (self ) -> None :
363
+ scheduler = create_scheduler ("foo" )
364
+ app = simple_app ()
365
+ info = scheduler .submit_dryrun (app , cfg = {
366
+ "comment" : "banana foo bar" ,
367
+ })
368
+ self .assertIn (
369
+ "--comment=banana foo bar" ,
370
+ info .request .cmd ,
371
+ )
372
+
373
+ def test_dryrun_mail (self ) -> None :
374
+ scheduler = create_scheduler ("foo" )
375
+ app = simple_app ()
376
+ info = scheduler .submit_dryrun (app , cfg = {
377
+
378
+ "mail-type" : "END" ,
379
+ })
380
+ self .assertIn (
381
+
382
+ info .request .cmd ,
383
+ )
384
+ self .assertIn (
385
+ "--mail-type=END" ,
386
+ info .request .cmd ,
387
+ )
0 commit comments