On SUSE, the kernel is split into several RPMs (vmlinuz + most basic modules,
common modules, extra modules, and optionally third-party kernel module
packages).
This patch allows a file with a list of RPMs to install to be specified when
creating a job. The file has to have .list extension.
Signed-off-by: Jiri Benc <jbenc@suse.cz>
git-svn-id: http://test.kernel.org/svn/autotest/trunk@3152 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/client/bin/kernel.py b/client/bin/kernel.py
index a7e9edb..6554ea6 100755
--- a/client/bin/kernel.py
+++ b/client/bin/kernel.py
@@ -627,40 +627,44 @@
def install(self, tag='autotest'):
self.installed_as = tag
- self.rpm_name = utils.system_output('rpm -qp ' + self.rpm_package)
-
- # install
- utils.system('rpm -i --force ' + self.rpm_package)
-
- # get file list
- files = utils.system_output('rpm -ql ' + self.rpm_name).splitlines()
-
- # search for vmlinuz
- for file in files:
- if file.startswith('/boot/vmlinuz'):
- self.full_version = file[len('/boot/vmlinuz-'):]
- self.image = file
- # prefer /boot/kernel-version before /boot/kernel
- if self.full_version:
- break
- else:
- errmsg = "%s doesn't contain /boot/vmlinuz"
- errmsg %= self.rpm_package
- raise error.TestError(errmsg)
-
- # search for initrd
+ self.image = None
self.initrd = ''
- for file in files:
- if file.startswith('/boot/initrd'):
- self.initrd = file
- # prefer /boot/initrd-version before /boot/initrd
- if len(file) > len('/boot/initrd'):
- break
+ for rpm_pack in self.rpm_package:
+ rpm_name = utils.system_output('rpm -qp ' + rpm_pack)
- # get version and release number
- self.version, self.release = utils.system_output(
- 'rpm --queryformat="%{VERSION}\\n%{RELEASE}\\n" -q '
- + self.rpm_name).splitlines()[0:2]
+ # install
+ utils.system('rpm -i --force ' + rpm_pack)
+
+ # get file list
+ files = utils.system_output('rpm -ql ' + rpm_name).splitlines()
+
+ # search for vmlinuz
+ for file in files:
+ if file.startswith('/boot/vmlinuz'):
+ self.full_version = file[len('/boot/vmlinuz-'):]
+ self.image = file
+ self.rpm_flavour = rpm_name.split('-')[1]
+
+ # get version and release number
+ self.version, self.release = utils.system_output(
+ 'rpm --queryformat="%{VERSION}\\n%{RELEASE}\\n" -q '
+ + rpm_name).splitlines()[0:2]
+
+ # prefer /boot/kernel-version before /boot/kernel
+ if self.full_version:
+ break
+
+ # search for initrd
+ for file in files:
+ if file.startswith('/boot/initrd'):
+ self.initrd = file
+ # prefer /boot/initrd-version before /boot/initrd
+ if len(file) > len('/boot/initrd'):
+ break
+
+ if self.image == None:
+ errmsg = "specified rpm file(s) don't contain /boot/vmlinuz"
+ raise error.TestError(errmsg)
def add_to_bootloader(self, tag='autotest', args=''):
@@ -705,7 +709,7 @@
expected_ident = self.full_version
if not expected_ident:
expected_ident = '-'.join([self.version,
- self.rpm_name.split('-')[1],
+ self.rpm_flavour,
self.release])
if ident:
when = int(time.time())
@@ -775,22 +779,33 @@
Create a kernel object, dynamically selecting the appropriate class to use
based on the path provided.
"""
- kernel_path = preprocess_path(path)
- if kernel_path.endswith('.rpm'):
- if utils.is_url(kernel_path) or os.path.exists(kernel_path):
- return rpm_kernel_vendor(job, kernel_path, subdir)
+ kernel_paths = [preprocess_path(path)]
+ if kernel_paths[0].endswith('.list'):
+ # Fetch the list of packages to install
+ kernel_list = os.path.join(tmp_dir, 'kernel.list')
+ utils.get_file(kernel_paths[0], kernel_list)
+ kernel_paths = [p.strip() for p in open(kernel_list).readlines()]
- else:
- # Fetch the rpm into the job's packages directory and pass it to
- # rpm_kernel
- rpm_name = os.path.basename(kernel_path)
+ if kernel_paths[0].endswith('.rpm'):
+ rpm_paths = []
+ for kernel_path in kernel_paths:
+ if utils.is_url(kernel_path) or os.path.exists(kernel_path):
+ rpm_paths.append(kernel_path)
- # If the preprocessed path (kernel_path) is only a name then
- # search for the kernel in all the repositories, else fetch the
- # kernel from that specific path.
- job.pkgmgr.fetch_pkg(rpm_name, os.path.join(job.pkgdir, rpm_name),
- repo_url=os.path.dirname(kernel_path))
+ else:
+ # Fetch the rpm into the job's packages directory and pass it to
+ # rpm_kernel
+ rpm_name = os.path.basename(kernel_path)
- return rpm_kernel_vendor(job, os.path.join(job.pkgdir, rpm_name), subdir)
+ # If the preprocessed path (kernel_path) is only a name then
+ # search for the kernel in all the repositories, else fetch the
+ # kernel from that specific path.
+ job.pkgmgr.fetch_pkg(rpm_name, os.path.join(job.pkgdir, rpm_name),
+ repo_url=os.path.dirname(kernel_path))
+
+ rpm_paths.append(os.path.join(job.pkgdir, rpm_name))
+ return rpm_kernel_vendor(job, rpm_paths, subdir)
else:
- return kernel(job,kernel_path, subdir, tmp_dir, build_dir, leave)
+ if len(kernel_paths) > 1:
+ raise error.TestError("don't know what to do with more than one non-rpm kernel file")
+ return kernel(job,kernel_paths[0], subdir, tmp_dir, build_dir, leave)