Add kernel rpm installation support to the client side.

From: Shawn Lewis <shawnlewis@google.com>
From: Jiqing Tang <jiqingtang@google.com>
Signed-off-by: Martin J. Bligh <mbligh@google.com>



git-svn-id: http://test.kernel.org/svn/autotest/trunk@819 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/client/bin/kernel.py b/client/bin/kernel.py
index 58f206f..960b483 100755
--- a/client/bin/kernel.py
+++ b/client/bin/kernel.py
@@ -594,3 +594,80 @@
 		temp.job = None
 		temp.logfile = None
 		pickle.dump(temp, open(filename, 'w'))
+
+
+class rpm_kernel:
+	""" Class for installing rpm kernel package
+	"""
+
+	def __init__(self, job, rpm_package, results_dir):
+		self.job = job
+		self.rpm_package = rpm_package
+		self.log_dir = os.path.join(results_dir, 'debug')
+		if os.path.exists(self.log_dir):
+			system('rm -rf ' + self.log_dir)
+		os.mkdir(self.log_dir)
+
+
+	def install(self):
+		logfile = os.path.join(self.log_dir, 'rpm_install')
+		self.job.stdout.redirect(logfile + '.stdout')
+		self.job.stderr.redirect(logfile + '.stderr')
+
+		rpm_name = system_output('rpm -qp ' + self.rpm_package)
+
+		# install
+		system('rpm -i --force ' + self.rpm_package)
+
+		# get file list
+		files = system_output('rpm -ql ' + rpm_name).splitlines()
+
+		self.job.stdout.restore()
+		self.job.stderr.restore()
+
+		# search for vmlinuz
+		for file in files:
+			if file.startswith('/boot/vmlinuz'):
+				self.image = file
+				break
+		else:
+			raise TestError(self.rpm_package + " doesn't contain /boot/vmlinuz")
+		
+		# search for initrd
+		self.initrd = ''
+		for file in files:
+			if file.startswith('/boot/initrd'):
+				self.initrd = file
+				break
+
+		# get version and release number
+		self.version, self.release = system_output(
+			'rpm --queryformat="%{VERSION}\\n%{RELEASE}" -q ' + rpm_name).splitlines()
+
+
+	def add_to_bootloader(self, tag='autotest', args=''):
+		""" Add this kernel to bootloader
+		"""
+
+		# remove existing entry if present
+		self.job.bootloader.remove_kernel(tag)
+
+		# pull the base argument set from the job config
+		baseargs = self.job.config_get('boot.default_args')
+		if baseargs:
+			args = baseargs + ' ' + args
+
+		# otherwise populate from /proc/cmdline
+		# if not baseargs:
+		#	baseargs = open('/proc/cmdline', 'r').readline().strip()
+		# NOTE: This is unnecessary, because boottool does it.
+
+		root = None
+		roots = [x for x in args.split() if x.startswith('root=')]
+		if roots:
+			root = re.sub('^root=', '', roots[0])
+		arglist = [x for x in args.split() if not x.startswith('root=')]
+		args = ' '.join(arglist)
+
+		# add the kernel entry
+		self.job.bootloader.add_kernel(self.image, tag, self.initrd, args = args, root = root)