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