diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-13 18:03:21 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-13 18:03:21 -0800 | 
| commit | e05a1c6397a73d09389e033b6b2c25c954d2177c (patch) | |
| tree | 699490e0c4f9f130361f4cd0dccc9a730e55dc75 /tools/testing | |
| parent | 66cdd0ceaf65a18996f561b770eedde1d123b019 (diff) | |
| parent | e1a6c3d748ef0ee093e764af3fdd0c1a5cd2b664 (diff) | |
| download | linux-e05a1c6397a73d09389e033b6b2c25c954d2177c.tar.bz2 | |
Merge tag 'ktest-v3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest
Pull ktest update from Steven Rostedt:
 "fixes and updated for new boot loaders"
* tag 'ktest-v3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest:
  ktest: Test if target machine is up before install
  ktest: Fix breakage from change of oldnoconfig to olddefconfig
  ktest: Add native support for syslinux boot loader
  ktest: Sync before reboot
  ktest: Add support for grub2
Diffstat (limited to 'tools/testing')
| -rwxr-xr-x | tools/testing/ktest/ktest.pl | 120 | ||||
| -rw-r--r-- | tools/testing/ktest/sample.conf | 46 | 
2 files changed, 158 insertions, 8 deletions
| diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl index c7ba7614061b..35fc584a4ffe 100755 --- a/tools/testing/ktest/ktest.pl +++ b/tools/testing/ktest/ktest.pl @@ -53,6 +53,9 @@ my %default = (      "STOP_AFTER_FAILURE"	=> 60,      "STOP_TEST_AFTER"		=> 600,      "MAX_MONITOR_WAIT"		=> 1800, +    "GRUB_REBOOT"		=> "grub2-reboot", +    "SYSLINUX"			=> "extlinux", +    "SYSLINUX_PATH"		=> "/boot/extlinux",  # required, and we will ask users if they don't have them but we keep the default  # value something that is common. @@ -105,7 +108,12 @@ my $scp_to_target;  my $scp_to_target_install;  my $power_off;  my $grub_menu; +my $grub_file;  my $grub_number; +my $grub_reboot; +my $syslinux; +my $syslinux_path; +my $syslinux_label;  my $target;  my $make;  my $pre_install; @@ -232,6 +240,11 @@ my %option_map = (      "ADD_CONFIG"		=> \$addconfig,      "REBOOT_TYPE"		=> \$reboot_type,      "GRUB_MENU"			=> \$grub_menu, +    "GRUB_FILE"			=> \$grub_file, +    "GRUB_REBOOT"		=> \$grub_reboot, +    "SYSLINUX"			=> \$syslinux, +    "SYSLINUX_PATH"		=> \$syslinux_path, +    "SYSLINUX_LABEL"		=> \$syslinux_label,      "PRE_INSTALL"		=> \$pre_install,      "POST_INSTALL"		=> \$post_install,      "NO_INSTALL"		=> \$no_install, @@ -368,7 +381,7 @@ EOF      ;  $config_help{"REBOOT_TYPE"} = << "EOF"   Way to reboot the box to the test kernel. - Only valid options so far are "grub" and "script". + Only valid options so far are "grub", "grub2", "syslinux", and "script".   If you specify grub, it will assume grub version 1   and will search in /boot/grub/menu.lst for the title \$GRUB_MENU @@ -378,11 +391,19 @@ $config_help{"REBOOT_TYPE"} = << "EOF"   The entry in /boot/grub/menu.lst must be entered in manually.   The test will not modify that file. + + If you specify grub2, then you also need to specify both \$GRUB_MENU + and \$GRUB_FILE. + + If you specify syslinux, then you may use SYSLINUX to define the syslinux + command (defaults to extlinux), and SYSLINUX_PATH to specify the path to + the syslinux install (defaults to /boot/extlinux). But you have to specify + SYSLINUX_LABEL to define the label to boot to for the test kernel.  EOF      ;  $config_help{"GRUB_MENU"} = << "EOF"   The grub title name for the test kernel to boot - (Only mandatory if REBOOT_TYPE = grub) + (Only mandatory if REBOOT_TYPE = grub or grub2)   Note, ktest.pl will not update the grub menu.lst, you need to   manually add an option for the test. ktest.pl will search @@ -393,6 +414,22 @@ $config_help{"GRUB_MENU"} = << "EOF"   title Test Kernel   kernel vmlinuz-test   GRUB_MENU = Test Kernel + + For grub2, a search of \$GRUB_FILE is performed for the lines + that begin with "menuentry". It will not detect submenus. The + menu must be a non-nested menu. Add the quotes used in the menu + to guarantee your selection, as the first menuentry with the content + of \$GRUB_MENU that is found will be used. +EOF +    ; +$config_help{"GRUB_FILE"} = << "EOF" + If grub2 is used, the full path for the grub.cfg file is placed + here. Use something like /boot/grub2/grub.cfg to search. +EOF +    ; +$config_help{"SYSLINUX_LABEL"} = << "EOF" + If syslinux is used, the label that boots the target kernel must + be specified with SYSLINUX_LABEL.  EOF      ;  $config_help{"REBOOT_SCRIPT"} = << "EOF" @@ -521,6 +558,15 @@ sub get_ktest_configs {      if ($rtype eq "grub") {  	get_ktest_config("GRUB_MENU");      } + +    if ($rtype eq "grub2") { +	get_ktest_config("GRUB_MENU"); +	get_ktest_config("GRUB_FILE"); +    } + +    if ($rtype eq "syslinux") { +	get_ktest_config("SYSLINUX_LABEL"); +    }  }  sub process_variables { @@ -1123,6 +1169,9 @@ sub wait_for_monitor;  sub reboot {      my ($time) = @_; +    # Make sure everything has been written to disk +    run_ssh("sync"); +      if (defined($time)) {  	start_monitor;  	# flush out current monitor @@ -1452,8 +1501,44 @@ sub run_scp_mod {      return run_scp($src, $dst, $cp_scp);  } +sub get_grub2_index { + +    return if (defined($grub_number)); + +    doprint "Find grub2 menu ... "; +    $grub_number = -1; + +    my $ssh_grub = $ssh_exec; +    $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g; + +    open(IN, "$ssh_grub |") +	or die "unable to get $grub_file"; + +    my $found = 0; + +    while (<IN>) { +	if (/^menuentry.*$grub_menu/) { +	    $grub_number++; +	    $found = 1; +	    last; +	} elsif (/^menuentry\s/) { +	    $grub_number++; +	} +    } +    close(IN); + +    die "Could not find '$grub_menu' in $grub_file on $machine" +	if (!$found); +    doprint "$grub_number\n"; +} +  sub get_grub_index { +    if ($reboot_type eq "grub2") { +	get_grub2_index; +	return; +    } +      if ($reboot_type ne "grub") {  	return;      } @@ -1524,6 +1609,10 @@ sub reboot_to {      if ($reboot_type eq "grub") {  	run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'"; +    } elsif ($reboot_type eq "grub2") { +	run_ssh "$grub_reboot $grub_number"; +    } elsif ($reboot_type eq "syslinux") { +	run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";      } elsif (defined $reboot_script) {  	run_command "$reboot_script";      } @@ -1718,6 +1807,14 @@ sub do_post_install {  	dodie "Failed to run post install";  } +# Sometimes the reboot fails, and will hang. We try to ssh to the box +# and if we fail, we force another reboot, that should powercycle it. +sub test_booted { +    if (!run_ssh "echo testing connection") { +	reboot $sleep_time; +    } +} +  sub install {      return if ($no_install); @@ -1730,6 +1827,8 @@ sub install {      my $cp_target = eval_kernel_version $target_image; +    test_booted; +      run_scp_install "$outputdir/$build_target", "$cp_target" or  	dodie "failed to copy image"; @@ -1877,10 +1976,14 @@ sub make_oldconfig {      if (!run_command "$make olddefconfig") {  	# Perhaps olddefconfig doesn't exist in this version of the kernel -	# try a yes '' | oldconfig -	doprint "olddefconfig failed, trying yes '' | make oldconfig\n"; -	run_command "yes '' | $make oldconfig" or -	    dodie "failed make config oldconfig"; +	# try oldnoconfig +	doprint "olddefconfig failed, trying make oldnoconfig\n"; +	if (!run_command "$make oldnoconfig") { +	    doprint "oldnoconfig failed, trying yes '' | make oldconfig\n"; +	    # try a yes '' | oldconfig +	    run_command "yes '' | $make oldconfig" or +		dodie "failed make config oldconfig"; +	}      }  } @@ -3700,6 +3803,11 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {  	$target = "$ssh_user\@$machine";  	if ($reboot_type eq "grub") {  	    dodie "GRUB_MENU not defined" if (!defined($grub_menu)); +	} elsif ($reboot_type eq "grub2") { +	    dodie "GRUB_MENU not defined" if (!defined($grub_menu)); +	    dodie "GRUB_FILE not defined" if (!defined($grub_file)); +	} elsif ($reboot_type eq "syslinux") { +	    dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));  	}      } diff --git a/tools/testing/ktest/sample.conf b/tools/testing/ktest/sample.conf index de28a0a3b8fc..4012e9330344 100644 --- a/tools/testing/ktest/sample.conf +++ b/tools/testing/ktest/sample.conf @@ -332,8 +332,18 @@  # from other linux builds on the system.  #LOCALVERSION = -test +# For REBOOT_TYPE = grub2, you must specify where the grub.cfg +# file is. This is the file that is searched to find the menu +# option to boot to with GRUB_REBOOT +#GRUB_FILE = /boot/grub2/grub.cfg + +# The tool for REBOOT_TYPE = grub2 to set the next reboot kernel +# to boot into (one shot mode). +# (default grub2_reboot) +#GRUB_REBOOT = grub2_reboot +  # The grub title name for the test kernel to boot -# (Only mandatory if REBOOT_TYPE = grub) +# (Only mandatory if REBOOT_TYPE = grub or grub2)  #  # Note, ktest.pl will not update the grub menu.lst, you need to  # manually add an option for the test. ktest.pl will search @@ -343,8 +353,33 @@  # For example, if in the /boot/grub/menu.lst the test kernel title has:  # title Test Kernel  # kernel vmlinuz-test +# +# For grub2, a search of top level "menuentry"s are done. No +# submenu is searched. The menu is found by searching for the +# contents of GRUB_MENU in the line that starts with "menuentry". +# You may want to include the quotes around the option. For example: +# for: menuentry 'Test Kernel' +# do a: GRUB_MENU = 'Test Kernel' +# For customizing, add your entry in /etc/grub.d/40_custom. +#  #GRUB_MENU = Test Kernel +# For REBOOT_TYPE = syslinux, the name of the syslinux executable +# (on the target) to use to set up the next reboot to boot the +# test kernel. +# (default extlinux) +#SYSLINUX = syslinux + +# For REBOOT_TYPE = syslinux, the path that is passed to to the +# syslinux command where syslinux is installed. +# (default /boot/extlinux) +#SYSLINUX_PATH = /boot/syslinux + +# For REBOOT_TYPE = syslinux, the syslinux label that references the +# test kernel in the syslinux config file. +# (default undefined) +#SYSLINUX_LABEL = "test-kernel" +  # A script to reboot the target into the test kernel  # This and SWITCH_TO_TEST are about the same, except  # SWITCH_TO_TEST is run even for REBOOT_TYPE = grub. @@ -497,7 +532,7 @@  #POST_BUILD_DIE = 1  # Way to reboot the box to the test kernel. -# Only valid options so far are "grub" and "script" +# Only valid options so far are "grub", "grub2", "syslinux" and "script"  # (default grub)  # If you specify grub, it will assume grub version 1  # and will search in /boot/grub/menu.lst for the title $GRUB_MENU @@ -505,6 +540,13 @@  # your setup, then specify "script" and have a command or script  # specified in REBOOT_SCRIPT to boot to the target.  # +# For REBOOT_TYPE = grub2, you must define both GRUB_MENU and +# GRUB_FILE. +# +# For REBOOT_TYPE = syslinux, you must define SYSLINUX_LABEL, and +# perhaps modify SYSLINUX (default extlinux) and SYSLINUX_PATH +# (default /boot/extlinux) +#  # The entry in /boot/grub/menu.lst must be entered in manually.  # The test will not modify that file.  #REBOOT_TYPE = grub |