diff options
| -rw-r--r-- | source4/selftest/config.mk | 6 | ||||
| -rwxr-xr-x | source4/selftest/selftest.pl | 21 | ||||
| -rw-r--r-- | source4/selftest/target/Kvm.pm | 153 | 
3 files changed, 176 insertions, 4 deletions
diff --git a/source4/selftest/config.mk b/source4/selftest/config.mk index 7f8f211588..4e9d31b684 100644 --- a/source4/selftest/config.mk +++ b/source4/selftest/config.mk @@ -10,6 +10,12 @@ SELFTEST = $(LD_LIBPATH_OVERRIDE) $(PERL) $(srcdir)/selftest/selftest.pl --prefi  test:: everything  	$(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate $(TESTS) +kvmtest:: everything +	$(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate --target=kvm --image=$(KVM_IMAGE) + +kvmquicktest:: everything +	$(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate --quick --target=kvm --image=$(KVM_IMAGE) +  testone:: everything  	$(SELFTEST) $(DEFAULT_TEST_OPTIONS) --one $(TESTS) diff --git a/source4/selftest/selftest.pl b/source4/selftest/selftest.pl index aab2ca8f07..c17e790f63 100755 --- a/source4/selftest/selftest.pl +++ b/source4/selftest/selftest.pl @@ -13,7 +13,7 @@ selftest - Samba test runner  selftest --help -selftest [--srcdir=DIR] [--builddir=DIR] [--target=samba4|samba3|win] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--immediate] [--testlist=FILE] [TESTS] +selftest [--srcdir=DIR] [--builddir=DIR] [--target=samba4|samba3|win|kvm] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--immediate] [--testlist=FILE] [TESTS]  =head1 DESCRIPTION @@ -43,7 +43,7 @@ Change directory to run tests in. Default is 'st'.  Show errors as soon as they happen rather than at the end of the test run. -=item I<--target samba4|samba3|win> +=item I<--target samba4|samba3|win|kvm>  Specify test target against which to run. Default is 'samba4'. @@ -144,6 +144,7 @@ my $opt_expected_failures = undef;  my @opt_exclude = ();  my @opt_include = ();  my $opt_verbose = 0; +my $opt_image = undef;  my $opt_testenv = 0;  my $ldap = undef;  my $opt_analyse_cmd = undef; @@ -280,7 +281,7 @@ Usage: $Script [OPTIONS] PREFIX  Generic options:   --help                     this help page - --target=samba4|samba3|win Samba version to target + --target=samba[34]|win|kvm Samba version to target   --testlist=FILE			file to read available tests from  Paths: @@ -301,6 +302,9 @@ Samba4 Specific:  Samba3 Specific:   --bindir=PATH              path to binaries +Kvm Specific: + --image=PATH               path to KVM image +  Behaviour:   --quick                    run quick overall test   --one                      abort when the first test fails @@ -334,6 +338,7 @@ my $result = GetOptions (  		'resetup-environment' => \$opt_resetup_env,  		'bindir:s' => \$opt_bindir,  		'format=s' => \$opt_format, +		'image=s' => \$opt_image,  		'testlist=s' => \@testlists  	    ); @@ -442,6 +447,12 @@ if ($opt_target eq "samba4") {  	$testenv_default = "dc";  	require target::Windows;  	$target = new Windows(); +} elsif ($opt_target eq "kvm") { +	die("Kvm tests will not run with socket wrapper enabled.")  +		if ($opt_socket_wrapper); +	require target::Kvm; +	die("No image specified") unless ($opt_image); +	$target = new Kvm($opt_image);  }  sub read_test_regexes($) @@ -522,11 +533,13 @@ sub write_clientconf($$)  	if (defined($vars->{WINBINDD_SOCKET_DIR})) {  		print CF "\twinbindd socket directory = $vars->{WINBINDD_SOCKET_DIR}\n";  	} +	if ($opt_socket_wrapper) { +		print CF "\tinterfaces = $interfaces\n"; +	}  	print CF "  	private dir = $prefix_abs/client/private  	js include = $srcdir_abs/scripting/libjs  	name resolve order = bcast -	interfaces = $interfaces  	panic action = $srcdir_abs/script/gdb_backtrace \%PID\% \%PROG\%  	max xmit = 32K  	notify:inotify = false diff --git a/source4/selftest/target/Kvm.pm b/source4/selftest/target/Kvm.pm new file mode 100644 index 0000000000..253f3b53af --- /dev/null +++ b/source4/selftest/target/Kvm.pm @@ -0,0 +1,153 @@ +#!/usr/bin/perl +# Start a KVM machine and run a number of tests against it. +# Copyright (C) 2005-2008 Jelmer Vernooij <jelmer@samba.org> +# Published under the GNU GPL, v3 or later. + +package Kvm; + +use strict; +use Cwd qw(abs_path); +use FindBin qw($RealBin); +use POSIX; + +sub new($$$$) { +	my ($classname, $dc_image) = @_; +	my $self = {  +		dc_image => $dc_image, +	}; +	bless $self; +	return $self; +} + +sub write_kvm_ifup($$$) +{ +	my ($self, $path, $ip_prefix) = @_; +	open(SCRIPT, ">$path/kvm-ifup"); + +	print SCRIPT <<__EOF__; +#!/bin/sh + +PREFIX=$ip_prefix + +/sbin/ifconfig \$1 \$PREFIX.1 up + +cat <<EOF>$path/udhcpd.conf +interface \$1 +start 		\$PREFIX.20 +end		\$PREFIX.20 +max_leases 1 +lease_file	$path/udhcpd.leases +pidfile	$path/udhcpd.pid +EOF + +touch $path/udhcpd.leases + +/usr/sbin/udhcpd $path/udhcpd.conf + +exit 0 +__EOF__ +	close(SCRIPT); +	chmod(0755, "$path/kvm-ifup"); + +	return ("$path/kvm-ifup", "$path/udhcpd.pid", "$ip_prefix.20"); +} + +sub teardown_env($$) +{ +	my ($self, $envvars) = @_; + +	print "Killing kvm instance $envvars->{KVM_PID}\n"; + +	kill 9, $envvars->{KVM_PID}; + +	print "Killing dhcpd instance $envvars->{DHCPD_PID}\n"; +	kill 9, $envvars->{DHCPD_PID}; + +	return 0; +} + +sub getlog_env($$) +{ +	my ($self, $envvars) = @_; + +	return ""; +} + +sub check_env($$) +{ +	my ($self, $envvars) = @_; + +	# FIXME: Check whether $self->{pid} is still running + +	return 1; +} + +sub read_pidfile($) +{ +	my ($path) = @_; + +	open(PID, $path); +	<PID> =~ /([0-9]+)/; +	my ($pid) = $1; +	close(PID); +	return $pid; +} + +sub start($$$) +{ +	my ($self, $path, $image) = @_; + +	my $pidfile = "$path/kvm.pid"; + +	my $opts = (defined($ENV{KVM_OPTIONS})?$ENV{KVM_OPTIONS}:"-nographic"); + +	if (defined($ENV{KVM_SNAPSHOT})) { +		$opts .= " -loadvm $ENV{KVM_SNAPSHOT}"; +	} + +	my ($ifup_script, $dhcpd_pidfile, $ip_address) = $self->write_kvm_ifup($path, "192.168.9"); + +	system("kvm -name \"Samba 4 Test Subject\" $opts -monitor unix:$path/kvm.monitor,server,nowait -daemonize -pidfile $pidfile -snapshot $image -net nic -net tap,script=$ifup_script"); + +	return (read_pidfile($pidfile), read_pidfile($dhcpd_pidfile), $ip_address); +} + +sub setup_env($$$) +{ +	my ($self, $envname, $path) = @_; + +	if ($envname eq "dc") { +		($self->{dc_pid}, $self->{dc_dhcpd_pid}, $self->{dc_ip}) = $self->start($path, $self->{dc_image}); + +		sub choose_var($$) {  +			my ($name, $default) = @_;  +			return defined($ENV{"KVM_DC_$name"})?$ENV{"KVM_DC_$name"}:$default;  +		} + +		if ($envname eq "dc") { +			return { +				KVM_PID => $self->{dc_pid}, +				DHCPD_PID => $self->{dc_dhcpd_pid}, +				USERNAME => choose_var("USERNAME", "Administrator"), +				PASSWORD => choose_var("PASSWORD", "penguin"), +				DOMAIN => choose_var("DOMAIN", "SAMBA"),  +				REALM => choose_var("REALM", "SAMBA"),  +				SERVER => choose_var("SERVER", "DC"),  +				SERVER_IP => $self->{dc_ip}, +				NETBIOSNAME => choose_var("NETBIOSNAME", "DC"),  +				NETBIOSALIAS => choose_var("NETBIOSALIAS", "DC"),  +			}; +		} else { +			return undef; +		} +	} else { +		return undef; +	} +} + +sub stop($) +{ +	my ($self) = @_; +} + +1;  | 
