Skip to content

Commit

Permalink
libvirt: move graphic/serial consoles check to pre_live_migration
Browse files Browse the repository at this point in the history
Moves checks of graphic and serial consoles to the
pre_live_migration step in order to be coherent with the purpose of
that step.

Implements: blueprint libvirt-clean-driver
Change-Id: If8b9e58ae4da0e83d76a68b7a94bb4dd6e00770b
  • Loading branch information
sahid committed Apr 12, 2016
1 parent 95ede91 commit 917afd2
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 63 deletions.
71 changes: 20 additions & 51 deletions nova/tests/unit/virt/libvirt/test_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -6445,6 +6445,26 @@ def test_check_can_live_migrate_source_block_migration(self):
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)
Expand Down Expand Up @@ -7189,24 +7209,6 @@ def test_live_migration_update_serial_console_xml(self, mock_xml,
drvr._live_migration_uri('dest'),
None, target_xml, mock.ANY, None, 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):
Expand Down Expand Up @@ -7311,35 +7313,6 @@ def test_live_migration_uses_migrateToURI3(
mock_migrateToURI3.assert_called_once_with(
drvr._live_migration_uri('dest'), params, 0)

@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
Expand Down Expand Up @@ -7421,7 +7394,6 @@ def test_live_migration_raises_unsupported_config_exception(self):
mox.IgnoreArg(), None,
_bandwidth).AndRaise(test.TestingException('oops'))

graphics_listen_addrs = {'vnc': '0.0.0.0', 'spice': '127.0.0.1'}
migrate_data = objects.LibvirtLiveMigrateData(
graphics_listen_addr_vnc='0.0.0.0',
graphics_listen_addr_spice='127.0.0.1',
Expand All @@ -7431,9 +7403,6 @@ def test_live_migration_raises_unsupported_config_exception(self):
block_migration=False)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)

self.mox.StubOutWithMock(
drvr, '_check_graphics_addresses_can_live_migrate')
drvr._check_graphics_addresses_can_live_migrate(graphics_listen_addrs)
self.mox.ReplayAll()

# start test
Expand Down
41 changes: 29 additions & 12 deletions nova/virt/libvirt/driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -5494,15 +5494,39 @@ def check_can_live_migrate_source(self, context, instance,
:param block_device_info: result of _get_instance_block_device_info
:returns: a LibvirtLiveMigrateData object
"""
# Checking shared storage connectivity
# if block migration, instances_paths should not be on shared storage.
source = CONF.host

if not isinstance(dest_check_data, migrate_data_obj.LiveMigrateData):
md_obj = objects.LibvirtLiveMigrateData()
md_obj.from_legacy_dict(dest_check_data)
dest_check_data = md_obj

listen_addrs = None
# We are building listen_addrs of vnc/spice from
# LibvirtLiveMigrateData; in some certains (e.g. an old-code
# destination host) those fields may have not been set and we
# want to avoid any unfortunates exceptions raised.
# TODO(sahid): The method
# _check_graphics_addresses_can_live_migrate_should to take an
# object LibvirtLiveMigrate itself.
if (dest_check_data.obj_attr_is_set('graphics_listen_addr_vnc')
or dest_check_data.obj_attr_is_set('graphics_listen_addr_spice')):
listen_addrs = {'vnc': None, 'spice': None}
if dest_check_data.obj_attr_is_set('graphics_listen_addr_vnc'):
listen_addrs['vnc'] = dest_check_data.graphics_listen_addr_vnc
if dest_check_data.obj_attr_is_set('graphics_listen_addr_spice'):
listen_addrs['spice'] = dest_check_data.graphics_listen_addr_spice

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

dest_check_data.is_shared_instance_path = (
self._check_shared_storage_test_file(
dest_check_data.filename))
Expand Down Expand Up @@ -5990,15 +6014,8 @@ def _live_migration_operation(self, context, instance, dest,
migrate_data.target_connect_addr is not None):
dest = migrate_data.target_connect_addr

migratable_flag = getattr(libvirt, 'VIR_DOMAIN_XML_MIGRATABLE',
None)

if (migratable_flag is None or (
if (not self._host.is_migratable_xml_flag() or (
not listen_addrs and not migrate_data.bdms)):
# 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()
dom.migrateToURI(self._live_migration_uri(dest),
migration_flags,
None,
Expand Down
7 changes: 7 additions & 0 deletions nova/virt/libvirt/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -1015,3 +1015,10 @@ def is_cpu_control_policy_capable(self):
return False
except IOError:
return False

def is_migratable_xml_flag(self):
"""Determines whether libvirt is supporting dump XML suitable for
migration.
"""
return getattr(libvirt, 'VIR_DOMAIN_XML_MIGRATABLE',
None) is not None

0 comments on commit 917afd2

Please sign in to comment.