| Index: client/bin/kernel.py
 | 
| diff --git a/client/bin/kernel.py b/client/bin/kernel.py
 | 
| index b39869710c83b935416bc43cbb843c345d69df40..da91389b640c20df4a1b162fbcfe1876c13c0595 100644
 | 
| --- a/client/bin/kernel.py
 | 
| +++ b/client/bin/kernel.py
 | 
| @@ -64,7 +64,51 @@ def _add_kernel_to_bootloader(bootloader, base_args, tag, args, image, initrd):
 | 
|                            root=root)
 | 
|  
 | 
|  
 | 
| -class kernel(object):
 | 
| +class BootableKernel(object):
 | 
| +
 | 
| +    def __init__(self, job):
 | 
| +        self.job = job
 | 
| +        self.installed_as = None  # kernel choice in bootloader menu
 | 
| +        self.image = None
 | 
| +        self.initrd = ''
 | 
| +
 | 
| +
 | 
| +    def _boot_kernel(self, args, ident_check, expected_ident, subdir, notes):
 | 
| +        """
 | 
| +        Boot a kernel, with post-boot kernel id check
 | 
| +
 | 
| +        @param args:  kernel cmdline arguments
 | 
| +        @param ident_check: check kernel id after boot
 | 
| +        @param expected_ident:
 | 
| +        @param subdir: job-step qualifier in status log
 | 
| +        @param notes:  additional comment in status log
 | 
| +        """
 | 
| +
 | 
| +        # If we can check the kernel identity do so.
 | 
| +        if ident_check:
 | 
| +            when = int(time.time())
 | 
| +            args += " IDENT=%d" % when
 | 
| +            self.job.next_step_prepend(["job.end_reboot_and_verify", when,
 | 
| +                                        expected_ident, subdir, notes])
 | 
| +        else:
 | 
| +            self.job.next_step_prepend(["job.end_reboot", subdir,
 | 
| +                                        expected_ident, notes])
 | 
| +
 | 
| +        # Point bootloader to the selected tag.
 | 
| +        _add_kernel_to_bootloader(self.job.bootloader,
 | 
| +                                  self.job.config_get('boot.default_args'),
 | 
| +                                  self.installed_as, args, self.image,
 | 
| +                                  self.initrd)
 | 
| +
 | 
| +        # defer fsck for next reboot, to avoid reboots back to default kernel
 | 
| +        utils.system('touch /fastboot')  # this file is removed automatically
 | 
| +
 | 
| +        # Boot it.
 | 
| +        self.job.start_reboot()
 | 
| +        self.job.reboot(tag=self.installed_as)
 | 
| +
 | 
| +
 | 
| +class kernel(BootableKernel):
 | 
|      """ Class for compiling kernels.
 | 
|  
 | 
|      Data for the object includes the src files
 | 
| @@ -109,7 +153,7 @@ class kernel(object):
 | 
|          leave
 | 
|                  Boolean, whether to leave existing tmpdir or not
 | 
|          """
 | 
| -        self.job = job
 | 
| +        super(kernel, self).__init__(job)
 | 
|          self.autodir = job.autodir
 | 
|  
 | 
|          self.src_dir    = os.path.join(tmp_dir, 'src')
 | 
| @@ -120,8 +164,6 @@ class kernel(object):
 | 
|          self.results_dir = os.path.join(subdir, 'results')
 | 
|          self.subdir     = os.path.basename(subdir)
 | 
|  
 | 
| -        self.installed_as = None
 | 
| -
 | 
|          if not leave:
 | 
|              if os.path.isdir(self.src_dir):
 | 
|                  utils.system('rm -rf ' + self.src_dir)
 | 
| @@ -450,16 +492,6 @@ class kernel(object):
 | 
|                            self.system_map, self.initrd)
 | 
|  
 | 
|  
 | 
| -    def add_to_bootloader(self, tag='autotest', args=''):
 | 
| -        """ add this kernel to bootloader, taking an
 | 
| -            optional parameter of space separated parameters
 | 
| -            e.g.:  kernel.add_to_bootloader('mykernel', 'ro acpi=off')
 | 
| -        """
 | 
| -        _add_kernel_to_bootloader(self.job.bootloader,
 | 
| -                                  self.job.config_get('boot.default_args'),
 | 
| -                                  tag, args, self.image, self.initrd)
 | 
| -
 | 
| -
 | 
|      def get_kernel_build_arch(self, arch=None):
 | 
|          """
 | 
|          Work out the current kernel architecture (as a kernel arch)
 | 
| @@ -526,29 +558,14 @@ class kernel(object):
 | 
|              just make it happen.
 | 
|          """
 | 
|  
 | 
| -        # If we can check the kernel identity do so.
 | 
