From 2ba8fd42901c49a698b8f85f6d8058ce606380d8 Mon Sep 17 00:00:00 2001 From: John Garbutt Date: Mon, 12 Sep 2016 13:50:36 +0100 Subject: [PATCH] Revert "libvirt: move graphic/serial consoles check to pre_live_migration" This reverts the key bits of commit 917afd2831be8107177f50f277e400e03f896f74. Change-Id: I0425b254595371eaa618b10d8c81520b0f6018a5 Related-Bug: #1615613 --- nova/tests/unit/virt/libvirt/test_driver.py | 67 +++++++++++++++------ nova/virt/libvirt/driver.py | 21 ++++--- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 2be20b1e6fe2..a005966fdd2c 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -6990,26 +6990,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): self.assertIn('is_shared_block_storage', ret) self.assertIn('is_shared_instance_path', ret) - @mock.patch.object(fakelibvirt, 'VIR_DOMAIN_XML_MIGRATABLE', None, - create=True) - def test_check_can_live_migrate_source_serial_fails(self): - self.flags(enabled=True, group="serial_console") - instance = objects.Instance(**self.test_instance) - drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) - self.assertRaises(exception.MigrationError, - drvr.check_can_live_migrate_source, - self.context, instance, {}) - - @mock.patch.object(fakelibvirt, 'VIR_DOMAIN_XML_MIGRATABLE', None, - create=True) - def test_check_can_live_migrate_source_graphics_fails(self): - self.flags(enabled=True, vncserver_listen='1.2.3.4', group='vnc') - instance = objects.Instance(**self.test_instance) - drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) - self.assertRaises(exception.MigrationError, - drvr.check_can_live_migrate_source, - self.context, instance, {}) - def test_check_can_live_migrate_source_shared_block_storage(self): instance, dest_check_data, drvr = self._mock_can_live_migrate_source( is_shared_block_storage=True) @@ -7808,6 +7788,24 @@ class LibvirtConnTestCase(test.NoDBTestCase): drvr._live_migration_uri('dest'), dxml=target_xml, flags=mock.ANY, bandwidth=bandwidth) + @mock.patch.object(fakelibvirt, 'VIR_DOMAIN_XML_MIGRATABLE', None, + create=True) + def test_live_migration_fails_with_serial_console_without_migratable(self): + self.compute = importutils.import_object(CONF.compute_manager) + instance_ref = self.test_instance + + CONF.set_override("enabled", True, "serial_console") + dom = fakelibvirt.virDomain + migrate_data = objects.LibvirtLiveMigrateData( + serial_listen_addr='', target_connect_addr=None, + block_migration=False) + + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) + self.assertRaises(exception.MigrationError, + drvr._live_migration_operation, + self.context, instance_ref, 'dest', + False, migrate_data, dom, []) + @mock.patch.object(fakelibvirt, 'VIR_DOMAIN_XML_MIGRATABLE', None, create=True) def test_live_migration_uses_migrateToURI_without_migratable_flag(self): @@ -7950,6 +7948,35 @@ class LibvirtConnTestCase(test.NoDBTestCase): drvr._live_migration_uri('dest'), params=params, flags=151) + @mock.patch.object(fakelibvirt, 'VIR_DOMAIN_XML_MIGRATABLE', None, + create=True) + def test_live_migration_fails_without_migratable_flag_or_0_addr(self): + self.flags(enabled=True, vncserver_listen='1.2.3.4', group='vnc') + self.compute = importutils.import_object(CONF.compute_manager) + instance_dict = dict(self.test_instance) + instance_dict.update({'host': 'fake', + 'power_state': power_state.RUNNING, + 'vm_state': vm_states.ACTIVE}) + instance_ref = objects.Instance(**instance_dict) + + # Preparing mocks + vdmock = self.mox.CreateMock(fakelibvirt.virDomain) + self.mox.StubOutWithMock(vdmock, "migrateToURI") + + # start test + migrate_data = objects.LibvirtLiveMigrateData( + graphics_listen_addr_vnc='1.2.3.4', + graphics_listen_addr_spice='1.2.3.4', + serial_listen_addr='127.0.0.1', + target_connect_addr=None, + block_migration=False) + self.mox.ReplayAll() + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) + self.assertRaises(exception.MigrationError, + drvr._live_migration_operation, + self.context, instance_ref, 'dest', + False, migrate_data, vdmock, []) + def test_live_migration_raises_exception(self): # Confirms recover method is called when exceptions are raised. # Preparing data diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 56c7a9417ed7..2299aeba86aa 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -5409,16 +5409,6 @@ class LibvirtDriver(driver.ComputeDriver): md_obj.from_legacy_dict(dest_check_data) dest_check_data = md_obj - listen_addrs = libvirt_migrate.graphics_listen_addrs( - dest_check_data) - migratable_flag = self._host.is_migratable_xml_flag() - if not migratable_flag or not listen_addrs: - # In this context want to ensure we do not have to migrate - # graphic or serial consoles since we can't update guest's - # domain XML to make it handle destination host. - self._check_graphics_addresses_can_live_migrate(listen_addrs) - self._verify_serial_console_is_disabled() - # Checking shared storage connectivity # if block migration, instances_paths should not be on shared storage. source = CONF.host @@ -5834,6 +5824,17 @@ class LibvirtDriver(driver.ComputeDriver): listen_addrs = libvirt_migrate.graphics_listen_addrs( migrate_data) + + migratable_flag = self._host.is_migratable_xml_flag() + if not migratable_flag or not listen_addrs: + # In this context want to ensure we do not have to migrate + # graphic or serial consoles since we can't update guest's + # domain XML to make it handle destination host. + # TODO(alexs-h): These checks could be moved to the + # check_can_live_migrate_destination/source phase + self._check_graphics_addresses_can_live_migrate(listen_addrs) + self._verify_serial_console_is_disabled() + if ('target_connect_addr' in migrate_data and migrate_data.target_connect_addr is not None): dest = migrate_data.target_connect_addr