summary refs log tree commit diff
path: root/tools/testing
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-11-02 14:58:38 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-11-18 11:23:09 -0500
commit576f627c817dff0b7081374287a77247325b9cc0 (patch)
tree9c1c4a1a00ce62a4781d219c0d0561b80576e367 /tools/testing
parent8b37ca8cac46b2c108386e3901cc8611dc81c7aa (diff)
downloadlinux-576f627c817dff0b7081374287a77247325b9cc0.tar.gz
ktest: Add poweroff after halt and powercycle after reboot
Added the options POWEROFF_AFTER_HALT to handle boxes that do not
really shut off after a halt is called.

Added POWERCYCLE_AFTER_REBOOT to force a power cycle for boxes that
don't reboot but get stuck during the reboot.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'tools/testing')
-rw-r--r--tools/testing/ktest/ktest.pl63
-rw-r--r--tools/testing/ktest/sample.conf18
2 files changed, 66 insertions, 15 deletions
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl
index 687a85475af5..ef978171ecb7 100644
--- a/tools/testing/ktest/ktest.pl
+++ b/tools/testing/ktest/ktest.pl
@@ -53,6 +53,8 @@ my $power_cycle;
 my $reboot_on_error;
 my $poweroff_on_error;
 my $die_on_failure;
+my $powercycle_after_reboot;
+my $poweroff_after_halt;
 my $power_off;
 my $grub_menu;
 my $grub_number;
@@ -83,6 +85,7 @@ my $success_line;
 my $build_target;
 my $target_image;
 my $localversion;
