From c0f326540c70967db97f72c936c239bd7816576a Mon Sep 17 00:00:00 2001 From: Cyril de Bourgues Date: Fri, 29 Jan 2021 14:10:14 +0100 Subject: [PATCH] some Swift tools --- bin/oci-swift-backup-ring | 57 ++++++++++++++++ bin/oci-swift-replace-weight | 62 +++++++++++++++++ bin/oci-swift-replicate-ring | 128 +++++++++++++++++++++++++++++++++++ 3 files changed, 247 insertions(+) create mode 100755 bin/oci-swift-backup-ring create mode 100755 bin/oci-swift-replace-weight create mode 100644 bin/oci-swift-replicate-ring diff --git a/bin/oci-swift-backup-ring b/bin/oci-swift-backup-ring new file mode 100755 index 00000000..42fce39b --- /dev/null +++ b/bin/oci-swift-backup-ring @@ -0,0 +1,57 @@ +#!/bin/sh + +set -e +# set -x + +TODAY=$(date +%Y.%m.%d_%H%M) + +usage() +{ + cat < + +Options: + -h: show this help menu +EOF + + exit 1 +} + +while getopts "h" o; do + case "${o}" in + h) + usage + ;; + ?) + echo "Invalid option" && exit 1 + ;; + esac +done +shift $((OPTIND-1)) + +if [ -z "${1}" ]; then + usage +fi + +LOCAL_RING_PATH="/var/lib/oci/clusters/${1}/swift-ring" +BACKUP_PATH="/var/backups/oci/clusters/${1}/swift/rings" + +# make sure we have ring +if ! [ -d ${LOCAL_RING_PATH} ]; then + echo "ERROR: Swift ring directory does not exist" + exit 1 +fi + +# prepare backup destination folder +if ! [ -d ${BACKUP_PATH} ]; then + mkdir -p ${BACKUP_PATH} +fi + +# backup all available ring types +for ring in $(ls ${LOCAL_RING_PATH}/ | grep -E '^(account|container|object).*?\.builder'); do + cp ${ring}* ${BACKUP_PATH}/${TODAY}.${ring} +done diff --git a/bin/oci-swift-replace-weight b/bin/oci-swift-replace-weight new file mode 100755 index 00000000..79b032a1 --- /dev/null +++ b/bin/oci-swift-replace-weight @@ -0,0 +1,62 @@ +#!/bin/bash + +set -e +# set -x + +usage() +{ + cat < + +Options: + -h: show this help menu +EOF + + exit 1 +} + +while getopts "h" o; do + case "${o}" in + h) + usage + ;; + ?) + echo "Invalid option" && exit 1 + ;; + esac +done +shift $((OPTIND-1)) + +if [ $# -ne 4 ] ; then + echo "ERROR: Four arguments expected" + usage +fi + +CLUSTER_NAME=${1} +RING_TYPE=${2} +SOURCE_WEIGHT=${3} +DEST_WEIGHT=${4} +LOCAL_RING_PATH="/var/lib/oci/clusters/${CLUSTER_NAME}/swift-ring" + +# Build available ring list +AVAILABLE_RINGS=() +for ring in $(ls ${LOCAL_RING_PATH}/ | grep -E '^(account|container|object).*?\.builder'); do + AVAILABLE_RINGS+=("${ring%.builder}") +done + +if [[ ! " ${AVAILABLE_RINGS[@]} " == *" ${2} "* ]] && [[ "${2}" != "all" ]]; then + echo "ERROR: Not a valid/existing ring type" + exit 1 +fi + +TMPFILE=$(mktemp) +swift-ring-builder ${RING_TYPE}.builder | grep " ${SOURCE_WEIGHT}.00" | awk '{print $4}' | cut -d: -f1 | sort -u >${TMPFILE} +for i in $(cat ${TMPFILE}) ; do + swift-ring-builder ${RING_TYPE}.builder set_weight ${i} ${DEST_WEIGHT} -y +done + +rm ${TMPFILE} diff --git a/bin/oci-swift-replicate-ring b/bin/oci-swift-replicate-ring new file mode 100644 index 00000000..36e4d4af --- /dev/null +++ b/bin/oci-swift-replicate-ring @@ -0,0 +1,128 @@ +#!/bin/bash + +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 < | 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+=("${ring%.builder}") +done + +if [[ ! " ${AVAILABLE_RINGS[@]} " == *" ${2} "* ]] && [[ "${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 + printf "INFO: Validate $ring : " + swift-ring-builder ${LOCAL_RING_PATH}/${ring}.builder validate + if [[ $? -ne 0 ]]; then exit 1; else echo "OK"; fi + done + else + printf "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+=(${LOCAL_RING_PATH}/${ring}*) + done +else + WANTED_RINGS+=(${LOCAL_RING_PATH}/${2}*) +fi + +# iterate proxies & stores +for host in ${HOSTLIST}; do + printf "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 -- GitLab