#!/bin/bash
# See documentation for using the reproducer script:
# README-reproducer-quickstart.html
# (in the same top-level logs directory as this reproducer script).
: ${WORKSPACE:=$(mktemp -d -t reproduce-tmp.XXXXX)}
: ${CREATE_VIRTUALENV:=false}
: ${REMOVE_STACKS_KEYPAIRS:=false}
: ${NODESTACK_PREFIX:=""}
: ${AUTORUN:=0}
: ${TIMEOUT:=240}
: ${LIBVIRT:=0}
: ${TOCI_JOBTYPE:="multinode-1ctlr-featureset030"}
: ${NODES_FILE:="/config/nodes/1ctlr.yml"}
: ${ZUUL_CHANGES:=""}
: ${EXTRA_PARAMS:=""}
: ${IN_PLACE:=false}
SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
usage () {
echo "Usage: $0 [options]"
echo ""
echo "Options:"
echo " -w, --workspace
"
echo " directory where the virtualenv, inventory files, etc."
echo " are created. Defaults to creating a directory in /tmp"
echo " -i, --in-place"
echo " Avoid wiping tq[e] repositories if they already exist"
echo " and just pull --rebase them. [IN_PLACE=true]"
echo " -v, --create-virtualenv"
echo " create a virtualenv to install Ansible and dependencies."
echo " Options to pass true/false. Defaults to true for OVB. "
echo " Defaults to false for other deployment types."
echo " -r, --remove-stacks-keypairs"
echo " delete all Heat stacks (both Multinode and OVB created) "
echo " in the tenant before deployment."
echo " Will also delete associated keypairs if they exist."
echo " Options to pass true/false. Defaults to false."
echo " -p, --nodestack-prefix"
echo " add a unique prefix for multinode and singlenode stacks"
echo " Defaults to empty."
echo " -a, --autorun"
echo " Run job on prepared environment automatically"
echo " Default is to stop after environment is ready"
echo " -t, --timeout"
echo " Timeout in minutes for the deployment"
echo " Default is 240 minutes"
echo " -l, --libvirt"
echo " Runs a 2-node multinode job or singlenode job on a"
echo " single virthost using libvirt to create the nodes."
echo " The script sets the virthost to be 127.0.0.2"
echo " so the reproducer must be run from the virthost."
echo " If a singlenode reproducer is run, two VMs will still be created."
echo " -n, --nodes-file"
echo " Node config file of the topology needed"
echo " default: $NODES_FILE"
echo " -z, --zuul-changes"
echo " Refspecs with changes to test"
echo " default: $ZUUL_CHANGES"
echo " -j, --toci-jobtype"
echo " TOCI description of the job to run"
echo " default: $TOCI_JOBTYPE"
echo " -e, --extra-params"
echo " File or/and parameters used to override default"
echo " parameters for playbooks. Multiple files"
echo " can be passed [-e @file1.yml -e @file2.yml ...]"
echo " and arguments [-e var=value -e var2=value2 ...]"
echo " -h, --help print this help and exit"
}
set -e
# Input argument assignments
while [ "x$1" != "x" ]; do
case "$1" in
--workspace|-w)
# realpath fails if /some/path doesn't exist. It is created later
WORKSPACE=$(realpath $2 || echo -n $2)
shift
;;
--in-place|-i)
IN_PLACE=true
shift
;;
--create-virtualenv|-v)
CREATE_VIRTUALENV=$2
shift
;;
--remove-stacks-keypairs|-r)
REMOVE_STACKS_KEYPAIRS=$2
shift
;;
--nodestack-prefix|-p)
NODESTACK_PREFIX=$2
shift
;;
--autorun|-a)
AUTORUN=1
;;
--timeout|-t)
TIMEOUT=$2
shift
;;
--libvirt|-l)
LIBVIRT=1
;;
--extra-params|-e)
[[ ${2::1} == "@" ]] && EXTRA_PARAMS+=("-e @$(realpath ${2#@}) ") || EXTRA_PARAMS+=("-e ${2} ")
shift
;;
--nodes-file|-n)
NODES_FILE=$2
shift
;;
--zuul-changes|-z)
ZUUL_CHANGES=$2
shift
;;
--toci-jobtype|-j)
TOCI_JOBTYPE=$2
shift
;;
--help|-h)
usage
exit
;;
--) shift
break
;;
-*) echo "ERROR: unknown option: $1" >&2
usage >&2
exit 2
;;
*) break
;;
esac
shift
done
function check_installed {
local binary=$1
if ! which $binary >/dev/null ; then
echo "Error: Could not find required binary $binary. Ensure you have
it installed before trying again."
return 1
fi
}
BOOTSTRAP_DEPENDENCIES=("git" "virtualenv" "ansible" "pip" "openstack" "heat")
function check_bootstrap_dependencies {
status=0
for dependency in ${BOOTSTRAP_DEPENDENCIES[@]} ; do
check_installed $dependency || status=1
done
return $status
}
# Check that tenant credentials have been sourced
# when deploying on a host cloud
if [[ (! -v OS_TENANT_NAME) && ("$LIBVIRT" != "1") ]]; then
# TODO(aschultz): work around for LP#1750455
if [[ -v OS_PROJECT_NAME ]]; then
export OS_TENANT_NAME=$OS_PROJECT_NAME
else
echo "Tenant credentials are not sourced."
exit 1;
fi
fi
set -x
# Exit if running ovb-fakeha-caserver
# This test is not converted to run with tripleo-quickstart
if [[ "$TOCI_JOBTYPE" == *"ovb-fakeha-caserver"* ]]; then
echo "
ovb-fakeha-caserver is not run with tripleo-quickstart.
It can not be reproduced using this script.
"
exit 1;
fi
# Exit of the user request a Libvirt reproducer for an OVB job
if [[ "$TOCI_JOBTYPE" == *"ovb"* && "$LIBVIRT" == "1" ]]; then
echo "
The Libvirt reproducer option is only valid for
Multinode and Singlenode jobs."
exit 1;
fi
set -x
# Export set variables, they make visible to ansible roles
export WORKSPACE
export ZUUL_CHANGES
# Start from a clean workspace
mkdir -p $WORKSPACE
cd $WORKSPACE
[ "$IN_PLACE" == "true" ] || \
rm -rf tripleo-quickstart tripleo-quickstart-extras
# Clone quickstart and quickstart-extras
for REPO in tripleo-quickstart tripleo-quickstart-extras
do
if [ -d "$REPO" ]; then
pushd $REPO
git pull --rebase
popd
else
git clone https://github.com/openstack/$REPO
fi
done
# Set up a virtual env if requested
if [ "$CREATE_VIRTUALENV" = "true" ]; then
check_installed virtualenv
virtualenv $WORKSPACE/venv_ansible
source $WORKSPACE/venv_ansible/bin/activate
pip install --upgrade setuptools pip
pip install -Ur $WORKSPACE/tripleo-quickstart/requirements.txt
fi
if [ "$REMOVE_STACKS_KEYPAIRS" = "true" ]; then
# The cleanup templates expects there to be in a /bin dir in the workspace # from quickstart setup.
# To use the clients sourced from venv
sed -i "s#{.*/bin/##g" $WORKSPACE/tripleo-quickstart-extras/roles/ovb-manage-stack/templates/cleanup-stacks-keypairs.sh.j2
fi
# sanity check the env has ansible/pip/virtualenv/openstack/etc bootstrap dependencies
check_bootstrap_dependencies
# Export our roles path so that we can use the roles from our workspace
export ANSIBLE_ROLES_PATH=$ANSIBLE_ROLES_PATH:$WORKSPACE/tripleo-quickstart/roles:$WORKSPACE/tripleo-quickstart-extras/roles
export ANSIBLE_HOST_KEY_CHECKING=False
export ANSIBLE_LIBRARY=$WORKSPACE/tripleo-quickstart/library
export ANSIBLE_STDOUT_CALLBACK=${ANSIBLE_STDOUT_CALLBACK:-debug}
if [[ "$LIBVIRT" == "1" ]]; then
echo "Running a libvirt reproducer ..."
# Run from the Virthost
export VIRTHOST=127.0.0.2
echo -e "[virthost]\n$VIRTHOST ansible_connection=local" > $WORKSPACE/virthost
ansible-playbook $WORKSPACE/tripleo-quickstart/playbooks/libvirt-nodepool.yml \
-i $WORKSPACE/virthost \
-e ansible_python_interpreter="/usr/bin/python" \
-e local_working_dir=$WORKSPACE \
-e working_dir=$WORKSPACE \
-e non_root_user=$USER \
-e non_root_group=$USER \
${EXTRA_PARAMS[@]}
HOSTS_FILE="hosts"
else
# Calculate subnode_count
if [[ -z "$NODES_FILE" ]]; then
SUBNODE_COUNT=1
else
SUBNODE_COUNT=$(( $( awk '/node_count: / {print $2}' $WORKSPACE/tripleo-quickstart/$NODES_FILE ) +1 ))
fi
ansible-playbook $WORKSPACE/tripleo-quickstart-extras/playbooks/provision_multinodes.yml \
-e local_working_dir=$WORKSPACE \
-e subnode_count=$SUBNODE_COUNT \
-e ansible_python_interpreter="/usr/bin/python" \
-e prefix=$NODESTACK_PREFIX \
${EXTRA_PARAMS[@]}
HOSTS_FILE="multinode_hosts"
fi
# Run the playbook to setup the undercloud/subnodes to look like nodepool nodes
ansible-playbook $WORKSPACE/tripleo-quickstart-extras/playbooks/nodepool-setup.yml \
-i $WORKSPACE/$HOSTS_FILE \
${EXTRA_PARAMS[@]}
# Get ansible_host
export $(awk '/subnode-0/ {print $2}' $WORKSPACE/$HOSTS_FILE)
EXTRA_VARS="$EXTRA_VARS --extra-vars dlrn_hash_tag_newest=5cd39ae6a0f81814baf3fbca873a3d22a21328b0_06d9e873 "
EXTRA_VARS="$EXTRA_VARS --extra-vars dlrn_hash_tag=3c816154e1de502b95e78b6f41626e831ab52be1_fbb4de96"
# Create the env_vars_to_source file and copy it to the undercloud
cat >"env_vars_to_src.sh" <>"env_vars_to_src.sh" <>"env_vars_to_src.sh" <&1 | tee ~/console.log; exec bash' && screen -RD"
else
# Remove -x so that the instructions don't print twice
set +x
# Instruct the user to execute toci_gate_test.sh on the undercloud
echo "
# Now complete the test execution on the undercloud:
# ssh to the undercloud:
ssh ${SSH_OPTS} zuul@$ansible_host
# Source the environment settings file and run the toci gate script
source /home/zuul/env_vars_to_src.sh
/opt/stack/tripleo-ci/toci_gate_test.sh 2>&1 | tee console.log
# To avoid timeouts, you can start a screen session before executing the commands:
screen -S ci
"
fi