openstack-helm-addons/tools/gate/scripts/090-deploy-shaker.sh

289 lines
11 KiB
Bash
Executable File

#!/bin/bash
# Copyright 2018 The Openstack-Helm Authors.
#
# 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.
#-----------------------------------------------------------------------
# Two ways to invoke this script
#-----------------------------------------------------------------------
# 1. Provide a shaker.conf file listing the shaker configuration params
# which should go as input to shaker
# 2. Provide the parameters explicitly
#----------------------------------------------------------------------
# (1):
# sudo -H -E su -c 'export SHAKER_CONF_HOST="/tmp/shaker.conf"; \
# export CLONE_SHAKER_SCENARIOS="false"; \
# export SHAKER_SCENARIOS_REPO="https://git.openstack.org/openstack/shaker"; \
# export COPY_SHAKER_REPORTS_ON_HOST="false"; \
# cd $CURR_WORK/openstack-helm-addons; ./tools/gate/scripts/090-shaker.sh ${OSH_EXTRA_HELM_ARGS}' ${username}
# (2):
# sudo -H -E su -c 'export OSH_EXT_NET_NAME="public"; \
# export OSH_EXT_SUBNET_NAME="public-subnet"; \
# export OS_USERNAME="admin"; \
# export OS_PASSWORD="password"; \
# export OS_AUTH_URL="http://keystone.openstack.svc.cluster.local/v3"; \
# export OS_PROJECT_NAME="admin"; \
# export OS_REGION_NAME="RegionOne"; \
# export OS_PROJECT_ID=""; \
# export OS_PROJECT_DOMAIN_NAME="Default"; \
# export OS_USER_DOMAIN_NAME="Default"; \
# export OS_IDENTITY_API_VERSION=3; \
# export EXTERNAL_NETWORK_NAME="public"; \
# export SCENARIO="/opt/shaker/shaker/scenarios/openstack/full_l2.yaml"; \
# export AVAILABILITY_ZONE="nova"; \
# export FLAVOR_ID="shaker-flavor"; \
# export IMAGE_NAME="shaker-image"; \
# export SERVER_ENDPOINT_IP=""; \
# export CLONE_SHAKER_SCENARIOS="false"; \
# export SHAKER_SCENARIOS_REPO="https://git.openstack.org/openstack/shaker"; \
# export COPY_SHAKER_REPORTS_ON_HOST="false"; \
# cd $CURR_WORK/openstack-helm-addons; ./tools/gate/scripts/090-shaker.sh ${OSH_EXTRA_HELM_ARGS}' ${username}
set -xe
: ${OSH_EXT_NET_NAME:="public"}
: ${OSH_EXT_SUBNET_NAME:="public-subnet"}
: ${OSH_EXT_SUBNET:="172.24.4.0/24"}
: ${OSH_BR_EX_ADDR:="172.24.4.1/24"}
: ${OSH_PRIVATE_SUBNET_POOL:="11.0.0.0/8"}
: ${OSH_PRIVATE_SUBNET_POOL_NAME:="shared-default-subnetpool"}
: ${OSH_PRIVATE_SUBNET_POOL_DEF_PREFIX:="24"}
: ${OSH_VM_KEY_STACK:="heat-vm-key"}
: ${OSH_PRIVATE_SUBNET:="11.0.0.0/24"}
# Shaker conf params
: ${OS_USERNAME:="admin"}
: ${OS_PASSWORD:="password"}
: ${OS_AUTH_URL:="http://keystone.openstack.svc.cluster.local/v3"}
: ${OS_PROJECT_NAME:="admin"}
: ${OS_REGION_NAME:="RegionOne"}
: ${OS_USER_DOMAIN_NAME:="Default"}
: ${OS_PROJECT_DOMAIN_NAME:="Default"}
: ${OS_PROJECT_ID:=""}
: ${EXTERNAL_NETWORK_NAME:=$OSH_EXT_NET_NAME}
: ${SCENARIO:="shaker/shaker/scenarios/openstack/full_l2.yaml"}
: ${AVAILABILITY_ZONE:="nova"}
: ${OS_IDENTITY_API_VERSION:="3"}
: ${OS_INTERFACE:="public"}
: ${REPORT_FILE:="shaker-result.html"}
: ${OUTPUT_FILE:="shaker-result.json"}
: ${FLAVOR_ID:="shaker-flavor"}
: ${IMAGE_NAME:="shaker-image"}
: ${SERVER_ENDPOINT_IP:=""}
: ${SERVER_ENDPOINT_INTF:="eth0"}
: ${SHAKER_PORT:=31999}
: ${COMPUTE_NODES:=1}
: ${EXECUTE_TEST:="true"}
: ${DEBUG:="true"}
: ${CLEANUP_ON_ERROR:="true"}
: ${CLONE_SHAKER_SCENARIOS:="false"}
: ${SHAKER_SCENARIOS_REPO:="https://git.openstack.org/openstack/shaker"}
: ${COPY_SHAKER_REPORTS_ON_HOST:="false"}
: ${SHAKER_CONF_HOST:=""}
# DO NOT CHANGE: Change requires update in shaker charts
: ${SHAKER_CONF:="/opt/shaker/shaker.conf"}
: ${SHAKER_DATA:="/opt/shaker/data"}
: ${SHAKER_DATA_HOSTPATH_MOUNT:="/opt/shaker-data"}
: ${SHAKER_DATA_HOSTPATH:="/tmp/shaker-data"}
#NOTE: Pull images and lint chart
: ${OSH_PATH:="../openstack-helm"}
make -C ${OSH_PATH} pull-images shaker
#NOTE: Deploy command
if [ ! -z ${SHAKER_CONF_HOST} ] && [ -f ${SHAKER_CONF_HOST} ]; then
SERVER_ENDPOINT_IP=`cat ${SHAKER_CONF_HOST} | awk '/server_endpoint/ {print $2}' | cut -f1 -d':'`
SHAKER_PORT=`cat ${SHAKER_CONF_HOST} | awk '/server_endpoint/ {print $2}' | cut -f2 -d':'`
else
# Export AUTH variables required by shaker-image-builder utility
export OS_USERNAME=${OS_USERNAME}
export OS_PASSWORD=${OS_PASSWORD}
export OS_AUTH_URL=${OS_AUTH_URL}
export OS_PROJECT_NAME=${OS_PROJECT_NAME}
export OS_REGION_NAME=${OS_REGION_NAME}
export EXTERNAL_NETWORK_NAME=${EXTERNAL_NETWORK_NAME}
export OS_PROJECT_ID=${OS_PROJECT_ID}
if [ $OS_IDENTITY_API_VERSION = "3" ]; then
export OS_PROJECT_DOMAIN_NAME=${OS_PROJECT_DOMAIN_NAME}
export OS_USER_DOMAIN_NAME=${OS_USER_DOMAIN_NAME}
else
export OS_PROJECT_DOMAIN_NAME=
export OS_USER_DOMAIN_NAME=
fi
export stack_exists=`openstack network list | grep ${OSH_EXT_NET_NAME} | awk '{print $4}'`
if [ -z $stack_exists ]; then
openstack stack create --wait \
--parameter network_name=${OSH_EXT_NET_NAME} \
--parameter physical_network_name=${OSH_EXT_NET_NAME} \
--parameter subnet_name=${OSH_EXT_SUBNET_NAME} \
--parameter subnet_cidr=${OSH_EXT_SUBNET} \
--parameter subnet_gateway=${OSH_BR_EX_ADDR%/*} \
-t ${OSH_PATH}/tools/gate/files/heat-public-net-deployment.yaml \
heat-public-net-deployment
fi
default_sec_grp_id=`openstack security group list --project ${OS_PROJECT_NAME} | grep default | awk '{split(\$0,a,"|"); print a[2]}'`
for sg in $default_sec_grp_id
do
icmp=`openstack security group rule list $sg | grep icmp | awk '{split(\$0,a,"|"); print a[2]}'`
if [ "${icmp}" = "" ]; then openstack security group rule create --proto icmp $sg; fi
shaker=`openstack security group rule list $sg | grep tcp | grep ${SHAKER_PORT} | awk '{split(\$0,a,"|"); print a[2]}'`
if [ "${shaker}" = "" ]; then openstack security group rule create --proto tcp --dst-port ${SHAKER_PORT} $sg; fi
done
IMAGE_NAME=$(openstack image show -f value -c name \
$(openstack image list -f csv | awk -F ',' '{ print $2 "," $1 }' | \
grep "${IMAGE_NAME}" | head -1 | awk -F ',' '{ print $2 }' | tr -d '"'))
if [ -z $IMAGE_NAME ]; then
# Install shaker to use shaker-image-builder utility
sudo apt-add-repository "deb http://nova.clouds.archive.ubuntu.com/ubuntu/ trusty multiverse"
sudo apt-get update
sudo apt-get -y install python-dev libzmq-dev
sudo pip install pbr pyshaker
# Run shaker-image-builder utility to build shaker image
# For debug mode
# shaker-image-builder --nocleanup-on-error --debug
# For debug mode - with disk-image-builder mode
# shaker-image-builder --nocleanup-on-error --debug --image-builder-mode dib
shaker-image-builder
IMAGE_NAME=$(openstack image show -f value -c name \
$(openstack image list -f csv | awk -F ',' '{ print $2 "," $1 }' | \
grep "^\"shaker" | head -1 | awk -F ',' '{ print $2 }' | tr -d '"'))
fi
if [ $CLONE_SHAKER_SCENARIOS = "true" ]; then
SHAKER_SCENARIO="${SHAKER_DATA}/${SCENARIO}"
else
SHAKER_SCENARIO="/opt/${SCENARIO}"
fi
fi
#NOTE: Deploy shaker pods
tee /tmp/shaker.yaml << EOF
shaker:
controller:
external_ip: ${SERVER_ENDPOINT_IP}
conf:
script: |
#!/bin/bash
set -xe
# Clone the shaker test-cases
if [ ${CLONE_SHAKER_SCENARIOS} = "true" ]; then
cd ${SHAKER_DATA}; git clone $SHAKER_SCENARIOS_REPO; cd -;
fi
if [ -z ${SERVER_ENDPOINT_IP} ]; then
export server_endpoint=\`ip a | grep "global ${SERVER_ENDPOINT_INTF}" | cut -f6 -d' ' | cut -f1 -d'/'\`
else
export server_endpoint=${SERVER_ENDPOINT_IP}
fi
echo ===========================
printenv | grep -i os_
echo ========== SHAKER CONF PARAMETERS =================
cat ${SHAKER_CONF}
echo =====================================================
env -i HOME="$HOME" bash -l -c "printenv; shaker --server-endpoint \$server_endpoint:${SHAKER_PORT} --config-file ${SHAKER_CONF}"
if [ $COPY_SHAKER_REPORTS_ON_HOST = "true" ]; then
export DATA_FOLDER_NAME=`date +%Y%m%d_%H%M%S`
mkdir ${SHAKER_DATA_HOSTPATH_MOUNT}/\$DATA_FOLDER_NAME
echo \$DATA_FOLDER_NAME > ${SHAKER_DATA_HOSTPATH_MOUNT}/latest-shaker-data-name.txt
declare -a file_extns_arr_to_copy=(html json subunit conf yaml stream)
for i in "\${file_extns_arr_to_copy[@]}"
do
if [ -e ${SHAKER_DATA}/*.\$i ]; then cp -avb ${SHAKER_DATA}/*.\$i ${SHAKER_DATA_HOSTPATH_MOUNT}/\$DATA_FOLDER_NAME/; fi
done
cp -avb ${SHAKER_CONF} ${SHAKER_DATA_HOSTPATH_MOUNT}/\$DATA_FOLDER_NAME/
fi
EOF
if [ -z ${SHAKER_CONF_HOST} ] || [ ! -f ${SHAKER_CONF_HOST} ]; then
tee -a /tmp/shaker.yaml << EOF
shaker:
shaker:
DEFAULT:
debug: ${DEBUG}
cleanup_on_error: ${CLEANUP_ON_ERROR}
scenario_compute_nodes: ${COMPUTE_NODES}
report: ${SHAKER_DATA}/${REPORT_FILE}
output: ${SHAKER_DATA}/${OUTPUT_FILE}
scenario: ${SHAKER_SCENARIO}
flavor_name: ${FLAVOR_ID}
external_net: ${EXTERNAL_NETWORK_NAME}
image_name: ${IMAGE_NAME}
scenario_availability_zone: ${AVAILABILITY_ZONE}
os_username: ${OS_USERNAME}
os_password: ${OS_PASSWORD}
os_auth_url: ${OS_AUTH_URL}
os_project_name: ${OS_PROJECT_NAME}
os_region_name: ${OS_REGION_NAME}
os_identity_api_version: ${OS_IDENTITY_API_VERSION}
os_interface: ${OS_INTERFACE}
EOF
if [ $OS_IDENTITY_API_VERSION = "3" ]; then
tee -a /tmp/shaker.yaml << EOF
os_project_domain_name: ${OS_PROJECT_DOMAIN_NAME}
os_user_domain_name: ${OS_USER_DOMAIN_NAME}
EOF
fi
else
echo " shaker:" >> /tmp/shaker.yaml
echo " shaker:" >> /tmp/shaker.yaml
cp ${SHAKER_CONF_HOST} ${SHAKER_CONF_HOST}.tmp
sed -i -e 's/^/ /' ${SHAKER_CONF_HOST}.tmp
cat ${SHAKER_CONF_HOST}.tmp >> /tmp/shaker.yaml
rm -rf ${SHAKER_CONF_HOST}.tmp
fi
helm upgrade --install shaker ./shaker \
--namespace=openstack \
--values=/tmp/shaker.yaml \
${OSH_EXTRA_HELM_ARGS} \
${OSH_EXTRA_HELM_ARGS_SHAKER}
#NOTE: Wait for deploy
./tools/gate/scripts/wait-for-pods.sh openstack 2400
#NOTE: Validate Deployment info
kubectl get -n openstack jobs --show-all
if [ -n $EXECUTE_TEST ]; then
helm test shaker --timeout 2700
if [ $COPY_SHAKER_REPORTS_ON_HOST = "true" ]; then
shaker_pod_name=`kubectl -n openstack get pods | grep shaker-run-tests | cut -f1 -d' '`
latest_data_folder=`cat ${SHAKER_DATA_HOSTPATH}/latest-shaker-data-name.txt`
kubectl -n openstack logs ${shaker_pod_name} > ${SHAKER_DATA_HOSTPATH}/${latest_data_folder}/${shaker_pod_name}.logs
fi
fi