Merge "Pass block_device_info when delete an encrypted lvm"
This commit is contained in:
commit
6484b01a5b
|
@ -92,6 +92,7 @@ from nova.virt.libvirt import firewall
|
|||
from nova.virt.libvirt import guest as libvirt_guest
|
||||
from nova.virt.libvirt import host
|
||||
from nova.virt.libvirt import imagebackend
|
||||
from nova.virt.libvirt.storage import dmcrypt
|
||||
from nova.virt.libvirt.storage import lvm
|
||||
from nova.virt.libvirt.storage import rbd_utils
|
||||
from nova.virt.libvirt import utils as libvirt_utils
|
||||
|
@ -13876,6 +13877,85 @@ class LibvirtDriverTestCase(test.NoDBTestCase):
|
|||
self.assertEqual(cpumodel.MODE_HOST_MODEL, vcpu_model.mode)
|
||||
self.assertEqual(vcpu_model, vcpu_model_1)
|
||||
|
||||
@mock.patch.object(lvm, 'get_volume_size', return_value=10)
|
||||
@mock.patch.object(host.Host, "get_guest")
|
||||
@mock.patch.object(dmcrypt, 'delete_volume')
|
||||
@mock.patch('nova.virt.libvirt.driver.LibvirtDriver.unfilter_instance')
|
||||
@mock.patch('nova.virt.libvirt.driver.LibvirtDriver._undefine_domain')
|
||||
@mock.patch.object(objects.Instance, 'save')
|
||||
def test_cleanup_lvm_encrypted(self, mock_save, mock_undefine_domain,
|
||||
mock_unfilter, mock_delete_volume,
|
||||
mock_get_guest, mock_get_size):
|
||||
drv = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
|
||||
instance = objects.Instance(uuid='fake-uuid', id=1,
|
||||
ephemeral_key_uuid='000-000-000')
|
||||
instance.system_metadata = {}
|
||||
block_device_info = {'root_device_name': '/dev/vda',
|
||||
'ephemerals': [],
|
||||
'block_device_mapping': []}
|
||||
self.flags(images_type="lvm",
|
||||
group='libvirt')
|
||||
dom_xml = """
|
||||
<domain type="kvm">
|
||||
<devices>
|
||||
<disk type="block">
|
||||
<driver name='qemu' type='raw' cache='none'/>
|
||||
<source dev="/dev/mapper/fake-dmcrypt"/>
|
||||
<target dev="vda" bus="virtio" serial="1234"/>
|
||||
</disk>
|
||||
</devices>
|
||||
</domain>
|
||||
"""
|
||||
dom = mock.MagicMock()
|
||||
dom.XMLDesc.return_value = dom_xml
|
||||
guest = libvirt_guest.Guest(dom)
|
||||
mock_get_guest.return_value = guest
|
||||
drv.cleanup(self.context, instance, 'fake_network', destroy_vifs=False,
|
||||
block_device_info=block_device_info)
|
||||
mock_delete_volume.assert_called_once_with('/dev/mapper/fake-dmcrypt')
|
||||
|
||||
@mock.patch.object(lvm, 'get_volume_size', return_value=10)
|
||||
@mock.patch.object(host.Host, "get_guest")
|
||||
@mock.patch.object(dmcrypt, 'delete_volume')
|
||||
def _test_cleanup_lvm(self, mock_delete_volume, mock_get_guest, mock_size,
|
||||
encrypted=False):
|
||||
|
||||
drv = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
|
||||
instance = objects.Instance(uuid='fake-uuid', id=1,
|
||||
ephemeral_key_uuid='000-000-000')
|
||||
block_device_info = {'root_device_name': '/dev/vda',
|
||||
'ephemerals': [],
|
||||
'block_device_mapping': []}
|
||||
dev_name = 'fake-dmcrypt' if encrypted else 'fake'
|
||||
dom_xml = """
|
||||
<domain type="kvm">
|
||||
<devices>
|
||||
<disk type="block">
|
||||
<driver name='qemu' type='raw' cache='none'/>
|
||||
<source dev="/dev/mapper/%s"/>
|
||||
<target dev="vda" bus="virtio" serial="1234"/>
|
||||
</disk>
|
||||
</devices>
|
||||
</domain>
|
||||
""" % dev_name
|
||||
dom = mock.MagicMock()
|
||||
dom.XMLDesc.return_value = dom_xml
|
||||
guest = libvirt_guest.Guest(dom)
|
||||
mock_get_guest.return_value = guest
|
||||
drv._cleanup_lvm(instance, block_device_info)
|
||||
|
||||
if encrypted:
|
||||
mock_delete_volume.assert_called_once_with(
|
||||
'/dev/mapper/fake-dmcrypt')
|
||||
else:
|
||||
self.assertFalse(mock_delete_volume.called)
|
||||
|
||||
def test_cleanup_lvm(self):
|
||||
self._test_cleanup_lvm()
|
||||
|
||||
def test_cleanup_encrypted_lvm(self):
|
||||
self._test_cleanup_lvm(encrypted=True)
|
||||
|
||||
def test_vcpu_model_to_config(self):
|
||||
drv = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
|
||||
|
||||
|
|
|
@ -914,7 +914,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||
if destroy_disks:
|
||||
# NOTE(haomai): destroy volumes if needed
|
||||
if CONF.libvirt.images_type == 'lvm':
|
||||
self._cleanup_lvm(instance)
|
||||
self._cleanup_lvm(instance, block_device_info)
|
||||
if CONF.libvirt.images_type == 'rbd':
|
||||
self._cleanup_rbd(instance)
|
||||
|
||||
|
@ -942,9 +942,10 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||
|
||||
self._undefine_domain(instance)
|
||||
|
||||
def _detach_encrypted_volumes(self, instance):
|
||||
def _detach_encrypted_volumes(self, instance, block_device_info):
|
||||
"""Detaches encrypted volumes attached to instance."""
|
||||
disks = jsonutils.loads(self.get_instance_disk_info(instance))
|
||||
disks = jsonutils.loads(self.get_instance_disk_info(instance,
|
||||
block_device_info))
|
||||
encrypted_volumes = filter(dmcrypt.is_encrypted,
|
||||
[disk['path'] for disk in disks])
|
||||
for path in encrypted_volumes:
|
||||
|
@ -980,10 +981,10 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||
def _cleanup_rbd(self, instance):
|
||||
LibvirtDriver._get_rbd_driver().cleanup_volumes(instance)
|
||||
|
||||
def _cleanup_lvm(self, instance):
|
||||
def _cleanup_lvm(self, instance, block_device_info):
|
||||
"""Delete all LVM disks for given instance object."""
|
||||
if instance.get('ephemeral_key_uuid') is not None:
|
||||
self._detach_encrypted_volumes(instance)
|
||||
self._detach_encrypted_volumes(instance, block_device_info)
|
||||
|
||||
disks = self._lvm_disks(instance)
|
||||
if disks:
|
||||
|
|
Loading…
Reference in New Issue