Merge "libvirt: Add migration support for perf event support"
This commit is contained in:
commit
4f33047d07
@ -109,7 +109,8 @@ class LibvirtLiveMigrateData(LiveMigrateData):
|
||||
# Version 1.1: Added target_connect_addr
|
||||
# Version 1.2: Added 'serial_listen_ports' to allow live migration with
|
||||
# serial console.
|
||||
VERSION = '1.2'
|
||||
# Version 1.3: Added 'supported_perf_events'
|
||||
VERSION = '1.3'
|
||||
|
||||
fields = {
|
||||
'filename': fields.StringField(),
|
||||
@ -127,12 +128,16 @@ class LibvirtLiveMigrateData(LiveMigrateData):
|
||||
'serial_listen_ports': fields.ListOfIntegersField(),
|
||||
'bdms': fields.ListOfObjectsField('LibvirtLiveMigrateBDMInfo'),
|
||||
'target_connect_addr': fields.StringField(nullable=True),
|
||||
'supported_perf_events': fields.ListOfStringsField(),
|
||||
}
|
||||
|
||||
def obj_make_compatible(self, primitive, target_version):
|
||||
super(LibvirtLiveMigrateData, self).obj_make_compatible(
|
||||
primitive, target_version)
|
||||
target_version = versionutils.convert_version_to_tuple(target_version)
|
||||
if target_version < (1, 3):
|
||||
if 'supported_perf_events' in primitive:
|
||||
del primitive['supported_perf_events']
|
||||
if target_version < (1, 2):
|
||||
if 'serial_listen_ports' in primitive:
|
||||
del primitive['serial_listen_ports']
|
||||
|
@ -1153,7 +1153,7 @@ object_data = {
|
||||
'Inventory': '1.0-84131c00c84a27ee6930d01b329c9a9d',
|
||||
'InventoryList': '1.0-de53f0fd078c27cc1d43400f4e8bcef8',
|
||||
'LibvirtLiveMigrateBDMInfo': '1.0-252aabb723ca79d5469fa56f64b57811',
|
||||
'LibvirtLiveMigrateData': '1.2-c489f63478d13eace828128ea3dfa57c',
|
||||
'LibvirtLiveMigrateData': '1.3-2795e5646ee21e8c7f1c3e64fb6c80a3',
|
||||
'KeyPair': '1.4-1244e8d1b103cc69d038ed78ab3a8cc6',
|
||||
'KeyPairList': '1.2-58b94f96e776bedaf1e192ddb2a24c4e',
|
||||
'Migration': '1.4-17979b9f2ae7f28d97043a220b2a8350',
|
||||
|
@ -9723,6 +9723,22 @@ class LibvirtConnTestCase(test.NoDBTestCase):
|
||||
write_to_file.assert_called_with(disk_info_path,
|
||||
jsonutils.dumps(image_disk_info))
|
||||
|
||||
def test_pre_live_migration_with_perf_events(self):
|
||||
|
||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
||||
drvr._supported_perf_events = ['cmt']
|
||||
|
||||
migrate_data = {}
|
||||
|
||||
instance = objects.Instance(**self.test_instance)
|
||||
|
||||
res = drvr.pre_live_migration(self.context, instance,
|
||||
block_device_info=None,
|
||||
network_info=[],
|
||||
disk_info=None,
|
||||
migrate_data=migrate_data)
|
||||
self.assertEqual(['cmt'], res.supported_perf_events)
|
||||
|
||||
def test_get_instance_disk_info_works_correctly(self):
|
||||
# Test data
|
||||
instance = objects.Instance(**self.test_instance)
|
||||
|
@ -19,6 +19,8 @@ from oslo_utils import units
|
||||
|
||||
import six
|
||||
|
||||
from oslo_utils import encodeutils
|
||||
|
||||
from nova.compute import power_state
|
||||
from nova import objects
|
||||
from nova import test
|
||||
@ -189,6 +191,67 @@ class UtilityMigrationTestCase(test.NoDBTestCase):
|
||||
self.assertIn('ip-1.2.3.4:3260-iqn.cde.67890.opst-lun-Z',
|
||||
six.text_type(res))
|
||||
|
||||
def test_update_perf_events_xml(self):
|
||||
data = objects.LibvirtLiveMigrateData(
|
||||
supported_perf_events=['cmt'])
|
||||
xml = """<domain>
|
||||
<perf>
|
||||
<event enabled="yes" name="cmt"/>
|
||||
<event enabled="yes" name="mbml"/>
|
||||
</perf>
|
||||
</domain>"""
|
||||
doc = etree.fromstring(xml)
|
||||
res = etree.tostring(migration._update_perf_events_xml(doc, data))
|
||||
|
||||
self.assertEqual("""<domain>
|
||||
<perf>
|
||||
<event enabled="yes" name="cmt"/></perf>
|
||||
</domain>""", encodeutils.safe_decode(res))
|
||||
|
||||
def test_update_perf_events_xml_add_new_events(self):
|
||||
data = objects.LibvirtLiveMigrateData(
|
||||
supported_perf_events=['cmt'])
|
||||
xml = """<domain>
|
||||
</domain>"""
|
||||
doc = etree.fromstring(xml)
|
||||
res = etree.tostring(migration._update_perf_events_xml(doc, data))
|
||||
|
||||
self.assertEqual("""<domain>
|
||||
<perf><event enabled="yes" name="cmt"/></perf></domain>""",
|
||||
encodeutils.safe_decode(res))
|
||||
|
||||
def test_update_perf_events_xml_add_new_events1(self):
|
||||
data = objects.LibvirtLiveMigrateData(
|
||||
supported_perf_events=['cmt', 'mbml'])
|
||||
xml = """<domain>
|
||||
<perf>
|
||||
<event enabled="yes" name="cmt"/>
|
||||
</perf>
|
||||
</domain>"""
|
||||
doc = etree.fromstring(xml)
|
||||
res = etree.tostring(migration._update_perf_events_xml(doc, data))
|
||||
|
||||
self.assertEqual("""<domain>
|
||||
<perf>
|
||||
<event enabled="yes" name="cmt"/><event enabled="yes" name="mbml"/></perf>
|
||||
</domain>""", encodeutils.safe_decode(res))
|
||||
|
||||
def test_update_perf_events_xml_remove_all_events(self):
|
||||
data = objects.LibvirtLiveMigrateData(
|
||||
supported_perf_events=[])
|
||||
xml = """<domain>
|
||||
<perf>
|
||||
<event enabled="yes" name="cmt"/>
|
||||
</perf>
|
||||
</domain>"""
|
||||
doc = etree.fromstring(xml)
|
||||
res = etree.tostring(migration._update_perf_events_xml(doc, data))
|
||||
|
||||
self.assertEqual("""<domain>
|
||||
<perf>
|
||||
</perf>
|
||||
</domain>""", encodeutils.safe_decode(res))
|
||||
|
||||
|
||||
class MigrationMonitorTestCase(test.NoDBTestCase):
|
||||
|
||||
|
@ -6546,6 +6546,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||
# Store live_migration_inbound_addr
|
||||
migrate_data.target_connect_addr = \
|
||||
CONF.libvirt.live_migration_inbound_addr
|
||||
migrate_data.supported_perf_events = self._supported_perf_events
|
||||
|
||||
for vol in block_device_mapping:
|
||||
connection_info = vol['connection_info']
|
||||
|
@ -60,6 +60,7 @@ def get_updated_guest_xml(guest, migrate_data, get_volume_config):
|
||||
xml_doc = _update_graphics_xml(xml_doc, migrate_data)
|
||||
xml_doc = _update_serial_xml(xml_doc, migrate_data)
|
||||
xml_doc = _update_volume_xml(xml_doc, migrate_data, get_volume_config)
|
||||
xml_doc = _update_perf_events_xml(xml_doc, migrate_data)
|
||||
return etree.tostring(xml_doc)
|
||||
|
||||
|
||||
@ -132,6 +133,40 @@ def _update_volume_xml(xml_doc, migrate_data, get_volume_config):
|
||||
return xml_doc
|
||||
|
||||
|
||||
def _update_perf_events_xml(xml_doc, migrate_data):
|
||||
"""Update XML by the supported events of destination host."""
|
||||
|
||||
supported_perf_events = []
|
||||
old_xml_has_perf = True
|
||||
|
||||
if 'supported_perf_events' in migrate_data:
|
||||
supported_perf_events = migrate_data.supported_perf_events
|
||||
|
||||
perf_events = xml_doc.findall('./perf')
|
||||
|
||||
# remove perf events from xml
|
||||
if not perf_events:
|
||||
perf_events = etree.Element("perf")
|
||||
old_xml_has_perf = False
|
||||
else:
|
||||
perf_events = perf_events[0]
|
||||
for _, event in enumerate(perf_events):
|
||||
perf_events.remove(event)
|
||||
|
||||
if not supported_perf_events:
|
||||
return xml_doc
|
||||
|
||||
# add supported perf events
|
||||
for e in supported_perf_events:
|
||||
new_event = etree.Element("event", enabled="yes", name=e)
|
||||
perf_events.append(new_event)
|
||||
|
||||
if not old_xml_has_perf:
|
||||
xml_doc.append(perf_events)
|
||||
|
||||
return xml_doc
|
||||
|
||||
|
||||
def find_job_type(guest, instance):
|
||||
"""Determine the (likely) current migration job type
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user