Files
training-labs/oslabs/osbash/tools/restore-cluster.sh
Pranav Salunke 9aae759289 Refactors the architecture of osbash
Changes to the repository layout to incorporate the following:

  1. Migrate to dedicated repository
  2. Rebranding osbash to openstack-labs
  3. Adding Python specific bits
  4. Allowing a wrapper and switch to osbash meanwhile the
     python scripts (stacktrain) is underprogress

The current repository structure will allow us to carry out the above
mentioned changes while the stable code base is usable and will also
allow us to update the version of OpenStack being deployed on osbash.

This is the rough sketch of the repository ignoring the boilerplate:

    .
    |-- doc
    |-- openstack-labs
    |   |-- img
    |   |-- osbash
    |   |   |-- config
    |   |   |-- lib
    |   |   |-- tools
    |   |   |-- scripts
    |   |   |-- osbash.sh
    |   |   `-- wbatch
    |   |-- stacktrain
    |   |   `-- lib
    |   `-- stacktrain.py
    `-- oslabs.py

Note: Also adds/edits existing boilerplate (README's, Tools etc.)

Co-Authored-By: Roger Luethi <rl@patchworkscience.org>
Co-Authored-By: Sayali Lunkad <sayali.92720@gmail.com>
2015-09-29 11:23:32 +02:00

156 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
set -o errexit -o nounset
TOP_DIR=$(cd "$(dirname "$0")/.." && pwd)
source "$TOP_DIR/config/paths"
source "$CONFIG_DIR/deploy.osbash"
source "$CONFIG_DIR/provider.virtualbox"
source "$OSBASH_LIB_DIR/functions-host.sh"
source "$OSBASH_LIB_DIR/virtualbox-functions.sh"
OSBASH=exec_cmd
VM_LIST="controller network compute"
function usage {
# Setting to empty string selects latest (current snapshot)
echo "Usage: $0 {-l|-c|-t <SNAP>} [-s]"
echo ""
echo "-h Help"
echo "-l List snapshots for node VMs"
echo "-c Restore cluster node VMs to current snapshot"
echo "-t SNAP Restore cluster to target snapshot"
echo "-s Start each node VMs after restoring it"
exit
}
function list_snapshots {
for vm_name in $VM_LIST; do
echo -e "Snapshot list for $vm_name node:"
vboxmanage snapshot "$vm_name" list
echo
done
exit 0
}
while getopts :chlst: opt; do
case $opt in
c)
CURRENT=yes
;;
h)
usage
;;
l)
list_snapshots
;;
s)
START=yes
;;
t)
TARGET_SNAPSHOT=$OPTARG
;;
:)
echo "Error: -$OPTARG needs argument"
;;
?)
echo "Error: invalid option -$OPTARG"
echo
usage
;;
esac
done
# Remove processed options from arguments
shift $(( OPTIND - 1 ));
if [ $# -ne 0 ]; then
usage
elif [ -z "${TARGET_SNAPSHOT:-}" -a -z "${CURRENT:-""}" ]; then
echo
echo "Error: no target snapshot given."
echo
usage
elif [ -n "{$TARGET_SNAPSHOT:-}" -a -n "${CURRENT:-""}" ]; then
echo
echo "Error: conflicting options: target snapshot name and -c."
echo
usage
fi
# Find target_snapshot in scripts_cfg and set global *_SNAPSHOT variables
# to the correct snapshot name for each node (to allow building from there)
function set_snapshot_vars {
local target_snapshot=$1
local found=0
local scripts_cfg="$TOP_DIR/config/scripts.ubuntu_cluster"
while read -r line; do
if [[ $line =~ ^cmd\ snapshot.*-n\ ([^ ]*)\ (.*) ]]; then
# Node name (e.g. controller)
node=${BASH_REMATCH[1]}
# Snapshot name (e.g. keystone_installed)
snapshot=${BASH_REMATCH[2]}
# Global variable name (e.g. CONTROLLER_SNAPSHOT)
# Can't use ${node,,} (OS X bash version is only 3.2)
var_name=$(echo "$node"|tr "a-z" "A-Z")_SNAPSHOT
if [ "$snapshot" = "$target_snapshot" ]; then
# Can't use associative arrays (OS X bash version is only 3.2)
eval "${var_name}=$snapshot"
found=1
elif [ $found -eq 0 ]; then
eval "${var_name}=$snapshot"
fi
fi
done < "$scripts_cfg"
if [ $found -eq 0 ]; then
echo "ERROR: snapshot '$target_snapshot' not found"
exit 1
fi
}
function restore_current_snapshot {
local vm_name=$1
vboxmanage snapshot "$vm_name" restorecurrent
}
function restore_named_snapshot {
local vm_name=$1
local snapshot=$2
vboxmanage snapshot "$vm_name" restore "$snapshot"
}
if [ -n "$TARGET_SNAPSHOT" ]; then
set_snapshot_vars "$TARGET_SNAPSHOT"
fi
for vm_name in $VM_LIST; do
vm_power_off "$vm_name"
vm_wait_for_shutdown "$vm_name"
if [ "${CURRENT:-""}" = "yes" ]; then
restore_current_snapshot "$vm_name"
if [ "${START:-""}" = "yes" ]; then
vbox_boot "$vm_name"
fi
else
# Global variable name (e.g. CONTROLLER_SNAPSHOT)
# (use tr due to OS X bash limitation)
var_name=$(echo "$vm_name"|tr "a-z" "A-Z")_SNAPSHOT
if [ -z "${!var_name:=""}" ]; then
vm_delete "$vm_name"
else
restore_named_snapshot "$vm_name" "${!var_name}"
if [ "${START:-""}" = "yes" ]; then
vbox_boot "$vm_name"
fi
fi
fi
done