manila-image-elements/bin/manila-image-create
Goutham Pacha Ravi f75519fba5 Refactor cephfs element
DIB ignores a plain "install.d" directive
silently currently, producing images without
the packages we asked for.

Use the "package-installs" approach to install
element dependencies. No configuration is added
at the moment, but may be required in the future.

Also install the "fuse" package to get the ability
to execute "fusermount" command.

Change-Id: Ifbd7344b20940575348a856521539425b34a4279
Signed-off-by: Goutham Pacha Ravi <gouthampravi@gmail.com>
2020-05-26 22:43:25 -07:00

265 lines
7.7 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:-"amd64"}
MANILA_IMG_OS=${MANILA_IMG_OS:-"manila-ubuntu-minimal"}
MANILA_IMG_OS_VER=${MANILA_IMG_OS_VER:-"bionic"}
MANILA_IMG_NAME=${MANILA_IMG_NAME:-"manila-service-image"}
# Manila image creation default
MANILA_SHARE_PROTO=${MANILA_SHARE_PROTO:-"default"}
MANILA_DISTRO=${MANILA_DISTRO:-"ubuntu"}
# 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] [-d distro] [-h]"
echo "Options:"
echo " -s | --share-proto: name of the share protocol. \
Possible options are nfs, nfs-ganesha, cephfs, cifs or zfs"
echo " -d | --distro: name of the Linux distro. \
Possible options are ubuntu or centos"
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}" != "nfs-ganesha" ] &&
[ "${MANILA_SHARE_PROTO}" != "cifs" ] && [ "${MANILA_SHARE_PROTO}" != "zfs" ] &&
[ "${MANILA_SHARE_PROTO}" != "cephfs" ]; then
err "Protocol ${MANILA_SHARE_PROTO} not supported. Valid options are nfs, nfs-ganesha, cephfs, cifs or zfs."
exit 1
fi
}
valid_distro() {
if ["${MANILA_DISTRO}" != "ubuntu" ] && [ "${MANILA_DISTRO}" != "centos" ]; then
err "Distro ${MANILA_DISTRO} not supported. Valid options are ubuntu or centos."
exit 1
fi
}
parse_arguments() {
while [[ $# > 0 ]]; do
case "$1" in
-s|--share)
export MANILA_SHARE_PROTO=$2
valid_share_protocol
shift 2
;;
-d|--distro)
export MANILA_DISTRO=$2
export MANILA_IMG_OS=manila-$2-minimal
valid_distro
shift 2
;;
-h|--help)
print_usage
exit 0
;;
*)
err "Error: Unknown option: $1."
exit 1
;;
esac
done
}
# Verify configuration
# --------------------
configure() {
REQUIRED_ELEMENTS="manila-ssh vm $MANILA_IMG_OS dhcp-all-interfaces"
IMAGE_FORMAT="qcow2"
OPTIONAL_ELEMENTS=
OPTIONAL_DIB_ARGS=
if [ "$MANILA_SHARE_PROTO" = "default" ]; then
# NOTE(vkmc) Generic driver uses 2 protocols by default
# NFS and CIFS. This is required by the gate.
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS ${MANILA_DISTRO}-nfs ${MANILA_DISTRO}-cifs"
elif [ "$MANILA_SHARE_PROTO" = "nfs" ]; then
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS ${MANILA_DISTRO}-nfs"
elif [ "$MANILA_SHARE_PROTO" = "nfs-ganesha" ]; then
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS ${MANILA_DISTRO}-nfs-ganesha"
elif [ "$MANILA_SHARE_PROTO" = "cifs" ]; then
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS ${MANILA_DISTRO}-cifs"
elif [ "$MANILA_SHARE_PROTO" = "zfs" ]; then
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS ${MANILA_DISTRO}-zfs"
elif [ "$MANILA_SHARE_PROTO" = "cephfs" ]; then
OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS cephfs"
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 debootstrap"
;;
"fedora")
package_list="qemu-img kpartx debootstrap"
;;
"opensuse")
package_list="qemu kpartx debootstrap"
;;
"rhel" | "centos")
package_list="qemu-kvm qemu-img kpartx debootstrap"
;;
*)
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 "$@"