VirtualController: Convert to new style XML props

This commit is contained in:
Cole Robinson 2013-07-15 21:52:18 -04:00
parent 9c92d8e092
commit a9296ec3ae
12 changed files with 80 additions and 240 deletions

View File

@ -176,7 +176,7 @@ def get_basic_paravirt_guest(installer=None):
g.uuid = "12345678-1234-1234-1234-123456789012" g.uuid = "12345678-1234-1234-1234-123456789012"
gdev = VirtualGraphics(_conn) gdev = VirtualGraphics(_conn)
gdev.type = "vnc" gdev.type = "vnc"
gdev.keymap= "ja" gdev.keymap = "ja"
g.add_device(gdev) g.add_device(gdev)
g.vcpus = 5 g.vcpus = 5

View File

@ -768,9 +768,11 @@ class TestXMLConfig(unittest.TestCase):
g.add_device(d) g.add_device(d)
# Controller devices # Controller devices
c1 = VirtualController.get_class_for_type(VirtualController.CONTROLLER_TYPE_IDE)(g.conn) c1 = VirtualController(g.conn)
c1.type = "ide"
c1.index = "3" c1.index = "3"
c2 = VirtualController.get_class_for_type(VirtualController.CONTROLLER_TYPE_VIRTIOSERIAL)(g.conn) c2 = VirtualController(g.conn)
c2.type = "virtio-serial"
c2.ports = "32" c2.ports = "32"
c2.vectors = "17" c2.vectors = "17"
g.add_device(c1) g.add_device(c1)

View File

@ -26,5 +26,6 @@
<master startport='4'/> <master startport='4'/>
<address type='pci' domain='0' bus='0' slot='4' function='2'/> <address type='pci' domain='0' bus='0' slot='4' function='2'/>
</controller> </controller>
<controller type="usb" index="0" model="ich9-ehci1"/>
</devices> </devices>
</domain> </domain>

View File

@ -22,8 +22,10 @@
<controller type="ide" index="1"/> <controller type="ide" index="1"/>
<controller type="virtio-serial" index="7" ports="5"/> <controller type="virtio-serial" index="7" ports="5"/>
<controller type="scsi" index="2"/> <controller type="scsi" index="2"/>
<controller type="usb" index="9" model="ich9-ehci1"> <controller type="usb" index="9" model="ich9-uhci1">
<master startport="2"/>
<address type="pci" domain="0" bus="0" slot="4" function="2"/> <address type="pci" domain="0" bus="0" slot="4" function="2"/>
</controller> </controller>
<controller type="usb" index="0" model="ich9-ehci1"/>
</devices> </devices>
</domain> </domain>

View File

@ -365,25 +365,23 @@ class XMLParseTest(unittest.TestCase):
check = self._make_checker(dev1) check = self._make_checker(dev1)
check("type", "ide") check("type", "ide")
check("index", "3", "1") check("index", 3, 1)
check = self._make_checker(dev2) check = self._make_checker(dev2)
check("type", "virtio-serial") check("type", "virtio-serial")
check("index", "0", "7") check("index", 0, 7)
check("ports", "32", "5") check("ports", 32, 5)
check("vectors", "17", None) check("vectors", 17, None)
check = self._make_checker(dev3) check = self._make_checker(dev3)
check("type", "scsi") check("type", "scsi")
check("index", "1", "2") check("index", 1, 2)
check = self._make_checker(dev4) check = self._make_checker(dev4)
check("type", "usb") check("type", "usb", "foo", "usb")
check("index", "3", "9") check("index", 3, 9)
check("model", "ich9-ehci1") check("model", "ich9-ehci1", "ich9-uhci1")
check("master_startport", 4, 2)
check = self._make_checker(dev4.get_master())
check("startport", "4", "2", None)
self._alter_compare(guest.get_xml_config(), outfile) self._alter_compare(guest.get_xml_config(), outfile)

View File

@ -31,7 +31,7 @@ from virtinst import (VirtualCharDevice,
VirtualVideoDevice, VirtualWatchdog, VirtualVideoDevice, VirtualWatchdog,
VirtualFilesystem, VirtualSmartCardDevice, VirtualFilesystem, VirtualSmartCardDevice,
VirtualRedirDevice, VirtualTPMDevice) VirtualRedirDevice, VirtualTPMDevice)
from virtinst.VirtualController import VirtualControllerSCSI from virtinst import VirtualController
import virtManager.util as util import virtManager.util as util
import virtManager.uihelpers as uihelpers import virtManager.uihelpers as uihelpers
@ -1368,8 +1368,9 @@ class vmmAddHardware(vmmGObjectUI):
disk.vmm_controller = None disk.vmm_controller = None
if (controller_model == "virtio-scsi") and (bus == "scsi"): if (controller_model == "virtio-scsi") and (bus == "scsi"):
controllers = self.vm.get_controller_devices() controllers = self.vm.get_controller_devices()
controller = VirtualControllerSCSI(conn) controller = VirtualController(conn)
controller.set_model(controller_model) controller.type = "scsi"
controller.model = controller_model
disk.vmm_controller = controller disk.vmm_controller = controller
for d in controllers: for d in controllers:
if controller.type == d.type: if controller.type == d.type:

View File

@ -3367,7 +3367,7 @@ class vmmDetails(vmmGObjectUI):
combo = self.widget("controller-model-combo") combo = self.widget("controller-model-combo")
model = combo.get_model() model = combo.get_model()
model.clear() model.clear()
if dev.type == virtinst.VirtualController.CONTROLLER_TYPE_USB: if dev.type == virtinst.VirtualController.TYPE_USB:
model.append(["Default", "Default"]) model.append(["Default", "Default"])
model.append(["ich9-ehci1", "USB 2"]) model.append(["ich9-ehci1", "USB 2"])
self.widget("config-remove").set_sensitive(False) self.widget("config-remove").set_sensitive(False)

View File

