Merge "[libvirt] Remove live_migration_flag & block_migration_flag"

This commit is contained in:
Jenkins 2016-08-17 21:57:12 +00:00 committed by Gerrit Code Review
commit a82bff11a0
4 changed files with 47 additions and 364 deletions

View File

@ -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 '

View File

@ -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),

View File

@ -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

View File

@ -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`.