| #!/bin/bash |
| |
| ############################################################################## |
| # Copyright 2018 EuropeanSoftwareMarketingLtd. |
| # =================================================================== |
| # Licensed under the ApacheLicense, Version2.0 (the"License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # software distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and limitations under |
| # the License |
| ############################################################################## |
| # vnftest comment: this is a modified copy of |
| # yardstick/tools/vnftest-img-dpmdk-modify |
| |
| # vnftest-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: |
| # vnftest-img-dpdk-modify /home/vnftest/tools/ubuntu-server-cloudimg-dpdk-modify.sh |
| # |
| # Warning: the script will create files by default in: |
| # /tmp/workspace/vnftest |
| # 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/vnftest" |
| |
| workspace=${WORKSPACE:-"/tmp/workspace/vnftest"} |
| 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}/vnftest-${release}-server" |
| raw_imgfile="${workspace}/vnftest-${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 |