Changeset 223132 in webkit


Ignore:
Timestamp:
Oct 10, 2017 8:58:42 AM (7 years ago)
Author:
Jonathan Bedard
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.

Location:
trunk/Tools
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r223122 r223132  
     12017-10-10  Jonathan Bedard  <jbedard@apple.com>
     2
     3        run-webkit-tests: upload test results to multiple servers
     4        https://bugs.webkit.org/show_bug.cgi?id=178012
     5        <rdar://problem/34856501>
     6
     7        Reviewed by Lucas Forschler.
     8
     9        Allowing uploading of results to multiple servers makes developing new results
     10        databases much easier, and does not complicate uploading logic.
     11
     12        * Scripts/webkitpy/layout_tests/controllers/manager.py:
     13        (Manager.upload_results): Iterate through the list of results server hosts and
     14        send results to each one.
     15        * Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py:
     16        (JSONLayoutResultsGenerator.__init__): Accept a list of test results servers.
     17        * Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py:
     18        (JSONResultsGenerator.__init__): Accept a list of test results servers.
     19        (JSONResultsGenerator.get_json): Pick which server to download from by index.
     20        (JSONResultsGenerator.upload_json_files): Upload the JSON to each results server.
     21        (JSONResultsGenerator._get_archived_json_results): Pick which server to download from.
     22        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
     23        (parse_args): Allow multiple test-results-servers and results-server-hosts to be
     24        passed to run-webkit-tests.
     25
    1262017-10-09  Youenn Fablet  <youenn@apple.com>
    227
  • trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py

    r217572 r223132  
    461461
    462462    def upload_results(self, results_json_path, start_time, end_time):
    463         hostname = self._options.results_server_host
    464         if not hostname:
     463        if not self._options.results_server_host:
    465464            return
    466465        master_name = self._options.master_name
     
    479478            revisions[name] = {'revision': revision, 'timestamp': scm.timestamp_of_native_revision(path, revision)}
    480479
    481         _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)
    482 
    483         attrs = [
    484             ('master', 'build.webkit.org' if master_name == 'webkit.org' else master_name),  # FIXME: Pass in build.webkit.org.
    485             ('builder_name', builder_name),
    486             ('build_number', build_number),
    487             ('build_slave', build_slave),
    488             ('revisions', json.dumps(revisions)),
    489             ('start_time', str(start_time)),
    490             ('end_time', str(end_time)),
    491         ]
    492 
    493         uploader = FileUploader("http://%s/api/report" % hostname, 360)
    494         try:
    495             response = uploader.upload_as_multipart_form_data(self._filesystem, [('results.json', results_json_path)], attrs)
    496             if not response:
    497                 _log.error("JSON upload failed; no response returned")
    498                 return
    499 
    500             if response.code != 200:
    501                 _log.error("JSON upload failed, %d: '%s'" % (response.code, response.read()))
    502                 return
    503 
    504             response_text = response.read()
     480        for hostname in self._options.results_server_host:
     481            _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)
     482
     483            attrs = [
     484                ('master', 'build.webkit.org' if master_name == 'webkit.org' else master_name),  # FIXME: Pass in build.webkit.org.
     485                ('builder_name', builder_name),
     486                ('build_number', build_number),
     487                ('build_slave', build_slave),
     488                ('revisions', json.dumps(revisions)),
     489                ('start_time', str(start_time)),
     490                ('end_time', str(end_time)),
     491            ]
     492
     493            uploader = FileUploader("http://%s/api/report" % hostname, 360)
    505494            try:
    506                 response_json = json.loads(response_text)
    507             except ValueError, error:
    508                 _log.error("JSON upload failed; failed to parse the response: %s", response_text)
    509                 return
    510 
    511             if response_json['status'] != 'OK':
    512                 _log.error("JSON upload failed, %s: %s", response_json['status'], response_text)
    513                 return
    514 
    515             _log.info("JSON uploaded.")
    516         except Exception, error:
    517             _log.error("Upload failed: %s" % error)
    518             return
     495                response = uploader.upload_as_multipart_form_data(self._filesystem, [('results.json', results_json_path)], attrs)
     496                if not response:
     497                    _log.error("JSON upload failed; no response returned")
     498                    continue
     499
     500                if response.code != 200:
     501                    _log.error("JSON upload failed, %d: '%s'" % (response.code, response.read()))
     502                    continue
     503
     504                response_text = response.read()
     505                try:
     506                    response_json = json.loads(response_text)
     507                except ValueError, error:
     508                    _log.error("JSON upload failed; failed to parse the response: %s", response_text)
     509                    continue
     510
     511                if response_json['status'] != 'OK':
     512                    _log.error("JSON upload failed, %s: %s", response_json['status'], response_text)
     513                    continue
     514
     515                _log.info("JSON uploaded.")
     516            except Exception, error:
     517                _log.error("Upload failed: %s" % error)
     518                continue
    519519
    520520    def _copy_results_html_file(self, destination_path):
  • trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py

    r163134 r223132  
    5555        results_file_base_path,
    5656        expectations, run_results,
    57         test_results_server=None, test_type="", master_name=""):
     57        test_results_servers=[], test_type="", master_name=""):
    5858        """Modifies the results.json file. Grabs it off the archive directory
    5959        if it is not found locally.
     
    6565            port, builder_name, build_name, build_number, results_file_base_path,
    6666            {}, port.repository_paths(),
    67             test_results_server, test_type, master_name)
     67            test_results_servers, test_type, master_name)
    6868
    6969        self._expectations = expectations
  • trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py

    r202362 r223132  
    194194        results_file_base_path,
    195195        test_results_map, svn_repositories=None,
    196         test_results_server=None,
     196        test_results_server=[],
    197197        test_type="",
    198198        master_name=""):
     
    230230            self._svn_repositories = {}
    231231
    232         self._test_results_server = test_results_server
     232        self._test_results_servers = test_results_server
    233233        self._test_type = test_type
    234234        self._master_name = master_name
     
    251251        write_json(self._filesystem, times, file_path)
    252252
    253     def get_json(self):
     253    def get_json(self, server_index=0):
    254254        """Gets the results for the results.json file."""
    255255        results_json = {}
    256256
    257257        if not results_json:
    258             results_json, error = self._get_archived_json_results()
     258            results_json, error = self._get_archived_json_results(server_index=server_index)
    259259            if error:
    260260                # If there was an error don't write a results.json
     
    300300        """Uploads the given json_files to the test_results_server (if the
    301301        test_results_server is given)."""
    302         if not self._test_results_server:
     302        if not self._test_results_servers:
    303303            return
    304304
     
    315315            for file in json_files]
    316316
    317         url = "http://%s/testfile/upload" % self._test_results_server
    318         # Set uploading timeout in case appengine server is having problems.
    319         # 120 seconds are more than enough to upload test results.
    320         uploader = FileUploader(url, 120)
    321         try:
    322             response = uploader.upload_as_multipart_form_data(self._filesystem, files, attrs)
    323             if response:
    324                 if response.code == 200:
    325                     _log.info("JSON uploaded.")
     317        for test_results_server in self._test_results_servers:
     318            url = "http://%s/testfile/upload" % test_results_server
     319            # Set uploading timeout in case appengine server is having problems.
     320            # 120 seconds are more than enough to upload test results.
     321            uploader = FileUploader(url, 120)
     322            try:
     323                response = uploader.upload_as_multipart_form_data(self._filesystem, files, attrs)
     324                if response:
     325                    if response.code == 200:
     326                        _log.info("JSON uploaded.")
     327                    else:
     328                        _log.debug("JSON upload failed, %d: '%s'" % (response.code, response.read()))
    326329                else:
    327                     _log.debug("JSON upload failed, %d: '%s'" % (response.code, response.read()))
    328             else:
    329                 _log.error("JSON upload failed; no response returned")
    330         except Exception, err:
    331             _log.error("Upload failed: %s" % err)
    332             return
     330                    _log.error("JSON upload failed; no response returned")
     331            except Exception, err:
     332                _log.error("Upload failed: %s" % err)
     333                continue
    333334
    334335    def _get_test_timing(self, test_name):
     
    391392        return ""
    392393
    393     def _get_archived_json_results(self):
     394    def _get_archived_json_results(self, server_index=0):
    394395        """Download JSON file that only contains test
    395396        name list from test-results server. This is for generating incremental
     
    404405        error = None
    405406
    406         if not self._test_results_server:
     407        if len(self._test_results_servers) <= server_index:
    407408            return {}, None
    408409
    409410        results_file_url = (self.URL_FOR_TEST_LIST_JSON %
    410             (urllib2.quote(self._test_results_server),
     411            (urllib2.quote(self._test_results_servers[server_index]),
    411412             urllib2.quote(self._builder_name),
    412413             self.RESULTS_FILENAME,
  • trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py

    r222709 r223132  
    332332        optparse.make_option("--build-number", default="DUMMY_BUILD_NUMBER",
    333333            help=("The build number of the builder running this script.")),
    334         optparse.make_option("--test-results-server", default="",
     334        optparse.make_option("--test-results-server", action="append", default=[],
    335335            help=("If specified, upload results json files to this appengine server.")),
    336         optparse.make_option("--results-server-host", default="",
     336        optparse.make_option("--results-server-host", action="append", default=[],
    337337            help=("If specified, upload results JSON file to this results server.")),
    338338        optparse.make_option("--additional-repository-name",
Note: See TracChangeset for help on using the changeset viewer.