#!/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.

"""Query build slave hardware info, and print it to stdout as csv."""

import csv
import json
import logging
import sys
import urllib2


_MASTERS = [
    'chromium.perf',
    'client.catapult',
    'tryserver.chromium.perf',
    'tryserver.client.catapult',
]


_KEYS = [
    'master', 'builder', 'hostname',

    'os family', 'os version',

    'product name', 'architecture', 'processor count', 'processor type',
    'memory total',

    'facter version', 'git version', 'puppet version', 'python version',
    'ruby version',

    'android device 1', 'android device 2', 'android device 3',
    'android device 4', 'android device 5', 'android device 6',
    'android device 7',
]
_EXCLUDED_KEYS = frozenset([
    'architecture (userland)',
    'b directory',
    'last puppet run',
    'uptime',
    'windows version',
])


def main():
  writer = csv.DictWriter(sys.stdout, _KEYS)
  writer.writeheader()

  for master_name in _MASTERS:
    master_data = json.load(urllib2.urlopen(
        'http://build.chromium.org/p/%s/json/slaves' % master_name))

    slaves = sorted(master_data.iteritems(),
                    key=lambda x: (x[1]['builders'].keys(), x[0]))
    for slave_name, slave_data in slaves:
      for builder_name in slave_data['builders']:
        row = {
            'master': master_name,
            'builder': builder_name,
            'hostname': slave_name,
        }

        host_data = slave_data['host']
        if host_data:
          host_data = host_data.splitlines()
          if len(host_data) > 1:
            for line in host_data:
              if not line:
                continue
              key, value = line.split(': ')
              if key in _EXCLUDED_KEYS:
                continue
              row[key] = value

        # Munge keys.
        row = {key.replace('_', ' '): value for key, value in row.iteritems()}
        if 'osfamily' in row:
          row['os family'] = row.pop('osfamily')
        if 'product name' not in row and slave_name.startswith('slave'):
          row['product name'] = 'Google Compute Engine'

        try:
          writer.writerow(row)
        except ValueError:
          logging.error(row)
          raise


if __name__ == '__main__':
  main()
