From 4dd167378d33e3efee4657251655fc2992da2764 Mon Sep 17 00:00:00 2001 From: Jim Fehlig Date: Wed, 15 Aug 2012 09:42:12 -0600 Subject: 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 --- nova/virt/libvirt/config.py | 8 ++++++++ nova/virt/libvirt/driver.py | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) (limited to 'nova/virt') 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 -- cgit