[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 1/3] Add nested testcase of installing L1 guest VM.



From: "Robert.ho" <robert.hu@xxxxxxxxx>

Adding nested test case <ts-nested-L1-debian-install> which is used for
installing L1. Inside L1 guest VM, need build xen and HVM dom0 kernel and then
boot into xen kernel. After that, get ready to install L2 guest VM inside L1.

---
 Osstest/Debian.pm           |   25 +-
 Osstest/TestSupport.pm      |   31 ++-
 sg-run-job                  |    6 +
 ts-nested-L1-debian-install |  534 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 582 insertions(+), 14 deletions(-)
 create mode 100755 ts-nested-L1-debian-install

diff --git a/Osstest/Debian.pm b/Osstest/Debian.pm
index ab09abb..a733ac5 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 1d77933..30fe988 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
@@ -66,7 +67,7 @@ BEGIN {
 
                       selecthost get_hostflags get_host_property
                       power_state power_cycle power_cycle_time
-                      serial_fetch_logs
+                      serial_fetch_logs select_ether
                       propname_massage
          
                       get_stashed open_unique_stashfile compress_stashed
@@ -108,6 +109,7 @@ BEGIN {
                       iso_gen_flags_basic
                       iso_copy_content_from_image
                       guest_editconfig_nocd
+                     guest_editconfig_cd
                       );
     %EXPORT_TAGS = ( );
 
@@ -480,6 +482,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 @_;
@@ -715,6 +725,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};
@@ -911,7 +922,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,
@@ -1438,7 +1449,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'
@@ -2036,4 +2047,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..0898113 100755
--- a/sg-run-job
+++ b/sg-run-job
@@ -288,6 +288,12 @@ 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
+    run-ts . = ts-guest-destroy + host nested
+}
+
 proc test-guest-migr {g} {
     if {[catch { run-ts . = ts-migrate-support-check + host $g }]} return
 
diff --git a/ts-nested-L1-debian-install b/ts-nested-L1-debian-install
new file mode 100755
index 0000000..4f6c5fa
--- /dev/null
+++ b/ts-nested-L1-debian-install
@@ -0,0 +1,534 @@
+#!/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);
+goto INSTALL_L1_XEN if ($ENV{'OSSTEST_L1_REUSE'});
+
+# 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/");
+
+my %distpath;
+sub guest_packages () {
+    target_install_packages($gho,
+                            qw(bridge-utils vncsnapshot libaio1 libpixman-1-0
+                               libsdl1.2debian libglib2.0-0 liblzma5 vim));
+    target_install_packages($gho,
+                           $ho->{Suite} =~ /squeeze/ ? "libyajl1" : 
"libyajl2");       #we always let L1 same as L0
+    if ($ho->{Suite} !~ m/lenny|squeeze/) {
+        target_install_packages($gho, 'libfdt1');
+    }
+    if ($r{arch} eq 'i386') {
+       target_install_packages($gho, 'libc6-xen');
+    }
+    target_install_packages($gho, @{toolstack()->{ExtraPackages}})
+        if toolstack()->{ExtraPackages};
+}
+
+sub guest_extract () {
+    my @parts = ('', 'kern', 'xen');
+    push @parts, 'libvirt' if $r{toolstack} eq "libvirt";
+
+    foreach my $part (@parts) {
+        target_extract_jobdistpath($gho, $part, "path_${part}dist",
+                                  $r{"${part}buildjob"}, \%distpath);
+    }
+    target_cmd_root($gho, '/sbin/ldconfig');
+}
+
+sub guest_adjustconfig () {
+    target_editfile_root($gho, "/etc/xen/xend-config.sxp",
+                        "xend-config.sxp", sub {
+       my (@domains) = (qw(localhost localhost.localdomain),
+                        ".".$c{DnsDomain}, ".".$c{TestHostDomain});
+       logm("relocation domains: @domains");
+       foreach (@domains) {
+           s/\./\\$&/g;
+           s/^/^/g;
+           s/$/\$/g;
+           s/^\^(\\\.)/.\*$1/;
+       }
+       $_= join ' ', @domains;
+       s/[\'\\]/\\$&/g;
+       my $extra= "(xend-relocation-hosts-allow '$_')";
+       logm("relocation setting: $extra");
+       $extra .= "\n";
+        while (<EI>) {
+           s/^\s*\(xend-relocation-hosts-allow/#$&/;
+           print EO or die $!;
+           if (m/^\#\(xend-relocation-hosts-allow/) {
+               print EO $extra or die $!;
+               $extra= '';
+           }
+       }
+       print EO $extra or die $!;
+    }) if toolstack()->{Name} eq "xend";
+
+    my $trace_config_file;
+    foreach my $try (qw(/etc/default/xencommons
+                        /etc/sysconfig/xencommons
+                        /etc/default/xend
+                        /etc/sysconfig/xend)) {
+        next unless target_file_exists_root($gho, $try);
+        $trace_config_file= $try;
+        last;
+    }
+    die unless defined $trace_config_file;
+
+    target_editfile_root($gho, $trace_config_file, sub {
+        my $prnow;
+        $prnow= sub {
+            print EO "XENCONSOLED_TRACE=guest\n" or die $!;
+            $prnow= sub { };
+        };
+        while (<EI>) {
+            print EO or die $! unless m/^XENCONSOLED_TRACE/;
+            $prnow->() if m/^#XENCONSOLED_TRACE/;
+        }
+        print EO "\n" or die $!;
+        $prnow->();
+    });
+
+    target_cmd_root($gho, 'mkdir -p /var/log/xen/console');
+
+}
+
+=begin
+sub guest_setupboot () {
+    my $xenhopt= "conswitch=x watchdog";
+
+    my $cons= get_host_property($gho, 'XenSerialConsole', 'com1');
+
+    if ( $cons eq "com1" ) {
+       $xenhopt .= " com1=$c{Baud},8n1 console=com1,vga gdb=com1";
+    } elsif ( $cons eq "dtuart" ) {
+       $xenhopt .= " console=dtuart";
+       my $dtuart= get_host_property($gho, 'XenDTUARTPath', undef);
+       $xenhopt .= " dtuart=$dtuart" if $dtuart;
+    } else {
+       logm("No Xen console device defined for L1 Xen");
+    }
+    if (toolstack()->{Dom0MemFixed}) {
+        $xenhopt .= " dom0_mem=1G,max:1G";
+    }
+    my $append= $r{xen_boot_append};
+    $xenhopt .= " $append" if defined $append;
+    $append = get_host_property($gho, 'xen-commandline-append', undef);
+    $xenhopt .= " $append" if defined $append;
+    my @hooks;
+                host_get_pcipassthrough_devs($ho);
+                logm("pci passthrough: hiding in dom0: $hide");
+                $$kopt .= $hide;
+            }
+        };
+    }
+
+    my $want_kernver = get_runvar('kernel_ver',$r{'kernbuildjob'});
+    debian_boot_setup($gho, $want_kernver, $xenhopt, \%distpath);
+
+    logm("ready to boot L1 Xen");
+}
+=end
+=cut
+
+sub setupboot_L1_grub ($$$) {
+    my ($ho,$want_kernver,$xenhopt,$xenkopt) = @_;
+    my $bl= { };
+    my $rmenu= '/boot/grub/grub.cfg';
+    my $kernkey= (defined $xenhopt ? 'KernDom0' : 'KernOnly');
+    my $parsemenu= sub {
+        my $f= bl_getmenu_open($ho, $rmenu, "$stash/$ho->{Name}--grub.cfg.1");
+    
+        my $count= 0;
+        my $entry;
+       my $submenu;
+        while (<$f>) {
+            next if m/^\s*\#/ || !m/\S/;
+            if (m/^\s*\}\s*$/) {
+                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));
+               if (@missing) {
+                   logm("(skipping entry at $entry->{StartLine};".
+                        " no @missing)");
+               } elsif (defined $want_kernver &&
+                        $entry->{KernVer} ne $want_kernver) {
+                   logm("(skipping entry at $entry->{StartLine};".
+                        " kernel $entry->{KernVer}, not $want_kernver)");
+               } else {
+                   # yes!
+                   last;
+               }
+                $entry= undef;
+                next;
+            }
+            if (m/^function.*\{/) {
+                $entry= { StartLine => $. };
+            }
+            if (m/^menuentry\s+[\'\"](.*)[\'\"].*\{\s*$/) {
+                die $entry->{StartLine} if $entry;
+                $entry= { Title => $1, StartLine => $., Number => $count };
+                $count++;
+            }
+                       if(m/^submenu\s+[\'\"](.*)[\'\"].*\{\s*$/){
+                               $submenu={ StartLine =>$.};
+                       }
+            if (m/^\s*multiboot\s*(?:\/boot)*\/(xen\S+)/) {
+                die unless $entry;
+                $entry->{Hv}= $1;
+            }
+            if (m/^\s*multiboot\s*(?:\/boot)*\/(vmlinu[xz]-(\S+))/) {
+                die unless $entry;
+                $entry->{KernOnly}= $1;
+                $entry->{KernVer}= $2;
+            }
+            if (m/^\s*module\s*(?:\/boot)*\/(vmlinu[xz]-(\S+))/) {
+                die unless $entry;
+                $entry->{KernDom0}= $1;
+                $entry->{KernVer}= $2;
+            }
+            if (m/^\s*module\s*(?:\/boot)*\/(initrd\S+)/) {
+                $entry->{Initrd}= $1;
+            }
+        }
+        die 'grub 2 bootloader entry not found' unless $entry;
+
+        die unless $entry->{Title};
+
+        logm("boot check: grub2, found $entry->{Title}");
+
+       die unless $entry->{$kernkey};
+       if (defined $xenhopt) {
+           die unless $entry->{Hv};
+       }
+
+        return $entry;
+    };
+
+
+    $bl->{UpdateConfig}= sub {
+       my ( $ho ) = @_;
+       target_cmd_root($ho, "update-grub");
+    };
+
+    $bl->{GetBootKern}= sub { return $parsemenu->()->{$kernkey}; };
+
+    $bl->{PreFinalUpdate}= sub {
+        my $entry= $parsemenu->();
+        
+        target_editfile_root($ho, '/etc/default/grub', sub {
+            my %k;
+            while (<::EI>) {
+                next if m/^GRUB_DEFAULT/;
+                print ::EO;
+            }
+            print ::EO <<END or die $!;
+
+GRUB_DEFAULT=$entry->{Number}
+END
+        });
+    };
+
+    return $bl;
+}
+
+our $initscripts_nobridge;
+sub guest_setupinitd () {
+    my $ts= toolstack();
+    my $xencommons= '/etc/init.d/xencommons';
+    my $have_xencommons=
+        !!target_cmd_output_root($gho, <<END);
+   if test -f $xencommons && ! grep 'FOR USE WITH LIBXL' $xencommons >/dev/null
+   then
+   echo y
+   fi
+END
+    $initscripts_nobridge= !defined($ts->{OldDaemonInitd}) || $have_xencommons;
+    logm("init.d scripts ".
+         ($initscripts_nobridge
+          ? 'do not mess with bridge, doing it in interfaces(5)'
+          : '_do_ mess with bridge, letting them handle it'));
+    my $cmd= '';
+    my $updatercd= sub {
+        my ($script,$start) = @_;
+        $cmd .= "\n    update-rc.d $script start $start 2 .";
+    };
+    if ($initscripts_nobridge) {
+        my $script= $have_xencommons ? 'xencommons' : 'xenlightdaemons';
+        $updatercd->($script,92);
+        my $pri= 93;
+        foreach my $d (@{ $ts->{NewDaemons} }) {
+            $updatercd->("$d",$pri);
+            $pri++;
+        }
+    } else {
+        my $initd= $ts->{OldDaemonInitd};
+        $updatercd->($initd,93) if defined $initd;
+        $updatercd->('xenbridge',38) if $ts->{OldSeparateBridgeInitd};
+    }
+    target_cmd_root($gho, $cmd);
+}
+
+sub bl_getmenu_open ($$$) {
+    my ($ho, $rmenu, $lmenu) = @_;
+    target_getfile($ho, 60, $rmenu, $lmenu);
+    my $f= new IO::File $lmenu, 'r' or die "$lmenu $?";
+    return $f;
+}
+
+sub setup_l1_bridge($)
+{
+    my ($ho)=@_;
+    my $bridge_port;
+    my $route_output=target_cmd_output_root($ho,"route -n");
+    foreach my $line (split /\n/, $route_output){
+       if($line =~ m/^\s*(?:(?:0\.0\.0\.0)|default).*\s(\w+)\s*$/ai){
+           $bridge_port=$1;
+           logm("get L1 bridge phy port $bridge_port");
+           last;
+       }
+    }
+       die "cannot find L1 port for xenbr0 bridge" if !defined $bridge_port;
+       
+    target_editfile_root($ho, "/etc/network/interfaces",
+                         "etc-network-interfaces", 
+                        sub {
+                           while(<EI>){
+                               
s/^\s*iface\s*$bridge_port\s*inet.*dhcp\s*$/iface $bridge_port inet 
manual\nauto xenbr0\niface xenbr0 inet dhcp\n\tbridge_ports $bridge_port\n/;
+                               s/^\s*auto\s*$bridge_port/#auto\t$bridge_port/;
+                               print EO;
+                           }
+                         });
+    target_cmd_root($ho,"brctl addbr xenbr0; brctl addif xenbr0 $bridge_port; 
init 6");
+}
+
+INSTALL_L1_XEN:
+$gho= selectguest($gn,$ho);
+store_runvar("$gho->{Guest}_kernkind",$r{'kernkind'});
+$gho->{Suite}=$ho->{Suite};
+
+guest_check_ip($gho);
+guest_packages();
+guest_extract();
+guest_adjustconfig();
+my $want_kernver = get_runvar('kernel_ver',$r{'kernbuildjob'});
+my $bootloader;
+$bootloader=setupboot_L1_grub($gho, $want_kernver, "");
+
+
+target_cmd_root($gho,
+                    "update-initramfs -k $want_kernver -c ||".
+                    " update-initramfs -k $want_kernver -u",
+                    200);
+$bootloader->{UpdateConfig}($gho); #so that /boot/grub/grub.cfg have new 
kernel and xen
+$bootloader->{PreFinalUpdate}();       #update /etc/default/grub, by setting 
default entry we want
+
+guest_setupinitd ();
+$bootloader->{UpdateConfig}($gho);     #use the default entry, apply it to 
/boot/grub/grub.cfg
+guest_editconfig($gho->{Host}, $gho, sub {
+        s/#nestedhvm/nestedhvm/;
+    });
+target_cmd_root($gho,"sync");
+setup_l1_bridge($gho);         #after setup L1 bridge, it will reboot for 
network settiings to take effect
+logm("ready to reboot L1 Xen");
+guest_await($gho, target_var($gho,'boot_timeout'));
+guest_check_up($gho);
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.