# 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)