| -        expected_ident = self.get_kernel_build_ident()
 | 
| -        if ident:
 | 
| -            when = int(time.time())
 | 
| -            args += " IDENT=%d" % (when)
 | 
| -            self.job.next_step_prepend(["job.end_reboot_and_verify", when,
 | 
| -                                        expected_ident, self.subdir,
 | 
| -                                        self.applied_patches])
 | 
| -        else:
 | 
| -            self.job.next_step_prepend(["job.end_reboot", self.subdir,
 | 
| -                                        expected_ident, self.applied_patches])
 | 
| -
 | 
| -        # Check if the kernel has been installed, if not install
 | 
| -        # as the default tag and boot that.
 | 
| +        # If the kernel has not yet been installed,
 | 
| +        #   install it now as default tag.
 | 
|          if not self.installed_as:
 | 
|              self.install()
 | 
|  
 | 
| -        # Boot the selected tag.
 | 
| -        self.add_to_bootloader(args=args, tag=self.installed_as)
 | 
| -
 | 
| -        # Boot it.
 | 
| -        self.job.start_reboot()
 | 
| -        self.job.reboot(tag=self.installed_as)
 | 
| +        expected_ident = self.get_kernel_build_ident()
 | 
| +        self._boot_kernel(args, ident, expected_ident,
 | 
| +                          self.subdir, self.applied_patches)
 | 
|  
 | 
|  
 | 
|      def get_kernel_build_ver(self):
 | 
| @@ -646,20 +663,19 @@ class kernel(object):
 | 
|          pickle.dump(temp, open(filename, 'w'))
 | 
|  
 | 
|  
 | 
| -class rpm_kernel(object):
 | 
| +class rpm_kernel(BootableKernel):
 | 
|      """
 | 
|      Class for installing a binary rpm kernel package
 | 
|      """
 | 
|  
 | 
|      def __init__(self, job, rpm_package, subdir):
 | 
| -        self.job = job
 | 
| +        super(rpm_kernel, self).__init__(job)
 | 
|          self.rpm_package = rpm_package
 | 
|          self.log_dir = os.path.join(subdir, 'debug')
 | 
|          self.subdir = os.path.basename(subdir)
 | 
|          if os.path.exists(self.log_dir):
 | 
|              utils.system('rm -rf ' + self.log_dir)
 | 
|          os.mkdir(self.log_dir)
 | 
| -        self.installed_as = None
 | 
|  
 | 
|  
 | 
|      def build(self, *args, **dargs):
 | 
| @@ -725,44 +741,23 @@ class rpm_kernel(object):
 | 
|                                        % (vmlinux, rpm_pack))
 | 
|  
 | 
|  
 | 
| -    def add_to_bootloader(self, tag='autotest', args=''):
 | 
| -        """ Add this kernel to bootloader
 | 
| -        """
 | 
| -        _add_kernel_to_bootloader(self.job.bootloader,
 | 
| -                                  self.job.config_get('boot.default_args'),
 | 
| -                                  tag, args, self.image, self.initrd)
 | 
| -
 | 
| -
 | 
|      def boot(self, args='', ident=True):
 | 
|          """ install and boot this kernel
 | 
|          """
 | 
|  
 | 
| -        # Check if the kernel has been installed, if not install
 | 
| -        # as the default tag and boot that.
 | 
| +        # If the kernel has not yet been installed,
 | 
| +        #   install it now as default tag.
 | 
|          if not self.installed_as:
 | 
|              self.install()
 | 
|  
 | 
| -        # If we can check the kernel identity do so.
 | 
|          expected_ident = self.full_version
 | 
|          if not expected_ident:
 | 
|              expected_ident = '-'.join([self.version,
 | 
|                                         self.rpm_flavour,
 | 
|                                         self.release])
 | 
| -        if ident:
 | 
| -            when = int(time.time())
 | 
| -            args += " IDENT=%d" % (when)
 | 
| -            self.job.next_step_prepend(["job.end_reboot_and_verify",
 | 
| -                                        when, expected_ident, None, 'rpm'])
 | 
| -        else:
 | 
| -            self.job.next_step_prepend(["job.end_reboot", None,
 | 
| -                                        expected_ident, []])
 | 
| -
 | 
| -        # Boot the selected tag.
 | 
| -        self.add_to_bootloader(args=args, tag=self.installed_as)
 | 
|  
 | 
| -        # Boot it.
 | 
| -        self.job.start_reboot()
 | 
| -        self.job.reboot(tag=self.installed_as)
 | 
| +        self._boot_kernel(args, ident, expected_ident,
 | 
| +                          None, 'rpm')
 | 
|  
 | 
|  
 | 
|  class rpm_kernel_suse(rpm_kernel):
 | 
| 
 |