Add grenade support

Zuul v3 does not yet offer native grenade base jobs. Workaround it by
creating a legacy grenade-devstack-octavia playbook.

Change-Id: Ib81557ee75ff2ea365ca8403dcfe6e6724657f75
This commit is contained in:
Carlos Goncalves 2018-03-04 21:25:37 +00:00
parent b9a8309d50
commit 13eab152fb
9 changed files with 337 additions and 0 deletions

128
devstack/upgrade/resources.sh Executable file
View File

@ -0,0 +1,128 @@
#!/bin/bash
set -o errexit
source $GRENADE_DIR/grenaderc
source $GRENADE_DIR/functions
source $TOP_DIR/openrc admin demo
set -o xtrace
OCTAVIA_GRENADE_DIR=$(dirname $0)
INSTANCE_USER_DATA_FILE=$OCTAVIA_GRENADE_DIR/vm_user_data.sh
DEFAULT_INSTANCE_FLAVOR=${DEFAULT_INSTANCE_FLAVOR:-m1.tiny}
PUBLIC_SUBNET_NAME=${PUBLIC_SUBNET_NAME:-"public-subnet"}
PRIVATE_NETWORK_NAME=${PRIVATE_NETWORK_NAME:-"private"}
PRIVATE_SUBNET_NAME=${PRIVATE_SUBNET_NAME:-"private-subnet"}
# $1: desired provisioning_status
# $2: desired operating_status
# $3..n: command with arguments and parameters
# TODO(cgoncalves): set timeout
function _wait_for_status {
while :
do
eval $("${@:3}" -f shell -c provisioning_status -c operating_status)
[[ $operating_status == "ONLINE" && $provisioning_status == "ACTIVE" ]] && break
if [ $provisioning_status == "ERROR" ]; then
die $LINENO "ERROR creating load balancer"
fi
sleep 10
done
}
function create {
# TODO(cgoncalves): make create idempotent for resiliancy in testing
# NOTE(cgoncalves): OS_USERNAME=demo is set to overcome security group name collision
sc_rule_id=$(OS_USERNAME=demo openstack security group rule create -f value -c id --protocol tcp --ingress --dst-port 80 default)
resource_save octavia sc_rule_id $sc_rule_id
# create VMs
vm1_ips=$(openstack server create -f value -c addresses --user-data $INSTANCE_USER_DATA_FILE --flavor $DEFAULT_INSTANCE_FLAVOR --image $DEFAULT_IMAGE_NAME --network $PRIVATE_NETWORK_NAME --wait vm1)
vm2_ips=$(openstack server create -f value -c addresses --user-data $INSTANCE_USER_DATA_FILE --flavor $DEFAULT_INSTANCE_FLAVOR --image $DEFAULT_IMAGE_NAME --network $PRIVATE_NETWORK_NAME --wait vm2)
vm1_ipv4=$(echo $vm1_ips | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
vm2_ipv4=$(echo $vm2_ips | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
openstack loadbalancer create --name lb1 --vip-subnet-id $PUBLIC_SUBNET_NAME
_wait_for_status "ACTIVE" "ONLINE" openstack loadbalancer show lb1
openstack loadbalancer listener create --name listener1 --protocol HTTP --protocol-port 80 lb1
_wait_for_status "ACTIVE" "ONLINE" openstack loadbalancer listener show listener1
openstack loadbalancer pool create --name pool1 --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP
_wait_for_status "ACTIVE" "ONLINE" openstack loadbalancer pool show pool1
openstack loadbalancer healthmonitor create --delay 5 --max-retries 4 --timeout 10 --type HTTP --url-path / --name hm1 pool1
_wait_for_status "ACTIVE" "ONLINE" openstack loadbalancer healthmonitor show hm1
openstack loadbalancer member create --subnet-id $PRIVATE_SUBNET_NAME --address $vm1_ipv4 --protocol-port 80 pool1 --name member1
_wait_for_status "ACTIVE" "ONLINE" openstack loadbalancer member show pool1 member1
openstack loadbalancer member create --subnet-id $PRIVATE_SUBNET_NAME --address $vm2_ipv4 --protocol-port 80 pool1 --name member2
_wait_for_status "ACTIVE" "ONLINE" openstack loadbalancer member show pool1 member2
lb_vip_ip=$(openstack loadbalancer show -f value -c vip_address lb1)
resource_save octavia lb_vip_ip $lb_vip_ip
echo "Octavia create: SUCCESS"
}
function verify {
# verify control plane
openstack loadbalancer show -f value -c operating_status lb1 | grep -q ONLINE
openstack loadbalancer listener show -f value -c operating_status listener1 | grep -q ONLINE
openstack loadbalancer pool show -f value -c operating_status pool1 | grep -q ONLINE
openstack loadbalancer healthmonitor show -f value -c operating_status hm1 | grep -q ONLINE
openstack loadbalancer member show -f value -c operating_status pool1 member1 | grep -q ONLINE
openstack loadbalancer member show -f value -c operating_status pool1 member2 | grep -q ONLINE
# verify data plane
lb_vip_ip=$(resource_get octavia lb_vip_ip)
curl --include -D lb.out $lb_vip_ip
grep -q "^HTTP/1.1 200 OK" lb.out
echo "Octavia verify: SUCCESS"
}
function verify_noapi {
# verify data plane
lb_vip_ip=$(resource_get octavia lb_vip_ip)
curl --include -D lb.out $lb_vip_ip
grep -q "^HTTP/1.1 200 OK" lb.out
echo "Octavia verify_noapi: SUCCESS"
}
function destroy {
sc_rule_id=$(resource_get octavia sc_rule_id)
# make destroy idempotent for resiliancy in testing
openstack loadbalancer show lb1 && openstack loadbalancer delete --cascade lb1
openstack server show vm1 && openstack server delete vm1
openstack server show vm2 && openstack server delete vm2
openstack security group rule show $sc_rule_id && openstack security group rule delete $sc_rule_id
echo "Octavia destroy: SUCCESS"
}
# Dispatcher
case $1 in
"create")
create
;;
"verify_noapi")
verify_noapi
;;
"verify")
verify
;;
"destroy")
destroy
;;
"force_destroy")
set +o errexit
destroy
;;
esac

