Switch to oslo.utils
Change-Id: I262e98d8d03acbe2ff8fee5d607279a669a89e34
This commit is contained in:
parent
4f929c3470
commit
a9ec73f38d
@ -1,12 +1,8 @@
|
|||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
|
|
||||||
# The list of modules to copy from oslo-incubator.git
|
# The list of modules to copy from oslo-incubator.git
|
||||||
module=excutils
|
|
||||||
module=gettextutils
|
module=gettextutils
|
||||||
module=importutils
|
|
||||||
module=jsonutils
|
module=jsonutils
|
||||||
module=network_utils
|
|
||||||
module=timeutils
|
|
||||||
module=middleware/base
|
module=middleware/base
|
||||||
module=middleware/__init__
|
module=middleware/__init__
|
||||||
module=context
|
module=context
|
||||||
|
@ -25,7 +25,6 @@ import six
|
|||||||
from oslo import messaging
|
from oslo import messaging
|
||||||
from oslo.messaging import _utils as utils
|
from oslo.messaging import _utils as utils
|
||||||
from oslo.messaging.openstack.common.gettextutils import _
|
from oslo.messaging.openstack.common.gettextutils import _
|
||||||
from oslo.messaging.openstack.common import importutils
|
|
||||||
from oslo.messaging.openstack.common import jsonutils
|
from oslo.messaging.openstack.common import jsonutils
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
@ -232,7 +231,8 @@ def deserialize_remote_exception(data, allowed_remote_exmods):
|
|||||||
return messaging.RemoteError(name, failure.get('message'), trace)
|
return messaging.RemoteError(name, failure.get('message'), trace)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
mod = importutils.import_module(module)
|
__import__(module)
|
||||||
|
mod = sys.modules[module]
|
||||||
klass = getattr(mod, name)
|
klass = getattr(mod, name)
|
||||||
if not issubclass(klass, Exception):
|
if not issubclass(klass, Exception):
|
||||||
raise TypeError("Can only deserialize Exceptions")
|
raise TypeError("Can only deserialize Exceptions")
|
||||||
|
@ -27,9 +27,9 @@ from oslo.messaging._drivers import amqpdriver
|
|||||||
from oslo.messaging._drivers import common as rpc_common
|
from oslo.messaging._drivers import common as rpc_common
|
||||||
from oslo.messaging import exceptions
|
from oslo.messaging import exceptions
|
||||||
from oslo.messaging.openstack.common.gettextutils import _
|
from oslo.messaging.openstack.common.gettextutils import _
|
||||||
from oslo.messaging.openstack.common import importutils
|
|
||||||
from oslo.messaging.openstack.common import jsonutils
|
from oslo.messaging.openstack.common import jsonutils
|
||||||
from oslo.messaging.openstack.common import network_utils
|
from oslo.utils import importutils
|
||||||
|
from oslo.utils import netutils
|
||||||
|
|
||||||
qpid_codec = importutils.try_import("qpid.codec010")
|
qpid_codec = importutils.try_import("qpid.codec010")
|
||||||
qpid_messaging = importutils.try_import("qpid.messaging")
|
qpid_messaging = importutils.try_import("qpid.messaging")
|
||||||
@ -475,7 +475,7 @@ class Connection(object):
|
|||||||
else:
|
else:
|
||||||
# Old configuration format
|
# Old configuration format
|
||||||
for adr in self.conf.qpid_hosts:
|
for adr in self.conf.qpid_hosts:
|
||||||
hostname, port = network_utils.parse_host_port(
|
hostname, port = netutils.parse_host_port(
|
||||||
adr, default_port=5672)
|
adr, default_port=5672)
|
||||||
|
|
||||||
params = {
|
params = {
|
||||||
|
@ -33,7 +33,7 @@ from oslo.messaging._drivers import amqpdriver
|
|||||||
from oslo.messaging._drivers import common as rpc_common
|
from oslo.messaging._drivers import common as rpc_common
|
||||||
from oslo.messaging import exceptions
|
from oslo.messaging import exceptions
|
||||||
from oslo.messaging.openstack.common.gettextutils import _
|
from oslo.messaging.openstack.common.gettextutils import _
|
||||||
from oslo.messaging.openstack.common import network_utils
|
from oslo.utils import netutils
|
||||||
|
|
||||||
rabbit_opts = [
|
rabbit_opts = [
|
||||||
cfg.StrOpt('kombu_ssl_version',
|
cfg.StrOpt('kombu_ssl_version',
|
||||||
@ -462,7 +462,7 @@ class Connection(object):
|
|||||||
else:
|
else:
|
||||||
# Old configuration format
|
# Old configuration format
|
||||||
for adr in self.conf.rabbit_hosts:
|
for adr in self.conf.rabbit_hosts:
|
||||||
hostname, port = network_utils.parse_host_port(
|
hostname, port = netutils.parse_host_port(
|
||||||
adr, default_port=self.conf.rabbit_port)
|
adr, default_port=self.conf.rabbit_port)
|
||||||
|
|
||||||
params = {
|
params = {
|
||||||
|
@ -32,10 +32,11 @@ from oslo.config import cfg
|
|||||||
from oslo.messaging._drivers import base
|
from oslo.messaging._drivers import base
|
||||||
from oslo.messaging._drivers import common as rpc_common
|
from oslo.messaging._drivers import common as rpc_common
|
||||||
from oslo.messaging._executors import impl_eventlet # FIXME(markmc)
|
from oslo.messaging._executors import impl_eventlet # FIXME(markmc)
|
||||||
from oslo.messaging.openstack.common import excutils
|
|
||||||
from oslo.messaging.openstack.common.gettextutils import _
|
from oslo.messaging.openstack.common.gettextutils import _
|
||||||
from oslo.messaging.openstack.common import importutils
|
|
||||||
from oslo.messaging.openstack.common import jsonutils
|
from oslo.messaging.openstack.common import jsonutils
|
||||||
|
from oslo.utils import excutils
|
||||||
|
from oslo.utils import importutils
|
||||||
|
|
||||||
|
|
||||||
zmq = importutils.try_import('eventlet.green.zmq')
|
zmq = importutils.try_import('eventlet.green.zmq')
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ return keys for direct exchanges, per (approximate) AMQP parlance.
|
|||||||
|
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
from oslo.messaging._drivers import matchmaker as mm_common
|
from oslo.messaging._drivers import matchmaker as mm_common
|
||||||
from oslo.messaging.openstack.common import importutils
|
from oslo.utils import importutils
|
||||||
|
|
||||||
redis = importutils.try_import('redis')
|
redis = importutils.try_import('redis')
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ import greenlet
|
|||||||
|
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
from oslo.messaging._executors import base
|
from oslo.messaging._executors import base
|
||||||
from oslo.messaging.openstack.common import excutils
|
from oslo.utils import excutils
|
||||||
|
|
||||||
_eventlet_opts = [
|
_eventlet_opts = [
|
||||||
cfg.IntOpt('rpc_thread_pool_size',
|
cfg.IntOpt('rpc_thread_pool_size',
|
||||||
|
@ -23,8 +23,8 @@ import six
|
|||||||
from stevedore import named
|
from stevedore import named
|
||||||
|
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
from oslo.messaging.openstack.common import timeutils
|
|
||||||
from oslo.messaging import serializer as msg_serializer
|
from oslo.messaging import serializer as msg_serializer
|
||||||
|
from oslo.utils import timeutils
|
||||||
|
|
||||||
_notifier_opts = [
|
_notifier_opts = [
|
||||||
cfg.MultiStrOpt('notification_driver',
|
cfg.MultiStrOpt('notification_driver',
|
||||||
|
@ -1,99 +0,0 @@
|
|||||||
# 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 logging
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
import traceback
|
|
||||||
|
|
||||||
import six
|
|
||||||
|
|
||||||
from oslo.messaging.openstack.common.gettextutils import _ # noqa
|
|
||||||
|
|
||||||
|
|
||||||
class save_and_reraise_exception(object):
|
|
||||||
"""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.
|
|
||||||
|
|
||||||
In some cases the caller may not want to re-raise the exception, and
|
|
||||||
for those circumstances this context provides a reraise flag that
|
|
||||||
can be used to suppress the exception. For example::
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
with save_and_reraise_exception() as ctxt:
|
|
||||||
decide_if_need_reraise()
|
|
||||||
if not should_be_reraised:
|
|
||||||
ctxt.reraise = False
|
|
||||||
"""
|
|
||||||
def __init__(self):
|
|
||||||
self.reraise = True
|
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
self.type_, self.value, self.tb, = sys.exc_info()
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
||||||
if exc_type is not None:
|
|
||||||
logging.error(_('Original exception being dropped: %s'),
|
|
||||||
traceback.format_exception(self.type_,
|
|
||||||
self.value,
|
|
||||||
self.tb))
|
|
||||||
return False
|
|
||||||
if self.reraise:
|
|
||||||
six.reraise(self.type_, self.value, self.tb)
|
|
||||||
|
|
||||||
|
|
||||||
def forever_retry_uncaught_exceptions(infunc):
|
|
||||||
def inner_func(*args, **kwargs):
|
|
||||||
last_log_time = 0
|
|
||||||
last_exc_message = None
|
|
||||||
exc_count = 0
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
return infunc(*args, **kwargs)
|
|
||||||
except Exception as exc:
|
|
||||||
this_exc_message = six.u(str(exc))
|
|
||||||
if this_exc_message == last_exc_message:
|
|
||||||
exc_count += 1
|
|
||||||
else:
|
|
||||||
exc_count = 1
|
|
||||||
# Do not log any more frequently than once a minute unless
|
|
||||||
# the exception message changes
|
|
||||||
cur_time = int(time.time())
|
|
||||||
if (cur_time - last_log_time > 60 or
|
|
||||||
this_exc_message != last_exc_message):
|
|
||||||
logging.exception(
|
|
||||||
_('Unexpected exception occurred %d time(s)... '
|
|
||||||
'retrying.') % exc_count)
|
|
||||||
last_log_time = cur_time
|
|
||||||
last_exc_message = this_exc_message
|
|
||||||
exc_count = 0
|
|
||||||
# This should be a very rare event. In case it isn't, do
|
|
||||||
# a sleep.
|
|
||||||
time.sleep(1)
|
|
||||||
return inner_func
|
|
@ -1,98 +0,0 @@
|
|||||||
# Copyright 2012 OpenStack Foundation.
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""
|
|
||||||
Network-related utilities and helper functions.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from six.moves.urllib import parse
|
|
||||||
|
|
||||||
|
|
||||||
def parse_host_port(address, default_port=None):
|
|
||||||
"""Interpret a string as a host:port pair.
|
|
||||||
|
|
||||||
An IPv6 address MUST be escaped if accompanied by a port,
|
|
||||||
because otherwise ambiguity ensues: 2001:db8:85a3::8a2e:370:7334
|
|
||||||
means both [2001:db8:85a3::8a2e:370:7334] and
|
|
||||||
[2001:db8:85a3::8a2e:370]:7334.
|
|
||||||
|
|
||||||
>>> parse_host_port('server01:80')
|
|
||||||
('server01', 80)
|
|
||||||
>>> parse_host_port('server01')
|
|
||||||
('server01', None)
|
|
||||||
>>> parse_host_port('server01', default_port=1234)
|
|
||||||
('server01', 1234)
|
|
||||||
>>> parse_host_port('[::1]:80')
|
|
||||||
('::1', 80)
|
|
||||||
>>> parse_host_port('[::1]')
|
|
||||||
('::1', None)
|
|
||||||
>>> parse_host_port('[::1]', default_port=1234)
|
|
||||||
('::1', 1234)
|
|
||||||
>>> parse_host_port('2001:db8:85a3::8a2e:370:7334', default_port=1234)
|
|
||||||
('2001:db8:85a3::8a2e:370:7334', 1234)
|
|
||||||
|
|
||||||
"""
|
|
||||||
if address[0] == '[':
|
|
||||||
# Escaped ipv6
|
|
||||||
_host, _port = address[1:].split(']')
|
|
||||||
host = _host
|
|
||||||
if ':' in _port:
|
|
||||||
port = _port.split(':')[1]
|
|
||||||
else:
|
|
||||||
port = default_port
|
|
||||||
else:
|
|
||||||
if address.count(':') == 1:
|
|
||||||
host, port = address.split(':')
|
|
||||||
else:
|
|
||||||
# 0 means ipv4, >1 means ipv6.
|
|
||||||
# We prohibit unescaped ipv6 addresses with port.
|
|
||||||
host = address
|
|
||||||
port = default_port
|
|
||||||
|
|
||||||
return (host, None if port is None else int(port))
|
|
||||||
|
|
||||||
|
|
||||||
class ModifiedSplitResult(parse.SplitResult):
|
|
||||||
"""Split results class for urlsplit."""
|
|
||||||
|
|
||||||
# NOTE(dims): The functions below are needed for Python 2.6.x.
|
|
||||||
# We can remove these when we drop support for 2.6.x.
|
|
||||||
@property
|
|
||||||
def hostname(self):
|
|
||||||
netloc = self.netloc.split('@', 1)[-1]
|
|
||||||
host, port = parse_host_port(netloc)
|
|
||||||
return host
|
|
||||||
|
|
||||||
@property
|
|
||||||
def port(self):
|
|
||||||
netloc = self.netloc.split('@', 1)[-1]
|
|
||||||
host, port = parse_host_port(netloc)
|
|
||||||
return port
|
|
||||||
|
|
||||||
|
|
||||||
def urlsplit(url, scheme='', allow_fragments=True):
|
|
||||||
"""Parse a URL using urlparse.urlsplit(), splitting query and fragments.
|
|
||||||
This function papers over Python issue9374 when needed.
|
|
||||||
|
|
||||||
The parameters are the same as urlparse.urlsplit.
|
|
||||||
"""
|
|
||||||
scheme, netloc, path, query, fragment = parse.urlsplit(
|
|
||||||
url, scheme, allow_fragments)
|
|
||||||
if allow_fragments and '#' in path:
|
|
||||||
path, fragment = path.split('#', 1)
|
|
||||||
if '?' in path:
|
|
||||||
path, query = path.split('?', 1)
|
|
||||||
return ModifiedSplitResult(scheme, netloc,
|
|
||||||
path, query, fragment)
|
|
@ -1,9 +1,7 @@
|
|||||||
oslo.config>=1.2.1
|
oslo.config>=1.2.1
|
||||||
|
oslo.utils>=0.2.0
|
||||||
stevedore>=0.14
|
stevedore>=0.14
|
||||||
|
|
||||||
# for timeutils
|
|
||||||
iso8601>=0.1.9
|
|
||||||
|
|
||||||
# for jsonutils
|
# for jsonutils
|
||||||
six>=1.7.0
|
six>=1.7.0
|
||||||
|
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
oslo.config>=1.4.0.0a3
|
oslo.config>=1.4.0.0a3
|
||||||
|
oslo.utils>=0.2.0
|
||||||
stevedore>=0.14
|
stevedore>=0.14
|
||||||
|
|
||||||
# for timeutils
|
|
||||||
iso8601>=0.1.9
|
|
||||||
|
|
||||||
# for jsonutils
|
# for jsonutils
|
||||||
six>=1.7.0
|
six>=1.7.0
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ import testscenarios
|
|||||||
|
|
||||||
from oslo import messaging
|
from oslo import messaging
|
||||||
from oslo.messaging.notify import dispatcher as notify_dispatcher
|
from oslo.messaging.notify import dispatcher as notify_dispatcher
|
||||||
from oslo.messaging.openstack.common import timeutils
|
from oslo.utils import timeutils
|
||||||
from tests import utils as test_utils
|
from tests import utils as test_utils
|
||||||
|
|
||||||
load_tests = testscenarios.load_tests_apply_scenarios
|
load_tests = testscenarios.load_tests_apply_scenarios
|
||||||
|
@ -27,7 +27,7 @@ import testscenarios
|
|||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
from oslo import messaging
|
from oslo import messaging
|
||||||
from oslo.messaging.openstack.common import timeutils
|
from oslo.utils import timeutils
|
||||||
from tests.notify import test_notifier
|
from tests.notify import test_notifier
|
||||||
from tests import utils as test_utils
|
from tests import utils as test_utils
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ class TestLogNotifier(test_utils.BaseTestCase):
|
|||||||
self.addCleanup(messaging.notify._impl_test.reset)
|
self.addCleanup(messaging.notify._impl_test.reset)
|
||||||
self.config(notification_driver=['test'])
|
self.config(notification_driver=['test'])
|
||||||
|
|
||||||
@mock.patch('oslo.messaging.openstack.common.timeutils.utcnow')
|
@mock.patch('oslo.utils.timeutils.utcnow')
|
||||||
def test_logger(self, mock_utcnow):
|
def test_logger(self, mock_utcnow):
|
||||||
with mock.patch('oslo.messaging.transport.get_transport',
|
with mock.patch('oslo.messaging.transport.get_transport',
|
||||||
return_value=test_notifier._FakeTransport(self.conf)):
|
return_value=test_notifier._FakeTransport(self.conf)):
|
||||||
@ -106,7 +106,7 @@ class TestLogNotifier(test_utils.BaseTestCase):
|
|||||||
|
|
||||||
@testtools.skipUnless(hasattr(logging.config, 'dictConfig'),
|
@testtools.skipUnless(hasattr(logging.config, 'dictConfig'),
|
||||||
"Need logging.config.dictConfig (Python >= 2.7)")
|
"Need logging.config.dictConfig (Python >= 2.7)")
|
||||||
@mock.patch('oslo.messaging.openstack.common.timeutils.utcnow')
|
@mock.patch('oslo.utils.timeutils.utcnow')
|
||||||
def test_logging_conf(self, mock_utcnow):
|
def test_logging_conf(self, mock_utcnow):
|
||||||
with mock.patch('oslo.messaging.transport.get_transport',
|
with mock.patch('oslo.messaging.transport.get_transport',
|
||||||
return_value=test_notifier._FakeTransport(self.conf)):
|
return_value=test_notifier._FakeTransport(self.conf)):
|
||||||
|
@ -31,8 +31,8 @@ from oslo.messaging.notify import _impl_messaging
|
|||||||
from oslo.messaging.notify import _impl_test
|
from oslo.messaging.notify import _impl_test
|
||||||
from oslo.messaging.notify import notifier as msg_notifier
|
from oslo.messaging.notify import notifier as msg_notifier
|
||||||
from oslo.messaging.openstack.common import jsonutils
|
from oslo.messaging.openstack.common import jsonutils
|
||||||
from oslo.messaging.openstack.common import timeutils
|
|
||||||
from oslo.messaging import serializer as msg_serializer
|
from oslo.messaging import serializer as msg_serializer
|
||||||
|
from oslo.utils import timeutils
|
||||||
from tests import utils as test_utils
|
from tests import utils as test_utils
|
||||||
|
|
||||||
load_tests = testscenarios.load_tests_apply_scenarios
|
load_tests = testscenarios.load_tests_apply_scenarios
|
||||||
@ -147,7 +147,7 @@ class TestMessagingNotifier(test_utils.BaseTestCase):
|
|||||||
self.stubs.Set(_impl_messaging, 'LOG', self.logger)
|
self.stubs.Set(_impl_messaging, 'LOG', self.logger)
|
||||||
self.stubs.Set(msg_notifier, '_LOG', self.logger)
|
self.stubs.Set(msg_notifier, '_LOG', self.logger)
|
||||||
|
|
||||||
@mock.patch('oslo.messaging.openstack.common.timeutils.utcnow')
|
@mock.patch('oslo.utils.timeutils.utcnow')
|
||||||
def test_notifier(self, mock_utcnow):
|
def test_notifier(self, mock_utcnow):
|
||||||
drivers = []
|
drivers = []
|
||||||
if self.v1:
|
if self.v1:
|
||||||
@ -223,7 +223,7 @@ class TestSerializer(test_utils.BaseTestCase):
|
|||||||
super(TestSerializer, self).setUp()
|
super(TestSerializer, self).setUp()
|
||||||
self.addCleanup(_impl_test.reset)
|
self.addCleanup(_impl_test.reset)
|
||||||
|
|
||||||
@mock.patch('oslo.messaging.openstack.common.timeutils.utcnow')
|
@mock.patch('oslo.utils.timeutils.utcnow')
|
||||||
def test_serializer(self, mock_utcnow):
|
def test_serializer(self, mock_utcnow):
|
||||||
transport = _FakeTransport(self.conf)
|
transport = _FakeTransport(self.conf)
|
||||||
|
|
||||||
@ -266,7 +266,7 @@ class TestSerializer(test_utils.BaseTestCase):
|
|||||||
|
|
||||||
class TestLogNotifier(test_utils.BaseTestCase):
|
class TestLogNotifier(test_utils.BaseTestCase):
|
||||||
|
|
||||||
@mock.patch('oslo.messaging.openstack.common.timeutils.utcnow')
|
@mock.patch('oslo.utils.timeutils.utcnow')
|
||||||
def test_notifier(self, mock_utcnow):
|
def test_notifier(self, mock_utcnow):
|
||||||
self.config(notification_driver=['log'])
|
self.config(notification_driver=['log'])
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user