[pkg-kolab] r1376 - / pkg-kolab_testsuite

Mathieu Parent sathieu at alioth.debian.org
Sun Oct 18 11:26:47 UTC 2009


Author: sathieu
Date: 2009-10-18 11:26:47 +0000 (Sun, 18 Oct 2009)
New Revision: 1376

Added:
   pkg-kolab_testsuite/
   pkg-kolab_testsuite/testsuite
Log:
Script to test Debian native kolab packages using virtual machines.



Added: pkg-kolab_testsuite/testsuite
===================================================================
--- pkg-kolab_testsuite/testsuite	                        (rev 0)
+++ pkg-kolab_testsuite/testsuite	2009-10-18 11:26:47 UTC (rev 1376)
@@ -0,0 +1,284 @@
+#!/usr/bin/perl
+
+# Script to test Debian native kolab packages using virtual machines.
+#
+# Usage: testsuite
+
+# Written by Mathieu Parent <sathieu at debian.org>, 2009.
+#
+# This program is made available under the same license as the
+# kolabd package it applies to.
+
+use strict;
+use warnings;
+
+use UUID;
+use Sys::Virt;
+
+my %config = (
+    'slave_count' => 1,
+    'storagepooldir' => '/var/tmp/pkg-kolab_testsuite',
+    
+    'vmmemory' => "128Mb",
+    'vmsize' => "1Gb",
+    'vmswap' => "128Mb",
+    'vmdist' => 'sid',
+    
+    'virt_uri' => 'vbox:///session',
+    'virt_type' => 'vbox',
+    
+    'bridge' => 'br0',
+    'dnsdomain' => 'local.tld',
+    
+);
+
+#disable buffer
+$| = 1;
+
+my $vmm;
+my @domains;
+my @domain_names;
+my %test_domains;
+
+#-------------------------------------------------------
+sub initial_check
+{
+    my $groups = `groups`;
+    die 'The current user should be in group "libvirt".' if not $groups =~ /(^| )libvirt($| )/;
+    if($config{'virt_type'} eq 'vbox') {
+        die 'The current user should be in group "vboxusers".' if not $groups =~ /(^| )vboxusers($| )/;
+        die 'The current user should be in group "disk".' if not $groups =~ /(^| )disk($| )/;
+    }
+}
+
+#-------------------------------------------------------
+sub domain_ip
+{
+    my $domid = shift;
+    my $domname = shift;
+    return "192.168.0.".($domid+10);
+}
+#-------------------------------------------------------
+sub domain_bootstrap
+{
+    my $domid = shift;
+    my $domname = shift;
+    
+    my $size = $config{'vmsize'};
+    my $memory = $config{'vmmemory'};
+    my $swap = $config{'vmswap'};
+    my $dist = $config{'vmdist'};
+    my $storagepooldir = $config{'storagepooldir'};
+    
+    print "* Bootstraping:\n";
+    system("sudo xen-create-image --hostname $domname ".
+        "--ip ".domain_ip($domid, $domname)." ".
+        "--dist $dist --install-method debootstrap ".
+        "--dir '$storagepooldir' ".
+        "--memory $memory --size $size --swap $swap ".
+        "--fs ext3 --image sparse ".
+        "--force ".
+        "--cache --output '$storagepooldir' --no-hosts ");
+}
+
+#-------------------------------------------------------
+sub domain_make_bootable
+{
+    my $domid = shift;
+    my $domname = shift;
+    
+    my $storagepooldir = $config{'storagepooldir'};
+    my $CHROOT = "$storagepooldir/domains/$domname/disk";
+    my $DEVICE = '/dev/loop0';
+    
+    #extlinux
+    system("sudo extlinux --install $CHROOT");
+    system("cat <<EOF > /tmp/pkg-kolab-extlinux.conf
+default linux 
+prompt 1
+timeout 50
+label linux
+kernel vmlinuz
+append root=/dev/hda initrd=./initrd.img
+EOF
+");
+    system("sudo mv /tmp/pkg-kolab-extlinux.conf '$CHROOT/extlinux.conf'");
+
+    #linux kernel
+    system("cat <<EOF > $storagepooldir/kernel-img.conf
+do_symlinks = yes
+relative_links = yes
+do_bootloader = no
+do_bootfloppy = no
+do_initrd = yes
+link_in_boot = no
+postinst_hook = #update-grub
+postrm_hook   = #update-grub
+EOF
+");
+    system("sudo mv $storagepooldir/kernel-img.conf '$CHROOT/etc/kernel-img.conf'");
+    system("sudo chroot $CHROOT apt-get install -q linux-image-2.6.30-2-686");
+
+    #remove xen specific
+    system("sudo chroot $CHROOT aptitude -y purge libc6-xen");
+    system("sudo sed -i s/hvc0/tty1/ $CHROOT/etc/inittab");
+}
+
+#-------------------------------------------------------
+sub domain_preboot_install
+{
+    my $domid = shift;
+    my $domname = shift;
+    
+    my $storagepooldir = $config{'storagepooldir'};
+    
+    print "* Installing:\n";
+    system("sudo mkdir '$storagepooldir/domains/$domname/disk'");
+    system("sudo mount -o loop '$storagepooldir/domains/$domname/disk.img' '$storagepooldir/domains/$domname/disk'");
+    
+    if($config{'virt_type'} eq 'vbox') {
+        domain_make_bootable($domid, $domname);
+    }
+    #copy ssh key
+    system("sudo mkdir '$storagepooldir/domains/$domname/disk/root/.ssh'");
+    system("sudo cp '$storagepooldir/key.pub' '$storagepooldir/domains/$domname/disk/root/.ssh/authorized_keys'");
+    
+    system("sudo umount '$storagepooldir/domains/$domname/disk'");
+    system("sudo rmdir '$storagepooldir/domains/$domname/disk'");
+}
+
+#-------------------------------------------------------
+sub domain_boot
+{
+    my $domid = shift;
+    my $domname = shift;
+    
+    my $size = $config{'vmsize'};
+    my $memory = $config{'vmmemory'};
+    my $swap = $config{'vmswap'};
+    my $storagepooldir = $config{'storagepooldir'};
+    my $bridge = $config{'bridge'};
+
+    print "* Preparing:\n";
+    if($config{'virt_type'} eq 'vbox') {
+        #volume
+        my $loopdev = `sudo losetup --find --show '$storagepooldir/domains/$domname/disk.img'`;
+        $loopdev =~ s/\s+$//;
+        system("sudo VBoxManage internalcommands createrawvmdk ".
+            "-filename '$storagepooldir/domains/$domname/disk.vmdk' ".
+            "-rawdisk '$loopdev' ");
+        system("sudo chmod go+rw '$storagepooldir/domains/$domname/disk.vmdk'");
+        system("VBoxManage openmedium disk '$storagepooldir/domains/$domname/disk.vmdk'");
+        #vm
+        print "* Defining:\n";
+        UUID::generate(my $uuid);
+        UUID::unparse($uuid, my $uuid_string);
+        my $xml = "<domain type='vbox'>
+    <name>$domname</name>
+    <uuid>$uuid_string</uuid>
+    <os>
+        <type>hvm</type>
+        <!-- boot from hd -->
+        <boot dev='hd'/>
+    </os>
+
+    <memory>$memory</memory>
+    <features>
+        <pae/>
+        <acpi/>
+        <apic/>
+    </features>
+    <devices>
+        <disk type='file' device='disk'>
+            <source file='$storagepooldir/domains/$domname/disk.vmdk'/>
+            <target dev='hda'/>
+        </disk>
+        <interface type='bridge'>
+            <source bridge='$bridge'/>
+            <!-- <mac address='00:16:3e:5d:c7:9e'/> -->
+            <model type='am79c973'/>
+        </interface>
+    </devices>
+    </domain>";
+        $test_domains{$domid} = $vmm->define_domain($xml);
+    } elsif($config{'virt_type'} eq 'xen') {
+        $test_domains{$domid} = $vmm->get_domain_by_name($domname);
+        #TODO: test
+    } else {
+        print "Unsupported virt_type: ".$config{'virt_type'}."\n";
+        exit 1;
+    }
+    print "* Starting:\n";
+    $test_domains{$domid}->create();
+}
+#-------------------------------------------------------
+initial_check();
+$vmm = Sys::Virt->new(address => $config{'virt_uri'});
+ at domains = $vmm->list_domains();
+while (my $dom = pop @domains) {
+    push @domain_names, $dom->get_name();
+}
+#-------------------------------------------------------
+
+system("mkdir -p '".$config{'storagepooldir'}."'");
+
+#generate ssh key
+system("ssh-keygen -f '".$config{'storagepooldir'}."/key' -N ''");
+
+my $hosts = "127.0.0.1 localhost\n";
+
+for(my $domid = 0; $domid<=$config{'slave_count'}; $domid++) {
+    my $domname = "kolab_test_slave$domid";
+    $domname = "kolab_test_master" if $domid == 0;
+    print "Domain $domname:\n";
+    my $domip = domain_ip($domid, $domname);
+    $host .= "$domip    $domname.".$config{'storagepooldir'}." $domname\n"
+    #Cleaning:
+    if($domname ~~ @domain_names) {
+        print "* Domain already exists.\n";
+        my $dominfo = $vmm->get_domain_by_name($domname)->get_info();
+        if($dominfo->{'state'} == Sys::Virt::Domain::STATE_RUNNING) {
+            print "* Domain is running. Trying to shutdown";
+            $vmm->get_domain_by_name($domname)->shutdown();
+            print ".\n";
+        };
+        if($dominfo->{'state'} != Sys::Virt::Domain::STATE_SHUTOFF) {
+            print "* Domain is not shutoff, exiting.\n";
+            exit 1;
+        }
+        print "* Trying to undefine";
+        $vmm->get_domain_by_name($domname)->undefine();
+        print ".\n";
+    }
+    domain_bootstrap($domid, $domname);
+    domain_preboot_install($domid, $domname);
+    domain_boot($domid, $domname);
+}
+
+print "Phase 2:\n";
+for(my $domid = 0; $domid<=$config{'slave_count'}; $domid++) {
+    my $domname = "kolab_test_slave$domid";
+    $domname = "kolab_test_master" if $domid == 0;
+    print "Domain $domname:\n";
+    my $domip = domain_ip($domid, $domname);
+    #/etc/hosts file
+    system("ssh -i '".$config{'storagepooldir'}."/key' root\@$domip 'cat <<EOF >> /etc/hosts
+$hosts
+EOF'");
+    #package repository
+    system("ssh -i '".$config{'storagepooldir'}."/key' root\@$domip 'cat <<EOF >> /etc/apt/sources.list
+#kolab
+deb http://pkg-kolab.alioth.debian.org/packages kolab-snapshots/
+EOF'");
+    system("ssh -i '".$config{'storagepooldir'}."/key' root\@$domip 'apt-get update'");
+    
+}
+
+#then, on each VM:
+# follow https://wiki.kolab.org/index.php/Debian_-_Administrators_-_Kolab_Installation
+
+#apt-get install phpunit
+#php /usr/share/php/tests/Kolab_Filter/Horde/Kolab/Filter/AllTests.php 
+#php /usr/share/php/tests/Kolab_FreeBusy/Horde/Kolab/FreeBusy/AllTests.php 
+
+


Property changes on: pkg-kolab_testsuite/testsuite
___________________________________________________________________
Added: svn:executable
   + *




More information about the pkg-kolab-devel mailing list