Script to create the guest image 61/4561/5
authorYunhong Jiang <yunhong.jiang@linux.intel.com>
Wed, 9 Dec 2015 19:55:56 +0000 (14:55 -0500)
committerYunhong Jiang <yunhong.jiang@linux.intel.com>
Wed, 6 Jan 2016 03:32:48 +0000 (19:32 -0800)
This script download the latest CentOS cloud image and modify it to meet
the test requirement, including remove cloud related script, setup
the ssh keys etc.

It derives from yardstick project, which currently only provide support
to Ubuntu image. If they support CentOS image, we can possibly switch to
them.

Change-Id: I9482936615a28da696ff8f51248a62b13e5677f4
Signed-off-by: Yunhong Jiang <yunhong.jiang@linux.intel.com>
ci/envs/guest-cmd.sh [new file with mode: 0755]
ci/envs/guest-modify.sh [new file with mode: 0755]

diff --git a/ci/envs/guest-cmd.sh b/ci/envs/guest-cmd.sh
new file mode 100755 (executable)
index 0000000..abfa51a
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/bash
+##############################################################################
+## Copyright (c) 2015 Intel Corp.
+##
+## 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
+###############################################################################
+
diff --git a/ci/envs/guest-modify.sh b/ci/envs/guest-modify.sh
new file mode 100755 (executable)
index 0000000..1208dd3
--- /dev/null
@@ -0,0 +1,142 @@
+#!/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
+##############################################################################
+
+# This is copy from yardstick-img-modify on yardstick project. Currently 
+# yardstick script only ubuntu image, and this one is more for CentOS.
+# 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
+set -x
+
+die() {
+    echo "error: $1" >&2
+    exit 1
+}
+
+usage () {
+    echo "$0 cmd workspace"
+    exit 1
+}
+
+test $# -eq 2 || usage
+test $(id -u) -eq 0 || die "should invoke using sudo"
+
+ROOTDIR=$(cd $(dirname "$0")/../.. && pwd)
+cmd=$1
+test -x $cmd
+workspace=$2
+mountdir=`mktemp -d`
+
+image_url=${IMAGE_URL:-"http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1510.qcow2"}
+md5sums_url=${MD5SUMS_URL:-"http://cloud.centos.org/centos/7/images/sha256sum.txt"}
+
+imgfile="${workspace}/guest.img"
+raw_imgfile="${workspace}/guest.raw"
+filename=$(basename $image_url)
+md5filename=$(basename $md5sums_url)
+
+# download and checksum base image, conditionally if local copy is outdated
+download() {
+    test -d $workspace || mkdir -p $workspace
+    cd $workspace
+    rm -f $md5filename # always download the checksum file to a detect stale image
+    wget $md5sums_url
+    test -e $filename || wget -nc $image_url
+    grep "$filename\$" $md5filename |sha256sum -c
+    if [ $? -ne 0 ]; then
+        rm $filename
+        wget -nc $image_url
+        grep $filename $md5filename | md5sum -c
+    fi
+    rm -rf $raw_imgfile
+    qemu-img convert $filename $raw_imgfile
+    cd -
+}
+
+# mount image
+setup() {
+    mkdir -p $mountdir
+
+    loopdevice=$(kpartx -l $raw_imgfile | head -1 | cut -f1 -d ' ')
+
+    kpartx -a $raw_imgfile
+    # No idea why need this sleep
+    sleep 3
+    mount /dev/mapper/$loopdevice $mountdir
+
+    cp $cmd "$mountdir/"
+}
+
+# modify image running a script using in a chrooted environment
+modify() {
+    # Add the ssh key to the image
+    mkdir -p ${mountdir}/root/.ssh
+    cp ${ROOTDIR}/ci/envs/kvm4nfv_key.pub ${mountdir}/root/.ssh/authorized_keys
+    chmod 700 ${mountdir}/root/.ssh
+    chmod 600 ${mountdir}/root/.ssh/authorized_keys
+    
+
+    umount $mountdir
+
+    qemu-img convert -O qcow2 $raw_imgfile $imgfile
+}
+
+# cleanup (umount) the image
+cleanup() {
+    # designed to be idempotent
+    mount | grep $mountdir && umount $mountdir
+    kpartx -d $raw_imgfile || true
+    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