Merge "[libvirt] Remove live_migration_flag & block_migration_flag"
This commit is contained in:
commit
a82bff11a0
@ -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 '
|
||||
|
@ -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),
|
||||
|
@ -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
|
||||
|
@ -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`.
|
Loading…
Reference in New Issue
Block a user