diff --git a/openstack-common.conf b/openstack-common.conf new file mode 100644 index 000000000..6aef1eb42 --- /dev/null +++ b/openstack-common.conf @@ -0,0 +1,9 @@ +[DEFAULT] + +# The list of modules to copy from oslo-incubator.git +module=excutils +module=log + +# The base module to hold the copy of openstack.common +base=taskflow + diff --git a/taskflow/openstack/__init__.py b/taskflow/openstack/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/taskflow/openstack/common/__init__.py b/taskflow/openstack/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/taskflow/openstack/common/excutils.py b/taskflow/openstack/common/excutils.py new file mode 100644 index 000000000..9edeb58a7 --- /dev/null +++ b/taskflow/openstack/common/excutils.py @@ -0,0 +1,51 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack Foundation. +# Copyright 2012, Red Hat, Inc. +# +# 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. + +""" +Exception related utilities. +""" + +import contextlib +import logging +import sys +import traceback + +from taskflow.openstack.common.gettextutils import _ + + +@contextlib.contextmanager +def save_and_reraise_exception(): + """Save current exception, run some code and then re-raise. + + In some cases the exception context can be cleared, resulting in None + being attempted to be re-raised after an exception handler is run. This + can happen when eventlet switches greenthreads or when running an + exception handler, code raises and catches an exception. In both + cases the exception context will be cleared. + + To work around this, we save the exception state, run handler code, and + then re-raise the original exception. If another exception occurs, the + saved exception is logged and the new exception is re-raised. + """ + type_, value, tb = sys.exc_info() + try: + yield + except Exception: + logging.error(_('Original exception being dropped: %s'), + traceback.format_exception(type_, value, tb)) + raise + raise type_, value, tb diff --git a/taskflow/openstack/common/gettextutils.py b/taskflow/openstack/common/gettextutils.py new file mode 100644 index 000000000..e1a35bf85 --- /dev/null +++ b/taskflow/openstack/common/gettextutils.py @@ -0,0 +1,50 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 Red Hat, Inc. +# All Rights Reserved. +# +# 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. + +""" +gettext for openstack-common modules. + +Usual usage in an openstack.common module: + + from taskflow.openstack.common.gettextutils import _ +""" + +import gettext +import os + +_localedir = os.environ.get('taskflow'.upper() + '_LOCALEDIR') +_t = gettext.translation('taskflow', localedir=_localedir, fallback=True) + + +def _(msg): + return _t.ugettext(msg) + + +def install(domain): + """Install a _() function using the given translation domain. + + Given a translation domain, install a _() function using gettext's + install() function. + + The main difference from gettext.install() is that we allow + overriding the default localedir (e.g. /usr/share/locale) using + a translation-domain-specific environment variable (e.g. + NOVA_LOCALEDIR). + """ + gettext.install(domain, + localedir=os.environ.get(domain.upper() + '_LOCALEDIR'), + unicode=True)