OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright 2013 The Chromium Authors. All rights reserved. | 3 # Copyright 2013 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """A class to keep track of devices across builds and report state.""" | 7 """A class to keep track of devices across builds and report state.""" |
8 import json | 8 import json |
9 import logging | 9 import logging |
10 import optparse | 10 import optparse |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 except (psutil.NoSuchProcess, psutil.AccessDenied): | 217 except (psutil.NoSuchProcess, psutil.AccessDenied): |
218 pass | 218 pass |
219 for p in GetAllAdb(): | 219 for p in GetAllAdb(): |
220 try: | 220 try: |
221 logging.error('Unable to kill %d (%s [%s])', p.pid, p.name, | 221 logging.error('Unable to kill %d (%s [%s])', p.pid, p.name, |
222 ' '.join(p.cmdline)) | 222 ' '.join(p.cmdline)) |
223 except (psutil.NoSuchProcess, psutil.AccessDenied): | 223 except (psutil.NoSuchProcess, psutil.AccessDenied): |
224 pass | 224 pass |
225 | 225 |
226 | 226 |
227 def main(): | 227 def RecoverDevices(args): |
228 parser = optparse.OptionParser() | |
229 parser.add_option('', '--out-dir', | |
230 help='Directory where the device path is stored', | |
231 default=os.path.join(constants.DIR_SOURCE_ROOT, 'out')) | |
232 parser.add_option('--no-provisioning-check', action='store_true', | |
233 help='Will not check if devices are provisioned properly.') | |
234 parser.add_option('--device-status-dashboard', action='store_true', | |
235 help='Output device status data for dashboard.') | |
236 parser.add_option('--restart-usb', action='store_true', | |
237 help='DEPRECATED. ' | |
238 'This script now always tries to reset USB.') | |
239 parser.add_option('--json-output', | |
240 help='Output JSON information into a specified file.') | |
241 parser.add_option('-v', '--verbose', action='count', default=1, | |
242 help='Log more information.') | |
243 | |
244 options, args = parser.parse_args() | |
245 if args: | |
246 parser.error('Unknown options %s' % args) | |
247 | |
248 run_tests_helper.SetLogLevel(options.verbose) | |
249 | |
250 # Remove the last build's "bad devices" before checking device statuses. | 228 # Remove the last build's "bad devices" before checking device statuses. |
251 device_blacklist.ResetBlacklist() | 229 device_blacklist.ResetBlacklist() |
252 | 230 |
| 231 previous_devices = set(a.GetDeviceSerial() |
| 232 for a in adb_wrapper.AdbWrapper.Devices()) |
| 233 |
253 KillAllAdb() | 234 KillAllAdb() |
254 reset_usb.reset_all_android_devices() | 235 reset_usb.reset_all_android_devices() |
255 | 236 |
256 try: | 237 try: |
257 expected_devices = set(device_list.GetPersistentDeviceList( | 238 expected_devices = set(device_list.GetPersistentDeviceList( |
258 os.path.join(options.out_dir, device_list.LAST_DEVICES_FILENAME))) | 239 os.path.join(args.out_dir, device_list.LAST_DEVICES_FILENAME))) |
259 except IOError: | 240 except IOError: |
260 expected_devices = set() | 241 expected_devices = set() |
261 | 242 |
262 def all_devices_found(): | 243 all_devices = [device_utils.DeviceUtils(d) |
263 devices = device_utils.DeviceUtils.HealthyDevices() | 244 for d in previous_devices.union(expected_devices)] |
264 device_serials = set(d.adb.GetDeviceSerial() for d in devices) | |
265 return not bool(expected_devices.difference(device_serials)) | |
266 | 245 |
267 timeout_retry.WaitFor(all_devices_found, wait_period=1, max_tries=5) | 246 def blacklisting_recovery(device): |
| 247 try: |
| 248 device.WaitUntilFullyBooted() |
| 249 except device_errors.CommandFailedError: |
| 250 logging.exception('Failure while waiting for %s. Adding to blacklist.', |
| 251 str(device)) |
| 252 device_blacklist.ExtendBlacklist([str(device)]) |
| 253 except device_errors.CommandTimeoutError: |
| 254 logging.exception('Timed out while waiting for %s. Adding to blacklist.', |
| 255 str(device)) |
| 256 device_blacklist.ExtendBlacklist([str(device)]) |
| 257 |
| 258 device_utils.DeviceUtils.parallel(all_devices).pMap(blacklisting_recovery) |
268 | 259 |
269 devices = device_utils.DeviceUtils.HealthyDevices() | 260 devices = device_utils.DeviceUtils.HealthyDevices() |
270 device_serials = set(d.adb.GetDeviceSerial() for d in devices) | 261 device_serials = set(d.adb.GetDeviceSerial() for d in devices) |
271 | 262 |
272 missing_devices = expected_devices.difference(device_serials) | 263 missing_devices = expected_devices.difference(device_serials) |
273 new_devices = device_serials.difference(expected_devices) | 264 new_devices = device_serials.difference(expected_devices) |
274 | 265 |
275 if missing_devices or new_devices: | 266 if missing_devices or new_devices: |
276 logging.warning('expected_devices:') | 267 logging.warning('expected_devices:') |
277 for d in sorted(expected_devices): | 268 for d in sorted(expected_devices): |
278 logging.warning(' %s', d) | 269 logging.warning(' %s', d) |
279 logging.warning('devices:') | 270 logging.warning('devices:') |
280 for d in sorted(device_serials): | 271 for d in sorted(device_serials): |
281 logging.warning(' %s', d) | 272 logging.warning(' %s', d) |
282 | 273 |
| 274 return devices |
| 275 |
| 276 |
| 277 def main(): |
| 278 parser = optparse.OptionParser() |
| 279 parser.add_option('', '--out-dir', |
| 280 help='Directory where the device path is stored', |
| 281 default=os.path.join(constants.DIR_SOURCE_ROOT, 'out')) |
| 282 parser.add_option('--no-provisioning-check', action='store_true', |
| 283 help='Will not check if devices are provisioned properly.') |
| 284 parser.add_option('--device-status-dashboard', action='store_true', |
| 285 help='Output device status data for dashboard.') |
| 286 parser.add_option('--restart-usb', action='store_true', |
| 287 help='DEPRECATED. ' |
| 288 'This script now always tries to reset USB.') |
| 289 parser.add_option('--json-output', |
| 290 help='Output JSON information into a specified file.') |
| 291 parser.add_option('-v', '--verbose', action='count', default=1, |
| 292 help='Log more information.') |
| 293 |
| 294 options, args = parser.parse_args() |
| 295 if args: |
| 296 parser.error('Unknown options %s' % args) |
| 297 |
| 298 run_tests_helper.SetLogLevel(options.verbose) |
| 299 |
| 300 devices = RecoverDevices(options) |
| 301 |
283 types, builds, batteries, errors, devices_ok, json_data = ( | 302 types, builds, batteries, errors, devices_ok, json_data = ( |
284 [], [], [], [], [], []) | 303 [], [], [], [], [], []) |
285 if devices: | 304 if devices: |
286 types, builds, batteries, errors, devices_ok, json_data = ( | 305 types, builds, batteries, errors, devices_ok, json_data = ( |
287 zip(*[DeviceInfo(dev, options) for dev in devices])) | 306 zip(*[DeviceInfo(dev, options) for dev in devices])) |
288 | 307 |
289 # Write device info to file for buildbot info display. | 308 # Write device info to file for buildbot info display. |
290 if os.path.exists('/home/chrome-bot'): | 309 if os.path.exists('/home/chrome-bot'): |
291 with open('/home/chrome-bot/.adb_device_info', 'w') as f: | 310 with open('/home/chrome-bot/.adb_device_info', 'w') as f: |
292 for device in json_data: | 311 for device in json_data: |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 | 379 |
361 if num_failed_devs == len(devices): | 380 if num_failed_devs == len(devices): |
362 return 2 | 381 return 2 |
363 | 382 |
364 if not devices: | 383 if not devices: |
365 return 1 | 384 return 1 |
366 | 385 |
367 | 386 |
368 if __name__ == '__main__': | 387 if __name__ == '__main__': |
369 sys.exit(main()) | 388 sys.exit(main()) |
OLD | NEW |