File: oci-swift-replicate-ring

package info (click to toggle)
openstack-cluster-installer 43.0.19
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 4,540 kB
  • sloc: php: 19,150; sh: 18,091; ruby: 75; makefile: 31; xml: 8
file content (128 lines) | stat: -rwxr-xr-x 2,878 bytes parent folder | download | duplicates (5)
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