Updates to ktest.pl

- Handle meta data in GRUB_MENU
 
  - Add variable to cusomize what return value the reboot code should return.
 
  - Add support for grub2bls boot loader
 
  - Show name and test iteration number in error message sent in mail
 
  - Minor fixes and clean ups
 -----BEGIN PGP SIGNATURE-----
 
 iIoEABYIADIWIQRRSw7ePDh/lE+zeZMp5XQQmuv6qgUCXNxRZxQccm9zdGVkdEBn
 b29kbWlzLm9yZwAKCRAp5XQQmuv6qrVCAP4rgnMgMsPOt0cMtKty1Z3uA6njfrZc
 UU1gNeHEvKr1MQEAhYy4N5FCigBygALEczmUIYwrzVq3luNPTwgUeUIH3AY=
 =BTC7
 -----END PGP SIGNATURE-----

Merge tag 'ktest-v5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest

Pull more ktest updates from Steven Rostedt:

 - Add support for grub2bls boot loader

 - Show name and test iteration number in error message sent in mail

 - Minor fixes and clean ups

* tag 'ktest-v5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest:
  ktest: update sample.conf for grub2bls
  ktest: remove get_grub2_index
  ktest: pass KERNEL_VERSION to POST_KTEST
  ktest: introduce grub2bls REBOOT_TYPE option
  ktest: cleanup get_grub_index
  ktest: introduce _get_grub_index
This commit is contained in:
Linus Torvalds 2019-05-15 16:46:32 -07:00
commit b06ed1e7a2
2 changed files with 63 additions and 48 deletions

View File

@ -64,6 +64,7 @@ my %default = (
"STOP_TEST_AFTER" => 600,
"MAX_MONITOR_WAIT" => 1800,
"GRUB_REBOOT" => "grub2-reboot",
"GRUB_BLS_GET" => "grubby --info=ALL",
"SYSLINUX" => "extlinux",
"SYSLINUX_PATH" => "/boot/extlinux",
"CONNECT_TIMEOUT" => 25,
@ -125,6 +126,7 @@ my $last_grub_menu;
my $grub_file;
my $grub_number;
my $grub_reboot;
my $grub_bls_get;
my $syslinux;
my $syslinux_path;
my $syslinux_label;
@ -295,6 +297,7 @@ my %option_map = (
"GRUB_MENU" => \$grub_menu,
"GRUB_FILE" => \$grub_file,
"GRUB_REBOOT" => \$grub_reboot,
"GRUB_BLS_GET" => \$grub_bls_get,
"SYSLINUX" => \$syslinux,
"SYSLINUX_PATH" => \$syslinux_path,
"SYSLINUX_LABEL" => \$syslinux_label,
@ -440,7 +443,7 @@ EOF
;
$config_help{"REBOOT_TYPE"} = << "EOF"
Way to reboot the box to the test kernel.
Only valid options so far are "grub", "grub2", "syslinux", and "script".
Only valid options so far are "grub", "grub2", "grub2bls", "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
@ -454,6 +457,8 @@ $config_help{"REBOOT_TYPE"} = << "EOF"
If you specify grub2, then you also need to specify both \$GRUB_MENU
and \$GRUB_FILE.
If you specify grub2bls, then you also need to specify \$GRUB_MENU.
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
@ -479,6 +484,9 @@ $config_help{"GRUB_MENU"} = << "EOF"
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.
For grub2bls, \$GRUB_MENU is searched on the result of \$GRUB_BLS_GET
command for the lines that begin with "title".
EOF
;
$config_help{"GRUB_FILE"} = << "EOF"
@ -695,7 +703,7 @@ sub get_mandatory_configs {
}
}
if ($rtype eq "grub") {
if (($rtype eq "grub") or ($rtype eq "grub2bls")) {
get_mandatory_config("GRUB_MENU");
}
@ -1871,36 +1879,37 @@ sub run_scp_mod {
return run_scp($src, $dst, $cp_scp);
}
sub get_grub2_index {
sub _get_grub_index {
my ($command, $target, $skip) = @_;
return if (defined($grub_number) && defined($last_grub_menu) &&
$last_grub_menu eq $grub_menu && defined($last_machine) &&
$last_machine eq $machine);
doprint "Find grub2 menu ... ";
doprint "Find $reboot_type menu ... ";
$grub_number = -1;
my $ssh_grub = $ssh_exec;
$ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
$ssh_grub =~ s,\$SSH_COMMAND,$command,g;
open(IN, "$ssh_grub |")
or dodie "unable to get $grub_file";
or dodie "unable to execute $command";
my $found = 0;
my $grub_menu_qt = quotemeta($grub_menu);
while (<IN>) {
if (/^menuentry.*$grub_menu_qt/) {
if (/$target/) {
$grub_number++;
$found = 1;
last;
} elsif (/^menuentry\s|^submenu\s/) {
} elsif (/$skip/) {
$grub_number++;
}
}
close(IN);
dodie "Could not find '$grub_menu' in $grub_file on $machine"
dodie "Could not find '$grub_menu' through $command on $machine"
if (!$found);
doprint "$grub_number\n";
$last_grub_menu = $grub_menu;
@ -1909,46 +1918,34 @@ sub get_grub2_index {
sub get_grub_index {
if ($reboot_type eq "grub2") {
get_grub2_index;
my $command;
my $target;
my $skip;
my $grub_menu_qt;
if ($reboot_type !~ /^grub/) {
return;
}
if ($reboot_type ne "grub") {
$grub_menu_qt = quotemeta($grub_menu);
if ($reboot_type eq "grub") {
$command = "cat /boot/grub/menu.lst";
$target = '^\s*title\s+' . $grub_menu_qt . '\s*$';
$skip = '^\s*title\s';
} elsif ($reboot_type eq "grub2") {
$command = "cat $grub_file";
$target = '^menuentry.*' . $grub_menu_qt;
$skip = '^menuentry\s|^submenu\s';
} elsif ($reboot_type eq "grub2bls") {
$command = $grub_bls_get;
$target = '^title=.*' . $grub_menu_qt;
$skip = '^title=';
} else {
return;
}
return if (defined($grub_number) && defined($last_grub_menu) &&
$last_grub_menu eq $grub_menu && defined($last_machine) &&
$last_machine eq $machine);
doprint "Find grub menu ... ";
$grub_number = -1;
my $ssh_grub = $ssh_exec;
$ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
open(IN, "$ssh_grub |")
or dodie "unable to get menu.lst";
my $found = 0;
my $grub_menu_qt = quotemeta($grub_menu);
while (<IN>) {
if (/^\s*title\s+$grub_menu_qt\s*$/) {
$grub_number++;
$found = 1;
last;
} elsif (/^\s*title\s/) {
$grub_number++;
}
}
close(IN);
dodie "Could not find '$grub_menu' in /boot/grub/menu on $machine"
if (!$found);
doprint "$grub_number\n";
$last_grub_menu = $grub_menu;
$last_machine = $machine;
_get_grub_index($command, $target, $skip);
}
sub wait_for_input
@ -4303,7 +4300,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
if (!$buildonly) {
$target = "$ssh_user\@$machine";
if ($reboot_type eq "grub") {
if (($reboot_type eq "grub") or ($reboot_type eq "grub2bls")) {
dodie "GRUB_MENU not defined" if (!defined($grub_menu));
} elsif ($reboot_type eq "grub2") {
dodie "GRUB_MENU not defined" if (!defined($grub_menu));
@ -4423,7 +4420,9 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
}
if (defined($final_post_ktest)) {
run_command $final_post_ktest;
my $cp_final_post_ktest = eval_kernel_version $final_post_ktest;
run_command $cp_final_post_ktest;
}
if ($opt{"POWEROFF_ON_SUCCESS"}) {

View File

@ -349,13 +349,13 @@
# 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
# The tool for REBOOT_TYPE = grub2 or grub2bls 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 or grub2)
# (Only mandatory if REBOOT_TYPE = grub or grub2 or grub2bls)
#
# Note, ktest.pl will not update the grub menu.lst, you need to
# manually add an option for the test. ktest.pl will search
@ -374,6 +374,10 @@
# do a: GRUB_MENU = 'Test Kernel'
# For customizing, add your entry in /etc/grub.d/40_custom.
#
# For grub2bls, a search of "title"s are done. The menu is found
# by searching for the contents of GRUB_MENU in the line that starts
# with "title".
#
#GRUB_MENU = Test Kernel
# For REBOOT_TYPE = syslinux, the name of the syslinux executable
@ -479,6 +483,11 @@
# default (undefined)
#POST_KTEST = ${SSH} ~/dismantle_test
# If you want to remove the kernel entry in Boot Loader Specification (BLS)
# environment, use kernel-install command.
# Here's the example:
#POST_KTEST = ssh root@Test "/usr/bin/kernel-install remove $KERNEL_VERSION"
# The default test type (default test)
# The test types may be:
# build - only build the kernel, do nothing else
@ -530,6 +539,11 @@
# or on some systems:
#POST_INSTALL = ssh user@target /sbin/dracut -f /boot/initramfs-test.img $KERNEL_VERSION
# If you want to add the kernel entry in Boot Loader Specification (BLS)
# environment, use kernel-install command.
# Here's the example:
#POST_INSTALL = ssh root@Test "/usr/bin/kernel-install add $KERNEL_VERSION /boot/vmlinuz-$KERNEL_VERSION"
# If for some reason you just want to boot the kernel and you do not
# want the test to install anything new. For example, you may just want
# to boot test the same kernel over and over and do not want to go through
@ -593,6 +607,8 @@
# For REBOOT_TYPE = grub2, you must define both GRUB_MENU and
# GRUB_FILE.
#
# For REBOOT_TYPE = grub2bls, you must define GRUB_MENU.
#
# For REBOOT_TYPE = syslinux, you must define SYSLINUX_LABEL, and
# perhaps modify SYSLINUX (default extlinux) and SYSLINUX_PATH
# (default /boot/extlinux)