#!/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