[Ovirt-devel] [PATCH] [REPOST] [DOC] Merge developer/bundled appliance into a single appliance: ovirt-appliance

Perry Myers pmyers at redhat.com
Tue Jul 1 21:53:14 UTC 2008


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




More information about the ovirt-devel mailing list