manila-image-elements/bin/manila-image-create
Victoria Martinez de la Cruz e2e7ef98d8 Fix package manager call for RHEL-based distros
Assuming users will be working with latests versions
for RHEL, Centos or Fedora, the requirement for EPEL
repo is not longer needed. This requirement was due
to argparse not being present in standard repos, something
that does not hold anymore.
For this reason, this patch set removes the installation
of the EPEL repo.
On the other hand, this patch set also makes an extra check
to use dnf when this script is run on Fedora. Since Fedora 22
dnf has been the default package manager instead of yum.

Change-Id: I9fcd47a0bf9302506949fa56efb42b77552710f6
Closes-Bug: #1611527
2016-08-12 18:17:38 -03:00

250 lines
7.5 KiB
Bash

#!/bin/bash
set -eu
set -o pipefail
SCRIPT_HOME=$(dirname $(readlink -f $0))
if [ -d $SCRIPT_HOME/../share/manila-elements ]; then
_PREFIX=$SCRIPT_HOME/../share/manila-elements
elif [ -d $SCRIPT_HOME/../../../elements ]; then
_PREFIX=$SCRIPT_HOME/../../..
else
_PREFIX=$SCRIPT_HOME/..
fi
export ELEMENTS_PATH=$_PREFIX/elements
# Detect which image should be created
# generic - qcow image for VM
# lxd - tar for LXD
MANILA_IMAGE_TYPE=${1:-"generic"}
if [ "$MANILA_IMAGE_TYPE" != "generic" ] && [ "$MANILA_IMAGE_TYPE" != "lxd" ]; then
echo -e "Image type $MANILA_IMAGE_TYPE is not supported."
exit 2
fi
echo
echo "Build image: $MANILA_IMAGE_TYPE"
echo
# Collect configuration
# --------------------
# Development options:
DIB_UPDATE_REQUESTED=${DIB_UPDATE_REQUESTED:-true}
USE_OFFLINE_MODE=${USE_OFFLINE_MODE:-"yes"}
ENABLE_DEBUG_MODE=${ENABLE_DEBUG_MODE:-"no"}
DISABLE_IMG_COMPRESSION=${DISABLE_IMG_COMPRESSION:-"no"}
# Manila user settings
MANILA_USER=${MANILA_USER:-"manila"}
MANILA_PASSWORD=${MANILA_PASSWORD:-"manila"}
MANILA_USER_AUTHORIZED_KEYS="None"
# Manila image settings
MANILA_IMG_ARCH=${MANILA_IMG_ARCH:-"i386"}
MANILA_IMG_OS=${MANILA_IMG_OS:-"manila-ubuntu-minimal"}
MANILA_IMG_OS_VER=${MANILA_IMG_OS_VER:-"trusty"}
MANILA_IMG_NAME=${MANILA_IMG_NAME:-"manila-service-image"}
MANILA_LXD_METADATA_PACKAGE_NAME=${MANILA_LXD_METADATA_PACKAGE_NAME:-"manila-lxd-meta"}
# Manila features
MANILA_ENABLE_NFS_SUPPORT=${MANILA_ENABLE_NFS_SUPPORT:-"yes"}
MANILA_ENABLE_CIFS_SUPPORT=${MANILA_ENABLE_CIFS_SUPPORT:-"yes"}
# Manila Generic share driver replication feature requires ZFS:
MANILA_ENABLE_ZFS_SUPPORT=${MANILA_ENABLE_ZFS_SUPPORT:-"no"}
# Verify configuration
# --------------------
if [ "$MANILA_IMAGE_TYPE" = "lxd" ]; then
REQUIRED_ELEMENTS="manila-container $MANILA_IMG_OS"
IMAGE_FORMAT="tar"
MANILA_ENABLE_ZFS_SUPPORT="no"
export INSTALL_KERNEL=false
else
REQUIRED_ELEMENTS="manila-ssh vm $MANILA_IMG_OS dhcp-all-interfaces"
IMAGE_FORMAT="qcow2"
fi
OPTIONAL_ELEMENTS=
OPTIONAL_DIB_ARGS=
if [ "$MANILA_ENABLE_CIFS_SUPPORT" != "yes" ] && [ "$MANILA_ENABLE_NFS_SUPPORT" != "yes" ]; then
echo "You should enable NFS or CIFS support for manila image."
fi
if [ "$MANILA_ENABLE_NFS_SUPPORT" = "yes" ]; then
if [ "$MANILA_IMAGE_TYPE" = "lxd" ]; then
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-ganesha-nfs manila-unfs3"
else
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-nfs"
fi
fi
if [ "$MANILA_ENABLE_CIFS_SUPPORT" = "yes" ]; then
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-cifs"
fi
if [ "$MANILA_ENABLE_ZFS_SUPPORT" = "yes" ]; then
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-zfs"
fi
if [ "$USE_OFFLINE_MODE" = "yes" ]; then
OPTIONAL_DIB_ARGS="$OPTIONAL_DIB_ARGS -offline"
fi
if [ "$ENABLE_DEBUG_MODE" = "yes" ]; then
OPTIONAL_DIB_ARGS="$OPTIONAL_DIB_ARGS -x"
MANILA_USER_AUTHORIZED_KEYS=${MANILA_USER_AUTHORIZED_KEYS:-"$HOME/.ssh/id_rsa.pub"}
fi
if [ "$DISABLE_IMG_COMPRESSION" = "yes" ]; then
OPTIONAL_DIB_ARGS="$OPTIONAL_DIB_ARGS -u"
fi
# Verify dependencies
# -------------------
if [ -e /etc/os-release ]; then
platform=$(cat /etc/os-release | awk -F= '/^ID=/ {print tolower($2);}')
# remove eventual quotes around ID=...
platform=$(echo $platform | sed -e 's,^",,;s,"$,,')
elif [ -e /etc/system-release ]; then
case "$(head -1 /etc/system-release)" in
"Red Hat Enterprise Linux Server"*)
platform=rhel
;;
"CentOS"*)
platform=centos
;;
*)
echo -e "Unknown value in /etc/system-release. Impossible to build images.\nAborting"
exit 2
;;
esac
else
echo -e "Unknown host OS. Impossible to build images.\nAborting"
exit 2
fi
is_installed() {
if [ "$platform" = 'ubuntu' ]; then
dpkg -s "$1" &> /dev/null
else
# centos, fedora, opensuse, or rhel
if ! rpm -q "$1" &> /dev/null; then
rpm -q "$(rpm -q --whatprovides "$1")"
fi
fi
}
need_required_packages() {
case "$platform" in
"ubuntu")
package_list="qemu kpartx"
;;
"fedora")
package_list="qemu-img kpartx"
;;
"opensuse")
package_list="qemu kpartx"
;;
"rhel" | "centos")
package_list="qemu-kvm qemu-img kpartx"
;;
*)
echo -e "Unknown platform '$platform' for the package list.\nAborting"
exit 2
;;
esac
for p in `echo $package_list`; do
if ! is_installed $p; then
return 0
fi
done
return 1
}
if need_required_packages; then
# install required packages if requested
if [ -n "$DIB_UPDATE_REQUESTED" ]; then
case "$platform" in
"ubuntu")
sudo apt-get update
sudo apt-get install $package_list -y
;;
"opensuse")
sudo zypper --non-interactive --gpg-auto-import-keys in $package_list
;;
"fedora" | "rhel" | "centos")
if [ ${platform} = "fedora" ]; then
sudo dnf install $package_list -y
else
sudo yum install $package_list -y
fi
;;
*)
echo -e "Unknown platform '$platform' for installing packages.\nAborting"
exit 2
;;
esac
else
echo "Missing one of the following packages: $package_list"
echo "Please install manually or rerun with the update option (-u)."
exit 1
fi
fi
# Export diskimage-builder settings
# ---------------------------------
export DIB_DEFAULT_INSTALLTYPE=package
export DIB_RELEASE=$MANILA_IMG_OS_VER
# User settings
export DIB_MANILA_USER_USERNAME=$MANILA_USER
export DIB_MANILA_USER_PASSWORD=$MANILA_PASSWORD
export DIB_MANILA_USER_AUTHORIZED_KEYS=$MANILA_USER_AUTHORIZED_KEYS
# Build image
# -----------
disk-image-create \
-t $IMAGE_FORMAT \
-a $MANILA_IMG_ARCH \
$OPTIONAL_DIB_ARGS \
-o $MANILA_IMG_NAME \
$OPTIONAL_ELEMENTS $REQUIRED_ELEMENTS
if [ "$MANILA_IMAGE_TYPE" = "lxd" ]; then
LXD_IMAGE_DIR=$_PREFIX/lxd-image.d
mkdir $LXD_IMAGE_DIR >/dev/null 2>&1 || rm -fR $LXD_IMAGE_DIR/*
mkdir $LXD_IMAGE_DIR/rootfs >/dev/null 2>&1 || rm -fR $LXD_IMAGE_DIR/rootfs/*
# Create LXD metadata package
cp -R $_PREFIX/data/lxd/meta/* $LXD_IMAGE_DIR
# Update creation timestamp in metafile
sed -i "s/%CREATION_DATE%/$(date +%s)/g" $LXD_IMAGE_DIR/metadata.yaml
# Create package
echo "Creating LXD metadata package..."
tar -cf $_PREFIX/$MANILA_LXD_METADATA_PACKAGE_NAME.tar \
-C $LXD_IMAGE_DIR templates metadata.yaml
echo "Done. Metadata could be found here: $_PREFIX/$MANILA_LXD_METADATA_PACKAGE_NAME.tar"
# Create sys and proc directories required by LXD
mkdir -p $LXD_IMAGE_DIR/tmp/sys >/dev/null 2>&1 || echo "sys folder already exists in rootfs."
mkdir -p $LXD_IMAGE_DIR/tmp/proc >/dev/null 2>&1 || echo "proc folder already exists in rootfs."
sudo $_PREFIX/tools/add_to_rootfs_tar $_PREFIX/$MANILA_IMG_NAME.tar \
$LXD_IMAGE_DIR/tmp/sys /./sys/
sudo $_PREFIX/tools/add_to_rootfs_tar $_PREFIX/$MANILA_IMG_NAME.tar \
$LXD_IMAGE_DIR/tmp/proc /./proc/
rm -fR $LXD_IMAGE_DIR/tmp
# Compress rootfs
echo "Compressing rootfs package..."
sudo xz -f $_PREFIX/$MANILA_IMG_NAME.tar
echo "Done. rootfs could be found here: $_PREFIX/$MANILA_IMG_NAME.tar.xz"
fi