11
devstack/upgrade/settings Normal file
View File

@ -0,0 +1,11 @@
register_project_for_upgrade octavia
register_db_to_save octavia
devstack_localrc base enable_plugin octavia https://git.openstack.org/openstack/octavia stable/queens
devstack_localrc target enable_plugin octavia https://git.openstack.org/openstack/octavia
devstack_localrc base enable_service o-api o-cw o-hm o-hk octavia
devstack_localrc target enable_service o-api o-cw o-hm o-hk octavia
BASE_RUN_SMOKE=False
TARGET_RUN_SMOKE=False

24
devstack/upgrade/shutdown.sh Executable file
View File

@ -0,0 +1,24 @@
#!/bin/bash
set -o errexit
source $GRENADE_DIR/grenaderc
source $GRENADE_DIR/functions
# We need base DevStack functions for this
source $BASE_DEVSTACK_DIR/functions
source $BASE_DEVSTACK_DIR/stackrc # needed for status directory
source $BASE_DEVSTACK_DIR/lib/tls
source $BASE_DEVSTACK_DIR/lib/apache
source $BASE_DEVSTACK_DIR/lib/neutron
OCTAVIA_DEVSTACK_DIR=$(dirname $(dirname $0))
source $OCTAVIA_DEVSTACK_DIR/settings
source $OCTAVIA_DEVSTACK_DIR/plugin.sh
set -o xtrace
octavia_stop
# sanity check that service is actually down
ensure_services_stopped o-api o-cw o-hk o-hm

70
devstack/upgrade/upgrade.sh Executable file
View File

@ -0,0 +1,70 @@
#!/usr/bin/env bash
# ``upgrade-octavia``
echo "*********************************************************************"
echo "Begin $0"
echo "*********************************************************************"
# Clean up any resources that may be in use
cleanup() {
set +o errexit
echo "********************************************************************"
echo "ERROR: Abort $0"
echo "********************************************************************"
# Kill ourselves to signal any calling process
trap 2; kill -2 $$
}
trap cleanup SIGHUP SIGINT SIGTERM
# Keep track of the grenade directory
RUN_DIR=$(cd $(dirname "$0") && pwd)
# Source params
source $GRENADE_DIR/grenaderc
# Import common functions
source $GRENADE_DIR/functions
# This script exits on an error so that errors don't compound and you see
# only the first error that occurred.
set -o errexit
# Upgrade octavia
# ============
# Get functions from current DevStack
source $TARGET_DEVSTACK_DIR/stackrc
source $TARGET_DEVSTACK_DIR/lib/apache
source $TARGET_DEVSTACK_DIR/lib/tls
source $(dirname $(dirname $BASH_SOURCE))/settings
source $(dirname $(dirname $BASH_SOURCE))/plugin.sh
# Print the commands being run so that we can see the command that triggers
# an error. It is also useful for following allowing as the install occurs.
set -o xtrace
# Save current config files for posterity
[[ -d $SAVE_DIR/etc.octavia ]] || cp -pr $OCTAVIA_CONF_DIR $SAVE_DIR/etc.octavia
# Install the target octavia
octavia_install
# calls upgrade-octavia for specific release
upgrade_project octavia $RUN_DIR $BASE_DEVSTACK_BRANCH $TARGET_DEVSTACK_BRANCH
# Migrate the database
octavia-db-manage upgrade head || die $LINO "DB migration error"
octavia_start
# Don't succeed unless the services come up
ensure_services_started o-api o-cw o-hm o-hk
set +o xtrace
echo "*********************************************************************"
echo "SUCCESS: End $0"
echo "*********************************************************************"

