| Index: build/android/device_status_check.py
|
| diff --git a/build/android/device_status_check.py b/build/android/device_status_check.py
|
| deleted file mode 100755
|
| index cd8415378bb5ce6388978dec86cd62aafd74f71d..0000000000000000000000000000000000000000
|
| --- a/build/android/device_status_check.py
|
| +++ /dev/null
|
| @@ -1,233 +0,0 @@
|
| -#!/usr/bin/env python
|
| -#
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""A class to keep track of devices across builds and report state."""
|
| -import logging
|
| -import optparse
|
| -import os
|
| -import smtplib
|
| -import sys
|
| -import re
|
| -
|
| -from pylib import android_commands
|
| -from pylib import buildbot_report
|
| -from pylib import constants
|
| -from pylib.cmd_helper import GetCmdOutput
|
| -
|
| -
|
| -def DeviceInfo(serial, options):
|
| - """Gathers info on a device via various adb calls.
|
| -
|
| - Args:
|
| - serial: The serial of the attached device to construct info about.
|
| -
|
| - Returns:
|
| - Tuple of device type, build id, report as a string, error messages, and
|
| - boolean indicating whether or not device can be used for testing.
|
| - """
|
| -
|
| - def AdbShellCmd(cmd):
|
| - return GetCmdOutput('adb -s %s shell %s' % (serial, cmd),
|
| - shell=True).strip()
|
| -
|
| - device_adb = android_commands.AndroidCommands(serial)
|
| -
|
| - # TODO(navabi): Replace AdbShellCmd with device_adb.
|
| - device_type = AdbShellCmd('getprop ro.build.product')
|
| - device_build = AdbShellCmd('getprop ro.build.id')
|
| - device_build_type = AdbShellCmd('getprop ro.build.type')
|
| - device_product_name = AdbShellCmd('getprop ro.product.name')
|
| -
|
| - setup_wizard_disabled = AdbShellCmd(
|
| - 'getprop ro.setupwizard.mode') == 'DISABLED'
|
| - battery = AdbShellCmd('dumpsys battery')
|
| - install_output = GetCmdOutput(
|
| - ['%s/build/android/adb_install_apk.py' % constants.DIR_SOURCE_ROOT, '--apk',
|
| - '%s/build/android/CheckInstallApk-debug.apk' % constants.DIR_SOURCE_ROOT])
|
| - install_speed_found = re.findall('(\d+) KB/s', install_output)
|
| - if install_speed_found:
|
| - install_speed = int(install_speed_found[0])
|
| - else:
|
| - install_speed = 'Unknown'
|
| - if 'Error' in battery:
|
| - ac_power = 'Unknown'
|
| - battery_level = 'Unknown'
|
| - battery_temp = 'Unknown'
|
| - else:
|
| - ac_power = re.findall('AC powered: (\w+)', battery)[0]
|
| - battery_level = int(re.findall('level: (\d+)', battery)[0])
|
| - battery_temp = float(re.findall('temperature: (\d+)', battery)[0]) / 10
|
| - report = ['Device %s (%s)' % (serial, device_type),
|
| - ' Build: %s (%s)' % (device_build,
|
| - AdbShellCmd('getprop ro.build.fingerprint')),
|
| - ' Battery: %s%%' % battery_level,
|
| - ' Battery temp: %s' % battery_temp,
|
| - ' IMEI slice: %s' % AdbShellCmd('dumpsys iphonesubinfo '
|
| - '| grep Device'
|
| - "| awk '{print $4}'")[-6:],
|
| - ' Wifi IP: %s' % AdbShellCmd('getprop dhcp.wlan0.ipaddress'),
|
| - ' Install Speed: %s KB/s' % install_speed,
|
| - '']
|
| -
|
| - errors = []
|
| - if battery_level < 15:
|
| - errors += ['Device critically low in battery. Turning off device.']
|
| - if (not setup_wizard_disabled and device_build_type != 'user' and
|
| - not options.no_provisioning_check):
|
| - errors += ['Setup wizard not disabled. Was it provisioned correctly?']
|
| - if device_product_name == 'mantaray' and ac_power != 'true':
|
| - errors += ['Mantaray device not connected to AC power.']
|
| - # TODO(navabi): Insert warning once we have a better handle of what install
|
| - # speeds to expect. The following lines were causing too many alerts.
|
| - # if install_speed < 500:
|
| - # errors += ['Device install speed too low. Do not use for testing.']
|
| -
|
| - # Causing the device status check step fail for slow install speed or low
|
| - # battery currently is too disruptive to the bots (especially try bots).
|
| - # Turn off devices with low battery and the step does not fail.
|
| - if battery_level < 15:
|
| - device_adb.EnableAdbRoot()
|
| - AdbShellCmd('reboot -p')
|
| - return device_type, device_build, '\n'.join(report), errors, True
|
| -
|
| -
|
| -def CheckForMissingDevices(options, adb_online_devs):
|
| - """Uses file of previous online devices to detect broken phones.
|
| -
|
| - Args:
|
| - options: out_dir parameter of options argument is used as the base
|
| - directory to load and update the cache file.
|
| - adb_online_devs: A list of serial numbers of the currently visible
|
| - and online attached devices.
|
| - """
|
| - # TODO(navabi): remove this once the bug that causes different number
|
| - # of devices to be detected between calls is fixed.
|
| - logger = logging.getLogger()
|
| - logger.setLevel(logging.INFO)
|
| -
|
| - out_dir = os.path.abspath(options.out_dir)
|
| -
|
| - def ReadDeviceList(file_name):
|
| - devices_path = os.path.join(out_dir, file_name)
|
| - devices = []
|
| - try:
|
| - with open(devices_path) as f:
|
| - devices = f.read().splitlines()
|
| - except IOError:
|
| - # Ignore error, file might not exist
|
| - pass
|
| - return devices
|
| -
|
| - def WriteDeviceList(file_name, device_list):
|
| - path = os.path.join(out_dir, file_name)
|
| - if not os.path.exists(out_dir):
|
| - os.makedirs(out_dir)
|
| - with open(path, 'w') as f:
|
| - # Write devices currently visible plus devices previously seen.
|
| - f.write('\n'.join(set(device_list)))
|
| -
|
| - last_devices_path = os.path.join(out_dir, '.last_devices')
|
| - last_devices = ReadDeviceList('.last_devices')
|
| - missing_devs = list(set(last_devices) - set(adb_online_devs))
|
| -
|
| - all_known_devices = list(set(adb_online_devs) | set(last_devices))
|
| - WriteDeviceList('.last_devices', all_known_devices)
|
| - WriteDeviceList('.last_missing', missing_devs)
|
| -
|
| - if not all_known_devices:
|
| - # This can happen if for some reason the .last_devices file is not
|
| - # present or if it was empty.
|
| - return ['No online devices. Have any devices been plugged in?']
|
| - if missing_devs:
|
| - devices_missing_msg = '%d devices not detected.' % len(missing_devs)
|
| - buildbot_report.PrintSummaryText(devices_missing_msg)
|
| -
|
| - # TODO(navabi): Debug by printing both output from GetCmdOutput and
|
| - # GetAttachedDevices to compare results.
|
| - return ['Current online devices: %s' % adb_online_devs,
|
| - '%s are no longer visible. Were they removed?\n' % missing_devs,
|
| - 'SHERIFF: See go/chrome_device_monitor',
|
| - 'Cache file: %s\n\n' % last_devices_path,
|
| - 'adb devices: %s' % GetCmdOutput(['adb', 'devices']),
|
| - 'adb devices(GetAttachedDevices): %s' %
|
| - android_commands.GetAttachedDevices()]
|
| - else:
|
| - new_devs = set(adb_online_devs) - set(last_devices)
|
| - if new_devs and os.path.exists(last_devices_path):
|
| - buildbot_report.PrintWarning()
|
| - buildbot_report.PrintSummaryText(
|
| - '%d new devices detected' % len(new_devs))
|
| - print ('New devices detected %s. And now back to your '
|
| - 'regularly scheduled program.' % list(new_devs))
|
| -
|
| -
|
| -def SendDeviceStatusAlert(msg):
|
| - from_address = 'buildbot@chromium.org'
|
| - to_address = 'chromium-android-device-alerts@google.com'
|
| - bot_name = os.environ.get('BUILDBOT_BUILDERNAME')
|
| - slave_name = os.environ.get('BUILDBOT_SLAVENAME')
|
| - subject = 'Device status check errors on %s, %s.' % (slave_name, bot_name)
|
| - msg_body = '\r\n'.join(['From: %s' % from_address, 'To: %s' % to_address,
|
| - 'Subject: %s' % subject, '', msg])
|
| - try:
|
| - server = smtplib.SMTP('localhost')
|
| - server.sendmail(from_address, [to_address], msg_body)
|
| - server.quit()
|
| - except Exception as e:
|
| - print 'Failed to send alert email. Error: %s' % e
|
| -
|
| -
|
| -def main():
|
| - parser = optparse.OptionParser()
|
| - parser.add_option('', '--out-dir',
|
| - help='Directory where the device path is stored',
|
| - default=os.path.join(os.path.dirname(__file__), '..',
|
| - '..', 'out'))
|
| - parser.add_option('--no-provisioning-check',
|
| - help='Will not check if devices are provisioned properly.')
|
| -
|
| - options, args = parser.parse_args()
|
| - if args:
|
| - parser.error('Unknown options %s' % args)
|
| - devices = android_commands.GetAttachedDevices()
|
| - types, builds, reports, errors = [], [], [], []
|
| - fail_step_lst = []
|
| - if devices:
|
| - types, builds, reports, errors, fail_step_lst = (
|
| - zip(*[DeviceInfo(dev, options) for dev in devices]))
|
| -
|
| - err_msg = CheckForMissingDevices(options, devices) or []
|
| -
|
| - unique_types = list(set(types))
|
| - unique_builds = list(set(builds))
|
| -
|
| - buildbot_report.PrintMsg('Online devices: %d. Device types %s, builds %s'
|
| - % (len(devices), unique_types, unique_builds))
|
| - print '\n'.join(reports)
|
| -
|
| - for serial, dev_errors in zip(devices, errors):
|
| - if dev_errors:
|
| - err_msg += ['%s errors:' % serial]
|
| - err_msg += [' %s' % error for error in dev_errors]
|
| -
|
| - if err_msg:
|
| - buildbot_report.PrintWarning()
|
| - msg = '\n'.join(err_msg)
|
| - print msg
|
| - SendDeviceStatusAlert(msg)
|
| -
|
| - if False in fail_step_lst:
|
| - # TODO(navabi): Build fails on device status check step if there exists any
|
| - # devices with critically low battery or install speed. Remove those devices
|
| - # from testing, allowing build to continue with good devices.
|
| - return 1
|
| -
|
| - if not devices:
|
| - return 1
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - sys.exit(main())
|
|
|