blob: 33ad6373d8c78fec429cb4644712f922885559e4 [file] [log] [blame]
# 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 cStringIO
import mimetools
from common.buildbot import network
def Slaves(master_name):
slave_data = network.FetchData(network.BuildUrl(master_name, 'json/slaves'))
return sorted(Slave(master_name, slave_name, slave_info)
for slave_name, slave_info in slave_data.iteritems())
class Slave(object):
def __init__(self, master_name, name, data):
self._master_name = master_name
self._name = name
self._builders = frozenset(data['builders'].keys())
self._connected = data['connected']
if data['host']:
host_data = dict(mimetools.Message(cStringIO.StringIO(data['host'])))
self._bitness = 64 if '64' in host_data['architecture'] else 32
self._git_version = host_data['git version']
self._hardware = host_data['product name']
self._memory = float(host_data['memory total'].split()[0])
self._os = _ParseOs(host_data['osfamily'])
self._os_version = _ParseOsVersion(self._os, host_data['os version'])
self._processor_count = host_data['processor count']
else:
# The information is populated by Puppet. Puppet doesn't run on our GCE
# instances, so if the info is missing, assume it's in GCE.
self._bitness = 64
self._git_version = None
self._hardware = 'Compute Engine'
self._memory = None
self._os = 'linux'
self._os_version = None
self._processor_count = None
def __lt__(self, other):
return self.name < other.name
def __str__(self):
return self.name
@property
def master_name(self):
return self._master_name
@property
def name(self):
return self._name
@property
def builders(self):
return self._builders
@property
def bitness(self):
return self._bitness
@property
def git_version(self):
return self._git_version
@property
def hardware(self):
"""Returns the model of the hardware.
For example, "MacBookPro11,2", "PowerEdge R220", or "Compute Engine".
"""
return self._hardware
@property
def memory(self):
"""Returns the quantity of RAM, in GB, as a float."""
return self._memory
@property
def os(self):
"""Returns the canonical os name string.
The return value must be in the following list:
https://chromium.googlesource.com/infra/infra/+/HEAD/doc/users/services/buildbot/builders.pyl.md#os
"""
return self._os
@property
def os_version(self):
"""Returns the canonical major os version name string.
The return value must be in the following table:
https://chromium.googlesource.com/infra/infra/+/HEAD/doc/users/services/buildbot/builders.pyl.md#version
"""
return self._os_version
@property
def processor_count(self):
return self._processor_count
def _ParseOs(os_family):
return {
'darwin': 'mac',
'debian': 'linux',
'windows': 'win',
}[os_family.lower()]
def _ParseOsVersion(os, os_version):
if os == 'mac':
return '.'.join(os_version.split('.')[:2])
elif os == 'linux':
return {
'12.04': 'precise',
'14.04': 'trusty',
}[os_version]
elif os == 'win':
return {
'5.1.2600': 'xp',
'6.0.6001': 'vista',
'2008 R2': '2008', # 2008 R2
'7': 'win7',
'6.3.9600': 'win8', # 8.1
'10.0.10240': 'win10',
}[os_version]
else:
raise ValueError('"%s" is not a valid os string.' % os)