
This patch set refactors manila-image-create script to allow end users to pick which share protocol install on their images. This change slightly affects the current behavior of the script. If an image is created using tox -e buildimage (as stated by current docs) an Ubuntu Trusty Minimal image with NFS will be created. Now, calling manila-image-create with params, will generate an image with the filesystem protocol desired. Change-Id: I0419cbf9a39290d32409f7a5ab9dfaf5ca636bb7 Closes-Bug: #1643034
241 lines
6.5 KiB
Bash
Executable File
241 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -eu
|
|
set -o pipefail
|
|
|
|
# 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 image creation default
|
|
MANILA_SHARE_PROTO=${MANILA_SHARE_PROTO:-"nfs"}
|
|
|
|
# Path to elements
|
|
SCRIPT_HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
|
|
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
|
|
|
|
# diskimage-builder general settings
|
|
export DIB_DEFAULT_INSTALLTYPE=package
|
|
export DIB_RELEASE=$MANILA_IMG_OS_VER
|
|
|
|
# diskimage-builder 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
|
|
|
|
# CLI
|
|
# ---
|
|
err() {
|
|
echo -e "${0##*/}: $@" >&2
|
|
}
|
|
|
|
print_usage() {
|
|
echo "Usage: ${0##*/} [-s share-proto] [-h]"
|
|
echo "Options:"
|
|
echo " -s | --share-proto: name of the share protocol. Possible options are nfs, cifs or zfs"
|
|
echo " -h | --help: print this usage message and exit"
|
|
echo ""
|
|
echo "Usage example: manila_image_elements -s nfs"
|
|
}
|
|
|
|
valid_share_protocol(){
|
|
if [ "${MANILA_SHARE_PROTO}" != "nfs" ] && [ "${MANILA_SHARE_PROTO}" != "cifs" ] && [ "${MANILA_SHARE_PROTO}" != "zfs" ]; then
|
|
err "Protocol ${MANILA_SHARE_PROTO} not supported. Valid options are nfs, cifs or zfs."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
parse_arguments() {
|
|
while [[ $# > 0 ]]; do
|
|
case "$1" in
|
|
-s|--share)
|
|
export MANILA_SHARE_PROTO=$2
|
|
valid_share_protocol
|
|
shift 2
|
|
;;
|
|
-h|--help)
|
|
print_usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
err "Error: Unknown option: $1."
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# Verify configuration
|
|
# --------------------
|
|
REQUIRED_ELEMENTS="manila-ssh vm $MANILA_IMG_OS dhcp-all-interfaces"
|
|
IMAGE_FORMAT="qcow2"
|
|
OPTIONAL_ELEMENTS=
|
|
OPTIONAL_DIB_ARGS=
|
|
|
|
configure() {
|
|
OPTIONAL_ELEMENTS=
|
|
OPTIONAL_DIB_ARGS=
|
|
|
|
if [ "$MANILA_SHARE_PROTO" = "nfs" ]; then
|
|
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-nfs"
|
|
elif [ "$MANILA_SHARE_PROTO" = "cifs" ]; then
|
|
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-cifs"
|
|
elif [ "$MANILA_SHARE_PROTO" = "zfs" ]; 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
|
|
# -------------------
|
|
|
|
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"
|
|
;;
|
|
*)
|
|
err "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
|
|
}
|
|
|
|
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
|
|
;;
|
|
*)
|
|
err "Unknown value in /etc/system-release. Impossible to build images.\nAborting"
|
|
exit 2
|
|
;;
|
|
esac
|
|
else
|
|
err "Unknown host OS. Impossible to build images.\nAborting"
|
|
exit 2
|
|
fi
|
|
|
|
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
|
|
;;
|
|
*)
|
|
err "Unknown platform '$platform' for installing packages.\nAborting"
|
|
exit 2
|
|
;;
|
|
esac
|
|
else
|
|
err "Missing one of the following packages: $package_list"
|
|
err "Please install manually or rerun with the update option (-u)."
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Build image
|
|
# -----------
|
|
build_image() {
|
|
disk-image-create \
|
|
-t $IMAGE_FORMAT \
|
|
-a $MANILA_IMG_ARCH \
|
|
$OPTIONAL_DIB_ARGS \
|
|
-o $MANILA_IMG_NAME \
|
|
$OPTIONAL_ELEMENTS $REQUIRED_ELEMENTS
|
|
}
|
|
|
|
main() {
|
|
parse_arguments "$@"
|
|
configure
|
|
verify_dependencies
|
|
build_image
|
|
exit 0
|
|
}
|
|
|
|
main "$@"
|