From 96072a1ef1a5822d57e18ba65ce3ba50af062b23 Mon Sep 17 00:00:00 2001 From: Balazs Gibizer Date: Mon, 25 Jan 2021 18:00:03 +0100 Subject: [PATCH] libvirt: parse alias out from device config Libvirt assigns a device alias for each device in the domain and uses this identifier in the events related to these devices, like device detach. This patch extends the LibvirtConfigGuestInterface and the LibvirtConfigGuestDisk config object to parse the alias back from the domain config. The alias is intentionally not used during domain XML generation as it is expected that libvirt will populate and persist this field. This is part of the longer series trying to transform the existing device detach handling to use libvirt events. Change-Id: I16e7df6932bb7dff243706ee49338ba6b3782085 Related-Bug: #1882521 --- nova/tests/unit/virt/libvirt/test_config.py | 30 +++++++++++++++++++++ nova/virt/libvirt/config.py | 6 +++++ 2 files changed, 36 insertions(+) diff --git a/nova/tests/unit/virt/libvirt/test_config.py b/nova/tests/unit/virt/libvirt/test_config.py index 13e5c63c10c3..16d6a58d04ff 100644 --- a/nova/tests/unit/virt/libvirt/test_config.py +++ b/nova/tests/unit/virt/libvirt/test_config.py @@ -2285,6 +2285,21 @@ class LibvirtConfigGuestInterfaceTest(LibvirtConfigBaseTest): self.assertNotIsInstance(obj.device_addr, config.LibvirtConfigGuestDeviceAddressDrive) + def test_config_interface_alias(self): + xml = """ + + + + + + + """ + + obj = config.LibvirtConfigGuestInterface() + obj.parse_str(xml) + + self.assertEqual('net0', obj.alias) + class LibvirtConfigGuestFeatureTest(LibvirtConfigBaseTest): @@ -2813,6 +2828,21 @@ class LibvirtConfigGuestSnapshotTest(LibvirtConfigBaseTest): self.assertTrue(obj.driver_iommu) + def test_config_alias_parse(self): + xml = """ + + + + 7a97c4a3-6f59-41d4-bf47-191d7f97f8e9 + + """ + xmldoc = etree.fromstring(xml) + + obj = config.LibvirtConfigGuestDisk() + obj.parse_dom(xmldoc) + + self.assertEqual('virtio-disk0', obj.alias) + class LibvirtConfigNodeDeviceTest(LibvirtConfigBaseTest): diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py index f30c49e25ec6..2c155d46ef93 100644 --- a/nova/virt/libvirt/config.py +++ b/nova/virt/libvirt/config.py @@ -1037,6 +1037,7 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): self.boot_order = None self.mirror = None self.encryption = None + self.alias = None def _format_iotune(self, dev): iotune = etree.Element("iotune") @@ -1246,6 +1247,8 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): e = LibvirtConfigGuestDiskEncryption() e.parse_dom(c) self.encryption = e + elif c.tag == 'alias': + self.alias = c.get('name') class LibvirtConfigGuestDiskBackingStore(LibvirtConfigObject): @@ -1688,6 +1691,7 @@ class LibvirtConfigGuestInterface(LibvirtConfigGuestDevice): self.vlan = None self.device_addr = None self.mtu = None + self.alias = None def __eq__(self, other): if not isinstance(other, LibvirtConfigGuestInterface): @@ -1914,6 +1918,8 @@ class LibvirtConfigGuestInterface(LibvirtConfigGuestDevice): self.device_addr = obj elif c.tag == 'mtu': self.mtu = int(c.get('size')) + elif c.tag == 'alias': + self.alias = c.get('name') def add_filter_param(self, key, value): self.filterparams.append({'key': key, 'value': value})