Chromium Code Reviews| Index: testing/scripts/host_info.py |
| diff --git a/testing/scripts/host_info.py b/testing/scripts/host_info.py |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..fc45d2ee9ff77e41fdbb15e3965ec9b3ea95b979 |
| --- /dev/null |
| +++ b/testing/scripts/host_info.py |
| @@ -0,0 +1,136 @@ |
| +#!/usr/bin/env python |
| +# Copyright 2015 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. |
| + |
| +import json |
| +import multiprocessing |
| +import os |
| +import platform |
| +import subprocess |
| +import sys |
| + |
| + |
| +import common |
| + |
| + |
| +def is_linux(): |
| + return sys.platform.startswith('linux') |
| + |
| + |
| +def get_free_disk_space(failures): |
| + """Returns the amount of free space on the current disk, in GiB. |
| + |
| + Returns: |
| + The amount of free space on the current disk, measured in GiB. |
| + """ |
| + if os.name == 'posix': |
| + # Stat the current path for info on the current disk. |
| + stat_result = os.statvfs('.') |
| + # Multiply block size by number of free blocks, express in GiB. |
| + return stat_result.f_frsize * stat_result.f_bavail / ( |
| + 1024.0 / 1024.0 / 1024.0) |
| + |
| + failures.append('get_free_disk_space: OS %s not supported.' % os.name) |
| + return 0 |
| + |
| + |
| +def get_num_cpus(failures): |
| + """Returns the number of logical CPUs on this machine. |
| + |
| + Returns: |
| + The number of logical CPUs on this machine, or 'unknown' if indeterminate. |
| + """ |
| + try: |
| + return multiprocessing.cpu_count() |
| + except NotImplementedError: |
| + failures.append('get_num_cpus') |
| + return 'unknown' |
| + |
| + |
| +def get_device_info(args, failures): |
| + """Parses the device info for each attached device, and returns a summary |
| + of the device info and any mismatches. |
| + |
| + Returns: |
| + A dict indicating the result. |
| + """ |
| + if not is_linux(): |
| + return {} |
| + |
| + with common.temporary_file() as tempfile_path: |
| + rc = common.run_command([ |
| + sys.executable, |
| + os.path.join(args.paths['checkout'], |
| + 'build', |
| + 'android', |
| + 'buildbot', |
| + 'bb_device_status_check.py'), |
| + '--json-output', tempfile_path]) |
| + |
| + if rc: |
| + failures.append('bb_device_status_check') |
| + return {} |
| + |
| + with open(tempfile_path, 'r') as src: |
| + device_info = json.load(src) |
| + |
| + results = {} |
| + results['devices'] = sorted(v['serial'] for v in device_info) |
| + |
| + details = [v['build_detail'] for v in device_info] |
| + |
| + def unique_build_details(index): |
| + return sorted(list(set([v.split(':')[index] for v in details]))) |
| + |
| + parsed_details = { |
| + 'device_names': unique_build_details(0), |
| + 'build_versions': unique_build_details(1), |
| + 'build_types': unique_build_details(2), |
| + } |
| + |
| + for k, v in parsed_details.iteritems(): |
| + if len(v) == 1: |
| + results[k] = v[0] |
| + else: |
| + results[k] = 'MISMATCH' |
| + results['%s_list' % k] = v |
| + failures.append(k) |
| + |
| + return results |
| + |
| + |
| +def main_run(args): |
| + failures = [] |
| + host_info = {} |
| + host_info['os_system'] = platform.system() |
| + host_info['os_release'] = platform.release() |
| + |
| + host_info['processor'] = platform.processor() |
| + host_info['num_cpus'] = get_num_cpus(failures) |
| + host_info['free_disk_space'] = get_free_disk_space(failures) |
| + |
| + host_info['python_version'] = platform.python_version() |
| + host_info['python_path'] = sys.executable |
| + |
| + host_info['devices'] = get_device_info(args, failures) |
| + |
| + json.dump({ |
| + 'valid': bool(not failures), |
|
Paweł Hajdan Jr.
2015/02/17 16:07:01
This is _valid_ , not e.g. "successful". Looks lik
shatch
2015/02/17 16:49:22
Done.
|
| + 'failures': failures, |
| + '_host_info': host_info, |
| + }, args.output) |
| + |
| + return len(failures) != 0 |
| + |
| + |
| +def main_compile_targets(args): |
| + json.dump([], args.output) |
| + |
| + |
| +if __name__ == '__main__': |
| + funcs = { |
| + 'run': main_run, |
| + 'compile_targets': main_compile_targets, |
| + } |
| + sys.exit(common.run_script(sys.argv[1:], funcs)) |