boulder/test/startservers.py

83 lines
2.0 KiB
Python

import atexit
import os
import shutil
import signal
import subprocess
import tempfile
config = os.environ.get('BOULDER_CONFIG')
if config is None:
config = 'test/boulder-config.json'
processes = []
tempdir = tempfile.mkdtemp()
def run(path):
binary = os.path.join(tempdir, os.path.basename(path))
buildcmd = 'GORACE="halt_on_error=1" go build -race -o %s ./%s' % (binary, path)
print(buildcmd)
subprocess.check_call(buildcmd, shell=True)
srvcmd = [binary, '--config', config]
p = subprocess.Popen(srvcmd)
p.cmd = srvcmd
print('started %s with pid %d' % (p.cmd, p.pid))
return p
def start():
"""Return True if everything builds and starts.
Give up and return False if anything fails to build, or dies at
startup. Anything that did start before this point can be cleaned
up explicitly by calling stop(), or automatically atexit.
"""
global processes
for prog in [
'cmd/boulder-wfe',
'cmd/boulder-ra',
'cmd/boulder-sa',
'cmd/boulder-ca',
'cmd/boulder-va',
'test/dns-test-srv']:
try:
processes.append(run(prog))
except Exception as e:
print(e)
return False
if not check():
# Don't keep building stuff if a server has already died.
return False
return True
def check():
"""Return true if all started processes are still alive.
Log about anything that died.
"""
global processes
busted = []
stillok = []
for p in processes:
if p.poll() is None:
stillok.append(p)
else:
busted.append(p)
if busted:
print "\n\nThese processes exited early (check above for their output):"
for p in busted:
print "\t'%s' with pid %d exited %d" % (p.cmd, p.pid, p.returncode)
processes = stillok
return not busted
@atexit.register
def stop():
for p in processes:
if p.poll() is None:
p.kill()
shutil.rmtree(tempdir)