From 7492216de2f198e42bcd5e1539c8b21886a78d8c Mon Sep 17 00:00:00 2001 From: Hans Feldt Date: Thu, 11 Jun 2015 14:33:10 +0200 Subject: 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 --- setup.py | 3 +- tools/README | 20 ++++++ tools/ubuntu-server-cloudimg-modify.sh | 36 +++++++++++ tools/yardstick-img-modify | 111 +++++++++++++++++++++++++++++++++ 4 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 tools/README create mode 100755 tools/ubuntu-server-cloudimg-modify.sh create mode 100755 tools/yardstick-img-modify 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 + -- cgit 1.2.3-korg