b1ad8fcefa9c72afe5f1cb31395adb2ae97421b8
[jelmer/samba4-debian.git] / source / selftest / target / Kvm.pm
1 #!/usr/bin/perl
2 # Start a KVM machine and run a number of tests against it.
3 # Copyright (C) 2005-2008 Jelmer Vernooij <jelmer@samba.org>
4 # Published under the GNU GPL, v3 or later.
5
6 package Kvm;
7
8 use strict;
9 use Cwd qw(abs_path);
10 use FindBin qw($RealBin);
11 use POSIX;
12
13 sub new($$$$) {
14         my ($classname, $dc_image) = @_;
15         my $self = { 
16                 dc_image => $dc_image,
17         };
18         bless $self;
19         return $self;
20 }
21
22 sub write_kvm_ifup($$$)
23 {
24         my ($self, $path, $ip_prefix) = @_;
25         open(SCRIPT, ">$path/kvm-ifup");
26
27         print SCRIPT <<__EOF__;
28 #!/bin/sh
29
30 PREFIX=$ip_prefix
31
32 /sbin/ifconfig \$1 \$PREFIX.1 up
33
34 cat <<EOF>$path/udhcpd.conf
35 interface \$1
36 start           \$PREFIX.20
37 end             \$PREFIX.20
38 max_leases 1
39 lease_file      $path/udhcpd.leases
40 pidfile $path/udhcpd.pid
41 EOF
42
43 touch $path/udhcpd.leases
44
45 /usr/sbin/udhcpd $path/udhcpd.conf
46
47 exit 0
48 __EOF__
49         close(SCRIPT);
50         chmod(0755, "$path/kvm-ifup");
51
52         return ("$path/kvm-ifup", "$path/udhcpd.pid", "$ip_prefix.20");
53 }
54
55 sub teardown_env($$)
56 {
57         my ($self, $envvars) = @_;
58
59         print "Killing kvm instance $envvars->{KVM_PID}\n";
60
61         kill 9, $envvars->{KVM_PID};
62
63         print "Killing dhcpd instance $envvars->{DHCPD_PID}\n";
64         kill 9, $envvars->{DHCPD_PID};
65
66         return 0;
67 }
68
69 sub getlog_env($$)
70 {
71         my ($self, $envvars) = @_;
72
73         return "";
74 }
75
76 sub check_env($$)
77 {
78         my ($self, $envvars) = @_;
79
80         # FIXME: Check whether $self->{pid} is still running
81
82         return 1;
83 }
84
85 sub read_pidfile($)
86 {
87         my ($path) = @_;
88
89         open(PID, $path);
90         <PID> =~ /([0-9]+)/;
91         my ($pid) = $1;
92         close(PID);
93         return $pid;
94 }
95
96 sub start($$$)
97 {
98         my ($self, $path, $image) = @_;
99
100         my $pidfile = "$path/kvm.pid";
101
102         my $opts = (defined($ENV{KVM_OPTIONS})?$ENV{KVM_OPTIONS}:"-nographic");
103
104         if (defined($ENV{KVM_SNAPSHOT})) {
105                 $opts .= " -loadvm $ENV{KVM_SNAPSHOT}";
106         }
107
108         my ($ifup_script, $dhcpd_pidfile, $ip_address) = $self->write_kvm_ifup($path, "192.168.9");
109
110         system("kvm $opts -monitor unix:$path/kvm.monitor,server,nowait -daemonize -pidfile $pidfile -snapshot $image -net nic -net tap,script=$ifup_script");
111
112         return (read_pidfile($pidfile), read_pidfile($dhcpd_pidfile), $ip_address);
113 }
114
115 sub setup_env($$$)
116 {
117         my ($self, $envname, $path) = @_;
118
119         if ($envname eq "dc") {
120                 ($self->{dc_pid}, $self->{dc_dhcpd_pid}, $self->{dc_ip}) = $self->start($path, $self->{dc_image});
121
122                 sub choose_var($$) { 
123                         my ($name, $default) = @_; 
124                         return defined($ENV{"KVM_DC_$name"})?$ENV{"KVM_DC_$name"}:$default; 
125                 }
126
127                 if ($envname eq "dc") {
128                         return {
129                                 KVM_PID => $self->{dc_pid},
130                                 DHCPD_PID => $self->{dc_dhcpd_pid},
131                                 USERNAME => choose_var("USERNAME", "Administrator"),
132                                 PASSWORD => choose_var("PASSWORD", "penguin"),
133                                 DOMAIN => choose_var("DOMAIN", "SAMBA"), 
134                                 REALM => choose_var("REALM", "SAMBA"), 
135                                 SERVER => choose_var("SERVER", "DC"), 
136                                 SERVER_IP => $self->{dc_ip},
137                                 NETBIOSNAME => choose_var("NETBIOSNAME", "DC"), 
138                                 NETBIOSALIAS => choose_var("NETBIOSALIAS", "DC"), 
139                         };
140                 } else {
141                         return undef;
142                 }
143         } else {
144                 return undef;
145         }
146 }
147
148 sub stop($)
149 {
150         my ($self) = @_;
151 }
152
153 1;