@ -419,7 +419,6 @@ class vmmDomain(vmmLibvirtObject):
############################## ##############################
# Rename # Rename
def define_name(self, newname): def define_name(self, newname):
# Do this, so that _guest_to_define has original inactive XML # Do this, so that _guest_to_define has original inactive XML
self._invalidate_xml() self._invalidate_xml()
@ -480,7 +479,6 @@ class vmmDomain(vmmLibvirtObject):
return ret return ret
# CPU define methods # CPU define methods
def define_vcpus(self, vcpus, maxvcpus): def define_vcpus(self, vcpus, maxvcpus):
def change(guest): def change(guest):
guest.vcpus = int(vcpus) guest.vcpus = int(vcpus)
@ -535,7 +533,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change) return self._redefine_guest(change)
# Mem define methods # Mem define methods
def define_both_mem(self, memory, maxmem): def define_both_mem(self, memory, maxmem):
def change(guest): def change(guest):
guest.memory = int(memory) guest.memory = int(memory)
@ -543,7 +540,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change) return self._redefine_guest(change)
# Security define methods # Security define methods
def define_seclabel(self, model, t, label, relabel): def define_seclabel(self, model, t, label, relabel):
def change(guest): def change(guest):
seclabel = guest.seclabel seclabel = guest.seclabel
@ -564,7 +560,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change) return self._redefine_guest(change)
# Machine config define methods # Machine config define methods
def define_acpi(self, newvalue): def define_acpi(self, newvalue):
def change(guest): def change(guest):
guest.features["acpi"] = newvalue guest.features["acpi"] = newvalue
@ -590,7 +585,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change) return self._redefine_guest(change)
# Boot define methods # Boot define methods
def set_boot_device(self, boot_list): def set_boot_device(self, boot_list):
def change(guest): def change(guest):
guest.installer.bootconfig.bootorder = boot_list guest.installer.bootconfig.bootorder = boot_list
@ -611,7 +605,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change) return self._redefine_guest(change)
# Disk define methods # Disk define methods
def define_storage_media(self, devobj, newpath): def define_storage_media(self, devobj, newpath):
def change(editdev): def change(editdev):
editdev.path = newpath editdev.path = newpath
@ -730,7 +723,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj) return self._redefine_device(change, devobj)
# Graphics define methods # Graphics define methods
def define_graphics_password(self, devobj, newval): def define_graphics_password(self, devobj, newval):
def change(editdev): def change(editdev):
editdev.passwd = newval or None editdev.passwd = newval or None
@ -764,7 +756,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj) return self._redefine_device(change, devobj)
# Sound define methods # Sound define methods
def define_sound_model(self, devobj, newmodel): def define_sound_model(self, devobj, newmodel):
def change(editdev): def change(editdev):
if editdev.model != newmodel: if editdev.model != newmodel:
@ -772,8 +763,7 @@ class vmmDomain(vmmLibvirtObject):
editdev.model = newmodel editdev.model = newmodel
return self._redefine_device(change, devobj) return self._redefine_device(change, devobj)
# Vide define methods # Video define methods
def define_video_model(self, devobj, newmodel): def define_video_model(self, devobj, newmodel):
def change(editdev): def change(editdev):
if newmodel == editdev.model: if newmodel == editdev.model:
@ -792,7 +782,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj) return self._redefine_device(change, devobj)
# Watchdog define methods # Watchdog define methods
def define_watchdog_model(self, devobj, newval): def define_watchdog_model(self, devobj, newval):
def change(editdev): def change(editdev):
if editdev.model != newval: if editdev.model != newval:
@ -805,7 +794,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj) return self._redefine_device(change, devobj)
# Smartcard define methods # Smartcard define methods
def define_smartcard_mode(self, devobj, newmodel): def define_smartcard_mode(self, devobj, newmodel):
def change(editdev): def change(editdev):
editdev.mode = newmodel editdev.mode = newmodel
@ -813,7 +801,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj) return self._redefine_device(change, devobj)
# Controller define methods # Controller define methods
def define_controller_model(self, devobj, newmodel): def define_controller_model(self, devobj, newmodel):
def change(editdev): def change(editdev):
ignore = editdev ignore = editdev
@ -821,7 +808,7 @@ class vmmDomain(vmmLibvirtObject):
guest = self._get_guest_to_define() guest = self._get_guest_to_define()
ctrls = guest.get_devices("controller") ctrls = guest.get_devices("controller")
ctrls = [x for x in ctrls if (x.type == ctrls = [x for x in ctrls if (x.type ==
virtinst.VirtualController.CONTROLLER_TYPE_USB)] virtinst.VirtualController.TYPE_USB)]
for dev in ctrls: for dev in ctrls:
guest.remove_device(dev) guest.remove_device(dev)
@ -830,13 +817,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj) return self._redefine_device(change, devobj)
# TPM define methods
def define_tpm_type(self, devobj, newtype):
def change(editdev):
editdev.type = newtype
return self._redefine_device(change, devobj)
#################### ####################

View File

