rbd: Move rbd_utils out of libvirt driver under nova.storage

This module will be used within nova.image.glance as part of the
nova-image-download-via-rbd blueprint. As this can technically be used
by multiple virt drivers it's time to break rbd_utils out from the
libvirt driver into a more generic place in the codebase.

Change-Id: I25baf5edd25d9e551686b7ed317a63fd778be533
This commit is contained in:
Lee Yarwood 2020-08-19 11:51:59 +01:00
parent d09fade87e
commit 9285428a16
8 changed files with 16 additions and 16 deletions

0
nova/storage/__init__.py Normal file
View File

View File

@ -34,13 +34,14 @@ from oslo_utils import excutils
import nova.conf import nova.conf
from nova import exception from nova import exception
from nova.i18n import _ from nova.i18n import _
from nova.virt.libvirt import utils as libvirt_utils
CONF = nova.conf.CONF CONF = nova.conf.CONF
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
RESIZE_SNAPSHOT_NAME = 'nova-resize'
class RbdProxy(object): class RbdProxy(object):
"""A wrapper around rbd.RBD class instance to avoid blocking of process. """A wrapper around rbd.RBD class instance to avoid blocking of process.
@ -342,7 +343,7 @@ class RBDDriver(object):
RbdProxy().remove(ioctx, volume) RbdProxy().remove(ioctx, volume)
raise loopingcall.LoopingCallDone(retvalue=False) raise loopingcall.LoopingCallDone(retvalue=False)
except rbd.ImageHasSnapshots: except rbd.ImageHasSnapshots:
self.remove_snap(volume, libvirt_utils.RESIZE_SNAPSHOT_NAME, self.remove_snap(volume, RESIZE_SNAPSHOT_NAME,
ignore_errors=True) ignore_errors=True)
except (rbd.ImageBusy, rbd.ImageHasSnapshots): except (rbd.ImageBusy, rbd.ImageHasSnapshots):
LOG.warning('rbd remove %(volume)s in pool %(pool)s failed', LOG.warning('rbd remove %(volume)s in pool %(pool)s failed',

View File

@ -220,7 +220,7 @@ class _RbdTest(object):
# We never want to actually touch rbd # We never want to actually touch rbd
self.mock_rbd_driver = self.useFixture(fixtures.MockPatch( self.mock_rbd_driver = self.useFixture(fixtures.MockPatch(
'nova.virt.libvirt.storage.rbd_utils.RBDDriver')).mock.return_value 'nova.storage.rbd_utils.RBDDriver')).mock.return_value
self.mock_rbd_driver.get_mon_addrs.return_value = ([], []) self.mock_rbd_driver.get_mon_addrs.return_value = ([], [])
self.mock_rbd_driver.size.return_value = 10 * units.Gi self.mock_rbd_driver.size.return_value = 10 * units.Gi
self.mock_rbd_driver.rbd_user = 'rbd' self.mock_rbd_driver.rbd_user = 'rbd'

View File

@ -19,9 +19,8 @@ from oslo_utils.fixture import uuidsentinel as uuids
from nova.compute import task_states from nova.compute import task_states
from nova import exception from nova import exception
from nova import objects from nova import objects
from nova.storage import rbd_utils
from nova import test from nova import test
from nova.virt.libvirt.storage import rbd_utils
from nova.virt.libvirt import utils as libvirt_utils
CEPH_MON_DUMP = r"""dumped monmap epoch 1 CEPH_MON_DUMP = r"""dumped monmap epoch 1
@ -466,7 +465,7 @@ class RbdTestCase(test.NoDBTestCase):
proxy = mock_proxy.return_value proxy = mock_proxy.return_value
proxy.__enter__.return_value = proxy proxy.__enter__.return_value = proxy
proxy.list_snaps.return_value = [ proxy.list_snaps.return_value = [
{'name': libvirt_utils.RESIZE_SNAPSHOT_NAME}] {'name': rbd_utils.RESIZE_SNAPSHOT_NAME}]
client = mock_client.return_value client = mock_client.return_value
self.driver.cleanup_volumes(filter_fn) self.driver.cleanup_volumes(filter_fn)
@ -474,7 +473,7 @@ class RbdTestCase(test.NoDBTestCase):
'%s_test' % uuids.instance) '%s_test' % uuids.instance)
rbd.remove.assert_has_calls([remove_call, remove_call]) rbd.remove.assert_has_calls([remove_call, remove_call])
proxy.remove_snap.assert_called_once_with( proxy.remove_snap.assert_called_once_with(
libvirt_utils.RESIZE_SNAPSHOT_NAME) rbd_utils.RESIZE_SNAPSHOT_NAME)
client.__enter__.assert_called_once_with() client.__enter__.assert_called_once_with()
client.__exit__.assert_called_once_with(None, None, None) client.__exit__.assert_called_once_with(None, None, None)

