X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/59a2d537f3450407aa48e32645d92a5246c046fe..2f66d4cc05e9442a9bb69969744d0750a02a1ed4:/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 b073eff40d..262b9d2a2c 100644 --- a/sdk/python/tests/run_test_server.py +++ b/sdk/python/tests/run_test_server.py @@ -26,6 +26,11 @@ import time import unittest import yaml +try: + from urllib.parse import urlparse +except ImportError: + from urlparse import urlparse + MY_DIRNAME = os.path.dirname(os.path.realpath(__file__)) if __name__ == '__main__' and os.path.exists( os.path.join(MY_DIRNAME, '..', 'arvados', '__init__.py')): @@ -316,35 +321,33 @@ def run(leave_running_atexit=False): port = internal_port_from_config("RailsAPI") env = os.environ.copy() env['RAILS_ENV'] = 'test' + env['ARVADOS_RAILS_LOG_TO_STDOUT'] = '1' env.pop('ARVADOS_WEBSOCKETS', None) env.pop('ARVADOS_TEST_API_HOST', None) env.pop('ARVADOS_API_HOST', None) env.pop('ARVADOS_API_HOST_INSECURE', None) env.pop('ARVADOS_API_TOKEN', None) - start_msg = subprocess.check_output( + logf = open(_logfilename('railsapi'), 'a') + railsapi = subprocess.Popen( ['bundle', 'exec', - 'passenger', 'start', '-d', '-p{}'.format(port), + 'passenger', 'start', '-p{}'.format(port), '--pid-file', pid_file, - '--log-file', os.path.join(os.getcwd(), 'log/test.log'), + '--log-file', '/dev/stdout', '--ssl', '--ssl-certificate', 'tmp/self-signed.pem', '--ssl-certificate-key', 'tmp/self-signed.key'], - env=env) + env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf) if not leave_running_atexit: atexit.register(kill_server_pid, pid_file, passenger_root=api_src_dir) - match = re.search(r'Accessible via: https://(.*?)/', start_msg) - if not match: - raise Exception( - "Passenger did not report endpoint: {}".format(start_msg)) - my_api_host = match.group(1) + my_api_host = "127.0.0.1:"+str(port) os.environ['ARVADOS_API_HOST'] = my_api_host # Make sure the server has written its pid file and started # listening on its TCP port - find_server_pid(pid_file) _wait_until_port_listens(port) + find_server_pid(pid_file) reset() os.chdir(restore_cwd) @@ -394,11 +397,13 @@ def get_config(): with open(os.environ["ARVADOS_CONFIG"]) as f: return yaml.safe_load(f) -def internal_port_from_config(service): - return int(list(get_config()["Clusters"]["zzzzz"]["Services"][service]["InternalURLs"].keys())[0].split(":")[2]) +def internal_port_from_config(service, idx=0): + return int(urlparse( + sorted(list(get_config()["Clusters"]["zzzzz"]["Services"][service]["InternalURLs"].keys()))[idx]). + netloc.split(":")[1]) def external_port_from_config(service): - return int(get_config()["Clusters"]["zzzzz"]["Services"][service]["ExternalURL"].split(":")[2]) + return int(urlparse(get_config()["Clusters"]["zzzzz"]["Services"][service]["ExternalURL"]).netloc.split(":")[1]) def run_controller(): if 'ARVADOS_TEST_PROXY_SERVICES' in os.environ: @@ -437,47 +442,41 @@ def stop_ws(): return kill_server_pid(_pidfile('ws')) -def _start_keep(n, keep_args): - keep0 = tempfile.mkdtemp() - port = find_available_port() - keep_cmd = ["keepstore", - "-volume={}".format(keep0), - "-listen=:{}".format(port), - "-pid="+_pidfile('keep{}'.format(n))] - - for arg, val in keep_args.items(): - keep_cmd.append("{}={}".format(arg, val)) +def _start_keep(n, blob_signing=False): + datadir = os.path.join(TEST_TMPDIR, "keep%d.data"%n) + if os.path.exists(datadir): + shutil.rmtree(datadir) + os.mkdir(datadir) + port = internal_port_from_config("Keepstore", idx=n) + + # Currently, if there are multiple InternalURLs for a single host, + # the only way to tell a keepstore process which one it's supposed + # to listen on is to supply a redacted version of the config, with + # the other InternalURLs removed. + conf = os.path.join(TEST_TMPDIR, "keep%d.yaml"%n) + confdata = get_config() + confdata['Clusters']['zzzzz']['Services']['Keepstore']['InternalURLs'] = {"http://127.0.0.1:%d"%port: {}} + confdata['Clusters']['zzzzz']['Collections']['BlobSigning'] = blob_signing + with open(conf, 'w') as f: + yaml.safe_dump(confdata, f) + keep_cmd = ["keepstore", "-config", conf] with open(_logfilename('keep{}'.format(n)), 'a') as logf: with open('/dev/null') as _stdin: - kp0 = subprocess.Popen( + child = subprocess.Popen( keep_cmd, stdin=_stdin, stdout=logf, stderr=logf, close_fds=True) + print('child.pid is %d'%child.pid, file=sys.stderr) with open(_pidfile('keep{}'.format(n)), 'w') as f: - f.write(str(kp0.pid)) - - with open("{}/keep{}.volume".format(TEST_TMPDIR, n), 'w') as f: - f.write(keep0) + f.write(str(child.pid)) _wait_until_port_listens(port) return port -def run_keep(blob_signing_key=None, enforce_permissions=False, num_servers=2): +def run_keep(num_servers=2, **kwargs): stop_keep(num_servers) - keep_args = {} - if not blob_signing_key: - blob_signing_key = 'zfhgfenhffzltr9dixws36j1yhksjoll2grmku38mi7yxd66h5j4q9w4jzanezacp8s6q0ro3hxakfye02152hncy6zml2ed0uc' - with open(os.path.join(TEST_TMPDIR, "keep.blob_signing_key"), "w") as f: - keep_args['-blob-signing-key-file'] = f.name - f.write(blob_signing_key) - keep_args['-enforce-permissions'] = str(enforce_permissions).lower() - with open(os.path.join(TEST_TMPDIR, "keep.data-manager-token-file"), "w") as f: - keep_args['-data-manager-token-file'] = f.name - f.write(auth_token('data_manager')) - keep_args['-never-delete'] = 'false' - api = arvados.api( version='v1', host=os.environ['ARVADOS_API_HOST'], @@ -490,7 +489,7 @@ def run_keep(blob_signing_key=None, enforce_permissions=False, num_servers=2): api.keep_disks().delete(uuid=d['uuid']).execute() for d in range(0, num_servers): - port = _start_keep(d, keep_args) + port = _start_keep(d, **kwargs) svc = api.keep_services().create(body={'keep_service': { 'uuid': 'zzzzz-bi6l4-keepdisk{:07d}'.format(d), 'service_host': 'localhost', @@ -515,12 +514,6 @@ def run_keep(blob_signing_key=None, enforce_permissions=False, num_servers=2): def _stop_keep(n): kill_server_pid(_pidfile('keep{}'.format(n))) - if os.path.exists("{}/keep{}.volume".format(TEST_TMPDIR, n)): - with open("{}/keep{}.volume".format(TEST_TMPDIR, n), 'r') as r: - shutil.rmtree(r.read(), True) - os.unlink("{}/keep{}.volume".format(TEST_TMPDIR, n)) - if os.path.exists(os.path.join(TEST_TMPDIR, "keep.blob_signing_key")): - os.remove(os.path.join(TEST_TMPDIR, "keep.blob_signing_key")) def stop_keep(num_servers=2): for n in range(0, num_servers): @@ -537,10 +530,11 @@ def run_keep_proxy(): env['ARVADOS_API_TOKEN'] = auth_token('anonymous') logf = open(_logfilename('keepproxy'), 'a') kp = subprocess.Popen( - ['keepproxy', - '-pid='+_pidfile('keepproxy'), - '-listen=:{}'.format(port)], - env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf, close_fds=True) + ['keepproxy'], env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf, close_fds=True) + + with open(_pidfile('keepproxy'), 'w') as f: + f.write(str(kp.pid)) + _wait_until_port_listens(port) print("Using API %s token %s" % (os.environ['ARVADOS_API_HOST'], auth_token('admin')), file=sys.stdout) api = arvados.api( @@ -570,16 +564,11 @@ def run_arv_git_httpd(): return stop_arv_git_httpd() - gitdir = os.path.join(SERVICES_SRC_DIR, 'api', 'tmp', 'git') gitport = internal_port_from_config("GitHTTP") env = os.environ.copy() env.pop('ARVADOS_API_TOKEN', None) logf = open(_logfilename('arv-git-httpd'), 'a') - agh = subprocess.Popen( - ['arv-git-httpd', - '-repo-root='+gitdir+'/test', - '-management-token=e687950a23c3a9bceec28c6223a06c79', - '-address=:'+str(gitport)], + agh = subprocess.Popen(['arv-git-httpd'], env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf) with open(_pidfile('arv-git-httpd'), 'w') as f: f.write(str(agh.pid)) @@ -597,14 +586,9 @@ def run_keep_web(): keepwebport = internal_port_from_config("WebDAV") env = os.environ.copy() - env['ARVADOS_API_TOKEN'] = auth_token('anonymous') logf = open(_logfilename('keep-web'), 'a') keepweb = subprocess.Popen( - ['keep-web', - '-allow-anonymous', - '-attachment-only-host=download', - '-management-token=e687950a23c3a9bceec28c6223a06c79', - '-listen=:'+str(keepwebport)], + ['keep-web'], env=env, stdin=open('/dev/null'), stdout=logf, stderr=logf) with open(_pidfile('keep-web'), 'w') as f: f.write(str(keepweb.pid)) @@ -620,6 +604,7 @@ def run_nginx(): return stop_nginx() nginxconf = {} + nginxconf['LISTENHOST'] = 'localhost' nginxconf['CONTROLLERPORT'] = internal_port_from_config("Controller") nginxconf['CONTROLLERSSLPORT'] = external_port_from_config("Controller") nginxconf['KEEPWEBPORT'] = internal_port_from_config("WebDAV") @@ -630,7 +615,9 @@ def run_nginx(): nginxconf['GITPORT'] = internal_port_from_config("GitHTTP") nginxconf['GITSSLPORT'] = external_port_from_config("GitHTTP") nginxconf['WSPORT'] = internal_port_from_config("Websocket") - nginxconf['WSSPORT'] = external_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['SSLCERT'] = os.path.join(SERVICES_SRC_DIR, 'api', 'tmp', 'self-signed.pem') nginxconf['SSLKEY'] = os.path.join(SERVICES_SRC_DIR, 'api', 'tmp', 'self-signed.key') nginxconf['ACCESSLOG'] = _logfilename('nginx_access') @@ -641,7 +628,7 @@ def run_nginx(): conffile = os.path.join(TEST_TMPDIR, 'nginx.conf') with open(conffile, 'w') as f: f.write(re.sub( - r'{{([A-Z]+)}}', + r'{{([A-Z]+[A-Z0-9]+)}}', lambda match: str(nginxconf.get(match.group(1))), open(conftemplatefile).read())) @@ -654,6 +641,7 @@ def run_nginx(): '-g', 'pid '+_pidfile('nginx')+';', '-c', conffile], env=env, stdin=open('/dev/null'), stdout=sys.stderr) + _wait_until_port_listens(nginxconf['CONTROLLERSSLPORT']) def setup_config(): rails_api_port = find_available_port() @@ -661,84 +649,138 @@ 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() git_httpd_port = find_available_port() git_httpd_external_port = find_available_port() keepproxy_port = find_available_port() keepproxy_external_port = find_available_port() + keepstore_ports = sorted([str(find_available_port()) for _ in xrange(0,4)]) keep_web_port = find_available_port() keep_web_external_port = find_available_port() keep_web_dl_port = find_available_port() keep_web_dl_external_port = find_available_port() - if "CONFIGSRC" in os.environ: - dbconf = os.path.join(os.environ["CONFIGSRC"], "config.yml") - else: - dbconf = "/etc/arvados/config.yml" + dbconf = os.path.join(os.environ["CONFIGSRC"], "config.yml") print("Getting config from %s" % dbconf, file=sys.stderr) - pgconnection = list(yaml.safe_load(open(dbconf))["Clusters"].values())[0]["PostgreSQL"]["Connection"] - - if "test" not in pgconnection["dbname"]: - pgconnection["dbname"] = "arvados_test" + pgconnection = yaml.safe_load(open(dbconf))["Clusters"]["zzzzz"]["PostgreSQL"]["Connection"] + localhost = "127.0.0.1" services = { "RailsAPI": { - "InternalURLs": { } + "InternalURLs": { + "https://%s:%s"%(localhost, rails_api_port): {}, + }, }, "Controller": { - "ExternalURL": "https://localhost:%s" % controller_external_port, - "InternalURLs": { } + "ExternalURL": "https://%s:%s" % (localhost, controller_external_port), + "InternalURLs": { + "http://%s:%s"%(localhost, controller_port): {}, + }, }, "Websocket": { - "ExternalURL": "https://localhost:%s" % websocket_external_port, - "InternalURLs": { } + "ExternalURL": "wss://%s:%s/websocket" % (localhost, websocket_external_port), + "InternalURLs": { + "http://%s:%s"%(localhost, websocket_port): {}, + }, + }, + "Workbench1": { + "ExternalURL": "https://%s:%s/" % (localhost, workbench1_external_port), + "InternalURLs": { + "http://%s:%s"%(localhost, workbench1_port): {}, + }, }, "GitHTTP": { - "ExternalURL": "https://localhost:%s" % git_httpd_external_port, - "InternalURLs": { } + "ExternalURL": "https://%s:%s" % (localhost, git_httpd_external_port), + "InternalURLs": { + "http://%s:%s"%(localhost, git_httpd_port): {} + }, + }, + "Keepstore": { + "InternalURLs": { + "http://%s:%s"%(localhost, port): {} for port in keepstore_ports + }, }, "Keepproxy": { - "ExternalURL": "https://localhost:%s" % keepproxy_external_port, - "InternalURLs": { } + "ExternalURL": "https://%s:%s" % (localhost, keepproxy_external_port), + "InternalURLs": { + "http://%s:%s"%(localhost, keepproxy_port): {}, + }, }, "WebDAV": { - "ExternalURL": "https://localhost:%s" % keep_web_external_port, - "InternalURLs": { } + "ExternalURL": "https://%s:%s" % (localhost, keep_web_external_port), + "InternalURLs": { + "http://%s:%s"%(localhost, keep_web_port): {}, + }, }, "WebDAVDownload": { - "ExternalURL": "https://localhost:%s" % keep_web_dl_external_port, - "InternalURLs": { } - } + "ExternalURL": "https://%s:%s" % (localhost, keep_web_dl_external_port), + "InternalURLs": { + "http://%s:%s"%(localhost, keep_web_dl_port): {}, + }, + }, + "SSO": { + "ExternalURL": "http://localhost:3002", + }, } - services["RailsAPI"]["InternalURLs"]["https://localhost:%s"%rails_api_port] = {} - services["Controller"]["InternalURLs"]["http://localhost:%s"%controller_port] = {} - services["Websocket"]["InternalURLs"]["http://localhost:%s"%websocket_port] = {} - services["GitHTTP"]["InternalURLs"]["http://localhost:%s"%git_httpd_port] = {} - services["Keepproxy"]["InternalURLs"]["http://localhost:%s"%keepproxy_port] = {} - services["WebDAV"]["InternalURLs"]["http://localhost:%s"%keep_web_port] = {} - services["WebDAVDownload"]["InternalURLs"]["http://localhost:%s"%keep_web_dl_port] = {} config = { "Clusters": { "zzzzz": { - "EnableBetaController14287": ('14287' in os.environ.get('ARVADOS_EXPERIMENTAL', '')), "ManagementToken": "e687950a23c3a9bceec28c6223a06c79", + "SystemRootToken": auth_token('system_user'), "API": { - "RequestTimeout": "30s" + "RequestTimeout": "30s", + "RailsSessionSecretToken": "e24205c490ac07e028fd5f8a692dcb398bcd654eff1aef5f9fe6891994b18483", + }, + "Login": { + "ProviderAppID": "arvados-server", + "ProviderAppSecret": "608dbf356a327e2d0d4932b60161e212c2d8d8f5e25690d7b622f850a990cd33", }, "SystemLogs": { - "LogLevel": ('info' if os.environ.get('ARVADOS_DEBUG', '') in ['','0'] else 'debug') + "LogLevel": ('info' if os.environ.get('ARVADOS_DEBUG', '') in ['','0'] else 'debug'), }, "PostgreSQL": { "Connection": pgconnection, }, "TLS": { - "Insecure": True + "Insecure": True, }, - "Services": services - } - } + "Services": services, + "Users": { + "AnonymousUserToken": auth_token('anonymous'), + "UserProfileNotificationAddress": "arvados@example.com", + }, + "Collections": { + "BlobSigningKey": "zfhgfenhffzltr9dixws36j1yhksjoll2grmku38mi7yxd66h5j4q9w4jzanezacp8s6q0ro3hxakfye02152hncy6zml2ed0uc", + "TrustAllContent": False, + "ForwardSlashNameSubstitution": "/", + "TrashSweepInterval": "-1s", + }, + "Git": { + "Repositories": os.path.join(SERVICES_SRC_DIR, 'api', 'tmp', 'git', 'test'), + }, + "Containers": { + "JobsAPI": { + "GitInternalDir": os.path.join(SERVICES_SRC_DIR, 'api', 'tmp', 'internal.git'), + }, + "SupportedDockerImageFormats": {"v1": {}}, + }, + "Volumes": { + "zzzzz-nyw5e-%015d"%n: { + "AccessViaHosts": { + "http://%s:%s" % (localhost, keepstore_ports[n]): {}, + }, + "Driver": "Directory", + "DriverParameters": { + "Root": os.path.join(TEST_TMPDIR, "keep%d.data"%n), + }, + } for n in range(len(keepstore_ports)) + }, + }, + }, } conf = os.path.join(TEST_TMPDIR, 'arvados.yml') @@ -746,7 +788,6 @@ def setup_config(): yaml.safe_dump(config, f) ex = "export ARVADOS_CONFIG="+conf - print(ex, file=sys.stderr) print(ex) @@ -856,7 +897,7 @@ if __name__ == "__main__": parser.add_argument('action', type=str, help="one of {}".format(actions)) parser.add_argument('--auth', type=str, metavar='FIXTURE_NAME', help='Print authorization info for given api_client_authorizations fixture') parser.add_argument('--num-keep-servers', metavar='int', type=int, default=2, help="Number of keep servers desired") - parser.add_argument('--keep-enforce-permissions', action="store_true", help="Enforce keep permissions") + parser.add_argument('--keep-blob-signing', action="store_true", help="Enable blob signing for keepstore servers") args = parser.parse_args() @@ -887,7 +928,7 @@ if __name__ == "__main__": elif args.action == 'stop_controller': stop_controller() elif args.action == 'start_keep': - run_keep(enforce_permissions=args.keep_enforce_permissions, num_servers=args.num_keep_servers) + run_keep(blob_signing=args.keep_blob_signing, num_servers=args.num_keep_servers) elif args.action == 'stop_keep': stop_keep(num_servers=args.num_keep_servers) elif args.action == 'start_keep_proxy':