152 lines
4.0 KiB
Bash
Executable File
152 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
|
set -ue
|
|
|
|
CHARM="swift-storage"
|
|
HOOKS_DIR="$CHARM_DIR/hooks"
|
|
|
|
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
|
|
}
|