|
|
|
|
@@ -1,6 +1,9 @@
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
# vim: set et ts=4 sw=4 ft=sh :
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
DRBDMANAGE_DBUS_AUTH_FILE=/etc/dbus-1/system.d/org.drbd.drbdmanaged-stack.conf
|
|
|
|
|
DRBDBASEURL=http://openstack-ci-pkgs.linbit.com/packages/003/trusty
|
|
|
|
|
|
|
|
|
|
function pre_install_drbd_devstack {
|
|
|
|
|
# Install OS packages, if necessary
|
|
|
|
|
@@ -9,32 +12,35 @@ function pre_install_drbd_devstack {
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
packages=(
|
|
|
|
|
drbd-utils_8.9.4-1_amd64.deb
|
|
|
|
|
drbd8-utils_8.9.4-1_amd64.deb
|
|
|
|
|
drbd-dkms_9.0.0-2_all.deb
|
|
|
|
|
drbd-utils_8.9.4-1_amd64.deb
|
|
|
|
|
python-drbdmanage_0.50-1.1_all.deb
|
|
|
|
|
python-drbdmanage_0.50-1.2_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/003/trusty/$p" -O "${FILES}/${p}"
|
|
|
|
|
wget "$DRBDBASEURL/$p" -O "${FILES}/${p}"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# install packages
|
|
|
|
|
sudo apt-get update
|
|
|
|
|
sudo apt-get install --yes debhelper python-dbus dbus \
|
|
|
|
|
lvm2 thin-provisioning-tools
|
|
|
|
|
for i in "${packages[@]}"; do
|
|
|
|
|
if [[ -f "${FILES}/${i}" ]]; then
|
|
|
|
|
echo "installing ${i}"
|
|
|
|
|
sudo dpkg -i "${FILES}/${i}" || true
|
|
|
|
|
sudo dpkg --force-confnew --install "${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
|
|
|
|
|
sudo apt-get install --fix-broken --yes
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -43,7 +49,8 @@ function install_drbd_devstack {
|
|
|
|
|
|
|
|
|
|
# Write DRBDmanage configuration;
|
|
|
|
|
# use the single-thinpool driver for these tests.
|
|
|
|
|
sudo sed -i "s/^drbdctrl-vg\s*=.*/drbdctrl-vg = ${DRBD_DRBDCTRL_VG}/g" /etc/drbdmanaged.cfg
|
|
|
|
|
sudo sed -i "s/^drbdctrl-vg\s*=.*/drbdctrl-vg = ${DRBD_DRBDCTRL_VG}/g" \
|
|
|
|
|
/etc/drbdmanaged.cfg
|
|
|
|
|
echo "
|
|
|
|
|
[LOCAL]
|
|
|
|
|
storage-plugin = drbdmanage.storage.lvm_thinlv.LvmThinLv
|
|
|
|
|
@@ -55,7 +62,7 @@ pool-name = drbdthinpool
|
|
|
|
|
" | sudo tee /etc/drbdmanaged.cfg
|
|
|
|
|
|
|
|
|
|
# allow the stack user access to drbdmanage
|
|
|
|
|
sudo tee /etc/dbus-1/system.d/org.drbd.drbdmanaged-stack.conf > /dev/null << "EOF"
|
|
|
|
|
sudo tee "$DRBDMANAGE_DBUS_AUTH_FILE" > /dev/null << "EOF"
|
|
|
|
|
<!DOCTYPE busconfig PUBLIC
|
|
|
|
|
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
|
|
|
|
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
|
|
|
|
@@ -69,6 +76,10 @@ EOF
|
|
|
|
|
# done.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _find_lo_for_dev {
|
|
|
|
|
sudo losetup -a | grep "$1"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _drbd_make_vg {
|
|
|
|
|
local vg_name="${1:?No VG name given}"
|
|
|
|
|
local vg_size="$2"
|
|
|
|
|
@@ -93,7 +104,7 @@ function _drbd_make_vg {
|
|
|
|
|
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
|
|
|
|
|
if ! _find_lo_for_dev "${vg_lo_dev}" | grep -q "${vg_name}" ; then
|
|
|
|
|
sudo losetup "${vg_dev}" "${FILES}/${vg_name}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
@@ -133,6 +144,12 @@ function _modify_udev_file {
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _this_is_the_initial_node {
|
|
|
|
|
[[ -z "$SERVICE_HOST" ||
|
|
|
|
|
"$SERVICE_HOST" == "127.0.0.1" ||
|
|
|
|
|
"$SERVICE_HOST" == "$HOST_IP" ]]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function configure_drbd_devstack {
|
|
|
|
|
# Configure the service.
|
|
|
|
|
# This gets called before starting the c-vol service; the next callback,
|
|
|
|
|
@@ -143,12 +160,18 @@ function configure_drbd_devstack {
|
|
|
|
|
# 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}"
|
|
|
|
|
_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}"
|
|
|
|
|
_drbd_make_vg "${DRBD_DATA_VG:?DRBD_DATA_VG is not set}" \
|
|
|
|
|
"${DRBD_DATA_VG_SZ}" "${DRBD_DATA_LODEV}"
|
|
|
|
|
|
|
|
|
|
local vg_size=$(LC_ALL=C sudo vgdisplay --columns --units M \
|
|
|
|
|
--noheadings -o vg_free --nosuffix "${DRBD_DATA_VG}")
|
|
|
|
|
# No quotes, so that the whitespace around the number gets eaten by the shell
|
|
|
|
|
local thinpool_size=$( echo $vg_size \* 30 / 32 - 64 | bc )
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
@@ -175,15 +198,43 @@ function configure_drbd_devstack {
|
|
|
|
|
'ENV{DM_NAME}=="'"${DRBD_DRBDCTRL_VG}"'-.drbdctrl' \
|
|
|
|
|
's:SUBSYSTEM.="block",.*GOTO="\(.*\)":&\nENV{DM_NAME}=="'"${DRBD_DRBDCTRL_VG}"'-.drbdctrl", GOTO="\1"\n:'
|
|
|
|
|
|
|
|
|
|
# initialize drbdmanage
|
|
|
|
|
sudo drbdmanage init --quiet
|
|
|
|
|
sudo drbdmanage shutdown --quiet
|
|
|
|
|
# drbdmanage modii: --no-control-volume --no-storage --no-autojoin
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
no_stor="${CINDER_DRBD_NO_STORAGE:+--no-storage}"
|
|
|
|
|
|
|
|
|
|
# initialize drbdmanage
|
|
|
|
|
if _this_is_the_initial_node ; then
|
|
|
|
|
# No quotes, so that it can expand to an empty string (and get ignored), too.
|
|
|
|
|
sudo drbdmanage init --quiet $no_stor
|
|
|
|
|
else
|
|
|
|
|
# Do we want $HOST_IP, or a possibly different one that should be reachable by the SERVICE_HOST?
|
|
|
|
|
# Is the $SERVICE_HOST always a drbdmanage node, or should we go to $CINDER_SERVICE_HOST?
|
|
|
|
|
# for now some debug output
|
|
|
|
|
set | grep SERVICE_HOST
|
|
|
|
|
|
|
|
|
|
local my_address="$HOST_IP"
|
|
|
|
|
if [[ -z "$my_address" ]] ; then
|
|
|
|
|
# Fallback, in case that script gets called standalone.
|
|
|
|
|
my_address="$(ip -oneline route get "$SERVICE_HOST" | \
|
|
|
|
|
grep "$SERVICE_HOST" | awk '/src (.*)/ { print $5 }')"
|
|
|
|
|
fi
|
|
|
|
|
echo "I am from $my_address" # ;)
|
|
|
|
|
|
|
|
|
|
no_cv="${CINDER_DRBD_NO_CV:+--no-control-volume}"
|
|
|
|
|
|
|
|
|
|
ssh -oBatchMode=yes -oStrictHostKeyChecking=no stack@"$SERVICE_HOST" \
|
|
|
|
|
sudo drbdmanage new-node --no-autojoin "$no_cv" "$no_stor" \
|
|
|
|
|
--quiet "$HOSTNAME" "$my_address"
|
|
|
|
|
|
|
|
|
|
ssh -oBatchMode=yes -oStrictHostKeyChecking=no stack@"$SERVICE_HOST" \
|
|
|
|
|
sudo drbdmanage howto-join "$HOSTNAME" --quiet | sudo bash
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
sudo drbdmanage shutdown --quiet
|
|
|
|
|
sudo drbdmanage debug 'set loglevel=debug'
|
|
|
|
|
sudo drbdmanage nodes
|
|
|
|
|
|
|
|
|
|
# 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
|
|
|
|
|
|