summaryrefslogtreecommitdiffstats
path: root/nova/virt
diff options
context:
space:
mode:
authorJim Fehlig <jfehlig@suse.com>2012-08-15 09:42:12 -0600
committerJim Fehlig <jfehlig@suse.com>2012-08-15 14:37:00 -0600
commit4dd167378d33e3efee4657251655fc2992da2764 (patch)
tree2062bb464cdfd05a87a600f1990c50886cf929b2 /nova/virt
parent40a34547198b8eb32e4afbcf57b5d8f9207b35f3 (diff)
Collect instance capabilities from compute nodes
This change collects a list of supported instances from compute nodes. Each supported instance is a tuple, containing the triple (architecture, hypervisor_type, vm_mode). This list of tuples describes all of the instances supported by the compute node, which can then be used by the ComputeFilter to ensure proper placement of an instance in a heterogeneous compute node cloud. Change-Id: I059ff55c165b372c83e63390b40a2c165df1f717
Diffstat (limited to 'nova/virt')
-rw-r--r--nova/virt/libvirt/config.py8
-rw-r--r--nova/virt/libvirt/driver.py20
2 files changed, 28 insertions, 0 deletions
diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py
index a53ed640f..8a924df56 100644
--- a/nova/virt/libvirt/config.py
+++ b/nova/virt/libvirt/config.py
@@ -133,6 +133,7 @@ class LibvirtConfigCapsGuest(LibvirtConfigObject):
self.arch = None
self.ostype = None
+ self.domtype = list()
def parse_dom(self, xmldoc):
super(LibvirtConfigCapsGuest, self).parse_dom(xmldoc)
@@ -142,6 +143,9 @@ class LibvirtConfigCapsGuest(LibvirtConfigObject):
self.ostype = c.text
elif c.tag == "arch":
self.arch = c.get("name")
+ for sc in c.getchildren():
+ if sc.tag == "domain":
+ self.domtype.append(sc.get("type"))
def format_dom(self):
caps = super(LibvirtConfigCapsGuest, self).format_dom()
@@ -150,6 +154,10 @@ class LibvirtConfigCapsGuest(LibvirtConfigObject):
caps.append(self._text_node("os_type", self.ostype))
if self.arch:
arch = etree.Element("arch", name=self.arch)
+ for dt in self.domtype:
+ dte = etree.Element("domain")
+ dte.set("type", dt)
+ arch.append(dte)
caps.append(arch)
return caps
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index bf3cec403..6abce222d 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -2055,6 +2055,24 @@ class LibvirtDriver(driver.ComputeDriver):
"""Returns the hostname of the hypervisor."""
return self._conn.getHostname()
+ def get_instance_capabilities(self):
+ """Get hypervisor instance capabilities
+
+ Returns a list of tuples that describe instances the
+ hypervisor is capable of hosting. Each tuple consists
+ of the triplet (arch, hypervisor_type, vm_mode).
+
+ :returns: List of tuples describing instance capabilities
+ """
+ caps = self.get_host_capabilities()
+ instance_caps = list()
+ for g in caps.guests:
+ for dt in g.domtype:
+ instance_cap = (g.arch, dt, g.ostype)
+ instance_caps.append(instance_cap)
+
+ return instance_caps
+
def get_cpu_info(self):
"""Get cpuinfo information.
@@ -2991,6 +3009,8 @@ class HostState(object):
data["hypervisor_type"] = self.connection.get_hypervisor_type()
data["hypervisor_version"] = self.connection.get_hypervisor_version()
data["hypervisor_hostname"] = self.connection.get_hypervisor_hostname()
+ data["supported_instances"] = \
+ self.connection.get_instance_capabilities()
self._stats = data