Adds a bash script that operators will use during upgrades
Part of the upgrades workflow requires that operators will update the non controller nodes by invoking an upgrade script. This adds a utility bash script for this purpose. The ability to deliver a custom upgrade script is allowed with a --script override. This is delivered to the node before the upgrade is invoked. Change-Id: I06826c7c8b5515208a5883d6c99016101b302cd6
This commit is contained in:
parent
4f26109a40
commit
1667957c7b
|
@ -0,0 +1,120 @@
|
|||
#!/bin/bash
|
||||
#set -x
|
||||
# Copyright 2016 Red Hat, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#
|
||||
# Utility script that will be invoked by the operator as part of the documented
|
||||
# tripleo upgrades workflow at [FIXME(marios): update this].
|
||||
# In short the upgrade scripts are delivered to the non-controller nodes as
|
||||
# part of the automated (heat delivered) controller upgrade. These are then
|
||||
# invoked from this script by the operator. See -h for options.
|
||||
#
|
||||
set -eu
|
||||
set -o pipefail
|
||||
SCRIPT_NAME=$(basename $0)
|
||||
|
||||
#can make the upgrade script overridable (if a different target will be used)
|
||||
UPGRADE_SCRIPT=${UPGRADE_SCRIPT:-/root/tripleo_upgrade_node.sh}
|
||||
UPGRADE_NODE=""
|
||||
QUERY_NODE=""
|
||||
SCRIPT=""
|
||||
|
||||
function show_options {
|
||||
echo "Usage: $SCRIPT_NAME"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " -h, --help -- print this help."
|
||||
echo " --upgrade <nova node> -- nova node name or id to upgrade"
|
||||
echo " --script <absolute_path> -- absolute path to the script you wish"
|
||||
echo " to use for the upgrade"
|
||||
echo " --query <nova node> -- determine upgrade status on node"
|
||||
echo
|
||||
echo "Invoke the tripleo upgrade script on non controller nodes as part of"
|
||||
echo " the tripleo upgrade workflow."
|
||||
echo
|
||||
exit $1
|
||||
}
|
||||
|
||||
TEMP=`getopt -o h -l help,upgrade:,query:,script: -n $SCRIPT_NAME -- "$@"`
|
||||
if [ $? != 0 ]; then
|
||||
echo "Terminating..." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Note the quotes around `$TEMP': they are essential!
|
||||
eval set -- "$TEMP"
|
||||
|
||||
while true ; do
|
||||
case "$1" in
|
||||
--help) show_options 0 >&2;;
|
||||
--upgrade) UPGRADE_NODE="$2" ; shift 2 ;;
|
||||
--script) SCRIPT="$2"; shift 2 ;;
|
||||
--query) QUERY_NODE="$2" ; shift 2 ;;
|
||||
--) shift ; break ;;
|
||||
*) echo "Error: unsupported option $1." ; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
function log {
|
||||
echo "`date` $SCRIPT_NAME $1"
|
||||
}
|
||||
|
||||
function find_nova_node_by_name_or_id {
|
||||
name_or_id=$1
|
||||
node_status=$(nova show $name_or_id | grep status | awk '{print $4}')
|
||||
if ! [[ $node_status == "ACTIVE" ]]; then
|
||||
log "ERROR: node $name_or_id not found to be ACTIVE. Current status is $node_status"
|
||||
exit 1
|
||||
fi
|
||||
log "nova node $name_or_id found with status $node_status"
|
||||
}
|
||||
|
||||
function confirm_script_on_node {
|
||||
name_or_id=$1
|
||||
node_ip=$(nova show $name_or_id | grep "ctlplane network" | awk '{print $5}')
|
||||
log "checking for upgrade script $UPGRADE_SCRIPT on node $name_or_id ($node_ip)"
|
||||
results=$(ssh heat-admin@$node_ip "sudo ls -l $UPGRADE_SCRIPT")
|
||||
log "upgrade script $UPGRADE_SCRIPT found on node $name_or_id ($node_ip)"
|
||||
}
|
||||
|
||||
function deliver_script {
|
||||
script=$1
|
||||
node=$2
|
||||
node_ip=$(nova show $node | grep "ctlplane network" | awk '{print $5}')
|
||||
file_name=$(echo ${script##*/})
|
||||
log "Sending upgrade script $script to $node_ip"
|
||||
scp $script heat-admin@$node_ip:/home/heat-admin/$file_name
|
||||
log "Copying upgrade script to right location and setting permissions"
|
||||
ssh heat-admin@$node_ip "sudo cp /home/heat-admin/$file_name $UPGRADE_SCRIPT ; \
|
||||
sudo chmod 755 $UPGRADE_SCRIPT ; "
|
||||
}
|
||||
|
||||
if [ -n "$UPGRADE_NODE" ]; then
|
||||
find_nova_node_by_name_or_id $UPGRADE_NODE
|
||||
if [ -n "$SCRIPT" ]; then
|
||||
deliver_script $SCRIPT $UPGRADE_NODE
|
||||
fi
|
||||
confirm_script_on_node $UPGRADE_NODE
|
||||
node_ip=$(nova show $UPGRADE_NODE | grep "ctlplane network" | awk '{print $5}')
|
||||
log "Executing $UPGRADE_SCRIPT on $node_ip"
|
||||
ssh heat-admin@$node_ip sudo $UPGRADE_SCRIPT
|
||||
fi
|
||||
|
||||
if [ -n "$QUERY_NODE" ]; then
|
||||
# query for status, can remove this for simplicity
|
||||
find_nova_node_by_name_or_id $QUERY_NODE
|
||||
node_ip=$(nova show $QUERY_NODE | grep "ctlplane network" | awk '{print $5}')
|
||||
ssh heat-admin@$node_ip "sudo journalctl -n 1000 | grep tripleo-upgrade"
|
||||
fi
|
Loading…
Reference in New Issue