Merge "libvirt: sync time on resumed from suspend instances"

This commit is contained in:
Jenkins 2016-11-03 22:34:22 +00:00 committed by Gerrit Code Review
commit 734fabf295
4 changed files with 29 additions and 9 deletions

View File

@ -11630,9 +11630,12 @@ class LibvirtConnTestCase(test.NoDBTestCase):
return_value='fake_pci_devs'),
mock.patch.object(utils, 'get_image_from_system_metadata'),
mock.patch.object(blockinfo, 'get_disk_info'),
mock.patch.object(guest, 'sync_guest_time'),
mock.patch.object(drvr, '_wait_for_running',
side_effect=loopingcall.LoopingCallDone()),
) as (_get_existing_domain_xml, _create_domain_and_network,
_attach_pci_devices, get_instance_pci_devs, get_image_metadata,
get_disk_info):
get_disk_info, mock_sync_time, mock_wait):
get_image_metadata.return_value = {'bar': 234}
disk_info = {'foo': 123}
@ -11647,6 +11650,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
instance, network_info, disk_info,
block_device_info=block_device_info,
vifs_already_plugged=True)])
self.assertTrue(mock_sync_time.called)
_attach_pci_devices.assert_has_calls([mock.call(guest,
'fake_pci_devs')])
@ -15616,6 +15620,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase):
self.fake_create_domain_called = True
self.assertEqual(powered_on, power_on)
self.assertTrue(vifs_already_plugged)
return libvirt_guest.Guest('fake_dom')
def fake_enable_hairpin():
pass
@ -15691,10 +15696,16 @@ class LibvirtDriverTestCase(test.NoDBTestCase):
resize_instance, self.fake_disk_resize_called)
def test_finish_migration_resize(self):
self._test_finish_migration(True, resize_instance=True)
with mock.patch('nova.virt.libvirt.guest.Guest.sync_guest_time'
) as mock_guest_time:
self._test_finish_migration(True, resize_instance=True)
self.assertTrue(mock_guest_time.called)
def test_finish_migration_power_on(self):
self._test_finish_migration(True)
with mock.patch('nova.virt.libvirt.guest.Guest.sync_guest_time'
) as mock_guest_time:
self._test_finish_migration(True)
self.assertTrue(mock_guest_time.called)
def test_finish_migration_power_off(self):
self._test_finish_migration(False)

View File

@ -139,7 +139,7 @@ class GuestTestCase(test.NoDBTestCase):
@mock.patch('time.time', return_value=1234567890.125)
def test_time_sync_no_errors(self, time_mock):
self.domain.setTime.side_effect = fakelibvirt.libvirtError('error')
self.guest.resume()
self.guest.sync_guest_time()
self.domain.setTime.assert_called_once_with(time={
'nseconds': 125000000,
'seconds': 1234567890})

View File

@ -2345,7 +2345,9 @@ class LibvirtDriver(driver.ComputeDriver):
def unpause(self, instance):
"""Unpause paused VM instance."""
self._host.get_guest(instance).resume()
guest = self._host.get_guest(instance)
guest.resume()
guest.sync_guest_time()
def _clean_shutdown(self, instance, timeout, retry_interval):
"""Attempt to shutdown the instance gracefully.
@ -2478,6 +2480,10 @@ class LibvirtDriver(driver.ComputeDriver):
self._attach_pci_devices(guest,
pci_manager.get_instance_pci_devs(instance))
self._attach_sriov_ports(context, instance, guest, network_info)
timer = loopingcall.FixedIntervalLoopingCall(self._wait_for_running,
instance)
timer.start(interval=0.5).wait()
guest.sync_guest_time()
def resume_state_on_host_boot(self, context, instance, network_info,
block_device_info=None):
@ -7277,7 +7283,8 @@ class LibvirtDriver(driver.ComputeDriver):
# and the status change in the port might go undetected by the neutron
# L2 agent (or neutron server) so neutron may not know that the VIF was
# unplugged in the first place and never send an event.
self._create_domain_and_network(context, xml, instance, network_info,
guest = self._create_domain_and_network(context, xml, instance,
network_info,
block_disk_info,
block_device_info=block_device_info,
power_on=power_on,
@ -7289,6 +7296,9 @@ class LibvirtDriver(driver.ComputeDriver):
instance)
timer.start(interval=0.5).wait()
# Sync guest time after migration.
guest.sync_guest_time()
LOG.debug("finish_migration finished successfully.", instance=instance)
def _cleanup_failed_migration(self, inst_base):

View File

@ -145,7 +145,7 @@ class Guest(object):
"""Stops a running guest."""
self._domain.destroy()
def _sync_guest_time(self):
def sync_guest_time(self):
"""Try to set VM time to the current value. This is typically useful
when clock wasn't running on the VM for some time (e.g. during
suspension or migration), especially if the time delay exceeds NTP
@ -190,9 +190,8 @@ class Guest(object):
self._domain.injectNMI()
def resume(self):
"""Resumes a suspended guest."""
"""Resumes a paused guest."""
self._domain.resume()
self._sync_guest_time()
def enable_hairpin(self):
"""Enables hairpin mode for this guest."""