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.