403 lines
16 KiB
Bash
Executable File
403 lines
16 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Gate commits to several projects on a VM running those projects
|
|
# configured by devstack.
|
|
|
|
# Copyright (C) 2011-2013 OpenStack Foundation
|
|
#
|
|
# 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.
|
|
|
|
# Most of the work of this script is done in functions so that we may
|
|
# easily redirect their stdout / stderr to log files.
|
|
|
|
GIT_BASE=${GIT_BASE:-https://git.openstack.org}
|
|
GIT_BRANCH=${GIT_BRANCH:-master}
|
|
|
|
# sshd may have been compiled with a default path excluding */sbin
|
|
export PATH=$PATH:/usr/local/sbin:/usr/sbin
|
|
|
|
source $WORKSPACE/devstack-gate/functions.sh
|
|
|
|
start_timer
|
|
|
|
PROJECTS="openstack-dev/devstack $PROJECTS"
|
|
PROJECTS="openstack-dev/grenade $PROJECTS"
|
|
PROJECTS="openstack-dev/pbr $PROJECTS"
|
|
PROJECTS="openstack-infra/jeepyb $PROJECTS"
|
|
PROJECTS="openstack-infra/os-loganalyze $PROJECTS"
|
|
PROJECTS="openstack-infra/pypi-mirror $PROJECTS"
|
|
PROJECTS="openstack-infra/tripleo-ci $PROJECTS"
|
|
PROJECTS="openstack/ceilometer $PROJECTS"
|
|
PROJECTS="openstack/cinder $PROJECTS"
|
|
PROJECTS="openstack/cliff $PROJECTS"
|
|
PROJECTS="openstack/dib-utils $PROJECTS"
|
|
PROJECTS="openstack/diskimage-builder $PROJECTS"
|
|
PROJECTS="openstack/django_openstack_auth $PROJECTS"
|
|
PROJECTS="openstack/glance $PROJECTS"
|
|
PROJECTS="openstack/glance_store $PROJECTS"
|
|
PROJECTS="openstack/heat $PROJECTS"
|
|
PROJECTS="openstack/heat-cfntools $PROJECTS"
|
|
PROJECTS="openstack/heat-templates $PROJECTS"
|
|
PROJECTS="openstack/horizon $PROJECTS"
|
|
PROJECTS="openstack/ironic $PROJECTS"
|
|
PROJECTS="openstack/keystone $PROJECTS"
|
|
PROJECTS="openstack/keystonemiddleware $PROJECTS"
|
|
PROJECTS="openstack/zaqar $PROJECTS"
|
|
PROJECTS="openstack/neutron $PROJECTS"
|
|
PROJECTS="openstack/nova $PROJECTS"
|
|
PROJECTS="openstack/os-apply-config $PROJECTS"
|
|
PROJECTS="openstack/os-cloud-config $PROJECTS"
|
|
PROJECTS="openstack/os-collect-config $PROJECTS"
|
|
PROJECTS="openstack/os-refresh-config $PROJECTS"
|
|
PROJECTS="openstack/oslo.concurrency $PROJECTS"
|
|
PROJECTS="openstack/oslo.config $PROJECTS"
|
|
PROJECTS="openstack/oslo.db $PROJECTS"
|
|
PROJECTS="openstack/oslo.i18n $PROJECTS"
|
|
PROJECTS="openstack/oslo.log $PROJECTS"
|
|
PROJECTS="openstack/oslo.messaging $PROJECTS"
|
|
PROJECTS="openstack/oslo.middleware $PROJECTS"
|
|
PROJECTS="openstack/oslo.rootwrap $PROJECTS"
|
|
PROJECTS="openstack/oslo.utils $PROJECTS"
|
|
PROJECTS="openstack/oslo.serialization $PROJECTS"
|
|
PROJECTS="openstack/oslo.vmware $PROJECTS"
|
|
PROJECTS="openstack/pycadf $PROJECTS"
|
|
PROJECTS="openstack/python-ceilometerclient $PROJECTS"
|
|
PROJECTS="openstack/python-cinderclient $PROJECTS"
|
|
PROJECTS="openstack/python-glanceclient $PROJECTS"
|
|
PROJECTS="openstack/python-heatclient $PROJECTS"
|
|
PROJECTS="openstack/python-ironicclient $PROJECTS"
|
|
PROJECTS="openstack/python-keystoneclient $PROJECTS"
|
|
PROJECTS="openstack/python-zaqarclient $PROJECTS"
|
|
PROJECTS="openstack/python-neutronclient $PROJECTS"
|
|
PROJECTS="openstack/python-novaclient $PROJECTS"
|
|
PROJECTS="openstack/python-openstackclient $PROJECTS"
|
|
PROJECTS="openstack/python-saharaclient $PROJECTS"
|
|
PROJECTS="openstack/python-swiftclient $PROJECTS"
|
|
PROJECTS="openstack/python-troveclient $PROJECTS"
|
|
PROJECTS="openstack/requirements $PROJECTS"
|
|
PROJECTS="openstack/sahara $PROJECTS"
|
|
PROJECTS="openstack/sahara-dashboard $PROJECTS"
|
|
PROJECTS="openstack/stevedore $PROJECTS"
|
|
PROJECTS="openstack/swift $PROJECTS"
|
|
PROJECTS="openstack/taskflow $PROJECTS"
|
|
PROJECTS="openstack/tempest $PROJECTS"
|
|
PROJECTS="openstack/tempest-lib $PROJECTS"
|
|
PROJECTS="openstack/tripleo-heat-templates $PROJECTS"
|
|
PROJECTS="openstack/tripleo-image-elements $PROJECTS"
|
|
PROJECTS="openstack/tripleo-incubator $PROJECTS"
|
|
PROJECTS="openstack/trove $PROJECTS"
|
|
|
|
|
|
export BASE=/opt/stack
|
|
|
|
# The URL from which to fetch ZUUL references
|
|
export ZUUL_URL=${ZUUL_URL:-http://zuul.openstack.org/p}
|
|
|
|
# Set this variable to skip updating the devstack-gate project itself.
|
|
# Useful in development so you can edit scripts in place and run them
|
|
# directly. Do not set in production.
|
|
# Normally not set, and we do include devstack-gate with the rest of
|
|
# the projects.
|
|
if [ -z "$SKIP_DEVSTACK_GATE_PROJECT" ]; then
|
|
PROJECTS="openstack-infra/devstack-gate $PROJECTS"
|
|
|
|
# Also, if we're testing devstack-gate, re-exec this script once so
|
|
# that we can test the new version of it.
|
|
if [[ $ZUUL_CHANGES =~ "openstack-infra/devstack-gate" ]] && [[ $RE_EXEC != "true" ]]; then
|
|
echo "This build includes a change to devstack-gate; updating working copy."
|
|
# Since we're early in the script, we need to update the d-g
|
|
# copy in the workspace, not $DEST, which is what will be
|
|
# updated later.
|
|
setup_project openstack-infra/devstack-gate $GIT_BRANCH
|
|
cd $WORKSPACE
|
|
|
|
re_exec_devstack_gate
|
|
fi
|
|
fi
|
|
|
|
# Make a directory to store logs
|
|
rm -rf $WORKSPACE/logs
|
|
mkdir -p $WORKSPACE/logs
|
|
|
|
# The feature matrix to select devstack-gate components
|
|
export DEVSTACK_GATE_FEATURE_MATRIX=${DEVSTACK_GATE_FEATURE_MATRIX:-features.yaml}
|
|
|
|
# Set to 1 to run the Tempest test suite
|
|
export DEVSTACK_GATE_TEMPEST=${DEVSTACK_GATE_TEMPEST:-0}
|
|
|
|
# Set to 1 to run the devstack exercises
|
|
export DEVSTACK_GATE_EXERCISES=${DEVSTACK_GATE_EXERCISES:-0}
|
|
|
|
# Set to 1 to run postgresql instead of mysql
|
|
export DEVSTACK_GATE_POSTGRES=${DEVSTACK_GATE_POSTGRES:-0}
|
|
|
|
# Set to 1 to use zeromq instead of rabbitmq (or qpid)
|
|
export DEVSTACK_GATE_ZEROMQ=${DEVSTACK_GATE_ZEROMQ:-0}
|
|
|
|
# Set to qpid to use qpid, or zeromq to use zeromq.
|
|
# Default set to rabbitmq
|
|
export DEVSTACK_GATE_MQ_DRIVER=${DEVSTACK_GATE_MQ_DRIVER:-"rabbitmq"}
|
|
|
|
# Set to 1 to run tempest stress tests
|
|
export DEVSTACK_GATE_TEMPEST_STRESS=${DEVSTACK_GATE_TEMPEST_STRESS:-0}
|
|
|
|
# Set to 1 to run tempest heat slow tests
|
|
export DEVSTACK_GATE_TEMPEST_HEAT_SLOW=${DEVSTACK_GATE_TEMPEST_HEAT_SLOW:-0}
|
|
|
|
# Set to 1 to run tempest large ops test
|
|
export DEVSTACK_GATE_TEMPEST_LARGE_OPS=${DEVSTACK_GATE_TEMPEST_LARGE_OPS:-0}
|
|
|
|
# Set to 1 to run tempest smoke tests serially
|
|
export DEVSTACK_GATE_SMOKE_SERIAL=${DEVSTACK_GATE_SMOKE_SERIAL:-0}
|
|
|
|
# Set to 1 to explicitly disable tempest tenant isolation. Otherwise tenant isolation setting
|
|
# for tempest will be the one chosen by devstack.
|
|
export DEVSTACK_GATE_TEMPEST_DISABLE_TENANT_ISOLATION=${DEVSTACK_GATE_TEMPEST_DISABLE_TENANT_ISOLATION:-0}
|
|
|
|
# Set to 1 to enable Cinder secure delete.
|
|
# False by default to avoid dd problems on Precise.
|
|
# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1023755
|
|
export DEVSTACK_CINDER_SECURE_DELETE=${DEVSTACK_CINDER_SECURE_DELETE:-0}
|
|
|
|
# Set to 1 to run neutron instead of nova network
|
|
# Only applicable to master branch
|
|
export DEVSTACK_GATE_NEUTRON=${DEVSTACK_GATE_NEUTRON:-0}
|
|
|
|
# Set to 1 to run neutron distributed virtual routing
|
|
export DEVSTACK_GATE_NEUTRON_DVR=${DEVSTACK_GATE_NEUTRON_DVR:-0}
|
|
|
|
# Set to 1 to run nova in cells mode instead of the default mode
|
|
export DEVSTACK_GATE_CELLS=${DEVSTACK_GATE_CELLS:-0}
|
|
|
|
# Set to 1 to run nova in with nova metadata server as a separate binary
|
|
export DEVSTACK_GATE_NOVA_API_METADATA_SPLIT=${DEVSTACK_GATE_NOVA_API_METADATA_SPLIT:-0}
|
|
|
|
# Set to 1 to run ironic baremetal provisioning service.
|
|
export DEVSTACK_GATE_IRONIC=${DEVSTACK_GATE_IRONIC:-0}
|
|
|
|
# Set to "agent_ssh" to run ironic with the ironic-python-agent driver
|
|
export DEVSTACK_GATE_IRONIC_DRIVER=${DEVSTACK_GATE_IRONIC_DRIVER:-pxe_ssh}
|
|
|
|
# Set to 0 to avoid building Ironic deploy ramdisks
|
|
export DEVSTACK_GATE_IRONIC_BUILD_RAMDISK=${DEVSTACK_GATE_IRONIC_BUILD_RAMDISK:-1}
|
|
|
|
# Set to 1 to run sahara
|
|
export DEVSTACK_GATE_SAHARA=${DEVSTACK_GATE_SAHARA:-0}
|
|
|
|
# Set to 1 to run trove
|
|
export DEVSTACK_GATE_TROVE=${DEVSTACK_GATE_TROVE:-0}
|
|
|
|
# Set to 1 to run marconi/zaqar
|
|
# TODO remove marconi when safe to do so
|
|
export DEVSTACK_GATE_MARCONI=${DEVSTACK_GATE_MARCONI:-0}
|
|
export DEVSTACK_GATE_ZAQAR=${DEVSTACK_GATE_ZAQAR:-0}
|
|
|
|
# Set to 0 to disable config_drive and use the metadata server instead
|
|
export DEVSTACK_GATE_CONFIGDRIVE=${DEVSTACK_GATE_CONFIGDRIVE:-1}
|
|
|
|
# Set to 1 to enable running a keystone v3 based gate
|
|
export DEVSTACK_GATE_KEYSTONE_V3=${DEVSTACK_GATE_KEYSTONE_V3:-0}
|
|
|
|
# Set to 1 to enable installing test requirements
|
|
export DEVSTACK_GATE_INSTALL_TESTONLY=${DEVSTACK_GATE_INSTALL_TESTONLY:-0}
|
|
|
|
# Set to 0 to run services that default under Apache + mod_wsgi under alternatives (e.g. eventlet)
|
|
# if possible
|
|
export DEVSTACK_GATE_ENABLE_HTTPD_MOD_WSGI_SERVICES=${DEVSTACK_GATE_ENABLE_HTTPD_MOD_WSGI_SERVICES:-1}
|
|
|
|
# Set the number of threads to run tempest with
|
|
DEFAULT_CONCURRENCY=$(nproc)
|
|
if [ ${DEFAULT_CONCURRENCY} -gt 3 ] ; then
|
|
DEFAULT_CONCURRENCY=$[${DEFAULT_CONCURRENCY} / 2]
|
|
fi
|
|
export TEMPEST_CONCURRENCY=${TEMPEST_CONCURRENCY:-${DEFAULT_CONCURRENCY}}
|
|
|
|
# are we pulling any libraries from git
|
|
export DEVSTACK_PROJECT_FROM_GIT=${DEVSTACK_PROJECT_FROM_GIT:-}
|
|
|
|
# The following variable is set for different directions of Grenade updating
|
|
# for a stable branch we want to both try to upgrade forward n => n+1 as
|
|
# well as upgrade from last n-1 => n.
|
|
#
|
|
# i.e. stable/juno:
|
|
# pullup means stable/icehouse => stable/juno
|
|
# forward means stable/juno => master (or stable/kilo if that's out)
|
|
# partial-ncpu means stable/icehouse => stable/juno but keep nova
|
|
# compute at stable/icehouse
|
|
# sideways-ironic means stable/juno with nova baremetal =>
|
|
# stable/juno with ironic
|
|
# sideways-neutron means stable/juno with nova network =>
|
|
# stable/juno with neutron
|
|
export DEVSTACK_GATE_GRENADE=${DEVSTACK_GATE_GRENADE:-}
|
|
|
|
# the branch name for selecting grenade branches
|
|
GRENADE_BASE_BRANCH=${OVERRIDE_ZUUL_BRANCH:-${ZUUL_BRANCH}}
|
|
|
|
if [[ "$DEVSTACK_GATE_GRENADE" == "pullup" ]]; then
|
|
export DEVSTACK_GATE_TEMPEST=1
|
|
if [[ "$GRENADE_BASE_BRANCH" == "stable/juno" ]]; then
|
|
export GRENADE_OLD_BRANCH="stable/icehouse"
|
|
export GRENADE_NEW_BRANCH="stable/juno"
|
|
else # master
|
|
export GRENADE_OLD_BRANCH="stable/juno"
|
|
export GRENADE_NEW_BRANCH="$GIT_BRANCH"
|
|
fi
|
|
elif [[ "$DEVSTACK_GATE_GRENADE" == "partial-ncpu" ]]; then
|
|
export DEVSTACK_GATE_TEMPEST=1
|
|
export DO_NOT_UPGRADE_SERVICES=[n-cpu]
|
|
if [[ "$GRENADE_BASE_BRANCH" == "stable/juno" ]]; then
|
|
export GRENADE_OLD_BRANCH="stable/icehouse"
|
|
export GRENADE_NEW_BRANCH="stable/juno"
|
|
else # master
|
|
export GRENADE_OLD_BRANCH="stable/juno"
|
|
export GRENADE_NEW_BRANCH="$GIT_BRANCH"
|
|
fi
|
|
elif [[ "$DEVSTACK_GATE_GRENADE" == "forward" ]]; then
|
|
export DEVSTACK_GATE_TEMPEST=1
|
|
if [[ "$GRENADE_BASE_BRANCH" == "stable/icehouse" ]]; then
|
|
export GRENADE_OLD_BRANCH="stable/icehouse"
|
|
export GRENADE_NEW_BRANCH="stable/juno"
|
|
elif [[ "$GRENADE_BASE_BRANCH" == "stable/juno" ]]; then
|
|
export GRENADE_OLD_BRANCH="stable/juno"
|
|
export GRENADE_NEW_BRANCH="$GIT_BRANCH"
|
|
fi
|
|
elif [[ "$DEVSTACK_GATE_GRENADE" =~ "sideways" ]]; then
|
|
export DEVSTACK_GATE_TEMPEST=1
|
|
export GRENADE_OLD_BRANCH="$GRENADE_BASE_BRANCH"
|
|
export GRENADE_NEW_BRANCH="$GRENADE_BASE_BRANCH"
|
|
fi
|
|
|
|
# Set the virtualization driver to: libvirt, openvz, xenapi
|
|
export DEVSTACK_GATE_VIRT_DRIVER=${DEVSTACK_GATE_VIRT_DRIVER:-libvirt}
|
|
|
|
# See switch below for this -- it gets set to 1 when tempest
|
|
# is the project being gated.
|
|
export DEVSTACK_GATE_TEMPEST_FULL=${DEVSTACK_GATE_TEMPEST_FULL:-0}
|
|
|
|
# Set to 1 to run all tempest tests
|
|
export DEVSTACK_GATE_TEMPEST_ALL=${DEVSTACK_GATE_TEMPEST_ALL:-0}
|
|
|
|
# Set to a regex to run tempest with a custom regex filter
|
|
export DEVSTACK_GATE_TEMPEST_REGEX=${DEVSTACK_GATE_TEMPEST_REGEX:-""}
|
|
|
|
# Set to 1 if running the openstack/requirements integration test
|
|
export DEVSTACK_GATE_REQS_INTEGRATION=${DEVSTACK_GATE_REQS_INTEGRATION:-0}
|
|
|
|
# Set to 0 to disable clean logs enforcement (3rd party CI might want to do this
|
|
# until they get their driver cleaned up)
|
|
export DEVSTACK_GATE_CLEAN_LOGS=${DEVSTACK_GATE_CLEAN_LOGS:-1}
|
|
|
|
# Set this to the time in minutes that the gate test should be allowed
|
|
# to run before being aborted (default 60).
|
|
export DEVSTACK_GATE_TIMEOUT=${DEVSTACK_GATE_TIMEOUT:-60}
|
|
|
|
# Set to 1 to unstack immediately after devstack installation. This
|
|
# is intended to be a stop-gap until devstack can support
|
|
# dependency-only installation.
|
|
export DEVSTACK_GATE_UNSTACK=${DEVSTACK_GATE_UNSTACK:-0}
|
|
|
|
# Set this to override the branch selected for testing (in
|
|
# single-branch checkouts; not used for grenade)
|
|
export OVERRIDE_ZUUL_BRANCH=${OVERRIDE_ZUUL_BRANCH:-$ZUUL_BRANCH}
|
|
|
|
# Set Ceilometer backend to override the default one. It could be mysql,
|
|
# postgresql, mongodb.
|
|
export DEVSTACK_GATE_CEILOMETER_BACKEND=${DEVSTACK_GATE_CEILOMETER_BACKEND:-mysql}
|
|
|
|
if ! function_exists "gate_hook"; then
|
|
# the command we use to run the gate
|
|
function gate_hook {
|
|
remaining_time
|
|
timeout -s 9 ${REMAINING_TIME}m $BASE/new/devstack-gate/devstack-vm-gate.sh
|
|
}
|
|
fi
|
|
|
|
echo "Triggered by: https://review.openstack.org/$ZUUL_CHANGE patchset $ZUUL_PATCHSET"
|
|
echo "Pipeline: $ZUUL_PIPELINE"
|
|
echo "Available disk space on this host:"
|
|
indent df -h
|
|
|
|
echo "Setting up the host"
|
|
echo "... this takes a few seconds (logs at logs/devstack-gate-setup-host.txt.gz)"
|
|
tsfilter setup_host &> $WORKSPACE/logs/devstack-gate-setup-host.txt
|
|
|
|
if [ -n "$DEVSTACK_GATE_GRENADE" ]; then
|
|
echo "Setting up the new (migrate to) workspace"
|
|
echo "... this takes 3 - 5 minutes (logs at logs/devstack-gate-setup-workspace-new.txt.gz)"
|
|
tsfilter setup_workspace $GRENADE_NEW_BRANCH $BASE/new copycache &> \
|
|
$WORKSPACE/logs/devstack-gate-setup-workspace-new.txt
|
|
echo "Setting up the old (migrate from) workspace ..."
|
|
echo "... this takes 3 - 5 minutes (logs at logs/devstack-gate-setup-workspace-old.txt.gz)"
|
|
tsfilter setup_workspace $GRENADE_OLD_BRANCH $BASE/old &> \
|
|
$WORKSPACE/logs/devstack-gate-setup-workspace-old.txt
|
|
else
|
|
echo "Setting up the workspace"
|
|
echo "... this takes 3 - 5 minutes (logs at logs/devstack-gate-setup-workspace-new.txt.gz)"
|
|
tsfilter setup_workspace $OVERRIDE_ZUUL_BRANCH $BASE/new &> \
|
|
$WORKSPACE/logs/devstack-gate-setup-workspace-new.txt
|
|
fi
|
|
|
|
# relocate and symlink logs into $BASE to save space on the root filesystem
|
|
if [ -d "$WORKSPACE/logs" -a \! -e "$BASE/logs" ]; then
|
|
sudo mv $WORKSPACE/logs $BASE/
|
|
ln -s $BASE/logs $WORKSPACE/
|
|
fi
|
|
|
|
# Run pre test hook if we have one
|
|
if function_exists "pre_test_hook"; then
|
|
echo "Running pre_test_hook"
|
|
xtrace=$(set +o | grep xtrace)
|
|
set -o xtrace
|
|
tsfilter pre_test_hook | tee $WORKSPACE/devstack-gate-pre-test-hook.txt
|
|
sudo mv $WORKSPACE/devstack-gate-pre-test-hook.txt $BASE/logs/
|
|
$xtrace
|
|
fi
|
|
|
|
# Run the gate function
|
|
echo "Running gate_hook"
|
|
gate_hook
|
|
GATE_RETVAL=$?
|
|
RETVAL=$GATE_RETVAL
|
|
|
|
if [ $GATE_RETVAL -ne 0 ]; then
|
|
echo "ERROR: the main setup script run by this job failed - exit code: $GATE_RETVAL"
|
|
echo " please look at the relevant log files to determine the root cause"
|
|
fi
|
|
|
|
# Run post test hook if we have one
|
|
if [ $GATE_RETVAL -eq 0 ] && function_exists "post_test_hook"; then
|
|
echo "Running post_test_hook"
|
|
xtrace=$(set +o | grep xtrace)
|
|
set -o xtrace -o pipefail
|
|
tsfilter post_test_hook | tee $WORKSPACE/devstack-gate-post-test-hook.txt
|
|
RETVAL=$?
|
|
sudo mv $WORKSPACE/devstack-gate-post-test-hook.txt $BASE/logs/
|
|
set +o pipefail
|
|
$xtrace
|
|
fi
|
|
|
|
if [ $GATE_RETVAL -eq 137 ] && [ -f $WORKSPACE/gate.pid ] ; then
|
|
GATEPID=`cat $WORKSPACE/gate.pid`
|
|
echo "Killing process group ${GATEPID}"
|
|
sudo kill -s 9 -${GATEPID}
|
|
fi
|
|
|
|
echo "Cleaning up host"
|
|
echo "... this takes 3 - 4 minutes (logs at logs/devstack-gate-cleanup-host.txt.gz)"
|
|
tsfilter cleanup_host &> $WORKSPACE/devstack-gate-cleanup-host.txt
|
|
sudo mv $WORKSPACE/devstack-gate-cleanup-host.txt $BASE/logs/
|
|
|
|
exit $RETVAL
|