From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Campbell Subject: [OSSTEST v6 20/24] Add testing of non-LVM/phy disk backends. Date: Wed, 6 May 2015 10:56:49 +0100 Message-ID: <1430906213-30108-20-git-send-email-ian.campbell@citrix.com> References: <1430905605.2660.187.camel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1430905605.2660.187.camel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: ian.jackson@eu.citrix.com Cc: Ian Campbell , xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org xen-create-image makes this tricky to do since it is rather LVM centric. Now that we have the ability to install from d-i it's possible to arrange fairly easily that they use non-LVM disk backend arrangements. Here we add support to the test script and infra and create a bunch of new jobs testing the cross product of {xl,libvirt} x {raw,qcow2,vhd}. The test scripts are modified such that when constructing a domain with a non-LVM diskfmt runvar: - the LVM device is slightly enlarged to account for file format headers (1M should be plenty). - the LVM device will have an ext3 filesystem created on it instead of being used as a phy device for the guest. Reusing the LVM volume in this way means we don't need to do more storage management in dom0 (i.e. arranging for / to be large enough, or managing a special "images" LV) - the relevant type of container is created within the filesystem using the appropriate tool. - New properties Disk{fmt,spec} are added to all $gho, containing the format used for the root disk and the xl diskspec to load it. - lvm backed guests use a xend/xm compatible spec, everything else uses the improved xl syntax which libvirt also supports. We won't test non-LVM on xend. - New properties Disk{mnt,img} are added to $gho which are not using LVM. These contain the mount point to use (configurable via OSSTEST_CONFIG and runvars) and the full path (including mount point) to the image itself. - When starting or stopping a guest we arrange for the filesystem to be (u)mounted. - The prepearation when starting a guest copes gracefully with the disk already being prepared. - Hooks are called from guest_create() and guest_destroy() to manipulate the disk as needed. Using standalong-generate-dump-flight-runvars a representative set of runvars is: xen-unstable test-amd64-amd64-xl-qcow2 all_hostflags arch-amd64,arch-xen-amd64,suite-wheezy,purpose-test xen-unstable test-amd64-amd64-xl-qcow2 arch amd64 xen-unstable test-amd64-amd64-xl-qcow2 buildjob build-amd64 xen-unstable test-amd64-amd64-xl-qcow2 debian_arch amd64 xen-unstable test-amd64-amd64-xl-qcow2 debian_bootloader pygrub xen-unstable test-amd64-amd64-xl-qcow2 debian_diskfmt qcow2 xen-unstable test-amd64-amd64-xl-qcow2 debian_dist wheezy xen-unstable test-amd64-amd64-xl-qcow2 debian_method netboot xen-unstable test-amd64-amd64-xl-qcow2 kernbuildjob build-amd64-pvops xen-unstable test-amd64-amd64-xl-qcow2 kernkind pvops xen-unstable test-amd64-amd64-xl-qcow2 toolstack xl xen-unstable test-amd64-amd64-xl-qcow2 xenbuildjob build-amd64 Compared to test-amd64-amd64-pygrub (which is the most similar job) and normalising the test name the difference is: xen-unstable test-amd64-amd64-SUFFIX all_hostflags arch-amd64,arch-xen-amd64,suite-wheezy,purpose-test xen-unstable test-amd64-amd64-SUFFIX arch amd64 xen-unstable test-amd64-amd64-SUFFIX buildjob build-amd64 xen-unstable test-amd64-amd64-SUFFIX debian_arch amd64 xen-unstable test-amd64-amd64-SUFFIX debian_bootloader pygrub +xen-unstable test-amd64-amd64-SUFFIX debian_diskfmt qcow2 xen-unstable test-amd64-amd64-SUFFIX debian_dist wheezy xen-unstable test-amd64-amd64-SUFFIX debian_method netboot xen-unstable test-amd64-amd64-SUFFIX kernbuildjob build-amd64-pvops xen-unstable test-amd64-amd64-SUFFIX kernkind pvops xen-unstable test-amd64-amd64-SUFFIX toolstack xl xen-unstable test-amd64-amd64-SUFFIX xenbuildjob build-amd64 These are added to the following flights: +libvirt +linux-3.0 +linux-3.10 +linux-3.14 +linux-3.4 +linux-arm-xen +linux-linus +linux-mingo-tip-master +linux-next +osstest +qemu-mainline +qemu-upstream-4.3-testing +qemu-upstream-4.4-testing +qemu-upstream-unstable +seabios +xen-4.0-testing +xen-4.1-testing +xen-4.2-testing +xen-4.3-testing +xen-4.4-testing +xen-unstable Signed-off-by: Ian Campbell --- v6: Use bs=1MB (=1*1000) when creating the raw images instead of bs=1M (=1*1024), this matches the units used by lvcreate's -L option and therefore arranges that the imaage actually fits. v5: Assume 100MB/s dd from /dev/zero when creating a raw disk image Allow 10M of slack on filesystem for raw, qcow and vhd. 1M wasn't enough in practice for raw. v4: new patch --- Osstest/TestSupport.pm | 97 ++++++++++++++++++++++++++++++++++++++++++++++++-- make-flight | 16 +++++++++ ts-debian-di-install | 10 ++---- ts-guest-start | 1 - 4 files changed, 114 insertions(+), 10 deletions(-) diff --git a/Osstest/TestSupport.pm b/Osstest/TestSupport.pm index b3d85d6..a979223 100644 --- a/Osstest/TestSupport.pm +++ b/Osstest/TestSupport.pm @@ -89,7 +89,8 @@ BEGIN { target_var target_var_prefix selectguest prepareguest more_prepareguest_hvm guest_var guest_var_commalist - prepareguest_part_lvmdisk prepareguest_part_xencfg + prepareguest_part_lvmdisk prepareguest_part_diskimg + prepareguest_part_xencfg guest_umount_lv guest_await guest_await_dhcp_tcp guest_checkrunning guest_check_ip guest_find_ether guest_find_domid guest_check_up guest_check_up_quick @@ -97,6 +98,7 @@ BEGIN { guest_await_shutdown guest_await_destroy guest_destroy guest_vncsnapshot_begin guest_vncsnapshot_stash guest_check_remus_ok guest_editconfig + guest_prepare_disk guest_unprepare_disk host_involves_pcipassthrough host_get_pcipassthrough_devs toolstack guest_create @@ -1319,6 +1321,7 @@ sub selectguest ($$) { } logm("guest: using $gn on $gho->{Host}{Name}"); guest_find_lv($gho); + guest_find_diskimg($gho); guest_find_ether($gho); guest_find_tcpcheckport($gho); dhcp_watch_setup($ho,$gho); @@ -1334,6 +1337,22 @@ sub guest_find_lv ($) { ? '/dev/'.$gho->{Vg}.'/'.$gho->{Lv} : undef; } +sub guest_find_diskimg($) +{ + my ($gho) = @_; + $gho->{Diskfmt} = $r{"$gho->{Guest}_diskfmt"} // "lvm"; + $gho->{Diskspec} = "phy:$gho->{Lvdev},xvda,w"; + + return if $gho->{Diskfmt} eq "lvm"; + + my $mntroot = get_host_property($gho->{Host}, "DiskImageMount", + $c{DiskImageMount} // "/var/lib/xen/images"); + + $gho->{Diskmnt} = "$mntroot/$gho->{Guest}"; + $gho->{Diskimg} = "$gho->{Diskmnt}/disk.$gho->{Diskfmt}"; + $gho->{Diskspec} = "format=$gho->{Diskfmt},vdev=xvda,target=$gho->{Diskimg}"; +} + sub guest_find_ether ($) { my ($gho) = @_; $gho->{Ether}= $r{"$gho->{Guest}_ether"}; @@ -1373,6 +1392,7 @@ sub guest_destroy ($) { my ($gho) = @_; my $ho = $gho->{Host}; toolstack($ho)->destroy($gho); + guest_unprepare_disk($gho); } sub guest_await_destroy ($$) { @@ -1384,9 +1404,32 @@ sub guest_await_destroy ($$) { sub guest_create ($) { my ($gho) = @_; my $ho = $gho->{Host}; + guest_prepare_disk($gho); toolstack($ho)->create($gho); } +sub guest_prepare_disk ($) { + my ($gho) = @_; + + guest_umount_lv($gho->{Host}, $gho); + + return if $gho->{Diskfmt} eq "lvm"; + + target_cmd_root($gho->{Host}, <{Diskmnt} +mount $gho->{Lvdev} $gho->{Diskmnt}; +END +} + +sub guest_unprepare_disk ($) { + my ($gho) = @_; + return if $gho->{Diskfmt} eq "lvm"; + target_cmd_root($gho->{Host}, <{Lvdev} || : +END +} + + sub target_choose_vg ($$) { my ($ho, $mbneeded) = @_; @@ -1518,6 +1561,7 @@ sub prepareguest ($$$$$$) { } guest_find_lv($gho); + guest_find_diskimg($gho); guest_find_ether($gho); guest_find_tcpcheckport($gho); return $gho; @@ -1528,7 +1572,56 @@ sub prepareguest_part_lvmdisk ($$$) { target_cmd_root($ho, "lvremove -f $gho->{Lvdev} ||:"); target_cmd_root($ho, "lvcreate -L ${disk_mb}M -n $gho->{Lv} $gho->{Vg}"); target_cmd_root($ho, "dd if=/dev/zero of=$gho->{Lvdev} count=10"); -} +} + +sub make_vhd ($$$) { + my ($ho, $gho, $disk_mb) = @_; + target_cmd_root($ho, "vhd-util create -n $gho->{Rootimg} -s $disk_mb"); +} +sub make_qcow2 ($$$) { + my ($ho, $gho, $disk_mb) = @_; + # upstream qemu's version. Seems preferable to qemu-xen-img from qemu-trad. + my $qemu_img = "/usr/local/lib/xen/bin/qemu-img"; + target_cmd_root($ho, "$qemu_img create -f qcow2 $gho->{Rootimg} ${disk_mb}M"); +} +sub make_raw ($$$) { + my ($ho, $gho, $disk_mb) = @_; + # In local tests this reported 130MB/s, so calculate a timeout assuming 100MB/s. + target_cmd_root($ho, "dd if=/dev/zero of=$gho->{Rootimg} bs=1MB count=${disk_mb}", + ${disk_mb} / 100); +} + +sub prepareguest_part_diskimg ($$$) { + my ($ho, $gho, $disk_mb) = @_; + + my $diskfmt = $gho->{Diskfmt}; + # Allow an extra 10 megabytes for image format headers + my $disk_overhead = $diskfmt eq "lvm" ? 0 : 10; + + logm("preparing guest disks in $diskfmt format"); + + target_cmd_root($ho, "umount $gho->{Lvdev} ||:"); + + prepareguest_part_lvmdisk($ho, $gho, $disk_mb + $disk_overhead); + + if ($diskfmt ne "lvm") { + + $gho->{Rootimg} = "$gho->{Diskmnt}/disk.$diskfmt"; + $gho->{Rootcfg} = "format=$diskfmt,vdev=xvda,target=$gho->{Rootimg}"; + + target_cmd_root($ho, <{Lvdev} +mkdir -p $gho->{Diskmnt} +mount $gho->{Lvdev} $gho->{Diskmnt} +END + no strict qw(refs); + &{"make_$diskfmt"}($ho, $gho, $disk_mb); + + target_cmd_root($ho, <{Lvdev} +END + } +} sub prepareguest_part_xencfg ($$$$$) { my ($ho, $gho, $ram_mb, $xopts, $cfgrest) = @_; diff --git a/make-flight b/make-flight index 909cebe..c923f21 100755 --- a/make-flight +++ b/make-flight @@ -373,6 +373,22 @@ do_pv_debian_tests () { for xsm in $xsms ; do do_pv_debian_test_one libvirt '' libvirt enable_xsm=$xsm done + + for ts in xl libvirt ; do + + for fmt in raw vhd qcow2 ; do + + fmt_runvar="debian_diskfmt=$fmt" + + do_pv_debian_test_one $ts-$fmt '-di' $ts \ + debian_arch=amd64 \ + debian_dist=$guestsuite \ + debian_method=netboot \ + debian_bootloader=pygrub \ + $fmt_runvar + + done + done } test_matrix_do_one () { diff --git a/ts-debian-di-install b/ts-debian-di-install index 9ae3d6d..ecdb6a1 100755 --- a/ts-debian-di-install +++ b/ts-debian-di-install @@ -41,9 +41,7 @@ sub prep () { $gho= prepareguest($ho, $gn, $guesthost, 22, $disk_mb, 40); - prepareguest_part_lvmdisk($ho, $gho, $disk_mb); - - target_cmd_root($ho, "umount $gho->{Lvdev} ||:"); + prepareguest_part_diskimg($ho, $gho, $disk_mb); } sub setup_netinst($$$) @@ -207,14 +205,12 @@ END OnPowerOff => "preserve" ); - my $root_disk = "'phy:$gho->{Lvdev},xvda,w'"; - prepareguest_part_xencfg($ho, $gho, $ram_mb, \%install_xopts, <{Diskspec}' ] END @@ -238,7 +234,7 @@ END $blcfg # disk = [ - $root_disk + '$gho->{Diskspec}' ] END return; diff --git a/ts-guest-start b/ts-guest-start index 1aa9e69..a434720 100755 --- a/ts-guest-start +++ b/ts-guest-start @@ -25,7 +25,6 @@ tsreadconfig(); our ($ho,$gho) = ts_get_host_guest(@ARGV); sub start () { - guest_umount_lv($ho, $gho); guest_create($gho); } -- 2.1.4