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()
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)
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."""
'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)
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,
size,
order,
old_format=False,
- features=features)
+ features=client.features)
def _flatten(self, pool, volume_name):
LOG.debug('flattening %(pool)s/%(img)s' %
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)