convert unicode to string before we connect to rados

rados client only support string argument, therefore we have to
convert argument to string first.

closes-Bug: #1672792

Change-Id: I007c15dc61db9dbf7df7b8bea7c3dce49f0396f5
(cherry picked from commit 2f5ebdba5f)
This commit is contained in:
Luo Gangyi 2017-05-17 13:16:29 +08:00 committed by Lee Yarwood
parent 97441fe398
commit 92a59b39a0
2 changed files with 11 additions and 1 deletions

View File

@ -310,6 +310,12 @@ class RbdTestCase(test.NoDBTestCase):
mock_rados.Rados.open_ioctx.assert_called_once_with(self.rbd_pool)
mock_rados.Rados.shutdown.assert_called_once_with()
@mock.patch.object(rbd_utils, 'rados')
def test_connect_to_rados_unicode_arg(self, mock_rados):
self.driver._connect_to_rados(u'unicode_pool')
self.mock_rados.Rados.open_ioctx.assert_called_with(
test.MatchType(str))
def test_ceph_args_none(self):
self.driver.rbd_user = None
self.driver.ceph_conf = None

View File

@ -135,7 +135,11 @@ class RBDDriver(object):
try:
client.connect()
pool_to_open = pool or self.pool
ioctx = client.open_ioctx(pool_to_open)
# NOTE(luogangyi): open_ioctx >= 10.1.0 could handle unicode
# arguments perfectly as part of Python 3 support.
# Therefore, when we turn to Python 3, it's safe to remove
# str() conversion.
ioctx = client.open_ioctx(str(pool_to_open))
return client, ioctx
except rados.Error:
# shutdown cannot raise an exception