+my $iteration = 0;
 
 sub read_config {
     my ($config) = @_;
@@ -133,16 +136,32 @@ sub run_command;
 
 sub reboot {
     # try to reboot normally
-    if (!run_command "ssh $target reboot") {
+    if (run_command "ssh $target reboot") {
+	if (defined($powercycle_after_reboot)) {
+	    sleep $powercycle_after_reboot;
+	    run_command "$power_cycle";
+	}
+    } else {
 	# nope? power cycle it.
 	run_command "$power_cycle";
     }
 }
 
+sub do_not_reboot {
+    my $i = $iteration;
+
+    return $test_type eq "build" ||
+	($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
+	($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
+}
+
 sub dodie {
     doprint "CRITICAL FAILURE... ", @_, "\n";
 
-    if ($reboot_on_error && $test_type ne "build") {
+    my $i = $iteration;
+
+    if ($reboot_on_error && !do_not_reboot) {
+
 	doprint "REBOOTING\n";
 	reboot;
 
@@ -151,7 +170,7 @@ sub dodie {
 	`$power_off`;
     }
 
-    die @_;
+    die @_, "\n";
 }
 
 sub open_console {
@@ -163,9 +182,9 @@ sub open_console {
 	dodie "Can't open console $console";
 
     $flags = fcntl($fp, F_GETFL, 0) or
-	dodie "Can't get flags for the socket: $!\n";
+	dodie "Can't get flags for the socket: $!";
     $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
-	dodie "Can't set flags for the socket: $!\n";
+	dodie "Can't set flags for the socket: $!";
 
     return $pid;
 }
@@ -221,8 +240,10 @@ sub fail {
 
 	doprint "FAILED\n";
 
+	my $i = $iteration;
+
 	# no need to reboot for just building.
-	if ($test_type ne "build") {
+	if (!do_not_reboot) {
 	    doprint "REBOOTING\n";
 	    reboot;
 	    start_monitor;
@@ -230,7 +251,11 @@ sub fail {
 	    end_monitor;
 	}
 
+	doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
+	doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
 	doprint "**** Failed: ", @_, " ****\n";
+	doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
+	doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
 
 	return 1 if (!defined($store_failures));
 
@@ -434,12 +459,12 @@ sub monitor {
 
     if ($bug) {
 	return 0 if ($in_bisect);
-	fail "failed - got a bug report\n" and return 0;
+	fail "failed - got a bug report" and return 0;
     }
 
     if (!$booted) {
 	return 0 if ($in_bisect);
-	fail "failed - never got a boot prompt.\n" and return 0;
+	fail "failed - never got a boot prompt." and return 0;
     }
 
     return 1;
@@ -496,7 +521,8 @@ sub install {
     my $save_env = $ENV{KERNEL_VERSION};
 
     $ENV{KERNEL_VERSION} = $version;
-    run_command "$post_install";
+    run_command "$post_install" or
+	dodie "Failed to run post install";
 
     $ENV{KERNEL_VERSION} = $save_env;
 }
@@ -596,6 +622,11 @@ sub build {
 
 sub halt {
     if (!run_command "ssh $target halt" or defined($power_off)) {
+	if (defined($poweroff_after_halt)) {
+	    sleep $poweroff_after_halt;
+	    run_command "$power_off";
+	}
+    } else {
 	# nope? the zap it!
 	run_command "$power_off";
     }
@@ -610,9 +641,7 @@ sub success {
     doprint     "*******************************************\n";
     doprint     "*******************************************\n";
 
-    if ($i != $opt{"NUM_TESTS"} && $test_type ne "build" &&
-	!($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") &&
-	!($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build")) {
+    if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
 	doprint "Reboot and wait $sleep_time seconds\n";
 	reboot;
 	start_monitor;
@@ -1048,6 +1077,8 @@ sub set_test_option {
 # First we need to do is the builds
 for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
 
+    $iteration = $i;
+
     my $ssh_user = set_test_option("SSH_USER", $i);
     my $makecmd = set_test_option("MAKE_CMD", $i);
 
@@ -1071,6 +1102,8 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
     $poweroff_on_error = set_test_option("POWEROFF_ON_ERROR", $i);
     $die_on_failure = set_test_option("DIE_ON_FAILURE", $i);
     $power_off = set_test_option("POWER_OFF", $i);
+    $powercycle_after_reboot = set_test_option("POWERCYCLE_AFTER_REBOOT", $i);
+    $poweroff_after_halt = set_test_option("POWEROFF_AFTER_HALT", $i);
     $sleep_time = set_test_option("SLEEP_TIME", $i);
     $bisect_sleep_time = set_test_option("BISECT_SLEEP_TIME", $i);
     $store_failures = set_test_option("STORE_FAILURES", $i);
@@ -1096,9 +1129,9 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
     $make = "$makecmd O=$outputdir";
 
     if ($reboot_type eq "grub") {
-	dodie "GRUB_MENU not defined\n" if (!defined($grub_menu));
+	dodie "GRUB_MENU not defined" if (!defined($grub_menu));
     } elsif (!defined($reboot_script)) {
-	dodie "REBOOT_SCRIPT not defined\n"
+	dodie "REBOOT_SCRIPT not defined"
     }
 
     my $run_type = $build_type;
@@ -1167,7 +1200,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
 
 if ($opt{"POWEROFF_ON_SUCCESS"}) {
     halt;
-} elsif ($opt{"REBOOT_ON_SUCCESS"} && $test_type ne "build") {
+} elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot) {
     reboot;
 }
 
diff --git a/tools/testing/ktest/sample.conf b/tools/testing/ktest/sample.conf
index 0115a6762a6d..546014a6bb03 100644
--- a/tools/testing/ktest/sample.conf
+++ b/tools/testing/ktest/sample.conf
@@ -160,6 +160,24 @@
 # (ignored if POWEROFF_ON_SUCCESS is set)
 #REBOOT_ON_SUCCESS = 1
 
+# In case there's isses with rebooting, you can specify this
+# to always powercycle after this amount of time after calling
+# reboot.
+# Note, POWERCYCLE_AFTER_REBOOT = 0 does NOT disable it. It just
+# makes it powercycle immediately after rebooting. Do not define
+# it if you do not want it.
+# (default undefined)
+#POWERCYCLE_AFTER_REBOOT = 5
+
+# In case there's isses with halting, you can specify this
+# to always poweroff after this amount of time after calling
+# halt.
+# Note, POWEROFF_AFTER_HALT = 0 does NOT disable it. It just
+# makes it poweroff immediately after halting. Do not define
+# it if you do not want it.
+# (default undefined)
+#POWEROFF_AFTER_HALT = 20
+
 # Stop testing if a build fails. If set, the script will end if
 # a failure is detected, otherwise it will save off the .config,
 # dmesg and bootlog in a directory called