Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(562)

Side by Side Diff: client/bin/kernel.py

Issue 3554003: Merge remote branch 'cros/upstream' into tempbranch3 (Closed) Base URL: http://git.chromium.org/git/autotest.git
Patch Set: Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « client/bin/job.py ('k') | client/bin/kernel_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 kernel(object): 67 class BootableKernel(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):
68 """ Class for compiling kernels. 112 """ Class for compiling kernels.
69 113
70 Data for the object includes the src files 114 Data for the object includes the src files
71 used to create the kernel, patches applied, config (base + changes), 115 used to create the kernel, patches applied, config (base + changes),
72 the build directory itself, and logged output 116 the build directory itself, and logged output
73 117
74 Properties: 118 Properties:
75 job 119 job
76 Backpointer to the job object we're part of 120 Backpointer to the job object we're part of
77 autodir 121 autodir
(...skipping 24 matching lines...) Expand all
102 3. A local directory (will symlink it) 146 3. A local directory (will symlink it)
103 4. A shorthand expandable (eg '2.6.11-git3') 147 4. A shorthand expandable (eg '2.6.11-git3')
104 subdir 148 subdir
105 subdir in the results directory (eg "build") 149 subdir in the results directory (eg "build")
106 (holds config/, debug/, results/) 150 (holds config/, debug/, results/)
107 tmp_dir 151 tmp_dir
108 152
109 leave 153 leave
110 Boolean, whether to leave existing tmpdir or not 154 Boolean, whether to leave existing tmpdir or not
111 """ 155 """
112 self.job = job 156 super(kernel, self).__init__(job)
113 self.autodir = job.autodir 157 self.autodir = job.autodir
114 158
115 self.src_dir = os.path.join(tmp_dir, 'src') 159 self.src_dir = os.path.join(tmp_dir, 'src')
116 self.build_dir = os.path.join(tmp_dir, build_dir) 160 self.build_dir = os.path.join(tmp_dir, build_dir)
117 # created by get_kernel_tree 161 # created by get_kernel_tree
118 self.config_dir = os.path.join(subdir, 'config') 162 self.config_dir = os.path.join(subdir, 'config')
119 self.log_dir = os.path.join(subdir, 'debug') 163 self.log_dir = os.path.join(subdir, 'debug')
120 self.results_dir = os.path.join(subdir, 'results') 164 self.results_dir = os.path.join(subdir, 'results')
121 self.subdir = os.path.basename(subdir) 165 self.subdir = os.path.basename(subdir)
122 166
123 self.installed_as = None
124
125 if not leave: 167 if not leave:
126 if os.path.isdir(self.src_dir): 168 if os.path.isdir(self.src_dir):
127 utils.system('rm -rf ' + self.src_dir) 169 utils.system('rm -rf ' + self.src_dir)
128 if os.path.isdir(self.build_dir): 170 if os.path.isdir(self.build_dir):
129 utils.system('rm -rf ' + self.build_dir) 171 utils.system('rm -rf ' + self.build_dir)
130 172
131 if not os.path.exists(self.src_dir): 173 if not os.path.exists(self.src_dir):
132 os.mkdir(self.src_dir) 174 os.mkdir(self.src_dir)
133 for path in [self.config_dir, self.log_dir, self.results_dir]: 175 for path in [self.config_dir, self.log_dir, self.results_dir]:
134 if os.path.exists(path): 176 if os.path.exists(path):
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 if not kernel_config.modules_needed('.config'): 485 if not kernel_config.modules_needed('.config'):
444 return 486 return
445 487
446 utils.system('make modules_install INSTALL_MOD_PATH=%s' % prefix) 488 utils.system('make modules_install INSTALL_MOD_PATH=%s' % prefix)
447 if prefix == '/': 489 if prefix == '/':
448 self.initrd = self.boot_dir + '/initrd-' + tag 490 self.initrd = self.boot_dir + '/initrd-' + tag
449 self.mkinitrd(self.get_kernel_build_ver(), self.image, 491 self.mkinitrd(self.get_kernel_build_ver(), self.image,
450 self.system_map, self.initrd) 492 self.system_map, self.initrd)
451 493
452 494
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
463 def get_kernel_build_arch(self, arch=None): 495 def get_kernel_build_arch(self, arch=None):
464 """ 496 """
465 Work out the current kernel architecture (as a kernel arch) 497 Work out the current kernel architecture (as a kernel arch)
466 """ 498 """
467 if not arch: 499 if not arch:
468 arch = utils.get_current_kernel_arch() 500 arch = utils.get_current_kernel_arch()
469 if re.match('i.86', arch): 501 if re.match('i.86', arch):
470 return 'i386' 502 return 'i386'
471 elif re.match('sun4u', arch): 503 elif re.match('sun4u', arch):
472 return 'sparc64' 504 return 'sparc64'
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 raise error.JobError('kernel has no identity') 551 raise error.JobError('kernel has no identity')
520 552
521 return release + '::' + version 553 return release + '::' + version
522 554
523 555
524 def boot(self, args='', ident=True): 556 def boot(self, args='', ident=True):
525 """ install and boot this kernel, do not care how 557 """ install and boot this kernel, do not care how
526 just make it happen. 558 just make it happen.
527 """ 559 """
528 560
529 # If we can check the kernel identity do so. 561 # If the kernel has not yet been installed,
530 expected_ident = self.get_kernel_build_ident() 562 # install it now as default tag.
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.
543 if not self.installed_as: 563 if not self.installed_as:
544 self.install() 564 self.install()
545 565
546 # Boot the selected tag. 566 expected_ident = self.get_kernel_build_ident()
547 self.add_to_bootloader(args=args, tag=self.installed_as) 567 self._boot_kernel(args, ident, expected_ident,
548 568 self.subdir, self.applied_patches)
549 # Boot it.
550 self.job.start_reboot()
551 self.job.reboot(tag=self.installed_as)
552 569
553 570
554 def get_kernel_build_ver(self): 571 def get_kernel_build_ver(self):
555 """Check Makefile and .config to return kernel version""" 572 """Check Makefile and .config to return kernel version"""
556 version = patchlevel = sublevel = extraversion = localversion = '' 573 version = patchlevel = sublevel = extraversion = localversion = ''
557 574
558 for line in open(self.build_dir + '/Makefile', 'r').readlines(): 575 for line in open(self.build_dir + '/Makefile', 'r').readlines():
559 if line.startswith('VERSION'): 576 if line.startswith('VERSION'):
560 version = line[line.index('=') + 1:].strip() 577 version = line[line.index('=') + 1:].strip()
561 if line.startswith('PATCHLEVEL'): 578 if line.startswith('PATCHLEVEL'):
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 656
640 we can't pickle the backreference to job (it contains fd's), 657 we can't pickle the backreference to job (it contains fd's),
641 nor would we want to. Same for logfile (fd's). 658 nor would we want to. Same for logfile (fd's).
642 """ 659 """
643 temp = copy.copy(self) 660 temp = copy.copy(self)
644 temp.job = None 661 temp.job = None
645 temp.logfile = None 662 temp.logfile = None
646 pickle.dump(temp, open(filename, 'w')) 663 pickle.dump(temp, open(filename, 'w'))
647 664
648 665
649 class rpm_kernel(object): 666 class rpm_kernel(BootableKernel):
650 """ 667 """
651 Class for installing a binary rpm kernel package 668 Class for installing a binary rpm kernel package
652 """ 669 """
653 670
654 def __init__(self, job, rpm_package, subdir): 671 def __init__(self, job, rpm_package, subdir):
655 self.job = job 672 super(rpm_kernel, self).__init__(job)
656 self.rpm_package = rpm_package 673 self.rpm_package = rpm_package
657 self.log_dir = os.path.join(subdir, 'debug') 674 self.log_dir = os.path.join(subdir, 'debug')
658 self.subdir = os.path.basename(subdir) 675 self.subdir = os.path.basename(subdir)
659 if os.path.exists(self.log_dir): 676 if os.path.exists(self.log_dir):
660 utils.system('rm -rf ' + self.log_dir) 677 utils.system('rm -rf ' + self.log_dir)
661 os.mkdir(self.log_dir) 678 os.mkdir(self.log_dir)
662 self.installed_as = None
663 679
664 680
665 def build(self, *args, **dargs): 681 def build(self, *args, **dargs):
666 """ 682 """
667 Dummy function, binary kernel so nothing to build. 683 Dummy function, binary kernel so nothing to build.
668 """ 684 """
669 pass 685 pass
670 686
671 687
672 @log.record 688 @log.record
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 for rpm_pack in self.rpm_package: 734 for rpm_pack in self.rpm_package:
719 vmlinux = utils.system_output( 735 vmlinux = utils.system_output(
720 'rpm -q -l -p %s | grep /boot/vmlinux' % rpm_pack) 736 'rpm -q -l -p %s | grep /boot/vmlinux' % rpm_pack)
721 utils.system('cd /; rpm2cpio %s | cpio -imuv .%s 2>&1' 737 utils.system('cd /; rpm2cpio %s | cpio -imuv .%s 2>&1'
722 % (rpm_pack, vmlinux)) 738 % (rpm_pack, vmlinux))
723 if not os.path.exists(vmlinux): 739 if not os.path.exists(vmlinux):
724 raise error.TestError('%s does not exist after installing %s' 740 raise error.TestError('%s does not exist after installing %s'
725 % (vmlinux, rpm_pack)) 741 % (vmlinux, rpm_pack))
726 742
727 743
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
736 def boot(self, args='', ident=True): 744 def boot(self, args='', ident=True):
737 """ install and boot this kernel 745 """ install and boot this kernel
738 """ 746 """
739 747
740 # Check if the kernel has been installed, if not install 748 # If the kernel has not yet been installed,
741 # as the default tag and boot that. 749 # install it now as default tag.
742 if not self.installed_as: 750 if not self.installed_as:
743 self.install() 751 self.install()
744 752
745 # If we can check the kernel identity do so.
746 expected_ident = self.full_version 753 expected_ident = self.full_version
747 if not expected_ident: 754 if not expected_ident:
748 expected_ident = '-'.join([self.version, 755 expected_ident = '-'.join([self.version,
749 self.rpm_flavour, 756 self.rpm_flavour,
750 self.release]) 757 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, []])
759 758
760 # Boot the selected tag. 759 self._boot_kernel(args, ident, expected_ident,
761 self.add_to_bootloader(args=args, tag=self.installed_as) 760 None, 'rpm')
762
763 # Boot it.
764 self.job.start_reboot()
765 self.job.reboot(tag=self.installed_as)
766 761
767 762
768 class rpm_kernel_suse(rpm_kernel): 763 class rpm_kernel_suse(rpm_kernel):
769 """ Class for installing openSUSE/SLE rpm kernel package 764 """ Class for installing openSUSE/SLE rpm kernel package
770 """ 765 """
771 766
772 def install(self): 767 def install(self):
773 # do not set the new kernel as the default one 768 # do not set the new kernel as the default one
774 os.environ['PBL_AUTOTEST'] = '1' 769 os.environ['PBL_AUTOTEST'] = '1'
775 770
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 # kernel from that specific path. 833 # kernel from that specific path.
839 job.pkgmgr.fetch_pkg(rpm_name, os.path.join(job.pkgdir, rpm_name ), 834 job.pkgmgr.fetch_pkg(rpm_name, os.path.join(job.pkgdir, rpm_name ),
840 repo_url=os.path.dirname(kernel_path)) 835 repo_url=os.path.dirname(kernel_path))
841 836
842 rpm_paths.append(os.path.join(job.pkgdir, rpm_name)) 837 rpm_paths.append(os.path.join(job.pkgdir, rpm_name))
843 return rpm_kernel_vendor(job, rpm_paths, subdir) 838 return rpm_kernel_vendor(job, rpm_paths, subdir)
844 else: 839 else:
845 if len(kernel_paths) > 1: 840 if len(kernel_paths) > 1:
846 raise error.TestError("don't know what to do with more than one non- rpm kernel file") 841 raise error.TestError("don't know what to do with more than one non- rpm kernel file")
847 return kernel(job,kernel_paths[0], subdir, tmp_dir, build_dir, leave) 842 return kernel(job,kernel_paths[0], subdir, tmp_dir, build_dir, leave)
OLDNEW
« no previous file with comments | « client/bin/job.py ('k') | client/bin/kernel_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698