diff --git a/ChangeLog b/ChangeLog index 330e2a5ddc..5112d1c7e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +Thu Dec 12 09:05:03 EST 2006 Daniel Berrange + + * src/xend_internal.c: Added support for vnclisten parameter + in generated XML + * src/xml.c: Support new style paravirt framebuffer graphics + configuration from xen 3.0.4 tree. Also add support for setting + vncpasswd & vnclisten address SEXPR values, based on passwd + and listen XML attributes. + * tests/sexpr2xmltest.c: Whitespace cleanup. + * tests/xml2sexprtest.c: Added test cases for new style paravirt + framebuffer graphics configuration + * tests/xml2sexprdata/xml2sexpr-pv-vfb*: Data files for new + tests for graphics + * tests/sexpr2xmldata/sexpr2xml-pv-vfb-*.xml: Added listen address + attribute + Thu Dec 7 12:28:03 EST 2006 Daniel Berrange * src/xend_internal.c: Add bounds checking in xenDaemonListDomains to diff --git a/src/xend_internal.c b/src/xend_internal.c index e3f652c70c..3cf1dd6fa8 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -1745,9 +1745,14 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi virBufferAdd(&buf, " \n", 27); } else if (tmp && !strcmp(tmp, "vnc")) { int port = xenStoreDomainGetVNCPort(conn, domid); + const char *listenAddr = sexpr_node(node, "device/vfb/vnclisten"); if (port == -1) port = 5900 + domid; - virBufferVSprintf(&buf, " \n", port); + if (listenAddr) { + virBufferVSprintf(&buf, " \n", port, listenAddr); + } else { + virBufferVSprintf(&buf, " \n", port); + } } } } @@ -1787,9 +1792,13 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi if (tmp != NULL) { if (tmp[0] == '1') { int port = xenStoreDomainGetVNCPort(conn, domid); + const char *listenAddr = sexpr_fmt_node(root, "domain/image/%s/vnclisten", hvm ? "hvm" : "linux"); if (port == -1) port = 5900 + domid; - virBufferVSprintf(&buf, " \n", port); + if (listenAddr) + virBufferVSprintf(&buf, " \n", port, listenAddr); + else + virBufferVSprintf(&buf, " \n", port); } } diff --git a/src/xml.c b/src/xml.c index c589934238..6c7e22c60f 100644 --- a/src/xml.c +++ b/src/xml.c @@ -572,7 +572,7 @@ virDomainGetXMLDesc(virDomainPtr domain, int flags) #ifndef PROXY /** - * virtDomainParseXMLGraphicsDesc: + * virtDomainParseXMLGraphicsDescImage: * @node: node containing graphics description * @buf: a buffer for the result S-Expr * @xendConfigVersion: xend configuration file format @@ -584,7 +584,7 @@ virDomainGetXMLDesc(virDomainPtr domain, int flags) * * Returns 0 in case of success, -1 in case of error */ -static int virDomainParseXMLGraphicsDesc(xmlNodePtr node, virBufferPtr buf, int xendConfigVersion) +static int virDomainParseXMLGraphicsDescImage(xmlNodePtr node, virBufferPtr buf, int xendConfigVersion) { xmlChar *graphics_type = NULL; @@ -592,16 +592,19 @@ static int virDomainParseXMLGraphicsDesc(xmlNodePtr node, virBufferPtr buf, int if (graphics_type != NULL) { if (xmlStrEqual(graphics_type, BAD_CAST "sdl")) { virBufferAdd(buf, "(sdl 1)", 7); - // TODO: - // Need to understand sdl options - // - //virBufferAdd(buf, "(display localhost:10.0)", 24); - //virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30); + /* TODO: + * Need to understand sdl options + * + *virBufferAdd(buf, "(display localhost:10.0)", 24); + *virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30); + */ } else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) { virBufferAdd(buf, "(vnc 1)", 7); if (xendConfigVersion >= 2) { xmlChar *vncport = xmlGetProp(node, BAD_CAST "port"); + xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen"); + xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd"); if (vncport != NULL) { long port = strtol((const char *)vncport, NULL, 10); if (port == -1) @@ -610,6 +613,14 @@ static int virDomainParseXMLGraphicsDesc(xmlNodePtr node, virBufferPtr buf, int virBufferVSprintf(buf, "(vncdisplay %d)", port - 5900); xmlFree(vncport); } + if (vnclisten != NULL) { + virBufferVSprintf(buf, "(vnclisten %s)", vnclisten); + xmlFree(vnclisten); + } + if (vncpasswd != NULL) { + virBufferVSprintf(buf, "(vncpasswd %s)", vncpasswd); + xmlFree(vncpasswd); + } } } xmlFree(graphics_type); @@ -618,6 +629,64 @@ static int virDomainParseXMLGraphicsDesc(xmlNodePtr node, virBufferPtr buf, int } +/** + * virtDomainParseXMLGraphicsDescVFB: + * @node: node containing graphics description + * @buf: a buffer for the result S-Expr + * + * Parse the graphics part of the XML description and add it to the S-Expr + * in buf. This is a temporary interface as the S-Expr interface will be + * replaced by XML-RPC in the future. However the XML format should stay + * valid over time. + * + * Returns 0 in case of success, -1 in case of error + */ +static int virDomainParseXMLGraphicsDescVFB(xmlNodePtr node, virBufferPtr buf) +{ + xmlChar *graphics_type = NULL; + + graphics_type = xmlGetProp(node, BAD_CAST "type"); + if (graphics_type != NULL) { + virBufferAdd(buf, "(device (vkbd))", 15); + virBufferAdd(buf, "(device (vfb ", 13); + if (xmlStrEqual(graphics_type, BAD_CAST "sdl")) { + virBufferAdd(buf, "(type sdl)", 10); + /* TODO: + * Need to understand sdl options + * + *virBufferAdd(buf, "(display localhost:10.0)", 24); + *virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30); + */ + } + else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) { + virBufferAdd(buf, "(type vnc)", 10); + xmlChar *vncport = xmlGetProp(node, BAD_CAST "port"); + xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen"); + xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd"); + if (vncport != NULL) { + long port = strtol((const char *)vncport, NULL, 10); + if (port == -1) + virBufferAdd(buf, "(vncunused 1)", 13); + else if (port > 5900) + virBufferVSprintf(buf, "(vncdisplay %d)", port - 5900); + xmlFree(vncport); + } + if (vnclisten != NULL) { + virBufferVSprintf(buf, "(vnclisten %s)", vnclisten); + xmlFree(vnclisten); + } + if (vncpasswd != NULL) { + virBufferVSprintf(buf, "(vncpasswd %s)", vncpasswd); + xmlFree(vncpasswd); + } + } + virBufferAdd(buf, "))", 2); + xmlFree(graphics_type); + } + return 0; +} + + /** * virDomainParseXMLOSDescHVM: * @node: node containing HVM OS description @@ -792,7 +861,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); if ((obj != NULL) && (obj->type == XPATH_NODESET) && (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) { - res = virDomainParseXMLGraphicsDesc(obj->nodesetval->nodeTab[0], buf, xendConfigVersion); + res = virDomainParseXMLGraphicsDescImage(obj->nodesetval->nodeTab[0], buf, xendConfigVersion); if (res != 0) { goto error; } @@ -896,15 +965,18 @@ virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr virBufferVSprintf(buf, "(args '%s')", (const char *) cmdline); /* Is a graphics device specified? */ - obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); - if ((obj != NULL) && (obj->type == XPATH_NODESET) && - (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) { - res = virDomainParseXMLGraphicsDesc(obj->nodesetval->nodeTab[0], buf, xendConfigVersion); - if (res != 0) { - goto error; + /* Old style config before merge of PVFB */ + if (xendConfigVersion < 3) { + obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); + if ((obj != NULL) && (obj->type == XPATH_NODESET) && + (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) { + res = virDomainParseXMLGraphicsDescImage(obj->nodesetval->nodeTab[0], buf, xendConfigVersion); + if (res != 0) { + goto error; + } } + xmlXPathFreeObject(obj); } - xmlXPathFreeObject(obj); error: virBufferAdd(buf, "))", 2); @@ -1408,6 +1480,21 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) } xmlXPathFreeObject(obj); + /* New style PVFB config - 3.0.4 merge */ + if (xendConfigVersion >= 3 && !hvm) { + obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics", ctxt); + if ((obj != NULL) && (obj->type == XPATH_NODESET) && + (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) { + for (i = 0; i < obj->nodesetval->nodeNr; i++) { + res = virDomainParseXMLGraphicsDescVFB(obj->nodesetval->nodeTab[i], &buf); + if (res != 0) { + goto error; + } + } + } + xmlXPathFreeObject(obj); + } + virBufferAdd(&buf, ")", 1); /* closes (vm */ buf.content[buf.use] = 0; diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.xml b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.xml index ee3926f18e..c304d25930 100644 --- a/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.xml +++ b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.xml @@ -18,6 +18,6 @@ - + diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml index ee3926f18e..c304d25930 100644 --- a/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml +++ b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml @@ -18,6 +18,6 @@ - + diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c index d8ab63233d..d1d020c49c 100644 --- a/tests/sexpr2xmltest.c +++ b/tests/sexpr2xmltest.c @@ -64,14 +64,14 @@ static int testComparePVOrigVFB(void *data ATTRIBUTE_UNUSED) { return testCompareFiles("sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml", "sexpr2xmldata/sexpr2xml-pv-vfb-orig.sexpr", 2); -} +} static int testComparePVNewVFB(void *data ATTRIBUTE_UNUSED) { return testCompareFiles("sexpr2xmldata/sexpr2xml-pv-vfb-new.xml", "sexpr2xmldata/sexpr2xml-pv-vfb-new.sexpr", 3); -} +} static int testCompareFVversion2(void *data ATTRIBUTE_UNUSED) { @@ -147,6 +147,7 @@ main(int argc, char **argv) if (virtTestRun("SEXPR-2-XML PV config (version 2)", 1, testComparePVversion2, NULL) != 0) ret = -1; + if (virtTestRun("SEXPR-2-XML PV config (Orig VFB)", 1, testComparePVOrigVFB, NULL) != 0) ret = -1; diff --git a/tests/xml2sexprdata/xml2sexpr-pv-vfb-new.sexpr b/tests/xml2sexprdata/xml2sexpr-pv-vfb-new.sexpr new file mode 100644 index 0000000000..aac8c42a54 --- /dev/null +++ b/tests/xml2sexprdata/xml2sexpr-pv-vfb-new.sexpr @@ -0,0 +1 @@ +(vm (name 'pvtest')(memory 420)(maxmem 420)(vcpus 2)(uuid '596a5d2171f48fb2e068e2386a5c413e')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (linux (kernel '/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk '/var/lib/xen/initrd.img.0u-Vhq')(args ' method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os ')))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode 'w')))(device (vkbd))(device (vfb (type vnc)(vncdisplay 6)(vnclisten 127.0.0.1)(vncpasswd 123456)))) \ No newline at end of file diff --git a/tests/xml2sexprdata/xml2sexpr-pv-vfb-new.xml b/tests/xml2sexprdata/xml2sexpr-pv-vfb-new.xml new file mode 100644 index 0000000000..b75cf3b238 --- /dev/null +++ b/tests/xml2sexprdata/xml2sexpr-pv-vfb-new.xml @@ -0,0 +1,23 @@ + + pvtest + 596a5d2171f48fb2e068e2386a5c413e + + linux + /var/lib/xen/vmlinuz.2Dn2YT + /var/lib/xen/initrd.img.0u-Vhq + method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os + + 430080 + 2 + destroy + destroy + destroy + + + + + + + + + diff --git a/tests/xml2sexprdata/xml2sexpr-pv-vfb-orig.sexpr b/tests/xml2sexprdata/xml2sexpr-pv-vfb-orig.sexpr new file mode 100644 index 0000000000..a1dc66ff43 --- /dev/null +++ b/tests/xml2sexprdata/xml2sexpr-pv-vfb-orig.sexpr @@ -0,0 +1 @@ +(vm (name 'pvtest')(memory 420)(maxmem 420)(vcpus 2)(uuid '596a5d2171f48fb2e068e2386a5c413e')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (linux (kernel '/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk '/var/lib/xen/initrd.img.0u-Vhq')(args ' method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os ')(vnc 1)(vncdisplay 6)(vnclisten 127.0.0.1)(vncpasswd 123456)))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode 'w')))) \ No newline at end of file diff --git a/tests/xml2sexprdata/xml2sexpr-pv-vfb-orig.xml b/tests/xml2sexprdata/xml2sexpr-pv-vfb-orig.xml new file mode 100644 index 0000000000..b75cf3b238 --- /dev/null +++ b/tests/xml2sexprdata/xml2sexpr-pv-vfb-orig.xml @@ -0,0 +1,23 @@ + + pvtest + 596a5d2171f48fb2e068e2386a5c413e + + linux + /var/lib/xen/vmlinuz.2Dn2YT + /var/lib/xen/initrd.img.0u-Vhq + method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os + + 430080 + 2 + destroy + destroy + destroy + + + + + + + + + diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c index a1c09e403c..e75a1266ae 100644 --- a/tests/xml2sexprtest.c +++ b/tests/xml2sexprtest.c @@ -82,6 +82,21 @@ static int testCompareFVversion2VNC(void *data ATTRIBUTE_UNUSED) { 2); } +static int testComparePVOrigVFB(void *data ATTRIBUTE_UNUSED) { + return testCompareFiles("xml2sexprdata/xml2sexpr-pv-vfb-orig.xml", + "xml2sexprdata/xml2sexpr-pv-vfb-orig.sexpr", + "pvtest", + 2); +} + + +static int testComparePVNewVFB(void *data ATTRIBUTE_UNUSED) { + return testCompareFiles("xml2sexprdata/xml2sexpr-pv-vfb-new.xml", + "xml2sexprdata/xml2sexpr-pv-vfb-new.sexpr", + "pvtest", + 3); +} + static int testCompareDiskFile(void *data ATTRIBUTE_UNUSED) { return testCompareFiles("xml2sexprdata/xml2sexpr-disk-file.xml", "xml2sexprdata/xml2sexpr-disk-file.sexpr", @@ -185,6 +200,14 @@ main(int argc, char **argv) 1, testCompareFVversion2VNC, NULL) != 0) ret = -1; + if (virtTestRun("XML-2-SEXPR PV config (Orig VFB)", + 1, testComparePVOrigVFB, NULL) != 0) + ret = -1; + + if (virtTestRun("XML-2-SEXPR PV config (New VFB)", + 1, testComparePVNewVFB, NULL) != 0) + ret = -1; + if (virtTestRun("XML-2-SEXPR Disk File", 1, testCompareDiskFile, NULL) != 0) ret = -1;