Diff
Modified: trunk/Tools/ChangeLog (223131 => 223132)
--- trunk/Tools/ChangeLog 2017-10-10 13:02:47 UTC (rev 223131)
+++ trunk/Tools/ChangeLog 2017-10-10 15:58:42 UTC (rev 223132)
@@ -1,3 +1,28 @@
+2017-10-10 Jonathan Bedard <jbed...@apple.com>
+
+ run-webkit-tests: upload test results to multiple servers
+ https://bugs.webkit.org/show_bug.cgi?id=178012
+ <rdar://problem/34856501>
+
+ Reviewed by Lucas Forschler.
+
+ Allowing uploading of results to multiple servers makes developing new results
+ databases much easier, and does not complicate uploading logic.
+
+ * Scripts/webkitpy/layout_tests/controllers/manager.py:
+ (Manager.upload_results): Iterate through the list of results server hosts and
+ send results to each one.
+ * Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py:
+ (JSONLayoutResultsGenerator.__init__): Accept a list of test results servers.
+ * Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py:
+ (JSONResultsGenerator.__init__): Accept a list of test results servers.
+ (JSONResultsGenerator.get_json): Pick which server to download from by index.
+ (JSONResultsGenerator.upload_json_files): Upload the JSON to each results server.
+ (JSONResultsGenerator._get_archived_json_results): Pick which server to download from.
+ * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+ (parse_args): Allow multiple test-results-servers and results-server-hosts to be
+ passed to run-webkit-tests.
+
2017-10-09 Youenn Fablet <you...@apple.com>
Vector should be able to easily create from a list of movable only items
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py (223131 => 223132)
--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py 2017-10-10 13:02:47 UTC (rev 223131)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py 2017-10-10 15:58:42 UTC (rev 223132)
@@ -460,8 +460,7 @@
self._filesystem.remove(results_json_path)
def upload_results(self, results_json_path, start_time, end_time):
- hostname = self._options.results_server_host
- if not hostname:
+ if not self._options.results_server_host:
return
master_name = self._options.master_name
builder_name = self._options.builder_name
@@ -478,44 +477,45 @@
revision = scm.native_revision(path)
revisions[name] = {'revision': revision, 'timestamp': scm.timestamp_of_native_revision(path, revision)}
- _log.info("Uploading JSON files for master: %s builder: %s build: %s slave: %s to %s", master_name, builder_name, build_number, build_slave, hostname)
+ for hostname in self._options.results_server_host:
+ _log.info("Uploading JSON files for master: %s builder: %s build: %s slave: %s to %s", master_name, builder_name, build_number, build_slave, hostname)
- attrs = [
- ('master', 'build.webkit.org' if master_name == 'webkit.org' else master_name), # FIXME: Pass in build.webkit.org.
- ('builder_name', builder_name),
- ('build_number', build_number),
- ('build_slave', build_slave),
- ('revisions', json.dumps(revisions)),
- ('start_time', str(start_time)),
- ('end_time', str(end_time)),
- ]
+ attrs = [
+ ('master', 'build.webkit.org' if master_name == 'webkit.org' else master_name), # FIXME: Pass in build.webkit.org.
+ ('builder_name', builder_name),
+ ('build_number', build_number),
+ ('build_slave', build_slave),
+ ('revisions', json.dumps(revisions)),
+ ('start_time', str(start_time)),
+ ('end_time', str(end_time)),
+ ]
- uploader = FileUploader("http://%s/api/report" % hostname, 360)
- try:
- response = uploader.upload_as_multipart_form_data(self._filesystem, [('results.json', results_json_path)], attrs)
- if not response:
- _log.error("JSON upload failed; no response returned")
- return
+ uploader = FileUploader("http://%s/api/report" % hostname, 360)
+ try:
+ response = uploader.upload_as_multipart_form_data(self._filesystem, [('results.json', results_json_path)], attrs)
+ if not response:
+ _log.error("JSON upload failed; no response returned")
+ continue
- if response.code != 200:
- _log.error("JSON upload failed, %d: '%s'" % (response.code, response.read()))
- return
+ if response.code != 200:
+ _log.error("JSON upload failed, %d: '%s'" % (response.code, response.read()))
+ continue
- response_text = response.read()
- try:
- response_json = json.loads(response_text)
- except ValueError, error:
- _log.error("JSON upload failed; failed to parse the response: %s", response_text)
- return
+ response_text = response.read()
+ try:
+ response_json = json.loads(response_text)
+ except ValueError, error:
+ _log.error("JSON upload failed; failed to parse the response: %s", response_text)
+ continue
- if response_json['status'] != 'OK':
- _log.error("JSON upload failed, %s: %s", response_json['status'], response_text)
- return
+ if response_json['status'] != 'OK':
+ _log.error("JSON upload failed, %s: %s", response_json['status'], response_text)
+ continue
- _log.info("JSON uploaded.")
- except Exception, error:
- _log.error("Upload failed: %s" % error)
- return
+ _log.info("JSON uploaded.")
+ except Exception, error:
+ _log.error("Upload failed: %s" % error)
+ continue
def _copy_results_html_file(self, destination_path):
base_dir = self._port.path_from_webkit_base('LayoutTests', 'fast', 'harness')
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py (223131 => 223132)
--- trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py 2017-10-10 13:02:47 UTC (rev 223131)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py 2017-10-10 15:58:42 UTC (rev 223132)
@@ -54,7 +54,7 @@
def __init__(self, port, builder_name, build_name, build_number,
results_file_base_path,
expectations, run_results,
- test_results_server=None, test_type="", master_name=""):
+ test_results_servers=[], test_type="", master_name=""):
"""Modifies the results.json file. Grabs it off the archive directory
if it is not found locally.
@@ -64,7 +64,7 @@
super(JSONLayoutResultsGenerator, self).__init__(
port, builder_name, build_name, build_number, results_file_base_path,
{}, port.repository_paths(),
- test_results_server, test_type, master_name)
+ test_results_servers, test_type, master_name)
self._expectations = expectations
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py (223131 => 223132)
--- trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py 2017-10-10 13:02:47 UTC (rev 223131)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py 2017-10-10 15:58:42 UTC (rev 223132)
@@ -193,7 +193,7 @@
def __init__(self, port, builder_name, build_name, build_number,
results_file_base_path,
test_results_map, svn_repositories=None,
- test_results_server=None,
+ test_results_server=[],
test_type="",
master_name=""):
"""Modifies the results.json file. Grabs it off the archive directory
@@ -229,7 +229,7 @@
if not self._svn_repositories:
self._svn_repositories = {}
- self._test_results_server = test_results_server
+ self._test_results_servers = test_results_server
self._test_type = test_type
self._master_name = master_name
@@ -250,12 +250,12 @@
file_path = self._filesystem.join(self._results_directory, self.TIMES_MS_FILENAME)
write_json(self._filesystem, times, file_path)
- def get_json(self):
+ def get_json(self, server_index=0):
"""Gets the results for the results.json file."""
results_json = {}
if not results_json:
- results_json, error = self._get_archived_json_results()
+ results_json, error = self._get_archived_json_results(server_index=server_index)
if error:
# If there was an error don't write a results.json
# file at all as it would lose all the information on the
@@ -299,7 +299,7 @@
def upload_json_files(self, json_files):
"""Uploads the given json_files to the test_results_server (if the
test_results_server is given)."""
- if not self._test_results_server:
+ if not self._test_results_servers:
return
if not self._master_name:
@@ -314,22 +314,23 @@
files = [(file, self._filesystem.join(self._results_directory, file))
for file in json_files]
- url = "" % self._test_results_server
- # Set uploading timeout in case appengine server is having problems.
- # 120 seconds are more than enough to upload test results.
- uploader = FileUploader(url, 120)
- try:
- response = uploader.upload_as_multipart_form_data(self._filesystem, files, attrs)
- if response:
- if response.code == 200:
- _log.info("JSON uploaded.")
+ for test_results_server in self._test_results_servers:
+ url = "" % test_results_server
+ # Set uploading timeout in case appengine server is having problems.
+ # 120 seconds are more than enough to upload test results.
+ uploader = FileUploader(url, 120)
+ try:
+ response = uploader.upload_as_multipart_form_data(self._filesystem, files, attrs)
+ if response:
+ if response.code == 200:
+ _log.info("JSON uploaded.")
+ else:
+ _log.debug("JSON upload failed, %d: '%s'" % (response.code, response.read()))
else:
- _log.debug("JSON upload failed, %d: '%s'" % (response.code, response.read()))
- else:
- _log.error("JSON upload failed; no response returned")
- except Exception, err:
- _log.error("Upload failed: %s" % err)
- return
+ _log.error("JSON upload failed; no response returned")
+ except Exception, err:
+ _log.error("Upload failed: %s" % err)
+ continue
def _get_test_timing(self, test_name):
"""Returns test timing data (elapsed time) in second
@@ -390,7 +391,7 @@
return scm.svn_revision(in_directory)
return ""
- def _get_archived_json_results(self):
+ def _get_archived_json_results(self, server_index=0):
"""Download JSON file that only contains test
name list from test-results server. This is for generating incremental
JSON so the file generated has info for tests that failed before but
@@ -403,11 +404,11 @@
old_results = None
error = None
- if not self._test_results_server:
+ if len(self._test_results_servers) <= server_index:
return {}, None
results_file_url = (self.URL_FOR_TEST_LIST_JSON %
- (urllib2.quote(self._test_results_server),
+ (urllib2.quote(self._test_results_servers[server_index]),
urllib2.quote(self._builder_name),
self.RESULTS_FILENAME,
urllib2.quote(self._test_type),
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py (223131 => 223132)
--- trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py 2017-10-10 13:02:47 UTC (rev 223131)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py 2017-10-10 15:58:42 UTC (rev 223132)
@@ -331,9 +331,9 @@
help=("The name of the buildslave used. e.g. apple-macpro-6.")),
optparse.make_option("--build-number", default="DUMMY_BUILD_NUMBER",
help=("The build number of the builder running this script.")),
- optparse.make_option("--test-results-server", default="",
+ optparse.make_option("--test-results-server", action="" default=[],
help=("If specified, upload results json files to this appengine server.")),
- optparse.make_option("--results-server-host", default="",
+ optparse.make_option("--results-server-host", action="" default=[],
help=("If specified, upload results JSON file to this results server.")),
optparse.make_option("--additional-repository-name",
help=("The name of an additional subversion or git checkout")),