X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/7b9ca2a26b4099e45548d83fc878fe295f2cdc56..5549904bbd5dec9bafe60e36d4ea1abe6b791f19:/sdk/python/tests/run_test_server.py diff --git a/sdk/python/tests/run_test_server.py b/sdk/python/tests/run_test_server.py index 19520c86bf..b9502f0f8e 100644 --- a/sdk/python/tests/run_test_server.py +++ b/sdk/python/tests/run_test_server.py @@ -9,6 +9,7 @@ import random import re import shutil import signal +import socket import subprocess import string import sys @@ -24,7 +25,7 @@ if __name__ == '__main__' and os.path.exists( # Add the Python SDK source to the library path. sys.path.insert(1, os.path.dirname(MY_DIRNAME)) -import arvados.api +import arvados import arvados.config ARVADOS_DIR = os.path.realpath(os.path.join(MY_DIRNAME, '../../..')) @@ -94,28 +95,22 @@ def kill_server_pid(pidfile, wait=10, passenger_root=False): pass def find_available_port(): - """Return a port number that is not in use right now. + """Return an IPv4 port number that is not in use right now. + + We assume whoever needs to use the returned port is able to reuse + a recently used port without waiting for TIME_WAIT (see + SO_REUSEADDR / SO_REUSEPORT). Some opportunity for races here, but it's better than choosing something at random and not checking at all. If all of our servers (hey Passenger) knew that listening on port 0 was a thing, the OS would take care of the races, and this wouldn't be needed at all. """ - port = None - while port is None: - port = random.randint(20000, 40000) - port_hex = ':%04x ' % port - try: - with open('/proc/net/tcp', 'r') as f: - for line in f: - if 0 <= string.find(line, port_hex): - port = None - break - except OSError: - # This isn't going so well. Just use the random port. - pass - except IOError: - pass + + sock = socket.socket() + sock.bind(('0.0.0.0', 0)) + port = sock.getsockname()[1] + sock.close() return port def run(leave_running_atexit=False): @@ -180,7 +175,8 @@ def run(leave_running_atexit=False): '-out', 'tmp/self-signed.pem', '-keyout', 'tmp/self-signed.key', '-days', '3650', - '-subj', '/CN=0.0.0.0']) + '-subj', '/CN=0.0.0.0'], + stdout=sys.stderr) port = find_available_port() env = os.environ.copy() @@ -288,7 +284,7 @@ def run_keep(blob_signing_key=None, enforce_permissions=False): keep_args['--enforce-permissions'] = 'true' api = arvados.api( - 'v1', cache=False, + version='v1', host=os.environ['ARVADOS_API_HOST'], token=os.environ['ARVADOS_API_TOKEN'], insecure=True) @@ -337,7 +333,7 @@ def run_keep_proxy(): env=env) api = arvados.api( - 'v1', cache=False, + version='v1', host=os.environ['ARVADOS_API_HOST'], token=admin_token, insecure=True)