import os, glob, re, logging
from autotest_lib.client.bin import test, utils, package
from autotest_lib.client.bin.test_config import config_loader
from autotest_lib.client.common_lib import error
class lsb_dtk(test.test):
"""
This autotest module runs the LSB test suite.
@copyright: IBM 2008
@author: Pavan Naregundi (pnaregun@in.ibm.com)
@author: Lucas Meneghel Rodrigues (lucasmr@br.ibm.com)
"""
version = 1
def initialize(self, config):
arch = utils.get_current_kernel_arch()
if arch in ['i386', 'i486', 'i586', 'i686', 'athlon']:
self.arch = 'ia32'
elif arch == 'ppc':
self.arch = 'ppc32'
elif arch in ['s390', 's390x', 'ia64', 'x86_64', 'ppc64']:
self.arch = arch
else:
e_msg = 'Architecture %s not supported by LSB' % arch
raise error.TestError(e_msg)
self.config = config_loader(config, self.tmpdir)
self.cachedir = os.path.join(self.bindir, 'cache')
if not os.path.isdir(self.cachedir):
os.makedirs(self.cachedir)
self.packages_installed = False
self.libraries_linked = False
def install_lsb_packages(self):
if not self.packages_installed:
# First, we download the LSB DTK manager package, worry about
# installing it later
dtk_manager_arch = self.config.get('dtk-manager', 'arch-%s' % self.arch)
dtk_manager_url = self.config.get('dtk-manager',
'tarball_url') % dtk_manager_arch
if not dtk_manager_url:
raise error.TestError('Could not get DTK manager URL from'
' configuration file')
dtk_md5 = self.config.get('dtk-manager', 'md5-%s' % self.arch)
if dtk_md5:
logging.info('Caching LSB DTK manager RPM')
dtk_manager_pkg = utils.unmap_url_cache(self.cachedir,
dtk_manager_url,
dtk_md5)
else:
raise error.TestError('Could not find DTK manager package md5,'
' cannot cache DTK manager tarball')
# Get LSB tarball, cache it and uncompress under autotest srcdir
if self.config.get('lsb', 'override_default_url') == 'no':
lsb_url = self.config.get('lsb', 'tarball_url') % self.arch
else:
lsb_url = self.config.get('lsb', 'tarball_url_alt') % self.arch
if not lsb_url:
raise error.TestError('Could not get LSB URL from configuration'
' file')
md5_key = 'md5-%s' % self.arch
lsb_md5 = self.config.get('lsb', md5_key)
if lsb_md5:
logging.info('Caching LSB tarball')
lsb_pkg = utils.unmap_url_cache(self.cachedir, lsb_url, lsb_md5)
else:
raise error.TestError('Could not find LSB package md5, cannot'
' cache LSB tarball')
utils.extract_tarball_to_dir(lsb_pkg, self.srcdir)
# Lets load a file that contains the list of RPMs
os.chdir(self.srcdir)
if not os.path.isfile('inst-config'):
raise IOError('Could not find file with package info,'
' inst-config')
rpm_file_list = open('inst-config', 'r')
pkg_pattern = re.compile('[A-Za-z0-9_.-]*[.][r][p][m]')
lsb_pkg_list = []
for line in rpm_file_list.readlines():
try:
# We will install lsb-dtk-manager separately, so we can remove
# it from the list of packages
if not 'lsb-dtk-manager' in line:
line = re.findall(pkg_pattern, line)[0]
lsb_pkg_list.append(line)
except:
# If we don't get a match, no problem
pass
# Lets figure out the host distro
distro_pkg_support = package.os_support()
if os.path.isfile('/etc/debian_version') and \
distro_pkg_support['dpkg']:
logging.debug('Debian based distro detected')
if distro_pkg_support['conversion']:
logging.debug('Package conversion supported')
distro_type = 'debian-based'
else:
raise EnvironmentError('Package conversion not supported.'
'Cannot handle LSB package'
' installation')
elif distro_pkg_support['rpm']:
logging.debug('Red Hat based distro detected')
distro_type = 'redhat-based'
else:
logging.error('OS does not seem to be red hat or debian based')
raise EnvironmentError('Cannot handle LSB package installation')
# According to the host distro detection, we can install the packages
# using the list previously assembled
if distro_type == 'redhat-based':
logging.info('Installing LSB RPM packages')
package.install(dtk_manager_pkg)
for lsb_rpm in lsb_pkg_list:
package.install(lsb_rpm, nodeps=True)
elif distro_type == 'debian-based':
logging.info('Remember that you must have the following lsb'
' compliance packages installed:')
logging.info('lsb-core lsb-cxx lsb-graphics lsb-desktop lsb-qt4'
' lsb-languages lsb-multimedia lsb-printing')
logging.info('Converting and installing LSB packages')
dtk_manager_dpkg = package.convert(dtk_manager_pkg, 'dpkg')
package.install(dtk_manager_dpkg)
for lsb_rpm in lsb_pkg_list:
lsb_dpkg = package.convert(lsb_rpm, 'dpkg')
package.install(lsb_dpkg, nodeps=True)
self.packages_installed = True
def link_lsb_libraries(self):
if not self.libraries_linked:
logging.info('Linking LSB libraries')
libdir_key = 'libdir-%s' % self.arch
os_libdir = self.config.get('lib', libdir_key)
if not os_libdir:
raise TypeError('Could not find OS lib dir from conf file')
lib_key = 'lib-%s' % self.arch
lib_list_raw = self.config.get('lib', lib_key)
if not lib_list_raw:
raise TypeError('Could not find library list from conf file')
lib_list = eval(lib_list_raw)
# Remove any previous ld-lsb*.so symbolic links
lsb_libs = glob.glob('%s/ld-lsb*.so*' % os_libdir)
for lib in lsb_libs:
os.remove(lib)
# Get the base library that we'll use to recreate the symbolic links
system_lib = glob.glob('%s/ld-2*.so*' % os_libdir)[0]
# Now just link the system lib that we just found to each one of the
# needed LSB libraries that we provided on the conf file
for lsb_lib in lib_list:
# Get the library absolute path
lsb_lib = os.path.join(os_libdir, lsb_lib)
# Link the library system_lib -> lsb_lib
os.symlink(system_lib, lsb_lib)
self.libraries_linked = True
def run_once(self, args = 'all'):
self.install_lsb_packages()
self.link_lsb_libraries()
main_script_path = self.config.get('lsb', 'main_script_path')
logfile = os.path.join(self.resultsdir, 'lsb.log')
log_arg = '-r %s' % (logfile)
args = args + ' ' + log_arg
cmd = os.path.join(self.srcdir, main_script_path) + ' ' + args
logging.info('Executing LSB main test script')
utils.system(cmd)