From 690868bc99ee4d82edc2546b4b5fa594b397cb37 Mon Sep 17 00:00:00 2001
From: Victor Stinner <victor.stinner@enovance.com>
Date: Wed, 18 Dec 2013 14:23:24 +0100
Subject: [PATCH] Minor Python 3 fixes

basestring does not exist anymore in Python 3: use six.string_types instead.

In "try: .../except Exception as err: ...", err is a local variable, it does no
more exist after the except block. Copy the exception in a new cls_error
variable to fix Python 3 support.

Extract of Python 3 documentation: "When an exception has been assigned using
as target, it is cleared at the end of the except clause. (...) Exceptions are
cleared because with the traceback attached to them, they form a reference
cycle with the stack frame, keeping all locals in that frame alive until the
next garbage collection occurs."

http://docs.python.org/3.3/reference/compound_stmts.html#try

Change-Id: I2efb14b3838f78d1ed5e09b3ccd4e796a3448aee
---
 oslo/messaging/transport.py           | 4 ++--
 tests/test_exception_serialization.py | 3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/oslo/messaging/transport.py b/oslo/messaging/transport.py
index 4ffefc91e..20274a023 100644
--- a/oslo/messaging/transport.py
+++ b/oslo/messaging/transport.py
@@ -28,6 +28,7 @@ __all__ = [
 ]
 
 from oslo.config import cfg
+import six
 from stevedore import driver
 
 from oslo.messaging import exceptions
@@ -352,8 +353,7 @@ class TransportURL(object):
         if not url:
             return cls(conf, aliases=aliases)
 
-        # FIXME(flaper87): Not PY3K compliant
-        if not isinstance(url, basestring):
+        if not isinstance(url, six.string_types):
             raise InvalidTransportURL(url, 'Wrong URL type')
 
         url = urlutils.urlparse(url)
diff --git a/tests/test_exception_serialization.py b/tests/test_exception_serialization.py
index 4c06c3a2c..f081c9681 100644
--- a/tests/test_exception_serialization.py
+++ b/tests/test_exception_serialization.py
@@ -119,6 +119,7 @@ class SerializeRemoteExceptionTestCase(test_utils.BaseTestCase):
             try:
                 raise self.cls(*self.args, **self.kwargs)
             except Exception as ex:
+                cls_error = ex
                 if self.add_remote:
                     ex = add_remote_postfix(ex)
                 raise ex
@@ -137,7 +138,7 @@ class SerializeRemoteExceptionTestCase(test_utils.BaseTestCase):
         self.assertEqual(failure['kwargs'], self.kwargs)
 
         # Note: _Remote prefix not stripped from tracebacks
-        tb = ex.__class__.__name__ + ': ' + self.msg
+        tb = cls_error.__class__.__name__ + ': ' + self.msg
         self.assertIn(tb, ''.join(failure['tb']))
 
         if self.log_failure: