tripleo-incubator/scripts/devtest_testenv.sh
Matthew Gilliard c4e39764a8 Allow user to keep virsh instances alive
Any call to devtest_testenv.sh attempts to remove all virsh instances
defined in that test environment. A user might want to configure a set
of VMs manually for use in the undercloud and overcloud later on, but
still take advantage of the functionality provided by _testenv.sh

This patch adds an optional parameter to devtest_testenv which, if
supplied, skips the destruction of UC and OC VMs. A user who does this
will have to provide their own nodes.json which describes the VMs they
have created. The seed VM is still destroyed and recreated as it is
unlikely to need any customisation. This makes the VM-deploy and
BM-deploy more aligned, in that you can have a set of predefined nodes
for your tripleo system and boot a generic seed to deploy onto them.

Part of bp targeted-node-deployment

Change-Id: If7679d74108bc7064df268c240df5fff6a76d69b
2014-08-04 08:34:19 +00:00

250 lines
8.2 KiB
Bash
Executable File

#!/bin/bash
#
# Test environment creation for devtest.
# This creates the bridge and VM's
set -eu
set -o pipefail
SCRIPT_NAME=$(basename $0)
SCRIPT_HOME=$(dirname $0)
function show_options () {
echo "Usage: $SCRIPT_NAME [options] {JSON-filename}"
echo
echo "Setup a TripleO devtest environment."
echo
echo "Options:"
echo " -b -- Name of an already existing OVS bridge to use for "
echo " the public interface of the seed."
echo " -h -- This help."
echo " -n -- Test environment number to add the seed to."
echo " -s -- SSH private key path to inject into the JSON."
echo " If not supplied, defaults to ~/.ssh/id_rsa_virt_power"
echo " --nodes NODEFILE -- You are supplying your own list of hardware."
echo " The schema for nodes can be found in the devtest_setup"
echo " documentation."
echo
echo " --bm-networks NETFILE -- You are supplying your own network layout."
echo " The schema for baremetal-network can be found in"
echo " the devtest_setup documentation."
echo
echo " --keep-vms -- Prevent cleanup of virsh instances for"
echo " undercloud and overcloud"
echo "JSON-filename -- the path to write the environment description to."
echo
echo "Note: This adds a unique key to your authorised_keys file to permit "
echo "virtual-power-managment calls to be made."
echo
exit $1
}
NODES_PATH=
NETS_PATH=
NUM=
OVSBRIDGE=
SSH_KEY=~/.ssh/id_rsa_virt_power
KEEP_VMS=
TEMP=$(getopt -o h,n:,b:,s: -l nodes:,bm-networks:,keep-vms -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
--nodes) NODES_PATH="$2"; shift 2;;
--bm-networks) NETS_PATH="$2"; shift 2;;
--keep-vms) KEEP_VMS=1; shift;;
-b) OVSBRIDGE="$2" ; shift 2 ;;
-h) show_options 0;;
-n) NUM="$2" ; shift 2 ;;
-s) SSH_KEY="$2" ; shift 2 ;;
--) shift ; break ;;
*) echo "Error: unsupported option $1." ; exit 1 ;;
esac
done
### --include
## devtest_testenv
## ===============
#XXX: When updating, sync with the call in devtest.sh #nodocs
## .. note::
## This script is usually called from ``devtest.sh`` as
## ``devtest_testenv.sh $TE_DATAFILE`` so we should declare
## a JSONFILE variable (which equals to the first positional
## argument) explicitly.
## ::
## JSONFILE=${JSONFILE:-$TE_DATAFILE}
### --end
JSONFILE=${1:-''}
EXTRA_ARGS=${2:-''}
if [ -z "$JSONFILE" -o -n "$EXTRA_ARGS" ]; then
show_options 1
fi
### --include
## #. Set HW resources for VMs used as 'baremetal' nodes. NODE_CPU is cpu count,
## NODE_MEM is memory (MB), NODE_DISK is disk size (GB), NODE_ARCH is
## architecture (i386, amd64). NODE_ARCH is used also for the seed VM.
## A note on memory sizing: TripleO images in raw form are currently
## ~2.7Gb, which means that a tight node will end up with a thrashing page
## cache during glance -> local + local -> raw operations. This significantly
## impairs performance. Of the four minimum VMs for TripleO simulation, two
## are nova baremetal nodes (seed and undercloud) and these need to be 2G or
## larger. The hypervisor host in the overcloud also needs to be a decent size
## or it cannot host more than one VM. The NODE_DISK is set to support
## building 5 overcloud nodes when not using Ironic. If you are building a
## larger overcloud than this without using Ironic you may need to increase
## NODE_DISK.
## 32bit VMs
## ::
## NODE_CPU=1 NODE_MEM=2048 NODE_DISK=40 NODE_ARCH=i386
NODE_CPU=${NODE_CPU:-1} NODE_MEM=${NODE_MEM:-2048} NODE_DISK=${NODE_DISK:-40} NODE_ARCH=${NODE_ARCH:-i386} NODE_CNT=${NODE_CNT:-15} #nodocs
## For 64bit it is better to create VMs with more memory and storage because of
## increased memory footprint (3GB minimum - we suggest 4GB)::
## NODE_CPU=1 NODE_MEM=4096 NODE_DISK=40 NODE_ARCH=amd64
## #. Configure a network for your test environment.
## This configures an openvswitch bridge and teaches libvirt about it.
## ::
setup-network $NUM
## #. Configure a seed VM. This VM has a disk image manually configured by
## later scripts, and hosts the statically configured seed which is used
## to bootstrap a full dynamically configured baremetal cloud. The seed VM
## specs can be configured with the environment variables SEED_CPU and
## SEED_MEM (MB). It defaults to the NODE_CPU and NODE_MEM values, since
## the seed is equivalent to an undercloud in resource requirements.
## ::
BRIDGE=
SEED_ARGS="-a $NODE_ARCH"
if [ -n "$NUM" ]; then
SEED_ARGS="$SEED_ARGS -o seed_${NUM}"
fi
if [ -n "$OVSBRIDGE" ]; then
BRIDGE="brbm${NUM}"
SEED_ARGS="$SEED_ARGS -b $BRIDGE -p $OVSBRIDGE"
fi
SEED_CPU=${SEED_CPU:-${NODE_CPU}}
SEED_MEM=${SEED_MEM:-${NODE_MEM}}
## #. Clean up any prior environment. Unless the --keep-vms argument is
## passed to the script, VMs for the undercloud and overcloud are
## destroyed
## ::
if [ -z "$KEEP_VMS" ]; then
if [ -n "$NUM" ]; then
cleanup-env -n $NUM
else
cleanup-env
fi
fi
#Now start creating the new environment
setup-seed-vm $SEED_ARGS -c ${SEED_CPU} -m $((1024 * ${SEED_MEM}))
## #. What user will be used to ssh to run virt commands to control our
## emulated baremetal machines.
## ::
SSH_USER=$(whoami)
## #. What IP address to ssh to for virsh operations.
## ::
HOSTIP=${HOSTIP:-192.168.122.1}
## #. If a static SEEDIP is in use, define it here. If not defined it will be
## looked up in the ARP table by the seed MAC address during seed deployment.
## ::
if [ -n "$NETS_PATH" ]; then
# if the value is not set try the default 192.0.2.1.
SEEDIP=$(jq '.["seed"]["ip"] // "192.0.2.1"' -r $NETS_PATH)
else
SEEDIP=${SEEDIP:-''}
fi
## #. Set the default bare metal power manager. By default devtest uses
## nova.virt.baremetal.virtual_power_driver.VirtualPowerManager to
## support a fully virtualized TripleO test environment. You may
## optionally customize this setting if you are using real baremetal
## hardware with the devtest scripts. This setting controls the
## power manager used in both the seed VM and undercloud for Nova Baremetal.
## ::
POWER_MANAGER=${POWER_MANAGER:-'nova.virt.baremetal.virtual_power_driver.VirtualPowerManager'}
## #. Ensure we can ssh into the host machine to turn VMs on and off.
## The private key we create will be embedded in the seed VM, and delivered
## dynamically by heat to the undercloud VM.
## ::
# generate ssh authentication keys if they don't exist
if [ ! -f $SSH_KEY ]; then
ssh-keygen -t rsa -N "" -C virtual-power-key -f $SSH_KEY
fi
# make the local id_rsa_virt_power.pub be in ``.ssh/authorized_keys`` before
# that is copied into images via ``local-config``
if ! grep -qF "$(cat ${SSH_KEY}.pub)" ~/.ssh/authorized_keys; then
cat ~/.ssh/id_rsa_virt_power.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
fi
## #. Wrap this all up into JSON.
## ::
jq "." <<EOF > $JSONFILE
{
"arch":"$NODE_ARCH",
"host-ip":"$HOSTIP",
"power_manager":"$POWER_MANAGER",
"seed-ip":"$SEEDIP",
"ssh-key":"$(cat $SSH_KEY)",
"ssh-user":"$SSH_USER"
}
EOF
## #. If you have an existing bare metal cloud network to use, use it. See
## `baremetal-network` section in :ref:`devtest-environment-configuration`
## for more details
## ::
devtest_update_network.sh ${NETS_PATH:+--bm-networks $NETS_PATH} $JSONFILE
## #. If you have an existing set of nodes to use, use them.
## ::
if [ -n "$NODES_PATH" ]; then
JSON=$(jq -s '.[0].nodes=.[1] | .[0]' $JSONFILE $NODES_PATH)
echo "${JSON}" > $JSONFILE
else
## #. Create baremetal nodes for the test cluster. If the required number of
## VMs changes in future, you can run cleanup-env and then recreate with
## more nodes.
## ::
create-nodes $NODE_CPU $NODE_MEM $NODE_DISK $NODE_ARCH $NODE_CNT $SSH_USER $HOSTIP $JSONFILE $BRIDGE
### --end
fi