]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
RBD: Query volume features from ceph.conf
authorJon Bernard <jobernar@redhat.com>
Tue, 24 Feb 2015 21:16:26 +0000 (16:16 -0500)
committerJon Bernard <jobernar@redhat.com>
Fri, 27 Feb 2015 21:35:35 +0000 (16:35 -0500)
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

cinder/tests/test_rbd.py
cinder/volume/drivers/rbd.py

index e3aee6b1c3bbaa41afcc8b7bc8cff39e52d29656..d59ea08eb182e18fbe74a421e5c6613276334d01 100644 (file)
@@ -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)
index 108165a02cf89d3f466c362d25fe5c979d3dd6fb..55a626b746cd6ef9aba387fc9e6ea42764aefab5 100644 (file)
@@ -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)