Merge "rename test suite script"
[yardstick.git] / tools / yardstick-img-modify
index eba8547..13d4360 100755 (executable)
@@ -25,6 +25,7 @@
 #
 
 set -e
+set -x
 
 die() {
     echo "error: $1" >&2
@@ -47,6 +48,7 @@ md5sums_path="${release}/current/MD5SUMS"
 md5sums_url=${MD5SUMS_URL:-"https://${host}/${md5sums_path}"}
 
 imgfile="${workspace}/yardstick-${release}-server.img"
+raw_imgfile="${workspace}/yardstick-${release}-server.raw"
 filename=$(basename $image_url)
 
 # download and checksum base image, conditionally if local copy is outdated
@@ -55,25 +57,36 @@ download() {
     cd $workspace
     rm -f MD5SUMS # always download the checksum file to a detect stale image
     wget $md5sums_url
-    test -e $filename || wget -nc $image_url
+    test -e $filename || wget -nc --progress=dot:giga $image_url
     grep $filename MD5SUMS | md5sum -c ||
     if [ $? -ne 0 ]; then
         rm $filename
-        wget -nc $image_url
+        wget -nc --progress=dot:giga $image_url
         grep $filename MD5SUMS | md5sum -c
     fi
-    cp $filename $imgfile
+    qemu-img convert $filename $raw_imgfile
     cd -
 }
 
-# mount image using qemu-nbd
+# mount image
 setup() {
-    modprobe nbd max_part=16
-    qemu-nbd -c /dev/nbd0 $imgfile
-    partprobe /dev/nbd0
-
     mkdir -p $mountdir
-    mount /dev/nbd0p1 $mountdir
+
+    for i in $(seq 0 9); do
+        [ -a /dev/loop$i ] || mknod -m 660 /dev/loop$i b 7 $i
+    done
+
+    loopdevice=$(kpartx -l $raw_imgfile | head -1 | cut -f1 -d ' ')
+
+    kpartx -av $raw_imgfile
+
+    # for trouble shooting
+    sleep 2
+    dmsetup ls
+    fdisk -l /dev/${loopdevice:0:5} || true
+
+    mount /dev/mapper/$loopdevice $mountdir
+    mount -t proc none $mountdir/proc
 
     cp $cmd $mountdir/$(basename $cmd)
 }
@@ -83,25 +96,67 @@ modify() {
     # resolv.conf does not exist in base image, pass nameserver value from host
     nameserver_ip=$(grep -m 1 '^nameserver' \
         /etc/resolv.conf | awk '{ print $2 '})
+
+    # prevent init scripts from running during install
+    echo $'#!/bin/sh\nexit 101' >$mountdir/usr/sbin/policy-rc.d
+    chmod a+x $mountdir/usr/sbin/policy-rc.d
+
     chroot $mountdir /$(basename $cmd) $nameserver_ip
+
+    rm -rf $mountdir/usr/sbin/policy-rc.d
+
+    umount -f $mountdir/proc
+    umount $mountdir
+
+    qemu-img convert -c -o compat=0.10 -O qcow2 $raw_imgfile $imgfile
+
+    if dmsetup table | grep $loopdevice; then
+       dmsetup clear $loopdevice || true
+    fi
 }
 
 # cleanup (umount) the image
 cleanup() {
     # designed to be idempotent
+    mount | grep $mountdir/proc && umount $mountdir/proc
     mount | grep $mountdir && umount $mountdir
-    test -b /dev/nbd0 && partprobe /dev/nbd0
-    pgrep qemu-nbd && qemu-nbd -d /dev/nbd0
+    if [ -f $raw_imgfile ]; then
+        kpartx -dv $raw_imgfile || true
+    fi
+    rm -f $raw_imgfile
     rm -rf $mountdir
-    killall qemu-nbd 2> /dev/null || true
-    lsmod | grep nbd && rmmod nbd || true
+}
+
+exitcode=""
+error_trap()
+{
+    local rc=$?
+
+    set +e
+
+    if [ -z "$exitcode" ]; then
+        exitcode=$rc
+    fi
+
+    dmesg -T | tail -50
+
+    cleanup
+
+    echo "Image build failed with $exitcode"
+
+    exit $exitcode
 }
 
 main() {
     cleanup
+
+    trap "error_trap" EXIT SIGTERM
+
     download
     setup
     modify
+
+    trap - EXIT SIGTERM
     cleanup
 
     echo "the modified image is found here: $imgfile"