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 |