def RecoverDevices(devices, blacklist, enable_usb_reset=False): """Attempts to recover any inoperable devices in the provided list. Args: devices: The list of devices to attempt to recover. blacklist: The current device blacklist, which will be used then reset. """ statuses = device_status.DeviceStatus(devices, blacklist) should_restart_usb = set( status['serial'] for status in statuses if (not status['usb_status'] or status['adb_status'] in ('offline', 'missing'))) should_restart_adb = should_restart_usb.union(set( status['serial'] for status in statuses if status['adb_status'] == 'unauthorized')) should_reboot_device = should_restart_usb.union(set( status['serial'] for status in statuses if status['blacklisted'])) logger.debug('Should restart USB for:') for d in should_restart_usb: logger.debug(' %s', d) logger.debug('Should restart ADB for:') for d in should_restart_adb: logger.debug(' %s', d) logger.debug('Should reboot:') for d in should_reboot_device: logger.debug(' %s', d) if blacklist: blacklist.Reset() if should_restart_adb: KillAllAdb() adb_wrapper.AdbWrapper.StartServer() for serial in should_restart_usb: try: # TODO(crbug.com/642194): Resetting may be causing more harm # (specifically, kernel panics) than it does good. if enable_usb_reset: reset_usb.reset_android_usb(serial) else: logger.warning('USB reset disabled for %s (crbug.com/642914)', serial) except IOError: logger.exception('Unable to reset USB for %s.', serial) if blacklist: blacklist.Extend([serial], reason='USB failure') except device_errors.DeviceUnreachableError: logger.exception('Unable to reset USB for %s.', serial) if blacklist: blacklist.Extend([serial], reason='offline') device_utils.DeviceUtils.parallel(devices).pMap( RecoverDevice, blacklist, should_reboot=lambda device: device.serial in should_reboot_device)
def RecoverDevices(devices, blacklist): """Attempts to recover any inoperable devices in the provided list. Args: devices: The list of devices to attempt to recover. blacklist: The current device blacklist, which will be used then reset. """ statuses = device_status.DeviceStatus(devices, blacklist) should_restart_usb = set( status['serial'] for status in statuses if (not status['usb_status'] or status['adb_status'] in ('offline', 'missing'))) should_restart_adb = should_restart_usb.union(set( status['serial'] for status in statuses if status['adb_status'] == 'unauthorized')) should_reboot_device = should_restart_adb.union(set( status['serial'] for status in statuses if status['blacklisted'])) logging.debug('Should restart USB for:') for d in should_restart_usb: logging.debug(' %s', d) logging.debug('Should restart ADB for:') for d in should_restart_adb: logging.debug(' %s', d) logging.debug('Should reboot:') for d in should_reboot_device: logging.debug(' %s', d) if blacklist: blacklist.Reset() if should_restart_adb: KillAllAdb() for serial in should_restart_usb: try: reset_usb.reset_android_usb(serial) except IOError: logging.exception('Unable to reset USB for %s.', serial) if blacklist: blacklist.Extend([serial], reason='USB failure') except device_errors.DeviceUnreachableError: logging.exception('Unable to reset USB for %s.', serial) if blacklist: blacklist.Extend([serial], reason='offline') device_utils.DeviceUtils.parallel(devices).pMap( RecoverDevice, blacklist, should_reboot=lambda device: device in should_reboot_device)