@ -36,7 +36,7 @@ from virtinst.VirtualDevice import VirtualDevice
from virtinst.VirtualDisk import VirtualDisk from virtinst.VirtualDisk import VirtualDisk
from virtinst.VirtualInputDevice import VirtualInputDevice from virtinst.VirtualInputDevice import VirtualInputDevice
from virtinst.VirtualCharDevice import VirtualCharDevice from virtinst.VirtualCharDevice import VirtualCharDevice
from virtinst.VirtualController import VirtualControllerUSB from virtinst.VirtualController import VirtualController
from virtinst.Clock import Clock from virtinst.Clock import Clock
from virtinst.Seclabel import Seclabel from virtinst.Seclabel import Seclabel
from virtinst.CPU import CPU from virtinst.CPU import CPU
@ -721,9 +721,8 @@ class Guest(XMLBuilder):
if origpath: if origpath:
dev.path = origpath dev.path = origpath
def get_vscsi_ctrl_xml(): def get_vscsi_ctrl_xml():
vscsi_class = virtinst.VirtualController.get_class_for_type( ctrl = virtinst.VirtualController(self.conn)
virtinst.VirtualController.CONTROLLER_TYPE_SCSI) ctrl.type = "scsi"
ctrl = vscsi_class(self.conn)
ctrl.set_address("spapr-vio") ctrl.set_address("spapr-vio")
return ctrl.get_xml_config() return ctrl.get_xml_config()
@ -1293,23 +1292,27 @@ class Guest(XMLBuilder):
remove_func(d) remove_func(d)
def add_usb_ich9_controllers(self): def add_usb_ich9_controllers(self):
ctrl = VirtualControllerUSB(self.conn, ctrl = VirtualController(self.conn)
model="ich9-ehci1") ctrl.type = "usb"
ctrl.model = "ich9-ehci1"
self.add_device(ctrl) self.add_device(ctrl)
ctrl = VirtualControllerUSB(self.conn, ctrl = VirtualController(self.conn)
model="ich9-uhci1") ctrl.type = "usb"
ctrl.get_master().startport = 0 ctrl.model = "ich9-uhci1"
ctrl.master_startport = 0
self.add_device(ctrl) self.add_device(ctrl)
ctrl = VirtualControllerUSB(self.conn, ctrl = VirtualController(self.conn)
model="ich9-uhci2") ctrl.type = "usb"
ctrl.get_master().startport = 2 ctrl.model = "ich9-uhci2"
ctrl.master_startport = 2
self.add_device(ctrl) self.add_device(ctrl)
ctrl = VirtualControllerUSB(self.conn, ctrl = VirtualController(self.conn)
model="ich9-uhci3") ctrl.type = "usb"
ctrl.get_master().startport = 4 ctrl.model = "ich9-uhci3"
ctrl.master_startport = 4
self.add_device(ctrl) self.add_device(ctrl)
def _set_defaults(self, devlist_func, remove_func, features): def _set_defaults(self, devlist_func, remove_func, features):

View File

