Allow RBDClient to be used from a with-statement

This allows users of the RBD client to use a 'with' statement and bound
the scope of a client connection to a python block, which makes for
lovely looking code under the right conditions.

Change-Id: I455e8b6063dff36794d8aec7922ee1f26b3cf298
This commit is contained in:
Jon Bernard 2015-11-23 17:41:43 -05:00
parent 390170198a
commit 27cc6c9a5c
2 changed files with 38 additions and 0 deletions

View File

@ -57,6 +57,12 @@ class RBDClient(object):
self.client, self.ioctx = self.connect()
def __enter__(self):
return self
def __exit__(self, type_, value, traceback):
self.disconnect()
def connect(self):
client = self.rados.Rados(rados_id=self.rbd_user,
conffile=self.rbd_conf)

View File

@ -14,6 +14,38 @@ import mock
from os_brick.initiator import linuxrbd
from os_brick.tests import base
from oslo_utils import encodeutils
class RBDClientTestCase(base.TestCase):
def setUp(self):
super(RBDClientTestCase, self).setUp()
@mock.patch('os_brick.initiator.linuxrbd.rbd')
@mock.patch('os_brick.initiator.linuxrbd.rados')
def test_with_client(self, mock_rados, mock_rbd):
with linuxrbd.RBDClient('test_user', 'test_pool') as client:
# Verify object attributes are assigned as expected
self.assertEqual('/etc/ceph/ceph.conf', client.rbd_conf)
self.assertEqual(encodeutils.safe_encode('test_user'),
client.rbd_user)
self.assertEqual(encodeutils.safe_encode('test_pool'),
client.rbd_pool)
# Assert connect is called with correct paramaters
mock_rados.Rados.assert_called_once_with(
rados_id=encodeutils.safe_encode('test_user'),
conffile='/etc/ceph/ceph.conf')
# Ensure correct calls to connect to cluster
self.assertEqual(
1, mock_rados.Rados.return_value.connect.call_count)
mock_rados.Rados.return_value.open_ioctx.assert_called_once_with(
encodeutils.safe_encode('test_pool'))
self.assertEqual(1, mock_rados.Rados.return_value.shutdown.call_count)
class RBDVolumeIOWrapperTestCase(base.TestCase):