[Ovirt-devel] [PATCH] replace virt-install with appliance-creator in create-wui-appliance.sh

Perry N. Myers pmyers at redhat.com
Thu Jul 24 14:00:59 UTC 2008


Alan Pevec wrote:
> - use plain partitions in kickstart disk layout
> - use sparse files for iSCSI backing store (can't create LVMs on kpartx mappings)
> - add serial console to domain XML
> - option to produce qcow2 compressed image
> 
> ovirt.org repo contains appliance-tools-002-1.fc9
> which works with unmodified livecd-tools-017.1-1.fc9

Can't test this right now since I'm tied up, but...  ACK on the general 
ideas here and if this is tested and works commit it...

Perry

> Signed-off-by: Alan Pevec <apevec at redhat.com>
> ---
>  build-all.sh                          |   23 ++-----
>  wui-appliance/common-install.ks       |    8 +--
>  wui-appliance/common-pkgs.ks          |    5 +-
>  wui-appliance/create-wui-appliance.sh |  118 ++++++++++++++-------------------
>  wui-appliance/wui-devel.ks            |   46 +++++++------
>  5 files changed, 87 insertions(+), 113 deletions(-)
> 
> diff --git a/build-all.sh b/build-all.sh
> index 26d6009..5819d37 100755
> --- a/build-all.sh
> +++ b/build-all.sh
> @@ -35,7 +35,7 @@ Usage: $ME [-w] [-n] [-p init|update] [-s] [-a] [-c] [-v git|release|none] [-e e
>    -p: update pungi repository (init or update)
>    -s: include SRPMs and produce source ISO
>    -a: updates all (WUI, Node, Appliance)
> -  -c: cleanup old repos (pungi and ovirt)
> +  -c: cleanup local 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
> @@ -65,10 +65,10 @@ while getopts wnp:sahcv:e: c; do
>          n) update_node=1;;
>          p) update_pungi=$OPTARG;;
>          s) include_src=1;;
> -        a) update_wui=1; update_node=1; update_app=1; update_pungi=init;;
> +        a) update_wui=1; update_node=1; update_app=1;;
>          c) cleanup=1;;
> -        e) bridge=$OPTARG;;
>          v) version_type=$OPTARG;;
> +        e) bridge=$OPTARG;;
>          h) help=1;;
>        '?') err=1; warn "invalid option: \`-$OPTARG'";;
>          :) err=1; warn "missing argument to \`-$OPTARG' option";;
> @@ -234,23 +234,17 @@ EOF
>  fi
>  
>  # build oVirt admin appliance
> -# NOTE: create-wui-appliance.sh must be run as root
>  if [ $update_app == 1 ]; then
> -    # FIXME: This can go away once we have livecd tools building the appliances
> -    VIRBR=$(virsh net-dumpxml default \
> -	    | sed -n "s/^ *<ip address='\([^']*\)' .*/\1/p")
> -    test -z $VIRBR && die "Could not get ip address of default network for app"
> -
>      cd $BASE/wui-appliance
>      make clean
>      cat > repos.ks << EOF
> -url --url http://$VIRBR/pungi/$F_REL/$ARCH/os
> +url --url http://localhost/pungi/$F_REL/$ARCH/os
>  EOF
>      excludepkgs=
>      if [[ -f $OVIRT/repodata/repomd.xml ]]; then
>          excludepkgs='--excludepkgs=ovirt*'
>          cat >> repos.ks << EOF
> -repo --name=ovirt --baseurl=http://$VIRBR/ovirt
> +repo --name=ovirt --baseurl=http://localhost/ovirt
>  EOF
>      fi
>      cat >> repos.ks << EOF
> @@ -258,7 +252,6 @@ repo --name=ovirt-org --baseurl=http://ovirt.org/repos/ovirt/$F_REL/$ARCH $exclu
>  
>  EOF
>      make
> -    cp wui-rel.ks $OVIRT
>  
>      bridge_flag=
>      if [ -n "$bridge" ]; then
> @@ -266,11 +259,7 @@ EOF
>      fi
>  
>      ./create-wui-appliance.sh \
> -        -t http://$VIRBR/pungi/$F_REL/$ARCH/os \
> -        -k http://$VIRBR/ovirt/wui-rel.ks \
> +        -k wui-rel.ks \
>          $bridge_flag
>  
> -    set +x
> -    echo "oVirt appliance setup started, check progress with:"
> -    echo -n "  virt-viewer ovirt-appliance"
>  fi
> diff --git a/wui-appliance/common-install.ks b/wui-appliance/common-install.ks
> index 36eb28d..c9cbb0a 100644
> --- a/wui-appliance/common-install.ks
> +++ b/wui-appliance/common-install.ks
> @@ -16,9 +16,7 @@ bootloader --location=mbr --driveorder=sda
>  # not guaranteed to work
>  zerombr
>  clearpart --all --drives=sda
> -part /boot --fstype ext3 --size=100 --ondisk=sda
> -part pv.2 --size=1 --grow --ondisk=sda
> -volgroup VolGroup00 --pesize=32768 pv.2
> -logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=512
> -logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow
> +part /boot  --ondisk=sda --fstype=ext3 --size=100
> +part /      --ondisk=sda --fstype=ext3 --size=5000
> +part swap   --ondisk=sda --fstype=swap --size=512
>  reboot
> diff --git a/wui-appliance/common-pkgs.ks b/wui-appliance/common-pkgs.ks
> index 34546a7..7a8866c 100644
> --- a/wui-appliance/common-pkgs.ks
> +++ b/wui-appliance/common-pkgs.ks
> @@ -1,4 +1,5 @@
>  @core
> +kernel
>  cronie
>  policycoreutils
>  chkconfig
> @@ -19,6 +20,8 @@ firefox
>  gtk-vnc-plugin
>  xorg-x11-xauth
>  virt-viewer
> +rhpl
>  cobbler
>  bind-utils
> -
> +augeas
> +/usr/sbin/lokkit
> diff --git a/wui-appliance/create-wui-appliance.sh b/wui-appliance/create-wui-appliance.sh
> index d77ba16..2a3eb3c 100755
> --- a/wui-appliance/create-wui-appliance.sh
> +++ b/wui-appliance/create-wui-appliance.sh
> @@ -11,40 +11,31 @@ 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
>  
>  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] [-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)
> +Usage: $ME [-c] [-d image_dir] [-k kickstart] [-e eth]
>    -d: directory to place virtual disk (default: $IMGDIR_DEFAULT)
> -  -a: architecture for the virtual machine (default: $ARCH_DEFAULT)
> +  -c: compress the image (qcow2 compressed)
> +  -k: appliance kickstart file
>    -e: ethernet device to use as bridge (i.e. eth1)
>    -h: display this help and exit
>  EOF
>  }
>  
>  err=0 help=0
> -viewer=0
> +compress=0
>  bridge=
> -while getopts :a:d:i:t:k:ohe: c; do
> +while getopts :d:k:he: c; do
>      case $c in
> -        i) ISO=$OPTARG;;
> -        t) TREE=$OPTARG;;
> -        k) KICKSTART=$OPTARG;;
>          d) IMGDIR=$OPTARG;;
> -        a) ARCH=$OPTARG;;
> -        o) CONSOLE_FLAG=;;
> +        c) compress=1;;
> +        k) KICKSTART=$OPTARG;;
>          e) bridge=$OPTARG;;
>          h) help=1;;
>          '?') err=1; warn "invalid option: \`-$OPTARG'";;
> @@ -55,36 +46,6 @@ done
>  test $err = 1 && { try_h; exit 1; }
>  test $help = 1 && { usage; exit 0; }
>  
> -test -n "$ISO" -a -n "$TREE" && usage "Can only specify one of -i and -t"
> -
> -if [ -n "$ISO" ]; then
> -    test -n "$KICKSTART" && usage "-k not valid in conjunction with -i"
> -    test -r "$ISO" || usage "missing or unreadable ISO file: \`$ISO'"
> -    cdrom_arg="-c $ISO"
> -    # If we're installing from an ISO, we need console to provide kickstart
> -    CONSOLE_FLAG=
> -    do_install=1
> -elif [ -n "$TREE" ]; then
> -    location_arg="-l $TREE"
> -    do_install=1
> -else
> -    do_install=0
> -fi
> -
> -if [ -n "$KICKSTART" ]; then
> -    extra_flag=-x
> -    extra_arg="ksdevice=eth0 ks=$KICKSTART"
> -else
> -    # If we didn't provide a kickstart, we need console access to provide
> -    # one at boot time
> -    CONSOLE_FLAG=
> -fi
> -
> -case $ARCH in
> -    i686|x86_64);;
> -    *) usage "invalid architecture: \`$ARCH'";;
> -esac
> -
>  gen_bridge() {
>      name=$1
>      cat << EOF
> @@ -121,6 +82,12 @@ gen_fake_managed_node() {
>        <mac address='00:16:3e:12:34:$last_mac'/>
>        <source network='$BRIDGENAME'/>
>      </interface>
> +    <serial type='pty'>
> +      <target port='0'/>
> +    </serial>
> +    <console type='pty'>
> +      <target port='0'/>
> +    </console>
>      <input type='mouse' bus='ps2'/>
>      <graphics type='vnc' port='-1' listen='127.0.0.1'/>
>    </devices>
> @@ -158,6 +125,12 @@ gen_app() {
>      <interface type='network'>
>        <source network='$BRIDGENAME'/>
>      </interface>
> +    <serial type='pty'>
> +      <target port='0'/>
> +    </serial>
> +    <console type='pty'>
> +      <target port='0'/>
> +    </console>
>      <input type='mouse' bus='ps2'/>
>      <graphics type='vnc' port='-1' listen='127.0.0.1'/>
>    </devices>
> @@ -241,11 +214,11 @@ done
>  virsh net-dumpxml $BRIDGENAME >& /dev/null
>  RETVAL=$?
>  if [ $( brctl show | grep -c $BRIDGENAME ) -ne 0 -a $RETVAL -ne 0 ]; then
> -	# in this case, the bridge exists, but isn't managed by libvirt
> -	# abort, since the user will have to clean up themselves
> -	echo "Bridge $BRIDGENAME already exists.  Please make sure you"
> -	echo "unconfigure $BRIDGENAME, and then try the command again"
> -	exit 1
> +    # in this case, the bridge exists, but isn't managed by libvirt
> +    # abort, since the user will have to clean up themselves
> +    echo "Bridge $BRIDGENAME already exists.  Please make sure you"
> +    echo "unconfigure $BRIDGENAME, and then try the command again"
> +    exit 1
>  fi
>  
>  # Remove old bridge device if it exists
> @@ -258,8 +231,6 @@ if [ -n "$old_bridge" ]; then
>      brctl delif $BRIDGENAME $old_bridge
>  fi
>  
> -# TODO when virFileReadAll is fixed for stdin
> -#virsh net-define <(gen_dummy)
>  virsh net-destroy $BRIDGENAME > /dev/null 2>&1
>  virsh net-undefine $BRIDGENAME > /dev/null 2>&1
>  TMPXML=$(mktemp) || exit 1
> @@ -300,20 +271,29 @@ mkdir -p $IMGDIR
>  virsh destroy $NAME > /dev/null 2>&1
>  virsh undefine $NAME > /dev/null 2>&1
>  
> -if [ $do_install = 1 ]; then
> -    rm -f "$IMGDIR/$IMGNAME"
> -    qemu-img create -f qcow2 "$IMGDIR/$IMGNAME" $IMGSIZE
> -    virt-install -n $NAME -r $RAM -f "$IMGDIR/$IMGNAME" --vnc \
> -        --accelerate -v --os-type=linux --arch=$ARCH \
> -        -w network:default -w network:$BRIDGENAME \
> -        $location_arg $cdrom_arg $extra_flag "$extra_arg" --noacpi $CONSOLE_FLAG
> -else
> -    test ! -r $IMGDIR/$IMGNAME && die "Disk image not found at $IMGDIR/$IMGNAME"
> -
> -    TMPXML=$(mktemp) || exit 1
> -    gen_app $IMGDIR/$IMGNAME $RAM > $TMPXML
> -    virsh define $TMPXML
> -    rm $TMPXML
> -    echo "Application defined using disk located at $IMGDIR/$IMGNAME."
> -    echo "Run virsh start $NAME to start the appliance"
> +if [ -n "$KICKSTART" ]; then
> +    mkdir -p tmp
> +    appliance-creator --config $KICKSTART --name $NAME --tmpdir $(pwd)/tmp
> +    # FIXME add --compress option to appliance-creator
> +    if [ $compress -ne 0 ]; then
> +        echo -n "Compressing the image..."
> +        qemu-img convert -c $NAME-sda.raw -O qcow2 "$IMGDIR/$IMGNAME"
> +        rm ovirt-appliance-sda.raw
> +        echo "done"
> +    else
> +        echo -n "Moving the image..."
> +        mv ovirt-appliance-sda.raw "$IMGDIR/$IMGNAME"
> +        restorecon -v "$IMGDIR/$IMGNAME"
> +        echo "done"
> +    fi
>  fi
> +
> +test ! -r $IMGDIR/$IMGNAME && die "Disk image not found at $IMGDIR/$IMGNAME"
> +
> +TMPXML=$(mktemp) || exit 1
> +# FIXME virt-image to define the appliance instance
> +gen_app $IMGDIR/$IMGNAME $RAM > $TMPXML
> +virsh define $TMPXML
> +rm $TMPXML
> +echo "Application defined using disk located at $IMGDIR/$IMGNAME."
> +echo "Run virsh start $NAME to start the appliance"
> diff --git a/wui-appliance/wui-devel.ks b/wui-appliance/wui-devel.ks
> index 2903a19..e36f3a7 100644
> --- a/wui-appliance/wui-devel.ks
> +++ b/wui-appliance/wui-devel.ks
> @@ -2,12 +2,7 @@ install
>  
>  %include common-install.ks
>  
> -network --device=eth1 --bootproto=static --ip=192.168.50.2 --netmask=255.255.255.0 --onboot=on --nameserver=192.168.50.2
> -
> -# Create some fake iSCSI partitions
> -logvol /iscsi3 --name=iSCSI3 --vgname=VolGroup00 --size=64
> -logvol /iscsi4 --name=iSCSI4 --vgname=VolGroup00 --size=64
> -logvol /iscsi5 --name=iSCSI5 --vgname=VolGroup00 --size=64
> +network --device=eth1 --bootproto=static --ip=192.168.50.2 --netmask=255.255.255.0 --onboot=on --nameserver=192.168.50.2 --hostname=management.priv.ovirt.org
>  
>  %include repos.ks
>  
> @@ -20,12 +15,19 @@ exec > /root/kickstart-post.log 2>&1
>  
>  %include common-post.ks
>  
> -# make sure our "hostname" resolves to management.priv.ovirt.org
> -sed -i -e 's/^HOSTNAME.*/HOSTNAME=management.priv.ovirt.org/' \
> -  /etc/sysconfig/network
> +# FIXME [PATCH] fix SelinuxConfig firewall side-effect
> +lokkit -f --nostart --disabled
> +# FIXME imgcreate.kickstart.NetworkConfig doesn't store nameserver into ifcfg-*
> +#       only in resolv.conf which gets overwritten by dhclient-script
> +augtool <<EOF
> +set /files/etc/sysconfig/network-scripts/ifcfg-eth0/PEERDNS no
> +set /files/etc/sysconfig/network-scripts/ifcfg-eth1/DNS1 192.168.50.2
> +save
> +EOF
>  
>  # make sure to update the /etc/hosts with the list of all possible DHCP
>  # addresses we can hand out; dnsmasq uses this
> +sed -i -e 's/management\.priv\.ovirt\.org//' /etc/hosts
>  echo "192.168.50.2 management.priv.ovirt.org" >> /etc/hosts
>  for i in `seq 3 252` ; do
>      echo "192.168.50.$i node$i.priv.ovirt.org" >> /etc/hosts
> @@ -75,9 +77,11 @@ IsRelative=1
>  Path=$ff_profile_dir
>  EOF
>  
> -# make sure we don't mount the "fake" iSCSI LUNs, since they are meant to
> -# be exported
> -sed -i -e '/\/dev\/VolGroup00\/iSCSI[0-9].*/d' /etc/fstab
> +# Create sparse files for iSCSI backing stores
> +mkdir -p /ovirtiscsi
> +for i in `seq 3 5`; do
> +    dd if=/dev/null of=/ovirtiscsi/iSCSI$i bs=1 count=1 seek=64M
> +done
>  
>  # make an NFS directory with some small, fake disks and export them via NFS
>  # to show off the NFS part of the WUI
> @@ -193,7 +197,7 @@ cat > /etc/init.d/ovirt-wui-dev << \EOF
>  #
>  # ovirt-wui-dev oVirt WUI Dev appliance service
>  #
> -# chkconfig: 3 60 40 
> +# chkconfig: 3 60 40
>  # description: ovirt dev wui appliance service
>  #
>  
> @@ -215,22 +219,22 @@ start() {
>          -O option:router,192.168.50.2 -O option:ntp-server,192.168.50.2 \
>          --dhcp-option=12 \
>          -R --local /priv.ovirt.org/ --server 192.168.122.1
> -    
> +
>      # Set up the fake iscsi target
>      tgtadm --lld iscsi --op new --mode target --tid 1 \
>          -T ovirtpriv:storage
> -    
> +
> +    #
> +    # Now associate them to the backing stores
>      #
> -    # Now associate them to the LVs
> -    # 
>      tgtadm --lld iscsi --op new --mode logicalunit --tid 1 \
> -        --lun 1 -b /dev/VolGroup00/iSCSI3
> +        --lun 1 -b /ovirtiscsi/iSCSI3
>      tgtadm --lld iscsi --op new --mode logicalunit --tid 1 \
> -        --lun 2 -b /dev/VolGroup00/iSCSI4
> +        --lun 2 -b /ovirtiscsi/iSCSI4
>      tgtadm --lld iscsi --op new --mode logicalunit --tid 1 \
> -        --lun 3 -b /dev/VolGroup00/iSCSI5
> +        --lun 3 -b /ovirtiscsi/iSCSI5
>  
> -    # 
> +    #
>      # Now make them available
>      #
>      tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

-- 
|=-        Red Hat, Engineering, Emerging Technologies, Boston        -=|
|=-                     Email: pmyers at redhat.com                      -=|
|=-         Office: +1 412 474 3552   Mobile: +1 703 362 9622         -=|
|=- GnuPG: E65E4F3D 88F9 F1C9 C2F3 1303 01FE 817C C5D2 8B91 E65E 4F3D -=|




More information about the ovirt-devel mailing list