[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [OSSTEST PATCH 1/4] Add nested testcase of preparing and installing L1 guest
From: "longtao.pang" <longtaox.pang@xxxxxxxxx> This patch is used for preparing and installing L1 guest VM inside L0 system on testhost machine. --- Osstest/Debian.pm | 25 +++-- Osstest/TestSupport.pm | 31 +++++- sg-run-job | 5 + ts-nested-L1-debian-install-part1 | 202 +++++++++++++++++++++++++++++++++++++ 4 files changed, 249 insertions(+), 14 deletions(-) create mode 100755 ts-nested-L1-debian-install-part1 diff --git a/Osstest/Debian.pm b/Osstest/Debian.pm index 8f80eb4..68da2cb 100644 --- a/Osstest/Debian.pm +++ b/Osstest/Debian.pm @@ -1,5 +1,6 @@ # This is part of "osstest", an automated testing framework for Xen. # Copyright (C) 2009-2013 Citrix Inc. +# Copyright (C) 2014 Intel Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -286,15 +287,18 @@ sub setupboot_grub2 ($$$) { my $count= 0; my $entry; + my $submenu; while (<$f>) { next if m/^\s*\#/ || !m/\S/; if (m/^\s*\}\s*$/) { - die unless $entry; + die unless $entry || $submenu; + if(!defined $entry && defined $submenu){ + logm("Met end of a submenu starting from $submenu->{StartLine}.Our want kern is $want_kernver"); + $submenu=undef; + next; + } my (@missing) = - grep { !defined $entry->{$_} } - (defined $xenhopt - ? qw(Title Hv KernDom0 KernVer) - : qw(Title Hv KernOnly KernVer)); + grep { !defined $entry->{$_} } (defined $xenhopt ? qw(Title Hv KernDom0 KernVer) : qw(Title Hv KernOnly KernVer)); if (@missing) { logm("(skipping entry at $entry->{StartLine};". " no @missing)"); @@ -317,21 +321,24 @@ sub setupboot_grub2 ($$$) { $entry= { Title => $1, StartLine => $., Number => $count }; $count++; } - if (m/^\s*multiboot\s*\/(xen\-[0-9][-+.0-9a-z]*\S+)/) { + if(m/^submenu\s+[\'\"](.*)[\'\"].*\{\s*$/){ + $submenu={ StartLine =>$.}; + } + if (m/^\s*multiboot\s*(?:\/boot)*\/(xen\-[0-9][-+.0-9a-z]*\S+)/) { die unless $entry; $entry->{Hv}= $1; } - if (m/^\s*multiboot\s*\/(vmlinu[xz]-(\S+))/) { + if (m/^\s*multiboot\s*(?:\/boot)*\/(vmlinu[xz]-(\S+))/) { die unless $entry; $entry->{KernOnly}= $1; $entry->{KernVer}= $2; } - if (m/^\s*module\s*\/(vmlinu[xz]-(\S+))/) { + if (m/^\s*module\s*(?:\/boot)*\/(vmlinu[xz]-(\S+))/) { die unless $entry; $entry->{KernDom0}= $1; $entry->{KernVer}= $2; } - if (m/^\s*module\s*\/(initrd\S+)/) { + if (m/^\s*module\s*(?:\/boot)*\/(initrd\S+)/) { $entry->{Initrd}= $1; } } diff --git a/Osstest/TestSupport.pm b/Osstest/TestSupport.pm index 45ceee9..21955b8 100644 --- a/Osstest/TestSupport.pm +++ b/Osstest/TestSupport.pm @@ -55,8 +55,9 @@ BEGIN { target_putfilecontents_stash target_putfilecontents_root_stash target_put_guest_image target_editfile - target_editfile_root target_file_exists - target_run_apt + target_editfile_root target_file_exists + target_file_exists_root + target_run_apt target_install_packages target_install_packages_norec target_jobdir target_extract_jobdistpath_subdir target_extract_jobdistpath target_guest_lv_name @@ -67,7 +68,7 @@ BEGIN { selecthost get_hostflags get_host_property get_host_native_linux_console power_state power_cycle power_cycle_time - serial_fetch_logs + serial_fetch_logs select_ether propname_massage get_stashed open_unique_stashfile compress_stashed @@ -109,6 +110,7 @@ BEGIN { iso_gen_flags_basic iso_copy_content_from_image guest_editconfig_nocd + guest_editconfig_cd ); %EXPORT_TAGS = ( ); @@ -481,6 +483,14 @@ sub target_file_exists ($$) { die "$rfile $out ?"; } +sub target_file_exists_root ($$) { + my ($ho,$rfile) = @_; + my $out= target_cmd_output_root($ho, "if test -e $rfile; then echo y; fi"); + return 1 if $out =~ m/^y$/; + return 0 if $out !~ m/\S/; + die "$rfile $out ?"; +} + sub teditfileex { my $user= shift @_; my $code= pop @_; @@ -716,6 +726,7 @@ sub power_cycle_time ($) { sub power_cycle ($) { my ($ho) = @_; $mjobdb->host_check_allocated($ho); + $mjobdb->xen_check_installed($ho); die "refusing to set power state for host $ho->{Name}". " possibly shared with other jobs\n" if $ho->{SharedMaybeOthers}; @@ -921,7 +932,7 @@ sub compress_stashed($) { sub host_reboot ($) { my ($ho) = @_; target_reboot($ho); - poll_loop(40,2, 'reboot-confirm-booted', sub { + poll_loop(200,2, 'reboot-confirm-booted', sub { my $output; if (!eval { $output= target_cmd_output($ho, <<END, 40); @@ -1449,7 +1460,7 @@ sub prepareguest_part_xencfg ($$$$$) { my $xencfg= <<END; name = '$gho->{Name}' memory = ${ram_mb} -vif = [ 'type=ioemu,mac=$gho->{Ether}' ] +vif = [ 'type=ioemu,model=e1000,mac=$gho->{Ether}' ] # on_poweroff = 'destroy' on_reboot = '$onreboot' @@ -2047,4 +2058,14 @@ sub guest_editconfig_nocd ($$) { }); } +sub guest_editconfig_cd ($) { + my ($gho) = @_; + guest_editconfig($gho->{Host}, $gho, sub { + if (m/^\s*boot\s*= '\s*d\s*c\s*'/) { + s/dc/cd/; + } + s/^on_reboot.*/on_reboot='restart'/; + }); +} + 1; diff --git a/sg-run-job b/sg-run-job index 2cf810a..cd8b468 100755 --- a/sg-run-job +++ b/sg-run-job @@ -288,6 +288,11 @@ proc run-job/test-pair {} { # run-ts . remus-failover ts-remus-check src_host dst_host + debian } +proc need-hosts/test-nested {} {return host} +proc run-job/test-nested {} { + run-ts . = ts-nested-L1-debian-install-part1 +} + proc test-guest-migr {g} { if {[catch { run-ts . = ts-migrate-support-check + host $g }]} return diff --git a/ts-nested-L1-debian-install-part1 b/ts-nested-L1-debian-install-part1 new file mode 100755 index 0000000..9649b76 --- /dev/null +++ b/ts-nested-L1-debian-install-part1 @@ -0,0 +1,202 @@ +#!/usr/bin/perl -w +# This is part of "osstest", an automated testing framework for Xen. +# Copyright (C) 2009-2013 Citrix Inc. +# Copyright (C) 2014 Intel Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +use strict qw(vars); +use DBI; +use Osstest; +use Osstest::Debian; +use Osstest::TestSupport; + +tsreadconfig(); + +our $stage=0; +if (@ARGV && $ARGV[0] =~ m/^--stage(\d+)$/) { $stage=$1; shift @ARGV; } + +defined($r{bios}) or die "Need to define which bios to use"; + +our ($whhost,$gn) = @ARGV; +$whhost ||= 'host'; +$gn ||= 'nested'; + +our $ho= selecthost($whhost); + +# guest memory size will be set based on host free memory, see below +our $ram_mb; +our $disk_mb= 100000; + +our $guesthost= "$gn.l1.osstest"; +our $gho; + +our $toolstack= toolstack()->{Command}; + + +sub preseed () { + + my $preseed_file = preseed_base('wheezy','',()); + my $authkeys = join('\\n', split(/\n/, authorized_keys())); + + $preseed_file .= (<<END); +d-i netcfg/get_hostname string $gn + +d-i partman-auto/disk string /dev/xvda +d-i partman-auto/method string regular + +d-i partman-auto/expert_recipe string \\ + boot-root :: \\ + 512 50 512 vfat \\ + \$primary{ } \$bootable{ } \\ + method{ efi } format{ } \\ + use_filesystem{ } filesystem{ vfat } \\ + mountpoint{ /boot/efi } \\ + . \\ + 95000 50 95000 ext4 \\ + method{ format } format{ } \\ + use_filesystem{ } filesystem{ ext4 } \\ + mountpoint{ / } \\ + . \\ + 512 30 100% linux-swap \\ + method{ swap } format{ } \\ + . + +d-i apt-setup/cdrom/set-first boolean false + +d-i preseed/late_command string \\ + in-target mkdir -p /boot/efi/EFI/boot; \\ + in-target cp /boot/efi/EFI/debian/grubx64.efi /boot/efi/EFI/boot/bootx64.efi ;\\ + in-target mkdir -p /root/.ssh; \\ + in-target sh -c "echo -e '$authkeys'> /root/.ssh/authorized_keys"; +END + return $preseed_file; +} + +sub grub_cfg () { + + return <<"END"; +set default="0" +set timeout=5 + +menuentry 'debian guest auto Install' { + linux /install.amd/vmlinuz console=vga console=ttyS0,115200n8 preseed/file=/preseed.cfg + initrd /install.amd/initrd.gz +} +END +} + +sub isolinux_cfg () { + return <<"END"; + default autoinstall + prompt 0 + timeout 0 + + label autoinstall + kernel /install.amd/vmlinuz + append video=vesa:ywrap,mtrr vga=788 console=ttyS0,115200n8 preseed/file=/preseed.cfg initrd=/install.amd/initrd.gz +END +} + +sub prepare_initrd ($$$) { + my ($initrddir,$newiso,$preseed_file_path) = @_; + return <<"END"; + rm -rf $initrddir + mkdir $initrddir + cd $initrddir + gzip -d < $newiso/install.amd/initrd.gz | cpio --extract --make-directories --no-absolute-filename + cp $preseed_file_path preseed.cfg + find . | cpio -H newc --create | gzip -9 > $newiso/install.amd/initrd.gz + cd - + rm -rf $initrddir + cd $newiso + md5sum `find -L -type f -print0 | xargs -0` > md5sum.txt + cd - +END +} + +our $emptyiso= "/root/$flight.$job.$gn-empty.iso"; + +sub prep () { + target_install_packages_norec($ho, qw(lvm2 rsync genisoimage ethtool)); + + my $isotimeout= 600; + + $gho= prepareguest($ho, $gn, $guesthost, 22, + $disk_mb + 1, + 200); + my $base = "/root/$flight.$job.$gn-"; + my $newiso= $base . "newiso"; + my $emptydir= $base . "empty-dir"; + my $initrddir= $base . "initrd-dir"; + my $preseed_file_path = $base . "preseed"; + + my @isogen_extra = qw(-eltorito-alt-boot + -b boot/grub/efi.img + -no-emul-boot + -r); + my @isogen_opts = (iso_gen_flags_basic(), @isogen_extra); + + iso_create_empty($ho, $emptyiso, $emptydir); + + target_putfilecontents_root_stash($ho, 10, preseed(), + $preseed_file_path); + + more_prepareguest_hvm($ho,$gho, $ram_mb, $disk_mb, + OnReboot => 'preserve', + Bios => $r{bios}, + DefVcpus => 4, + ExtraConfig => '#nestedhvm=1', + PostImageHook => sub { + my $cmds = iso_copy_content_from_image($gho, $newiso); + $cmds .= prepare_initrd($initrddir,$newiso,$preseed_file_path); + target_cmd_root($ho, $cmds, $isotimeout); + target_putfilecontents_root_stash($ho, 10, grub_cfg(), + "$newiso/debian/boot/grub/grub.cfg"); + + target_putfilecontents_root_stash($ho, 10, isolinux_cfg(), + "$newiso/isolinux/isolinux.cfg"); + + iso_create_genisoimage($ho, $gho->{Rimage}, $newiso, $isotimeout, @isogen_opts); + }); +} + +# If host has >8G free memory, create a guest with 4G memory to catch +# any error that triggers cross 4G boundary +my $host_freemem_mb = host_get_free_memory($ho, $toolstack); +my $ram_minslop = 100; +my $ram_lots = 5000; +if ($host_freemem_mb > $ram_lots * 2 + $ram_minslop) { + $ram_mb = $ram_lots; +} else { + $ram_mb = 2048; +} +logm("Host has $host_freemem_mb MB free memory, setting guest memory size to $ram_mb MB"); + +if (!$stage) { + prep(); + guest_create($gho,$toolstack); +} else { + $gho= selectguest($gn,$gho); +} +if ($stage<2) { + guest_await_reboot($ho,$gho,2000); + guest_destroy($ho,$gho); +} + +guest_editconfig_cd($gho); +guest_create($gho,$toolstack); +guest_await_dhcp_tcp($gho,300); +guest_check_up($gho); +target_cmd_root($gho, "mkdir -p /home/osstest/.ssh && cp /root/.ssh/authorized_keys /home/osstest/.ssh/"); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |