|
|
"""toplevel setup/teardown for parallel tests."""
|
|
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
# Copyright (C) 2011 The IPython Development Team
|
|
|
#
|
|
|
# Distributed under the terms of the BSD License. The full license is in
|
|
|
# the file COPYING, distributed as part of this software.
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
# Imports
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
|
|
import os
|
|
|
import tempfile
|
|
|
import time
|
|
|
from subprocess import Popen, PIPE, STDOUT
|
|
|
|
|
|
from IPython.utils.path import get_ipython_dir
|
|
|
from IPython.parallel import Client
|
|
|
|
|
|
processes = []
|
|
|
blackhole = tempfile.TemporaryFile()
|
|
|
|
|
|
# nose setup/teardown
|
|
|
|
|
|
def setup():
|
|
|
cp = Popen('ipcontroller --profile iptest -r --log-level 10 --log-to-file --usethreads'.split(), stdout=blackhole, stderr=STDOUT)
|
|
|
processes.append(cp)
|
|
|
engine_json = os.path.join(get_ipython_dir(), 'cluster_iptest', 'security', 'ipcontroller-engine.json')
|
|
|
client_json = os.path.join(get_ipython_dir(), 'cluster_iptest', 'security', 'ipcontroller-client.json')
|
|
|
tic = time.time()
|
|
|
while not os.path.exists(engine_json) or not os.path.exists(client_json):
|
|
|
if cp.poll() is not None:
|
|
|
print cp.poll()
|
|
|
raise RuntimeError("The test controller failed to start.")
|
|
|
elif time.time()-tic > 10:
|
|
|
raise RuntimeError("Timeout waiting for the test controller to start.")
|
|
|
time.sleep(0.1)
|
|
|
add_engines(1)
|
|
|
|
|
|
def add_engines(n=1, profile='iptest'):
|
|
|
rc = Client(profile=profile)
|
|
|
base = len(rc)
|
|
|
eps = []
|
|
|
for i in range(n):
|
|
|
ep = Popen(['ipengine']+ ['--profile', profile, '--log-level', '10', '--log-to-file'], stdout=blackhole, stderr=STDOUT)
|
|
|
# ep.start()
|
|
|
processes.append(ep)
|
|
|
eps.append(ep)
|
|
|
tic = time.time()
|
|
|
while len(rc) < base+n:
|
|
|
if any([ ep.poll() is not None for ep in eps ]):
|
|
|
raise RuntimeError("A test engine failed to start.")
|
|
|
elif time.time()-tic > 10:
|
|
|
raise RuntimeError("Timeout waiting for engines to connect.")
|
|
|
time.sleep(.1)
|
|
|
rc.spin()
|
|
|
rc.close()
|
|
|
return eps
|
|
|
|
|
|
def teardown():
|
|
|
time.sleep(1)
|
|
|
while processes:
|
|
|
p = processes.pop()
|
|
|
if p.poll() is None:
|
|
|
try:
|
|
|
p.terminate()
|
|
|
except Exception, e:
|
|
|
print e
|
|
|
pass
|
|
|
if p.poll() is None:
|
|
|
time.sleep(.25)
|
|
|
if p.poll() is None:
|
|
|
try:
|
|
|
print 'killing'
|
|
|
p.kill()
|
|
|
except:
|
|
|
print "couldn't shutdown process: ", p
|
|
|
|
|
|
|