From b3dbcbe249480f59fde6c118fa161eb6af53664d Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 12 Jan 2011 18:47:23 +0000 Subject: * Use vde_switch instead of QEMU's multicast feature to tie QEMU VMs together into virtual networks. This has several advantages: - It's more secure because the QEMU instances use Unix domain sockets to talk to the switch. - It doesn't depend on the host's network interfaces. (Local multicast fails if there is no default gateway, so for instance it fails if a laptop is not connected to any network.) - VDE devices can be connected together to form arbitrary network topologies. - VDE has a "wirefilter" tool to emulate delays and packet loss, which are useful for network testing. svn path=/nixos/trunk/; revision=25526 --- lib/test-driver/test-driver.pl | 55 ++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 18 deletions(-) (limited to 'lib/test-driver/test-driver.pl') diff --git a/lib/test-driver/test-driver.pl b/lib/test-driver/test-driver.pl index 9f5054f7721..841017ea0a3 100644 --- a/lib/test-driver/test-driver.pl +++ b/lib/test-driver/test-driver.pl @@ -5,6 +5,7 @@ use Machine; use Term::ReadLine; use IO::File; use Logger; +use Cwd; $SIG{PIPE} = 'IGNORE'; # because Unix domain sockets may die unexpectedly @@ -13,6 +14,19 @@ STDERR->autoflush(1); my $log = new Logger; +# Start vde_switch for each network required by the test. +my %vlans; +foreach my $vlan (split / /, $ENV{VLANS} || "") { + next if defined $vlans{$vlan}; + $log->log("starting VDE switch for network $vlan"); + my $socket = Cwd::abs_path "./vde$vlan.ctl"; + system("vde_switch -d -s $socket") == 0 + or die "cannot start vde_switch"; + $ENV{"QEMU_VDE_SOCKET_$vlan"} = $socket; + $vlans{$vlan} = 1; +} + + my %vms; my $context = ""; @@ -83,23 +97,26 @@ sub runTests { # Copy the kernel coverage data for each machine, if the kernel # has been compiled with coverage instrumentation. - foreach my $vm (values %vms) { - my $gcovDir = "/sys/kernel/debug/gcov"; + $log->nest("collecting coverage data", sub { + foreach my $vm (values %vms) { + my $gcovDir = "/sys/kernel/debug/gcov"; - next unless $vm->isUp(); + next unless $vm->isUp(); - my ($status, $out) = $vm->execute("test -e $gcovDir"); - next if $status != 0; + my ($status, $out) = $vm->execute("test -e $gcovDir"); + next if $status != 0; - # Figure out where to put the *.gcda files so that the report - # generator can find the corresponding kernel sources. - my $kernelDir = $vm->mustSucceed("echo \$(dirname \$(readlink -f /var/run/current-system/kernel))/.build/linux-*"); - chomp $kernelDir; - my $coverageDir = "/hostfs" . $vm->stateDir() . "/coverage-data/$kernelDir"; + # Figure out where to put the *.gcda files so that the + # report generator can find the corresponding kernel + # sources. + my $kernelDir = $vm->mustSucceed("echo \$(dirname \$(readlink -f /var/run/current-system/kernel))/.build/linux-*"); + chomp $kernelDir; + my $coverageDir = "/hostfs" . $vm->stateDir() . "/coverage-data/$kernelDir"; - # Copy all the *.gcda files. - $vm->execute("for d in $gcovDir/nix/store/*/.build/linux-*; do for i in \$(cd \$d && find -name '*.gcda'); do echo \$i; mkdir -p $coverageDir/\$(dirname \$i); cp -v \$d/\$i $coverageDir/\$i; done; done"); - } + # Copy all the *.gcda files. + $vm->execute("for d in $gcovDir/nix/store/*/.build/linux-*; do for i in \$(cd \$d && find -name '*.gcda'); do echo \$i; mkdir -p $coverageDir/\$(dirname \$i); cp -v \$d/\$i $coverageDir/\$i; done; done"); + } + }); if ($nrTests != 0) { $log->log("$nrSucceeded out of $nrTests tests succeeded", @@ -118,12 +135,14 @@ sub createDisk { END { - foreach my $vm (values %vms) { - if ($vm->{pid}) { - $log->log("killing " . $vm->{name} . " (pid " . $vm->{pid} . ")"); - kill 9, $vm->{pid}; + $log->nest("cleaning up", sub { + foreach my $vm (values %vms) { + if ($vm->{pid}) { + $log->log("killing " . $vm->{name} . " (pid " . $vm->{pid} . ")"); + kill 9, $vm->{pid}; + } } - } + }); $log->close(); } -- cgit 1.4.1