1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
#!/bin/sh
set -e
# set -x
# Paths
DEPLOY_KEY="/etc/openstack-cluster-installer/id_rsa"
REMOTE_RING_PATH="/etc/swift"
STOP_AFTER_VALIDATION=false
VALIDATE_RING=true
# Rsync stuff
RSYNC_TIMEOUT=3 # seconds
SWIFT_USER=swift
SWIFT_GROUP=swift
DRY_RUN=""
usage()
{
cat <<EOF
Description:
Copy ring(s) accross cluster
( store & proxy )
Usage:
$0 <cluster-name> [ <account|container|object|object-1|...> | all ]
Options:
-h: show this help menu
-b: bypass validation routines
-v: validation only
-n: dry-run
EOF
exit 1
}
while getopts "hbvn" o; do
case "${o}" in
h)
usage
;;
b)
VALIDATE_RING=false
echo "WARN: bypassing validation routines"
;;
v)
echo "INFO: validation only"
STOP_AFTER_VALIDATION=true
;;
n)
DRY_RUN="-n"
echo "INFO: dry-run mode"
;;
?)
echo "Invalid option" && exit 1
;;
esac
done
shift $((OPTIND-1))
if [ $# -ne 2 ] ; then
echo "ERROR: Two arguments expected"
usage
fi
CLUSTER_NAME=${1}
LOCAL_RING_PATH="/var/lib/oci/clusters/${CLUSTER_NAME}/swift-ring"
# make sure we have ring
if ! [ -d ${LOCAL_RING_PATH} ]; then
echo "ERROR: Swift ring directory does not exist"
exit 1
fi
# Build available ring list
AVAILABLE_RINGS=""
for ring in $(ls ${LOCAL_RING_PATH}/ | grep -E '^(account|container|object).*?\.builder'); do
AVAILABLE_RINGS="${AVAILABLE_RINGS} ${ring%.builder}"
done
if [ ! -e "${LOCAL_RING_PATH}/${2}.builder" ] && [ "${2}" != "all" ]; then
echo "ERROR: Not a valid/existing ring type"
exit 1
fi
# Validate rings
if [ "${VALIDATE_RING}" = true ]; then
if [ "${2}" = "all" ]; then
for ring in "${AVAILABLE_RINGS}"; do
echo "INFO: Validate $ring : "
swift-ring-builder ${LOCAL_RING_PATH}/${ring}.builder validate
if [ $? -ne 0 ]; then exit 1; else echo "OK"; fi
done
else
echo "INFO: Validate $2 : "
swift-ring-builder ${LOCAL_RING_PATH}/${2}.builder validate
if [ $? -ne 0 ]; then exit 1; else echo "OK"; fi
fi
fi
if [ "${STOP_AFTER_VALIDATION}" = true ]; then
exit 0
fi
HOSTLIST=$(ocicli -csv machine-list -a | q -H -d, "SELECT hostname FROM - WHERE hostname LIKE '%swiftstore%' OR hostname LIKE '%swiftproxy%'")
WANTED_RINGS=""
# build ring list to copy
if [ "${2}" = "all" ]; then
for ring in ${AVAILABLE_RINGS}; do
WANTED_RINGS="${WANTED_RINGS} ${LOCAL_RING_PATH}/${ring}.ring.gz ${LOCAL_RING_PATH}/${ring}.builder"
done
else
WANTED_RINGS="${LOCAL_RING_PATH}/${2}.builder ${LOCAL_RING_PATH}/${2}.ring.gz"
fi
# iterate proxies & stores
for host in ${HOSTLIST}; do
echo -n "INFO: Replicate ${2} ring(s) to: $host : "
output=$(rsync ${DRY_RUN} --timeout=${RSYNC_TIMEOUT} --perms --owner=${SWIFT_USER} --group=${SWIFT_GROUP} --usermap=*:${SWIFT_USER} --groupmap=*:${SWIFT_GROUP} -e "ssh -i ${DEPLOY_KEY}" ${WANTED_RINGS} ${host}:${REMOTE_RING_PATH})
if [ "$?" -eq "0" ]; then
echo "done"
else
echo "failed"
echo "${output}"
fi
done
|