RBD: Query volume features from ceph.conf
This patch enabled RADOSClient to query the local ceph.conf for rbd features configuration, falling back to layering if nothing is found. This allows users to disable default features or to opt in to upcoming features that have not yet become default. Change-Id: I758e028abd703942ceb1c5b63c4b734817bc5df3
This commit is contained in:
@@ -167,7 +167,7 @@ class RBDTestCase(test.TestCase):
|
||||
args = [client.ioctx, str(self.volume_name),
|
||||
self.volume_size * units.Gi, order]
|
||||
kwargs = {'old_format': False,
|
||||
'features': self.mock_rbd.RBD_FEATURE_LAYERING}
|
||||
'features': client.features}
|
||||
self.mock_rbd.RBD.return_value.create.assert_called_once_with(
|
||||
*args, **kwargs)
|
||||
client.__enter__.assert_called_once_with()
|
||||
@@ -762,7 +762,7 @@ class RBDTestCase(test.TestCase):
|
||||
|
||||
args = [client_stack[0].ioctx, str(src_image), str(src_snap),
|
||||
client_stack[1].ioctx, str(self.volume_name)]
|
||||
kwargs = {'features': self.mock_rbd.RBD_FEATURE_LAYERING}
|
||||
kwargs = {'features': client.features}
|
||||
self.mock_rbd.RBD.return_value.clone.assert_called_once_with(
|
||||
*args, **kwargs)
|
||||
self.assertEqual(client.__enter__.call_count, 2)
|
||||
|
||||
@@ -247,6 +247,13 @@ class RADOSClient(object):
|
||||
def __exit__(self, type_, value, traceback):
|
||||
self.driver._disconnect_from_rados(self.cluster, self.ioctx)
|
||||
|
||||
@property
|
||||
def features(self):
|
||||
features = self.cluster.conf_get('rbd_default_features')
|
||||
if ((features is None) or (int(features) == 0)):
|
||||
features = self.driver.rbd.RBD_FEATURE_LAYERING
|
||||
return int(features)
|
||||
|
||||
|
||||
class RBDDriver(driver.VolumeDriver):
|
||||
"""Implements RADOS block device (RBD) volume commands."""
|
||||
@@ -471,7 +478,7 @@ class RBDDriver(driver.VolumeDriver):
|
||||
'dest': dest_name})
|
||||
self.rbd.RBD().clone(client.ioctx, src_name, clone_snap,
|
||||
client.ioctx, dest_name,
|
||||
features=self.rbd.RBD_FEATURE_LAYERING)
|
||||
features=client.features)
|
||||
except Exception as exc:
|
||||
src_volume.unprotect_snap(clone_snap)
|
||||
src_volume.remove_snap(clone_snap)
|
||||
@@ -496,7 +503,6 @@ class RBDDriver(driver.VolumeDriver):
|
||||
|
||||
chunk_size = CONF.rbd_store_chunk_size * units.Mi
|
||||
order = int(math.log(chunk_size, 2))
|
||||
features = self.rbd.RBD_FEATURE_LAYERING
|
||||
|
||||
with RADOSClient(self) as client:
|
||||
self.rbd.RBD().create(client.ioctx,
|
||||
@@ -504,7 +510,7 @@ class RBDDriver(driver.VolumeDriver):
|
||||
size,
|
||||
order,
|
||||
old_format=False,
|
||||
features=features)
|
||||
features=client.features)
|
||||
|
||||
def _flatten(self, pool, volume_name):
|
||||
LOG.debug('flattening %(pool)s/%(img)s' %
|
||||
@@ -523,7 +529,7 @@ class RBDDriver(driver.VolumeDriver):
|
||||
encodeutils.safe_encode(src_snap),
|
||||
dest_client.ioctx,
|
||||
encodeutils.safe_encode(volume['name']),
|
||||
features=self.rbd.RBD_FEATURE_LAYERING)
|
||||
features=src_client.features)
|
||||
|
||||
def _resize(self, volume, **kwargs):
|
||||
size = kwargs.get('size', None)
|
||||
|
||||
Reference in New Issue
Block a user