#
# SPDX-License-Identifier: Apache-2.0
-from __future__ import print_function
-from __future__ import division
-from builtins import str
-from builtins import range
import argparse
import atexit
import errno
import shutil
import signal
import socket
-import string
import subprocess
import sys
import tempfile
import unittest
import yaml
-try:
- from urllib.parse import urlparse
-except ImportError:
- from urlparse import urlparse
+from urllib.parse import urlparse
MY_DIRNAME = os.path.dirname(os.path.realpath(__file__))
if __name__ == '__main__' and os.path.exists(
import arvados
import arvados.config
+# This module starts subprocesses and records them in pidfiles so they
+# can be managed by other processes (incl. after this process
+# exits). But if we don't keep a reference to each subprocess object
+# somewhere, the subprocess destructor runs, and we get a lot of
+# ResourceWarning noise in test logs. This is our bucket of subprocess
+# objects whose destructors we don't want to run but are otherwise
+# unneeded.
+_detachedSubprocesses = []
+
ARVADOS_DIR = os.path.realpath(os.path.join(MY_DIRNAME, '../../..'))
SERVICES_SRC_DIR = os.path.join(ARVADOS_DIR, 'services')
stdbuf+['cat', fifo],
stdin=open('/dev/null'),
stdout=subprocess.PIPE)
+ _detachedSubprocesses.append(cat)
tee = subprocess.Popen(
stdbuf+['tee', '-a', logfilename],
stdin=cat.stdout,
stdout=subprocess.PIPE)
- subprocess.Popen(
+ _detachedSubprocesses.append(tee)
+ sed = subprocess.Popen(
stdbuf+['sed', '-e', 's/^/['+label+'] /'],
stdin=tee.stdout,
stdout=sys.stderr)
+ _detachedSubprocesses.append(sed)
return fifo
def run(leave_running_atexit=False):
if not os.path.exists('tmp/logs'):
os.makedirs('tmp/logs')
- # Install the git repository fixtures.
- gitdir = os.path.join(SERVICES_SRC_DIR, 'api', 'tmp', 'git')
- gittarball = os.path.join(SERVICES_SRC_DIR, 'api', 'test', 'test.git.tar')
- if not os.path.isdir(gitdir):
- os.makedirs(gitdir)
- subprocess.check_output(['tar', '-xC', gitdir, '-f', gittarball])
-
# Customizing the passenger config template is the only documented
# way to override the default passenger_stat_throttle_rate (10 s).
# In the testing environment, we want restart.txt to take effect
'--ssl-certificate', 'tmp/self-signed.pem',
'--ssl-certificate-key', 'tmp/self-signed.key'],
env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf)
+ _detachedSubprocesses.append(railsapi)
if not leave_running_atexit:
atexit.register(kill_server_pid, pid_file, passenger_root=api_src_dir)
controller = subprocess.Popen(
["arvados-server", "controller"],
stdin=open('/dev/null'), stdout=logf, stderr=logf, close_fds=True)
+ _detachedSubprocesses.append(controller)
with open(_pidfile('controller'), 'w') as f:
f.write(str(controller.pid))
_wait_until_port_listens(port)
ws = subprocess.Popen(
["arvados-server", "ws"],
stdin=open('/dev/null'), stdout=logf, stderr=logf, close_fds=True)
+ _detachedSubprocesses.append(ws)
with open(_pidfile('ws'), 'w') as f:
f.write(str(ws.pid))
_wait_until_port_listens(port)
with open('/dev/null') as _stdin:
child = subprocess.Popen(
keep_cmd, stdin=_stdin, stdout=logf, stderr=logf, close_fds=True)
+ _detachedSubprocesses.append(child)
print('child.pid is %d'%child.pid, file=sys.stderr)
with open(_pidfile('keep{}'.format(n)), 'w') as f:
for d in api.keep_services().list(filters=[['service_type','=','disk']]).execute()['items']:
api.keep_services().delete(uuid=d['uuid']).execute()
- for d in api.keep_disks().list().execute()['items']:
- api.keep_disks().delete(uuid=d['uuid']).execute()
for d in range(0, num_servers):
port = _start_keep(d, **kwargs)
'service_type': 'disk',
'service_ssl_flag': False,
}}).execute()
- api.keep_disks().create(body={
- 'keep_disk': {'keep_service_uuid': svc['uuid'] }
- }).execute()
# If keepproxy and/or keep-web is running, send SIGHUP to make
# them discover the new keepstore services.
logf = open(_logfilename('keepproxy'), WRITE_MODE)
kp = subprocess.Popen(
['arvados-server', 'keepproxy'], env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf, close_fds=True)
+ _detachedSubprocesses.append(kp)
with open(_pidfile('keepproxy'), 'w') as f:
f.write(str(kp.pid))
return
kill_server_pid(_pidfile('keepproxy'))
-def run_arv_git_httpd():
- if 'ARVADOS_TEST_PROXY_SERVICES' in os.environ:
- return
- stop_arv_git_httpd()
-
- gitport = internal_port_from_config("GitHTTP")
- env = os.environ.copy()
- env.pop('ARVADOS_API_TOKEN', None)
- logf = open(_logfilename('githttpd'), WRITE_MODE)
- agh = subprocess.Popen(['arvados-server', 'git-httpd'],
- env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf)
- with open(_pidfile('githttpd'), 'w') as f:
- f.write(str(agh.pid))
- _wait_until_port_listens(gitport)
-
-def stop_arv_git_httpd():
- if 'ARVADOS_TEST_PROXY_SERVICES' in os.environ:
- return
- kill_server_pid(_pidfile('githttpd'))
-
def run_keep_web():
if 'ARVADOS_TEST_PROXY_SERVICES' in os.environ:
return
keepweb = subprocess.Popen(
['arvados-server', 'keep-web'],
env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf)
+ _detachedSubprocesses.append(keepweb)
with open(_pidfile('keep-web'), 'w') as f:
f.write(str(keepweb.pid))
_wait_until_port_listens(keepwebport)
nginxconf['KEEPWEBSSLPORT'] = external_port_from_config("WebDAV")
nginxconf['KEEPPROXYPORT'] = internal_port_from_config("Keepproxy")
nginxconf['KEEPPROXYSSLPORT'] = external_port_from_config("Keepproxy")
- nginxconf['GITPORT'] = internal_port_from_config("GitHTTP")
- nginxconf['GITSSLPORT'] = external_port_from_config("GitHTTP")
nginxconf['HEALTHPORT'] = internal_port_from_config("Health")
nginxconf['HEALTHSSLPORT'] = external_port_from_config("Health")
nginxconf['WSPORT'] = internal_port_from_config("Websocket")
nginxconf['WSSSLPORT'] = external_port_from_config("Websocket")
- nginxconf['WORKBENCH1PORT'] = internal_port_from_config("Workbench1")
nginxconf['WORKBENCH1SSLPORT'] = external_port_from_config("Workbench1")
nginxconf['WORKBENCH2PORT'] = internal_port_from_config("Workbench2")
nginxconf['WORKBENCH2SSLPORT'] = external_port_from_config("Workbench2")
nginx = subprocess.Popen(
['nginx',
- '-g', 'error_log stderr info; pid '+_pidfile('nginx')+';',
+ '-g', 'error_log stderr notice; pid '+_pidfile('nginx')+';',
'-c', conffile],
env=env, stdin=open('/dev/null'), stdout=sys.stderr)
+ _detachedSubprocesses.append(nginx)
_wait_until_port_listens(nginxconf['CONTROLLERSSLPORT'])
def setup_config():
controller_external_port = find_available_port()
websocket_port = find_available_port()
websocket_external_port = find_available_port()
- workbench1_port = find_available_port()
workbench1_external_port = find_available_port()
workbench2_port = find_available_port()
workbench2_external_port = find_available_port()
- git_httpd_port = find_available_port()
- git_httpd_external_port = find_available_port()
health_httpd_port = find_available_port()
health_httpd_external_port = find_available_port()
keepproxy_port = find_available_port()
},
"Workbench1": {
"ExternalURL": "https://%s:%s/" % (localhost, workbench1_external_port),
- "InternalURLs": {
- "http://%s:%s"%(localhost, workbench1_port): {},
- },
},
"Workbench2": {
"ExternalURL": "https://%s:%s/" % (localhost, workbench2_external_port),
"http://%s:%s"%(localhost, workbench2_port): {},
},
},
- "GitHTTP": {
- "ExternalURL": "https://%s:%s" % (localhost, git_httpd_external_port),
- "InternalURLs": {
- "http://%s:%s"%(localhost, git_httpd_port): {}
- },
- },
"Health": {
"ExternalURL": "https://%s:%s" % (localhost, health_httpd_external_port),
"InternalURLs": {
"BlobSigningKey": "zfhgfenhffzltr9dixws36j1yhksjoll2grmku38mi7yxd66h5j4q9w4jzanezacp8s6q0ro3hxakfye02152hncy6zml2ed0uc",
"TrustAllContent": False,
"ForwardSlashNameSubstitution": "/",
- "TrashSweepInterval": "-1s",
- },
- "Git": {
- "Repositories": os.path.join(SERVICES_SRC_DIR, 'api', 'tmp', 'git', 'test'),
+ "TrashSweepInterval": "-1s", # disable, otherwise test cases can't acquire dblock
},
"Containers": {
- "JobsAPI": {
- "GitInternalDir": os.path.join(SERVICES_SRC_DIR, 'api', 'tmp', 'internal.git'),
- },
"LocalKeepBlobBuffersPerVCPU": 0,
- "Logging": {
- "SweepInterval": 0, # disable, otherwise test cases can't acquire dblock
- },
"SupportedDockerImageFormats": {"v1": {}},
"ShellAccess": {
"Admin": True,
'start_keep', 'stop_keep',
'start_keep_proxy', 'stop_keep_proxy',
'start_keep-web', 'stop_keep-web',
- 'start_githttpd', 'stop_githttpd',
'start_nginx', 'stop_nginx', 'setup_config',
]
parser = argparse.ArgumentParser()
run_keep_proxy()
elif args.action == 'stop_keep_proxy':
stop_keep_proxy()
- elif args.action == 'start_githttpd':
- run_arv_git_httpd()
- elif args.action == 'stop_githttpd':
- stop_arv_git_httpd()
elif args.action == 'start_keep-web':
run_keep_web()
elif args.action == 'stop_keep-web':