@ -18,194 +18,48 @@
# MA 02110-1301 USA. # MA 02110-1301 USA.
from virtinst.VirtualDevice import VirtualDevice from virtinst.VirtualDevice import VirtualDevice
from virtinst.xmlbuilder import XMLBuilder, XMLProperty from virtinst.xmlbuilder import XMLProperty
import logging
class VirtualController(VirtualDevice): class VirtualController(VirtualDevice):
_virtual_device_type = VirtualDevice.VIRTUAL_DEV_CONTROLLER _virtual_device_type = VirtualDevice.VIRTUAL_DEV_CONTROLLER
CONTROLLER_TYPE_IDE = "ide" TYPE_IDE = "ide"
CONTROLLER_TYPE_FDC = "fdc" TYPE_FDC = "fdc"
CONTROLLER_TYPE_SCSI = "scsi" TYPE_SCSI = "scsi"
CONTROLLER_TYPE_SATA = "sata" TYPE_SATA = "sata"
CONTROLLER_TYPE_VIRTIOSERIAL = "virtio-serial" TYPE_VIRTIOSERIAL = "virtio-serial"
CONTROLLER_TYPE_USB = "usb" TYPE_USB = "usb"
CONTROLLER_TYPE_PCI = "pci" TYPE_PCI = "pci"
CONTROLLER_TYPE_CCID = "ccid" TYPE_CCID = "ccid"
CONTROLLER_TYPES = [CONTROLLER_TYPE_IDE, CONTROLLER_TYPE_FDC, TYPES = [TYPE_IDE, TYPE_FDC,
CONTROLLER_TYPE_SCSI, CONTROLLER_TYPE_SATA, TYPE_SCSI, TYPE_SATA,
CONTROLLER_TYPE_VIRTIOSERIAL, CONTROLLER_TYPE_USB, TYPE_VIRTIOSERIAL, TYPE_USB,
CONTROLLER_TYPE_PCI, CONTROLLER_TYPE_CCID] TYPE_PCI, TYPE_CCID]
@staticmethod @staticmethod
def pretty_type(ctype): def pretty_type(ctype):
pretty_mappings = { pretty_mappings = {
VirtualController.CONTROLLER_TYPE_IDE : "IDE", VirtualController.TYPE_IDE : "IDE",
VirtualController.CONTROLLER_TYPE_FDC : "Floppy", VirtualController.TYPE_FDC : "Floppy",
VirtualController.CONTROLLER_TYPE_SCSI : "SCSI", VirtualController.TYPE_SCSI : "SCSI",
VirtualController.CONTROLLER_TYPE_SATA : "SATA", VirtualController.TYPE_SATA : "SATA",
VirtualController.CONTROLLER_TYPE_VIRTIOSERIAL : "Virtio Serial", VirtualController.TYPE_VIRTIOSERIAL : "Virtio Serial",
VirtualController.CONTROLLER_TYPE_USB : "USB", VirtualController.TYPE_USB : "USB",
VirtualController.CONTROLLER_TYPE_PCI : "PCI", VirtualController.TYPE_PCI : "PCI",
VirtualController.CONTROLLER_TYPE_CCID : "CCID", VirtualController.TYPE_CCID : "CCID",
} }
if ctype not in pretty_mappings: if ctype not in pretty_mappings:
return ctype return ctype
return pretty_mappings[ctype] return pretty_mappings[ctype]
@staticmethod _XML_PROP_ORDER = ["type", "index", "model"]
def get_class_for_type(ctype):
if ctype not in VirtualController.CONTROLLER_TYPES:
raise ValueError("Unknown controller type '%s'" % ctype)
if ctype == VirtualController.CONTROLLER_TYPE_IDE: type = XMLProperty(xpath="./@type")
return VirtualControllerIDE model = XMLProperty(xpath="./@model")
elif ctype == VirtualController.CONTROLLER_TYPE_FDC: vectors = XMLProperty(xpath="./@vectors", is_int=True)
return VirtualControllerFDC ports = XMLProperty(xpath="./@ports", is_int=True)
elif ctype == VirtualController.CONTROLLER_TYPE_SCSI: master_startport = XMLProperty(xpath="./master/@startport", is_int=True)
return VirtualControllerSCSI
elif ctype == VirtualController.CONTROLLER_TYPE_SATA:
return VirtualControllerSATA
elif ctype == VirtualController.CONTROLLER_TYPE_VIRTIOSERIAL:
return VirtualControllerVirtioSerial
elif ctype == VirtualController.CONTROLLER_TYPE_USB:
return VirtualControllerUSB
_controller_type = None index = XMLProperty(xpath="./@index", is_int=True, default_cb=lambda s: 0)
def __init__(self, conn, parsexml=None, parsexmlnode=None, model=None):
VirtualDevice.__init__(self, conn, parsexml, parsexmlnode)
self._index = 0
self._ports = None
self._vectors = None
self._model = None
self._master = VirtualDeviceMaster(conn,
parsexml=parsexml,
parsexmlnode=parsexmlnode)
if self._is_parse():
return
self.model = model
def get_type(self):
return self._controller_type
type = XMLProperty(get_type,
xpath="./@type")
def get_model(self):
return self._model
def set_model(self, model):
self._model = model
model = XMLProperty(get_model, set_model,
xpath="./@model")
def get_index(self):
return self._index
def set_index(self, val):
self._index = int(val)
index = XMLProperty(get_index, set_index,
xpath="./@index")
def get_vectors(self):
return self._vectors
def set_vectors(self, val):
self._vectors = val
vectors = XMLProperty(get_vectors, set_vectors,
xpath="./@vectors")
def get_ports(self):
return self._ports
def set_ports(self, val):
self._ports = val
ports = XMLProperty(get_ports, set_ports,
xpath="./@ports")
def set_master(self, masterstr):
self._master.parse_friendly_master(masterstr)
def get_master(self):
return self._master
def _extra_config(self):
return ""
def _get_xml_config(self):
extra = self._extra_config()
xml = " <controller type='%s' index='%s'" % (self.type, self.index)
if self.model:
xml += " model='%s'" % self.model
xml += extra
childxml = self.indent(self._master.get_xml_config(), 6)
if childxml:
childxml += "\n"
if len(childxml) == 0:
return xml + "/>"
xml += ">\n"
xml += childxml
xml += " </controller>"
return xml
class VirtualControllerIDE(VirtualController):
_controller_type = VirtualController.CONTROLLER_TYPE_IDE
class VirtualControllerFDC(VirtualController):
_controller_type = VirtualController.CONTROLLER_TYPE_FDC
class VirtualControllerSCSI(VirtualController):
_controller_type = VirtualController.CONTROLLER_TYPE_SCSI
class VirtualControllerSATA(VirtualController):
_controller_type = VirtualController.CONTROLLER_TYPE_SATA
class VirtualControllerVirtioSerial(VirtualController):
_controller_type = VirtualController.CONTROLLER_TYPE_VIRTIOSERIAL
def _extra_config(self):
xml = ""
if self.ports is not None:
xml += " ports='%s'" % self.ports
if self.vectors is not None:
xml += " vectors='%s'" % self.vectors
return xml
class VirtualControllerUSB(VirtualController):
_controller_type = VirtualController.CONTROLLER_TYPE_USB
class VirtualDeviceMaster(XMLBuilder):
def __init__(self, conn, parsexml=None, parsexmlnode=None):
XMLBuilder.__init__(self, conn, parsexml, parsexmlnode)
self._startport = None
def parse_friendly_master(self, masterstr):
try:
int(masterstr)
self._startport = masterstr
except:
logging.exception("Error parsing device master.")
return None
def _get_startport(self):
return self._startport
def _set_startport(self, val):
self._startport = val
startport = XMLProperty(_get_startport, _set_startport, xpath="./master/@startport")
def _get_xml_config(self):
if self.startport is None:
return
return "<master startport='%s'/>" % self.startport

