diff --git a/nova/conf/libvirt.py b/nova/conf/libvirt.py index fd8d13fa6934..c4c42f77afaf 100644 --- a/nova/conf/libvirt.py +++ b/nova/conf/libvirt.py @@ -83,27 +83,6 @@ libvirt_general_opts = [ '(which is dependent on virt_type) ' '(any included "%s" is replaced with ' 'the migration target hostname)'), - cfg.StrOpt('live_migration_flag', - default='VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED', - help='Migration flags to be set for live migration', - deprecated_for_removal=True, - deprecated_reason='The correct live migration flags can be ' - 'inferred from the new ' - 'live_migration_tunnelled config option. ' - 'live_migration_flag will be removed to ' - 'avoid potential misconfiguration.'), - cfg.StrOpt('block_migration_flag', - default='VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC', - help='Migration flags to be set for block migration', - deprecated_for_removal=True, - deprecated_reason='The correct block migration flags can be ' - 'inferred from the new ' - 'live_migration_tunnelled config option. ' - 'block_migration_flag will be removed to ' - 'avoid potential misconfiguration.'), cfg.BoolOpt('live_migration_tunnelled', default=False, help='Whether to use tunnelled migration, where migration ' diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 8b19e15a8bcf..c95fbe47233c 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -1023,13 +1023,8 @@ class LibvirtConnTestCase(test.NoDBTestCase): drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) drvr.init_host("dummyhost") - def _do_test_parse_migration_flags(self, lm_config=None, lm_expected=None, - bm_config=None, bm_expected=None): - if lm_config is not None: - self.flags(live_migration_flag=lm_config, group='libvirt') - if bm_config is not None: - self.flags(block_migration_flag=bm_config, group='libvirt') - + def _do_test_parse_migration_flags(self, lm_expected=None, + bm_expected=None): drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) drvr._parse_migration_flags() @@ -1040,25 +1035,18 @@ class LibvirtConnTestCase(test.NoDBTestCase): def test_parse_live_migration_flags_default(self): self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE)) def test_parse_live_migration_flags(self): self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE)) def test_parse_block_migration_flags_default(self): self._do_test_parse_migration_flags( - bm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), bm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE | @@ -1066,150 +1054,23 @@ class LibvirtConnTestCase(test.NoDBTestCase): def test_parse_block_migration_flags(self): self._do_test_parse_migration_flags( - bm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_NON_SHARED_INC'), bm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE | libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC)) - @mock.patch('nova.virt.libvirt.driver.LOG') - def test_parse_live_migration_flag_with_invalid_flag(self, mock_log): - self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_FOO_BAR'), - lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_LIVE), - bm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC, VIR_MIGRATE_FOO_BAR'), - bm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_LIVE | - libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC)) - - msg = mock_log.warning.call_args_list[0] - self.assertIn("unknown libvirt live migration flag", msg[0][0]) - msg = mock_log.warning.call_args_list[1] - self.assertIn("unknown libvirt live migration flag", msg[0][0]) - - @mock.patch('nova.virt.libvirt.driver.LOG') - def test_parse_migration_flags_unsafe_block(self, mock_log): - '''Test if the driver logs a warning if the live_migration_flag - and/or block_migration_flag config option uses a value which can - cause potential damage. - ''' - self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), - bm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_LIVE), - bm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_LIVE | - libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC)) - - msg = mock_log.warning.call_args_list[0] - self.assertIn('Removing the VIR_MIGRATE_NON_SHARED_INC', msg[0][0]) - msg = mock_log.warning.call_args_list[1] - self.assertIn('Adding the VIR_MIGRATE_NON_SHARED_INC', msg[0][0]) - - @mock.patch('nova.virt.libvirt.driver.LOG') - def test_parse_migration_flags_p2p_missing(self, mock_log): - self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), - lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_LIVE), - bm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_LIVE | - libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC)) - - msg = mock_log.warning.call_args_list[0] - self.assertIn('Adding the VIR_MIGRATE_PEER2PEER flag', msg[0][0]) - msg = mock_log.warning.call_args_list[1] - self.assertIn('Adding the VIR_MIGRATE_PEER2PEER flag', msg[0][0]) - - @mock.patch('nova.virt.libvirt.driver.LOG') - def test_parse_migration_flags_p2p_xen(self, mock_log): + def test_parse_migration_flags_p2p_xen(self): self.flags(virt_type='xen', group='libvirt') - self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_LIVE), bm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_LIVE | libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC)) - msg = mock_log.warning.call_args_list[0] - self.assertIn('Removing the VIR_MIGRATE_PEER2PEER flag', msg[0][0]) - msg = mock_log.warning.call_args_list[1] - self.assertIn('Removing the VIR_MIGRATE_PEER2PEER flag', msg[0][0]) - - @mock.patch('nova.virt.libvirt.driver.LOG') - def test_parse_migration_flags_config_mgmt(self, mock_log): + def test_live_migration_tunnelled_none(self): + self.flags(live_migration_tunnelled=None, group='libvirt') self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), - lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_LIVE), - bm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_LIVE | - libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC)) - - msg = mock_log.warning.call_args_list[0] - self.assertIn('Adding the VIR_MIGRATE_UNDEFINE_SOURCE flag', msg[0][0]) - msg = mock_log.warning.call_args_list[1] - self.assertIn('Removing the VIR_MIGRATE_PERSIST_DEST flag', msg[0][0]) - msg = mock_log.warning.call_args_list[2] - self.assertIn('Adding the VIR_MIGRATE_UNDEFINE_SOURCE flag', msg[0][0]) - msg = mock_log.warning.call_args_list[3] - self.assertIn('Removing the VIR_MIGRATE_PERSIST_DEST flag', msg[0][0]) - - @mock.patch('nova.virt.libvirt.driver.LOG') - def test_live_migration_tunnelled_true(self, mock_log): - self.flags(live_migration_tunnelled=True, group='libvirt') - - self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_LIVE'), - bm_config=('VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_LIVE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | @@ -1220,47 +1081,23 @@ class LibvirtConnTestCase(test.NoDBTestCase): libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC | libvirt_driver.libvirt.VIR_MIGRATE_TUNNELLED)) - msg = mock_log.warning.call_args_list[0] - self.assertIn('does not contain the VIR_MIGRATE_TUNNELLED', msg[0][0]) - msg = mock_log.warning.call_args_list[1] - self.assertIn('does not contain the VIR_MIGRATE_TUNNELLED', msg[0][0]) - - @mock.patch('nova.virt.libvirt.driver.LOG') - def test_live_migration_tunnelled_false(self, mock_log): - self.flags(live_migration_tunnelled=False, group='libvirt') - + def test_live_migration_tunnelled_true(self): + self.flags(live_migration_tunnelled=True, group='libvirt') self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_UNDEFINE_SOURCE, ' - 'VIR_MIGRATE_LIVE, VIR_MIGRATE_NON_SHARED_INC, ' - 'VIR_MIGRATE_TUNNELLED'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_LIVE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | - libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE), + libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | + libvirt_driver.libvirt.VIR_MIGRATE_TUNNELLED), bm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_LIVE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | - libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC)) - - msg = mock_log.warning.call_args_list[0] - self.assertIn('contains the VIR_MIGRATE_TUNNELLED flag', msg[0][0]) - msg = mock_log.warning.call_args_list[1] - self.assertIn('contains the VIR_MIGRATE_TUNNELLED flag', msg[0][0]) + libvirt_driver.libvirt.VIR_MIGRATE_NON_SHARED_INC | + libvirt_driver.libvirt.VIR_MIGRATE_TUNNELLED)) @mock.patch.object(host.Host, 'has_min_version', return_value=True) def test_live_migration_permit_postcopy_true(self, host): self.flags(live_migration_permit_post_copy=True, group='libvirt') self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE | @@ -1275,15 +1112,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): def test_live_migration_permit_auto_converge_true(self, host): self.flags(live_migration_permit_auto_converge=True, group='libvirt') self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE | @@ -1300,15 +1128,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): self.flags(live_migration_permit_auto_converge=True, group='libvirt') self.flags(live_migration_permit_post_copy=True, group='libvirt') self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE | @@ -1333,15 +1152,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): mock_host.side_effect = fake_has_min_version self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE | @@ -1357,15 +1167,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): self.flags(live_migration_permit_post_copy=True, group='libvirt') self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE), @@ -1378,15 +1179,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): def test_live_migration_permit_auto_converge_true_old_libvirt(self, host): self.flags(live_migration_permit_auto_converge=True, group='libvirt') self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE), @@ -1397,15 +1189,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): def test_live_migration_permit_postcopy_false(self): self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE), @@ -1416,15 +1199,6 @@ class LibvirtConnTestCase(test.NoDBTestCase): def test_live_migration_permit_autoconverge_false(self): self._do_test_parse_migration_flags( - lm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED'), - bm_config=('VIR_MIGRATE_PERSIST_DEST, ' - 'VIR_MIGRATE_PEER2PEER, ' - 'VIR_MIGRATE_LIVE, ' - 'VIR_MIGRATE_TUNNELLED, ' - 'VIR_MIGRATE_NON_SHARED_INC'), lm_expected=(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE | libvirt_driver.libvirt.VIR_MIGRATE_PEER2PEER | libvirt_driver.libvirt.VIR_MIGRATE_LIVE), diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index b51ab47390cd..f946d876f58c 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -534,82 +534,32 @@ class LibvirtDriver(driver.ComputeDriver): 'qemu_ver': self._version_to_string( MIN_QEMU_OTHER_ARCH.get(kvm_arch))}) - def _check_required_migration_flags(self, migration_flags, config_name): - if CONF.libvirt.virt_type == 'xen': - if (migration_flags & libvirt.VIR_MIGRATE_PEER2PEER) != 0: - LOG.warning(_LW('Removing the VIR_MIGRATE_PEER2PEER flag from ' - '%(config_name)s because peer-to-peer ' - 'migrations are not supported by the "xen" ' - 'virt type'), - {'config_name': config_name}) - migration_flags &= ~libvirt.VIR_MIGRATE_PEER2PEER - else: - if (migration_flags & libvirt.VIR_MIGRATE_PEER2PEER) == 0: - LOG.warning(_LW('Adding the VIR_MIGRATE_PEER2PEER flag to ' - '%(config_name)s because direct migrations ' - 'are not supported by the %(virt_type)s ' - 'virt type'), - {'config_name': config_name, - 'virt_type': CONF.libvirt.virt_type}) - migration_flags |= libvirt.VIR_MIGRATE_PEER2PEER + def _prepare_migration_flags(self): + migration_flags = 0 - if (migration_flags & libvirt.VIR_MIGRATE_UNDEFINE_SOURCE) == 0: - LOG.warning(_LW('Adding the VIR_MIGRATE_UNDEFINE_SOURCE flag to ' - '%(config_name)s because, without it, migrated ' - 'VMs will remain defined on the source host'), - {'config_name': config_name}) - migration_flags |= libvirt.VIR_MIGRATE_UNDEFINE_SOURCE + migration_flags |= libvirt.VIR_MIGRATE_LIVE - if (migration_flags & libvirt.VIR_MIGRATE_PERSIST_DEST) != 0: - LOG.warning(_LW('Removing the VIR_MIGRATE_PERSIST_DEST flag from ' - '%(config_name)s as Nova ensures the VM is ' - 'persisted on the destination host'), - {'config_name': config_name}) - migration_flags &= ~libvirt.VIR_MIGRATE_PERSIST_DEST + # Adding p2p flag only if xen is not in use, because xen does not + # support p2p migrations + if CONF.libvirt.virt_type != 'xen': + migration_flags |= libvirt.VIR_MIGRATE_PEER2PEER - return migration_flags + # Adding VIR_MIGRATE_UNDEFINE_SOURCE because, without it, migrated + # instance will remain defined on the source host + migration_flags |= libvirt.VIR_MIGRATE_UNDEFINE_SOURCE - def _check_block_migration_flags(self, live_migration_flags, - block_migration_flags): - if (live_migration_flags & libvirt.VIR_MIGRATE_NON_SHARED_INC) != 0: - LOG.warning(_LW('Removing the VIR_MIGRATE_NON_SHARED_INC flag ' - 'from the live_migration_flag config option ' - 'because it will cause all live-migrations to be ' - 'block-migrations instead.')) - live_migration_flags &= ~libvirt.VIR_MIGRATE_NON_SHARED_INC + live_migration_flags = block_migration_flags = migration_flags - if (block_migration_flags & libvirt.VIR_MIGRATE_NON_SHARED_INC) == 0: - LOG.warning(_LW('Adding the VIR_MIGRATE_NON_SHARED_INC flag to ' - 'the block_migration_flag config option, ' - 'otherwise all block-migrations will be ' - 'live-migrations instead.')) - block_migration_flags |= libvirt.VIR_MIGRATE_NON_SHARED_INC + # Adding VIR_MIGRATE_NON_SHARED_INC, otherwise all block-migrations + # will be live-migrations instead + block_migration_flags |= libvirt.VIR_MIGRATE_NON_SHARED_INC return (live_migration_flags, block_migration_flags) - def _handle_live_migration_tunnelled(self, migration_flags, config_name): - if CONF.libvirt.live_migration_tunnelled is None: - return migration_flags - - if CONF.libvirt.live_migration_tunnelled: - if (migration_flags & libvirt.VIR_MIGRATE_TUNNELLED) == 0: - LOG.warning(_LW('The %(config_name)s config option does not ' - 'contain the VIR_MIGRATE_TUNNELLED flag but ' - 'the live_migration_tunnelled is set to True ' - 'which causes VIR_MIGRATE_TUNNELLED to be ' - 'set'), - {'config_name': config_name}) + def _handle_live_migration_tunnelled(self, migration_flags): + if (CONF.libvirt.live_migration_tunnelled is None or + CONF.libvirt.live_migration_tunnelled): migration_flags |= libvirt.VIR_MIGRATE_TUNNELLED - else: - if (migration_flags & libvirt.VIR_MIGRATE_TUNNELLED) != 0: - LOG.warning(_LW('The %(config_name)s config option contains ' - 'the VIR_MIGRATE_TUNNELLED flag but the ' - 'live_migration_tunnelled is set to False ' - 'which causes VIR_MIGRATE_TUNNELLED to be ' - 'unset'), - {'config_name': config_name}) - migration_flags &= ~libvirt.VIR_MIGRATE_TUNNELLED - return migration_flags def _is_post_copy_available(self): @@ -618,31 +568,24 @@ class LibvirtDriver(driver.ComputeDriver): return True return False - def _handle_live_migration_post_copy(self, migration_flags, - config_name): + def _handle_live_migration_post_copy(self, migration_flags): if CONF.libvirt.live_migration_permit_post_copy: if self._is_post_copy_available(): migration_flags |= libvirt.VIR_MIGRATE_POSTCOPY else: LOG.info(_LI('The live_migration_permit_post_copy is set ' 'to True, but it is not supported.')) - elif self._is_post_copy_available(): - migration_flags &= ~libvirt.VIR_MIGRATE_POSTCOPY return migration_flags - def _handle_live_migration_auto_converge(self, migration_flags, - config_name): + def _handle_live_migration_auto_converge(self, migration_flags): if self._host.has_min_version(lv_ver=MIN_LIBVIRT_AUTO_CONVERGE_VERSION, hv_ver=MIN_QEMU_AUTO_CONVERGE): if (self._is_post_copy_available() and (migration_flags & libvirt.VIR_MIGRATE_POSTCOPY) != 0): - migration_flags &= ~libvirt.VIR_MIGRATE_AUTO_CONVERGE LOG.info(_LI('The live_migration_permit_post_copy is set to ' 'True and post copy live migration is available ' 'so auto-converge will not be in use.')) - elif not CONF.libvirt.live_migration_permit_auto_converge: - migration_flags &= ~libvirt.VIR_MIGRATE_AUTO_CONVERGE - else: + elif CONF.libvirt.live_migration_permit_auto_converge: migration_flags |= libvirt.VIR_MIGRATE_AUTO_CONVERGE elif CONF.libvirt.live_migration_permit_auto_converge: LOG.info(_LI('The live_migration_permit_auto_converge is set ' @@ -650,45 +593,23 @@ class LibvirtDriver(driver.ComputeDriver): return migration_flags def _parse_migration_flags(self): - def str2sum(str_val): - logical_sum = 0 - for s in [i.strip() for i in str_val.split(',') if i]: - try: - logical_sum |= getattr(libvirt, s) - except AttributeError: - LOG.warning(_LW("Ignoring unknown libvirt live migration " - "flag '%(flag)s'"), {'flag': s}) - return logical_sum - - live_migration_flags = str2sum(CONF.libvirt.live_migration_flag) - block_migration_flags = str2sum(CONF.libvirt.block_migration_flag) - - live_config_name = 'live_migration_flag' - block_config_name = 'block_migration_flag' - - live_migration_flags = self._check_required_migration_flags( - live_migration_flags, live_config_name) - block_migration_flags = self._check_required_migration_flags( - block_migration_flags, block_config_name) - (live_migration_flags, - block_migration_flags) = self._check_block_migration_flags( - live_migration_flags, block_migration_flags) + block_migration_flags) = self._prepare_migration_flags() live_migration_flags = self._handle_live_migration_tunnelled( - live_migration_flags, live_config_name) + live_migration_flags) block_migration_flags = self._handle_live_migration_tunnelled( - block_migration_flags, block_config_name) + block_migration_flags) live_migration_flags = self._handle_live_migration_post_copy( - live_migration_flags, live_config_name) + live_migration_flags) block_migration_flags = self._handle_live_migration_post_copy( - block_migration_flags, block_config_name) + block_migration_flags) live_migration_flags = self._handle_live_migration_auto_converge( - live_migration_flags, live_config_name) + live_migration_flags) block_migration_flags = self._handle_live_migration_auto_converge( - block_migration_flags, block_config_name) + block_migration_flags) self._live_migration_flags = live_migration_flags self._block_migration_flags = block_migration_flags diff --git a/releasenotes/notes/remove-libvirt-migration-flags-config-8bf909c1295cc53f.yaml b/releasenotes/notes/remove-libvirt-migration-flags-config-8bf909c1295cc53f.yaml new file mode 100644 index 000000000000..8ecf102747ba --- /dev/null +++ b/releasenotes/notes/remove-libvirt-migration-flags-config-8bf909c1295cc53f.yaml @@ -0,0 +1,9 @@ +--- +upgrade: + - The 'live_migration_flag' and 'block_migration_flag' options in libvirt + section that were deprecated in Mitaka have been completely removed in + Newton, because nova automatically sets correct migration flags. New config + options has been added to retain possibility to turn tunnelling, + auto-converge and post-copy on/off, respectively named + `live_migration_tunnelled`, `live_migration_permit_auto_converge` and + `live_migration_permit_post_copy`.