summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Riedemann <mriedem@us.ibm.com>2015-07-17 16:37:36 -0700
committerMatt Riedemann <mriedem@us.ibm.com>2015-07-17 17:42:01 -0700
commitcd04b9217f4581f9d1d6840bc6c3c4c916b330e8 (patch)
tree5c8521dfebc4f8e2d9097ac251859f1fc92cfd17
parentf5e7ce0d8d656126d1a41c92d8924c9c72e65d81 (diff)
downloadglance_store-cd04b9217f4581f9d1d6840bc6c3c4c916b330e8.tar.gz
rbd: make sure features is an int when passed to librbd.create0.7.1
Commit 99de02ee1c6c8e73eb81b440fac26bb64dfdaa2f reads the features value from ceph.conf and rados.Rados.conf_get returns a str but librbd.create expects an int, so if there is a feature defined in ceph.conf we don't cast it to int and fail to create the image with a TypeError coming from librbd.create. Closes-Bug: #1475811 Change-Id: I120451c4ab4ecb989d2cd031f260fdcc73d1ff3f
-rw-r--r--glance_store/_drivers/rbd.py2
-rw-r--r--glance_store/tests/unit/test_rbd_store.py22
2 files changed, 23 insertions, 1 deletions
diff --git a/glance_store/_drivers/rbd.py b/glance_store/_drivers/rbd.py
index e651d46..e48cf47 100644
--- a/glance_store/_drivers/rbd.py
+++ b/glance_store/_drivers/rbd.py
@@ -268,7 +268,7 @@ class Store(driver.Store):
if ((features is None) or (int(features) == 0)):
features = rbd.RBD_FEATURE_LAYERING
librbd.create(ioctx, image_name, size, order, old_format=False,
- features=features)
+ features=int(features))
return StoreLocation({
'fsid': fsid,
'pool': self.pool,
diff --git a/glance_store/tests/unit/test_rbd_store.py b/glance_store/tests/unit/test_rbd_store.py
index 365e4ec..9c17939 100644
--- a/glance_store/tests/unit/test_rbd_store.py
+++ b/glance_store/tests/unit/test_rbd_store.py
@@ -299,6 +299,28 @@ class TestStore(base.StoreBaseTest,
self.assertRaises(exceptions.StoreRandomGetNotSupported,
self.store.get, loc, chunk_size=1)
+ def test_create_image_conf_features(self):
+ # Tests that we use non-0 features from ceph.conf and cast to int.
+ fsid = 'fake'
+ features = '3'
+ conf_get_mock = mock.Mock(return_value=features)
+ conn = mock.Mock(conf_get=conf_get_mock)
+ ioctxt = mock.sentinel.ioctxt
+ name = '1'
+ size = 1024
+ order = 3
+ with mock.patch.object(rbd_store.rbd.RBD, 'create') as create_mock:
+ location = self.store._create_image(
+ fsid, conn, ioctxt, name, size, order)
+ self.assertEqual(fsid, location.specs['fsid'])
+ self.assertEqual(rbd_store.DEFAULT_POOL, location.specs['pool'])
+ self.assertEqual(name, location.specs['image'])
+ self.assertEqual(rbd_store.DEFAULT_SNAPNAME,
+ location.specs['snapshot'])
+
+ create_mock.assert_called_once_with(ioctxt, name, size, order,
+ old_format=False, features=3)
+
def tearDown(self):
self.assertEqual(self.called_commands_actual,
self.called_commands_expected)