From 63a132ec415f502958523a284549914146c67d85 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Tue, 5 Jan 2016 21:00:44 +0000 Subject: [PATCH] libvirt: better error for bad live migration flag Slightly improve the error message we give if the operator configures the live_migration_flag or block_migration_flag config options with an invalid migration flag from: Live Migration failure: 'module' object has no attribute 'VIR_MIGRATE_FOO_BAR' to: Live Migration failure: Unknown libvirt live migration flag 'VIR_MIGRATE_FOO_BAR' Change-Id: I2965b369d529e57e00f8bba615303d1a02c216c2 Signed-off-by: Mark McLoughlin --- nova/tests/unit/virt/libvirt/test_driver.py | 15 +++++++++++++++ nova/virt/libvirt/driver.py | 10 +++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 9f83a2e8f0..dde4b7cf7b 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -6508,6 +6508,21 @@ class LibvirtConnTestCase(test.NoDBTestCase): self.context, instance_ref, 'dest', False, None, dom) + def test_live_migration_fails_with_invalid_live_migration_flag(self): + self.flags(live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE, " + "VIR_MIGRATE_PEER2PEER, " + "VIR_MIGRATE_LIVE, " + "VIR_MIGRATE_TUNNELLED, " + "VIR_MIGRATE_FOO_BAR", + group='libvirt') + instance_ref = self.test_instance + dom = fakelibvirt.virDomain + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) + self.assertRaises(exception.Invalid, + drvr._live_migration_operation, + self.context, instance_ref, 'dest', + False, None, dom) + @mock.patch.object(fakelibvirt, 'VIR_DOMAIN_XML_MIGRATABLE', None, create=True) def test_live_migration_uses_migrateToURI_without_migratable_flag(self): diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index c2b0112a63..53c9b670fb 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -5621,7 +5621,15 @@ class LibvirtDriver(driver.ComputeDriver): flaglist = CONF.libvirt.block_migration_flag.split(',') else: flaglist = CONF.libvirt.live_migration_flag.split(',') - flagvals = [getattr(libvirt, x.strip()) for x in flaglist] + + def getflag(s): + try: + return getattr(libvirt, s) + except AttributeError: + msg = _("Unknown libvirt live migration flag '%s'") % s + raise exception.Invalid(msg) + + flagvals = [getflag(x.strip()) for x in flaglist] logical_sum = six.moves.reduce(lambda x, y: x | y, flagvals) pre_live_migrate_data = (migrate_data or {}).get(