From: Jon Bernard Date: Tue, 24 Feb 2015 21:16:26 +0000 (-0500) Subject: RBD: Query volume features from ceph.conf X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=6211d8fa2033c2a607c20667110c5913cf60dd53;p=openstack-build%2Fcinder-build.git 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 --- diff --git a/cinder/tests/test_rbd.py b/cinder/tests/test_rbd.py index e3aee6b1c..d59ea08eb 100644 --- a/cinder/tests/test_rbd.py +++ b/cinder/tests/test_rbd.py @@ -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) diff --git a/cinder/volume/drivers/rbd.py b/cinder/volume/drivers/rbd.py index 108165a02..55a626b74 100644 --- a/cinder/volume/drivers/rbd.py +++ b/cinder/volume/drivers/rbd.py @@ -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)