View File

@ -84,6 +84,7 @@ from nova.pci import manager as pci_manager
from nova.pci import utils as pci_utils from nova.pci import utils as pci_utils
import nova.privsep.fs import nova.privsep.fs
import nova.privsep.libvirt import nova.privsep.libvirt
from nova.storage import rbd_utils
from nova import test from nova import test
from nova.tests import fixtures as nova_fixtures from nova.tests import fixtures as nova_fixtures
from nova.tests.unit import fake_block_device from nova.tests.unit import fake_block_device
@ -118,7 +119,6 @@ from nova.virt.libvirt import imagecache
from nova.virt.libvirt import migration as libvirt_migrate from nova.virt.libvirt import migration as libvirt_migrate
from nova.virt.libvirt.storage import dmcrypt from nova.virt.libvirt.storage import dmcrypt
from nova.virt.libvirt.storage import lvm from nova.virt.libvirt.storage import lvm
from nova.virt.libvirt.storage import rbd_utils
from nova.virt.libvirt import utils as libvirt_utils from nova.virt.libvirt import utils as libvirt_utils
from nova.virt.libvirt import vif as libvirt_vif from nova.virt.libvirt import vif as libvirt_vif
from nova.virt.libvirt.volume import fs as fs_drivers from nova.virt.libvirt.volume import fs as fs_drivers
@ -22810,7 +22810,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
self.assertFalse(mock_inject.called) self.assertFalse(mock_inject.called)
@mock.patch('nova.virt.libvirt.utils.fetch_image') @mock.patch('nova.virt.libvirt.utils.fetch_image')
@mock.patch('nova.virt.libvirt.storage.rbd_utils.RBDDriver') @mock.patch('nova.storage.rbd_utils.RBDDriver')
@mock.patch.object(imagebackend, 'IMAGE_API') @mock.patch.object(imagebackend, 'IMAGE_API')
def test_create_fetch_image_ceph_workaround(self, mock_image, mock_rbd, def test_create_fetch_image_ceph_workaround(self, mock_image, mock_rbd,
mock_fetch): mock_fetch):

View File

