wrap sqlalchemy exceptions in a generic error

This commit is contained in:
Vishvananda Ishaya 2011-01-21 15:48:10 -08:00
parent ffe08ea0c5
commit 9bdcc71733
5 changed files with 59 additions and 35 deletions

View File

@ -61,7 +61,6 @@ import sys
import time import time
import IPy import IPy
from sqlalchemy import exc
# If ../nova/__init__.py exists, add ../ to Python search path, so that # If ../nova/__init__.py exists, add ../ to Python search path, so that
# it will override what happens to be installed in /usr/(local/)lib/python... # it will override what happens to be installed in /usr/(local/)lib/python...
@ -280,7 +279,7 @@ class UserCommands(object):
arguments: name [access] [secret]""" arguments: name [access] [secret]"""
try: try:
user = self.manager.create_user(name, access, secret, True) user = self.manager.create_user(name, access, secret, True)
except exc.OperationalError, e: except exception.DBError, e:
_db_error(e) _db_error(e)
self._print_export(user) self._print_export(user)
@ -289,7 +288,7 @@ class UserCommands(object):
arguments: name [access] [secret]""" arguments: name [access] [secret]"""
try: try:
user = self.manager.create_user(name, access, secret, False) user = self.manager.create_user(name, access, secret, False)
except exc.OperationalError, e: except exception.DBError, e:
_db_error(e) _db_error(e)
self._print_export(user) self._print_export(user)

View File

