diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py
index cd370cb3621d..3fdfa120f703 100644
--- a/nova/tests/test_libvirt.py
+++ b/nova/tests/test_libvirt.py
@@ -693,6 +693,66 @@ class LibvirtConnTestCase(test.TestCase):
devices = conn.get_all_block_devices()
self.assertEqual(devices, ['/path/to/dev/1', '/path/to/dev/3'])
+ def test_get_disks(self):
+ xml = [
+ # NOTE(vish): id 0 is skipped
+ None,
+ """
+
+
+
+
+
+
+
+
+
+
+
+
+ """,
+ """
+
+
+
+
+
+
+
+
+ """,
+ """
+
+
+
+
+
+
+
+
+
+
+
+
+ """,
+ ]
+
+ def fake_lookup(id):
+ return FakeVirtDomain(xml[id])
+
+ def fake_lookup_name(name):
+ return FakeVirtDomain(xml[1])
+
+ self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn')
+ connection.LibvirtConnection._conn.listDomainsID = lambda: range(4)
+ connection.LibvirtConnection._conn.lookupByID = fake_lookup
+ connection.LibvirtConnection._conn.lookupByName = fake_lookup_name
+
+ self.mox.ReplayAll()
+ conn = connection.LibvirtConnection(False)
+ devices = conn.get_disks(conn.list_instances()[0])
+ self.assertEqual(devices, ['vda', 'vdb'])
+
@test.skip_if(missing_libvirt(), "Test requires libvirt")
def test_snapshot_in_ami_format(self):
self.flags(image_service='nova.image.fake.FakeImageService')
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py
index 5ceca9f487b7..bd4b106f4c68 100644
--- a/nova/virt/libvirt/connection.py
+++ b/nova/virt/libvirt/connection.py
@@ -1773,30 +1773,15 @@ class LibvirtConnection(driver.ComputeDriver):
"""
domain = self._lookup_by_name(instance_name)
xml = domain.XMLDesc(0)
- doc = None
try:
doc = etree.fromstring(xml)
except Exception:
return []
- disks = []
-
- ret = doc.findall('./devices/disk')
-
- for node in ret:
- devdst = None
-
- for child in node.children:
- if child.name == 'target':
- devdst = child.prop('dev')
-
- if devdst is None:
- continue
-
- disks.append(devdst)
-
- return disks
+ return filter(bool,
+ [target.get("dev") \
+ for target in doc.findall('devices/disk/target')])
def get_interfaces(self, instance_name):
"""