diff --git a/drbd-devstack/devstack/.gitignore b/devstack/.gitignore similarity index 100% rename from drbd-devstack/devstack/.gitignore rename to devstack/.gitignore diff --git a/devstack/lib/drbd_devstack b/devstack/lib/drbd_devstack new file mode 100755 index 0000000..6fed604 --- /dev/null +++ b/devstack/lib/drbd_devstack @@ -0,0 +1,183 @@ +#!/bin/bash +# vim: set et ts=4 sw=4 ft=sh : + + +function pre_install_drbd_devstack { + # Install OS packages, if necessary + if [[ ! -d "${FILES:?FILES not set yet}" ]]; then + mkdir "${FILES}" + fi + packages=('drbd-utils_8.9.3rc1-1_amd64.deb' 'drbd8-utils_8.9.3rc1-1_amd64.deb' 'drbd-dkms_9.0.0rc3-1_all.deb' 'python-drbdmanage_0.36-1_all.deb'); + # get packages + for p in "${packages[@]}"; do + if [[ ! -f "${FILES}/${p}" ]]; then + # If there are newer packages, change the download number here. + wget "http://openstack-ci-pkgs.linbit.com/packages/001/trusty/$p" -O "${FILES}/${p}" + fi + done + # install packages + for i in "${packages[@]}"; do + if [[ -f "${FILES}/${i}" ]]; then + echo "installing ${i}" + sudo dpkg -i "${FILES}/${i}" || true + fi + done + + # Hotfix, until DRBDmanage 0.42 is released. + sudo sed -i "s/NAME_MAXLEN\s*=.*/NAME_MAXLEN = 4095/" /usr/lib/python2.7/dist-packages/drbdmanage/storage/storagecore.py + + # now go fetch :) + echo echo "installing deps" + #sudo apt-get update + sudo apt-get install -f -y + sudo apt-get install python-dbus -y + return 0 +} + +function install_drbd_devstack { + # Install the service. + + # write /etc/drbdmanage*.conf + #echo "drbdctrl-vg = $DRBD_DRBDCTRL_VG" >> /etc/drbdmanaged.conf + #echo "volume-group = $DRBD_DATA_VG" >> /etc/drbdmanaged-lvm.conf + sudo sed -i "s/^drbdctrl-vg\s*=.*/drbdctrl-vg = ${DRBD_DRBDCTRL_VG}/g" /etc/drbdmanaged.conf + sudo sed -i "s/^volume-group\s*=.*/volume-group = ${DRBD_DATA_VG}/g" /etc/drbdmanaged-lvm.conf + sudo sed -i "s/^volume-group\s*=.*/volume-group = ${DRBD_DATA_VG}/g" /etc/drbdmanaged-lvm-thinpool.conf + sudo sed -i "s/^volume-group\s*=.*/volume-group = ${DRBD_DATA_VG}/g" /etc/drbdmanaged-lvm-thinlv.conf + +# Use the single-thinpool driver for these tests. +# sudo sed -i "s/^storage-plugin\s*=.*/storage-plugin = drbdmanage.storage.lvm_thinpool_ng.LvmThinPoolNg/g" /etc/drbdmanaged.conf + sudo sed -i "s/^storage-plugin\s*=.*/storage-plugin = drbdmanage.storage.lvm_thinlv.LvmThinLv/g" /etc/drbdmanaged.conf + + # allow the stack user access to drbdmanage + sudo tee /etc/dbus-1/system.d/org.drbd.drbdmanaged-stack.conf > /dev/null << "EOF" + + + + + + +EOF + + # done. +} + +function _drbd_make_vg { + local vg_name="${1:?No VG name given}" + local vg_size="$2" + local vg_lo_dev="$3" + + local vg_dev="/dev/${vg_lo_dev}" + + # If the VG exists, there's nothing left to do. + if sudo vgdisplay | grep -q "${vg_name}" ; then + return + fi + + # if the file exists, don't destroy it... + if [[ ! -f "${FILES}/${vg_name}" ]]; then + sudo truncate -s "${vg_size}" "${FILES}/${vg_name}" + fi + + # if the loop device is present, don't recreate it... + if [[ ! -e "${vg_dev}" ]]; then + local vg_lo_minor="$(echo "${vg_lo_dev}" | sed 's/loop//g')" + sudo mknod -m 660 "${vg_dev}" b 7 "${vg_lo_minor}" + fi + + # if the file is already assigned a loop device, don't reassign + if ! sudo losetup -a | grep "${vg_lo_dev}" | grep -q "${vg_name}" ; then + sudo losetup "${vg_dev}" "${FILES}/${vg_name}" + fi + + local lvm_cfg="devices { global_filter=[ 'a|$vg_lo_dev|' ] }" + +# # if the lvm.conf already accepts the loop device, don't insert it again +# if ! sudo grep -q "${vg_lo_dev}" /etc/lvm/lvm.conf ; then +# sudo sed -i.drbdctrl-bak "s/global_filter = \[ /global_filter = \[ \"a|${vg_lo_dev}|\", /g" /etc/lvm/lvm.conf +# fi + + # if theres already a pv signature, don't try to recreate + if ! sudo pvdisplay | grep -q "${vg_lo_dev}" ; then + sudo pvscan --config "$lvm_cfg" + + if sudo pvdisplay | grep -q "${vg_lo_dev}" ; then + sudo pvcreate --config "$lvm_cfg" "${vg_dev}" + fi + fi + + # if theres already a vg, don't try to recreate + if ! sudo vgdisplay | grep -q "${vg_name}" ; then + sudo vgscan + if ! sudo vgdisplay | grep -q "${vg_name}" ; then + sudo vgcreate --config "$lvm_cfg" "${vg_name}" "${vg_dev}" + fi + fi +} + +function configure_drbd_devstack { + # Configure the service. + # This gets called before starting the c-vol service; the next callback, + # init_drbd_devstack, is too late for that, so we need to make DRBDmanage + # operational here. + local be_name="${1:-drbdmanage}" + + # Initialize and start the service. + # need to setup loopback device(s) for DRBD + + _drbd_make_vg "${DRBD_DRBDCTRL_VG:?DRBD_DRBDCTRL_VG is not set}" "${DRBD_DRBDCTRL_VG_SZ}" "${DRBD_DRBDCTRL_LODEV}" + + # Do the same thing for the DATA volume group + _drbd_make_vg "${DRBD_DATA_VG:?DRBD_DATA_VG is not set}" "${DRBD_DATA_VG_SZ}" "${DRBD_DATA_LODEV}" + + local thinpool_size=$(echo $(LC_ALL=C sudo vgdisplay --columns --units M --noheadings -o vg_free --nosuffix "${DRBD_DATA_VG}") \* 30 / 32 - 64 | bc) + if ! sudo lvdisplay "${DRBD_DATA_VG}/drbdthinpool" ; then + sudo /sbin/lvcreate -L "${thinpool_size}"M -T "${DRBD_DATA_VG}/drbdthinpool" + fi + + # initialize drbdmanage + sudo drbdmanage init --quiet + sudo drbdmanage shutdown --quiet + + sudo drbdmanage debug 'set loglevel=debug' + + # FIXME: multi-node setups + + + iniset $CINDER_CONF "$be_name" volume_backend_name "$be_name" + iniset $CINDER_CONF "$be_name" volume_driver cinder.volume.drivers.drbdmanagedrv.DrbdManageDriver +} + +function init_drbd_devstack { + true +} + +function shutdown_drbd_devstack { + # Shut the service down. + # drbdadm down all + # drbdmanage shutdown --quiet + echo "shutdown drbd devstack" +} + +function cleanup_drbd_devstack { + # Cleanup the service. + # something like + # drbdmanage list-resource --short | xargs -l drbdmanage remove-resource + # ??? + # drbdmanage resources -m | sed 's/,.*//g' | xargs -l drbdmanage remove-resource --quiet + echo "cleanup drbd devstack" +} + +#debug main +#source $(dirname '$0')/../settings +#pre_install_drbd_devstack +#install_drbd_devstack +#configure_drbd_devstack +#init_drbd_devstack + +# Tell emacs to use shell-script-mode +## Local variables: +## mode: shell-script +## End: diff --git a/drbd-devstack/devstack/override-defaults b/devstack/override-defaults similarity index 100% rename from drbd-devstack/devstack/override-defaults rename to devstack/override-defaults diff --git a/drbd-devstack/devstack/plugin.sh b/devstack/plugin.sh similarity index 75% rename from drbd-devstack/devstack/plugin.sh rename to devstack/plugin.sh index 547f72d..d7b8316 100644 --- a/drbd-devstack/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -1,12 +1,16 @@ -# check for service enabled -if is_service_enabled drbd_devstack; then - if [[ "$1" == "source" ]]; then - # Initial source of lib script - source $(dirname "$0")/lib/drbd_devstack - fi + +# order of calls is +# pre_install_drbd_devstack +# install_drbd_devstack +# configure_drbd_devstack +# init_drbd_devstack + +if is_service_enabled drbd-devstack; then if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then + source "$dir/devstack/settings" # Set up system services + source "$dir/devstack/lib/drbd_devstack" echo_summary "Configuring system services drbd_devstack" pre_install_drbd_devstack @@ -28,14 +32,14 @@ if is_service_enabled drbd_devstack; then if [[ "$1" == "unstack" ]]; then # Shut down drbd_devstack services - # no-op + source "$dir/devstack/lib/drbd_devstack" shutdown_drbd_devstack fi if [[ "$1" == "clean" ]]; then # Remove state and transient data # Remember clean.sh first calls unstack.sh - # no-op + source "$dir/devstack/lib/drbd_devstack" cleanup_drbd_devstack fi fi diff --git a/drbd-devstack/devstack/settings b/devstack/settings similarity index 56% rename from drbd-devstack/devstack/settings rename to devstack/settings index 4164ae2..13e3ca8 100644 --- a/drbd-devstack/devstack/settings +++ b/devstack/settings @@ -1,10 +1,10 @@ # Devstack settings - -TEMPEST_STORAGE_PROTOCOL=drbd +FILES="${FILES:-$TOP_DIR/files}" +TEMPEST_STORAGE_PROTOCOL=iSCSI DRBD_DRBDCTRL_VG_SZ=1G DRBD_DRBDCTRL_LODEV=loop66 DRBD_DRBDCTRL_VG=drbdpool -DRBD_DATA_VG_SZ=7G +DRBD_DATA_VG_SZ="$VOLUME_BACKING_FILE_SIZE" DRBD_DATA_VG=drbddata DRBD_DATA_LODEV=loop67 diff --git a/drbd-devstack/devstack/lib/drbd_devstack b/drbd-devstack/devstack/lib/drbd_devstack deleted file mode 100755 index 301127c..0000000 --- a/drbd-devstack/devstack/lib/drbd_devstack +++ /dev/null @@ -1,209 +0,0 @@ -#!/bin/bash -# vim: set et ts=4 sw=4 ft=sh : -# Can we set global variables here? -# Hash to access LINBIT repositories -FILES="$(dirname '$0')/files" - -function pre_install_drbd_devstack { - # Install OS packages, if necessary - # see wget logic in https://github.com/openstack-dev/devstack/blob/master/pkg/elasticsearch.sh - # drbdmanage, drbd-dkms, drbd-utils - if [[ ! -d ${FILES} ]]; then - mkdir ${FILES} - fi - # drbd-dkms="drbd-dkms_9.0.0rc2-1_all.deb" - # drbd-utils="drbd-utils_8.9.2+linbit-1_amd64.deb" - # drbd-manage="python-drbdmanage_0.20-33_all.deb" - packages=('drbd-utils_8.9.3rc1-1_amd64.deb' 'drbd8-utils_8.9.3rc1-1_amd64.deb' 'drbd-dkms_9.0.0rc3-1_all.deb' 'python-drbdmanage_0.34-1_all.deb'); - # get packages - for p in "${packages[@]}"; do - if [[ ! -f ${FILES}/${p}* ]]; then - # If there are newer packages, change the download number here. - wget "http://openstack-ci-pkgs.linbit.com/packages/001/trusty/$p" -O ${FILES}/${p} - fi - done - # install packages - for i in "${packages[@]}"; do - if [[ -f "${FILES}/${i}" ]]; then - echo "installing ${i}" - sudo dpkg -i ${FILES}/${i} || true - fi - done - # now go fetch :) - echo echo "installing deps" - #sudo apt-get update - sudo apt-get install -f -y - sudo apt-get install python-dbus -y - return 0 -} - -function install_drbd_devstack { - # Install the service. - - # write /etc/drbdmanage*.conf - #echo "drbdctrl-vg = $DRBD_DRBDCTRL_VG" >> /etc/drbdmanaged.conf - #echo "volume-group = $DRBD_DATA_VG" >> /etc/drbdmanaged-lvm.conf - sudo sed -i "s/^drbdctrl-vg\s*=.*/drbdctrl-vg = ${DRBD_DRBDCTRL_VG}/g" /etc/drbdmanaged.conf - sudo sed -i "s/^volume-group\s*=.*/volume-group = ${DRBD_DATA_VG}/g" /etc/drbdmanaged-lvm.conf - - # allow the stack user access to drbdmanage - sudo echo << "EOF" > /etc/dbus-1/system.d/org.drbd.drbdmanaged-stack.conf - - - - - - -EOF - - # done. -} - -function configure_drbd_devstack { - # Configure the service. - local be_name="${1:-drbdmanage}" - - iniset $CINDER_CONF "$be_name" volume_backend_name "$be_name" - iniset $CINDER_CONF "$be_name" volume_driver cinder.volume.drivers.drbdmanagedrv.DrbdManageDriver -} - -function init_drbd_devstack { - # Initialize and start the service. - # need to setup loopback device(s) for DRBD - - # dd if=/dev/zero of=${FILES}/${DRBD_DRBDCTRL_VG} count=1 bs=${DRBD_DRBDCTRL_VG_SZ} - # mknod -m 660 /dev/${DRBD_DRBDCTRL_LODEV} b 7 66 - # losetup ${FILES}/${DRBD_DRBDCTRL_VG} - # sed -i 's/global_filter = \[ /global_filter = \[ "a|loop3|", /g' /etc/lvm/lvm.conf - # pvcreate /dev/loop3 - # vgcreate ${DRBD_DRBDCTRL_VG} - - # if the file exists, don't destroy it... - if [[ ! -f ${FILES}/${DRBD_DRBDCTRL_VG} ]]; then - #dd if=/dev/zero of=${FILES}/${DRBD_DRBDCTRL_VG} count=1 bs=${DRBD_DRBDCTRL_VG_SZ} - sudo truncate -s ${DRBD_DRBDCTRL_VG_SZ} ${FILES}/${DRBD_DRBDCTRL_VG} - fi - - # if the loop device is present, don't recreate it... - if [[ ! -e /dev/${DRBD_DRBDCTRL_LODEV} ]]; then - DRBDCTRL_LO_MINOR=`echo ${DRBD_DRBDCTRL_LODEV} | sed 's/loop//g'` - sudo mknod -m 660 /dev/${DRBD_DRBDCTRL_LODEV} b 7 ${DRBDCTRL_LO_MINOR} - fi - - # if the file is already assigned a loop device, don't reassign - sudo losetup -a | grep ${DRBD_DRBDCTRL_LODEV} | grep -q ${DRBD_DRBDCTRL_VG} - if [[ $? -ne 0 ]]; then - sudo losetup /dev/${DRBD_DRBDCTRL_LODEV} ${FILES}/${DRBD_DRBDCTRL_VG} - fi - - # if the lvm.conf already accepts the loop device, don't insert it again - sudo grep -q ${DRBD_DRBDCTRL_LODEV} /etc/lvm/lvm.conf - if [[ $? -ne 0 ]]; then - sudo sed -i.drbdctrl-bak "s/global_filter = \[ /global_filter = \[ \"a|${DRBD_DRBDCTRL_LODEV}|\", /g" /etc/lvm/lvm.conf - fi - - # if theres already a pv signature, don't try to recreate - sudo pvdisplay | grep -q ${DRBD_DRBDCTRL_LODEV} - if [[ $? -ne 0 ]]; then - sudo pvscan - sudo pvdisplay | grep -q ${DRBD_DRBDCTRL_LODEV} - if [[ $? -ne 0 ]]; then - sudo pvcreate /dev/${DRBD_DRBDCTRL_LODEV} - fi - fi - - # if theres already a vg, don't try to recreate - sudo vgdisplay | grep -q ${DRBD_DRBDCTRL_VG} - if [[ $? -ne 0 ]]; then - sudo vgscan - sudo vgdisplay | grep -q ${DRBD_DRBDCTRL_VG} - if [[ $? -ne 0 ]]; then - sudo vgcreate ${DRBD_DRBDCTRL_VG} /dev/${DRBD_DRBDCTRL_LODEV} - fi - fi - - # Do the same thing for the DATA volume group - # dd if=/dev/zero of=${FILES}/${DRBD_DATA_VG} count=1 bs=${DRBD_DATA_VG_SZ} - # losetup ${FILES}/${DRBD_DATA_VG} - # sed -i 's/global_filter = \[ /global_filter = \[ "a|loop4|", /g' /etc/lvm/lvm.conf - # pvcreate /dev/loop4 - # vgcreate ${DRBD_DATA_VG} - - # if the file exists, don't destroy it... - if [[ ! -f ${FILES}/${DRBD_DATA_VG} ]]; then - #dd if=/dev/zero of=${FILES}/${DRBD_DATA_VG} count=1 bs=${DRBD_DATA_VG_SZ} - sudo truncate -s ${DRBD_DATA_VG_SZ} ${FILES}/${DRBD_DATA_VG} - fi - - # if the loop device is present, don't recreate it... - if [[ ! -e /dev/${DRBD_DATA_LODEV} ]]; then - DATA_LO_MINOR=`echo ${DRBD_DATA_LODEV} | sed 's/loop//g'` - sudo mknod -m 660 /dev/${DRBD_DATA_LODEV} b 7 ${DATA_LO_MINOR} - fi - - # if the file is already assigned a loop device, don't reassign - sudo losetup -a | grep ${DRBD_DATA_LODEV} | grep -q ${DRBD_DATA_VG} - if [[ $? -ne 0 ]]; then - sudo losetup /dev/${DRBD_DATA_LODEV} ${FILES}/${DRBD_DATA_VG} - fi - - # if the lvm.conf already accepts the loop device, don't insert it again - sudo grep -q ${DRBD_DATA_LODEV} /etc/lvm/lvm.conf - if [[ $? -ne 0 ]]; then - sudo sed -i.drbddata-bak "s/global_filter = \[ /global_filter = \[ \"a|${DRBD_DATA_LODEV}|\", /g" /etc/lvm/lvm.conf - fi - - # if theres already a pv signature, don't try to recreate - sudo pvdisplay | grep -q ${DRBD_DATA_LODEV} - if [[ $? -ne 0 ]]; then - sudo pvscan - sudo pvdisplay | grep -q ${DRBD_DATA_LODEV} - if [[ $? -ne 0 ]]; then - sudo pvcreate /dev/${DRBD_DATA_LODEV} - fi - fi - - # if theres already a vg, don't try to recreate - sudo vgdisplay | grep -q ${DRBD_DATA_VG} - if [[ $? -ne 0 ]]; then - sudo vgscan - sudo vgdisplay | grep -q ${DRBD_DATA_VG} - if [[ $? -ne 0 ]]; then - sudo vgcreate ${DRBD_DATA_VG} /dev/${DRBD_DATA_LODEV} - fi - fi - - # initialize drbdmanage - sudo drbdmanage init --quiet - # FIXME: multi-node setups -} - -function shutdown_drbd_devstack { - # Shut the service down. - # drbdadm down all - # drbdmanage shutdown --quiet - echo "shutdown drbd devstack" -} - -function cleanup_drbd_devstack { - # Cleanup the service. - # something like - # drbdmanage list-resource --short | xargs -l drbdmanage remove-resource - # ??? - # drbdmanage resources -m | sed 's/,.*//g' | xargs -l drbdmanage remove-resource --quiet - echo "cleanup drbd devstack" -} - -#debug main -#source $(dirname '$0')/../settings -#pre_install_drbd_devstack -#install_drbd_devstack -#configure_drbd_devstack -#init_drbd_devstack - -# Tell emacs to use shell-script-mode -## Local variables: -## mode: shell-script -## End: