charm-swift-storage/hooks/swift-storage-node-common

154 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
set -ue
CHARM="swift-storage"
HOOKS_DIR="$CHARM_DIR/hooks"
CONF_DIR="/etc/swift"
if [[ -e "$HOOKS_DIR/lib/openstack-common" ]] ; then
. $HOOKS_DIR/lib/openstack-common
else
juju-log "ERROR: Couldn't load $HOOKS_DIR/lib/openstack-common." && exit 1
fi
DEFAULT_ETH=$(ip route | grep default | awk '{ print $5 }')
IP=$(ifconfig $DEFAULT_ETH | grep 'inet addr' | awk '{ print $2 }' | cut -d: -f2)
# TODO: Need to use different addresses for internal swift traffic
# as this the only security measure in place is network isolation
STORAGE_LOCAL_NET_IP=$IP
PACKAGES="swift swift-account swift-container swift-object xfsprogs gdisk"
OPENSTACK_ORIGIN="$(config-get openstack-origin)"
src=$(get_os_codename_install_source "$OPENSTACK_ORIGIN")
# Install python-swiftclient for Folsom and beyond.
if dpkg --compare-versions $(get_os_version_codename "$src") gt \
$(get_os_version_codename "essex") ; then
PACKAGES="$PACKAGES python-swiftclient"
fi
function set_swift_hash {
# TODO: Do this with augeas and put in a utility function for use elsewhere
cat >/etc/swift/swift.conf <<EOF
[swift-hash]
# random unique string that can never change (DO NOT LOSE)
swift_hash_path_suffix = $1
EOF
}
function configure_rsyncd {
cat >/etc/rsyncd.conf <<EOF
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = $STORAGE_LOCAL_NET_IP
[account]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/account.lock
[container]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/container.lock
[object]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/object.lock
EOF
perl -pi -e 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync
service rsync start
}
function create_server_conf {
# $1 should be: account, container or object
case $1 in
"account") subconf="replicator auditor reaper" ;;
"object"|"container") subconf="replicator updater auditor sync" ;;
esac
local port="$2"
cat >/etc/swift/$1-server.conf <<EOF
[DEFAULT]
bind_ip = $STORAGE_LOCAL_NET_IP
bind_port = $port
workers = 2
[pipeline:main]
pipeline = recon $1-server
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
[app:$1-server]
use = egg:swift#$1
EOF
for i in $subconf ; do
echo -e "[$1-$i]\n" >>/etc/swift/$1-server.conf
done
}
function determine_block_devs {
juju-log "determine_block_devs: $@"
local devices=$(config-get block-device)
if [ "$devices" = "guess" ]; then
# This should be more smart
devices=$(awk '($4 ~ /^(sd[a-z]|vd[a-z]|cciss\/c[0-9]d[0-9])$/) && ($4 != "sda") && ($4 != "vda") && ($4 != "cciss/c0d0") {print $4}' </proc/partitions)
fi
for dev in $devices ; do
echo $(get_block_device "$dev")
done
}
function setup_storage {
mkdir -p /srv/node
local devs=$(determine_block_devs)
local overwrite="$(config-get overwrite)"
local nodename=""
juju-log "Preparing storage: $devs"
for dev in $devs ; do
[[ "$overwrite" == "true" ]] || [[ "$overwrite" == "True" ]] &&
clean_storage $dev
mkfs.xfs -f -i size=1024 $dev
nodename=$(basename $dev)
if ! echo "$nodename" | grep "loop" ; then
fstab_entry="$dev /srv/node/$nodename xfs noatime,nodiratime,nobarrier,logbufs=8 0 0"
grep -q "^$fstab_entry" /etc/fstab || echo "$fstab_entry" >>/etc/fstab
fi
mkdir -p /srv/node/$nodename
mount $dev /srv/node/$nodename
done
chown -R swift:swift /srv/node
}
function do_openstack_upgrade {
# update openstack components to those provided by a new installation source
# it is assumed the calling hook has confirmed that the upgrade is sane.
local rel="$1"
shift
local packages=$@
# Backup the config directory.
local stamp=$(date +"%Y%m%d%M%S")
tar -pcf /var/lib/juju/$CHARM-backup-$stamp.tar $CONF_DIR
configure_install_source "$rel"
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get \
--option Dpkg::Options::=--force-confnew -y \
install --no-install-recommends $packages
swift-init all restart || true
}