Changeset 70724 in webkit
- Timestamp:
- Oct 27, 2010 4:33:26 PM (13 years ago)
- Location:
- trunk/WebKitTools
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebKitTools/ChangeLog
r70723 r70724 1 2010-10-27 Ojan Vafai <ojan@chromium.org> 2 3 Reviewed by Dimitri Glazkov. 4 5 [chromium] Make the test results server store which master the bot is on 6 https://bugs.webkit.org/show_bug.cgi?id=48478 7 8 The chromium bots recently changed so that there are multiple slaves with 9 the same name on different masters. Up till now, the test results server 10 assumed slave names were unique. Adds a master field to the file in order 11 to distinguish. 12 13 Also, for files that currently lack a master or testtype, set them appropriately. 14 15 * TestResultServer/handlers/testfilehandler.py: 16 * TestResultServer/index.yaml: 17 * TestResultServer/model/jsonresults.py: 18 * TestResultServer/model/testfile.py: 19 * TestResultServer/templates/showfilelist.html: 20 * TestResultServer/templates/uploadform.html: 21 1 22 2010-10-26 Darin Adler <darin@apple.com> 2 23 -
trunk/WebKitTools/TestResultServer/handlers/testfilehandler.py
r65567 r70724 37 37 from model.testfile import TestFile 38 38 39 PARAM_MASTER = "master" 39 40 PARAM_BUILDER = "builder" 40 41 PARAM_DIR = "dir" … … 52 53 def get(self): 53 54 key = self.request.get(PARAM_KEY) 55 master = self.request.get(PARAM_MASTER) 54 56 builder = self.request.get(PARAM_BUILDER) 55 57 test_type = self.request.get(PARAM_TEST_TYPE) … … 57 59 58 60 logging.debug( 59 "Deleting File, builder: %s, test_type: %s, name: %s, key: %s.",60 builder, test_type, name, key)61 62 TestFile.delete_file(key, builder, test_type, name, 100)61 "Deleting File, master: %s, builder: %s, test_type: %s, name: %s, key: %s.", 62 master, builder, test_type, name, key) 63 64 TestFile.delete_file(key, master, builder, test_type, name, 100) 63 65 64 66 # Display file list after deleting the file. 65 self.redirect("/testfile? builder=%s&testtype=%s&name=%s"66 % ( builder, test_type, name))67 self.redirect("/testfile?master=%s&builder=%s&testtype=%s&name=%s" 68 % (master, builder, test_type, name)) 67 69 68 70 … … 70 72 """Get file content or list of files for given builder and name.""" 71 73 72 def _get_file_list(self, builder, test_type, name):74 def _get_file_list(self, master, builder, test_type, name): 73 75 """Get and display a list of files that matches builder and file name. 74 76 … … 80 82 81 83 files = TestFile.get_files( 82 builder, test_type, name, load_data=False, limit=100)84 master, builder, test_type, name, load_data=False, limit=100) 83 85 if not files: 84 logging.info("File not found, builder: %s, test_type: %s, name: %s.",85 builder, test_type, name)86 logging.info("File not found, master: %s, builder: %s, test_type: %s, name: %s.", 87 master, builder, test_type, name) 86 88 self.response.out.write("File not found") 87 89 return … … 89 91 template_values = { 90 92 "admin": users.is_current_user_admin(), 93 "master": master, 91 94 "builder": builder, 92 95 "test_type": test_type, … … 97 100 template_values)) 98 101 99 def _get_file_content(self, builder, test_type, name):102 def _get_file_content(self, master, builder, test_type, name): 100 103 """Return content of the file that matches builder and file name. 101 104 … … 107 110 108 111 files = TestFile.get_files( 109 builder, test_type, name, load_data=True, limit=1)112 master, builder, test_type, name, load_data=True, limit=1) 110 113 if not files: 111 logging.info("File not found, builder: %s, test_type: %s, name: %s.",112 builder, test_type, name)114 logging.info("File not found, master %s, builder: %s, test_type: %s, name: %s.", 115 master, builder, test_type, name) 113 116 return None 114 117 115 118 return files[0].data 116 119 117 def _get_test_list_json(self, builder, test_type):120 def _get_test_list_json(self, master, builder, test_type): 118 121 """Return json file with test name list only, do not include test 119 122 results and other non-test-data . … … 124 127 """ 125 128 126 json = self._get_file_content( builder, test_type, "results.json")129 json = self._get_file_content(master, builder, test_type, "results.json") 127 130 if not json: 128 131 return None … … 131 134 132 135 def get(self): 136 master = self.request.get(PARAM_MASTER) 133 137 builder = self.request.get(PARAM_BUILDER) 134 138 test_type = self.request.get(PARAM_TEST_TYPE) … … 138 142 139 143 logging.debug( 140 "Getting files, builder: %s, test_type: %s, name: %s.",141 builder, test_type, name)144 "Getting files, master %s, builder: %s, test_type: %s, name: %s.", 145 master, builder, test_type, name) 142 146 143 147 # If parameter "dir" is specified or there is no builder or filename … … 145 149 # file content. 146 150 if dir or not builder or not name: 147 return self._get_file_list( builder, test_type, name)151 return self._get_file_list(master, builder, test_type, name) 148 152 149 153 if name == "results.json" and test_list_json: 150 json = self._get_test_list_json( builder, test_type)154 json = self._get_test_list_json(master, builder, test_type) 151 155 else: 152 json = self._get_file_content( builder, test_type, name)156 json = self._get_file_content(master, builder, test_type, name) 153 157 154 158 if json: … … 171 175 return 172 176 177 master = self.request.get(PARAM_MASTER) 173 178 test_type = self.request.get(PARAM_TEST_TYPE) 174 179 incremental = self.request.get(PARAM_INCREMENTAL) 175 180 176 181 logging.debug( 177 "Processing upload request, builder: %s, test_type: %s.",178 builder, test_type)182 "Processing upload request, master: %s, builder: %s, test_type: %s.", 183 master, builder, test_type) 179 184 180 185 # There are two possible types of each file_params in the request: … … 194 199 (filename == "incremental_results.json")): 195 200 # Merge incremental json results. 196 saved_file = JsonResults.update( builder, test_type, file.value)201 saved_file = JsonResults.update(master, builder, test_type, file.value) 197 202 else: 198 203 saved_file = TestFile.update( 199 builder, test_type, file.filename, file.value)204 master, builder, test_type, file.filename, file.value) 200 205 201 206 if not saved_file: 202 207 errors.append( 203 "Upload failed, builder: %s, test_type: %s, name: %s." %204 ( builder, test_type, file.filename))208 "Upload failed, master: %s, builder: %s, test_type: %s, name: %s." % 209 (master, builder, test_type, file.filename)) 205 210 206 211 if errors: -
trunk/WebKitTools/TestResultServer/index.yaml
r56635 r70724 26 26 properties: 27 27 - name: builder 28 - name: master 29 - name: name 30 - name: test_type 31 - name: date 32 direction: desc 33 34 - kind: TestFile 35 properties: 36 - name: builder 28 37 - name: name 29 38 - name: date … … 40 49 - kind: TestFile 41 50 properties: 51 - name: master 52 - name: date 53 direction: desc 54 55 - kind: TestFile 56 properties: 42 57 - name: name 43 58 - name: date -
trunk/WebKitTools/TestResultServer/model/jsonresults.py
r66953 r70724 392 392 393 393 @classmethod 394 def update(cls, builder, test_type, incremental):394 def update(cls, master, builder, test_type, incremental): 395 395 """Update datastore json file data by merging it with incremental json 396 396 file. … … 406 406 """ 407 407 408 files = TestFile.get_files( builder, test_type, JSON_RESULTS_FILE)408 files = TestFile.get_files(master, builder, test_type, JSON_RESULTS_FILE) 409 409 if files: 410 410 file = files[0] 411 412 # FIXME: This is here to fill in the missing master/test_type for the already uploaded 413 # results files, which all are layout_tests from the chromium master. 414 # Remove this once all the builders upload with the master/test_type field set. 415 if not file.master: 416 file.master = "chromium" 417 if not file.test_type: 418 file.test_type = "layout-tests" 419 411 420 new_results = cls.merge(builder, file.data, incremental) 412 421 else: 413 422 # Use the incremental data if there is no aggregated file to merge. 414 423 file = TestFile() 424 file.master = master 415 425 file.builder = builder 416 426 file.test_type = test_type -
trunk/WebKitTools/TestResultServer/model/testfile.py
r64687 r70724 36 36 37 37 class TestFile(DataStoreFile): 38 master = db.StringProperty() 38 39 builder = db.StringProperty() 39 40 test_type = db.StringProperty() 40 41 41 42 @classmethod 42 def delete_file(cls, key, builder, test_type, name, limit):43 def delete_file(cls, key, master, builder, test_type, name, limit): 43 44 if key: 44 45 file = db.get(key) … … 49 50 file._delete_all() 50 51 else: 51 files = cls.get_files( builder, test_type, name, limit)52 files = cls.get_files(master, builder, test_type, name, limit) 52 53 if not files: 53 54 logging.warning( 54 "File not found, builder: %s, test_type:%s, name: %s.",55 "File not found, master: %s, builder: %s, test_type:%s, name: %s.", 55 56 builder, test_type, name) 56 57 return False … … 62 63 63 64 @classmethod 64 def get_files(cls, builder, test_type, name, load_data=True, limit=1):65 def get_files(cls, master, builder, test_type, name, load_data=True, limit=1): 65 66 query = TestFile.all() 67 if master: 68 query = query.filter("master =", master) 66 69 if builder: 67 70 query = query.filter("builder =", builder) … … 79 82 80 83 @classmethod 81 def add_file(cls, builder, test_type, name, data):84 def add_file(cls, master, builder, test_type, name, data): 82 85 file = TestFile() 86 file.master = master 83 87 file.builder = builder 84 88 file.test_type = test_type … … 89 93 90 94 logging.info( 91 "File saved, builder: %s, test_type: %s, name: %s, key: %s.",92 builder, test_type, file.name, str(file.data_keys))95 "File saved, master: %s, builder: %s, test_type: %s, name: %s, key: %s.", 96 master, builder, test_type, file.name, str(file.data_keys)) 93 97 94 98 return file 95 99 96 100 @classmethod 97 def update(cls, builder, test_type, name, data):98 files = cls.get_files( builder, test_type, name)101 def update(cls, master, builder, test_type, name, data): 102 files = cls.get_files(master, builder, test_type, name) 99 103 if not files: 100 return cls.add_file( builder, test_type, name, data)104 return cls.add_file(master, builder, test_type, name, data) 101 105 102 106 file = files[0] 107 108 # FIXME: This is here to fill in the missing master/test_type for the already uploaded 109 # results files, which all are layout_tests from the chromium master. 110 # Remove this once all the builders upload with the master/test_type field set. 111 if not file.master: 112 file.master = "chromium" 113 if not file.test_type: 114 file.test_type = "layout-tests" 115 103 116 if not file.save(data): 104 117 return None 105 118 106 119 logging.info( 107 "File replaced, builder: %s, test_type: %s, name: %s, data key: %s.",108 builder, test_type, file.name, str(file.data_keys))120 "File replaced, master: %s, builder: %s, test_type: %s, name: %s, data key: %s.", 121 master, builder, test_type, file.name, str(file.data_keys)) 109 122 110 123 return file -
trunk/WebKitTools/TestResultServer/templates/showfilelist.html
r56635 r70724 14 14 <table> 15 15 <tr> 16 <th>Master</th> 16 17 <th>Builder</th> 17 18 <th>Test Type</th> … … 23 24 {% for file in files %} 24 25 <tr>{% if file.builder and file.name %} 26 <td><a href="/testfile?master={{ file.master }}" > 27 {{ file.master }} 28 </a> 29 </td> 25 30 <td><a href="/testfile?builder={{ file.builder }}" > 26 31 {{ file.builder }} -
trunk/WebKitTools/TestResultServer/templates/uploadform.html
r64687 r70724 11 11 <table> 12 12 <tr> 13 <td class=label><label>Master:</label></td> 14 <td><input class=inputtext type="text" name="master" placeholder="chromium"/></td> 15 </tr> 16 <tr> 13 17 <td class=label><label>Builder:</label></td> 14 <td><input class=inputtext type="text" name="builder" value="Webkit"/></td>18 <td><input class=inputtext type="text" name="builder" placeholder="Webkit"/></td> 15 19 </tr> 16 20 <tr> 17 21 <td class=label><label>Test Type:</label></td> 18 <td><input class=inputtext type="text" name="testtype" value=""/></td>22 <td><input class=inputtext type="text" name="testtype" placeholder="layout-tests"/></td> 19 23 </tr> 20 24 </table>
Note: See TracChangeset
for help on using the changeset viewer.