nova: support to run script automatically with AMT

This enables us to use the run scripts applied to a native machine equipped
with Intel's AMT. If the environment variables are correctly set up, the remote
test machine is reseted via 'amttool', then via 'amtterm' the serial output
is collected and the normal run script matching pattern for success/failure of
the run script are applied.

'amttool' and 'amtterm' are part of the package called 'amtterm' shipped with
the Linux distributions like Ubuntu, Debian and lot more.

Following environment variables are required, to run the run scripts with a
native AMT test machine:

PXE_TFTP_DIR_BASE   - absolute path of TFTP directory
PXE_TFTP_DIR_OFFSET - relative path to PXE_TFTP_DIR_BASE where the config file
                      will be generated - named 'config-00-00-00-00-00-00'

AMT_TEST_MACHINE_IP  - TCP/IP address of target AMT test machine
AMT_TEST_MACHINE_PWD - password of target AMT test machine

Issue #679
This commit is contained in:
Alexander Boettcher 2013-02-28 16:13:40 +01:00 committed by Norman Feske
parent a875b3ea11
commit 38b2a3dbb4
1 changed files with 57 additions and 1 deletions

View File

@ -96,9 +96,65 @@ proc build_boot_image {binaries} {
if {$binary != "core"} {
puts $fh " load /genode/$binary" } }
close $fh
#
# Generate pulsar config file pointing to the config file above.
#
if {[info exists ::env(PXE_TFTP_DIR_BASE)] && [info exists ::env(PXE_TFTP_DIR_OFFSET)]} {
set len [string length $::env(PXE_TFTP_DIR_BASE)]
set tmp [string range [pwd] 0 $len-1]
# if PXE_TFTP_DIR_BASE is part of pwd (autopilot) we don't need DIR_OFFSET
if ([string match $tmp $::env(PXE_TFTP_DIR_BASE)]) {
set tftp_local_offset [string range [pwd] $len [string length [pwd]]]
} else {
set tftp_local_offset $::env(PXE_TFTP_DIR_OFFSET)
}
set fh [open "$::env(PXE_TFTP_DIR_BASE)$::env(PXE_TFTP_DIR_OFFSET)/config-00-00-00-00-00-00" "WRONLY CREAT TRUNC"]
puts $fh " root $tftp_local_offset/[run_dir]"
puts $fh " config config-52-54-00-12-34-56"
close $fh
}
}
proc run_genode_until {{wait_for_re forever} {timeout_value 0}} {
spawn_qemu $wait_for_re $timeout_value }
# run qemu if no AMT information are found
if {![info exists ::env(AMT_TEST_MACHINE_IP)] ||
![info exists ::env(AMT_TEST_MACHINE_PWD)] } {
spawn_qemu $wait_for_re $timeout_value;
return
}
#
# amttool expects in the environment variable AMT_PASSWORD the password
#
set ::env(AMT_PASSWORD) $::env(AMT_TEST_MACHINE_PWD)
#
# reset the box
#
spawn amttool $::env(AMT_TEST_MACHINE_IP) reset
set timeout 10
expect {
"host" { send "y\r" }
eof { puts stderr "Error: amttool died unexpectedly"; exit -4 }
timeout { puts stderr "Error: amttool timed out"; exit -5 }
}
sleep 5
#
# grab output
#
set amtterm "amtterm -u admin -p $::env(AMT_TEST_MACHINE_PWD) -v $::env(AMT_TEST_MACHINE_IP)"
set timeout [expr $timeout_value + 30]
set pid [eval "spawn $amtterm"]
if {$wait_for_re == "forever"} { interact $pid }
expect {
-re $wait_for_re { }
eof { puts stderr "Error: amtterm died unexpectedly"; exit -3 }
timeout { puts stderr "Error: Test execution timed out"; exit -2 }
}
global output
set output $expect_out(buffer)
}