From 2f6cf7cba883c594e14aea05a85bb36b9f5209b0 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 28 Jul 2015 17:39:33 +0100 Subject: [PATCH] libvirt: add helper methods for getting guest devices/disks Add get_all_devices and get_all_disks methods to the libvirt Guest object. Related-bug: #1429220 Change-Id: I97ee786c5cc603aec1695929f58aa127063db439 --- nova/tests/unit/virt/libvirt/test_guest.py | 87 ++++++++++++++++++++++ nova/virt/libvirt/guest.py | 30 ++++++++ 2 files changed, 117 insertions(+) diff --git a/nova/tests/unit/virt/libvirt/test_guest.py b/nova/tests/unit/virt/libvirt/test_guest.py index 79164530aa1a..35d643bc4a11 100644 --- a/nova/tests/unit/virt/libvirt/test_guest.py +++ b/nova/tests/unit/virt/libvirt/test_guest.py @@ -257,6 +257,93 @@ class GuestTestCase(test.NoDBTestCase): self.guest.set_user_password("foo", "123") self.domain.setUserPassword.assert_called_once_with("foo", "123", 0) + def test_get_devices(self): + xml = """ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + +""" + + self.domain.XMLDesc.return_value = xml + + devs = self.guest.get_all_devices() + # Only currently parse and elements + # hence we're not counting the controller/memballoon + self.assertEqual(5, len(devs)) + self.assertIsInstance(devs[0], vconfig.LibvirtConfigGuestDisk) + self.assertIsInstance(devs[1], vconfig.LibvirtConfigGuestDisk) + self.assertIsInstance(devs[2], vconfig.LibvirtConfigGuestDisk) + self.assertIsInstance(devs[3], vconfig.LibvirtConfigGuestHostdev) + self.assertIsInstance(devs[4], vconfig.LibvirtConfigGuestHostdev) + + devs = self.guest.get_all_devices(vconfig.LibvirtConfigGuestDisk) + self.assertEqual(3, len(devs)) + self.assertIsInstance(devs[0], vconfig.LibvirtConfigGuestDisk) + self.assertIsInstance(devs[1], vconfig.LibvirtConfigGuestDisk) + self.assertIsInstance(devs[2], vconfig.LibvirtConfigGuestDisk) + + devs = self.guest.get_all_disks() + self.assertEqual(3, len(devs)) + self.assertIsInstance(devs[0], vconfig.LibvirtConfigGuestDisk) + self.assertIsInstance(devs[1], vconfig.LibvirtConfigGuestDisk) + self.assertIsInstance(devs[2], vconfig.LibvirtConfigGuestDisk) + + devs = self.guest.get_all_devices(vconfig.LibvirtConfigGuestHostdev) + self.assertEqual(2, len(devs)) + self.assertIsInstance(devs[0], vconfig.LibvirtConfigGuestHostdev) + self.assertIsInstance(devs[1], vconfig.LibvirtConfigGuestHostdev) + class GuestBlockTestCase(test.NoDBTestCase): diff --git a/nova/virt/libvirt/guest.py b/nova/virt/libvirt/guest.py index 9264206eb190..d0a975f8b8df 100644 --- a/nova/virt/libvirt/guest.py +++ b/nova/virt/libvirt/guest.py @@ -217,6 +217,36 @@ class Guest(object): conf.parse_dom(node) return conf + def get_all_disks(self): + """Returns all the disks for a guest + + :returns: a list of LibvirtConfigGuestDisk instances + """ + + return self.get_all_devices(vconfig.LibvirtConfigGuestDisk) + + def get_all_devices(self, devtype=None): + """Returns all devices for a guest + + :param devtype: a LibvirtConfigGuestDevice subclass class + + :returns: a list of LibvirtConfigGuestDevice instances + """ + + try: + config = vconfig.LibvirtConfigGuest() + config.parse_str( + self._domain.XMLDesc(0)) + except Exception: + return [] + + devs = [] + for dev in config.devices: + if (devtype is None or + isinstance(dev, devtype)): + devs.append(dev) + return devs + def detach_device(self, conf, persistent=False, live=False): """Detaches device to the guest.