View File

@ -1639,21 +1639,20 @@ def parse_controller(guest, optstring, dev=None):
# Peel the mode off the front # Peel the mode off the front
opts = parse_optstr(optstring, remove_first="type") opts = parse_optstr(optstring, remove_first="type")
ctrltype = get_opt_param(opts, "type")
address = get_opt_param(opts, "address") address = get_opt_param(opts, "address")
master = get_opt_param(opts, "master")
if not dev: if not dev:
cl = virtinst.VirtualController.get_class_for_type(ctrltype) dev = virtinst.VirtualController(guest.conn)
dev = cl(guest.conn, model=opts.get("model"))
set_param = _build_set_param(dev, opts) set_param = _build_set_param(dev, opts)
set_param("type", "type")
set_param("model", "model") set_param("model", "model")
set_param("index", "index") set_param("index", "index")
dev.set_address(address) set_param("master_startport", "master")
if master: if address:
dev.set_master(master) dev.set_address(address)
if opts: if opts:
raise ValueError(_("Unknown options %s") % opts.keys()) raise ValueError(_("Unknown options %s") % opts.keys())

View File

@ -438,10 +438,10 @@ class XMLProperty(property):
return None return None
return bool(val) return bool(val)
elif self._is_int and val is not None: elif self._is_int and val is not None:
base = 10 intkwargs = {}
if "0x" in str(val): if "0x" in str(val):
base = 16 intkwargs["base"] = 16
return int(val, base=base) return int(val, **intkwargs)
elif self._convert_value_for_getter_cb: elif self._convert_value_for_getter_cb:
return self._convert_value_for_getter_cb(xmlbuilder, val) return self._convert_value_for_getter_cb(xmlbuilder, val)
elif self._is_multi and val is None: elif self._is_multi and val is None: