diff --git a/tests/utils.py b/tests/utils.py
index 3bb351a1c..71663358b 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -176,7 +176,7 @@ def get_basic_paravirt_guest(installer=None):
g.uuid = "12345678-1234-1234-1234-123456789012"
gdev = VirtualGraphics(_conn)
gdev.type = "vnc"
- gdev.keymap= "ja"
+ gdev.keymap = "ja"
g.add_device(gdev)
g.vcpus = 5
diff --git a/tests/xmlconfig.py b/tests/xmlconfig.py
index 3ed34c8be..59e78fcf7 100644
--- a/tests/xmlconfig.py
+++ b/tests/xmlconfig.py
@@ -768,9 +768,11 @@ class TestXMLConfig(unittest.TestCase):
g.add_device(d)
# Controller devices
- c1 = VirtualController.get_class_for_type(VirtualController.CONTROLLER_TYPE_IDE)(g.conn)
+ c1 = VirtualController(g.conn)
+ c1.type = "ide"
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.vectors = "17"
g.add_device(c1)
diff --git a/tests/xmlparse-xml/change-controllers-in.xml b/tests/xmlparse-xml/change-controllers-in.xml
index f26e6b11c..525e77584 100644
--- a/tests/xmlparse-xml/change-controllers-in.xml
+++ b/tests/xmlparse-xml/change-controllers-in.xml
@@ -26,5 +26,6 @@
+
diff --git a/tests/xmlparse-xml/change-controllers-out.xml b/tests/xmlparse-xml/change-controllers-out.xml
index 5b2145483..ecd0b2deb 100644
--- a/tests/xmlparse-xml/change-controllers-out.xml
+++ b/tests/xmlparse-xml/change-controllers-out.xml
@@ -22,8 +22,10 @@
-
+
+
+
diff --git a/tests/xmlparse.py b/tests/xmlparse.py
index f02acd642..70870f22a 100644
--- a/tests/xmlparse.py
+++ b/tests/xmlparse.py
@@ -365,25 +365,23 @@ class XMLParseTest(unittest.TestCase):
check = self._make_checker(dev1)
check("type", "ide")
- check("index", "3", "1")
+ check("index", 3, 1)
check = self._make_checker(dev2)
check("type", "virtio-serial")
- check("index", "0", "7")
- check("ports", "32", "5")
- check("vectors", "17", None)
+ check("index", 0, 7)
+ check("ports", 32, 5)
+ check("vectors", 17, None)
check = self._make_checker(dev3)
check("type", "scsi")
- check("index", "1", "2")
+ check("index", 1, 2)
check = self._make_checker(dev4)
- check("type", "usb")
- check("index", "3", "9")
- check("model", "ich9-ehci1")
-
- check = self._make_checker(dev4.get_master())
- check("startport", "4", "2", None)
+ check("type", "usb", "foo", "usb")
+ check("index", 3, 9)
+ check("model", "ich9-ehci1", "ich9-uhci1")
+ check("master_startport", 4, 2)
self._alter_compare(guest.get_xml_config(), outfile)
diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py
index 4f4004825..7aa517f50 100644
--- a/virtManager/addhardware.py
+++ b/virtManager/addhardware.py
@@ -31,7 +31,7 @@ from virtinst import (VirtualCharDevice,
VirtualVideoDevice, VirtualWatchdog,
VirtualFilesystem, VirtualSmartCardDevice,
VirtualRedirDevice, VirtualTPMDevice)
-from virtinst.VirtualController import VirtualControllerSCSI
+from virtinst import VirtualController
import virtManager.util as util
import virtManager.uihelpers as uihelpers
@@ -1368,8 +1368,9 @@ class vmmAddHardware(vmmGObjectUI):
disk.vmm_controller = None
if (controller_model == "virtio-scsi") and (bus == "scsi"):
controllers = self.vm.get_controller_devices()
- controller = VirtualControllerSCSI(conn)
- controller.set_model(controller_model)
+ controller = VirtualController(conn)
+ controller.type = "scsi"
+ controller.model = controller_model
disk.vmm_controller = controller
for d in controllers:
if controller.type == d.type:
diff --git a/virtManager/details.py b/virtManager/details.py
index bdfdc2fbf..9b7062a43 100644
--- a/virtManager/details.py
+++ b/virtManager/details.py
@@ -3367,7 +3367,7 @@ class vmmDetails(vmmGObjectUI):
combo = self.widget("controller-model-combo")
model = combo.get_model()
model.clear()
- if dev.type == virtinst.VirtualController.CONTROLLER_TYPE_USB:
+ if dev.type == virtinst.VirtualController.TYPE_USB:
model.append(["Default", "Default"])
model.append(["ich9-ehci1", "USB 2"])
self.widget("config-remove").set_sensitive(False)
diff --git a/virtManager/domain.py b/virtManager/domain.py
index 5b4e48eba..d2178bf10 100644
--- a/virtManager/domain.py
+++ b/virtManager/domain.py
@@ -419,7 +419,6 @@ class vmmDomain(vmmLibvirtObject):
##############################
# Rename
-
def define_name(self, newname):
# Do this, so that _guest_to_define has original inactive XML
self._invalidate_xml()
@@ -480,7 +479,6 @@ class vmmDomain(vmmLibvirtObject):
return ret
# CPU define methods
-
def define_vcpus(self, vcpus, maxvcpus):
def change(guest):
guest.vcpus = int(vcpus)
@@ -535,7 +533,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change)
# Mem define methods
-
def define_both_mem(self, memory, maxmem):
def change(guest):
guest.memory = int(memory)
@@ -543,7 +540,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change)
# Security define methods
-
def define_seclabel(self, model, t, label, relabel):
def change(guest):
seclabel = guest.seclabel
@@ -564,7 +560,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change)
# Machine config define methods
-
def define_acpi(self, newvalue):
def change(guest):
guest.features["acpi"] = newvalue
@@ -590,7 +585,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change)
# Boot define methods
-
def set_boot_device(self, boot_list):
def change(guest):
guest.installer.bootconfig.bootorder = boot_list
@@ -611,7 +605,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_guest(change)
# Disk define methods
-
def define_storage_media(self, devobj, newpath):
def change(editdev):
editdev.path = newpath
@@ -730,7 +723,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj)
# Graphics define methods
-
def define_graphics_password(self, devobj, newval):
def change(editdev):
editdev.passwd = newval or None
@@ -764,7 +756,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj)
# Sound define methods
-
def define_sound_model(self, devobj, newmodel):
def change(editdev):
if editdev.model != newmodel:
@@ -772,8 +763,7 @@ class vmmDomain(vmmLibvirtObject):
editdev.model = newmodel
return self._redefine_device(change, devobj)
- # Vide define methods
-
+ # Video define methods
def define_video_model(self, devobj, newmodel):
def change(editdev):
if newmodel == editdev.model:
@@ -792,7 +782,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj)
# Watchdog define methods
-
def define_watchdog_model(self, devobj, newval):
def change(editdev):
if editdev.model != newval:
@@ -805,7 +794,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj)
# Smartcard define methods
-
def define_smartcard_mode(self, devobj, newmodel):
def change(editdev):
editdev.mode = newmodel
@@ -813,7 +801,6 @@ class vmmDomain(vmmLibvirtObject):
return self._redefine_device(change, devobj)
# Controller define methods
-
def define_controller_model(self, devobj, newmodel):
def change(editdev):
ignore = editdev
@@ -821,7 +808,7 @@ class vmmDomain(vmmLibvirtObject):
guest = self._get_guest_to_define()
ctrls = guest.get_devices("controller")
ctrls = [x for x in ctrls if (x.type ==
- virtinst.VirtualController.CONTROLLER_TYPE_USB)]
+ virtinst.VirtualController.TYPE_USB)]
for dev in ctrls:
guest.remove_device(dev)
@@ -830,13 +817,6 @@ class vmmDomain(vmmLibvirtObject):
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)
-
####################
diff --git a/virtinst/Guest.py b/virtinst/Guest.py
index e5f253fe0..6bb035635 100644
--- a/virtinst/Guest.py
+++ b/virtinst/Guest.py
@@ -36,7 +36,7 @@ from virtinst.VirtualDevice import VirtualDevice
from virtinst.VirtualDisk import VirtualDisk
from virtinst.VirtualInputDevice import VirtualInputDevice
from virtinst.VirtualCharDevice import VirtualCharDevice
-from virtinst.VirtualController import VirtualControllerUSB
+from virtinst.VirtualController import VirtualController
from virtinst.Clock import Clock
from virtinst.Seclabel import Seclabel
from virtinst.CPU import CPU
@@ -721,9 +721,8 @@ class Guest(XMLBuilder):
if origpath:
dev.path = origpath
def get_vscsi_ctrl_xml():
- vscsi_class = virtinst.VirtualController.get_class_for_type(
- virtinst.VirtualController.CONTROLLER_TYPE_SCSI)
- ctrl = vscsi_class(self.conn)
+ ctrl = virtinst.VirtualController(self.conn)
+ ctrl.type = "scsi"
ctrl.set_address("spapr-vio")
return ctrl.get_xml_config()
@@ -1293,23 +1292,27 @@ class Guest(XMLBuilder):
remove_func(d)
def add_usb_ich9_controllers(self):
- ctrl = VirtualControllerUSB(self.conn,
- model="ich9-ehci1")
+ ctrl = VirtualController(self.conn)
+ ctrl.type = "usb"
+ ctrl.model = "ich9-ehci1"
self.add_device(ctrl)
- ctrl = VirtualControllerUSB(self.conn,
- model="ich9-uhci1")
- ctrl.get_master().startport = 0
+ ctrl = VirtualController(self.conn)
+ ctrl.type = "usb"
+ ctrl.model = "ich9-uhci1"
+ ctrl.master_startport = 0
self.add_device(ctrl)
- ctrl = VirtualControllerUSB(self.conn,
- model="ich9-uhci2")
- ctrl.get_master().startport = 2
+ ctrl = VirtualController(self.conn)
+ ctrl.type = "usb"
+ ctrl.model = "ich9-uhci2"
+ ctrl.master_startport = 2
self.add_device(ctrl)
- ctrl = VirtualControllerUSB(self.conn,
- model="ich9-uhci3")
- ctrl.get_master().startport = 4
+ ctrl = VirtualController(self.conn)
+ ctrl.type = "usb"
+ ctrl.model = "ich9-uhci3"
+ ctrl.master_startport = 4
self.add_device(ctrl)
def _set_defaults(self, devlist_func, remove_func, features):
diff --git a/virtinst/VirtualController.py b/virtinst/VirtualController.py
index af0df361d..08ef7c4ae 100644
--- a/virtinst/VirtualController.py
+++ b/virtinst/VirtualController.py
@@ -18,194 +18,48 @@
# MA 02110-1301 USA.
from virtinst.VirtualDevice import VirtualDevice
-from virtinst.xmlbuilder import XMLBuilder, XMLProperty
-import logging
+from virtinst.xmlbuilder import XMLProperty
class VirtualController(VirtualDevice):
-
_virtual_device_type = VirtualDevice.VIRTUAL_DEV_CONTROLLER
- CONTROLLER_TYPE_IDE = "ide"
- CONTROLLER_TYPE_FDC = "fdc"
- CONTROLLER_TYPE_SCSI = "scsi"
- CONTROLLER_TYPE_SATA = "sata"
- CONTROLLER_TYPE_VIRTIOSERIAL = "virtio-serial"
- CONTROLLER_TYPE_USB = "usb"
- CONTROLLER_TYPE_PCI = "pci"
- CONTROLLER_TYPE_CCID = "ccid"
- CONTROLLER_TYPES = [CONTROLLER_TYPE_IDE, CONTROLLER_TYPE_FDC,
- CONTROLLER_TYPE_SCSI, CONTROLLER_TYPE_SATA,
- CONTROLLER_TYPE_VIRTIOSERIAL, CONTROLLER_TYPE_USB,
- CONTROLLER_TYPE_PCI, CONTROLLER_TYPE_CCID]
+ TYPE_IDE = "ide"
+ TYPE_FDC = "fdc"
+ TYPE_SCSI = "scsi"
+ TYPE_SATA = "sata"
+ TYPE_VIRTIOSERIAL = "virtio-serial"
+ TYPE_USB = "usb"
+ TYPE_PCI = "pci"
+ TYPE_CCID = "ccid"
+ TYPES = [TYPE_IDE, TYPE_FDC,
+ TYPE_SCSI, TYPE_SATA,
+ TYPE_VIRTIOSERIAL, TYPE_USB,
+ TYPE_PCI, TYPE_CCID]
@staticmethod
def pretty_type(ctype):
pretty_mappings = {
- VirtualController.CONTROLLER_TYPE_IDE : "IDE",
- VirtualController.CONTROLLER_TYPE_FDC : "Floppy",
- VirtualController.CONTROLLER_TYPE_SCSI : "SCSI",
- VirtualController.CONTROLLER_TYPE_SATA : "SATA",
- VirtualController.CONTROLLER_TYPE_VIRTIOSERIAL : "Virtio Serial",
- VirtualController.CONTROLLER_TYPE_USB : "USB",
- VirtualController.CONTROLLER_TYPE_PCI : "PCI",
- VirtualController.CONTROLLER_TYPE_CCID : "CCID",
+ VirtualController.TYPE_IDE : "IDE",
+ VirtualController.TYPE_FDC : "Floppy",
+ VirtualController.TYPE_SCSI : "SCSI",
+ VirtualController.TYPE_SATA : "SATA",
+ VirtualController.TYPE_VIRTIOSERIAL : "Virtio Serial",
+ VirtualController.TYPE_USB : "USB",
+ VirtualController.TYPE_PCI : "PCI",
+ VirtualController.TYPE_CCID : "CCID",
}
if ctype not in pretty_mappings:
return ctype
return pretty_mappings[ctype]
- @staticmethod
- def get_class_for_type(ctype):
- if ctype not in VirtualController.CONTROLLER_TYPES:
- raise ValueError("Unknown controller type '%s'" % ctype)
+ _XML_PROP_ORDER = ["type", "index", "model"]
- if ctype == VirtualController.CONTROLLER_TYPE_IDE:
- return VirtualControllerIDE
- elif ctype == VirtualController.CONTROLLER_TYPE_FDC:
- return VirtualControllerFDC
- elif ctype == VirtualController.CONTROLLER_TYPE_SCSI:
- 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
+ type = XMLProperty(xpath="./@type")
+ model = XMLProperty(xpath="./@model")
+ vectors = XMLProperty(xpath="./@vectors", is_int=True)
+ ports = XMLProperty(xpath="./@ports", is_int=True)
+ master_startport = XMLProperty(xpath="./master/@startport", is_int=True)
- _controller_type = None
-
- 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 = " "
- xml += ">\n"
- xml += childxml
- xml += " "
- 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 "" % self.startport
+ index = XMLProperty(xpath="./@index", is_int=True, default_cb=lambda s: 0)
diff --git a/virtinst/cli.py b/virtinst/cli.py
index dde7349ee..aa0beb3e9 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -1639,21 +1639,20 @@ def parse_controller(guest, optstring, dev=None):
# Peel the mode off the front
opts = parse_optstr(optstring, remove_first="type")
- ctrltype = get_opt_param(opts, "type")
address = get_opt_param(opts, "address")
- master = get_opt_param(opts, "master")
if not dev:
- cl = virtinst.VirtualController.get_class_for_type(ctrltype)
- dev = cl(guest.conn, model=opts.get("model"))
+ dev = virtinst.VirtualController(guest.conn)
set_param = _build_set_param(dev, opts)
+ set_param("type", "type")
set_param("model", "model")
set_param("index", "index")
- dev.set_address(address)
- if master:
- dev.set_master(master)
+ set_param("master_startport", "master")
+ if address:
+ dev.set_address(address)
+
if opts:
raise ValueError(_("Unknown options %s") % opts.keys())
diff --git a/virtinst/xmlbuilder.py b/virtinst/xmlbuilder.py
index 348e50e3f..78bb47b6a 100644
--- a/virtinst/xmlbuilder.py
+++ b/virtinst/xmlbuilder.py
@@ -438,10 +438,10 @@ class XMLProperty(property):
return None
return bool(val)
elif self._is_int and val is not None:
- base = 10
+ intkwargs = {}
if "0x" in str(val):
- base = 16
- return int(val, base=base)
+ intkwargs["base"] = 16
+ return int(val, **intkwargs)
elif self._convert_value_for_getter_cb:
return self._convert_value_for_getter_cb(xmlbuilder, val)
elif self._is_multi and val is None: