From 1667957c7b0dcad6287f71c3c3785243fa5d9215 Mon Sep 17 00:00:00 2001 From: marios Date: Thu, 25 Feb 2016 15:26:30 +0200 Subject: [PATCH] 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 --- scripts/upgrade-non-controller.sh | 120 ++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100755 scripts/upgrade-non-controller.sh diff --git a/scripts/upgrade-non-controller.sh b/scripts/upgrade-non-controller.sh new file mode 100755 index 000000000..659a00848 --- /dev/null +++ b/scripts/upgrade-non-controller.sh @@ -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 name or id to upgrade" + echo " --script -- absolute path to the script you wish" + echo " to use for the upgrade" + echo " --query -- 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