Merge HA amqp support.
This commit is contained in:
commit
dbc7c91666
|
@ -71,6 +71,15 @@ amqp_changed() {
|
|||
rabbit_password=$(relation-get password)
|
||||
[[ -z "$rabbit_host" ]] || [[ -z "$rabbit_password" ]] &&
|
||||
juju-log "Missing rabbit_host||rabbit_passwd, peer not ready? Will retry." && exit 0
|
||||
local clustered=$(relation-get clustered)
|
||||
if [[ -n "$clustered" ]] ; then
|
||||
juju-log "$CHARM - amqp_changed: Configuring for access to haclustered "\
|
||||
"rabbitmq service."
|
||||
local vip=$(relation-get vip)
|
||||
[[ -z "$vip" ]] && juju-log "$CHARM - amqp_changed: Clustered bu no vip."\
|
||||
&& exit 0
|
||||
rabbit_host="$vip"
|
||||
fi
|
||||
juju-log "cinder: Configuring cinder for amqp access to $rabbit_host:$rabbit_vhost"
|
||||
rabbit_user=$(config-get rabbit-user)
|
||||
rabbit_vhost=$(config-get rabbit-vhost)
|
||||
|
|
|
@ -70,46 +70,62 @@ function configure_install_source {
|
|||
# gpg key id tagged to end of url folloed by a |
|
||||
url=$(echo $src | cut -d'|' -f1)
|
||||
key=$(echo $src | cut -d'|' -f2)
|
||||
if [[ -n "$key" ]] ; then
|
||||
juju-log "$CHARM: Importing repository key: $key"
|
||||
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys "$key" || \
|
||||
juju-log "$CHARM WARN: Could not import key from keyserver: $key"
|
||||
else
|
||||
juju-log "$CHARM No repository key specified"
|
||||
url="$src"
|
||||
fi
|
||||
echo $url > /etc/apt/sources.list.d/juju_deb.list
|
||||
juju-log "$CHARM: Importing repository key: $key"
|
||||
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys "$key" || \
|
||||
juju-log "$CHARM WARN: Could not import key from keyserver: $key"
|
||||
else
|
||||
juju-log "$CHARM No repository key specified."
|
||||
url="$src"
|
||||
fi
|
||||
echo "$url" > /etc/apt/sources.list.d/juju_deb.list
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Cloud Archive
|
||||
if [[ "${src:0:6}" == "cloud:" ]] ; then
|
||||
local archive_key="5EDB1B62EC4926EA"
|
||||
local rel=$(echo $src | cut -d: -f2)
|
||||
local u_rel=$(echo $rel | cut -d- -f1)
|
||||
local ca_rel=$(echo $rel | cut -d- -f2)
|
||||
|
||||
# current os releases supported by the UCA.
|
||||
local cloud_archive_versions="folsom grizzly"
|
||||
|
||||
local ca_rel=$(echo $src | cut -d: -f2)
|
||||
local u_rel=$(echo $ca_rel | cut -d- -f1)
|
||||
local os_rel=$(echo $ca_rel | cut -d- -f2 | cut -d/ -f1)
|
||||
|
||||
[[ "$u_rel" != "$DISTRIB_CODENAME" ]] &&
|
||||
error_out "Cannot install from Cloud Archive pocket $src " \
|
||||
"on this Ubuntu version ($DISTRIB_CODENAME)!"
|
||||
|
||||
if [[ "$ca_rel" == "folsom/staging" ]] ; then
|
||||
# cloud archive staging is just a regular PPA.
|
||||
add-apt-repository -y ppa:ubuntu-cloud-archive/folsom-staging
|
||||
valid_release=""
|
||||
for rel in $cloud_archive_versions ; do
|
||||
if [[ "$os_rel" == "$rel" ]] ; then
|
||||
valid_release=1
|
||||
juju-log "Installing OpenStack ($os_rel) from the Ubuntu Cloud Archive."
|
||||
fi
|
||||
done
|
||||
if [[ -z "$valid_release" ]] ; then
|
||||
error_out "OpenStack release ($os_rel) not supported by "\
|
||||
"the Ubuntu Cloud Archive."
|
||||
fi
|
||||
|
||||
# CA staging repos are standard PPAs.
|
||||
if echo $ca_rel | grep -q "staging" ; then
|
||||
add-apt-repository -y ppa:ubuntu-cloud-archive/${os_rel}-staging
|
||||
return 0
|
||||
fi
|
||||
|
||||
# the others are LP-external deb repos.
|
||||
case "$ca_rel" in
|
||||
"folsom"|"folsom/updates") pocket="precise-updates/folsom" ;;
|
||||
"folsom/proposed") pocket="precise-proposed/folsom" ;;
|
||||
"$u_rel-$os_rel"|"$u_rel-$os_rel/updates") pocket="$u_rel-updates/$os_rel" ;;
|
||||
"$u_rel-$os_rel/proposed") pocket="$u_rel-proposed/$os_rel" ;;
|
||||
"$u_rel-$os_rel"|"$os_rel/updates") pocket="$u_rel-updates/$os_rel" ;;
|
||||
"$u_rel-$os_rel/proposed") pocket="$u_rel-proposed/$os_rel" ;;
|
||||
*) error_out "Invalid Cloud Archive repo specified: $src"
|
||||
esac
|
||||
|
||||
apt-get -y install ubuntu-cloud-keyring
|
||||
entry="deb http://ubuntu-cloud.archive.canonical.com/ubuntu $pocket main"
|
||||
echo "$entry" \
|
||||
>/etc/apt/sources.list.d/ubuntu-cloud-archive-$DISTRIB_CODENAME.list
|
||||
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $archive_key
|
||||
return 0
|
||||
fi
|
||||
|
||||
|
@ -142,8 +158,8 @@ get_os_codename_install_source() {
|
|||
case "$ca_rel" in
|
||||
"folsom"|"folsom/updates"|"folsom/proposed"|"folsom/staging")
|
||||
codename="folsom" ;;
|
||||
"grizzly"|"grizzly/updates"|"grizzly/proposed"|"grizzy/staging")
|
||||
codename="grizly" ;;
|
||||
"grizzly"|"grizzly/updates"|"grizzly/proposed"|"grizzly/staging")
|
||||
codename="grizzly" ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
|
@ -161,7 +177,7 @@ get_os_codename_install_source() {
|
|||
}
|
||||
|
||||
get_os_codename_package() {
|
||||
local pkg_vers=$(dpkg -l | grep "$1" | awk '{ print $3 }')
|
||||
local pkg_vers=$(dpkg -l | grep "$1" | awk '{ print $3 }') || echo "none"
|
||||
case "${pkg_vers:0:6}" in
|
||||
"2011.2") echo "diablo" ;;
|
||||
"2012.1") echo "essex" ;;
|
||||
|
@ -179,6 +195,126 @@ get_os_version_codename() {
|
|||
esac
|
||||
}
|
||||
|
||||
get_ip() {
|
||||
dpkg -l | grep -q python-dnspython || {
|
||||
apt-get -y install python-dnspython 2>&1 > /dev/null
|
||||
}
|
||||
hostname=$1
|
||||
python -c "
|
||||
import dns.resolver
|
||||
import socket
|
||||
try:
|
||||
# Test to see if already an IPv4 address
|
||||
socket.inet_aton('$hostname')
|
||||
print '$hostname'
|
||||
except socket.error:
|
||||
try:
|
||||
answers = dns.resolver.query('$hostname', 'A')
|
||||
if answers:
|
||||
print answers[0].address
|
||||
except dns.resolver.NXDOMAIN:
|
||||
pass
|
||||
"
|
||||
}
|
||||
|
||||
# Common storage routines used by cinder, nova-volume and swift-storage.
|
||||
clean_storage() {
|
||||
# if configured to overwrite existing storage, we unmount the block-dev
|
||||
# if mounted and clear any previous pv signatures
|
||||
local block_dev="$1"
|
||||
juju-log "Cleaining storage '$block_dev'"
|
||||
if grep -q "^$block_dev" /proc/mounts ; then
|
||||
mp=$(grep "^$block_dev" /proc/mounts | awk '{ print $2 }')
|
||||
juju-log "Unmounting $block_dev from $mp"
|
||||
umount "$mp" || error_out "ERROR: Could not unmount storage from $mp"
|
||||
fi
|
||||
if pvdisplay "$block_dev" >/dev/null 2>&1 ; then
|
||||
juju-log "Removing existing LVM PV signatures from $block_dev"
|
||||
|
||||
# deactivate any volgroups that may be built on this dev
|
||||
vg=$(pvdisplay $block_dev | grep "VG Name" | awk '{ print $3 }')
|
||||
if [[ -n "$vg" ]] ; then
|
||||
juju-log "Deactivating existing volume group: $vg"
|
||||
vgchange -an "$vg" ||
|
||||
error_out "ERROR: Could not deactivate volgroup $vg. Is it in use?"
|
||||
fi
|
||||
echo "yes" | pvremove -ff "$block_dev" ||
|
||||
error_out "Could not pvremove $block_dev"
|
||||
else
|
||||
juju-log "Zapping disk of all GPT and MBR structures"
|
||||
sgdisk --zap-all $block_dev ||
|
||||
error_out "Unable to zap $block_dev"
|
||||
fi
|
||||
}
|
||||
|
||||
function get_block_device() {
|
||||
# given a string, return full path to the block device for that
|
||||
# if input is not a block device, find a loopback device
|
||||
local input="$1"
|
||||
|
||||
case "$input" in
|
||||
/dev/*) [[ ! -b "$input" ]] && error_out "$input does not exist."
|
||||
echo "$input"; return 0;;
|
||||
/*) :;;
|
||||
*) [[ ! -b "/dev/$input" ]] && error_out "/dev/$input does not exist."
|
||||
echo "/dev/$input"; return 0;;
|
||||
esac
|
||||
|
||||
# this represents a file
|
||||
# support "/path/to/file|5G"
|
||||
local fpath size oifs="$IFS"
|
||||
if [ "${input#*|}" != "${input}" ]; then
|
||||
size=${input##*|}
|
||||
fpath=${input%|*}
|
||||
else
|
||||
fpath=${input}
|
||||
size=5G
|
||||
fi
|
||||
|
||||
## loop devices are not namespaced. This is bad for containers.
|
||||
## it means that the output of 'losetup' may have the given $fpath
|
||||
## in it, but that may not represent this containers $fpath, but
|
||||
## another containers. To address that, we really need to
|
||||
## allow some uniq container-id to be expanded within path.
|
||||
## TODO: find a unique container-id that will be consistent for
|
||||
## this container throughout its lifetime and expand it
|
||||
## in the fpath.
|
||||
# fpath=${fpath//%{id}/$THAT_ID}
|
||||
|
||||
local found=""
|
||||
# parse through 'losetup -a' output, looking for this file
|
||||
# output is expected to look like:
|
||||
# /dev/loop0: [0807]:961814 (/tmp/my.img)
|
||||
found=$(losetup -a |
|
||||
awk 'BEGIN { found=0; }
|
||||
$3 == f { sub(/:$/,"",$1); print $1; found=found+1; }
|
||||
END { if( found == 0 || found == 1 ) { exit(0); }; exit(1); }' \
|
||||
f="($fpath)")
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "multiple devices found for $fpath: $found" 1>&2
|
||||
return 1;
|
||||
fi
|
||||
|
||||
[ -n "$found" -a -b "$found" ] && { echo "$found"; return 1; }
|
||||
|
||||
if [ -n "$found" ]; then
|
||||
echo "confused, $found is not a block device for $fpath";
|
||||
return 1;
|
||||
fi
|
||||
|
||||
# no existing device was found, create one
|
||||
mkdir -p "${fpath%/*}"
|
||||
truncate --size "$size" "$fpath" ||
|
||||
{ echo "failed to create $fpath of size $size"; return 1; }
|
||||
|
||||
found=$(losetup --find --show "$fpath") ||
|
||||
{ echo "failed to setup loop device for $fpath" 1>&2; return 1; }
|
||||
|
||||
echo "$found"
|
||||
return 0
|
||||
}
|
||||
|
||||
HAPROXY_CFG=/etc/haproxy/haproxy.cfg
|
||||
HAPROXY_DEFAULT=/etc/default/haproxy
|
||||
|
||||
|
@ -190,7 +326,7 @@ HAPROXY_DEFAULT=/etc/default/haproxy
|
|||
# assumes the name of the peer relation is 'cluster' and that every
|
||||
# service unit in the peer relation is running the same services.
|
||||
#
|
||||
# The HAProxy service will listen on port + 1.
|
||||
# The HAProxy service will listen on port + 10000.
|
||||
# Example:
|
||||
# configure_haproxy cinder_api:12345 nova_api:9999
|
||||
##########################################################################
|
||||
|
@ -229,7 +365,7 @@ EOF
|
|||
for service in $@; do
|
||||
local service_name=$(echo $service | cut -d : -f 1)
|
||||
local api_listen_port=$(echo $service | cut -d : -f 2)
|
||||
local haproxy_listen_port=$(($api_listen_port + 1))
|
||||
local haproxy_listen_port=$(($api_listen_port + 10000))
|
||||
cat >> $HAPROXY_CFG << EOF
|
||||
listen $service_name 0.0.0.0:$haproxy_listen_port
|
||||
balance roundrobin
|
||||
|
@ -280,3 +416,4 @@ is_leader() {
|
|||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue