Title: [223132] trunk/Tools
Revision
223132
Author
jbed...@apple.com
Date
2017-10-10 08:58:42 -0700 (Tue, 10 Oct 2017)

Log Message

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.

Modified Paths

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")),
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to