Perry Myers
2008-Jul-01 21:53 UTC
[Ovirt-devel] [PATCH] [REPOST] [DOC] Merge developer/bundled appliance into a single appliance: ovirt-appliance
The separation of the ovirt appliance image into developer/bundled versions is not necessary, since the only differences between them are in how the host bridge is configured. Developer assumes that you only have a single NIC on your host so you can't have a separate ovirt network managed by the appliance. Bundled assumes you have the second NIC available. These patches remove the separation between bundled/developer. The new appliance is called ovirt-appliance and can be installed with or without a bridge to a real network device. In either case dummy managed nodes are allowed (they can be used in conjunction with the real managed nodes or just ignored in that case) Both build-all.sh and create-wui-appliance.sh have the developer/bundled flags removed, and replaced with -e flag to indicate the ethernet device to use as the bridge. If this is omitted it is assumed that the ovirtbr will not bridge to a physical network. The bridge (if to a physical net) is made persistent in rc.local (eventually libvirt should handle this) If the device to use on the bridge is used already, the script aborts (we don't want to mess up someones eth0 config by accident) Because the appliance name, bridge name and appliance image name have changed (ovirt-appliance, ovirtbr, ovirt-appliance.img) there are sections of the script that clean up the older named appliances. NOTE: This revised patch incorporates suggestions from Chris L. and Jeff Schroeder. Specifically fixing some of the checks for the presence of $bridge, making rc.local executable and fixing the usage syntax for build-all.sh Signed-off-by: Perry Myers <pmyers at redhat.com> --- build-all.sh | 34 ++++---- wui-appliance/create-wui-appliance.sh | 147 ++++++++++++++++++++++----------- 2 files changed, 115 insertions(+), 66 deletions(-) diff --git a/build-all.sh b/build-all.sh index 6e27957..ddeb15d 100755 --- a/build-all.sh +++ b/build-all.sh @@ -29,16 +29,15 @@ DEP_RPMS="createrepo httpd kvm libvirt livecd-tools pungi-1.2.18.1" usage() { case $# in 1) warn "$1"; try_h; exit 1;; esac cat <<EOF -Usage: $ME [-w] [-n] [-p init|update] [-s] [-d|-b] [-a] [-c] [-v git|release|none] +Usage: $ME [-w] [-n] [-p init|update] [-s] [-a] [-c] [-v git|release|none] [-e eth] -w: update oVirt WUI RPMs -n: update oVirt Managed Node RPMs -p: update pungi repository (init or update) -s: include SRPMs and produce source ISO - -d: update developer appliance - -b: update bundled appliance - -a: updates all (WUI, Node, App), requires -d or -b + -a: updates all (WUI, Node, Appliance) -c: cleanup old repos (pungi and ovirt) -v: update version type (git, release, none) default is git + -e: ethernet device to use as bridge (i.e. eth1) -h: display this help and exit EOF } @@ -57,19 +56,18 @@ update_wui=0 update_node=0 update_pungi=0 update_app=0 include_src=0 cleanup=0 -app_type version_type=git +bridge err=0 help=0 -while getopts wnp:sdbahcv: c; do +while getopts wnp:sahcv:e: c; do case $c in w) update_wui=1;; n) update_node=1;; p) update_pungi=$OPTARG;; s) include_src=1;; - d) update_app=1; app_type="-v";; - b) update_app=1; app_type="-b";; a) update_wui=1; update_node=1; update_app=1; update_pungi=init;; c) cleanup=1;; + e) bridge=$OPTARG;; v) version_type=$OPTARG;; h) help=1;; '?') err=1; warn "invalid option: \`-$OPTARG'";; @@ -79,7 +77,6 @@ while getopts wnp:sdbahcv: c; do done test $err = 1 && { try_h; exit 1; } test $help = 1 && { usage; exit 0; } -test $update_app = 1 -a -z "$app_type" && usage "Need to specify -d or -b" test $include_src = 1 -a "$update_pungi" = 0 && usage "Need to specify -p when including source" test "$update_pungi" != 0 -a "$update_pungi" != "init" \ @@ -262,17 +259,18 @@ repo --name=ovirt-org --baseurl=http://ovirt.org/repos/ovirt/$F_REL/x86_64 $excl EOF make cp wui-rel-*.ks $OVIRT + + bridge_flag+ if [ -n "$bridge" ]; then + bridge_flag="-e $bridge" + fi + ./create-wui-appliance.sh \ - -t http://$VIRBR/pungi/$F_REL/$ARCH/os \ - -k http://$VIRBR/ovirt/wui-rel-$ARCH.ks $app_type + -t http://$VIRBR/pungi/$F_REL/$ARCH/os \ + -k http://$VIRBR/ovirt/wui-rel-$ARCH.ks \ + $bridge_flag set +x echo "oVirt appliance setup started, check progress with:" - echo -n " virt-viewer " - if [[ "$app_type" == "-b" ]]; then - echo "bundled" - else - echo "developer" - fi - + echo -n " virt-viewer ovirt-appliance" fi diff --git a/wui-appliance/create-wui-appliance.sh b/wui-appliance/create-wui-appliance.sh index 18d7983..d77ba16 100755 --- a/wui-appliance/create-wui-appliance.sh +++ b/wui-appliance/create-wui-appliance.sh @@ -10,36 +10,34 @@ IMGSIZE=6000M ISO IMGDIR_DEFAULT=/var/lib/libvirt/images +NET_SCRIPTS=/etc/sysconfig/network-scripts ARCH_DEFAULT=$(uname -m) +NAME=ovirt-appliance +BRIDGENAME=ovirtbr ARCH=$ARCH_DEFAULT IMGDIR=$IMGDIR_DEFAULT CONSOLE_FLAG=--noautoconsole -# stupid bridge name so that if all of our checks below fail, we will still -# fail the install -BRIDGENAME=failme - usage() { case $# in 1) warn "$1"; try_h; exit 1;; esac cat <<EOF -Usage: $ME [-i install_iso | -t install_tree] [-d image_dir] [-a x86_64|i686] [-k kickstart] -v -b +Usage: $ME [-i install_iso | -t install_tree] [-d image_dir] [-a x86_64|i686] [-k kickstart] [-e eth] -i: location of installation ISO -t: location of installation tree -k: URL of kickstart file for use with installation tree -o: Display virt-viewer window during install (implied by -i option) -d: directory to place virtual disk (default: $IMGDIR_DEFAULT) -a: architecture for the virtual machine (default: $ARCH_DEFAULT) - -v: Install in developer mode (see http://ovirt.org for details) - -b: Install in bundled mode (see http://ovirt.org for details) + -e: ethernet device to use as bridge (i.e. eth1) -h: display this help and exit EOF } err=0 help=0 -devel=0 bundled=0 viewer=0 -while getopts :a:d:i:t:k:ohvb c; do +bridge+while getopts :a:d:i:t:k:ohe: c; do case $c in i) ISO=$OPTARG;; t) TREE=$OPTARG;; @@ -47,9 +45,8 @@ while getopts :a:d:i:t:k:ohvb c; do d) IMGDIR=$OPTARG;; a) ARCH=$OPTARG;; o) CONSOLE_FLAG=;; + e) bridge=$OPTARG;; h) help=1;; - v) devel=1;; - b) bundled=1;; '?') err=1; warn "invalid option: \`-$OPTARG'";; :) err=1; warn "missing argument to \`-$OPTARG' option";; *) err=1; warn "internal error: \`-$OPTARG' not handled";; @@ -83,9 +80,6 @@ else CONSOLE_FLAG fi -test $devel = 1 -a $bundled = 1 && usage "Can only specify one of -v and -b" -test $devel = 0 -a $bundled = 0 && usage "Must specify one of -v or -b" - case $ARCH in i686|x86_64);; *) usage "invalid architecture: \`$ARCH'";; @@ -125,7 +119,7 @@ gen_fake_managed_node() { <emulator>$KVM_BINARY</emulator> <interface type='network'> <mac address='00:16:3e:12:34:$last_mac'/> - <source network='dummybridge'/> + <source network='$BRIDGENAME'/> </interface> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='-1' listen='127.0.0.1'/> @@ -135,14 +129,12 @@ EOF } gen_app() { - local name=$1 - local disk=$2 - local bridge=$3 - local ram=$4 + local disk=$1 + local ram=$2 cat<<EOF <domain type='kvm'> - <name>$name</name> + <name>$NAME</name> <memory>$(( $ram * 1024 ))</memory> <currentMemory>$(( $ram * 1024 ))</currentMemory> <vcpu>1</vcpu> @@ -164,7 +156,7 @@ gen_app() { <source network='default'/> </interface> <interface type='network'> - <source network='$bridge'/> + <source network='$BRIDGENAME'/> </interface> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='-1' listen='127.0.0.1'/> @@ -194,27 +186,58 @@ fi if [ $CHECK -ne 0 ]; then # one of the previous packages wasn't installed; bail out - die "Must have the libvirt, kvm, virt-manager, and virt-viewer packages installed" + die "Must have the $PACKAGES packages installed" fi -if [ $devel = 1 ]; then - NAME=developer - BRIDGENAME=dummybridge - - # define the fake managed nodes we will use - for i in `seq 3 5` ; do - virsh destroy node$i >& /dev/null - virsh undefine node$i >& /dev/null - TMPXML=$(mktemp) - gen_fake_managed_node $i > $TMPXML - virsh define $TMPXML - rm $TMPXML - done -elif [ $bundled = 1 ]; then - NAME=bundled - BRIDGENAME=eth1bridge +service libvirtd status > /dev/null 2>&1 \ + || service libvirtd start > /dev/null 2>&1 +chkconfig libvirtd on + +# Cleanup to handle older version of script that used these bridge names +{ + virsh net-destroy dummybridge + virsh net-undefine dummybridge + brctl delif eth1bridge eth1 + virsh net-destroy eth1bridge + virsh net-undefine eth1bridge +} > /dev/null 2>&1 + +# If we're bridging to a physical network, run some checks to make sure the +# choice of physical eth device is sane +if [ -n "$bridge" ]; then + # Check to see if the physical device is present + ifconfig $bridge > /dev/null 2>&1 ; bridge_dev_present=$? + test $bridge_dev_present != 0 \ + && die "$bridge device not present, aborting!" + + # Check to make sure that the system is not already using the interface + test -f $NET_SCRIPTS/ifcfg-$bridge \ + && die "$bridge defined in $NET_SCRIPTS, aborting!" + + # Check to see if the eth device is already tied to a non oVirt bridge + attached_bridge=$(brctl show \ + | awk -v BRIDGE=$bridge '$4~BRIDGE {print $1}') + test -n "$attached_bridge" -a "$attached_bridge" != "$BRIDGENAME" \ + && die "$bridge already attached to other bridge $attached_bridge" + + # Check to see if the eth device does not have an active inet address + ip address show dev $bridge \ + | grep "inet.*$bridge" > /dev/null 2>&1 ; bridge_dev_active=$? + test $bridge_dev_active == 0 \ + && die "$bridge device active with ip address, aborting!" fi +# define the fake managed nodes we will use. These can be used for both +# developer and bundled, since the bridge name/network config is the same +for i in `seq 3 5` ; do + virsh destroy node$i >& /dev/null + virsh undefine node$i >& /dev/null + TMPXML=$(mktemp) + gen_fake_managed_node $i > $TMPXML + virsh define $TMPXML + rm $TMPXML +done + virsh net-dumpxml $BRIDGENAME >& /dev/null RETVAL=$? if [ $( brctl show | grep -c $BRIDGENAME ) -ne 0 -a $RETVAL -ne 0 ]; then @@ -225,10 +248,20 @@ if [ $( brctl show | grep -c $BRIDGENAME ) -ne 0 -a $RETVAL -ne 0 ]; then exit 1 fi +# Remove old bridge device if it exists +sed -i "/# $BRIDGENAME/d" /etc/rc.d/rc.local +old_bridge=$(brctl show \ + | awk -v BRIDGENAME=$BRIDGENAME '$1~BRIDGENAME {print $4}') +if [ -n "$old_bridge" ]; then + echo "Removing old bridge $old_bridge" + ifconfig $old_bridge down + brctl delif $BRIDGENAME $old_bridge +fi + # TODO when virFileReadAll is fixed for stdin #virsh net-define <(gen_dummy) -virsh net-destroy $BRIDGENAME -virsh net-undefine $BRIDGENAME +virsh net-destroy $BRIDGENAME > /dev/null 2>&1 +virsh net-undefine $BRIDGENAME > /dev/null 2>&1 TMPXML=$(mktemp) || exit 1 gen_bridge $BRIDGENAME > $TMPXML virsh net-define $TMPXML @@ -236,14 +269,32 @@ rm $TMPXML virsh net-start $BRIDGENAME virsh net-autostart $BRIDGENAME -if [ $bundled = 1 ]; then - # unfortunately, these two can't be done by libvirt at the moment, so - # we do them by hand here - # FIXME: how do we make this persistent, so that we survive reboots? - /usr/sbin/brctl addif $BRIDGENAME eth1 - /sbin/ifconfig eth1 up +if [ -n "$bridge" ]; then + # FIXME: unfortunately, these two can't be done by libvirt at the + # moment, so we do them by hand here and persist the config by + # by adding to rc.local + echo "Adding new bridge $bridge" + TMPBRCTL=$(mktemp) || exit 1 + cat > $TMPBRCTL << EOF +brctl addif $BRIDGENAME $bridge # $BRIDGENAME +ifconfig $bridge up # $BRIDGENAME +EOF + chmod a+x $TMPBRCTL /etc/rc.d/rc.local + + cat $TMPBRCTL >> /etc/rc.d/rc.local + + $TMPBRCTL + rm $TMPBRCTL fi +# Cleanup to handle older version of script that used these domain names +{ + virsh destroy developer + virsh undefine developer + virsh destroy bundled + virsh undefine bundled +} > /dev/null 2>&1 + IMGNAME=$NAME.img mkdir -p $IMGDIR virsh destroy $NAME > /dev/null 2>&1 @@ -259,8 +310,8 @@ if [ $do_install = 1 ]; then else test ! -r $IMGDIR/$IMGNAME && die "Disk image not found at $IMGDIR/$IMGNAME" - TMPXML=$(mktemp) - gen_app $NAME $IMGDIR/$IMGNAME $BRIDGENAME $RAM > $TMPXML + TMPXML=$(mktemp) || exit 1 + gen_app $IMGDIR/$IMGNAME $RAM > $TMPXML virsh define $TMPXML rm $TMPXML echo "Application defined using disk located at $IMGDIR/$IMGNAME." -- 1.5.5.1
Darryl L. Pierce
2008-Jul-02 01:07 UTC
[Ovirt-devel] [PATCH] [REPOST] [DOC] Merge developer/bundled appliance into a single appliance: ovirt-appliance
Perry Myers wrote:> Signed-off-by: Perry Myers <pmyers at redhat.com> > --- > build-all.sh | 34 ++++---- > wui-appliance/create-wui-appliance.sh | 147 ++++++++++++++++++++++----------- > 2 files changed, 115 insertions(+), 66 deletions(-) > > diff --git a/build-all.sh b/build-all.sh > index 6e27957..ddeb15d 100755 > --- a/build-all.sh > +++ b/build-all.sh > @@ -29,16 +29,15 @@ DEP_RPMS="createrepo httpd kvm libvirt livecd-tools pungi-1.2.18.1" > usage() { > case $# in 1) warn "$1"; try_h; exit 1;; esac > cat <<EOF > -Usage: $ME [-w] [-n] [-p init|update] [-s] [-d|-b] [-a] [-c] [-v git|release|none] > +Usage: $ME [-w] [-n] [-p init|update] [-s] [-a] [-c] [-v git|release|none] [-e eth] > -w: update oVirt WUI RPMs > -n: update oVirt Managed Node RPMs > -p: update pungi repository (init or update) > -s: include SRPMs and produce source ISO > - -d: update developer appliance > - -b: update bundled appliance > - -a: updates all (WUI, Node, App), requires -d or -b > + -a: updates all (WUI, Node, Appliance) > -c: cleanup old repos (pungi and ovirt) > -v: update version type (git, release, none) default is git > + -e: ethernet device to use as bridge (i.e. eth1) > -h: display this help and exit > EOF > } > @@ -57,19 +56,18 @@ update_wui=0 update_node=0 > update_pungi=0 update_app=0 > include_src=0 > cleanup=0 > -app_type> version_type=git > +bridge> err=0 help=0 > -while getopts wnp:sdbahcv: c; do > +while getopts wnp:sahcv:e: c; do > case $c in > w) update_wui=1;; > n) update_node=1;; > p) update_pungi=$OPTARG;; > s) include_src=1;; > - d) update_app=1; app_type="-v";; > - b) update_app=1; app_type="-b";; > a) update_wui=1; update_node=1; update_app=1; update_pungi=init;; > c) cleanup=1;; > + e) bridge=$OPTARG;; > v) version_type=$OPTARG;; > h) help=1;; > '?') err=1; warn "invalid option: \`-$OPTARG'";; > @@ -79,7 +77,6 @@ while getopts wnp:sdbahcv: c; do > done > test $err = 1 && { try_h; exit 1; } > test $help = 1 && { usage; exit 0; } > -test $update_app = 1 -a -z "$app_type" && usage "Need to specify -d or -b" > test $include_src = 1 -a "$update_pungi" = 0 && > usage "Need to specify -p when including source" > test "$update_pungi" != 0 -a "$update_pungi" != "init" \ > @@ -262,17 +259,18 @@ repo --name=ovirt-org --baseurl=http://ovirt.org/repos/ovirt/$F_REL/x86_64 $excl > EOF > make > cp wui-rel-*.ks $OVIRT > + > + bridge_flag> + if [ -n "$bridge" ]; then > + bridge_flag="-e $bridge" > + fi > + > ./create-wui-appliance.sh \ > - -t http://$VIRBR/pungi/$F_REL/$ARCH/os \ > - -k http://$VIRBR/ovirt/wui-rel-$ARCH.ks $app_type > + -t http://$VIRBR/pungi/$F_REL/$ARCH/os \ > + -k http://$VIRBR/ovirt/wui-rel-$ARCH.ks \ > + $bridge_flag > > set +x > echo "oVirt appliance setup started, check progress with:" > - echo -n " virt-viewer " > - if [[ "$app_type" == "-b" ]]; then > - echo "bundled" > - else > - echo "developer" > - fi > - > + echo -n " virt-viewer ovirt-appliance" > fi > diff --git a/wui-appliance/create-wui-appliance.sh b/wui-appliance/create-wui-appliance.sh > index 18d7983..d77ba16 100755 > --- a/wui-appliance/create-wui-appliance.sh > +++ b/wui-appliance/create-wui-appliance.sh > @@ -10,36 +10,34 @@ IMGSIZE=6000M > > ISO> IMGDIR_DEFAULT=/var/lib/libvirt/images > +NET_SCRIPTS=/etc/sysconfig/network-scripts > ARCH_DEFAULT=$(uname -m) > +NAME=ovirt-appliance > +BRIDGENAME=ovirtbr > > ARCH=$ARCH_DEFAULT > IMGDIR=$IMGDIR_DEFAULT > CONSOLE_FLAG=--noautoconsole > > -# stupid bridge name so that if all of our checks below fail, we will still > -# fail the install > -BRIDGENAME=failme > - > usage() { > case $# in 1) warn "$1"; try_h; exit 1;; esac > cat <<EOF > -Usage: $ME [-i install_iso | -t install_tree] [-d image_dir] [-a x86_64|i686] [-k kickstart] -v -b > +Usage: $ME [-i install_iso | -t install_tree] [-d image_dir] [-a x86_64|i686] [-k kickstart] [-e eth] > -i: location of installation ISO > -t: location of installation tree > -k: URL of kickstart file for use with installation tree > -o: Display virt-viewer window during install (implied by -i option) > -d: directory to place virtual disk (default: $IMGDIR_DEFAULT) > -a: architecture for the virtual machine (default: $ARCH_DEFAULT) > - -v: Install in developer mode (see http://ovirt.org for details) > - -b: Install in bundled mode (see http://ovirt.org for details) > + -e: ethernet device to use as bridge (i.e. eth1) > -h: display this help and exit > EOF > } > > err=0 help=0 > -devel=0 bundled=0 > viewer=0 > -while getopts :a:d:i:t:k:ohvb c; do > +bridge> +while getopts :a:d:i:t:k:ohe: c; do > case $c in > i) ISO=$OPTARG;; > t) TREE=$OPTARG;; > @@ -47,9 +45,8 @@ while getopts :a:d:i:t:k:ohvb c; do > d) IMGDIR=$OPTARG;; > a) ARCH=$OPTARG;; > o) CONSOLE_FLAG=;; > + e) bridge=$OPTARG;; > h) help=1;; > - v) devel=1;; > - b) bundled=1;; > '?') err=1; warn "invalid option: \`-$OPTARG'";; > :) err=1; warn "missing argument to \`-$OPTARG' option";; > *) err=1; warn "internal error: \`-$OPTARG' not handled";; > @@ -83,9 +80,6 @@ else > CONSOLE_FLAG> fi > > -test $devel = 1 -a $bundled = 1 && usage "Can only specify one of -v and -b" > -test $devel = 0 -a $bundled = 0 && usage "Must specify one of -v or -b" > - > case $ARCH in > i686|x86_64);; > *) usage "invalid architecture: \`$ARCH'";; > @@ -125,7 +119,7 @@ gen_fake_managed_node() { > <emulator>$KVM_BINARY</emulator> > <interface type='network'> > <mac address='00:16:3e:12:34:$last_mac'/> > - <source network='dummybridge'/> > + <source network='$BRIDGENAME'/> > </interface> > <input type='mouse' bus='ps2'/> > <graphics type='vnc' port='-1' listen='127.0.0.1'/> > @@ -135,14 +129,12 @@ EOF > } > > gen_app() { > - local name=$1 > - local disk=$2 > - local bridge=$3 > - local ram=$4 > + local disk=$1 > + local ram=$2 > > cat<<EOF > <domain type='kvm'> > - <name>$name</name> > + <name>$NAME</name> > <memory>$(( $ram * 1024 ))</memory> > <currentMemory>$(( $ram * 1024 ))</currentMemory> > <vcpu>1</vcpu> > @@ -164,7 +156,7 @@ gen_app() { > <source network='default'/> > </interface> > <interface type='network'> > - <source network='$bridge'/> > + <source network='$BRIDGENAME'/> > </interface> > <input type='mouse' bus='ps2'/> > <graphics type='vnc' port='-1' listen='127.0.0.1'/> > @@ -194,27 +186,58 @@ fi > > if [ $CHECK -ne 0 ]; then > # one of the previous packages wasn't installed; bail out > - die "Must have the libvirt, kvm, virt-manager, and virt-viewer packages installed" > + die "Must have the $PACKAGES packages installed" > fi > > -if [ $devel = 1 ]; then > - NAME=developer > - BRIDGENAME=dummybridge > - > - # define the fake managed nodes we will use > - for i in `seq 3 5` ; do > - virsh destroy node$i >& /dev/null > - virsh undefine node$i >& /dev/null > - TMPXML=$(mktemp) > - gen_fake_managed_node $i > $TMPXML > - virsh define $TMPXML > - rm $TMPXML > - done > -elif [ $bundled = 1 ]; then > - NAME=bundled > - BRIDGENAME=eth1bridge > +service libvirtd status > /dev/null 2>&1 \ > + || service libvirtd start > /dev/null 2>&1 > +chkconfig libvirtd on > + > +# Cleanup to handle older version of script that used these bridge names > +{ > + virsh net-destroy dummybridge > + virsh net-undefine dummybridge > + brctl delif eth1bridge eth1 > + virsh net-destroy eth1bridge > + virsh net-undefine eth1bridge > +} > /dev/null 2>&1 > + > +# If we're bridging to a physical network, run some checks to make sure the > +# choice of physical eth device is sane > +if [ -n "$bridge" ]; then > + # Check to see if the physical device is present > + ifconfig $bridge > /dev/null 2>&1 ; bridge_dev_present=$? > + test $bridge_dev_present != 0 \ > + && die "$bridge device not present, aborting!" > + > + # Check to make sure that the system is not already using the interface > + test -f $NET_SCRIPTS/ifcfg-$bridge \ > + && die "$bridge defined in $NET_SCRIPTS, aborting!" > + > + # Check to see if the eth device is already tied to a non oVirt bridge > + attached_bridge=$(brctl show \ > + | awk -v BRIDGE=$bridge '$4~BRIDGE {print $1}') > + test -n "$attached_bridge" -a "$attached_bridge" != "$BRIDGENAME" \ > + && die "$bridge already attached to other bridge $attached_bridge" > + > + # Check to see if the eth device does not have an active inet address > + ip address show dev $bridge \ > + | grep "inet.*$bridge" > /dev/null 2>&1 ; bridge_dev_active=$? > + test $bridge_dev_active == 0 \ > + && die "$bridge device active with ip address, aborting!" > fi > > +# define the fake managed nodes we will use. These can be used for both > +# developer and bundled, since the bridge name/network config is the same > +for i in `seq 3 5` ; do > + virsh destroy node$i >& /dev/null > + virsh undefine node$i >& /dev/null > + TMPXML=$(mktemp) > + gen_fake_managed_node $i > $TMPXML > + virsh define $TMPXML > + rm $TMPXML > +done > + > virsh net-dumpxml $BRIDGENAME >& /dev/null > RETVAL=$? > if [ $( brctl show | grep -c $BRIDGENAME ) -ne 0 -a $RETVAL -ne 0 ]; then > @@ -225,10 +248,20 @@ if [ $( brctl show | grep -c $BRIDGENAME ) -ne 0 -a $RETVAL -ne 0 ]; then > exit 1 > fi > > +# Remove old bridge device if it exists > +sed -i "/# $BRIDGENAME/d" /etc/rc.d/rc.local > +old_bridge=$(brctl show \ > + | awk -v BRIDGENAME=$BRIDGENAME '$1~BRIDGENAME {print $4}') > +if [ -n "$old_bridge" ]; then > + echo "Removing old bridge $old_bridge" > + ifconfig $old_bridge down > + brctl delif $BRIDGENAME $old_bridge > +fi > + > # TODO when virFileReadAll is fixed for stdin > #virsh net-define <(gen_dummy) > -virsh net-destroy $BRIDGENAME > -virsh net-undefine $BRIDGENAME > +virsh net-destroy $BRIDGENAME > /dev/null 2>&1 > +virsh net-undefine $BRIDGENAME > /dev/null 2>&1 > TMPXML=$(mktemp) || exit 1 > gen_bridge $BRIDGENAME > $TMPXML > virsh net-define $TMPXML > @@ -236,14 +269,32 @@ rm $TMPXML > virsh net-start $BRIDGENAME > virsh net-autostart $BRIDGENAME > > -if [ $bundled = 1 ]; then > - # unfortunately, these two can't be done by libvirt at the moment, so > - # we do them by hand here > - # FIXME: how do we make this persistent, so that we survive reboots? > - /usr/sbin/brctl addif $BRIDGENAME eth1 > - /sbin/ifconfig eth1 up > +if [ -n "$bridge" ]; then > + # FIXME: unfortunately, these two can't be done by libvirt at the > + # moment, so we do them by hand here and persist the config by > + # by adding to rc.local > + echo "Adding new bridge $bridge" > + TMPBRCTL=$(mktemp) || exit 1 > + cat > $TMPBRCTL << EOF > +brctl addif $BRIDGENAME $bridge # $BRIDGENAME > +ifconfig $bridge up # $BRIDGENAME > +EOF > + chmod a+x $TMPBRCTL /etc/rc.d/rc.local > + > + cat $TMPBRCTL >> /etc/rc.d/rc.local > + > + $TMPBRCTL > + rm $TMPBRCTL > fi > > +# Cleanup to handle older version of script that used these domain names > +{ > + virsh destroy developer > + virsh undefine developer > + virsh destroy bundled > + virsh undefine bundled > +} > /dev/null 2>&1 > + > IMGNAME=$NAME.img > mkdir -p $IMGDIR > virsh destroy $NAME > /dev/null 2>&1 > @@ -259,8 +310,8 @@ if [ $do_install = 1 ]; then > else > test ! -r $IMGDIR/$IMGNAME && die "Disk image not found at $IMGDIR/$IMGNAME" > > - TMPXML=$(mktemp) > - gen_app $NAME $IMGDIR/$IMGNAME $BRIDGENAME $RAM > $TMPXML > + TMPXML=$(mktemp) || exit 1 > + gen_app $IMGDIR/$IMGNAME $RAM > $TMPXML > virsh define $TMPXML > rm $TMPXML > echo "Application defined using disk located at $IMGDIR/$IMGNAME."ACK. -- Darryl L. Pierce, Sr. Software Engineer Red Hat, Inc. - http://www.redhat.com/ oVirt - Virtual Machine Management - http://www.ovirt.org/ "What do you care what other people think, Mr. Feynman?"