| OLD | NEW |
| 1 import os, shutil, copy, pickle, re, glob, time, logging | 1 import os, shutil, copy, pickle, re, glob, time, logging |
| 2 from autotest_lib.client.bin import kernel_config, os_dep, kernelexpand, test | 2 from autotest_lib.client.bin import kernel_config, os_dep, kernelexpand, test |
| 3 from autotest_lib.client.bin import utils | 3 from autotest_lib.client.bin import utils |
| 4 from autotest_lib.client.common_lib import log, error, packages | 4 from autotest_lib.client.common_lib import log, error, packages |
| 5 | 5 |
| 6 | 6 |
| 7 def tee_output_logdir_mark(fn): | 7 def tee_output_logdir_mark(fn): |
| 8 def tee_logdir_mark_wrapper(self, *args, **dargs): | 8 def tee_logdir_mark_wrapper(self, *args, **dargs): |
| 9 mark = self.__class__.__name__ + "." + fn.__name__ | 9 mark = self.__class__.__name__ + "." + fn.__name__ |
| 10 logging.info("--- START %s ---", mark) | 10 logging.info("--- START %s ---", mark) |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 # base_args) | 57 # base_args) |
| 58 root = arg[len(root_prefix):] | 58 root = arg[len(root_prefix):] |
| 59 else: | 59 else: |
| 60 arglist.append(arg) | 60 arglist.append(arg) |
| 61 | 61 |
| 62 # add the kernel entry | 62 # add the kernel entry |
| 63 bootloader.add_kernel(image, tag, initrd=initrd, args=' '.join(arglist), | 63 bootloader.add_kernel(image, tag, initrd=initrd, args=' '.join(arglist), |
| 64 root=root) | 64 root=root) |
| 65 | 65 |
| 66 | 66 |
| 67 class BootableKernel(object): | 67 class kernel(object): |
| 68 | |
| 69 def __init__(self, job): | |
| 70 self.job = job | |
| 71 self.installed_as = None # kernel choice in bootloader menu | |
| 72 self.image = None | |
| 73 self.initrd = '' | |
| 74 | |
| 75 | |
| 76 def _boot_kernel(self, args, ident_check, expected_ident, subdir, notes): | |
| 77 """ | |
| 78 Boot a kernel, with post-boot kernel id check | |
| 79 | |
| 80 @param args: kernel cmdline arguments | |
| 81 @param ident_check: check kernel id after boot | |
| 82 @param expected_ident: | |
| 83 @param subdir: job-step qualifier in status log | |
| 84 @param notes: additional comment in status log | |
| 85 """ | |
| 86 | |
| 87 # If we can check the kernel identity do so. | |
| 88 if ident_check: | |
| 89 when = int(time.time()) | |
| 90 args += " IDENT=%d" % when | |
| 91 self.job.next_step_prepend(["job.end_reboot_and_verify", when, | |
| 92 expected_ident, subdir, notes]) | |
| 93 else: | |
| 94 self.job.next_step_prepend(["job.end_reboot", subdir, | |
| 95 expected_ident, notes]) | |
| 96 | |
| 97 # Point bootloader to the selected tag. | |
| 98 _add_kernel_to_bootloader(self.job.bootloader, | |
| 99 self.job.config_get('boot.default_args'), | |
| 100 self.installed_as, args, self.image, | |
| 101 self.initrd) | |
| 102 | |
| 103 # defer fsck for next reboot, to avoid reboots back to default kernel | |
| 104 utils.system('touch /fastboot') # this file is removed automatically | |
| 105 | |
| 106 # Boot it. | |
| 107 self.job.start_reboot() | |
| 108 self.job.reboot(tag=self.installed_as) | |
| 109 | |
| 110 | |
| 111 class kernel(BootableKernel): | |
| 112 """ Class for compiling kernels. | 68 """ Class for compiling kernels. |
| 113 | 69 |
| 114 Data for the object includes the src files | 70 Data for the object includes the src files |
| 115 used to create the kernel, patches applied, config (base + changes), | 71 used to create the kernel, patches applied, config (base + changes), |
| 116 the build directory itself, and logged output | 72 the build directory itself, and logged output |
| 117 | 73 |
| 118 Properties: | 74 Properties: |
| 119 job | 75 job |
| 120 Backpointer to the job object we're part of | 76 Backpointer to the job object we're part of |
| 121 autodir | 77 autodir |
| (...skipping 24 matching lines...) Expand all Loading... |
| 146 3. A local directory (will symlink it) | 102 3. A local directory (will symlink it) |
| 147 4. A shorthand expandable (eg '2.6.11-git3') | 103 4. A shorthand expandable (eg '2.6.11-git3') |
| 148 subdir | 104 subdir |
| 149 subdir in the results directory (eg "build") | 105 subdir in the results directory (eg "build") |
| 150 (holds config/, debug/, results/) | 106 (holds config/, debug/, results/) |
| 151 tmp_dir | 107 tmp_dir |
| 152 | 108 |
| 153 leave | 109 leave |
| 154 Boolean, whether to leave existing tmpdir or not | 110 Boolean, whether to leave existing tmpdir or not |
| 155 """ | 111 """ |
| 156 super(kernel, self).__init__(job) | 112 self.job = job |
| 157 self.autodir = job.autodir | 113 self.autodir = job.autodir |
| 158 | 114 |
| 159 self.src_dir = os.path.join(tmp_dir, 'src') | 115 self.src_dir = os.path.join(tmp_dir, 'src') |
| 160 self.build_dir = os.path.join(tmp_dir, build_dir) | 116 self.build_dir = os.path.join(tmp_dir, build_dir) |
| 161 # created by get_kernel_tree | 117 # created by get_kernel_tree |
| 162 self.config_dir = os.path.join(subdir, 'config') | 118 self.config_dir = os.path.join(subdir, 'config') |
| 163 self.log_dir = os.path.join(subdir, 'debug') | 119 self.log_dir = os.path.join(subdir, 'debug') |
| 164 self.results_dir = os.path.join(subdir, 'results') | 120 self.results_dir = os.path.join(subdir, 'results') |
| 165 self.subdir = os.path.basename(subdir) | 121 self.subdir = os.path.basename(subdir) |
| 166 | 122 |
| 123 self.installed_as = None |
| 124 |
| 167 if not leave: | 125 if not leave: |
| 168 if os.path.isdir(self.src_dir): | 126 if os.path.isdir(self.src_dir): |
| 169 utils.system('rm -rf ' + self.src_dir) | 127 utils.system('rm -rf ' + self.src_dir) |
| 170 if os.path.isdir(self.build_dir): | 128 if os.path.isdir(self.build_dir): |
| 171 utils.system('rm -rf ' + self.build_dir) | 129 utils.system('rm -rf ' + self.build_dir) |
| 172 | 130 |
| 173 if not os.path.exists(self.src_dir): | 131 if not os.path.exists(self.src_dir): |
| 174 os.mkdir(self.src_dir) | 132 os.mkdir(self.src_dir) |
| 175 for path in [self.config_dir, self.log_dir, self.results_dir]: | 133 for path in [self.config_dir, self.log_dir, self.results_dir]: |
| 176 if os.path.exists(path): | 134 if os.path.exists(path): |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 if not kernel_config.modules_needed('.config'): | 443 if not kernel_config.modules_needed('.config'): |
| 486 return | 444 return |
| 487 | 445 |
| 488 utils.system('make modules_install INSTALL_MOD_PATH=%s' % prefix) | 446 utils.system('make modules_install INSTALL_MOD_PATH=%s' % prefix) |
| 489 if prefix == '/': | 447 if prefix == '/': |
| 490 self.initrd = self.boot_dir + '/initrd-' + tag | 448 self.initrd = self.boot_dir + '/initrd-' + tag |
| 491 self.mkinitrd(self.get_kernel_build_ver(), self.image, | 449 self.mkinitrd(self.get_kernel_build_ver(), self.image, |
| 492 self.system_map, self.initrd) | 450 self.system_map, self.initrd) |
| 493 | 451 |
| 494 | 452 |
| 453 def add_to_bootloader(self, tag='autotest', args=''): |
| 454 """ add this kernel to bootloader, taking an |
| 455 optional parameter of space separated parameters |
| 456 e.g.: kernel.add_to_bootloader('mykernel', 'ro acpi=off') |
| 457 """ |
| 458 _add_kernel_to_bootloader(self.job.bootloader, |
| 459 self.job.config_get('boot.default_args'), |
| 460 tag, args, self.image, self.initrd) |
| 461 |
| 462 |
| 495 def get_kernel_build_arch(self, arch=None): | 463 def get_kernel_build_arch(self, arch=None): |
| 496 """ | 464 """ |
| 497 Work out the current kernel architecture (as a kernel arch) | 465 Work out the current kernel architecture (as a kernel arch) |
| 498 """ | 466 """ |
| 499 if not arch: | 467 if not arch: |
| 500 arch = utils.get_current_kernel_arch() | 468 arch = utils.get_current_kernel_arch() |
| 501 if re.match('i.86', arch): | 469 if re.match('i.86', arch): |
| 502 return 'i386' | 470 return 'i386' |
| 503 elif re.match('sun4u', arch): | 471 elif re.match('sun4u', arch): |
| 504 return 'sparc64' | 472 return 'sparc64' |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 raise error.JobError('kernel has no identity') | 519 raise error.JobError('kernel has no identity') |
| 552 | 520 |
| 553 return release + '::' + version | 521 return release + '::' + version |
| 554 | 522 |
| 555 | 523 |
| 556 def boot(self, args='', ident=True): | 524 def boot(self, args='', ident=True): |
| 557 """ install and boot this kernel, do not care how | 525 """ install and boot this kernel, do not care how |
| 558 just make it happen. | 526 just make it happen. |
| 559 """ | 527 """ |
| 560 | 528 |
| 561 # If the kernel has not yet been installed, | 529 # If we can check the kernel identity do so. |
| 562 # install it now as default tag. | 530 expected_ident = self.get_kernel_build_ident() |
| 531 if ident: |
| 532 when = int(time.time()) |
| 533 args += " IDENT=%d" % (when) |
| 534 self.job.next_step_prepend(["job.end_reboot_and_verify", when, |
| 535 expected_ident, self.subdir, |
| 536 self.applied_patches]) |
| 537 else: |
| 538 self.job.next_step_prepend(["job.end_reboot", self.subdir, |
| 539 expected_ident, self.applied_patches]) |
| 540 |
| 541 # Check if the kernel has been installed, if not install |
| 542 # as the default tag and boot that. |
| 563 if not self.installed_as: | 543 if not self.installed_as: |
| 564 self.install() | 544 self.install() |
| 565 | 545 |
| 566 expected_ident = self.get_kernel_build_ident() | 546 # Boot the selected tag. |
| 567 self._boot_kernel(args, ident, expected_ident, | 547 self.add_to_bootloader(args=args, tag=self.installed_as) |
| 568 self.subdir, self.applied_patches) | 548 |
| 549 # Boot it. |
| 550 self.job.start_reboot() |
| 551 self.job.reboot(tag=self.installed_as) |
| 569 | 552 |
| 570 | 553 |
| 571 def get_kernel_build_ver(self): | 554 def get_kernel_build_ver(self): |
| 572 """Check Makefile and .config to return kernel version""" | 555 """Check Makefile and .config to return kernel version""" |
| 573 version = patchlevel = sublevel = extraversion = localversion = '' | 556 version = patchlevel = sublevel = extraversion = localversion = '' |
| 574 | 557 |
| 575 for line in open(self.build_dir + '/Makefile', 'r').readlines(): | 558 for line in open(self.build_dir + '/Makefile', 'r').readlines(): |
| 576 if line.startswith('VERSION'): | 559 if line.startswith('VERSION'): |
| 577 version = line[line.index('=') + 1:].strip() | 560 version = line[line.index('=') + 1:].strip() |
| 578 if line.startswith('PATCHLEVEL'): | 561 if line.startswith('PATCHLEVEL'): |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 | 639 |
| 657 we can't pickle the backreference to job (it contains fd's), | 640 we can't pickle the backreference to job (it contains fd's), |
| 658 nor would we want to. Same for logfile (fd's). | 641 nor would we want to. Same for logfile (fd's). |
| 659 """ | 642 """ |
| 660 temp = copy.copy(self) | 643 temp = copy.copy(self) |
| 661 temp.job = None | 644 temp.job = None |
| 662 temp.logfile = None | 645 temp.logfile = None |
| 663 pickle.dump(temp, open(filename, 'w')) | 646 pickle.dump(temp, open(filename, 'w')) |
| 664 | 647 |
| 665 | 648 |
| 666 class rpm_kernel(BootableKernel): | 649 class rpm_kernel(object): |
| 667 """ | 650 """ |
| 668 Class for installing a binary rpm kernel package | 651 Class for installing a binary rpm kernel package |
| 669 """ | 652 """ |
| 670 | 653 |
| 671 def __init__(self, job, rpm_package, subdir): | 654 def __init__(self, job, rpm_package, subdir): |
| 672 super(rpm_kernel, self).__init__(job) | 655 self.job = job |
| 673 self.rpm_package = rpm_package | 656 self.rpm_package = rpm_package |
| 674 self.log_dir = os.path.join(subdir, 'debug') | 657 self.log_dir = os.path.join(subdir, 'debug') |
| 675 self.subdir = os.path.basename(subdir) | 658 self.subdir = os.path.basename(subdir) |
| 676 if os.path.exists(self.log_dir): | 659 if os.path.exists(self.log_dir): |
| 677 utils.system('rm -rf ' + self.log_dir) | 660 utils.system('rm -rf ' + self.log_dir) |
| 678 os.mkdir(self.log_dir) | 661 os.mkdir(self.log_dir) |
| 662 self.installed_as = None |
| 679 | 663 |
| 680 | 664 |
| 681 def build(self, *args, **dargs): | 665 def build(self, *args, **dargs): |
| 682 """ | 666 """ |
| 683 Dummy function, binary kernel so nothing to build. | 667 Dummy function, binary kernel so nothing to build. |
| 684 """ | 668 """ |
| 685 pass | 669 pass |
| 686 | 670 |
| 687 | 671 |
| 688 @log.record | 672 @log.record |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 for rpm_pack in self.rpm_package: | 718 for rpm_pack in self.rpm_package: |
| 735 vmlinux = utils.system_output( | 719 vmlinux = utils.system_output( |
| 736 'rpm -q -l -p %s | grep /boot/vmlinux' % rpm_pack) | 720 'rpm -q -l -p %s | grep /boot/vmlinux' % rpm_pack) |
| 737 utils.system('cd /; rpm2cpio %s | cpio -imuv .%s 2>&1' | 721 utils.system('cd /; rpm2cpio %s | cpio -imuv .%s 2>&1' |
| 738 % (rpm_pack, vmlinux)) | 722 % (rpm_pack, vmlinux)) |
| 739 if not os.path.exists(vmlinux): | 723 if not os.path.exists(vmlinux): |
| 740 raise error.TestError('%s does not exist after installing %s' | 724 raise error.TestError('%s does not exist after installing %s' |
| 741 % (vmlinux, rpm_pack)) | 725 % (vmlinux, rpm_pack)) |
| 742 | 726 |
| 743 | 727 |
| 728 def add_to_bootloader(self, tag='autotest', args=''): |
| 729 """ Add this kernel to bootloader |
| 730 """ |
| 731 _add_kernel_to_bootloader(self.job.bootloader, |
| 732 self.job.config_get('boot.default_args'), |
| 733 tag, args, self.image, self.initrd) |
| 734 |
| 735 |
| 744 def boot(self, args='', ident=True): | 736 def boot(self, args='', ident=True): |
| 745 """ install and boot this kernel | 737 """ install and boot this kernel |
| 746 """ | 738 """ |
| 747 | 739 |
| 748 # If the kernel has not yet been installed, | 740 # Check if the kernel has been installed, if not install |
| 749 # install it now as default tag. | 741 # as the default tag and boot that. |
| 750 if not self.installed_as: | 742 if not self.installed_as: |
| 751 self.install() | 743 self.install() |
| 752 | 744 |
| 745 # If we can check the kernel identity do so. |
| 753 expected_ident = self.full_version | 746 expected_ident = self.full_version |
| 754 if not expected_ident: | 747 if not expected_ident: |
| 755 expected_ident = '-'.join([self.version, | 748 expected_ident = '-'.join([self.version, |
| 756 self.rpm_flavour, | 749 self.rpm_flavour, |
| 757 self.release]) | 750 self.release]) |
| 751 if ident: |
| 752 when = int(time.time()) |
| 753 args += " IDENT=%d" % (when) |
| 754 self.job.next_step_prepend(["job.end_reboot_and_verify", |
| 755 when, expected_ident, None, 'rpm']) |
| 756 else: |
| 757 self.job.next_step_prepend(["job.end_reboot", None, |
| 758 expected_ident, []]) |
| 758 | 759 |
| 759 self._boot_kernel(args, ident, expected_ident, | 760 # Boot the selected tag. |
| 760 None, 'rpm') | 761 self.add_to_bootloader(args=args, tag=self.installed_as) |
| 762 |
| 763 # Boot it. |
| 764 self.job.start_reboot() |
| 765 self.job.reboot(tag=self.installed_as) |
| 761 | 766 |
| 762 | 767 |
| 763 class rpm_kernel_suse(rpm_kernel): | 768 class rpm_kernel_suse(rpm_kernel): |
| 764 """ Class for installing openSUSE/SLE rpm kernel package | 769 """ Class for installing openSUSE/SLE rpm kernel package |
| 765 """ | 770 """ |
| 766 | 771 |
| 767 def install(self): | 772 def install(self): |
| 768 # do not set the new kernel as the default one | 773 # do not set the new kernel as the default one |
| 769 os.environ['PBL_AUTOTEST'] = '1' | 774 os.environ['PBL_AUTOTEST'] = '1' |
| 770 | 775 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 # kernel from that specific path. | 838 # kernel from that specific path. |
| 834 job.pkgmgr.fetch_pkg(rpm_name, os.path.join(job.pkgdir, rpm_name
), | 839 job.pkgmgr.fetch_pkg(rpm_name, os.path.join(job.pkgdir, rpm_name
), |
| 835 repo_url=os.path.dirname(kernel_path)) | 840 repo_url=os.path.dirname(kernel_path)) |
| 836 | 841 |
| 837 rpm_paths.append(os.path.join(job.pkgdir, rpm_name)) | 842 rpm_paths.append(os.path.join(job.pkgdir, rpm_name)) |
| 838 return rpm_kernel_vendor(job, rpm_paths, subdir) | 843 return rpm_kernel_vendor(job, rpm_paths, subdir) |
| 839 else: | 844 else: |
| 840 if len(kernel_paths) > 1: | 845 if len(kernel_paths) > 1: |
| 841 raise error.TestError("don't know what to do with more than one non-
rpm kernel file") | 846 raise error.TestError("don't know what to do with more than one non-
rpm kernel file") |
| 842 return kernel(job,kernel_paths[0], subdir, tmp_dir, build_dir, leave) | 847 return kernel(job,kernel_paths[0], subdir, tmp_dir, build_dir, leave) |
| OLD | NEW |