View File

@ -0,0 +1,4 @@
#!/bin/sh -v
Body=$(hostname)
Response="HTTP/1.1 200 OK\r\nContent-Length: ${#Body}\r\n\r\n$Body"
while true ; do echo -e $Response | nc -llp 80; done

View File

@ -0,0 +1,15 @@
- hosts: primary
tasks:
- name: Copy files from {{ ansible_user_dir }}/workspace/ on node
synchronize:
src: '{{ ansible_user_dir }}/workspace/'
dest: '{{ zuul.executor.log_root }}'
mode: pull
copy_links: true
verify_host: true
rsync_opts:
- --include=/logs/**
- --include=*/
- --exclude=*
- --prune-empty-dirs

View File

@ -0,0 +1,60 @@
- hosts: all
name: legacy-grenade-dsvm-octavia
tasks:
- name: Ensure legacy workspace directory
file:
path: '{{ ansible_user_dir }}/workspace'
state: directory
- shell:
cmd: |
set -e
set -x
cat > clonemap.yaml << EOF
clonemap:
- name: openstack-infra/devstack-gate
dest: devstack-gate
EOF
/usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
git://git.openstack.org \
openstack-infra/devstack-gate
executable: /bin/bash
chdir: '{{ ansible_user_dir }}/workspace'
environment: '{{ zuul | zuul_legacy_vars }}'
- shell:
cmd: |
set -e
set -x
export PYTHONUNBUFFERED=true
export PROJECTS="openstack-dev/grenade $PROJECTS"
export PROJECTS="openstack/octavia $PROJECTS"
export PROJECTS="openstack/octavia-tempest-plugin $PROJECTS"
export PROJECTS="openstack/python-octaviaclient $PROJECTS"
export DEVSTACK_PROJECT_FROM_GIT="python-octaviaclient $DEVSTACK_PROJECT_FROM_GIT"
export GRENADE_PLUGINRC="enable_grenade_plugin octavia https://git.openstack.org/openstack/octavia"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"export TEMPEST_PLUGINS='/opt/stack/new/octavia-tempest-plugin'"
export DEVSTACK_GATE_TEMPEST=1
export DEVSTACK_GATE_GRENADE=pullup
export BRANCH_OVERRIDE=default
if [ "$BRANCH_OVERRIDE" != "default" ] ; then
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
fi
# Add configuration values for enabling security features in local.conf
function pre_test_hook {
if [ -f /opt/stack/old/octavia-tempest-plugin/tools/pre_test_hook.sh ] ; then
. /opt/stack/old/octavia-tempest-plugin/tools/pre_test_hook.sh
fi
}
export -f pre_test_hook
cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
./safe-devstack-vm-gate-wrap.sh
executable: /bin/bash
chdir: '{{ ansible_user_dir }}/workspace'
environment: '{{ zuul | zuul_legacy_vars }}'

View File

@ -110,3 +110,15 @@
amphora_os: centos amphora_os: centos
amphora_image_size: 3 amphora_image_size: 3
amphora_os_release: 7 amphora_os_release: 7
- job:
name: octavia-grenade
parent: octavia-legacy-dsvm-base
run: playbooks/legacy/grenade-devstack-octavia/run.yaml
post-run: playbooks/legacy/grenade-devstack-octavia/post.yaml
required-projects:
- openstack-dev/grenade
- openstack-infra/devstack-gate
- openstack/octavia
- openstack/octavia-tempest-plugin
- openstack/python-octaviaclient

View File

@ -49,6 +49,19 @@
- octavia-v2-dsvm-py35-scenario: - octavia-v2-dsvm-py35-scenario:
voting: false voting: false
branches: ^(?!stable/ocata).*$ branches: ^(?!stable/ocata).*$
- octavia-grenade:
branches: ^(?!stable/(ocata|queens)).*$
voting: false
irrelevant-files:
- ^.*\.rst$
- ^api-ref/.*$
- ^doc/.*$
- ^octavia/tests/unit/.*$
- ^releasenotes/.*$
- ^setup.cfg$
- ^tools/.*$
- ^(test-|)requirements.txt$
- ^tox.ini$
gate: gate:
queue: octavia queue: octavia
jobs: jobs: