summaryrefslogtreecommitdiffstats
path: root/.gitreview
AgeCommit message (Expand)AuthorFilesLines
2015-04-01Adding gitreviewAric Gardner1-0/+4
1'>71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
#!/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-dpdk-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-dpdk-modify /home/yardstick/tools/ubuntu-server-cloudimg-dpdk-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
set -x

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:-"wily"}
image_path="${release}/current/${release}-server-cloudimg-amd64-disk1.img"
image_url=${IMAGE_URL:-"https://${host}/${image_path}"}
sha256sums_path="${release}/current/SHA256SUMS"
sha256sums_url=${SHA256SUMS_URL:-"https://${host}/${sha256sums_path}"}

imgfile="${workspace}/yardstick-${release}-server"
raw_imgfile="${workspace}/yardstick-${release}-server.raw"
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 SHA256SUMS # always download the checksum file to a detect stale image
    wget $sha256sums_url
    test -e $filename || wget -nc $image_url
    grep $filename SHA256SUMS | sha256sum -c ||
    if [ $? -ne 0 ]; then
        rm $filename
        wget -nc $image_url
        grep $filename SHA256SUMS | sha256sum -c
    fi
    qemu-img convert $filename $raw_imgfile
    cd -
}

# mount image
setup() {
    mkdir -p $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 -a $raw_imgfile

    mount /dev/mapper/$loopdevice $mountdir
    mount -t proc none $mountdir/proc

    echo $loopdevice

    sudo resize2fs /dev/mapper/$loopdevice

    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 '})

    # 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
#    qemu-img convert -O vmdk $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
    if [ -f $raw_imgfile ]; then
        kpartx -dv $raw_imgfile || true
    fi
    rm -f $raw_imgfile
    rm -rf $mountdir
}

exitcode=""
error_trap()
{
    local rc=$?

    set +e

    if [ -z "$exitcode" ]; then
        exitcode=$rc
    fi

    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"
}

main