summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorDavid Shrewsbury <shrewsbury.dave@gmail.com>2012-06-29 12:18:50 -0400
committerDavid Shrewsbury <shrewsbury.dave@gmail.com>2012-06-29 16:50:30 -0400
commitdabbb82904928fa5c020a1cbb13ff679781f1745 (patch)
treebae2ba8238f8627cfebf74af6f42fe875576ea37 /nova
parent1a4cb537e402a9cfb8f2a007c4033b2da90828f6 (diff)
downloadnova-dabbb82904928fa5c020a1cbb13ff679781f1745.tar.gz
nova-dabbb82904928fa5c020a1cbb13ff679781f1745.tar.xz
nova-dabbb82904928fa5c020a1cbb13ff679781f1745.zip
Add check for no domains in libvirt driver.
A check is needed to see if there are any domains before calling the listDomainsID() method. This check is needed to add support for OpenVZ which will throw an exception from this method if there are no domains. The 'virsh' source code does this check, too. This change circumvents this libvirt bug: https://bugzilla.redhat.com/show_bug.cgi?id=836647 Change-Id: Ia71d996722a1b531e720e91c1fa68f561ad4d58d
Diffstat (limited to 'nova')
-rw-r--r--nova/tests/fakelibvirt.py3
-rw-r--r--nova/tests/test_libvirt.py3
-rw-r--r--nova/virt/libvirt/driver.py16
3 files changed, 17 insertions, 5 deletions
diff --git a/nova/tests/fakelibvirt.py b/nova/tests/fakelibvirt.py
index 4350a8878..d533760b9 100644
--- a/nova/tests/fakelibvirt.py
+++ b/nova/tests/fakelibvirt.py
@@ -478,6 +478,9 @@ class Connection(object):
node_cores,
node_threads]
+ def numOfDomains(self):
+ return len(self._running_vms)
+
def listDomainsID(self):
return self._running_vms.keys()
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py
index 55e8286ad..55163b4c4 100644
--- a/nova/tests/test_libvirt.py
+++ b/nova/tests/test_libvirt.py
@@ -759,6 +759,7 @@ class LibvirtConnTestCase(test.TestCase):
def test_list_instances(self):
self.mox.StubOutWithMock(libvirt_driver.LibvirtDriver, '_conn')
libvirt_driver.LibvirtDriver._conn.lookupByID = self.fake_lookup
+ libvirt_driver.LibvirtDriver._conn.numOfDomains = lambda: 2
libvirt_driver.LibvirtDriver._conn.listDomainsID = lambda: [0, 1]
self.mox.ReplayAll()
@@ -810,6 +811,7 @@ class LibvirtConnTestCase(test.TestCase):
return FakeVirtDomain(xml[id])
self.mox.StubOutWithMock(libvirt_driver.LibvirtDriver, '_conn')
+ libvirt_driver.LibvirtDriver._conn.numOfDomains = lambda: 4
libvirt_driver.LibvirtDriver._conn.listDomainsID = lambda: range(4)
libvirt_driver.LibvirtDriver._conn.lookupByID = fake_lookup
@@ -869,6 +871,7 @@ class LibvirtConnTestCase(test.TestCase):
return FakeVirtDomain(xml[1])
self.mox.StubOutWithMock(libvirt_driver.LibvirtDriver, '_conn')
+ libvirt_driver.LibvirtDriver._conn.numOfDomains = lambda: 4
libvirt_driver.LibvirtDriver._conn.listDomainsID = lambda: range(4)
libvirt_driver.LibvirtDriver._conn.lookupByID = fake_lookup
libvirt_driver.LibvirtDriver._conn.lookupByName = fake_lookup_name
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index 96ae61d70..1c9a755bf 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -390,9 +390,15 @@ class LibvirtDriver(driver.ComputeDriver):
except libvirt.libvirtError:
return False
+ # TODO(Shrews): Remove when libvirt Bugzilla bug # 836647 is fixed.
+ def list_instance_ids(self):
+ if self._conn.numOfDomains() == 0:
+ return []
+ return self._conn.listDomainsID()
+
def list_instances(self):
return [self._conn.lookupByID(x).name()
- for x in self._conn.listDomainsID()
+ for x in self.list_instance_ids()
if x != 0] # We skip domains with ID 0 (hypervisors).
@staticmethod
@@ -415,7 +421,7 @@ class LibvirtDriver(driver.ComputeDriver):
def list_instances_detail(self):
infos = []
- for domain_id in self._conn.listDomainsID():
+ for domain_id in self.list_instance_ids():
domain = self._conn.lookupByID(domain_id)
info = self._map_to_instance_info(domain)
infos.append(info)
@@ -1811,7 +1817,7 @@ class LibvirtDriver(driver.ComputeDriver):
Return all block devices in use on this node.
"""
devices = []
- for dom_id in self._conn.listDomainsID():
+ for dom_id in self.list_instance_ids():
domain = self._conn.lookupByID(dom_id)
try:
doc = etree.fromstring(domain.XMLDesc(0))
@@ -1925,7 +1931,7 @@ class LibvirtDriver(driver.ComputeDriver):
"""
total = 0
- for dom_id in self._conn.listDomainsID():
+ for dom_id in self.list_instance_ids():
dom = self._conn.lookupByID(dom_id)
vcpus = dom.vcpus()
if vcpus is None:
@@ -1952,7 +1958,7 @@ class LibvirtDriver(driver.ComputeDriver):
idx3 = m.index('Cached:')
if FLAGS.libvirt_type == 'xen':
used = 0
- for domain_id in self._conn.listDomainsID():
+ for domain_id in self.list_instance_ids():
# skip dom0
dom_mem = int(self._conn.lookupByID(domain_id).info()[2])
if domain_id != 0: