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

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

Issue 4823005: Merge remote branch 'cros/upstream' into tempbranch (Closed) Base URL: http://git.chromium.org/git/autotest.git@master
Patch Set: patch Created 10 years, 1 month 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 for arg in args.split(): 52 for arg in args.split():
53 if arg.startswith(root_prefix): 53 if arg.startswith(root_prefix):
54 # set the current root value with the one from the argument 54 # set the current root value with the one from the argument
55 # thus after processing all the arguments we keep the last 55 # thus after processing all the arguments we keep the last
56 # root value (so root= options from args overrides any from 56 # root value (so root= options from args overrides any from
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. it will keep all arguments from the default entry.
63 bootloader.add_kernel(image, tag, initrd=initrd, args=' '.join(arglist), 63 # args='_dummy_' is used to workaround a boottool limitation of not being
64 root=root) 64 # able to add arguments to a kernel that does not already have any of its
65 # own by way of its own append= section below the image= line in lilo.conf.
66 bootloader.add_kernel(image, tag, initrd=initrd, root=root, args='_dummy_')
67 # Now, for each argument in arglist, try to add it to the kernel that was
68 # just added. In each step, if the arg already existed on the args string,
69 # that particular arg will be skipped
70 for a in arglist:
71 bootloader.add_args(kernel=tag, args=a)
72 bootloader.remove_args(kernel=tag, args='_dummy_')
65 73
66 74
67 class BootableKernel(object): 75 class BootableKernel(object):
68 76
69 def __init__(self, job): 77 def __init__(self, job):
70 self.job = job 78 self.job = job
71 self.installed_as = None # kernel choice in bootloader menu 79 self.installed_as = None # kernel choice in bootloader menu
72 self.image = None 80 self.image = None
73 self.initrd = '' 81 self.initrd = ''
74 82
75 83
76 def _boot_kernel(self, args, ident_check, expected_ident, subdir, notes): 84 def _boot_kernel(self, args, ident_check, expected_ident, subdir, notes):
77 """ 85 """
78 Boot a kernel, with post-boot kernel id check 86 Boot a kernel, with post-boot kernel id check
79 87
80 @param args: kernel cmdline arguments 88 @param args: kernel cmdline arguments
81 @param ident_check: check kernel id after boot 89 @param ident_check: check kernel id after boot
82 @param expected_ident: 90 @param expected_ident:
83 @param subdir: job-step qualifier in status log 91 @param subdir: job-step qualifier in status log
84 @param notes: additional comment in status log 92 @param notes: additional comment in status log
85 """ 93 """
86
87 # If we can check the kernel identity do so. 94 # If we can check the kernel identity do so.
88 if ident_check: 95 if ident_check:
89 when = int(time.time()) 96 when = int(time.time())
90 args += " IDENT=%d" % when 97 args += " IDENT=%d" % when
91 self.job.next_step_prepend(["job.end_reboot_and_verify", when, 98 self.job.next_step_prepend(["job.end_reboot_and_verify", when,
92 expected_ident, subdir, notes]) 99 expected_ident, subdir, notes])
93 else: 100 else:
94 self.job.next_step_prepend(["job.end_reboot", subdir, 101 self.job.next_step_prepend(["job.end_reboot", subdir,
95 expected_ident, notes]) 102 expected_ident, notes])
96 103
97 # Point bootloader to the selected tag. 104 self.add_to_bootloader(args)
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 105
103 # defer fsck for next reboot, to avoid reboots back to default kernel 106 # defer fsck for next reboot, to avoid reboots back to default kernel
104 utils.system('touch /fastboot') # this file is removed automatically 107 utils.system('touch /fastboot') # this file is removed automatically
105 108
106 # Boot it. 109 # Boot it.
107 self.job.start_reboot() 110 self.job.start_reboot()
108 self.job.reboot(tag=self.installed_as) 111 self.job.reboot(tag=self.installed_as)
109 112
110 113
114 def add_to_bootloader(self, args=''):
115 # Point bootloader to the selected tag.
116 _add_kernel_to_bootloader(self.job.bootloader,
117 self.job.config_get('boot.default_args'),
118 self.installed_as, args, self.image,
119 self.initrd)
120
121
111 class kernel(BootableKernel): 122 class kernel(BootableKernel):
112 """ Class for compiling kernels. 123 """ Class for compiling kernels.
113 124
114 Data for the object includes the src files 125 Data for the object includes the src files
115 used to create the kernel, patches applied, config (base + changes), 126 used to create the kernel, patches applied, config (base + changes),
116 the build directory itself, and logged output 127 the build directory itself, and logged output
117 128
118 Properties: 129 Properties:
119 job 130 job
120 Backpointer to the job object we're part of 131 Backpointer to the job object we're part of
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 self.logfile.write(log) 311 self.logfile.write(log)
301 self.applied_patches.append(patch_id) 312 self.applied_patches.append(patch_id)
302 313
303 314
304 def get_kernel_tree(self, base_tree): 315 def get_kernel_tree(self, base_tree):
305 """Extract/link base_tree to self.build_dir""" 316 """Extract/link base_tree to self.build_dir"""
306 317
307 # if base_tree is a dir, assume uncompressed kernel 318 # if base_tree is a dir, assume uncompressed kernel
308 if os.path.isdir(base_tree): 319 if os.path.isdir(base_tree):
309 print 'Symlinking existing kernel source' 320 print 'Symlinking existing kernel source'
321 if os.path.islink(self.build_dir):
322 os.remove(self.build_dir)
310 os.symlink(base_tree, self.build_dir) 323 os.symlink(base_tree, self.build_dir)
311 324
312 # otherwise, extract tarball 325 # otherwise, extract tarball
313 else: 326 else:
314 os.chdir(os.path.dirname(self.src_dir)) 327 os.chdir(os.path.dirname(self.src_dir))
315 # Figure out local destination for tarball 328 # Figure out local destination for tarball
316 tarball = os.path.join(self.src_dir, os.path.basename(base_tree.spli t(';')[0])) 329 tarball = os.path.join(self.src_dir, os.path.basename(base_tree.spli t(';')[0]))
317 utils.get_file(base_tree, tarball) 330 utils.get_file(base_tree, tarball)
318 print 'Extracting kernel tarball:', tarball, '...' 331 print 'Extracting kernel tarball:', tarball, '...'
319 utils.extract_tarball_to_dir(tarball, self.build_dir) 332 utils.extract_tarball_to_dir(tarball, self.build_dir)
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 utils.force_copy(self.build_dir+'/System.map', 378 utils.force_copy(self.build_dir+'/System.map',
366 self.results_dir) 379 self.results_dir)
367 380
368 381
369 def build_timed(self, threads, timefile = '/dev/null', make_opts = '', 382 def build_timed(self, threads, timefile = '/dev/null', make_opts = '',
370 output = '/dev/null'): 383 output = '/dev/null'):
371 """time the bulding of the kernel""" 384 """time the bulding of the kernel"""
372 os.chdir(self.build_dir) 385 os.chdir(self.build_dir)
373 self.set_cross_cc() 386 self.set_cross_cc()
374 387
375 self.clean(logged=False) 388 self.clean()
376 build_string = "/usr/bin/time -o %s make %s -j %s vmlinux" \ 389 build_string = "/usr/bin/time -o %s make %s -j %s vmlinux" \
377 % (timefile, make_opts, threads) 390 % (timefile, make_opts, threads)
378 build_string += ' > %s 2>&1' % output 391 build_string += ' > %s 2>&1' % output
379 print build_string 392 print build_string
380 utils.system(build_string) 393 utils.system(build_string)
381 394
382 if (not os.path.isfile('vmlinux')): 395 if (not os.path.isfile('vmlinux')):
383 errmsg = "no vmlinux found, kernel build failed" 396 errmsg = "no vmlinux found, kernel build failed"
384 raise error.TestError(errmsg) 397 raise error.TestError(errmsg)
385 398
(...skipping 27 matching lines...) Expand all
413 if os.path.isfile(initrd): 426 if os.path.isfile(initrd):
414 print "Existing %s file, will remove it." % initrd 427 print "Existing %s file, will remove it." % initrd
415 os.remove(initrd) 428 os.remove(initrd)
416 429
417 args = self.job.config_get('kernel.mkinitrd_extra_args') 430 args = self.job.config_get('kernel.mkinitrd_extra_args')
418 431
419 # don't leak 'None' into mkinitrd command 432 # don't leak 'None' into mkinitrd command
420 if not args: 433 if not args:
421 args = '' 434 args = ''
422 435
436 # It is important to match the version with a real directory inside
437 # /lib/modules
438 real_version_list = glob.glob('/lib/modules/%s*' % version)
439 rl = len(real_version_list)
440 if rl == 0:
441 logging.error("No directory %s found under /lib/modules. Initramfs"
442 "creation will most likely fail and your new kernel"
443 "will fail to build", version)
444 else:
445 if rl > 1:
446 logging.warning("Found more than one possible match for "
447 "kernel version %s under /lib/modules", version)
448 version = os.path.basename(real_version_list[0])
449
423 if vendor in ['Red Hat', 'Fedora Core']: 450 if vendor in ['Red Hat', 'Fedora Core']:
424 utils.system('mkinitrd %s %s %s' % (args, initrd, version)) 451 try:
452 cmd = os_dep.command('dracut')
453 full_cmd = '%s -f %s %s' % (cmd, initrd, version)
454 except ValueError:
455 cmd = os_dep.command('mkinitrd')
456 full_cmd = '%s %s %s %s' % (cmd, args, initrd, version)
457 utils.system(full_cmd)
425 elif vendor in ['SUSE']: 458 elif vendor in ['SUSE']:
426 utils.system('mkinitrd %s -k %s -i %s -M %s' % 459 utils.system('mkinitrd %s -k %s -i %s -M %s' %
427 (args, image, initrd, system_map)) 460 (args, image, initrd, system_map))
428 elif vendor in ['Debian', 'Ubuntu']: 461 elif vendor in ['Debian', 'Ubuntu']:
429 if os.path.isfile('/usr/sbin/mkinitrd'): 462 if os.path.isfile('/usr/sbin/mkinitrd'):
430 cmd = '/usr/sbin/mkinitrd' 463 cmd = '/usr/sbin/mkinitrd'
431 elif os.path.isfile('/usr/sbin/mkinitramfs'): 464 elif os.path.isfile('/usr/sbin/mkinitramfs'):
432 cmd = '/usr/sbin/mkinitramfs' 465 cmd = '/usr/sbin/mkinitramfs'
433 else: 466 else:
434 raise error.TestError('No Debian initrd builder') 467 raise error.TestError('No Debian initrd builder')
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 self.version, self.release = utils.system_output( 745 self.version, self.release = utils.system_output(
713 'rpm --queryformat="%{VERSION}\\n%{RELEASE}\\n" -q ' 746 'rpm --queryformat="%{VERSION}\\n%{RELEASE}\\n" -q '
714 + rpm_name).splitlines()[0:2] 747 + rpm_name).splitlines()[0:2]
715 748
716 # prefer /boot/kernel-version before /boot/kernel 749 # prefer /boot/kernel-version before /boot/kernel
717 if self.full_version: 750 if self.full_version:
718 break 751 break
719 752
720 # search for initrd 753 # search for initrd
721 for file in files: 754 for file in files:
722 if file.startswith('/boot/initrd'): 755 if file.startswith('/boot/init'):
723 self.initrd = file 756 self.initrd = file
724 # prefer /boot/initrd-version before /boot/initrd 757 # prefer /boot/initrd-version before /boot/initrd
725 if len(file) > len('/boot/initrd'): 758 if len(file) > len('/boot/initrd'):
726 break 759 break
727 760
728 if self.image == None: 761 if self.image == None:
729 errmsg = "specified rpm file(s) don't contain /boot/vmlinuz" 762 errmsg = "specified rpm file(s) don't contain /boot/vmlinuz"
730 raise error.TestError(errmsg) 763 raise error.TestError(errmsg)
731 764
732 # install vmlinux 765 # install vmlinux
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 # kernel from that specific path. 866 # kernel from that specific path.
834 job.pkgmgr.fetch_pkg(rpm_name, os.path.join(job.pkgdir, rpm_name ), 867 job.pkgmgr.fetch_pkg(rpm_name, os.path.join(job.pkgdir, rpm_name ),
835 repo_url=os.path.dirname(kernel_path)) 868 repo_url=os.path.dirname(kernel_path))
836 869
837 rpm_paths.append(os.path.join(job.pkgdir, rpm_name)) 870 rpm_paths.append(os.path.join(job.pkgdir, rpm_name))
838 return rpm_kernel_vendor(job, rpm_paths, subdir) 871 return rpm_kernel_vendor(job, rpm_paths, subdir)
839 else: 872 else:
840 if len(kernel_paths) > 1: 873 if len(kernel_paths) > 1:
841 raise error.TestError("don't know what to do with more than one non- rpm kernel file") 874 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) 875 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