diff options
author | Matt Riedemann <mriedem@us.ibm.com> | 2015-07-17 16:37:36 -0700 |
---|---|---|
committer | Matt Riedemann <mriedem@us.ibm.com> | 2015-07-17 17:42:01 -0700 |
commit | cd04b9217f4581f9d1d6840bc6c3c4c916b330e8 (patch) | |
tree | 5c8521dfebc4f8e2d9097ac251859f1fc92cfd17 | |
parent | f5e7ce0d8d656126d1a41c92d8924c9c72e65d81 (diff) | |
download | glance_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.py | 2 | ||||
-rw-r--r-- | glance_store/tests/unit/test_rbd_store.py | 22 |
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) |