libvirt: Add serial ports to the migration data object

The serial console code in nova picks TCP ports for each serial
interface of an instance. When doing a live migration, the
TCP ports used for the migrating instance might be in use on
the target hypervisor which causes the live migration to fail.

This patch adds a field to the migration data object so that a follow
up patch can use that to rewrite the guest XML.

Change-Id: I970014ee0ee8059f5976797bf344fea9a7ccb32d
Related-Bug: #1455252
This commit is contained in:
Markus Zoeller 2016-02-03 16:04:29 +01:00 committed by Sahid Orentino Ferdjaoui
parent cdfbb9a668
commit c8ceeb46c7
3 changed files with 20 additions and 2 deletions

View File

@ -107,7 +107,9 @@ class LibvirtLiveMigrateBDMInfo(obj_base.NovaObject):
class LibvirtLiveMigrateData(LiveMigrateData):
# Version 1.0: Initial version
# Version 1.1: Added target_connect_addr
VERSION = '1.1'
# Version 1.2: Added 'serial_listen_ports' to allow live migration with
# serial console.
VERSION = '1.2'
fields = {
'filename': fields.StringField(),
@ -122,6 +124,7 @@ class LibvirtLiveMigrateData(LiveMigrateData):
'graphics_listen_addr_vnc': fields.IPAddressField(nullable=True),
'graphics_listen_addr_spice': fields.IPAddressField(nullable=True),
'serial_listen_addr': fields.StringField(nullable=True),
'serial_listen_ports': fields.ListOfIntegersField(),
'bdms': fields.ListOfObjectsField('LibvirtLiveMigrateBDMInfo'),
'target_connect_addr': fields.StringField(nullable=True),
}
@ -130,6 +133,9 @@ class LibvirtLiveMigrateData(LiveMigrateData):
super(LibvirtLiveMigrateData, self).obj_make_compatible(
primitive, target_version)
target_version = versionutils.convert_version_to_tuple(target_version)
if target_version < (1, 2):
if 'serial_listen_ports' in primitive:
del primitive['serial_listen_ports']
if target_version < (1, 1) and 'target_connect_addr' in primitive:
del primitive['target_connect_addr']

View File

@ -70,6 +70,18 @@ class _TestLiveMigrateData(object):
migrate_data.LiveMigrateData.detect_implementation(legacy),
migrate_data.XenapiLiveMigrateData)
def test_obj_make_compatible(self):
props = {
'serial_listen_addr': '127.0.0.1',
'serial_listen_ports': [1000, 10001, 10002, 10003],
}
obj = migrate_data.LibvirtLiveMigrateData(**props)
primitive = obj.obj_to_primitive()
self.assertIn('serial_listen_ports', primitive['nova_object.data'])
obj.obj_make_compatible(primitive['nova_object.data'], '1.1')
self.assertNotIn('serial_listen_ports', primitive['nova_object.data'])
class TestLiveMigrateData(test_objects._LocalTest,
_TestLiveMigrateData):

View File

@ -1153,7 +1153,7 @@ object_data = {
'Inventory': '1.0-f4160797d47a533a58700e9ddcc9c5e2',
'InventoryList': '1.0-de53f0fd078c27cc1d43400f4e8bcef8',
'LibvirtLiveMigrateBDMInfo': '1.0-252aabb723ca79d5469fa56f64b57811',
'LibvirtLiveMigrateData': '1.1-4ecf40aae7fee7bb37fc3b2123e760de',
'LibvirtLiveMigrateData': '1.2-c489f63478d13eace828128ea3dfa57c',
'KeyPair': '1.4-1244e8d1b103cc69d038ed78ab3a8cc6',
'KeyPairList': '1.2-58b94f96e776bedaf1e192ddb2a24c4e',
'Migration': '1.4-17979b9f2ae7f28d97043a220b2a8350',