Add support for building images 02/802/2
authorHans Feldt <hans.feldt@ericsson.com>
Thu, 11 Jun 2015 12:33:10 +0000 (14:33 +0200)
committerHans Feldt <hans.feldt@ericsson.com>
Mon, 15 Jun 2015 11:00:43 +0000 (11:00 +0000)
Two scripts are added. One that will be installed in user's PATH
and one that is an example of how to modify an image from within.

See README for example and script for more info

Change-Id: Iab743f6e9105d5ba872ffba0512ffee954c6d830
JIRA: YARDSTICK-28
Signed-off-by: Hans Feldt <hans.feldt@ericsson.com>
setup.py
tools/README [new file with mode: 0644]
tools/ubuntu-server-cloudimg-modify.sh [new file with mode: 0755]
tools/yardstick-img-modify [new file with mode: 0755]

index 6881851..ff415ae 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -26,5 +26,6 @@ setup(
         'console_scripts': [
             'yardstick=yardstick.main:main',
         ],
-    }
+    },
+    scripts =['tools/yardstick-img-modify']
 )
diff --git a/tools/README b/tools/README
new file mode 100644 (file)
index 0000000..9477c89
--- /dev/null
@@ -0,0 +1,20 @@
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+This directory contains various utilities needed in the yardstick environment.
+
+yardstick-img-modify is a generic script (but ubuntu cloud image specific) that
+takes a another script as an argument. This second script does the actual
+modifications of the image. sudo is required since the base image is mounted
+using qemu's network block device support.
+
+Usage example:
+
+$ sudo yardstick-img-modify $HOME/yardstick/tools/ubuntu-server-cloudimg-modify.sh
+
diff --git a/tools/ubuntu-server-cloudimg-modify.sh b/tools/ubuntu-server-cloudimg-modify.sh
new file mode 100755 (executable)
index 0000000..c297789
--- /dev/null
@@ -0,0 +1,36 @@
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+#!/bin/bash
+
+# installs required packages
+# must be run from inside the image (either chrooted or running)
+
+set -ex
+
+if [ $# -eq 1 ]; then
+    nameserver_ip=$1
+
+    # /etc/resolv.conf is a symbolic link to /run, restore at end
+    rm /etc/resolv.conf
+    echo "nameserver $nameserver_ip" > /etc/resolv.conf
+fi
+
+# iperf3 only available for trusty in backports
+grep trusty /etc/apt/sources.list && \
+    echo "deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
+apt-get update
+apt-get install -y \
+    iperf3 \
+    lmbench \
+    stress
+
+# restore symlink
+ln -sf /run/resolvconf/resolv.conf /etc/resolv.conf
+
diff --git a/tools/yardstick-img-modify b/tools/yardstick-img-modify
new file mode 100755 (executable)
index 0000000..eba8547
--- /dev/null
@@ -0,0 +1,111 @@
+#!/bin/bash
+
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# yardstick-img-modify - download and modify a Ubuntu cloud image
+#
+# The actual customization is done by a script passed with an absolute path as
+# the only single argument. The command needs to be invoked as sudo
+#
+# Example invocation:
+# yardstick-img-modify /home/yardstick/tools/ubuntu-server-cloudimg-modify.sh
+#
+# Warning: the script will create files by default in:
+#   /tmp/workspace/yardstick
+# the files will be owned by root!
+#
+# TODO: image resize is needed if the base image is too small
+#
+
+set -e
+
+die() {
+    echo "error: $1" >&2
+    exit 1
+}
+
+test $# -eq 1 || die "no image specific script as argument"
+test $(id -u) -eq 0 || die "should invoke using sudo"
+
+cmd=$1
+test -x $cmd
+mountdir="/mnt/yardstick"
+
+workspace=${WORKSPACE:-"/tmp/workspace/yardstick"}
+host=${HOST:-"cloud-images.ubuntu.com"}
+release=${RELEASE:-"trusty"}
+image_path="${release}/current/${release}-server-cloudimg-amd64-disk1.img"
+image_url=${IMAGE_URL:-"https://${host}/${image_path}"}
+md5sums_path="${release}/current/MD5SUMS"
+md5sums_url=${MD5SUMS_URL:-"https://${host}/${md5sums_path}"}
+
+imgfile="${workspace}/yardstick-${release}-server.img"
+filename=$(basename $image_url)
+
+# download and checksum base image, conditionally if local copy is outdated
+download() {
+    test -d $workspace || mkdir -p $workspace
+    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
+    grep $filename MD5SUMS | md5sum -c ||
+    if [ $? -ne 0 ]; then
+        rm $filename
+        wget -nc $image_url
+        grep $filename MD5SUMS | md5sum -c
+    fi
+    cp $filename $imgfile
+    cd -
+}
+
+# mount image using qemu-nbd
+setup() {
+    modprobe nbd max_part=16
+    qemu-nbd -c /dev/nbd0 $imgfile
+    partprobe /dev/nbd0
+
+    mkdir -p $mountdir
+    mount /dev/nbd0p1 $mountdir
+
+    cp $cmd $mountdir/$(basename $cmd)
+}
+
+# modify image running a script using in a chrooted environment
+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 '})
+    chroot $mountdir /$(basename $cmd) $nameserver_ip
+}
+
+# cleanup (umount) the image
+cleanup() {
+    # designed to be idempotent
+    mount | grep $mountdir && umount $mountdir
+    test -b /dev/nbd0 && partprobe /dev/nbd0
+    pgrep qemu-nbd && qemu-nbd -d /dev/nbd0
+    rm -rf $mountdir
+    killall qemu-nbd 2> /dev/null || true
+    lsmod | grep nbd && rmmod nbd || true
+}
+
+main() {
+    cleanup
+    download
+    setup
+    modify
+    cleanup
+
+    echo "the modified image is found here: $imgfile"
+}
+
+main
+