This patch fixes the creation of VM images. Previously, FC12 images
were
created but the files necessary for FC12 image creation are no longer
available in the public repositories. This patch now switches it to
create FC14 images. To get such a new image one may want to remove all
content in /var/cache/libvirt-tck. I takes a long time for the image to
install, though.
We can probably do a little refactoring to use the libguestfs
appliance image soon, which will make things simpler...
The new FC14 image takes a lot longer to boot. Rather than waiting a
fixed timeout during which the VM presumably has booted it is now
waiting for the VM to become pingable and then starts the actual tests.
Also, the name of the DHCP lease file used by dnsmasq has changed.
Rather than hardcoding its name, try to pick it up from the running
dnsmasq process's parameters. Fall back to the old name if the name of
the leasefile could be determined via 'ps aux'.
Signed-off-by: Stefan Berger <stefanb(a)linux.vnet.ibm.com>
---
conf/default.cfg | 12 ++--
conf/ks.cfg | 3 -
lib/Sys/Virt/TCK/NetworkHelpers.pm | 84 +++++++++++++++++++++++++++---
scripts/nwfilter/090-install-image.t | 11 ++-
scripts/nwfilter/100-ping-still-working.t | 5 -
scripts/nwfilter/210-no-mac-spoofing.t | 5 -
scripts/nwfilter/220-no-ip-spoofing.t | 5 -
scripts/nwfilter/230-no-mac-broadcast.t | 5 -
scripts/nwfilter/240-no-arp-spoofing.t | 5 -
scripts/nwfilter/300-vsitype.t | 3 -
10 files changed, 104 insertions(+), 34 deletions(-)
Index: libvirt-tck/lib/Sys/Virt/TCK/NetworkHelpers.pm
===================================================================
--- libvirt-tck.orig/lib/Sys/Virt/TCK/NetworkHelpers.pm
+++ libvirt-tck/lib/Sys/Virt/TCK/NetworkHelpers.pm
@@ -11,12 +11,76 @@ sub get_first_macaddress {
sub get_ip_from_leases{
my $mac = shift;
- my $tmp = `grep $mac /var/lib/dnsmasq/dnsmasq.leases`;
+ my $leasefile = `ps x | sed -n
"s/.*dnsmasq.*default.*dhcp-leasefile=\\([/.[:alnum:]]*\\).*/\\1/p"`;
+ if ( $leasefile eq "" ) {
+ $leasefile = "/var/lib/dnsmasq/dnsmasq.leases";
+ }
+ diag "leasefile is ${leasefile}";
+ my $tmp = `grep $mac $leasefile`;
my @fields = split(/ /, $tmp);
my $ip = $fields[2];
return $ip;
}
+sub wait_for_vm_if_up {
+ my $mac = shift;
+ my $timeout = shift;
+ my $ipaddr = "";
+ my $tmp = "";
+
+ while ( $timeout > 0 ) {
+ $ipaddr = get_ip_from_leases($mac);
+ if ( $ipaddr != "" ) {
+ last;
+ }
+ sleep(1);
+ $timeout -= 1;
+ diag "... waiting for the VM's DHCP lease to show up..."
+ }
+
+ if ( $ipaddr != "" ) {
+ while ( $timeout > 0 ) {
+ $tmp = `ping $ipaddr -c 1 -W 2`;
+ if ( $tmp =~ "100% packet loss" ) {
+ $timeout -= 2;
+ } else {
+ sleep(5);
+ return $ipaddr;
+ }
+ diag "... waiting for the VM to become pingable..."
+ }
+ }
+ return 0;
+}
+
+sub wait_for_vm_if_down {
+ my $mac = shift;
+ my $timeout = shift;
+ my $ipaddr = "";
+ my $tmp = "";
+
+ $ipaddr = get_ip_from_leases($mac);
+ if ( $ipaddr == "" ) {
+ diag "Could not get the IP address of the VM.";
+ return 0;
+ }
+
+ while ( $timeout > 0 ) {
+ $tmp = `ping $ipaddr -c 1 -W 2`;
+ if ( $tmp =~ "100% packet loss" ) {
+ diag "VM is off the network now.";
+ sleep(5);
+ return 1;
+ }
+ $timeout -= 2;
+ sleep(2);
+ diag "... waiting for the VM to be off the network ($timeout) ... "
+ }
+ return 0;
+}
+
+
+
sub build_cdrom_ks_image {
my $tck = shift;
@@ -139,11 +203,19 @@ sub prepare_test_disk_and_vm{
my $dom = $conn->define_domain($guest->as_xml);
diag "Starting installation domain";
$dom->create;
- diag "wait for installation to finish .. ";
- while($dom->is_active()) {
- sleep(10);
- diag ".. to view progress connect to virtual machine ${domain_name} ..
";
- }
+ # Wait for the interface to come up; this may take a good while
+ my $guestip = wait_for_vm_if_up(get_first_macaddress($dom), 600);
+ if ( $guestip eq "" ) {
+ diag "Installation domain did not show an IP address. Destroying VM.";
+ $dom->destroy();
+ } else {
+ diag "IP address of installating VM is $guestip";
+ # wait until the installation is done -- may take a long time
+ if (!wait_for_vm_if_down(get_first_macaddress($dom), 7200)) {
+ diag "Installation did not complete in time. Destroying VM.";
+ $dom->destroy();
+ }
+ }
# cleanup install domain
$dom->undefine;
$dom = undef;
Index: libvirt-tck/conf/default.cfg
===================================================================
--- libvirt-tck.orig/conf/default.cfg
+++ libvirt-tck/conf/default.cfg
@@ -52,25 +52,25 @@ ks = /etc/libvirt-tck/ks.cfg
# empty sparse root FS will be created
#
kernels = (
- # Fedora 11 i686 PAE has pv_ops, so one kernel can do both Xen and KVM guests here
+ # Fedora 14 i686 PAE has pv_ops, so one kernel can do both Xen and KVM guests here
{
arch = i686
ostype = (
hvm
xen
)
- kernel =
http://download.fedora.redhat.com/pub/fedora/linux/releases/11/Fedora/i38...
- initrd =
http://download.fedora.redhat.com/pub/fedora/linux/releases/11/Fedora/i38...
+ kernel =
http://download.fedora.redhat.com/pub/fedora/linux/releases/14/Fedora/i38...
+ initrd =
http://download.fedora.redhat.com/pub/fedora/linux/releases/14/Fedora/i38...
}
- # Fedora 11 x86_64 has pv_ops, so one kernel can do both Xen and KVM guests here
+ # Fedora 14 x86_64 has pv_ops, so one kernel can do both Xen and KVM guests here
{
arch = x86_64
ostype = (
hvm
xen
)
- kernel =
http://download.fedora.redhat.com/pub/fedora/linux/releases/11/Fedora/x86...
- initrd =
http://download.fedora.redhat.com/pub/fedora/linux/releases/11/Fedora/x86...
+ kernel =
http://download.fedora.redhat.com/pub/fedora/linux/releases/14/Fedora/x86...
+ initrd =
http://download.fedora.redhat.com/pub/fedora/linux/releases/14/Fedora/x86...
}
# User mode linux i686 needs custom kernel + root filesystem
{
Index: libvirt-tck/conf/ks.cfg
===================================================================
--- libvirt-tck.orig/conf/ks.cfg
+++ libvirt-tck/conf/ks.cfg
@@ -1,6 +1,6 @@
install
text
-url
--url=http://ftp-stud.hs-esslingen.de/Mirrors/fedora.redhat.com/linux/releases/12/Fedora/i386/os/
+url
--url=http://download.fedora.redhat.com/pub/fedora/linux/releases/14/Fedora/i386/os/
lang en_US.UTF-8
keyboard de-latin1-nodeadkeys
network --device eth0 --bootproto dhcp
@@ -27,3 +27,4 @@ poweroff
@base
@core
@hardware-support
+%end
Index: libvirt-tck/scripts/nwfilter/100-ping-still-working.t
===================================================================
--- libvirt-tck.orig/scripts/nwfilter/100-ping-still-working.t
+++ libvirt-tck/scripts/nwfilter/100-ping-still-working.t
@@ -46,7 +46,7 @@ END {
# create first domain and start it
diag "Trying domain lookup by name";
my $dom1;
-my $dom_name ="tckf12nwtest";
+my $dom_name ="tck-fedora-nwtest";
$dom1 = prepare_test_disk_and_vm($tck, $conn, $dom_name);
$dom1->create();
@@ -63,8 +63,7 @@ ok($dom1->get_id() > 0, "running domain
my $mac1 = get_first_macaddress($dom1);
diag "mac is $mac1";
-sleep(30);
-my $guestip1 = get_ip_from_leases($mac1);
+my $guestip1 = wait_for_vm_if_up($mac1, 60);
diag "ip is $guestip1";
# check ebtables entry
Index: libvirt-tck/scripts/nwfilter/210-no-mac-spoofing.t
===================================================================
--- libvirt-tck.orig/scripts/nwfilter/210-no-mac-spoofing.t
+++ libvirt-tck/scripts/nwfilter/210-no-mac-spoofing.t
@@ -44,7 +44,7 @@ END {
# create first domain and start it
-my $dom_name ="tckf12nwtest";
+my $dom_name ="tck-fedora-nwtest";
my $dom1;
$dom1 = prepare_test_disk_and_vm($tck, $conn, $dom_name);
@@ -58,8 +58,7 @@ diag $xml;
my $mac1 = get_first_macaddress($dom1);
diag "mac is $mac1";
-sleep(30);
-my $guestip1 = get_ip_from_leases($mac1);
+my $guestip1 = wait_for_vm_if_up($mac1, 60);
diag "ip is $guestip1";
# check ebtables entry
Index: libvirt-tck/scripts/nwfilter/220-no-ip-spoofing.t
===================================================================
--- libvirt-tck.orig/scripts/nwfilter/220-no-ip-spoofing.t
+++ libvirt-tck/scripts/nwfilter/220-no-ip-spoofing.t
@@ -44,7 +44,7 @@ END {
# looking up domain
my $dom1;
-my $dom_name ="tckf12nwtest";
+my $dom_name ="tck-fedora-nwtest";
$dom1 = prepare_test_disk_and_vm($tck, $conn, $dom_name);
$dom1->create();
@@ -55,8 +55,7 @@ diag $xml;
my $mac1 = get_first_macaddress($dom1);
diag "mac is $mac1";
-sleep(30);
-my $guestip1 = get_ip_from_leases($mac1);
+my $guestip1 = wait_for_vm_if_up($mac1, 60);
diag "ip is $guestip1";
# check ebtables entry
Index: libvirt-tck/scripts/nwfilter/230-no-mac-broadcast.t
===================================================================
--- libvirt-tck.orig/scripts/nwfilter/230-no-mac-broadcast.t
+++ libvirt-tck/scripts/nwfilter/230-no-mac-broadcast.t
@@ -43,7 +43,7 @@ END {
# create first domain and start it
my $dom1;
-my $dom_name ="tckf12nwtest";
+my $dom_name ="tck-fedora-nwtest";
$dom1 = prepare_test_disk_and_vm($tck, $conn, $dom_name);
$dom1->create();
@@ -54,8 +54,7 @@ diag $xml;
my $mac1 = get_first_macaddress($dom1);
diag "mac is $mac1";
-sleep(30);
-my $guestip1 = get_ip_from_leases($mac1);
+my $guestip1 = wait_for_vm_if_up($mac1, 60);
diag "ip is $guestip1";
# check ebtables entry
Index: libvirt-tck/scripts/nwfilter/240-no-arp-spoofing.t
===================================================================
--- libvirt-tck.orig/scripts/nwfilter/240-no-arp-spoofing.t
+++ libvirt-tck/scripts/nwfilter/240-no-arp-spoofing.t
@@ -45,7 +45,7 @@ END {
# creating domain
my $dom1;
-my $dom_name ="tckf12nwtest";
+my $dom_name ="tck-fedora-nwtest";
$dom1 = prepare_test_disk_and_vm($tck, $conn, $dom_name);
$dom1->create();
@@ -56,8 +56,7 @@ diag $xml;
my $mac1 = get_first_macaddress($dom1);
diag "mac is $mac1";
-sleep(30);
-my $guestip1 = get_ip_from_leases($mac1);
+my $guestip1 = wait_for_vm_if_up($mac1, 60);
diag "ip is $guestip1";
# check ebtables entry
Index: libvirt-tck/scripts/nwfilter/090-install-image.t
===================================================================
--- libvirt-tck.orig/scripts/nwfilter/090-install-image.t
+++ libvirt-tck/scripts/nwfilter/090-install-image.t
@@ -19,7 +19,7 @@ network/000-install-image.t - install ne
=head1 DESCRIPTION
-The test case creates and install a 2GB fedora virtual
+The test case creates and install a 2GB fedora virtual
disk via kickstart file from the network.
=cut
@@ -41,15 +41,16 @@ END { $tck->cleanup if $tck; }
use File::Spec::Functions qw(catfile catdir rootdir);
# variables which may need to be adapted
-my $dom_name ="tckf12nwtest";
+my $dom_name ="tck-fedora-nwtest";
my $testdom = prepare_test_disk_and_vm($tck, $conn, $dom_name);
$testdom->create();
ok($testdom->get_id() > 0, "running domain has an ID > 0");
-sleep(20);
+
+my $mac1 = get_first_macaddress($testdom);
+diag "mac is $mac1";
+my $guestip1 = wait_for_vm_if_up($mac1, 60);
shutdown_vm_gracefully($testdom);
exit 0;
-
-
Index: libvirt-tck/scripts/nwfilter/300-vsitype.t
===================================================================
--- libvirt-tck.orig/scripts/nwfilter/300-vsitype.t
+++ libvirt-tck/scripts/nwfilter/300-vsitype.t
@@ -43,6 +43,7 @@ END {
SKIP: {
skip "lldptool not present", 3 unless -e
"/usr/sbin/lldptool";
+ skip "eth2 not available", 3 unless `ifconfig eth2` =~ "Link
encap:";
# creating domain
my $dom1;
@@ -58,7 +59,7 @@ SKIP: {
my $mac1 = get_first_macaddress($dom1);
diag "mac is $mac1";
- sleep(30);
+ wait_for_vm_if_up($mac1, 60);
# check vsi information
diag "Verifying VSI information using lldptool";