@ -35,6 +35,7 @@ import nova.conf
from nova import context from nova import context
from nova import exception from nova import exception
from nova import objects from nova import objects
from nova.storage import rbd_utils
from nova import test from nova import test
from nova.tests.unit import fake_processutils from nova.tests.unit import fake_processutils
from nova import utils from nova import utils
@ -42,7 +43,6 @@ from nova.virt.image import model as imgmodel
from nova.virt import images from nova.virt import images
from nova.virt.libvirt import config as vconfig from nova.virt.libvirt import config as vconfig
from nova.virt.libvirt import imagebackend from nova.virt.libvirt import imagebackend
from nova.virt.libvirt.storage import rbd_utils
from nova.virt.libvirt import utils as libvirt_utils from nova.virt.libvirt import utils as libvirt_utils
CONF = nova.conf.CONF CONF = nova.conf.CONF
@ -1894,7 +1894,7 @@ class RbdTestCase(_ImageTestCase, test.NoDBTestCase):
mock_imgapi.copy_image_to_store.assert_called_once_with( mock_imgapi.copy_image_to_store.assert_called_once_with(
self.CONTEXT, 'foo', 'store') self.CONTEXT, 'foo', 'store')
@mock.patch('nova.virt.libvirt.storage.rbd_utils.RBDDriver') @mock.patch('nova.storage.rbd_utils.RBDDriver')
@mock.patch('nova.virt.libvirt.imagebackend.IMAGE_API') @mock.patch('nova.virt.libvirt.imagebackend.IMAGE_API')
def test_clone_copy_to_store(self, mock_imgapi, mock_driver_): def test_clone_copy_to_store(self, mock_imgapi, mock_driver_):
# Call image.clone() in a way that will cause it to fall through # Call image.clone() in a way that will cause it to fall through
@ -1921,7 +1921,7 @@ class RbdTestCase(_ImageTestCase, test.NoDBTestCase):
# recursed after the copy-to-store operation # recursed after the copy-to-store operation
mock.call('fake', fake_image)]) mock.call('fake', fake_image)])
@mock.patch('nova.virt.libvirt.storage.rbd_utils.RBDDriver') @mock.patch('nova.storage.rbd_utils.RBDDriver')
@mock.patch('nova.virt.libvirt.imagebackend.IMAGE_API') @mock.patch('nova.virt.libvirt.imagebackend.IMAGE_API')
def test_clone_copy_to_store_failed(self, mock_imgapi, mock_driver_): def test_clone_copy_to_store_failed(self, mock_imgapi, mock_driver_):
# Call image.clone() in a way that will cause it to fall through # Call image.clone() in a way that will cause it to fall through
@ -1950,7 +1950,7 @@ class RbdTestCase(_ImageTestCase, test.NoDBTestCase):
# recursed after the copy-to-store operation # recursed after the copy-to-store operation
mock.call('fake', fake_image)]) mock.call('fake', fake_image)])
@mock.patch('nova.virt.libvirt.storage.rbd_utils.RBDDriver') @mock.patch('nova.storage.rbd_utils.RBDDriver')
@mock.patch('nova.virt.libvirt.imagebackend.IMAGE_API') @mock.patch('nova.virt.libvirt.imagebackend.IMAGE_API')
def test_clone_without_needed_copy(self, mock_imgapi, mock_driver_): def test_clone_without_needed_copy(self, mock_imgapi, mock_driver_):
# Call image.clone() in a way that will cause it to pass the locations # Call image.clone() in a way that will cause it to pass the locations
@ -1971,7 +1971,7 @@ class RbdTestCase(_ImageTestCase, test.NoDBTestCase):
mock_copy.assert_not_called() mock_copy.assert_not_called()
mock_driver.is_cloneable.assert_called_once_with('fake', fake_image) mock_driver.is_cloneable.assert_called_once_with('fake', fake_image)
@mock.patch('nova.virt.libvirt.storage.rbd_utils.RBDDriver') @mock.patch('nova.storage.rbd_utils.RBDDriver')
@mock.patch('nova.virt.libvirt.imagebackend.IMAGE_API') @mock.patch('nova.virt.libvirt.imagebackend.IMAGE_API')
def test_clone_copy_not_configured(self, mock_imgapi, mock_driver_): def test_clone_copy_not_configured(self, mock_imgapi, mock_driver_):
# Call image.clone() in a way that will cause it to fail the locations # Call image.clone() in a way that will cause it to fail the locations

View File

@ -100,6 +100,7 @@ from nova.pci import utils as pci_utils
import nova.privsep.libvirt import nova.privsep.libvirt
import nova.privsep.path import nova.privsep.path
import nova.privsep.utils import nova.privsep.utils
from nova.storage import rbd_utils
from nova import utils from nova import utils
from nova import version from nova import version
from nova.virt import arch from nova.virt import arch
@ -122,7 +123,6 @@ from nova.virt.libvirt import instancejobtracker
from nova.virt.libvirt import migration as libvirt_migrate from nova.virt.libvirt import migration as libvirt_migrate
from nova.virt.libvirt.storage import dmcrypt from nova.virt.libvirt.storage import dmcrypt
from nova.virt.libvirt.storage import lvm from nova.virt.libvirt.storage import lvm
from nova.virt.libvirt.storage import rbd_utils
from nova.virt.libvirt import utils as libvirt_utils from nova.virt.libvirt import utils as libvirt_utils
from nova.virt.libvirt import vif as libvirt_vif from nova.virt.libvirt import vif as libvirt_vif
from nova.virt.libvirt.volume import fs from nova.virt.libvirt.volume import fs

View File

@ -38,6 +38,7 @@ from nova.i18n import _
from nova.image import glance from nova.image import glance
import nova.privsep.libvirt import nova.privsep.libvirt
import nova.privsep.path import nova.privsep.path
from nova.storage import rbd_utils
from nova import utils from nova import utils
from nova.virt.disk import api as disk from nova.virt.disk import api as disk
from nova.virt.image import model as imgmodel from nova.virt.image import model as imgmodel
@ -45,7 +46,6 @@ from nova.virt import images
from nova.virt.libvirt import config as vconfig from nova.virt.libvirt import config as vconfig
from nova.virt.libvirt.storage import dmcrypt from nova.virt.libvirt.storage import dmcrypt
from nova.virt.libvirt.storage import lvm from nova.virt.libvirt.storage import lvm
from nova.virt.libvirt.storage import rbd_utils
from nova.virt.libvirt import utils as libvirt_utils from nova.virt.libvirt import utils as libvirt_utils
CONF = nova.conf.CONF CONF = nova.conf.CONF