[virt-tools-list] [PATCH 1/2] Add VirtualCharSpicevmcDevice
Marc-André Lureau
marcandre.lureau at redhat.com
Tue Mar 15 12:36:55 UTC 2011
Here is an example of resulting XML:
<channel type='spicevmc'>
<target type='virtio'/>
</channel>
---
tests/xmlconfig-xml/boot-many-devices.xml | 3 +
tests/xmlconfig.py | 4 ++
virtinst/VirtualCharDevice.py | 78 +++++++++++++++++++++++-----
3 files changed, 71 insertions(+), 14 deletions(-)
diff --git a/tests/xmlconfig-xml/boot-many-devices.xml b/tests/xmlconfig-xml/boot-many-devices.xml
index 602419d..65e83f6 100644
--- a/tests/xmlconfig-xml/boot-many-devices.xml
+++ b/tests/xmlconfig-xml/boot-many-devices.xml
@@ -57,6 +57,9 @@
<parallel type='unix'>
<source mode='bind' path='/tmp/foobar'/>
</parallel>
+ <channel type='spicevmc'>
+ <target type='virtio'/>
+ </channel>
<sound model='sb16'/>
<sound model='es1370'/>
<video>
diff --git a/tests/xmlconfig.py b/tests/xmlconfig.py
index c281fad..5692cb5 100644
--- a/tests/xmlconfig.py
+++ b/tests/xmlconfig.py
@@ -892,8 +892,12 @@ class TestXMLConfig(unittest.TestCase):
VirtualCharDevice.DEV_PARALLEL,
VirtualCharDevice.CHAR_UNIX)
cdev2.source_path = "/tmp/foobar"
+ cdev3 = VirtualCharDevice.get_dev_instance(g.conn,
+ VirtualCharDevice.DEV_CHANNEL,
+ VirtualCharDevice.CHAR_SPICEVMC)
g.add_device(cdev1)
g.add_device(cdev2)
+ g.add_device(cdev3)
# Video Devices
vdev1 = VirtualVideoDevice(g.conn)
diff --git a/virtinst/VirtualCharDevice.py b/virtinst/VirtualCharDevice.py
index ae4ad58..2f16fa2 100644
--- a/virtinst/VirtualCharDevice.py
+++ b/virtinst/VirtualCharDevice.py
@@ -35,18 +35,20 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
DEV_CHANNEL = "channel"
dev_types = [ DEV_SERIAL, DEV_PARALLEL, DEV_CONSOLE, DEV_CHANNEL]
- CHAR_PTY = "pty"
- CHAR_DEV = "dev"
- CHAR_STDIO = "stdio"
- CHAR_PIPE = "pipe"
- CHAR_FILE = "file"
- CHAR_VC = "vc"
- CHAR_NULL = "null"
- CHAR_TCP = "tcp"
- CHAR_UDP = "udp"
- CHAR_UNIX = "unix"
+ CHAR_PTY = "pty"
+ CHAR_DEV = "dev"
+ CHAR_STDIO = "stdio"
+ CHAR_PIPE = "pipe"
+ CHAR_FILE = "file"
+ CHAR_VC = "vc"
+ CHAR_NULL = "null"
+ CHAR_TCP = "tcp"
+ CHAR_UDP = "udp"
+ CHAR_UNIX = "unix"
+ CHAR_SPICEVMC = "spicevmc"
char_types = [ CHAR_PTY, CHAR_DEV, CHAR_STDIO, CHAR_FILE, CHAR_VC,
- CHAR_PIPE, CHAR_NULL, CHAR_TCP, CHAR_UDP, CHAR_UNIX ]
+ CHAR_PIPE, CHAR_NULL, CHAR_TCP, CHAR_UDP, CHAR_UNIX,
+ CHAR_SPICEVMC ]
CHAR_MODE_CONNECT = "connect"
CHAR_MODE_BIND = "bind"
@@ -61,6 +63,9 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
target_types = [ CHAR_CHANNEL_TARGET_GUESTFWD,
CHAR_CHANNEL_TARGET_VIRTIO ]
+ CHAR_CHANNEL_ADDRESS_VIRTIO_SERIAL = "virtio-serial"
+ address_types = [ CHAR_CHANNEL_ADDRESS_VIRTIO_SERIAL ]
+
CHAR_CONSOLE_TARGET_SERIAL = "serial"
CHAR_CONSOLE_TARGET_UML = "uml"
CHAR_CONSOLE_TARGET_XEN = "xen"
@@ -92,6 +97,8 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
desc = _("UDP net console")
elif char_type == VirtualCharDevice.CHAR_UNIX:
desc = _("Unix socket")
+ elif char_type == VirtualCharDevice.CHAR_SPICEVMC:
+ desc = _("Spice agent")
return desc
get_char_type_desc = staticmethod(get_char_type_desc)
@@ -144,6 +151,8 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
c = VirtualCharUnixDevice
elif char_type == VirtualCharDevice.CHAR_UDP:
c = VirtualCharUdpDevice
+ elif char_type == VirtualCharDevice.CHAR_SPICEVMC:
+ c = VirtualCharSpicevmcDevice
else:
raise ValueError(_("Unknown character device type '%s'.") %
char_type)
@@ -176,6 +185,7 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
self._bind_host = None
self._bind_port = None
self._protocol = self.CHAR_PROTOCOL_RAW
+ self._address_type = None
if self.char_type == self.CHAR_UDP:
self._source_mode = self.CHAR_MODE_CONNECT
@@ -323,6 +333,17 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
doc=_("Sysfs Name of virtio port in the guest"),
xpath="./target/@name")
+ def get_address_type(self):
+ return self._address_type
+ def set_address_type(self, val):
+ if val not in self.address_types:
+ raise ValueError(_("Unknown address type '%s'. Must be in: ") % val,
+ self.address_types)
+ self._address_type = val
+ address_type = _xml_property(get_address_type, set_address_type,
+ doc=_("Channel type as exposed in the guest."),
+ xpath="./address/@type")
+
# XML building helpers
def _char_empty_xml(self):
"""
@@ -332,7 +353,7 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
def _char_file_xml(self):
"""
- Provide source xml for devs that require only a patch (dev, pipe)
+ Provide source xml for devs that require only a path (dev, pipe)
"""
file_xml = ""
mode_xml = ""
@@ -375,6 +396,15 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
xml += "/>\n"
return xml
+ def _get_address_xml(self):
+ xml = ""
+ if not self.address_type:
+ return xml
+
+ xml = " <address type='%s'" % self.address_type
+ xml += "/>\n"
+ return xml
+
def _get_xml_config(self):
xml = " <%s type='%s'" % (self._dev_type, self._char_type)
@@ -388,7 +418,14 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
"Target parameters not used with '%s' devices, only '%s'" %
(self._dev_type, self.DEV_CHANNEL))
- if char_xml or target_xml:
+ address_xml = self._get_address_xml()
+ has_address = self._target_type == self.CHAR_CHANNEL_TARGET_VIRTIO
+ if address_xml and not has_address:
+ raise RuntimeError(
+ "Address parameters not used with '%s' target, only '%s'" %
+ (self._target_type, self.CHAR_CHANNEL_TARGET_VIRTIO))
+
+ if char_xml or target_xml or address_xml:
xml += ">"
if char_xml:
xml += "\n%s" % char_xml
@@ -396,6 +433,9 @@ class VirtualCharDevice(VirtualDevice.VirtualDevice):
if target_xml:
xml += "\n%s" % target_xml
+ if address_xml:
+ xml += "\n%s" % target_xml
+
xml += " </%s>" % self._dev_type
else:
xml += "/>"
@@ -430,7 +470,6 @@ class VirtualCharNullDevice(VirtualCharDevice):
class VirtualCharVcDevice(VirtualCharDevice):
_char_type = VirtualCharDevice.CHAR_VC
_char_xml = VirtualCharDevice._char_empty_xml
-
class VirtualCharDevDevice(VirtualCharDevice):
_char_type = VirtualCharDevice.CHAR_DEV
_char_xml = VirtualCharDevice._char_file_xml
@@ -530,3 +569,14 @@ class VirtualCharUdpDevice(VirtualCharDevice):
xml += (" <source mode='connect'%s service='%s'/>\n" %
(source_host_xml, self.source_port))
return xml
+
+class VirtualCharSpicevmcDevice(VirtualCharDevice):
+ _char_type = VirtualCharDevice.CHAR_SPICEVMC
+ _char_xml = VirtualCharDevice._char_empty_xml
+ target_types = [ VirtualCharDevice.CHAR_CHANNEL_TARGET_VIRTIO ]
+
+ def __init__(self, conn, dev_type,
+ parsexml=None, parsexmlnode=None, caps=None):
+ VirtualCharDevice.__init__(self, conn, dev_type,
+ parsexml, parsexmlnode, caps)
+ self._target_type = VirtualCharDevice.CHAR_CHANNEL_TARGET_VIRTIO
--
1.7.4
More information about the virt-tools-list
mailing list