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

View File

@ -975,7 +975,8 @@ class vmmDetails(vmmGObjectUI):
no_default = not self.is_customize_dialog
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:
cpu_names = []
logging.exception("Error populating CPU model list")

View File

@ -77,13 +77,33 @@ class CPUValuesArch(object):
class CPUValues(object):
"""
Lists valid values for domain <cpu> parameters, parsed from libvirt's
local cpu_map.xml
Lists valid values for cpu models obtained trough libvirt's getCPUModelNames
"""
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 = {}
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()
util.parse_node_helper(xml, "cpus",
@ -99,7 +119,8 @@ class CPUValues(object):
child = child.next
def get_arch(self, arch):
def get_cpus(self, arch, conn):
ignore = conn
if not arch:
return None
if re.match(r'i[4-9]86', arch):
@ -112,7 +133,7 @@ class CPUValues(object):
cpumap = CPUValuesArch(arch)
self.archmap[arch] = cpumap
return cpumap
return cpumap.cpus
class Features(object):
@ -595,12 +616,19 @@ class Capabilities(object):
self.guests.append(Guest(child))
child = child.next
def get_cpu_values(self, arch):
if not self._cpu_values:
self._cpu_values = CPUValues()
def get_cpu_values(self, conn, arch):
if self._cpu_values:
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):
"""

View File

@ -1,7 +1,7 @@
#
# 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>
#
# 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(
version="1.2.2", hv_version={"qemu": 0, "test": 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