diff --git a/nova/tests/unit/virt/libvirt/storage/test_rbd.py b/nova/tests/unit/virt/libvirt/storage/test_rbd.py index 9e940876cc..1ebc50abb8 100644 --- a/nova/tests/unit/virt/libvirt/storage/test_rbd.py +++ b/nova/tests/unit/virt/libvirt/storage/test_rbd.py @@ -96,7 +96,7 @@ class RbdTestCase(test.NoDBTestCase): 'rbd://fsid/pool/image/', 'rbd://fsid/pool/image/snap/', 'rbd://///', ] - image_meta = objects.ImageMeta.from_dict({'disk_format': 'raw'}) + image_meta = {'disk_format': 'raw'} for loc in locations: self.assertRaises(exception.ImageUnacceptable, @@ -110,7 +110,7 @@ class RbdTestCase(test.NoDBTestCase): def test_cloneable(self, mock_rados, mock_rbd, mock_get_fsid): mock_get_fsid.return_value = 'abc' location = {'url': 'rbd://abc/pool/image/snap'} - image_meta = objects.ImageMeta.from_dict({'disk_format': 'raw'}) + image_meta = {'disk_format': 'raw'} self.assertTrue(self.driver.is_cloneable(location, image_meta)) self.assertTrue(mock_get_fsid.called) @@ -118,7 +118,7 @@ class RbdTestCase(test.NoDBTestCase): def test_uncloneable_different_fsid(self, mock_get_fsid): mock_get_fsid.return_value = 'abc' location = {'url': 'rbd://def/pool/image/snap'} - image_meta = objects.ImageMeta.from_dict({'disk_format': 'raw'}) + image_meta = {'disk_format': 'raw'} self.assertFalse( self.driver.is_cloneable(location, image_meta)) self.assertTrue(mock_get_fsid.called) @@ -133,7 +133,7 @@ class RbdTestCase(test.NoDBTestCase): location = {'url': 'rbd://abc/pool/image/snap'} mock_proxy.side_effect = mock_rbd.Error - image_meta = objects.ImageMeta.from_dict({'disk_format': 'raw'}) + image_meta = {'disk_format': 'raw'} self.assertFalse( self.driver.is_cloneable(location, image_meta)) @@ -147,11 +147,20 @@ class RbdTestCase(test.NoDBTestCase): location = {'url': 'rbd://abc/pool/image/snap'} formats = ['qcow2', 'vmdk', 'vdi'] for f in formats: - image_meta = objects.ImageMeta.from_dict({'disk_format': f}) + image_meta = {'disk_format': f} self.assertFalse( self.driver.is_cloneable(location, image_meta)) self.assertTrue(mock_get_fsid.called) + @mock.patch.object(rbd_utils.RBDDriver, '_get_fsid') + def test_uncloneable_missing_format(self, mock_get_fsid): + mock_get_fsid.return_value = 'abc' + location = {'url': 'rbd://abc/pool/image/snap'} + image_meta = {} + self.assertFalse( + self.driver.is_cloneable(location, image_meta)) + self.assertTrue(mock_get_fsid.called) + @mock.patch.object(utils, 'execute') def test_get_mon_addrs(self, mock_execute): mock_execute.return_value = (CEPH_MON_DUMP, '') diff --git a/nova/virt/libvirt/storage/rbd_utils.py b/nova/virt/libvirt/storage/rbd_utils.py index ca5c71dab7..8564181100 100644 --- a/nova/virt/libvirt/storage/rbd_utils.py +++ b/nova/virt/libvirt/storage/rbd_utils.py @@ -190,10 +190,10 @@ class RBDDriver(object): LOG.debug(reason) return False - if image_meta.disk_format != 'raw': + if image_meta.get('disk_format') != 'raw': reason = ("rbd image clone requires image format to be " "'raw' but image {0} is '{1}'").format( - url, image_meta.disk_format) + url, image_meta.get('disk_format')) LOG.debug(reason) return False