diff options
| -rwxr-xr-x | source4/selftest/selftest.pl | 2 | ||||
| -rw-r--r-- | source4/selftest/target/Kvm.pm | 84 | 
2 files changed, 70 insertions, 16 deletions
diff --git a/source4/selftest/selftest.pl b/source4/selftest/selftest.pl index a989d1a851..1672209bef 100755 --- a/source4/selftest/selftest.pl +++ b/source4/selftest/selftest.pl @@ -448,6 +448,8 @@ if ($opt_target eq "samba4") {  	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); diff --git a/source4/selftest/target/Kvm.pm b/source4/selftest/target/Kvm.pm index 7fa7e02184..1037f23c59 100644 --- a/source4/selftest/target/Kvm.pm +++ b/source4/selftest/target/Kvm.pm @@ -19,6 +19,39 @@ sub new($$$$) {  	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) = @_; @@ -27,6 +60,9 @@ sub teardown_env($$)  	kill 9, $envvars->{KVM_PID}; +	print "Killing dhcpd instance $envvars->{DHCPD_PID}\n"; +	kill 9, $envvars->{DHCPD_PID}; +  	return 0;  } @@ -46,21 +82,30 @@ sub check_env($$)  	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 = ($ENV{KVM_OPTIONS} or ""); +	my $opts = ($ENV{KVM_OPTIONS} or "-nographic"); -	system("kvm $opts -daemonize -pidfile $pidfile -vnc unix:$path/kvm.vnc -snapshot $image"); +	my ($ifup_script, $dhcpd_pidfile, $ip_address) = $self->write_kvm_ifup($path, "192.168.9"); -	open(PID, $pidfile); -	<PID> =~ /([0-9]+)/; -	my ($pid) = $1; -	close(PID); -	return $pid; +	system("kvm $opts -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($$$) @@ -68,18 +113,25 @@ sub setup_env($$$)  	my ($self, $envname, $path) = @_;  	if ($envname eq "dc") { -		$self->{dc_pid} = $self->start($path, $self->{dc_image}); +		($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}, -				USERNAME => "Administrator", -				PASSWORD => "penguin", -				DOMAIN => "SAMBA", -				REALM => "SAMBA", -				SERVER => "", -				SERVER_IP => "", -				NETBIOSNAME => "", -				NETBIOSALIAS => "", +				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;  | 
