|
[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 |