diff options
| author | Vu Tran <vu.tran@windriver.com> | 2014-04-09 19:59:09 -0400 |
|---|---|---|
| committer | Bruce Ashfield <bruce.ashfield@windriver.com> | 2014-04-11 14:15:28 -0400 |
| commit | 322d51de8417142c6ffbf024b198b26069a53f46 (patch) | |
| tree | 7dc20eedcd969ecff64b57061a5263387fe1b424 /meta-openstack/recipes-devtools/python/python-swift | |
| parent | c173214e9c25409944144c9b4bd9892949a834ba (diff) | |
| download | meta-cloud-services-322d51de8417142c6ffbf024b198b26069a53f46.tar.gz | |
swift: add setup package
Introduce swift setup package. At boot time, this
package setups a simple swift cluster including:
* 3 zones
* each zone has 1 storage device which are based
on loopback devices which the backing files size
is controlled by variable SWIFT_BACKING_FILE_SIZE
The script /etc/swift/swift_setup.sh is also provided to ease
the task of setting up a complicated Swift cluster. It reads a
cluster config file, which describes what storage devices are
included in what rings, and constructs the cluster.
For details of how to use swift_setup.sh and the format
of Swift cluster config file please refer to the
script's help:
$ swift_setup.sh
Signed-off-by: Vu Tran <vu.tran@windriver.com>
Diffstat (limited to 'meta-openstack/recipes-devtools/python/python-swift')
3 files changed, 376 insertions, 0 deletions
diff --git a/meta-openstack/recipes-devtools/python/python-swift/cluster.conf b/meta-openstack/recipes-devtools/python/python-swift/cluster.conf new file mode 100644 index 0000000..3cab8bd --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-swift/cluster.conf | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | # Swift cluster config file | ||
| 2 | # | ||
| 3 | # Each line specifies one storage device with the following format: | ||
| 4 | # | ||
| 5 | # <dev file>, <dev format>, <zone>, <ring names>, <weight> | ||
| 6 | # | ||
| 7 | # <dev file>: full path to a block device or full path to regular | ||
| 8 | # file which is used for backing up a loopback device. | ||
| 9 | # If <dev file> is empty string then this device is | ||
| 10 | # backed up by a directory in local filesystem. | ||
| 11 | # <dev format>: the disk format type, e.g. ext4, xfs... | ||
| 12 | # <zone>: the zone id which this block device belongs to | ||
| 13 | # <ring names>: a list (separated by space) ring name ("account", "container", | ||
| 14 | # or "object") which this device is added to | ||
| 15 | # <weight>: weight of this device in Swift zone | ||
| 16 | # | ||
| 17 | # Examples: | ||
| 18 | # | ||
| 19 | # /dev/sda1, ext4, 1, account, 1 | ||
| 20 | # /dev/sda2, ext4, 1, container, 1 | ||
| 21 | # /dev/sda3, ext4, 1, object, 1 | ||
| 22 | # /dev/sdb1, ext4, 2, account container object, 1 | ||
| 23 | # /dev/sdb2, ext4, 2, account container object, 1 | ||
| 24 | # /dev/sdb3, ext4, 2, account container object, 1 | ||
| 25 | # , ext4, 1, account container object, 1 | ||
| 26 | # , ext4, 2, account container object, 1 | ||
| 27 | # , ext4, 3, account container object, 1 | ||
| 28 | |||
| 29 | |||
| 30 | %SWIFT_BACKING_FILE_1%, ext4, 1, account container object, 1 | ||
| 31 | %SWIFT_BACKING_FILE_2%, ext4, 2, account container object, 1 | ||
| 32 | %SWIFT_BACKING_FILE_3%, ext4, 3, account container object, 1 | ||
diff --git a/meta-openstack/recipes-devtools/python/python-swift/swift.init b/meta-openstack/recipes-devtools/python/python-swift/swift.init new file mode 100644 index 0000000..cf12066 --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-swift/swift.init | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | |||
| 3 | # chkconfig: 2345 20 20 | ||
| 4 | |||
| 5 | ### BEGIN INIT INFO | ||
| 6 | # Provides: swift-openstack | ||
| 7 | # Required-Start: $remote_fs $syslog | ||
| 8 | # Required-Stop: $remote_fs $syslog | ||
| 9 | # Default-Start: 3 5 | ||
| 10 | # Default-Stop: 0 1 2 6 | ||
| 11 | # Short-Description: OpenStack Swift | ||
| 12 | # Description: OpenStack Swift | ||
| 13 | ### END INIT INFO | ||
| 14 | |||
| 15 | |||
| 16 | DESC="Swift Cluster" | ||
| 17 | SWIFT_HOME=/etc/swift | ||
| 18 | SWIFT_INIT=/usr/bin/swift-init | ||
| 19 | |||
| 20 | start () | ||
| 21 | { | ||
| 22 | echo -n "Starting $DESC..." | ||
| 23 | if [ ! -e $SWIFT_HOME/account.builder -a ! -e $SWIFT_HOME/container.builder -a ! -e $SWIFT_HOME/object.builder ]; then | ||
| 24 | echo "no Swift cluster has been setup, failed." | ||
| 25 | exit 1 | ||
| 26 | fi | ||
| 27 | /etc/swift/swift_setup.sh mountdevs | ||
| 28 | $SWIFT_INIT proxy-server start | ||
| 29 | $SWIFT_INIT account-server start | ||
| 30 | $SWIFT_INIT container-server start | ||
| 31 | $SWIFT_INIT object-server start | ||
| 32 | echo "done." | ||
| 33 | } | ||
| 34 | |||
| 35 | |||
| 36 | stop () | ||
| 37 | { | ||
| 38 | echo -n "Stopping $DESC..." | ||
| 39 | $SWIFT_INIT all stop | ||
| 40 | /etc/swift/swift_setup.sh unmountdevs | ||
| 41 | echo "done." | ||
| 42 | } | ||
| 43 | |||
| 44 | |||
| 45 | status () | ||
| 46 | { | ||
| 47 | $SWIFT_INIT proxy-server status | ||
| 48 | $SWIFT_INIT account-server status | ||
| 49 | $SWIFT_INIT container-server status | ||
| 50 | $SWIFT_INIT object-server status | ||
| 51 | } | ||
| 52 | |||
| 53 | |||
| 54 | case "$1" in | ||
| 55 | start) | ||
| 56 | start | ||
| 57 | ;; | ||
| 58 | stop) | ||
| 59 | stop | ||
| 60 | ;; | ||
| 61 | restart|force-reload) | ||
| 62 | stop | ||
| 63 | start | ||
| 64 | ;; | ||
| 65 | status) | ||
| 66 | status | ||
| 67 | ;; | ||
| 68 | *) | ||
| 69 | echo "Usage: swift {start|stop|force-reload|restart|status}" | ||
| 70 | exit 1 | ||
| 71 | ;; | ||
| 72 | esac | ||
| 73 | |||
| 74 | exit 0 | ||
diff --git a/meta-openstack/recipes-devtools/python/python-swift/swift_setup.sh b/meta-openstack/recipes-devtools/python/python-swift/swift_setup.sh new file mode 100644 index 0000000..c1d02ed --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-swift/swift_setup.sh | |||
| @@ -0,0 +1,270 @@ | |||
| 1 | #!/bin/bash | ||
| 2 | |||
| 3 | #set -x | ||
| 4 | |||
| 5 | SWIFT_RING_BUILDER=/usr/bin/swift-ring-builder | ||
| 6 | |||
| 7 | |||
| 8 | for_each_dev_in_cluster () | ||
| 9 | { | ||
| 10 | local cmd=$1 | ||
| 11 | |||
| 12 | dev_id=0 | ||
| 13 | while read line; do | ||
| 14 | line=`echo $line | sed -e 's/^ *//g' -e 's/ *$//g'` | ||
| 15 | [ -z "$line" ] && continue | ||
| 16 | |||
| 17 | dev=`echo $line | cut -d ',' -f 1 | sed -e 's/^ *//g' -e 's/ *$//g'` | ||
| 18 | dev_format=`echo $line | cut -d ',' -f 2 | sed -e 's/^ *//g' -e 's/ *$//g'` | ||
| 19 | zone=`echo $line | cut -d ',' -f 3 | sed -e 's/^ *//g' -e 's/ *$//g'` | ||
| 20 | ring_names=`echo $line | cut -d ',' -f 4 | sed -e 's/^ *//g' -e 's/ *$//g'` | ||
| 21 | weight=`echo $line | cut -d ',' -f 5 | sed -e 's/^ *//g' -e 's/ *$//g'` | ||
| 22 | |||
| 23 | [[ "${dev:0:1}" == "#" ]] && continue | ||
| 24 | if [ ! -z $dev ] && [ ! -e $dev ]; then | ||
| 25 | continue | ||
| 26 | fi | ||
| 27 | dev_id=$((dev_id+1)) | ||
| 28 | $cmd "$dev" "$dev_format" "$dev_id" "$zone" "$ring_names" "$weight" $2 $3 $4 | ||
| 29 | done < $cluster_conf | ||
| 30 | } | ||
| 31 | |||
| 32 | |||
| 33 | mount_dev () | ||
| 34 | { | ||
| 35 | local dev=$1 | ||
| 36 | local dev_id=$3 | ||
| 37 | local zone=$4 | ||
| 38 | |||
| 39 | mkdir -p $swift_home/node/z${zone}d${dev_id} | ||
| 40 | [ -z "$dev" ] && return 1 | ||
| 41 | if [ -b $dev ]; then | ||
| 42 | mount $dev $swift_home/node/z${zone}d${dev_id} | ||
| 43 | else | ||
| 44 | loopdev=`losetup --show -f $dev` | ||
| 45 | mount $loopdev $swift_home/node/z${zone}d${dev_id} | ||
| 46 | fi | ||
| 47 | } | ||
| 48 | |||
| 49 | |||
| 50 | unmount_dev () | ||
| 51 | { | ||
| 52 | local dev=$1 | ||
| 53 | |||
| 54 | [ -z "$dev" ] && return 1 | ||
| 55 | if [ -b $dev ]; then | ||
| 56 | umount $dev | ||
| 57 | else | ||
| 58 | loopdev=`losetup -j $dev | cut -d ":" -f 1 | tail -1` | ||
| 59 | if [ ! -z $loopdev ]; then | ||
| 60 | umount $loopdev | ||
| 61 | losetup -d $loopdev | ||
| 62 | fi | ||
| 63 | fi | ||
| 64 | } | ||
| 65 | |||
| 66 | |||
| 67 | format_dev () | ||
| 68 | { | ||
| 69 | local dev=$1 | ||
| 70 | local dev_format=$2 | ||
| 71 | |||
| 72 | [ -z "$dev" ] && return 1 | ||
| 73 | if [ -b $dev ]; then | ||
| 74 | mkfs.${dev_format} $dev | ||
| 75 | else | ||
| 76 | loopdev=`losetup --show -f $dev` | ||
| 77 | mkfs.${dev_format} $loopdev | ||
| 78 | sleep 2 | ||
| 79 | losetup -d $loopdev | ||
| 80 | fi | ||
| 81 | } | ||
| 82 | |||
| 83 | |||
| 84 | add_dev () | ||
| 85 | { | ||
| 86 | local dev_id=$3 | ||
| 87 | local zone=$4 | ||
| 88 | local ring_names=$5 | ||
| 89 | local weight=$6 | ||
| 90 | |||
| 91 | account_port=6002 | ||
| 92 | container_port=6001 | ||
| 93 | object_port=6000 | ||
| 94 | |||
| 95 | for ring in $ring_names; do | ||
| 96 | eval builder_port=\$${ring}_port | ||
| 97 | [ -z $builder_port ] && continue | ||
| 98 | $SWIFT_RING_BUILDER $swift_home/${ring}.builder add -r 1 -z $zone -i $host_ip -p $builder_port -d z${zone}d${dev_id} -w $weight | ||
| 99 | done | ||
| 100 | } | ||
| 101 | |||
| 102 | |||
| 103 | cluster_create_rings () | ||
| 104 | { | ||
| 105 | if [ ! -f $SWIFT_RING_BUILDER ]; then | ||
| 106 | echo "ERROR: Swift packages are not installed on this machine" | ||
| 107 | return 1 | ||
| 108 | fi | ||
| 109 | |||
| 110 | if [ -e $swift_home/account.builder -o -e $swift_home/container.builder -o -e $swift_home/object.builder ]; then | ||
| 111 | echo "ERROR: Swift cluster has been created" | ||
| 112 | return 1 | ||
| 113 | fi | ||
| 114 | |||
| 115 | sed "s/^swift_hash_path_suffix =.*/swift_hash_path_suffix = `uuidgen`/" -i $swift_home/swift.conf | ||
| 116 | |||
| 117 | # Create 3 ring builders: each ring has 2^12 partition | ||
| 118 | $SWIFT_RING_BUILDER $swift_home/account.builder create 12 $cluster_replica 1 | ||
| 119 | $SWIFT_RING_BUILDER $swift_home/container.builder create 12 $cluster_replica 1 | ||
| 120 | $SWIFT_RING_BUILDER $swift_home/object.builder create 12 $cluster_replica 1 | ||
| 121 | } | ||
| 122 | |||
| 123 | |||
| 124 | cluster_add_devs () | ||
| 125 | { | ||
| 126 | for_each_dev_in_cluster add_dev | ||
| 127 | |||
| 128 | $SWIFT_RING_BUILDER $swift_home/account.builder rebalance | ||
| 129 | $SWIFT_RING_BUILDER $swift_home/container.builder rebalance | ||
| 130 | $SWIFT_RING_BUILDER $swift_home/object.builder rebalance | ||
| 131 | } | ||
| 132 | |||
| 133 | |||
| 134 | cluster_delete_all () | ||
| 135 | { | ||
| 136 | for_each_dev_in_cluster unmount_dev | ||
| 137 | rm -rf $swift_home/*.ring.gz | ||
| 138 | rm -rf $swift_home/*.builder | ||
| 139 | rm -rf $swift_home/node | ||
| 140 | } | ||
| 141 | |||
| 142 | |||
| 143 | help () | ||
| 144 | { | ||
| 145 | cat << EOF | ||
| 146 | usage: swift_setup.sh [-hcirk] <command> | ||
| 147 | |||
| 148 | -h : View this help | ||
| 149 | -c : Swift cluster config file, default is /etc/swift/cluster.conf | ||
| 150 | -i : IP address of this machine, default is 127.0.0.1 | ||
| 151 | -r : The number of Swift replications | ||
| 152 | -k : Location where Swift builder and ring files stay, default is /etc/swift | ||
| 153 | |||
| 154 | <command> can be one of the followings: | ||
| 155 | |||
| 156 | createrings : Create Swift account, container, and object builder | ||
| 157 | clean : Delete all Swift build and ring files | ||
| 158 | mountdevs : Mount all devices specified in cluster config file | ||
| 159 | unmountdevs : Un-mount all devices specified in cluster config file | ||
| 160 | formatdevs : Format all devices specified in cluster config file | ||
| 161 | adddevs : Add all devices specified in cluster config file into | ||
| 162 | Swift rings | ||
| 163 | |||
| 164 | swift_setup.sh script helps to create or expand Swift cluster with | ||
| 165 | storage devices in this machine. | ||
| 166 | |||
| 167 | The Swift cluster config file (default is /etc/swift/cluster.conf) describes | ||
| 168 | how storage devices in this machine can be added into Swift cluster. | ||
| 169 | |||
| 170 | Each line of cluster config file specifies how one storage device can be | ||
| 171 | added into Swift cluster with the following format: | ||
| 172 | |||
| 173 | <dev file>, <dev format>, <zone>, <ring names>, <weight> | ||
| 174 | |||
| 175 | <dev file>: full path to a block device or full path to regular | ||
| 176 | file which is used for backing up a loopback device. | ||
| 177 | If <dev file> is empty string then this device is | ||
| 178 | backed up by a directory in local filesystem. | ||
| 179 | <dev format>: the disk format type, e.g. ext4, xfs... | ||
| 180 | <zone>: the zone id which this block device belongs to | ||
| 181 | <ring names>: a list (separated by space) ring name ("account", "container", | ||
| 182 | or "object") which this device is added to | ||
| 183 | <weight>: weight of this device in Swift zone | ||
| 184 | |||
| 185 | |||
| 186 | Example 1: To add storage devices in this machine into an existing | ||
| 187 | Swift Cluster: | ||
| 188 | |||
| 189 | $ /etc/init.d/swift stop | ||
| 190 | $ Sync the Swift builders and rings files into this machine | ||
| 191 | $ Modify /etc/cluster.conf to specify what storage devices | ||
| 192 | are added into cluster | ||
| 193 | $ swift_setup.sh formatdevs | ||
| 194 | $ swift_setup.sh mountdevs | ||
| 195 | $ swift_setup.sh -i <IP of this machine> adddevs | ||
| 196 | $ swift_setup.sh unmountdevs | ||
| 197 | $ /etc/init.d/swift start | ||
| 198 | |||
| 199 | Example 2: To create an new Swift cluster: | ||
| 200 | |||
| 201 | $ /etc/init.d/swift stop | ||
| 202 | $ Modify /etc/cluster.conf to reflect the desired cluster | ||
| 203 | $ swift_setup.sh clean | ||
| 204 | $ swift_setup.sh createrings | ||
| 205 | $ swift_setup.sh formatdevs | ||
| 206 | $ swift_setup.sh mountdevs | ||
| 207 | $ swift_setup.sh -i <IP of this machine> adddevs | ||
| 208 | $ swift_setup.sh unmountdevs | ||
| 209 | $ /etc/init.d/swift start | ||
| 210 | EOF | ||
| 211 | } | ||
| 212 | |||
| 213 | |||
| 214 | cluster_conf="/etc/swift/cluster.conf" | ||
| 215 | swift_home="/etc/swift" | ||
| 216 | host_ip="127.0.0.1" | ||
| 217 | cluster_replica="2" | ||
| 218 | |||
| 219 | while getopts "?hc:r:i:k:" opt; do | ||
| 220 | case $opt in | ||
| 221 | c) | ||
| 222 | cluster_conf=$OPTARG | ||
| 223 | ;; | ||
| 224 | r) | ||
| 225 | cluster_replica=$OPTARG | ||
| 226 | ;; | ||
| 227 | i) | ||
| 228 | host_ip=$OPTARG | ||
| 229 | ;; | ||
| 230 | k) | ||
| 231 | swift_home=$OPTARG | ||
| 232 | ;; | ||
| 233 | ?|h) | ||
| 234 | help | ||
| 235 | exit 0 | ||
| 236 | ;; | ||
| 237 | esac | ||
| 238 | done | ||
| 239 | |||
| 240 | # Move aside the optional arguments | ||
| 241 | shift $(( $OPTIND - 1 )) | ||
| 242 | |||
| 243 | |||
| 244 | case "$1" in | ||
| 245 | createrings) | ||
| 246 | cluster_create_rings | ||
| 247 | ;; | ||
| 248 | clean) | ||
| 249 | for_each_dev_in_cluster unmount_dev | ||
| 250 | cluster_delete_all | ||
| 251 | ;; | ||
| 252 | mountdevs) | ||
| 253 | for_each_dev_in_cluster mount_dev | ||
| 254 | ;; | ||
| 255 | unmountdevs) | ||
| 256 | for_each_dev_in_cluster unmount_dev | ||
| 257 | ;; | ||
| 258 | formatdevs) | ||
| 259 | for_each_dev_in_cluster format_dev | ||
| 260 | ;; | ||
| 261 | adddevs) | ||
| 262 | cluster_add_devs | ||
| 263 | ;; | ||
| 264 | *) | ||
| 265 | help | ||
| 266 | exit 0 | ||
| 267 | ;; | ||
| 268 | esac | ||
| 269 | |||
| 270 | exit 0 | ||
