Skip to content

Commit

Permalink
ktest: Ask for the manditory config options instead of just failing
Browse files Browse the repository at this point in the history
In keeping with the notion that all tools should be simple for
all to use. I've changed ktest.pl to ask for mandatory options
instead of just failing. It will append (or create) the options
the user types in, onto the config file.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed Nov 18, 2010
1 parent f1a2785 commit 8d1491b
Showing 1 changed file with 206 additions and 14 deletions.
220 changes: 206 additions & 14 deletions tools/testing/ktest/ktest.pl
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@

my $VERSION = "0.2";

$#ARGV >= 0 || die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";

$| = 1;

my %opt;
Expand Down Expand Up @@ -47,7 +45,9 @@
$default{"REBOOT"} = "ssh \$SSH_USER\@\$MACHINE reboot";
$default{"STOP_AFTER_SUCCESS"} = 10;
$default{"STOP_AFTER_FAILURE"} = 60;
$default{"LOCALVERSION"} = "-test";

my $ktest_config;
my $version;
my $machine;
my $ssh_user;
Expand Down Expand Up @@ -104,6 +104,156 @@
my $iteration = 0;
my $successes = 0;

my %entered_configs;
my %config_help;

$config_help{"MACHINE"} = << "EOF"
The machine hostname that you will test.
EOF
;
$config_help{"SSH_USER"} = << "EOF"
The box is expected to have ssh on normal bootup, provide the user
(most likely root, since you need privileged operations)
EOF
;
$config_help{"BUILD_DIR"} = << "EOF"
The directory that contains the Linux source code (full path).
EOF
;
$config_help{"OUTPUT_DIR"} = << "EOF"
The directory that the objects will be built (full path).
(can not be same as BUILD_DIR)
EOF
;
$config_help{"BUILD_TARGET"} = << "EOF"
The location of the compiled file to copy to the target.
(relative to OUTPUT_DIR)
EOF
;
$config_help{"TARGET_IMAGE"} = << "EOF"
The place to put your image on the test machine.
EOF
;
$config_help{"POWER_CYCLE"} = << "EOF"
A script or command to reboot the box.
Here is a digital loggers power switch example
POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
Here is an example to reboot a virtual box on the current host
with the name "Guest".
POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
EOF
;
$config_help{"CONSOLE"} = << "EOF"
The script or command that reads the console
If you use ttywatch server, something like the following would work.
CONSOLE = nc -d localhost 3001
For a virtual machine with guest name "Guest".
CONSOLE = virsh console Guest
EOF
;
$config_help{"LOCALVERSION"} = << "EOF"
Required version ending to differentiate the test
from other linux builds on the system.
EOF
;
$config_help{"REBOOT_TYPE"} = << "EOF"
Way to reboot the box to the test kernel.
Only valid options so far are "grub" 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
and select that target to reboot to the kernel. If this is not
your setup, then specify "script" and have a command or script
specified in REBOOT_SCRIPT to boot to the target.
The entry in /boot/grub/menu.lst must be entered in manually.
The test will not modify that file.
EOF
;
$config_help{"GRUB_MENU"} = << "EOF"
The grub title name for the test kernel to boot
(Only mandatory if REBOOT_TYPE = grub)
Note, ktest.pl will not update the grub menu.lst, you need to
manually add an option for the test. ktest.pl will search
the grub menu.lst for this option to find what kernel to
reboot into.
For example, if in the /boot/grub/menu.lst the test kernel title has:
title Test Kernel
kernel vmlinuz-test
GRUB_MENU = Test Kernel
EOF
;
$config_help{"REBOOT_SCRIPT"} = << "EOF"
A script to reboot the target into the test kernel
(Only mandatory if REBOOT_TYPE = script)
EOF
;


