update opensuse element

This patch updates the openSuse element to work with the new
base image file format. It should be noted that the base image
file name has changed several times while updating this element,
and and may need to be set manually via the "BASE_IMAGE_NAME"
env var.

Change-Id: I4dac8bf9a4bf76a00d4a04cbf063fd245b11f3d6
This commit is contained in:
Chris Krelle 2014-04-22 16:44:37 -05:00
parent a1aa1e92dc
commit eed131c373
6 changed files with 83 additions and 10 deletions

View File

@ -53,8 +53,9 @@ done
# Packages that aren't available in the distro but requested for installation
# can be ignored by adding them to the exclude list
BLACKLIST=(dkms)
WHITELIST=""
BLACKLIST=('')
WHITELIST=('')
for i in "$@"
do
PKG_NAME=$i

View File

@ -0,0 +1,11 @@
#!/bin/bash
# Install requirments needed to build the image.
set -eu
set -o pipefail
# install kernel package needed by dkms.
install-packages kernel-devel
# sudo and lsb not included by default.
# so install them.
install-packages sudo lsb-release

View File

@ -1,5 +1,5 @@
#!/bin/bash
# The base tbz-image created by kiwi does not contain an initrd so create one
# The base image created by kiwi does not contain an initrd so create one
# here.
set -eu
@ -15,7 +15,9 @@ source $_LIB/img-defaults
# tmpfs even).
echo "rootfstype=$FS_TYPE" > /etc/sysconfig/initrd
mkinitrd -A
# openSuse mkinitrd requires a valid root device be in fstab.
sed -i 's/vda1/sda1/' /etc/fstab
mkinitrd -A -B
# And cleanup again
rm /etc/sysconfig/initrd

View File

@ -0,0 +1,7 @@
#!/bin/bash
# ensure we do not have a lost+found directory in the root folder
# that could cause copy to fail.
set -eu
set -o pipefail
rm -rf lost+found

View File

@ -0,0 +1,7 @@
#!/bin/bash
# Setup repo required for dkms package.
set -eu
set -o pipefail
zypper ar -f http://download.opensuse.org/repositories/X11:/Bumblebee/openSUSE_13.1/X11:Bumblebee.repo

View File

@ -3,6 +3,20 @@
set -eu
set -o pipefail
function find_free_nbd_device () {
# Return first free nbd device
return_device=''
for chk_device in /sys/class/block/nbd*; do
# find free nbd device by checking size field
size_chk=`cat $chk_device/size`
if [ "$size_chk" = "0" ]; then
# device looks free. lets use it.
return_device=$chk_device
break
fi
done
echo $return_device
}
[ -n "$ARCH" ]
[ -n "$TARGET_ROOT" ]
@ -17,7 +31,8 @@ fi
DIB_CLOUD_IMAGES=${DIB_CLOUD_IMAGES:-http://download.opensuse.org/repositories/Cloud:/Images/images/}
DIB_RELEASE=${DIB_RELEASE:-13.1}
# FIXME: Hard coded build numbers, versions, etc.
BASE_IMAGE_NAME=${BASE_IMAGE_NAME:-openSUSE-$DIB_RELEASE-OpenStack-Guest.$ARCH}
# NOTE: Actual file name seems unstable, and has changed several times.
BASE_IMAGE_NAME=${BASE_IMAGE_NAME:-openSUSE-$DIB_RELEASE-OS-guest.$ARCH-0.0.2-Build3.1}
if [ -z "$DIB_OFFLINE" ] ; then
# XXX: Try to extract the filename of the current built from the index
@ -26,7 +41,7 @@ if [ -z "$DIB_OFFLINE" ] ; then
# https://bugzilla.novell.com/show_bug.cgi?id=853882 is deployed
echo "Looking up current built of Base Image ($BASE_IMAGE_NAME):"
BASE_IMAGE_FILE=${BASE_IMAGE_FILE:-$(curl $DIB_CLOUD_IMAGES | \
sed -n "s/^.*\<a\ href\=\"\($BASE_IMAGE_NAME.*\.tbz\)\".*$/\1/p")}
sed -n "s/^.*\<a\ href\=\"\($BASE_IMAGE_NAME.*\.tar\.bz2\)\".*$/\1/p")}
if [ -n "$BASE_IMAGE_FILE" ]; then
echo "Using base image: $DIB_CLOUD_IMAGES/$BASE_IMAGE_FILE"
else
@ -35,7 +50,7 @@ if [ -z "$DIB_OFFLINE" ] ; then
exit 1
fi
else
BASE_IMAGE_FILE=${BASE_IMAGE_FILE:-$BASE_IMAGE_NAME-0.0.1-Build6.1.tbz}
BASE_IMAGE_FILE=${BASE_IMAGE_FILE:-$BASE_IMAGE_NAME-raw.tar.bz2}
fi
# FIXME: either check the checksums into git or verify the signature
@ -54,6 +69,36 @@ else
grep "$BASE_IMAGE_FILE" SHA256SUMS.openSUSE.$DIB_RELEASE.$ARCH | sha256sum --check -
popd
fi
# Extract the base image (use --numeric-owner to avoid possible UID/GID mismatch
# between image tarball and host OS)
sudo tar -C $TARGET_ROOT --numeric-owner -xjf $DIB_IMAGE_CACHE/$BASE_IMAGE_FILE
# Extract the qcow2 image and qcow2.sha256 files.
# to make life easier create a temp directory to unzip the files.
# TODO(NobodyCam): validate qcow2 with sha256 file
UNTAR_TO_LOCATION=$TMP_MOUNT_PATH/openSUSE/Untar
mkdir -p $UNTAR_TO_LOCATION
sudo tar -C $UNTAR_TO_LOCATION -xjf $DIB_IMAGE_CACHE/$BASE_IMAGE_FILE
# mount qcow
nbd_device=$(find_free_nbd_device)
mount_device=/dev/`basename $nbd_device`
sudo qemu-nbd -c $mount_device $UNTAR_TO_LOCATION/$BASE_IMAGE_NAME.qcow2
# Ensure that $mount_device is a block device.
if [ -b $mount_device ]; then
org_dir=`pwd`
# make a mount point for the image
mkdir $UNTAR_TO_LOCATION/mnt
# mount the images root partition
sudo mount ${mount_device}p1 $UNTAR_TO_LOCATION/mnt
# copy contents to the build area
cd $UNTAR_TO_LOCATION/mnt
sudo find . -print | sudo cpio -padmu $TARGET_ROOT
# ensure we are not in the directory about to be unmounted
cd $org_dir
echo "Copied $UNTAR_TO_LOCATION/mnt to $TARGET_ROOT"
# unmount and remove the device used for the copy
sudo umount $UNTAR_TO_LOCATION/mnt
sudo qemu-nbd -d $mount_device
else
echo "Unable to extract openSuSe Image."
exit 1
fi
# remove the temp directory
sudo rm -rf $UNTAR_TO_LOCATION