diff --git a/dev-tools/smoke_test_rc.py b/dev-tools/smoke_test_rc.py index 4df09461d4a..18aa10e2ed6 100644 --- a/dev-tools/smoke_test_rc.py +++ b/dev-tools/smoke_test_rc.py @@ -53,6 +53,7 @@ import time import socket import json import base64 +from urllib.parse import urlparse from prepare_release_candidate import run from http.client import HTTPConnection @@ -104,21 +105,24 @@ def read_fully(file): return f.read() -def wait_for_node_startup(host='127.0.0.1', port=9200, timeout=60, header={}): +def wait_for_node_startup(es_dir, timeout=60, header={}): print(' Waiting until node becomes available for at most %s seconds' % timeout) for _ in range(timeout): - conn = HTTPConnection(host=host, port=port, timeout=timeout) + conn = None try: time.sleep(1) + host, port = get_host_from_ports_file(es_dir) + conn = HTTPConnection(host=host, port=port, timeout=timeout) conn.request('GET', '', headers=header) res = conn.getresponse() if res.status == 200: return True - except socket.error as e: + except IOError as e: pass #that is ok it might not be there yet finally: - conn.close() + if conn: + conn.close() return False def download_and_verify(version, hash, files, base_url, plugins=DEFAULT_PLUGINS): @@ -165,6 +169,11 @@ def download_and_verify(version, hash, files, base_url, plugins=DEFAULT_PLUGINS) finally: shutil.rmtree(tmp_dir) +def get_host_from_ports_file(es_dir): + first_host_with_port = read_fully(os.path.join(es_dir, 'logs/http.ports')).splitlines()[0] + host = urlparse('http://%s' % first_host_with_port) + return host.hostname, host.port + def smoke_test_release(release, files, expected_hash, plugins): for release_file in files: if not os.path.isfile(release_file): @@ -177,9 +186,10 @@ def smoke_test_release(release, files, expected_hash, plugins): else: print(' Skip SmokeTest for [%s]' % release_file) continue # nothing to do here - es_run_path = os.path.join(tmp_dir, 'elasticsearch-%s' % (release), 'bin/elasticsearch') + es_dir = os.path.join(tmp_dir, 'elasticsearch-%s' % (release)) + es_run_path = os.path.join(es_dir, 'bin/elasticsearch') print(' Smoke testing package [%s]' % release_file) - es_plugin_path = os.path.join(tmp_dir, 'elasticsearch-%s' % (release), 'bin/elasticsearch-plugin') + es_plugin_path = os.path.join(es_dir, 'bin/elasticsearch-plugin') plugin_names = {} for plugin in plugins: print(' Install plugin [%s]' % (plugin)) @@ -187,24 +197,25 @@ def smoke_test_release(release, files, expected_hash, plugins): plugin_names[plugin] = True if 'x-pack' in plugin_names: headers = { 'Authorization' : 'Basic %s' % base64.b64encode(b"es_admin:foobar").decode("UTF-8") } - es_shield_path = os.path.join(tmp_dir, 'elasticsearch-%s' % (release), 'bin/x-pack/users') + es_shield_path = os.path.join(es_dir, 'bin/x-pack/users') print(" Install dummy shield user") run('%s; %s useradd es_admin -r admin -p foobar' % (java_exe(), es_shield_path)) else: headers = {} - print(' Starting elasticsearch deamon from [%s]' % os.path.join(tmp_dir, 'elasticsearch-%s' % release)) + print(' Starting elasticsearch deamon from [%s]' % es_dir) try: - run('%s; %s -Ees.node.name=smoke_tester -Ees.cluster.name=prepare_release -Ees.script.inline=true -Ees.script.indexed=true -Ees.repositories.url.allowed_urls=http://snapshot.test* %s -Ees.pidfile=%s' - % (java_exe(), es_run_path, '-d', os.path.join(tmp_dir, 'elasticsearch-%s' % (release), 'es-smoke.pid'))) - conn = HTTPConnection(host='127.0.0.1', port=9200, timeout=20) - if not wait_for_node_startup(header=headers): + run('%s; %s -Ees.node.name=smoke_tester -Ees.cluster.name=prepare_release -Ees.script.inline=true -Ees.script.indexed=true -Ees.repositories.url.allowed_urls=http://snapshot.test* %s -Ees.pidfile=%s -Ees.node.portsfile=true' + % (java_exe(), es_run_path, '-d', os.path.join(es_dir, 'es-smoke.pid'))) + if not wait_for_node_startup(es_dir, header=headers): print("elasticsearch logs:") print('*' * 80) - logs = read_fully(os.path.join(tmp_dir, 'elasticsearch-%s' % (release), 'logs/prepare_release.log')) + logs = read_fully(os.path.join(es_dir, 'logs/prepare_release.log')) print(logs) print('*' * 80) raise RuntimeError('server didn\'t start up') try: # we now get / and /_nodes to fetch basic infos like hashes etc and the installed plugins + host,port = get_host_from_ports_file(es_dir) + conn = HTTPConnection(host=host, port=port, timeout=20) conn.request('GET', '', headers=headers) res = conn.getresponse() if res.status == 200: @@ -236,7 +247,7 @@ def smoke_test_release(release, files, expected_hash, plugins): finally: conn.close() finally: - pid_path = os.path.join(tmp_dir, 'elasticsearch-%s' % (release), 'es-smoke.pid') + pid_path = os.path.join(es_dir, 'es-smoke.pid') if os.path.exists(pid_path): # try reading the pid and kill the node pid = int(read_fully(pid_path)) os.kill(pid, signal.SIGKILL)