diff options
author | Joshua Hesketh <josh@nitrotech.org> | 2014-05-02 10:05:10 +1000 |
---|---|---|
committer | Joshua Hesketh <josh@nitrotech.org> | 2014-05-02 10:05:10 +1000 |
commit | ab964fbca22b2d65f0177af2256f95164482a370 (patch) | |
tree | 146d4341517dfb3735bd6ff2da95a5c4c106bb57 /turbo_hipster/task_plugins/real_db_upgrade/nova_mysql_migrations.sh | |
parent | 0759d0262dc6baf5a1aa3ed437749aef06b5aa3c (diff) | |
download | turbo-hipster-ab964fbca22b2d65f0177af2256f95164482a370.tar.gz |
Rename real_db_upgrade plugin
The 'gate' part of the plugin name is misleading and unncessary.
Change-Id: I4f29e110da4f2c00076ba17e31a0f3b3d66463aa
Diffstat (limited to 'turbo_hipster/task_plugins/real_db_upgrade/nova_mysql_migrations.sh')
-rwxr-xr-x | turbo_hipster/task_plugins/real_db_upgrade/nova_mysql_migrations.sh | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/turbo_hipster/task_plugins/real_db_upgrade/nova_mysql_migrations.sh b/turbo_hipster/task_plugins/real_db_upgrade/nova_mysql_migrations.sh new file mode 100755 index 0000000..73ea63c --- /dev/null +++ b/turbo_hipster/task_plugins/real_db_upgrade/nova_mysql_migrations.sh @@ -0,0 +1,247 @@ +#!/bin/bash +# +# Copyright 2013 Rackspace Australia +# +# 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. + + +# $1 is the unique id +# $2 is the working dir path +# $3 is the path to the git repo path +# $4 is the nova db user +# $5 is the nova db password +# $6 is the nova db name +# $7 is the path to the dataset to test against +# $8 is the logging.conf for openstack +# $9 is the pip cache dir + +# We also support the following environment variables to tweak our behavour: +# NOCLEANUP: if set to anything, don't cleanup at the end of the run + +pip_requires() { + pip install -q mysql-python + pip install -q eventlet + requires="tools/pip-requires" + if [ ! -e $requires ] + then + requires="requirements.txt" + fi + echo "Install pip requirements from $requires" + pip install -q -r $requires + echo "Requirements installed" +} + +db_sync() { + # $1 is the test target + # $2 is the working dir path + # $3 is the path to the git repo path + # $4 is the nova db user + # $5 is the nova db password + # $6 is the nova db name + # $7 is the logging.conf for openstack + # $8 is an (optional) destination version number + + # Create a nova.conf file + cat - > $2/nova-$1.conf <<EOF +[DEFAULT] +sql_connection = mysql://$4:$5@172.16.0.1/$6?charset=utf8 +log_config = $7 +EOF + + # Silently return git to a known good state (delete untracked files) + git clean -xfdq + + echo "***** Start DB upgrade to state of $1 *****" + echo "HEAD of branch under test is:" + git log -n 1 + + echo "Setting up the nova-manage entry point" + python setup.py -q clean + python setup.py -q develop + python setup.py -q install + + # Log the migrations present + echo "Migrations present:" + ls $3/nova/db/sqlalchemy/migrate_repo/versions/*.py | sed 's/.*\///' | egrep "^[0-9]+_" + + # Flush innodb's caches + echo "Restarting mysql" + sudo service mysql stop + sudo service mysql start + + echo "MySQL counters before upgrade:" + mysql -u $4 --password=$5 $6 -e "show status like 'innodb%';" + + start_version=`mysql -u $4 --password=$5 $6 -e "select * from migrate_version \G" | grep version | sed 's/.*: //'` + + if [ "%$8%" == "%%" ] + then + end_version=`ls $3/nova/db/sqlalchemy/migrate_repo/versions/*.py | sed 's/.*\///' | egrep "^[0-9]+_" | tail -1 | cut -f 1 -d "_"` + else + end_version=$8 + fi + + echo "Test will migrate from $start_version to $end_version" + if [ $end_version -lt $start_version ] + then + increment=-1 + end_version=$(( $end_version + 1 )) + else + increment=1 + start_version=$(( $start_version + 1)) + fi + + for i in `seq $start_version $increment $end_version` + do + set -x + sudo /sbin/ip netns exec nonet `dirname $0`/nova-manage-wrapper.sh $VENV_PATH --config-file $2/nova-$1.conf --verbose db sync --version $i + manage_exit=$? + set +x + + echo "MySQL counters after upgrade:" + mysql -u $4 --password=$5 $6 -e "show status like 'innodb%';" + + echo "nova-manage returned exit code $manage_exit" + if [ $manage_exit -gt 0 ] + then + echo "Aborting early" + exit $manage_exit + fi + done + + echo "***** Finished DB upgrade to state of $1 *****" +} + +stable_release_db_sync() { + # $1 is the working dir path + # $2 is the path to the git repo path + # $3 is the nova db user + # $4 is the nova db password + # $5 is the nova db name + # $6 is the logging.conf for openstack + + version=`mysql -u $3 --password=$4 $5 -e "select * from migrate_version \G" | grep version | sed 's/.*: //'` + + # Some databases are from Folsom + echo "Schema version is $version" + if [ $version == "133" ] # I think this should be [ $version lt "133" ] + then + echo "Database is from Folsom! Upgrade via Grizzly" + git branch -D stable/grizzly || true + git remote update + git checkout -b stable/grizzly + git reset --hard remotes/origin/stable/grizzly + pip_requires + db_sync "grizzly" $1 $2 $3 $4 $5 $6 + fi + + version=`mysql -u $3 --password=$4 $5 -e "select * from migrate_version \G" | grep version | sed 's/.*: //'` + # Some databases are from Grizzly + echo "Schema version is $version" + if [ $version == "161" ] # I think this should be [ $version lt "161" ] + then + echo "Database is from Grizzly! Upgrade via Havana" + git branch -D stable/havana || true + git remote update + git checkout -b stable/havana + git reset --hard remotes/origin/stable/havana + pip_requires + db_sync "havana" $1 $2 $3 $4 $5 $6 + fi +} + +echo "Test running on "`hostname`" as "`whoami`" ("`echo ~`", $HOME)" +echo "To execute this script manually, run this:" +echo "$0 $1 $2 $3 $4 $5 $6 $7 $8 $9" + +# Setup the environment +export PATH=/usr/lib/ccache:$PATH +export PIP_DOWNLOAD_CACHE=$9 +#export PIP_INDEX_URL="http://www.rcbops.com/pypi/mirror" +export PIP_INDEX_URL="http://pypi.openstack.org/openstack" +export PIP_EXTRA_INDEX_URL="https://pypi.python.org/simple/" + +# Restore database to known good state +echo "Restoring test database $6" +set -x +mysql -u $4 --password=$5 -e "drop database $6" +mysql -u $4 --password=$5 -e "create database $6" +mysql -u $4 --password=$5 $6 < $7 +set +x + +echo "Build test environment" +cd $3 + +echo "Setting up virtual env" +source ~/.bashrc +source /etc/bash_completion.d/virtualenvwrapper +export WORKON_HOME=/var/lib/turbo-hipster/envs +VENV_PATH=$WORKON_HOME/$1 +rm -rf $VENV_PATH +mkvirtualenv $1 +toggleglobalsitepackages +export PYTHONPATH=$PYTHONPATH:$3 + +if [ ! -e $VENV_PATH ] +then + echo "Error: making the virtual env failed" + exit 1 +fi + +stable_release_db_sync $2 $3 $4 $5 $6 $8 + +last_stable_version=`mysql -u $4 --password=$5 $6 -e "select * from migrate_version \G" | grep version | sed 's/.*: //'` +echo "Schema after stable_release_db_sync version is $last_stable_version" + +# Make sure the test DB is up to date with trunk +if [ `git show | grep "^\-\-\-" | grep "migrate_repo/versions" | wc -l` -gt 0 ] +then + echo "This change alters an existing migration, skipping trunk updates." +else + echo "Update database to current state of trunk" + git checkout master + pip_requires + db_sync "trunk" $2 $3 $4 $5 $6 $8 + git checkout working +fi + +# Now run the patchset +echo "Now test the patchset" +pip_requires +db_sync "patchset" $2 $3 $4 $5 $6 $8 + +# Determine the schema version +version=`mysql -u $4 --password=$5 $6 -e "select * from migrate_version \G" | grep version | sed 's/.*: //'` +echo "Schema version is $version" + +echo "Now downgrade all the way back to the last stable version (v$last_stable_version)" +db_sync "downgrade" $2 $3 $4 $5 $6 $8 $last_stable_version + +# Determine the schema version +version=`mysql -u $4 --password=$5 $6 -e "select * from migrate_version \G" | grep version | sed 's/.*: //'` +echo "Schema version is $version" + +echo "And now back up to head from the start of trunk" +db_sync "patchset" $2 $3 $4 $5 $6 $8 + +# Determine the final schema version +version=`mysql -u $4 --password=$5 $6 -e "select * from migrate_version \G" | grep version | sed 's/.*: //'` +echo "Final schema version is $version" + +if [ "%$NOCLEANUP%" == "%%" ] +then + # Cleanup virtual env + echo "Cleaning up virtual env" + deactivate + rmvirtualenv $1 +fi |