Added support for generating new style PV framebuffer. Added vnclisten & vncpasswd handling

This commit is contained in:
Daniel P. Berrange 2006-12-13 14:08:51 +00:00
parent 804e20e6c3
commit 7a9f673e3e
11 changed files with 205 additions and 21 deletions

View File

@ -1,3 +1,19 @@
Thu Dec 12 09:05:03 EST 2006 Daniel Berrange <berrange@redhat.com>
* 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 <berrange@redhat.com> Thu Dec 7 12:28:03 EST 2006 Daniel Berrange <berrange@redhat.com>
* src/xend_internal.c: Add bounds checking in xenDaemonListDomains to * src/xend_internal.c: Add bounds checking in xenDaemonListDomains to

View File

@ -1745,12 +1745,17 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
virBufferAdd(&buf, " <graphics type='sdl'/>\n", 27); virBufferAdd(&buf, " <graphics type='sdl'/>\n", 27);
} else if (tmp && !strcmp(tmp, "vnc")) { } else if (tmp && !strcmp(tmp, "vnc")) {
int port = xenStoreDomainGetVNCPort(conn, domid); int port = xenStoreDomainGetVNCPort(conn, domid);
const char *listenAddr = sexpr_node(node, "device/vfb/vnclisten");
if (port == -1) if (port == -1)
port = 5900 + domid; port = 5900 + domid;
if (listenAddr) {
virBufferVSprintf(&buf, " <graphics type='vnc' port='%d' listen='%s'/>\n", port, listenAddr);
} else {
virBufferVSprintf(&buf, " <graphics type='vnc' port='%d'/>\n", port); virBufferVSprintf(&buf, " <graphics type='vnc' port='%d'/>\n", port);
} }
} }
} }
}
if (hvm) { if (hvm) {
tmp = sexpr_node(root, "domain/image/hvm/fda"); tmp = sexpr_node(root, "domain/image/hvm/fda");
@ -1787,8 +1792,12 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
if (tmp != NULL) { if (tmp != NULL) {
if (tmp[0] == '1') { if (tmp[0] == '1') {
int port = xenStoreDomainGetVNCPort(conn, domid); int port = xenStoreDomainGetVNCPort(conn, domid);
const char *listenAddr = sexpr_fmt_node(root, "domain/image/%s/vnclisten", hvm ? "hvm" : "linux");
if (port == -1) if (port == -1)
port = 5900 + domid; port = 5900 + domid;
if (listenAddr)
virBufferVSprintf(&buf, " <graphics type='vnc' port='%d' listen='%s'/>\n", port, listenAddr);
else
virBufferVSprintf(&buf, " <graphics type='vnc' port='%d'/>\n", port); virBufferVSprintf(&buf, " <graphics type='vnc' port='%d'/>\n", port);
} }
} }

105
src/xml.c
View File

@ -572,7 +572,7 @@ virDomainGetXMLDesc(virDomainPtr domain, int flags)
#ifndef PROXY #ifndef PROXY
/** /**
* virtDomainParseXMLGraphicsDesc: * virtDomainParseXMLGraphicsDescImage:
* @node: node containing graphics description * @node: node containing graphics description
* @buf: a buffer for the result S-Expr * @buf: a buffer for the result S-Expr
* @xendConfigVersion: xend configuration file format * @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 * 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; xmlChar *graphics_type = NULL;
@ -592,16 +592,19 @@ static int virDomainParseXMLGraphicsDesc(xmlNodePtr node, virBufferPtr buf, int
if (graphics_type != NULL) { if (graphics_type != NULL) {
if (xmlStrEqual(graphics_type, BAD_CAST "sdl")) { if (xmlStrEqual(graphics_type, BAD_CAST "sdl")) {
virBufferAdd(buf, "(sdl 1)", 7); virBufferAdd(buf, "(sdl 1)", 7);
// TODO: /* TODO:
// Need to understand sdl options * Need to understand sdl options
// *
//virBufferAdd(buf, "(display localhost:10.0)", 24); *virBufferAdd(buf, "(display localhost:10.0)", 24);
//virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30); *virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30);
*/
} }
else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) { else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
virBufferAdd(buf, "(vnc 1)", 7); virBufferAdd(buf, "(vnc 1)", 7);
if (xendConfigVersion >= 2) { if (xendConfigVersion >= 2) {
xmlChar *vncport = xmlGetProp(node, BAD_CAST "port"); xmlChar *vncport = xmlGetProp(node, BAD_CAST "port");
xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen");
xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd");
if (vncport != NULL) { if (vncport != NULL) {
long port = strtol((const char *)vncport, NULL, 10); long port = strtol((const char *)vncport, NULL, 10);
if (port == -1) if (port == -1)
@ -610,8 +613,74 @@ static int virDomainParseXMLGraphicsDesc(xmlNodePtr node, virBufferPtr buf, int
virBufferVSprintf(buf, "(vncdisplay %d)", port - 5900); virBufferVSprintf(buf, "(vncdisplay %d)", port - 5900);
xmlFree(vncport); 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);
}
return 0;
}
/**
* 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); xmlFree(graphics_type);
} }
return 0; return 0;
@ -792,7 +861,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt);
if ((obj != NULL) && (obj->type == XPATH_NODESET) && if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) { (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) { if (res != 0) {
goto error; goto error;
} }
@ -896,15 +965,18 @@ virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
virBufferVSprintf(buf, "(args '%s')", (const char *) cmdline); virBufferVSprintf(buf, "(args '%s')", (const char *) cmdline);
/* Is a graphics device specified? */ /* Is a graphics device specified? */
/* Old style config before merge of PVFB */
if (xendConfigVersion < 3) {
obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt);
if ((obj != NULL) && (obj->type == XPATH_NODESET) && if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) { (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) { if (res != 0) {
goto error; goto error;
} }
} }
xmlXPathFreeObject(obj); xmlXPathFreeObject(obj);
}
error: error:
virBufferAdd(buf, "))", 2); virBufferAdd(buf, "))", 2);
@ -1408,6 +1480,21 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion)
} }
xmlXPathFreeObject(obj); 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 */ virBufferAdd(&buf, ")", 1); /* closes (vm */
buf.content[buf.use] = 0; buf.content[buf.use] = 0;

View File

@ -18,6 +18,6 @@
<source file='/root/some.img'/> <source file='/root/some.img'/>
<target dev='xvda'/> <target dev='xvda'/>
</disk> </disk>
<graphics type='vnc' port='5906'/> <graphics type='vnc' port='5906' listen='0.0.0.0'/>
</devices> </devices>
</domain> </domain>

View File

@ -18,6 +18,6 @@
<source file='/root/some.img'/> <source file='/root/some.img'/>
<target dev='xvda'/> <target dev='xvda'/>
</disk> </disk>
<graphics type='vnc' port='5906'/> <graphics type='vnc' port='5906' listen='0.0.0.0'/>
</devices> </devices>
</domain> </domain>

View File

@ -147,6 +147,7 @@ main(int argc, char **argv)
if (virtTestRun("SEXPR-2-XML PV config (version 2)", if (virtTestRun("SEXPR-2-XML PV config (version 2)",
1, testComparePVversion2, NULL) != 0) 1, testComparePVversion2, NULL) != 0)
ret = -1; ret = -1;
if (virtTestRun("SEXPR-2-XML PV config (Orig VFB)", if (virtTestRun("SEXPR-2-XML PV config (Orig VFB)",
1, testComparePVOrigVFB, NULL) != 0) 1, testComparePVOrigVFB, NULL) != 0)
ret = -1; ret = -1;

View File

@ -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))))

View File

@ -0,0 +1,23 @@
<domain type='xen' id='6'>
<name>pvtest</name>
<uuid>596a5d2171f48fb2e068e2386a5c413e</uuid>
<os>
<type>linux</type>
<kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
<initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
<cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os </cmdline>
</os>
<memory>430080</memory>
<vcpu>2</vcpu>
<on_poweroff>destroy</on_poweroff>
<on_reboot>destroy</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='file' device='disk'>
<driver name='file'/>
<source file='/root/some.img'/>
<target dev='xvda'/>
</disk>
<graphics type='vnc' port='5906' listen="127.0.0.1" passwd="123456"/>
</devices>
</domain>

View File

@ -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'))))

View File

@ -0,0 +1,23 @@
<domain type='xen' id='6'>
<name>pvtest</name>
<uuid>596a5d2171f48fb2e068e2386a5c413e</uuid>
<os>
<type>linux</type>
<kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
<initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
<cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os </cmdline>
</os>
<memory>430080</memory>
<vcpu>2</vcpu>
<on_poweroff>destroy</on_poweroff>
<on_reboot>destroy</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='file' device='disk'>
<driver name='file'/>
<source file='/root/some.img'/>
<target dev='xvda'/>
</disk>
<graphics type='vnc' port='5906' listen="127.0.0.1" passwd="123456"/>
</devices>
</domain>

View File

@ -82,6 +82,21 @@ static int testCompareFVversion2VNC(void *data ATTRIBUTE_UNUSED) {
2); 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) { static int testCompareDiskFile(void *data ATTRIBUTE_UNUSED) {
return testCompareFiles("xml2sexprdata/xml2sexpr-disk-file.xml", return testCompareFiles("xml2sexprdata/xml2sexpr-disk-file.xml",
"xml2sexprdata/xml2sexpr-disk-file.sexpr", "xml2sexprdata/xml2sexpr-disk-file.sexpr",
@ -185,6 +200,14 @@ main(int argc, char **argv)
1, testCompareFVversion2VNC, NULL) != 0) 1, testCompareFVversion2VNC, NULL) != 0)
ret = -1; 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", if (virtTestRun("XML-2-SEXPR Disk File",
1, testCompareDiskFile, NULL) != 0) 1, testCompareDiskFile, NULL) != 0)
ret = -1; ret = -1;