virtinst: use libvirt getCPUModelNames when available

Read the list of CPU models trough getCPUModelNames instead of
accessing directly the file cpu_map.xml.

Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1060316

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
Giuseppe Scrivano 2014-03-13 12:52:51 +01:00
parent 6c2645f0d2
commit 81696a5144
4 changed files with 54 additions and 18 deletions

View File

@ -18,6 +18,7 @@
import os import os
import unittest import unittest
from tests import utils
from virtinst import CapabilitiesParser as capabilities from virtinst import CapabilitiesParser as capabilities
@ -221,13 +222,12 @@ class TestCapabilities(unittest.TestCase):
def testCPUMap(self): def testCPUMap(self):
caps = self._buildCaps("libvirt-0.7.6-qemu-caps.xml") caps = self._buildCaps("libvirt-0.7.6-qemu-caps.xml")
cpu_64 = caps.get_cpu_values("x86_64") cpu_64 = caps.get_cpu_values(None, "x86_64")
cpu_32 = caps.get_cpu_values("i486") cpu_32 = caps.get_cpu_values(None, "i486")
cpu_random = caps.get_cpu_values("mips") cpu_random = caps.get_cpu_values(None, "mips")
def test_cpu_map(cpumap, cpus): def test_cpu_map(cpumap, cpus):
cpunames = sorted([c.model for c in cpumap.cpus], cpunames = sorted([c.model for c in cpumap], key=str.lower)
key=str.lower)
for c in cpus: for c in cpus:
self.assertTrue(c in cpunames) self.assertTrue(c in cpunames)
@ -243,5 +243,10 @@ class TestCapabilities(unittest.TestCase):
test_cpu_map(cpu_64, x86_cpunames) test_cpu_map(cpu_64, x86_cpunames)
test_cpu_map(cpu_random, []) test_cpu_map(cpu_random, [])
conn = utils.open_testdriver()
cpu_64 = caps.get_cpu_values(conn, "x86_64")
self.assertTrue(len(cpu_64) > 0)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -975,7 +975,8 @@ class vmmDetails(vmmGObjectUI):
no_default = not self.is_customize_dialog no_default = not self.is_customize_dialog
try: try:
cpu_names = caps.get_cpu_values(self.vm.get_arch()).cpus cpu_names = caps.get_cpu_values(self.conn.get_backend(),
self.vm.get_arch())
except: except:
cpu_names = [] cpu_names = []
logging.exception("Error populating CPU model list") logging.exception("Error populating CPU model list")

View File

@ -77,12 +77,32 @@ class CPUValuesArch(object):
class CPUValues(object): class CPUValues(object):
""" """
Lists valid values for domain <cpu> parameters, parsed from libvirt's Lists valid values for cpu models obtained trough libvirt's getCPUModelNames
local cpu_map.xml
""" """
def __init__(self, cpu_filename=None): def __init__(self):
self._cpus = None
def get_cpus(self, arch, conn):
if self._cpus is not None:
return self._cpus
if (conn and
conn.check_support(conn.SUPPORT_CONN_CPU_MODEL_NAMES)):
self._cpus = [CPUValuesModel(i) for i in
conn.libvirtconn.getCPUModelNames(arch, 0)]
return self._cpus
return []
class CPUMapFileValues(CPUValues):
"""
Fallback method to lists cpu models, parsed directly from libvirt's local
cpu_map.xml
"""
def __init__(self):
CPUValues.__init__(self)
self.archmap = {} self.archmap = {}
if not cpu_filename:
cpu_filename = "/usr/share/libvirt/cpu_map.xml" cpu_filename = "/usr/share/libvirt/cpu_map.xml"
xml = file(cpu_filename).read() xml = file(cpu_filename).read()
@ -99,7 +119,8 @@ class CPUValues(object):
child = child.next child = child.next
def get_arch(self, arch): def get_cpus(self, arch, conn):
ignore = conn
if not arch: if not arch:
return None return None
if re.match(r'i[4-9]86', arch): if re.match(r'i[4-9]86', arch):
@ -112,7 +133,7 @@ class CPUValues(object):
cpumap = CPUValuesArch(arch) cpumap = CPUValuesArch(arch)
self.archmap[arch] = cpumap self.archmap[arch] = cpumap
return cpumap return cpumap.cpus
class Features(object): class Features(object):
@ -595,12 +616,19 @@ class Capabilities(object):
self.guests.append(Guest(child)) self.guests.append(Guest(child))
child = child.next child = child.next
def get_cpu_values(self, arch): def get_cpu_values(self, conn, arch):
if not self._cpu_values: if self._cpu_values:
self._cpu_values = CPUValues() return self._cpu_values.get_cpus(arch, conn)
return self._cpu_values.get_arch(arch) # Iterate over the available methods until a set of CPU models is found
for mode in (CPUValues, CPUMapFileValues):
cpu_values = mode()
cpus = cpu_values.get_cpus(arch, conn)
if cpus and len(cpus) > 0:
self._cpu_values = cpu_values
return cpus
return []
def guest_lookup(self, os_type=None, arch=None, typ=None, machine=None): def guest_lookup(self, os_type=None, arch=None, typ=None, machine=None):
""" """

View File

@ -1,7 +1,7 @@
# #
# Helper functions for determining if libvirt supports certain features # Helper functions for determining if libvirt supports certain features
# #
# Copyright 2009, 2013 Red Hat, Inc. # Copyright 2009, 2013, 2014 Red Hat, Inc.
# Cole Robinson <crobinso@redhat.com> # Cole Robinson <crobinso@redhat.com>
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@ -291,6 +291,8 @@ SUPPORT_CONN_DEVICE_BOOTORDER = _make(
SUPPORT_CONN_INPUT_KEYBOARD = _make( SUPPORT_CONN_INPUT_KEYBOARD = _make(
version="1.2.2", hv_version={"qemu": 0, "test": 0}) version="1.2.2", hv_version={"qemu": 0, "test": 0})
SUPPORT_CONN_POOL_GLUSTERFS = _make(version="1.2.0") SUPPORT_CONN_POOL_GLUSTERFS = _make(version="1.2.0")
SUPPORT_CONN_CPU_MODEL_NAMES = _make(function="virConnect.getCPUModelNames",
run_args=("x86_64", 0))
# Domain checks # Domain checks