@ -1,15 +1,14 @@
#!/usr/bin/env bash #!/usr/bin/env bash
DIR=`pwd` DIR=`pwd`
CMD=$1 CMD=$1
SOURCE_BRANCH=lp:nova if [ "$CMD" = "branch" ]; then
if [ -n "$2" ]; then SOURCE_BRANCH=${2:-lp:nova}
SOURCE_BRANCH=$2 DIRNAME=${3:-nova}
else
DIRNAME=${2:-nova}
fi fi
DIRNAME=nova
NOVA_DIR=$DIR/$DIRNAME NOVA_DIR=$DIR/$DIRNAME
if [ -n "$3" ]; then
NOVA_DIR=$DIR/$3
fi
if [ ! -n "$HOST_IP" ]; then if [ ! -n "$HOST_IP" ]; then
# NOTE(vish): This will just get the first ip in the list, so if you # NOTE(vish): This will just get the first ip in the list, so if you
@ -45,7 +44,68 @@ else
AUTH=dbdriver.DbDriver AUTH=dbdriver.DbDriver
fi fi
mkdir -p /etc/nova if [ "$CMD" == "branch" ]; then
sudo apt-get install -y bzr
if [ ! -e "$DIR/.bzr" ]; then
bzr init-repo $DIR
fi
rm -rf $NOVA_DIR
bzr branch $SOURCE_BRANCH $NOVA_DIR
cd $NOVA_DIR
mkdir -p $NOVA_DIR/instances
mkdir -p $NOVA_DIR/networks
exit
fi
# You should only have to run this once
if [ "$CMD" == "install" ]; then
sudo apt-get install -y python-software-properties
sudo add-apt-repository ppa:nova-core/trunk
sudo apt-get update
sudo apt-get install -y dnsmasq-base kpartx kvm gawk iptables ebtables
sudo apt-get install -y user-mode-linux kvm libvirt-bin
sudo apt-get install -y screen euca2ools vlan curl rabbitmq-server
sudo apt-get install -y lvm2 iscsitarget open-iscsi
sudo apt-get install -y socat
echo "ISCSITARGET_ENABLE=true" | sudo tee /etc/default/iscsitarget
sudo /etc/init.d/iscsitarget restart
sudo modprobe kvm
sudo /etc/init.d/libvirt-bin restart
sudo modprobe nbd
sudo apt-get install -y python-twisted python-sqlalchemy python-mox python-greenlet python-carrot
sudo apt-get install -y python-migrate python-eventlet python-gflags python-ipy python-tempita
sudo apt-get install -y python-libvirt python-libxml2 python-routes python-cheetah
sudo apt-get install -y python-netaddr python-paste python-pastedeploy python-glance
if [ "$USE_IPV6" == 1 ]; then
sudo apt-get install -y radvd
sudo bash -c "echo 1 > /proc/sys/net/ipv6/conf/all/forwarding"
sudo bash -c "echo 0 > /proc/sys/net/ipv6/conf/all/accept_ra"
fi
if [ "$USE_MYSQL" == 1 ]; then
cat <<MYSQL_PRESEED | debconf-set-selections
mysql-server-5.1 mysql-server/root_password password $MYSQL_PASS
mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASS
mysql-server-5.1 mysql-server/start_on_boot boolean true
MYSQL_PRESEED
apt-get install -y mysql-server python-mysqldb
fi
mkdir -p $DIR/images
wget -c http://images.ansolabs.com/tty.tgz
tar -C $DIR/images -zxf tty.tgz
exit
fi
NL=`echo -ne '\015'`
function screen_it {
screen -S nova -X screen -t $1
screen -S nova -p $1 -X stuff "$2$NL"
}
if [ "$CMD" == "run" ]; then
cat >$NOVA_DIR/bin/nova.conf << NOVA_CONF_EOF cat >$NOVA_DIR/bin/nova.conf << NOVA_CONF_EOF
--verbose --verbose
--nodaemon --nodaemon
@ -66,61 +126,6 @@ if [ "$USE_IPV6" == 1 ]; then
echo "--use_ipv6" >>$NOVA_DIR/bin/nova.conf echo "--use_ipv6" >>$NOVA_DIR/bin/nova.conf
fi fi
if [ "$CMD" == "branch" ]; then
sudo apt-get install -y bzr
rm -rf $NOVA_DIR
bzr branch $SOURCE_BRANCH $NOVA_DIR
cd $NOVA_DIR
mkdir -p $NOVA_DIR/instances
mkdir -p $NOVA_DIR/networks
fi
# You should only have to run this once
if [ "$CMD" == "install" ]; then
sudo apt-get install -y python-software-properties
sudo add-apt-repository ppa:nova-core/trunk
sudo apt-get update
sudo apt-get install -y dnsmasq-base kpartx kvm gawk iptables ebtables
sudo apt-get install -y user-mode-linux kvm libvirt-bin
sudo apt-get install -y screen euca2ools vlan curl rabbitmq-server
sudo apt-get install -y lvm2 iscsitarget open-iscsi
sudo apt-get install -y socat
echo "ISCSITARGET_ENABLE=true" | sudo tee /etc/default/iscsitarget
sudo /etc/init.d/iscsitarget restart
sudo modprobe kvm
sudo /etc/init.d/libvirt-bin restart
sudo modprobe nbd
sudo apt-get install -y python-twisted python-sqlalchemy python-mox python-greenlet python-carrot
sudo apt-get install -y python-daemon python-eventlet python-gflags python-ipy python-tempita
sudo apt-get install -y python-libvirt python-libxml2 python-routes python-cheetah
sudo apt-get install -y python-netaddr python-paste python-pastedeploy python-glance
if [ "$USE_IPV6" == 1 ]; then
sudo apt-get install -y radvd
sudo bash -c "echo 1 > /proc/sys/net/ipv6/conf/all/forwarding"
sudo bash -c "echo 0 > /proc/sys/net/ipv6/conf/all/accept_ra"
fi
if [ "$USE_MYSQL" == 1 ]; then
cat <<MYSQL_PRESEED | debconf-set-selections
mysql-server-5.1 mysql-server/root_password password $MYSQL_PASS
mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASS
mysql-server-5.1 mysql-server/start_on_boot boolean true
MYSQL_PRESEED
apt-get install -y mysql-server python-mysqldb
fi
wget -c http://c2477062.cdn.cloudfiles.rackspacecloud.com/images.tgz
tar -C $DIR -zxf images.tgz
fi
NL=`echo -ne '\015'`
function screen_it {
screen -S nova -X screen -t $1
screen -S nova -p $1 -X stuff "$2$NL"
}
if [ "$CMD" == "run" ]; then
killall dnsmasq killall dnsmasq
if [ "$USE_IPV6" == 1 ]; then if [ "$USE_IPV6" == 1 ]; then
killall radvd killall radvd

View File

@ -71,7 +71,6 @@ class NoMoreTargets(exception.Error):
"""No more available blades""" """No more available blades"""
pass pass
################### ###################

View File

@ -22,6 +22,7 @@ Session Handling for SQLAlchemy backend
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from nova import exception
from nova import flags from nova import flags
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
@ -43,4 +44,6 @@ def get_session(autocommit=True, expire_on_commit=False):
autocommit=autocommit, autocommit=autocommit,
expire_on_commit=expire_on_commit)) expire_on_commit=expire_on_commit))
session = _MAKER() session = _MAKER()
session.query = exception.wrap_db_error(session.query)
session.flush = exception.wrap_db_error(session.flush)
return session return session

View File

@ -80,6 +80,24 @@ class TimeoutException(Error):
pass pass
class DBError(Error):
"""Wraps an implementation specific exception"""
def __init__(self, inner_exception):
self.inner_exception = inner_exception
super(DBError, self).__init__(str(inner_exception))
def wrap_db_error(f):
def _wrap(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception, e:
LOG.exception(_('DB exception wrapped'))
raise DBError(e)
return _wrap
_wrap.func_name = f.func_name
def wrap_exception(f): def wrap_exception(f):
def _wrap(*args, **kw): def _wrap(*args, **kw):
try: try: