mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-01-25 06:03:55 +03:00
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:
parent
6c2645f0d2
commit
81696a5144
@ -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()
|
||||||
|
@ -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")
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user