1
1
import asyncio
2
2
import logging
3
+ import os
3
4
import shutil
4
5
import signal
5
6
import sys
12
13
from ipyparallel import cluster
13
14
from ipyparallel .cluster .launcher import find_launcher_class
14
15
16
+ _engine_launcher_classes = ["Local" ]
17
+ if shutil .which ("mpiexec" ):
18
+ _engine_launcher_classes .append ("MPI" )
19
+
15
20
16
21
@pytest .fixture
17
22
def Cluster (request ):
@@ -52,6 +57,13 @@ async def test_cluster_id(Cluster):
52
57
assert cluster .cluster_id == 'abc'
53
58
54
59
60
+ async def test_ipython_log (ipython ):
61
+ c = cluster .Cluster (parent = ipython )
62
+ assert c .log .name == f"{ cluster .Cluster .__module__ } .{ c .cluster_id } "
63
+ assert len (c .log .handlers ) == 1
64
+ assert c .log .handlers [0 ].stream is sys .stdout
65
+
66
+
55
67
async def test_start_stop_controller (Cluster ):
56
68
cluster = Cluster ()
57
69
await cluster .start_controller ()
@@ -72,7 +84,7 @@ async def test_start_stop_controller(Cluster):
72
84
# TODO: test file cleanup
73
85
74
86
75
- @pytest .mark .parametrize ("engine_launcher_class" , [ "Local" , "MPI" ] )
87
+ @pytest .mark .parametrize ("engine_launcher_class" , _engine_launcher_classes )
76
88
async def test_start_stop_engines (Cluster , engine_launcher_class ):
77
89
cluster = Cluster (engine_launcher_class = engine_launcher_class )
78
90
await cluster .start_controller ()
@@ -89,7 +101,23 @@ async def test_start_stop_engines(Cluster, engine_launcher_class):
89
101
await cluster .stop_controller ()
90
102
91
103
92
- @pytest .mark .parametrize ("engine_launcher_class" , ["Local" , "MPI" ])
104
+ @pytest .mark .parametrize ("engine_launcher_class" , _engine_launcher_classes )
105
+ async def test_start_stop_cluster (Cluster , engine_launcher_class ):
106
+ n = 2
107
+ cluster = Cluster (engine_launcher_class = engine_launcher_class , n = n )
108
+ await cluster .start_cluster ()
109
+ controller = cluster ._controller
110
+ assert controller is not None
111
+ assert len (cluster ._engine_sets ) == 1
112
+
113
+ rc = cluster .connect_client ()
114
+ rc .wait_for_engines (n , timeout = 10 )
115
+ await cluster .stop_cluster ()
116
+ assert cluster ._controller is None
117
+ assert cluster ._engine_sets == {}
118
+
119
+
120
+ @pytest .mark .parametrize ("engine_launcher_class" , _engine_launcher_classes )
93
121
async def test_signal_engines (Cluster , engine_launcher_class ):
94
122
cluster = Cluster (engine_launcher_class = engine_launcher_class )
95
123
await cluster .start_controller ()
@@ -117,6 +145,25 @@ async def test_signal_engines(Cluster, engine_launcher_class):
117
145
await cluster .stop_controller ()
118
146
119
147
148
+ @pytest .mark .parametrize ("engine_launcher_class" , _engine_launcher_classes )
149
+ async def test_restart_engines (Cluster , engine_launcher_class ):
150
+ n = 3
151
+ async with Cluster (engine_launcher_class = engine_launcher_class , n = n ) as rc :
152
+ cluster = rc .cluster
153
+ engine_set_id = next (iter (cluster ._engine_sets ))
154
+ engine_set = cluster ._engine_sets [engine_set_id ]
155
+ assert rc .ids == list (range (n ))
156
+ before_pids = rc [:].apply_sync (os .getpid )
157
+ await cluster .restart_engines ()
158
+ # wait for unregister
159
+ while any (eid in rc .ids for eid in range (n )):
160
+ await asyncio .sleep (0.1 )
161
+ # wait for register
162
+ rc .wait_for_engines (n , timeout = 10 )
163
+ after_pids = rc [:].apply_sync (os .getpid )
164
+ assert set (after_pids ).intersection (before_pids ) == set ()
165
+
166
+
120
167
async def test_async_with (Cluster ):
121
168
async with Cluster (n = 5 ) as rc :
122
169
assert sorted (rc .ids ) == list (range (5 ))
@@ -160,3 +207,22 @@ async def test_cluster_repr(Cluster):
160
207
repr (c )
161
208
== "<Cluster(cluster_id='test', profile_dir='/tmp', controller=<running>, engine_sets=['engineid'])>"
162
209
)
210
+
211
+
212
+ async def test_cluster_manager ():
213
+ m = cluster .ClusterManager ()
214
+ assert m .list_clusters () == []
215
+ c = m .new_cluster (profile_dir = "/tmp" )
216
+ assert c .profile_dir == "/tmp"
217
+ assert m .get_cluster (c .cluster_id ) is c
218
+ with pytest .raises (KeyError ):
219
+ m .get_cluster ("nosuchcluster" )
220
+
221
+ with pytest .raises (KeyError ):
222
+ m .new_cluster (cluster_id = c .cluster_id )
223
+
224
+ assert m .list_clusters () == [c .cluster_id ]
225
+ m .remove_cluster (c .cluster_id )
226
+ assert m .list_clusters () == []
227
+ with pytest .raises (KeyError ):
228
+ m .remove_cluster ("nosuchcluster" )
0 commit comments