diff --git a/README.rst b/README.rst index 5dc5b9a..97d7a07 100644 --- a/README.rst +++ b/README.rst @@ -7,8 +7,9 @@ Team and repository tags .. Change things from this point on -Manila image elements project -============================== +============================= +Manila Image Elements Project +============================= This repo is a place for Manila-related diskimage-builder elements. @@ -19,14 +20,40 @@ This repo is a place for Manila-related diskimage-builder elements. Build instructions ------------------- +~~~~~~~~~~~~~~~~~~ + +Before building the image, make sure all system dependencies +listed in bindep.txt file, are installed. + +Default generic using tox +------------------------- Script for creating Ubuntu based image with our elements and default parameters. -Before building image make sure all system dependencies, -listed in other-requirements.txt file, are installed. -After it, you should only need to run this command: +You should only need to run this command: .. sourcecode:: bash tox -e buildimage + +On completion, an Ubuntu minimal image with NFS will be available for use. + +Non-default image using tox +--------------------------- + +A finer-grained image creation control can be obtained by specifying extra parameters. +Precisely, the syntax is as follows: + +.. sourcecode:: bash + + tox -e buildimage -- -s nfs + +Where can be nfs, cifs or zfs. + +For example, running: + +.. sourcecode:: bash + + tox -e buildimage -- -s cifs + +Will generate an Ubuntu based image with CIFS. diff --git a/bin/manila-image-create b/bin/manila-image-create old mode 100644 new mode 100755 index 282e900..9d37328 --- a/bin/manila-image-create +++ b/bin/manila-image-create @@ -3,19 +3,10 @@ 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 - # Collect configuration -# -------------------- -# Development options: +# --------------------- + +# Development options DIB_UPDATE_REQUESTED=${DIB_UPDATE_REQUESTED:-true} USE_OFFLINE_MODE=${USE_OFFLINE_MODE:-"yes"} ENABLE_DEBUG_MODE=${ENABLE_DEBUG_MODE:-"no"} @@ -32,12 +23,71 @@ 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 features -MANILA_ENABLE_NFS_SUPPORT=${MANILA_ENABLE_NFS_SUPPORT:-"yes"} -MANILA_ENABLE_CIFS_SUPPORT=${MANILA_ENABLE_CIFS_SUPPORT:-"yes"} +# Manila image creation default +MANILA_SHARE_PROTO=${MANILA_SHARE_PROTO:-"nfs"} -# Manila Generic share driver replication feature requires ZFS: -MANILA_ENABLE_ZFS_SUPPORT=${MANILA_ENABLE_ZFS_SUPPORT:-"no"} +# 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 # -------------------- @@ -46,58 +96,34 @@ IMAGE_FORMAT="qcow2" 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 +configure() { + OPTIONAL_ELEMENTS= + OPTIONAL_DIB_ARGS= -if [ "$MANILA_ENABLE_NFS_SUPPORT" = "yes" ]; then - OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-nfs" -fi + 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 [ "$MANILA_ENABLE_CIFS_SUPPORT" = "yes" ]; then - OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-cifs" -fi + if [ "$USE_OFFLINE_MODE" = "yes" ]; then + OPTIONAL_DIB_ARGS="$OPTIONAL_DIB_ARGS -offline" + fi -if [ "$MANILA_ENABLE_ZFS_SUPPORT" = "yes" ]; then - OPTIONAL_ELEMENTS="$OPTIONAL_ELEMENTS manila-zfs" -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 [ "$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 + 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 @@ -125,7 +151,7 @@ need_required_packages() { package_list="qemu-kvm qemu-img kpartx" ;; *) - echo -e "Unknown platform '$platform' for the package list.\nAborting" + err "Unknown platform '$platform' for the package list.\nAborting" exit 2 ;; esac @@ -138,51 +164,77 @@ need_required_packages() { 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 +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 ;; - "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 + "CentOS"*) + platform=centos ;; *) - echo -e "Unknown platform '$platform' for installing packages.\nAborting" + err "Unknown value in /etc/system-release. Impossible to build images.\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 + err "Unknown host OS. Impossible to build images.\nAborting" + exit 2 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 + 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 # ----------- -disk-image-create \ - -t $IMAGE_FORMAT \ - -a $MANILA_IMG_ARCH \ - $OPTIONAL_DIB_ARGS \ - -o $MANILA_IMG_NAME \ - $OPTIONAL_ELEMENTS $REQUIRED_ELEMENTS +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 "$@" diff --git a/tox.ini b/tox.ini index a95addf..9992455 100644 --- a/tox.ini +++ b/tox.ini @@ -28,7 +28,7 @@ commands = commands = {posargs} [testenv:buildimage] -commands = manila-image-create +commands = manila-image-create {posargs} deps = -r{toxinidir}/requirements.txt