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..b3131d8fb5c7ffd1ad077e24a20f55ee2c1ce5d1 |
--- /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': True, |
+ '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)) |