4a20f9a175
this ensures that if we setup quantum, we are explicit about it in tempest. This is important so that nova tests which require quantum features have any idea if they should function. Change-Id: I5e6be9ff325676f25b2c391430dd66ff64a7a833
301 lines
10 KiB
Plaintext
301 lines
10 KiB
Plaintext
# lib/tempest
|
|
# Install and configure Tempest
|
|
|
|
# Dependencies:
|
|
# ``functions`` file
|
|
# ``lib/nova`` service is runing
|
|
# <list other global vars that are assumed to be defined>
|
|
# - ``DEST``, ``FILES``
|
|
# - ``ADMIN_PASSWORD``
|
|
# - ``DEFAULT_IMAGE_NAME``
|
|
# - ``S3_SERVICE_PORT``
|
|
# - ``SERVICE_HOST``
|
|
# - ``BASE_SQL_CONN`` ``lib/database`` declares
|
|
# - ``PUBLIC_NETWORK_NAME``
|
|
# - ``Q_USE_NAMESPACE``
|
|
# - ``Q_ROUTER_NAME``
|
|
# - ``VIRT_DRIVER``
|
|
# - ``LIBVIRT_TYPE``
|
|
# - ``KEYSTONE_SERVICE_PROTOCOL``, ``KEYSTONE_SERVICE_HOST`` from lib/keystone
|
|
# Optional Dependencies:
|
|
# ALT_* (similar vars exists in keystone_data.sh)
|
|
# ``LIVE_MIGRATION_AVAILABLE``
|
|
# ``USE_BLOCK_MIGRATION_FOR_LIVE_MIGRATION``
|
|
# ``DEFAULT_INSTANCE_TYPE``
|
|
# ``DEFAULT_INSTANCE_USER``
|
|
# ``stack.sh`` calls the entry points in this order:
|
|
#
|
|
# install_tempest
|
|
# configure_tempest
|
|
# init_tempest
|
|
|
|
# Save trace setting
|
|
XTRACE=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
|
|
|
|
# Defaults
|
|
# --------
|
|
|
|
# Set up default directories
|
|
TEMPEST_DIR=$DEST/tempest
|
|
TEMPEST_CONF_DIR=$TEMPEST_DIR/etc
|
|
TEMPEST_CONF=$TEMPEST_CONF_DIR/tempest.conf
|
|
|
|
NOVA_SOURCE_DIR=$DEST/nova
|
|
|
|
BUILD_INTERVAL=3
|
|
BUILD_TIMEOUT=400
|
|
|
|
|
|
BOTO_MATERIALS_PATH="$FILES/images/s3-materials/cirros-0.3.1"
|
|
|
|
# Entry Points
|
|
# ------------
|
|
|
|
# configure_tempest() - Set config files, create data dirs, etc
|
|
function configure_tempest() {
|
|
setup_develop $TEMPEST_DIR
|
|
local image_lines
|
|
local images
|
|
local num_images
|
|
local image_uuid
|
|
local image_uuid_alt
|
|
local errexit
|
|
local password
|
|
local line
|
|
local flavors
|
|
local flavors_ref
|
|
local flavor_lines
|
|
local public_network_id
|
|
local public_router_id
|
|
local tenant_networks_reachable
|
|
local boto_instance_type="m1.tiny"
|
|
|
|
# TODO(afazekas):
|
|
# sudo python setup.py deploy
|
|
|
|
# This function exits on an error so that errors don't compound and you see
|
|
# only the first error that occured.
|
|
errexit=$(set +o | grep errexit)
|
|
set -o errexit
|
|
|
|
# Save IFS
|
|
ifs=$IFS
|
|
|
|
# Glance should already contain images to be used in tempest
|
|
# testing. Here we simply look for images stored in Glance
|
|
# and set the appropriate variables for use in the tempest config
|
|
# We ignore ramdisk and kernel images, look for the default image
|
|
# ``DEFAULT_IMAGE_NAME``. If not found, we set the ``image_uuid`` to the
|
|
# first image returned and set ``image_uuid_alt`` to the second,
|
|
# if there is more than one returned...
|
|
# ... Also ensure we only take active images, so we don't get snapshots in process
|
|
declare -a images
|
|
|
|
while read -r IMAGE_NAME IMAGE_UUID; do
|
|
if [ "$IMAGE_NAME" = "$DEFAULT_IMAGE_NAME" ]; then
|
|
image_uuid="$IMAGE_UUID"
|
|
image_uuid_alt="$IMAGE_UUID"
|
|
fi
|
|
images+=($IMAGE_UUID)
|
|
done < <(glance image-list --status=active | awk -F'|' '!/^(+--)|ID|aki|ari/ { print $3,$2 }')
|
|
|
|
case "${#images[*]}" in
|
|
0)
|
|
echo "Found no valid images to use!"
|
|
exit 1
|
|
;;
|
|
1)
|
|
if [ -z "$image_uuid" ]; then
|
|
image_uuid=${images[0]}
|
|
image_uuid_alt=${images[0]}
|
|
fi
|
|
;;
|
|
*)
|
|
if [ -z "$image_uuid" ]; then
|
|
image_uuid=${images[0]}
|
|
image_uuid_alt=${images[1]}
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Create tempest.conf from tempest.conf.sample
|
|
# copy every time, because the image UUIDS are going to change
|
|
cp $TEMPEST_CONF.sample $TEMPEST_CONF
|
|
|
|
password=${ADMIN_PASSWORD:-secrete}
|
|
|
|
# See files/keystone_data.sh where alt_demo user
|
|
# and tenant are set up...
|
|
ALT_USERNAME=${ALT_USERNAME:-alt_demo}
|
|
ALT_TENANT_NAME=${ALT_TENANT_NAME:-alt_demo}
|
|
|
|
# If the ``DEFAULT_INSTANCE_TYPE`` not declared, use the new behavior
|
|
# Tempest creates instane types for himself
|
|
if [[ -z "$DEFAULT_INSTANCE_TYPE" ]]; then
|
|
nova flavor-create m1.nano 42 64 0 1
|
|
flavor_ref=42
|
|
boto_instance_type=m1.nano
|
|
nova flavor-create m1.micro 84 128 0 1
|
|
flavor_ref_alt=84
|
|
else
|
|
# Check Nova for existing flavors and, if set, look for the
|
|
# ``DEFAULT_INSTANCE_TYPE`` and use that.
|
|
boto_instance_type=$DEFAULT_INSTANCE_TYPE
|
|
flavor_lines=`nova flavor-list`
|
|
IFS=$'\r\n'
|
|
flavors=""
|
|
for line in $flavor_lines; do
|
|
f=$(echo $line | awk "/ $DEFAULT_INSTANCE_TYPE / { print \$2 }")
|
|
flavors="$flavors $f"
|
|
done
|
|
|
|
for line in $flavor_lines; do
|
|
flavors="$flavors `echo $line | grep -v "^\(|\s*ID\|+--\)" | cut -d' ' -f2`"
|
|
done
|
|
|
|
IFS=" "
|
|
flavors=($flavors)
|
|
num_flavors=${#flavors[*]}
|
|
echo "Found $num_flavors flavors"
|
|
if [[ $num_flavors -eq 0 ]]; then
|
|
echo "Found no valid flavors to use!"
|
|
exit 1
|
|
fi
|
|
flavor_ref=${flavors[0]}
|
|
flavor_ref_alt=$flavor_ref
|
|
if [[ $num_flavors -gt 1 ]]; then
|
|
flavor_ref_alt=${flavors[1]}
|
|
fi
|
|
fi
|
|
|
|
if [ "$Q_USE_NAMESPACE" != "False" ]; then
|
|
tenant_networks_reachable=false
|
|
else
|
|
tenant_networks_reachable=true
|
|
fi
|
|
|
|
if is_service_enabled q-l3; then
|
|
public_network_id=$(quantum net-list | grep $PUBLIC_NETWORK_NAME | \
|
|
awk '{print $2}')
|
|
if [ "$Q_USE_NAMESPACE" == "False" ]; then
|
|
# If namespaces are disabled, devstack will create a single
|
|
# public router that tempest should be configured to use.
|
|
public_router_id=$(quantum router-list | awk "/ $Q_ROUTER_NAME / \
|
|
{ print \$2 }")
|
|
fi
|
|
fi
|
|
|
|
# Timeouts
|
|
iniset $TEMPEST_CONF compute build_timeout $BUILD_TIMEOUT
|
|
iniset $TEMPEST_CONF volume build_timeout $BUILD_TIMEOUT
|
|
iniset $TEMPEST_CONF boto build_timeout $BUILD_TIMEOUT
|
|
iniset $TEMPEST_CONF compute build_interval $BUILD_INTERVAL
|
|
iniset $TEMPEST_CONF volume build_interval $BUILD_INTERVAL
|
|
iniset $TEMPEST_CONF boto build_interval $BUILD_INTERVAL
|
|
iniset $TEMPEST_CONF boto http_socket_timeout 5
|
|
|
|
# Identity
|
|
iniset $TEMPEST_CONF identity uri "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:5000/v2.0/"
|
|
iniset $TEMPEST_CONF identity password "$password"
|
|
iniset $TEMPEST_CONF identity alt_username $ALT_USERNAME
|
|
iniset $TEMPEST_CONF identity alt_password "$password"
|
|
iniset $TEMPEST_CONF identity alt_tenant_name $ALT_TENANT_NAME
|
|
iniset $TEMPEST_CONF identity admin_password "$password"
|
|
|
|
# Compute
|
|
iniset $TEMPEST_CONF compute change_password_available False
|
|
# Note(nati) current tempest don't create network for each tenant
|
|
# so reuse same tenant for now
|
|
if is_service_enabled quantum; then
|
|
TEMPEST_ALLOW_TENANT_ISOLATION=${TEMPEST_ALLOW_TENANT_ISOLATION:-False}
|
|
fi
|
|
iniset $TEMPEST_CONF compute allow_tenant_isolation ${TEMPEST_ALLOW_TENANT_ISOLATION:-True}
|
|
iniset $TEMPEST_CONF compute ssh_user ${DEFAULT_INSTANCE_USER:-cirros} # DEPRECATED
|
|
iniset $TEMPEST_CONF compute network_for_ssh $PRIVATE_NETWORK_NAME
|
|
iniset $TEMPEST_CONF compute ip_version_for_ssh 4
|
|
iniset $TEMPEST_CONF compute ssh_timeout $BUILD_TIMEOUT
|
|
iniset $TEMPEST_CONF compute image_ref $image_uuid
|
|
iniset $TEMPEST_CONF compute image_ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
|
|
iniset $TEMPEST_CONF compute image_ref_alt $image_uuid_alt
|
|
iniset $TEMPEST_CONF compute image_alt_ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
|
|
iniset $TEMPEST_CONF compute flavor_ref $flavor_ref
|
|
iniset $TEMPEST_CONF compute flavor_ref_alt $flavor_ref_alt
|
|
iniset $TEMPEST_CONF compute live_migration_available ${LIVE_MIGRATION_AVAILABLE:-False}
|
|
iniset $TEMPEST_CONF compute use_block_migration_for_live_migration ${USE_BLOCK_MIGRATION_FOR_LIVE_MIGRATION:-False}
|
|
|
|
# Whitebox
|
|
iniset $TEMPEST_CONF whitebox source_dir $NOVA_SOURCE_DIR
|
|
iniset $TEMPEST_CONF whitebox bin_dir $NOVA_BIN_DIR
|
|
# TODO(jaypipes): Create the key file here... right now, no whitebox
|
|
# tests actually use a key.
|
|
iniset $TEMPEST_CONF whitebox path_to_private_key $TEMPEST_DIR/id_rsa
|
|
iniset $TEMPEST_CONF whitebox db_uri $BASE_SQL_CONN/nova
|
|
|
|
|
|
# compute admin
|
|
iniset $TEMPEST_CONF "compute-admin" password "$password" # DEPRECATED
|
|
|
|
# network
|
|
if is_service_enabled quantum; then
|
|
iniset $TEMPEST_CONF network quantum_available "True"
|
|
fi
|
|
iniset $TEMPEST_CONF network api_version 2.0
|
|
iniset $TEMPEST_CONF network tenant_networks_reachable "$tenant_networks_reachable"
|
|
iniset $TEMPEST_CONF network public_network_id "$public_network_id"
|
|
iniset $TEMPEST_CONF network public_router_id "$public_router_id"
|
|
|
|
#boto
|
|
iniset $TEMPEST_CONF boto ec2_url "http://$SERVICE_HOST:8773/services/Cloud"
|
|
iniset $TEMPEST_CONF boto s3_url "http://$SERVICE_HOST:${S3_SERVICE_PORT:-3333}"
|
|
iniset $TEMPEST_CONF boto s3_materials_path "$BOTO_MATERIALS_PATH"
|
|
iniset $TEMPEST_CONF boto instance_type "$boto_instance_type"
|
|
iniset $TEMPEST_CONF boto http_socket_timeout 30
|
|
iniset $TEMPEST_CONF boto ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
|
|
|
|
echo "Created tempest configuration file:"
|
|
cat $TEMPEST_CONF
|
|
|
|
# Restore IFS
|
|
IFS=$ifs
|
|
#Restore errexit
|
|
$errexit
|
|
}
|
|
|
|
# install_tempest() - Collect source and prepare
|
|
function install_tempest() {
|
|
git_clone $TEMPEST_REPO $TEMPEST_DIR $TEMPEST_BRANCH
|
|
|
|
# Tempest doesn't satisfy its dependencies on its own, so
|
|
# install them here instead.
|
|
pip_install -r $TEMPEST_DIR/tools/pip-requires
|
|
}
|
|
|
|
# init_tempest() - Initialize ec2 images
|
|
function init_tempest() {
|
|
local base_image_name=cirros-0.3.1-x86_64
|
|
# /opt/stack/devstack/files/images/cirros-0.3.1-x86_64-uec
|
|
local image_dir="$FILES/images/${base_image_name}-uec"
|
|
local kernel="$image_dir/${base_image_name}-vmlinuz"
|
|
local ramdisk="$image_dir/${base_image_name}-initrd"
|
|
local disk_image="$image_dir/${base_image_name}-blank.img"
|
|
# if the cirros uec downloaded and the system is uec capable
|
|
if [ -f "$kernel" -a -f "$ramdisk" -a -f "$disk_image" -a "$VIRT_DRIVER" != "openvz" \
|
|
-a \( "$LIBVIRT_TYPE" != "lxc" -o "$VIRT_DRIVER" != "libvirt" \) ]; then
|
|
echo "Prepare aki/ari/ami Images"
|
|
( #new namespace
|
|
# tenant:demo ; user: demo
|
|
source $TOP_DIR/accrc/demo/demo
|
|
euca-bundle-image -i "$kernel" --kernel true -d "$BOTO_MATERIALS_PATH"
|
|
euca-bundle-image -i "$ramdisk" --ramdisk true -d "$BOTO_MATERIALS_PATH"
|
|
euca-bundle-image -i "$disk_image" -d "$BOTO_MATERIALS_PATH"
|
|
) 2>&1 </dev/null | cat
|
|
else
|
|
echo "Boto materials are not prepared"
|
|
fi
|
|
}
|
|
|
|
# Restore xtrace
|
|
$XTRACE
|