Merge "libvirt: Re-initialise volumes, encryptors, and vifs on hard reboot"
This commit is contained in:
commit
81544829d1
@ -12103,16 +12103,15 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||
mock_hard_reboot.assert_called_once_with(self.context,
|
||||
instance, [], None)
|
||||
|
||||
@mock.patch('nova.virt.libvirt.LibvirtDriver._undefine_domain')
|
||||
@mock.patch('nova.virt.libvirt.LibvirtDriver.get_info')
|
||||
@mock.patch('nova.virt.libvirt.LibvirtDriver._create_domain_and_network')
|
||||
@mock.patch('nova.virt.libvirt.LibvirtDriver._get_guest_xml')
|
||||
@mock.patch('nova.virt.libvirt.LibvirtDriver.'
|
||||
'_get_instance_disk_info_from_config')
|
||||
@mock.patch('nova.virt.libvirt.LibvirtDriver._destroy')
|
||||
@mock.patch('nova.virt.libvirt.LibvirtDriver.destroy')
|
||||
def test_hard_reboot(self, mock_destroy, mock_get_disk_info,
|
||||
mock_get_guest_xml, mock_create_domain_and_network,
|
||||
mock_get_info, mock_undefine):
|
||||
mock_get_info):
|
||||
self.context.auth_token = True # any non-None value will suffice
|
||||
instance = objects.Instance(**self.test_instance)
|
||||
network_info = _fake_network_info(self, 1)
|
||||
@ -12160,13 +12159,13 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||
for name in ('disk', 'disk.local'):
|
||||
self.assertTrue(disks[name].cache.called)
|
||||
|
||||
mock_destroy.assert_called_once_with(instance)
|
||||
mock_undefine.assert_called_once_with(instance)
|
||||
mock_destroy.assert_called_once_with(self.context, instance,
|
||||
network_info, destroy_disks=False,
|
||||
block_device_info=block_device_info)
|
||||
|
||||
mock_create_domain_and_network.assert_called_once_with(self.context,
|
||||
dummyxml, instance, network_info,
|
||||
block_device_info=block_device_info,
|
||||
reboot=True, vifs_already_plugged=True)
|
||||
block_device_info=block_device_info)
|
||||
|
||||
@mock.patch('oslo_utils.fileutils.ensure_tree')
|
||||
@mock.patch('oslo_service.loopingcall.FixedIntervalLoopingCall')
|
||||
|
@ -2501,12 +2501,15 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||
re-creates the domain to ensure the reboot happens, as the guest
|
||||
OS cannot ignore this action.
|
||||
"""
|
||||
|
||||
self._destroy(instance)
|
||||
# Domain XML will be redefined so we can safely undefine it
|
||||
# from libvirt. This ensure that such process as create serial
|
||||
# console for guest will run smoothly.
|
||||
self._undefine_domain(instance)
|
||||
# NOTE(mdbooth): In addition to performing a hard reboot of the domain,
|
||||
# the hard reboot operation is relied upon by operators to be an
|
||||
# automated attempt to fix as many things as possible about a
|
||||
# non-functioning instance before resorting to manual intervention.
|
||||
# With this goal in mind, we tear down all the aspects of an instance
|
||||
# we can here without losing data. This allows us to re-initialise from
|
||||
# scratch, and hopefully fix, most aspects of a non-functioning guest.
|
||||
self.destroy(context, instance, network_info, destroy_disks=False,
|
||||
block_device_info=block_device_info)
|
||||
|
||||
# Convert the system metadata to image metadata
|
||||
# NOTE(mdbooth): This is a workaround for stateless Nova compute
|
||||
@ -2542,9 +2545,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||
# Initialize all the necessary networking, block devices and
|
||||
# start the instance.
|
||||
self._create_domain_and_network(context, xml, instance, network_info,
|
||||
block_device_info=block_device_info,
|
||||
reboot=True,
|
||||
vifs_already_plugged=True)
|
||||
block_device_info=block_device_info)
|
||||
self._prepare_pci_devices_for_use(
|
||||
pci_manager.get_instance_pci_devs(instance, 'all'))
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user