base_utils.py revision 0afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181
1c86b0b45cd0198d99d271a79f8b6de29feb98cd5mbligh"""Convenience functions for use by tests or whomever. 2c86b0b45cd0198d99d271a79f8b6de29feb98cd5mbligh""" 3c86b0b45cd0198d99d271a79f8b6de29feb98cd5mbligh 49fb37cba7a49579cf484350b9b1e1a1135d6af0emblighimport os, shutil, sys, signal, commands, pickle, glob, statvfs 59fb37cba7a49579cf484350b9b1e1a1135d6af0emblighimport re, string, fnmatch 69fb37cba7a49579cf484350b9b1e1a1135d6af0emblighfrom autotest_lib.client.common_lib import error, utils 7f4c35322b200d65f41a8332b4f3503beb497840dmbligh 8ea397bbc85f1a3eda39c9f2ef4fc209b4ff336f4mbligh 9ea397bbc85f1a3eda39c9f2ef4fc209b4ff336f4mbligh 10f4c35322b200d65f41a8332b4f3503beb497840dmblighdef grep(pattern, file): 110afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 120afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski This is mainly to fix the return code inversion from grep 130afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Also handles compressed files. 147bdbfbdf088f9c2a72c199d5a530194bb2ac257fmbligh 150afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski returns 1 if the pattern is present in the file, 0 if not. 160afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 170afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski command = 'grep "%s" > /dev/null' % pattern 180afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski ret = cat_file_to_cmd(file, command, ignore_status=True) 190afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return not ret 20af4efc23471265a3bfa7fef0146fbc0cbb54515bmbligh 21af4efc23471265a3bfa7fef0146fbc0cbb54515bmbligh 22c86b0b45cd0198d99d271a79f8b6de29feb98cd5mblighdef difflist(list1, list2): 230afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """returns items in list2 that are not in list1""" 240afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski diff = []; 250afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for x in list2: 260afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if x not in list1: 270afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski diff.append(x) 280afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return diff 29f4c35322b200d65f41a8332b4f3503beb497840dmbligh 30c86b0b45cd0198d99d271a79f8b6de29feb98cd5mbligh 318ea61e2f9f55bd9f646735069e1f029e86d08320mblighdef cat_file_to_cmd(file, command, ignore_status=0, return_output=False): 320afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 330afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski equivalent to 'cat file | command' but knows to use 340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski zcat or bzcat if appropriate 350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 360afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if return_output: 370afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski run_cmd = utils.system_output 380afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 390afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski run_cmd = utils.system 400afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 410afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if not os.path.isfile(file): 420afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise NameError('invalid file %s to cat to command %s' 430afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski % (file, command)) 440afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if file.endswith('.bz2'): 450afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return run_cmd('bzcat ' + file + ' | ' + command, ignore_status) 460afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif (file.endswith('.gz') or file.endswith('.tgz')): 470afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return run_cmd('zcat ' + file + ' | ' + command, ignore_status) 480afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 490afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return run_cmd('cat ' + file + ' | ' + command, ignore_status) 50712cd145672c0033a55173717787c54cd68e6b83mbligh 51c86b0b45cd0198d99d271a79f8b6de29feb98cd5mbligh 52712cd145672c0033a55173717787c54cd68e6b83mblighdef extract_tarball_to_dir(tarball, dir): 530afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 540afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Extract a tarball to a specified directory name instead of whatever 550afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski the top level of a tarball is - useful for versioned directory names, etc 560afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 570afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.exists(dir): 580afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise NameError, 'target %s already exists' % dir 590afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski pwd = os.getcwd() 600afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski os.chdir(os.path.dirname(os.path.abspath(dir))) 610afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski newdir = extract_tarball(tarball) 620afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski os.rename(newdir, dir) 630afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski os.chdir(pwd) 64712cd145672c0033a55173717787c54cd68e6b83mbligh 65f4c35322b200d65f41a8332b4f3503beb497840dmbligh 66712cd145672c0033a55173717787c54cd68e6b83mblighdef extract_tarball(tarball): 670afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Returns the directory extracted by the tarball.""" 680afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski extracted = cat_file_to_cmd(tarball, 'tar xvf - 2>/dev/null', 690afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return_output=True).splitlines() 700afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 710afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski dir = None 720afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 730afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for line in extracted: 740afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski line = re.sub(r'^./', '', line) 750afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if not line or line == '.': 760afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski continue 770afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski topdir = line.split('/')[0] 780afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isdir(topdir): 790afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if dir: 800afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski assert(dir == topdir) 810afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 820afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski dir = topdir 830afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if dir: 840afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return dir 850afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 860afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise NameError('extracting tarball produced no dir') 87712cd145672c0033a55173717787c54cd68e6b83mbligh 88cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmbligh 8960418bb82d1734a7f73a5e4c8870d06799795397mblighdef get_md5sum(file_path): 900afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Gets the md5sum of a file. You must provide a valid path to the file""" 910afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if not os.path.isfile(file_path): 920afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise ValueError, 'invalid file %s to verify' % file_path 930afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return utils.system_output("md5sum " + file_path + " | awk '{print $1}'") 9460418bb82d1734a7f73a5e4c8870d06799795397mbligh 9560418bb82d1734a7f73a5e4c8870d06799795397mbligh 9660418bb82d1734a7f73a5e4c8870d06799795397mblighdef unmap_url_cache(cachedir, url, expected_md5): 970afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """\ 980afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Downloads a file from a URL to a cache directory. If the file is already 990afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski at the expected position and has the expected md5 number, let's not 1000afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski download it again. 1010afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 1020afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # Let's convert cachedir to a canonical path, if it's not already 1030afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cachedir = os.path.realpath(cachedir) 1040afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if not os.path.isdir(cachedir): 1050afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski try: 1060afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski system('mkdir -p ' + cachedir) 1070afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski except: 1080afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise ValueError('Could not create cache directory %s' % cachedir) 1090afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski file_from_url = os.path.basename(url) 1100afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski file_local_path = os.path.join(cachedir, file_from_url) 1110afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isfile(file_local_path): 1120afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski file_md5 = get_md5sum(file_local_path) 1130afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if file_md5 == expected_md5: 1140afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # File is already at the expected position and ready to go 1150afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski src = file_from_url 1160afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 1170afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # Let's download the package again, it's corrupted... 1180afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski src = url 1190afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 1200afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # File is not there, let's download it 1210afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski src = url 1220afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return utils.unmap_url(cachedir, src, cachedir) 123ea30c8a19ee292ee57b5223ca079f7a311195b41mbligh 124ea30c8a19ee292ee57b5223ca079f7a311195b41mbligh 125f4c35322b200d65f41a8332b4f3503beb497840dmblighdef basename(path): 1260afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski i = path.rfind('/'); 1270afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return path[i+1:] 128f4c35322b200d65f41a8332b4f3503beb497840dmbligh 129f4c35322b200d65f41a8332b4f3503beb497840dmbligh 130f4c35322b200d65f41a8332b4f3503beb497840dmblighdef force_copy(src, dest): 1310afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Replace dest with a new copy of src, even if it exists""" 1320afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isfile(dest): 1330afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski os.remove(dest) 1340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isdir(dest): 1350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski dest = os.path.join(dest, os.path.basename(src)) 1360afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski shutil.copyfile(src, dest) 1370afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return dest 138f4c35322b200d65f41a8332b4f3503beb497840dmbligh 139f4c35322b200d65f41a8332b4f3503beb497840dmbligh 140fdbcaec15092d8b4af80970c495038bdf9b0e63fmblighdef force_link(src, dest): 1410afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Link src to dest, overwriting it if it exists""" 1420afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return utils.system("ln -sf %s %s" % (src, dest)) 143fdbcaec15092d8b4af80970c495038bdf9b0e63fmbligh 144fdbcaec15092d8b4af80970c495038bdf9b0e63fmbligh 145cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmblighdef file_contains_pattern(file, pattern): 1460afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Return true if file contains the specified egrep pattern""" 1470afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if not os.path.isfile(file): 1480afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise NameError('file %s does not exist' % file) 1490afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return not utils.system('egrep -q "' + pattern + '" ' + file, ignore_status=True) 150cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmbligh 151cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmbligh 152cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmblighdef list_grep(list, pattern): 1530afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """True if any item in list matches the specified pattern.""" 1540afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski compiled = re.compile(pattern) 1550afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for line in list: 1560afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski match = compiled.search(line) 1570afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if (match): 1580afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 1 1590afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 0 160cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmbligh 16142b81ca63a0ab336b844e9c5cce6fe30dae85357mblighdef get_os_vendor(): 1620afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Try to guess what's the os vendor 1630afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 1640afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski issue = '/etc/issue' 1650afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 1660afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if not os.path.isfile(issue): 1670afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'Unknown' 1680afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 1690afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if file_contains_pattern(issue, 'Red Hat'): 1700afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'Red Hat' 1710afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif file_contains_pattern(issue, 'Fedora Core'): 1720afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'Fedora Core' 1730afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif file_contains_pattern(issue, 'SUSE'): 1740afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'SUSE' 1750afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif file_contains_pattern(issue, 'Ubuntu'): 1760afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'Ubuntu' 1770afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif file_contains_pattern(issue, 'Debian'): 1780afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'Debian' 1790afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 1800afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'Unknown' 181af4efc23471265a3bfa7fef0146fbc0cbb54515bmbligh 182cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmbligh 183f49d5cfa9fc49a34b3b5e5e1cb97ce2c0a77dd0cmblighdef get_vmlinux(): 1840afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Return the full path to vmlinux 185c86b0b45cd0198d99d271a79f8b6de29feb98cd5mbligh 1860afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Ahem. This is crap. Pray harder. Bad Martin. 1870afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 1880afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski vmlinux = '/boot/vmlinux-%s' % utils.system_output('uname -r') 1890afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isfile(vmlinux): 1900afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return vmlinux 1910afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski vmlinux = '/lib/modules/%s/build/vmlinux' % utils.system_output('uname -r') 1920afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isfile(vmlinux): 1930afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return vmlinux 1940afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return None 195f49d5cfa9fc49a34b3b5e5e1cb97ce2c0a77dd0cmbligh 196f49d5cfa9fc49a34b3b5e5e1cb97ce2c0a77dd0cmbligh 197f49d5cfa9fc49a34b3b5e5e1cb97ce2c0a77dd0cmblighdef get_systemmap(): 1980afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Return the full path to System.map 199c86b0b45cd0198d99d271a79f8b6de29feb98cd5mbligh 2000afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Ahem. This is crap. Pray harder. Bad Martin. 2010afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 2020afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski map = '/boot/System.map-%s' % utils.system_output('uname -r') 2030afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isfile(map): 2040afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return map 2050afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski map = '/lib/modules/%s/build/System.map' % utils.system_output('uname -r') 2060afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isfile(map): 2070afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return map 2080afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return None 20967b5ece7667fc71429ee05b07ac7654ed5a05df7mbligh 21067b5ece7667fc71429ee05b07ac7654ed5a05df7mbligh 21167b5ece7667fc71429ee05b07ac7654ed5a05df7mblighdef get_modules_dir(): 2120afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Return the modules dir for the running kernel version""" 2130afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski kernel_version = utils.system_output('uname -r') 2140afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return '/lib/modules/%s/kernel' % kernel_version 215f49d5cfa9fc49a34b3b5e5e1cb97ce2c0a77dd0cmbligh 216f49d5cfa9fc49a34b3b5e5e1cb97ce2c0a77dd0cmbligh 2175970cf057674accdb00a7742eae50e40c57e52d0mblighdef get_cpu_arch(): 2180afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Work out which CPU architecture we're running on""" 2190afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski f = open('/proc/cpuinfo', 'r') 2200afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cpuinfo = f.readlines() 2210afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski f.close() 2220afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if list_grep(cpuinfo, '^cpu.*(RS64|POWER3|Broadband Engine)'): 2230afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'power' 2240afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif list_grep(cpuinfo, '^cpu.*POWER4'): 2250afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'power4' 2260afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif list_grep(cpuinfo, '^cpu.*POWER5'): 2270afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'power5' 2280afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif list_grep(cpuinfo, '^cpu.*POWER6'): 2290afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'power6' 2300afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif list_grep(cpuinfo, '^cpu.*PPC970'): 2310afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'power970' 2320afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif list_grep(cpuinfo, 'Opteron'): 2330afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'x86_64' 2340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif list_grep(cpuinfo, 'GenuineIntel') and list_grep(cpuinfo, '48 bits virtual'): 2350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'x86_64' 2360afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 2370afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'i386' 238f4c35322b200d65f41a8332b4f3503beb497840dmbligh 239f4c35322b200d65f41a8332b4f3503beb497840dmbligh 240548f29af9e38f87c3609838f5aabeac94bb69f13mblighdef get_current_kernel_arch(): 2410afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Get the machine architecture, now just a wrap of 'uname -m'.""" 2420afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return os.popen('uname -m').read().rstrip() 243cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmbligh 244cdf02a40b97d0570b0e8f8a74a2ede7a868bb1edmbligh 245fdbcaec15092d8b4af80970c495038bdf9b0e63fmblighdef get_file_arch(filename): 2460afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # -L means follow symlinks 2470afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski file_data = utils.system_output('file -L ' + filename) 2480afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if file_data.count('80386'): 2490afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return 'i386' 2500afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return None 251fdbcaec15092d8b4af80970c495038bdf9b0e63fmbligh 252fdbcaec15092d8b4af80970c495038bdf9b0e63fmbligh 253f4c35322b200d65f41a8332b4f3503beb497840dmblighdef count_cpus(): 2540afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """number of CPUs in the local machine according to /proc/cpuinfo""" 2550afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski f = file('/proc/cpuinfo', 'r') 2560afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cpus = 0 2570afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for line in f.readlines(): 2580afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if line.startswith('processor'): 2590afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cpus += 1 2600afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return cpus 261f4c35322b200d65f41a8332b4f3503beb497840dmbligh 262e7a170fb097da48af81ca598e29643f3e7cca584mbligh 263e7a170fb097da48af81ca598e29643f3e7cca584mbligh# Returns total memory in kb 264558885e290e3fa847b6a77b6dd66cac33ec6f65cmblighdef read_from_meminfo(key): 2650afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski meminfo = utils.system_output('grep %s /proc/meminfo' % key) 2660afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return int(re.search(r'\d+', meminfo).group(0)) 267558885e290e3fa847b6a77b6dd66cac33ec6f65cmbligh 268558885e290e3fa847b6a77b6dd66cac33ec6f65cmbligh 269e7a170fb097da48af81ca598e29643f3e7cca584mblighdef memtotal(): 2700afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return read_from_meminfo('MemTotal') 271558885e290e3fa847b6a77b6dd66cac33ec6f65cmbligh 272558885e290e3fa847b6a77b6dd66cac33ec6f65cmbligh 273558885e290e3fa847b6a77b6dd66cac33ec6f65cmblighdef freememtotal(): 2740afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return read_from_meminfo('MemFree') 275558885e290e3fa847b6a77b6dd66cac33ec6f65cmbligh 276558885e290e3fa847b6a77b6dd66cac33ec6f65cmbligh 277558885e290e3fa847b6a77b6dd66cac33ec6f65cmblighdef sysctl_kernel(key, value=None): 2780afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """(Very) partial implementation of sysctl, for kernel params""" 2790afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if value: 2800afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # write 2810afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski utils.write_one_line('/proc/sys/kernel/%s' % key, str(value)) 2820afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 2830afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # read 2840afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski out = utils.read_one_line('/proc/sys/kernel/%s' % key) 2850afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return int(re.search(r'\d+', out).group(0)) 286e7a170fb097da48af81ca598e29643f3e7cca584mbligh 287e7a170fb097da48af81ca598e29643f3e7cca584mbligh 2885285a2dc3c5edbc010825e6d64ecdb219b3ad52cmblighdef _convert_exit_status(sts): 2890afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.WIFSIGNALED(sts): 2900afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return -os.WTERMSIG(sts) 2910afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elif os.WIFEXITED(sts): 2920afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return os.WEXITSTATUS(sts) 2930afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 2940afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # impossible? 2950afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise RuntimeError("Unknown exit status %d!" % sts) 2965285a2dc3c5edbc010825e6d64ecdb219b3ad52cmbligh 2975285a2dc3c5edbc010825e6d64ecdb219b3ad52cmbligh 298f4c35322b200d65f41a8332b4f3503beb497840dmblighdef where_art_thy_filehandles(): 2990afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Dump the current list of filehandles""" 3000afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski os.system("ls -l /proc/%d/fd >> /dev/tty" % os.getpid()) 301f4c35322b200d65f41a8332b4f3503beb497840dmbligh 302f4c35322b200d65f41a8332b4f3503beb497840dmbligh 303f4c35322b200d65f41a8332b4f3503beb497840dmblighdef print_to_tty(string): 3040afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Output string straight to the tty""" 3050afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski open('/dev/tty', 'w').write(string + '\n') 306f4c35322b200d65f41a8332b4f3503beb497840dmbligh 307f4c35322b200d65f41a8332b4f3503beb497840dmbligh 308b8a14e358b611f2d97c06e863be9b53ab2bedeefmblighdef dump_object(object): 3090afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Dump an object's attributes and methods 310c86b0b45cd0198d99d271a79f8b6de29feb98cd5mbligh 3110afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski kind of like dir() 3120afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 3130afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for item in object.__dict__.iteritems(): 3140afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski print item 3150afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski try: 3160afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski (key,value) = item 3170afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski dump_object(value) 3180afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski except: 3190afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski continue 320b8a14e358b611f2d97c06e863be9b53ab2bedeefmbligh 321b8a14e358b611f2d97c06e863be9b53ab2bedeefmbligh 3224b089663460063b638124ff665f38d2fe7427648mblighdef environ(env_key): 3230afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """return the requested environment variable, or '' if unset""" 3240afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if (os.environ.has_key(env_key)): 3250afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return os.environ[env_key] 3260afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 3270afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return '' 3284b089663460063b638124ff665f38d2fe7427648mbligh 3294b089663460063b638124ff665f38d2fe7427648mbligh 3304b089663460063b638124ff665f38d2fe7427648mblighdef prepend_path(newpath, oldpath): 3310afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """prepend newpath to oldpath""" 3320afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if (oldpath): 3330afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return newpath + ':' + oldpath 3340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 3350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return newpath 3364b089663460063b638124ff665f38d2fe7427648mbligh 3374b089663460063b638124ff665f38d2fe7427648mbligh 3384b089663460063b638124ff665f38d2fe7427648mblighdef append_path(oldpath, newpath): 3390afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """append newpath to oldpath""" 3400afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if (oldpath): 3410afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return oldpath + ':' + newpath 3420afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 3430afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return newpath 3444b089663460063b638124ff665f38d2fe7427648mbligh 3454b089663460063b638124ff665f38d2fe7427648mbligh 3464e75b0d3b020f901456217fb8ff0d7d4391fa869mblighdef avgtime_print(dir): 3470afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ Calculate some benchmarking statistics. 3480afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Input is a directory containing a file called 'time'. 3490afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski File contains one-per-line results of /usr/bin/time. 3500afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Output is average Elapsed, User, and System time in seconds, 3510afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski and average CPU percentage. 3520afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 3530afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski f = open(dir + "/time") 3540afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski user = system = elapsed = cpu = count = 0 3550afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski r = re.compile('([\d\.]*)user ([\d\.]*)system (\d*):([\d\.]*)elapsed (\d*)%CPU') 3560afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for line in f.readlines(): 3570afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski try: 3580afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski s = r.match(line); 3590afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski user += float(s.group(1)) 3600afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski system += float(s.group(2)) 3610afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elapsed += (float(s.group(3)) * 60) + float(s.group(4)) 3620afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cpu += float(s.group(5)) 3630afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski count += 1 3640afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski except: 3650afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise ValueError("badly formatted times") 3660afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 3670afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski f.close() 3680afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return "Elapsed: %0.2fs User: %0.2fs System: %0.2fs CPU: %0.0f%%" % \ 3690afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski (elapsed/count, user/count, system/count, cpu/count) 3704e75b0d3b020f901456217fb8ff0d7d4391fa869mbligh 3714e75b0d3b020f901456217fb8ff0d7d4391fa869mbligh 372f06db0f9b381737b9c85bef1c23ea1a1ca73c559mblighdef running_config(): 3730afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 3740afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Return path of config file of the currently running kernel 3750afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 3760afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski version = utils.system_output('uname -r') 3770afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for config in ('/proc/config.gz', \ 3780afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski '/boot/config-%s' % version, 3790afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski '/lib/modules/%s/build/.config' % version): 3800afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if os.path.isfile(config): 3810afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return config 3820afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return None 3839ec8acc50c0fe06a40353db0df8e135cebb2ec58mbligh 3849ec8acc50c0fe06a40353db0df8e135cebb2ec58mbligh 385a1bef1f2774b539df11c134d9a9a177304c34f3cmblighdef check_for_kernel_feature(feature): 3860afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski config = running_config() 387a1bef1f2774b539df11c134d9a9a177304c34f3cmbligh 3880afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if not config: 3890afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise TypeError("Can't find kernel config file") 390a1bef1f2774b539df11c134d9a9a177304c34f3cmbligh 3910afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if config.endswith('.gz'): 3920afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski grep = 'zgrep' 3930afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 3940afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski grep = 'grep' 3950afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski grep += ' ^CONFIG_%s= %s' % (feature, config) 396a1bef1f2774b539df11c134d9a9a177304c34f3cmbligh 3970afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if not utils.system_output(grep, ignore_status=True): 3980afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise ValueError("Kernel doesn't have a %s feature" % (feature)) 399a1bef1f2774b539df11c134d9a9a177304c34f3cmbligh 400a1bef1f2774b539df11c134d9a9a177304c34f3cmbligh 4019ec8acc50c0fe06a40353db0df8e135cebb2ec58mblighdef cpu_online_map(): 4020afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 4030afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski Check out the available cpu online map 4040afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 4050afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cpus = [] 4060afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for line in open('/proc/cpuinfo', 'r').readlines(): 4070afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if line.startswith('processor'): 4080afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cpus.append(line.split()[2]) # grab cpu number 4090afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return cpus 410663e4f664465dbaa9e86c5c20d035ad9bd1e65edmbligh 411663e4f664465dbaa9e86c5c20d035ad9bd1e65edmbligh 412663e4f664465dbaa9e86c5c20d035ad9bd1e65edmblighdef check_glibc_ver(ver): 4130afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski glibc_ver = commands.getoutput('ldd --version').splitlines()[0] 4140afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski glibc_ver = re.search(r'(\d+\.\d+(\.\d+)?)', glibc_ver).group() 4150afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if glibc_ver.split('.') < ver.split('.'): 4160afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise error.TestError("Glibc is too old (%s). Glibc >= %s is needed." % \ 4170afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski (glibc_ver, ver)) 4180763522bf0dcd6297385a7db965086ed8ba18adambligh 4190763522bf0dcd6297385a7db965086ed8ba18adamblighdef check_kernel_ver(ver): 4200afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski kernel_ver = utils.system_output('uname -r') 4210afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski kv_tmp = re.split(r'[-]', kernel_ver)[0:3] 4220afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if kv_tmp[0].split('.') < ver.split('.'): 4230afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise error.TestError("Kernel is too old (%s). Kernel > %s is needed." % \ 4240afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski (kernel_ver, ver)) 42560418bb82d1734a7f73a5e4c8870d06799795397mbligh 4269061a273dfd2e522c15f6dd77cfed1e2815e4e9embligh 427264cd8f4889cea73fa5fb7873e3243c1c770a1bcmblighdef human_format(number): 4280afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # Convert number to kilo / mega / giga format. 4290afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if number < 1024: 4300afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return "%d" % number 4310afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski kilo = float(number) / 1024.0 4320afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if kilo < 1024: 4330afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return "%.2fk" % kilo 4340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski meg = kilo / 1024.0 4350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if meg < 1024: 4360afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return "%.2fM" % meg 4370afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski gig = meg / 1024.0 4380afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return "%.2fG" % gig 439264cd8f4889cea73fa5fb7873e3243c1c770a1bcmbligh 4408eca3a98728afabc7fc761c08dbb8e91260c7de4mbligh 4418eca3a98728afabc7fc761c08dbb8e91260c7de4mblighdef numa_nodes(): 4420afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski node_paths = glob.glob('/sys/devices/system/node/node*') 4430afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski nodes = [int(re.sub(r'.*node(\d+)', r'\1', x)) for x in node_paths] 4440afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return (sorted(nodes)) 4458eca3a98728afabc7fc761c08dbb8e91260c7de4mbligh 4468eca3a98728afabc7fc761c08dbb8e91260c7de4mbligh 4478eca3a98728afabc7fc761c08dbb8e91260c7de4mblighdef node_size(): 4480afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski nodes = max(len(numa_nodes()), 1) 4490afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return ((memtotal() * 1024) / nodes) 4508eca3a98728afabc7fc761c08dbb8e91260c7de4mbligh 45132bcff3382844181eaf3d74e0fb252d88edfc8fbmbligh 45232bcff3382844181eaf3d74e0fb252d88edfc8fbmblighdef to_seconds(time_string): 4530afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Converts a string in M+:SS.SS format to S+.SS""" 4540afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski elts = time_string.split(':') 4550afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if len(elts) == 1: 4560afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return time_string 4570afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return str(int(elts[0]) * 60 + float(elts[1])) 45832bcff3382844181eaf3d74e0fb252d88edfc8fbmbligh 45932bcff3382844181eaf3d74e0fb252d88edfc8fbmbligh 46032bcff3382844181eaf3d74e0fb252d88edfc8fbmblighdef extract_all_time_results(results_string): 4610afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Extract user, system, and elapsed times into a list of tuples""" 4620afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski pattern = re.compile(r"(.*?)user (.*?)system (.*?)elapsed") 4630afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski results = [] 4640afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for result in pattern.findall(results_string): 4650afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski results.append(tuple([to_seconds(elt) for elt in result])) 4660afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return results 467c421164e16db7233ef8fcc4ecfd83f2979aec16ambligh 468c421164e16db7233ef8fcc4ecfd83f2979aec16ambligh 469c421164e16db7233ef8fcc4ecfd83f2979aec16amblighdef pickle_load(filename): 4700afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return pickle.load(open(filename, 'r')) 471c421164e16db7233ef8fcc4ecfd83f2979aec16ambligh 472237bed32e0110ccd0db10823df742534dd7dc50dmbligh 473237bed32e0110ccd0db10823df742534dd7dc50dmbligh# Return the kernel version and build timestamp. 474237bed32e0110ccd0db10823df742534dd7dc50dmblighdef running_os_release(): 4750afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return os.uname()[2:4] 476237bed32e0110ccd0db10823df742534dd7dc50dmbligh 477237bed32e0110ccd0db10823df742534dd7dc50dmbligh 478237bed32e0110ccd0db10823df742534dd7dc50dmblighdef running_os_ident(): 4790afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski (version, timestamp) = running_os_release() 4800afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return version + '::' + timestamp 481b830e28297dca51aed2c4b57469a3e04845e54e7mbligh 482b830e28297dca51aed2c4b57469a3e04845e54e7mbligh 483523a19b532a778dd9e752e507ac75d3ffc5c701ambligh# much like find . -name 'pattern' 484523a19b532a778dd9e752e507ac75d3ffc5c701amblighdef locate(pattern, root=os.getcwd()): 4850afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for path, dirs, files in os.walk(root): 4860afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for f in [os.path.abspath(os.path.join(path, f)) 4870afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for f in files if fnmatch.fnmatch(f, pattern)]: 4880afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski yield f 489523a19b532a778dd9e752e507ac75d3ffc5c701ambligh 490523a19b532a778dd9e752e507ac75d3ffc5c701ambligh 49125bb1e1fbb67950ac480f6500138c19647472889mblighdef freespace(path): 4920afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Return the disk free space, in bytes""" 4930afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski s = os.statvfs(path) 4940afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return s.f_bavail * s.f_bsize 4958415f966acaaa3aa3ca6a651d9a190081edbb0eejadmanski 4968415f966acaaa3aa3ca6a651d9a190081edbb0eejadmanski 4978415f966acaaa3aa3ca6a651d9a190081edbb0eejadmanskidef disk_block_size(path): 4980afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Return the disk block size, in bytes""" 4990afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return os.statvfs(path).f_bsize 5006de9cdfe8ce95c1d87b01aa768526a64755090cambligh 5016de9cdfe8ce95c1d87b01aa768526a64755090cambligh 5026de9cdfe8ce95c1d87b01aa768526a64755090camblighdef get_cpu_family(): 5030afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski procinfo = utils.system_output('cat /proc/cpuinfo') 5040afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski CPU_FAMILY_RE = re.compile(r'^cpu family\s+:\s+(\S+)', re.M) 5050afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski matches = CPU_FAMILY_RE.findall(procinfo) 5060afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if matches: 5070afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return int(matches[0]) 5080afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski else: 5090afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise error.TestError('Could not get valid cpu family data') 5106de9cdfe8ce95c1d87b01aa768526a64755090cambligh 5113e9062e854a920eead8e250c4e79838c30a0657cmbligh 5122316e52c84ac8799330c52359bc4dd5e7f7324d5mblighdef get_disks(): 5130afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski df_output = utils.system_output('df') 5140afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski disk_re = re.compile(r'^(/dev/hd[a-z]+)3', re.M) 5150afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return disk_re.findall(df_output) 5166de9cdfe8ce95c1d87b01aa768526a64755090cambligh 5173e9062e854a920eead8e250c4e79838c30a0657cmbligh 5183e9062e854a920eead8e250c4e79838c30a0657cmblighdef load_module(module_name): 5190afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski # Checks if a module has already been loaded 5200afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if module_is_loaded(module_name): 5210afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return False 522af4efc23471265a3bfa7fef0146fbc0cbb54515bmbligh 5230afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski utils.system('/sbin/modprobe ' + module_name) 5240afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return True 5253e9062e854a920eead8e250c4e79838c30a0657cmbligh 5263e9062e854a920eead8e250c4e79838c30a0657cmbligh 5273e9062e854a920eead8e250c4e79838c30a0657cmblighdef unload_module(module_name): 5280afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski utils.system('/sbin/rmmod ' + module_name) 5293e9062e854a920eead8e250c4e79838c30a0657cmbligh 5303e9062e854a920eead8e250c4e79838c30a0657cmbligh 5313e9062e854a920eead8e250c4e79838c30a0657cmblighdef module_is_loaded(module_name): 5320afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski module_name = module_name.replace('-', '_') 5330afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski modules = utils.system_output('/sbin/lsmod').splitlines() 5340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for module in modules: 5350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if module.startswith(module_name) and module[len(module_name)] == ' ': 5360afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return True 5370afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return False 5383e9062e854a920eead8e250c4e79838c30a0657cmbligh 5393e9062e854a920eead8e250c4e79838c30a0657cmbligh 5406b34c4cc34bebd20def94c0191ef1e46dd6a1cdemblighdef get_loaded_modules(): 5410afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski lsmod_output = utils.system_output('/sbin/lsmod').splitlines()[1:] 5420afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return [line.split(None, 1)[0] for line in lsmod_output] 5436b34c4cc34bebd20def94c0191ef1e46dd6a1cdembligh 5446b34c4cc34bebd20def94c0191ef1e46dd6a1cdembligh 5453e9062e854a920eead8e250c4e79838c30a0657cmblighdef get_huge_page_size(): 5460afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski output = utils.system_output('grep Hugepagesize /proc/meminfo') 5470afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return int(output.split()[1]) # Assumes units always in kB. :( 5483e9062e854a920eead8e250c4e79838c30a0657cmbligh 5493e9062e854a920eead8e250c4e79838c30a0657cmbligh 5503e9062e854a920eead8e250c4e79838c30a0657cmblighdef get_num_huge_pages(): 5510afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raw_hugepages = utils.system_output('/sbin/sysctl vm.nr_hugepages') 5520afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return int(raw_hugepages.split()[2]) 5533e9062e854a920eead8e250c4e79838c30a0657cmbligh 5543e9062e854a920eead8e250c4e79838c30a0657cmbligh 5553e9062e854a920eead8e250c4e79838c30a0657cmblighdef set_num_huge_pages(num): 5560afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski utils.system('/sbin/sysctl vm.nr_hugepages=%d' % num) 5573e9062e854a920eead8e250c4e79838c30a0657cmbligh 5583e9062e854a920eead8e250c4e79838c30a0657cmbligh 5593e9062e854a920eead8e250c4e79838c30a0657cmblighdef get_system_nodes(): 5600afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski nodes = os.listdir('/sys/devices/system/node') 5610afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski nodes.sort() 5620afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return nodes 5633e9062e854a920eead8e250c4e79838c30a0657cmbligh 5643e9062e854a920eead8e250c4e79838c30a0657cmbligh 5656b34c4cc34bebd20def94c0191ef1e46dd6a1cdemblighdef get_cpu_vendor(): 5660afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cpuinfo = open('/proc/cpuinfo').read() 5670afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski vendors = re.findall(r'(?m)^vendor_id\s*:\s*(\S+)\s*$', cpuinfo) 5680afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski for i in xrange(1, len(vendors)): 5690afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if vendors[i] != vendors[0]: 5700afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise error.TestError('multiple cpu vendors found: ' + str(vendors)) 5710afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return vendors[0] 5726b34c4cc34bebd20def94c0191ef1e46dd6a1cdembligh 5736b34c4cc34bebd20def94c0191ef1e46dd6a1cdembligh 5746b34c4cc34bebd20def94c0191ef1e46dd6a1cdemblighdef probe_cpus(): 5750afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 5760afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski This routine returns a list of cpu devices found under /sys/devices/system/cpu. 5770afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """ 5780afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski output = utils.system_output( 5790afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 'find /sys/devices/system/cpu/ -maxdepth 1 -type d -name cpu*') 5800afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return output.splitlines() 5816b34c4cc34bebd20def94c0191ef1e46dd6a1cdembligh 5826b34c4cc34bebd20def94c0191ef1e46dd6a1cdembligh 58370c50ad0eec36f4678374040031da84150a75997mblighdef ping_default_gateway(): 5840afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski """Ping the default gateway.""" 58570c50ad0eec36f4678374040031da84150a75997mbligh 5860afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski network = open('/etc/sysconfig/network') 5870afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski m = re.search('GATEWAY=(\S+)', network.read()) 5880afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 5890afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski if m: 5900afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski gw = m.group(1) 5910afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski cmd = 'ping %s -c 5 > /dev/null' % gw 5920afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski return utils.system(cmd, ignore_status=True) 5930afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski 5940afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski raise error.TestError('Unable to find default gateway') 59570c50ad0eec36f4678374040031da84150a75997mbligh 59670c50ad0eec36f4678374040031da84150a75997mbligh 5976de9cdfe8ce95c1d87b01aa768526a64755090camblightry: 5980afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski from site_utils import * 5996de9cdfe8ce95c1d87b01aa768526a64755090camblighexcept ImportError: 6000afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski pass 601