On 11/01/2010 12:17 PM, Daniel P. Berrange wrote:
This adds an element
<graphics type='spice' port='5903' tlsPort='5904'
autoport='yes' listen='127.0.0.1'/>
This is the bare minimum that should be exposed in the guest
config for SPICE. Other parameters are better handled as per
host level configuration tunables
* docs/schemas/domain.rng: Define the SPICE <graphics> schema
* src/domain_conf.h, src/domain_conf.c: Add parsing and formatting
for SPICE graphics config
* src/qemu_conf.c: Complain about unsupported graphics types
---
docs/schemas/domain.rng | 38 ++++++++++++++++++++++
src/conf/domain_conf.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++-
src/conf/domain_conf.h | 9 +++++
src/qemu/qemu_conf.c | 2 +-
4 files changed, 127 insertions(+), 2 deletions(-)
Also missing docs/formatdomain.html.in changes; but unlike patch 2/10
where the change was a trivial one-word addition, this needs a full
paragraph, so I'd like to see this before giving an ack.
Rearranging my review a bit...
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 78f28d0..0238f92 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -511,6 +511,7 @@ enum virDomainGraphicsType {
VIR_DOMAIN_GRAPHICS_TYPE_VNC,
VIR_DOMAIN_GRAPHICS_TYPE_RDP,
VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP,
+ VIR_DOMAIN_GRAPHICS_TYPE_SPICE,
VIR_DOMAIN_GRAPHICS_TYPE_LAST,
};
@@ -543,6 +544,14 @@ struct _virDomainGraphicsDef {
char *display;
unsigned int fullscreen :1;
} desktop;
+ struct {
+ int port;
+ int tlsPort;
Should these two be unsigned short, rather than int?
+ char *listenAddr;
+ char *keymap;
+ char *passwd;
+ unsigned int autoport :1;
Or, maybe keep port as int, and use a sentinel of -1 to mean autoport,
rather than wasting another 4/8 bytes of struct space for one bit for
autoport?
+ } spice;
} data;
};
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index c8beffc..3163257 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -1090,6 +1090,44 @@
</group>
<group>
<attribute name="type">
+ <value>spice</value>
+ </attribute>
HALLELUJAH! The stupid Thunderbird bug that corrupted spacing in
message replies prior to a word starting with <, >, or & appears to be
fixed in the latest F13 build now! (.rng patches were so much harder
for me to review when t-bird insisted on left-flushing the entire .rng
chunk) :)
+ <optional>
+ <attribute name="listen">
+ <ref name="addrIP"/>
addrIP is hard-coded to IPv4 at the moment; is this something that would
need adjustment for IPv6?
@@ -3202,6 +3209,50 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
int flags) {
def->data.desktop.fullscreen = 0;
def->data.desktop.display = virXMLPropString(node, "display");
+ } else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+ char *port = virXMLPropString(node, "port");
+ char *tlsPort;
+ char *autoport;
+
+ if (port) {
+ if (virStrToLong_i(port, NULL, 10, &def->data.spice.port) < 0) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse spice port %s"), port);
+ VIR_FREE(port);
+ goto error;
+ }
+ VIR_FREE(port);
+ } else {
+ def->data.spice.port = 5900;
+ }
Should we validate that def->data.spice.port < 64k? That is,
port='100000' should be rejected.
+
+ tlsPort = virXMLPropString(node, "tlsPort");
+ if (tlsPort) {
+ if (virStrToLong_i(tlsPort, NULL, 10, &def->data.spice.tlsPort) <
0) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse spice tlsPort %s"),
tlsPort);
+ VIR_FREE(tlsPort);
+ goto error;
+ }
+ VIR_FREE(tlsPort);
+ } else {
+ def->data.spice.tlsPort = 0;
+ }
Likewise for tlsPort.
+ def->data.spice.listenAddr = virXMLPropString(node,
"listen");
...
+
+ if (def->data.spice.listenAddr)
+ virBufferVSprintf(buf, " listen='%s'",
+ def->data.spice.listenAddr);
Should we be storing listenAddr as a raw string, or should we be
converting it to/from virSocketAddr? Conversion to virSocketAddr would
also allow validation
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 149dcee..aa42e04 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -4949,7 +4949,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
if (def->nvideos) {
if (def->nvideos > 1) {
- qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
"%s", _("only one video card is currently
supported"));
This seems like an independent change worth putting in at any time.
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org