summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Feldt <hans.feldt@ericsson.com>2015-06-11 14:33:10 +0200
committerHans Feldt <hans.feldt@ericsson.com>2015-06-15 11:00:43 +0000
commit7492216de2f198e42bcd5e1539c8b21886a78d8c (patch)
tree1a538d8703806a9ad268c4c84af43112a6098c26
parent95c9ca879e2ea2add0bb03c6e40a36494729d30d (diff)
Add support for building images
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>
-rw-r--r--setup.py3
-rw-r--r--tools/README20
-rwxr-xr-xtools/ubuntu-server-cloudimg-modify.sh36
-rwxr-xr-xtools/yardstick-img-modify111
4 files changed, 169 insertions, 1 deletions
diff --git a/setup.py b/setup.py
index 688185185..ff415aecd 100644
--- 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
index 000000000..9477c8988
--- /dev/null
+++ b/tools/README
@@ -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
index 000000000..c2977896f
--- /dev/null
+++ b/tools/ubuntu-server-cloudimg-modify.sh
@@ -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
index 000000000..eba85473c
--- /dev/null
+++ b/tools/yardstick-img-modify
@@ -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
+