sub get_ktest_config {
my ($config) = @_;

return if (defined($opt{$config}));

if (defined($config_help{$config})) {
print "\n";
print $config_help{$config};
}

for (;;) {
print "$config = ";
if (defined($default{$config})) {
print "\[$default{$config}\] ";
}
$entered_configs{$config} = <STDIN>;
$entered_configs{$config} =~ s/^\s*(.*\S)\s*$/$1/;
if ($entered_configs{$config} =~ /^\s*$/) {
if ($default{$config}) {
$entered_configs{$config} = $default{$config};
} else {
print "Your answer can not be blank\n";
next;
}
}
last;
}
}

sub get_ktest_configs {
get_ktest_config("MACHINE");
get_ktest_config("SSH_USER");
get_ktest_config("BUILD_DIR");
get_ktest_config("OUTPUT_DIR");
get_ktest_config("BUILD_TARGET");
get_ktest_config("TARGET_IMAGE");
get_ktest_config("POWER_CYCLE");
get_ktest_config("CONSOLE");
get_ktest_config("LOCALVERSION");

my $rtype = $opt{"REBOOT_TYPE"};

if (!defined($rtype)) {
if (!defined($opt{"GRUB_MENU"})) {
get_ktest_config("REBOOT_TYPE");
$rtype = $entered_configs{"REBOOT_TYPE"};
} else {
$rtype = "grub";
}
}

if ($rtype eq "grub") {
get_ktest_config("GRUB_MENU");
} else {
get_ktest_config("REBOOT_SCRIPT");
}
}

sub set_value {
my ($lvalue, $rvalue) = @_;

Expand Down Expand Up @@ -241,6 +391,9 @@ sub read_config {
$opt{"NUM_TESTS"} = $test_num;
}

# make sure we have all mandatory configs
get_ktest_configs;

# set any defaults

foreach my $default (keys %default) {
Expand Down Expand Up @@ -1612,18 +1765,57 @@ sub patchcheck {
return 1;
}

read_config $ARGV[0];

# mandatory configs
die "MACHINE not defined\n" if (!defined($opt{"MACHINE"}));
die "SSH_USER not defined\n" if (!defined($opt{"SSH_USER"}));
die "BUILD_DIR not defined\n" if (!defined($opt{"BUILD_DIR"}));
die "OUTPUT_DIR not defined\n" if (!defined($opt{"OUTPUT_DIR"}));
die "BUILD_TARGET not defined\n" if (!defined($opt{"BUILD_TARGET"}));
die "TARGET_IMAGE not defined\n" if (!defined($opt{"TARGET_IMAGE"}));
die "POWER_CYCLE not defined\n" if (!defined($opt{"POWER_CYCLE"}));
die "CONSOLE not defined\n" if (!defined($opt{"CONSOLE"}));
die "LOCALVERSION not defined\n" if (!defined($opt{"LOCALVERSION"}));
$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";

if ($#ARGV == 0) {
$ktest_config = $ARGV[0];
if (! -f $ktest_config) {
print "$ktest_config does not exist.\n";
my $ans;
for (;;) {
print "Create it? [Y/n] ";
$ans = <STDIN>;
chomp $ans;
if ($ans =~ /^\s*$/) {
$ans = "y";
}
last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
print "Please answer either 'y' or 'n'.\n";
}
if ($ans !~ /^y$/i) {
exit 0;
}
}
} else {
$ktest_config = "ktest.conf";
}

if (! -f $ktest_config) {
open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
print OUT << "EOF"
# Generated by ktest.pl
#
# Define each test with TEST_START
# The config options below it will override the defaults
TEST_START
DEFAULTS
EOF
;
close(OUT);
}
read_config $ktest_config;

# Append any configs entered in manually to the config file.
my @new_configs = keys %entered_configs;
if ($#new_configs >= 0) {
print "\nAppending entered in configs to $ktest_config\n";
open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
foreach my $config (@new_configs) {
print OUT "$config = $entered_configs{$config}\n";
$opt{$config} = $entered_configs{$config};
}
}

if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
unlink $opt{"LOG_FILE"};
Expand Down

0 comments on commit 8d1491b

Please sign in to comment.