With the paravirtualized framebuffer, the 'vnc' related options are all within the (image (linux ...)) bit of the S-Expression. When using the pygrub bootloader though, there is no (image) block in the SXPR at all. This patch changes this, so that if a bootloader is used, then we still generate an (image) block containing only the VNC related bits. This patch is dependant on a corresponding fix to XenD server - I'm also attaching this patch here for conveinance. It appears as if the paravirt framebuffer configuration will change significantly before it is merged upstream in xen-devel, so I don't anticpate the attached patch being merged in libvirt CVS. Instead it'll probably live in the Fedora / RHEL RPM spec files as a patch. I include it here merely for completeness Regards, Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
Index: src/xml.c =================================================================== RCS file: /data/cvs/libvirt/src/xml.c,v retrieving revision 1.48 diff -c -r1.48 xml.c *** src/xml.c 15 Nov 2006 00:38:13 -0000 1.48 --- src/xml.c 15 Nov 2006 02:34:06 -0000 *************** *** 818,823 **** --- 818,824 ---- * @buf: a buffer for the result S-Expr * @ctxt: a path context representing the XML description * @xendConfigVersion: xend configuration file format + * @hasBootLoader: flag indicating whether a bootloader is set * * Parse the OS part of the XML description for a paravirtualized domain * and add it to the S-Expr in buf. This is a temporary interface as the *************** *** 827,833 **** * Returns 0 in case of success, -1 in case of error. */ static int ! virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int xendConfigVersion) { xmlNodePtr cur, txt; xmlXPathObjectPtr obj = NULL; --- 828,834 ---- * Returns 0 in case of success, -1 in case of error. */ static int ! virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int xendConfigVersion, int hasBootloader) { xmlNodePtr cur, txt; xmlXPathObjectPtr obj = NULL; *************** *** 875,898 **** } cur = cur->next; } if ((type != NULL) && (!xmlStrEqual(type, BAD_CAST "linux"))) { /* VIR_ERR_OS_TYPE */ virXMLError(VIR_ERR_OS_TYPE, (const char *) type, 0); return (-1); } virBufferAdd(buf, "(image (linux ", 14); ! if (kernel == NULL) { virXMLError(VIR_ERR_NO_KERNEL, NULL, 0); ! return (-1); ! } else { ! virBufferVSprintf(buf, "(kernel '%s')", (const char *) kernel); } - if (initrd != NULL) - virBufferVSprintf(buf, "(ramdisk '%s')", (const char *) initrd); - if (root != NULL) - virBufferVSprintf(buf, "(root '%s')", (const char *) root); - if (cmdline != NULL) - virBufferVSprintf(buf, "(args '%s')", (const char *) cmdline); /* Is a graphics device specified? */ obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); --- 876,901 ---- } cur = cur->next; } + if ((type != NULL) && (!xmlStrEqual(type, BAD_CAST "linux"))) { /* VIR_ERR_OS_TYPE */ virXMLError(VIR_ERR_OS_TYPE, (const char *) type, 0); return (-1); } virBufferAdd(buf, "(image (linux ", 14); ! if (kernel != NULL) { ! virBufferVSprintf(buf, "(kernel '%s')", (const char *) kernel); ! ! if (initrd != NULL) ! virBufferVSprintf(buf, "(ramdisk '%s')", (const char *) initrd); ! if (root != NULL) ! virBufferVSprintf(buf, "(root '%s')", (const char *) root); ! if (cmdline != NULL) ! virBufferVSprintf(buf, "(args '%s')", (const char *) cmdline); ! } else if (!hasBootloader) { virXMLError(VIR_ERR_NO_KERNEL, NULL, 0); ! return (-1); } /* Is a graphics device specified? */ obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); *************** *** 1341,1370 **** obj = xmlXPathEval(BAD_CAST "/domain/os[1]", ctxt); if ((obj != NULL) && (obj->type == XPATH_NODESET) && (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr == 1)) { ! /* Analyze of the os description, based on HVM or PV. */ ! tmpobj = xmlXPathEval(BAD_CAST "string(/domain/os/type[1])", ctxt); ! if ((tmpobj != NULL) && ! ((tmpobj->type != XPATH_STRING) || (tmpobj->stringval == NULL) || ! (tmpobj->stringval[0] == 0))) { ! xmlXPathFreeObject(tmpobj); ! virXMLError(VIR_ERR_OS_TYPE, nam, 0); ! goto error; ! } ! if ((tmpobj == NULL) || !xmlStrEqual(tmpobj->stringval, BAD_CAST "hvm")) { ! res = virDomainParseXMLOSDescPV(obj->nodesetval->nodeTab[0], &buf, ctxt, xendConfigVersion); ! } else { ! hvm = 1; ! res = virDomainParseXMLOSDescHVM(obj->nodesetval->nodeTab[0], &buf, ctxt, xendConfigVersion); ! } ! xmlXPathFreeObject(tmpobj); ! if (res != 0) ! goto error; ! } else if (bootloader == 0) { ! virXMLError(VIR_ERR_NO_OS, nam, 0); ! goto error; } xmlXPathFreeObject(obj); --- 1344,1388 ---- obj = xmlXPathEval(BAD_CAST "/domain/os[1]", ctxt); if ((obj != NULL) && (obj->type == XPATH_NODESET) && (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr == 1)) { ! /* Analyze of the os description, based on HVM or PV. */ ! tmpobj = xmlXPathEval(BAD_CAST "string(/domain/os/type[1])", ctxt); ! if ((tmpobj != NULL) && ! ((tmpobj->type != XPATH_STRING) || (tmpobj->stringval == NULL) || ! (tmpobj->stringval[0] == 0))) { ! xmlXPathFreeObject(tmpobj); ! virXMLError(VIR_ERR_OS_TYPE, nam, 0); ! goto error; ! } ! if ((tmpobj == NULL) || !xmlStrEqual(tmpobj->stringval, BAD_CAST "hvm")) { ! res = virDomainParseXMLOSDescPV(obj->nodesetval->nodeTab[0], &buf, ctxt, xendConfigVersion, bootloader); ! } else { ! hvm = 1; ! res = virDomainParseXMLOSDescHVM(obj->nodesetval->nodeTab[0], &buf, ctxt, xendConfigVersion); ! } ! xmlXPathFreeObject(tmpobj); ! if (res != 0) ! goto error; ! } else { ! if (bootloader == 1) { ! /* Is a graphics device specified? */ ! tmpobj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); ! if ((tmpobj != NULL) && (tmpobj->type == XPATH_NODESET) && ! (tmpobj->nodesetval != NULL) && (tmpobj->nodesetval->nodeNr > 0)) { ! virBufferAdd(&buf, "(image (linux ", 14); ! res = virDomainParseXMLGraphicsDesc(tmpobj->nodesetval->nodeTab[0], &buf, xendConfigVersion); ! if (res != 0) { ! goto error; ! } ! virBufferAdd(&buf, "))", 2); ! } ! xmlXPathFreeObject(tmpobj); ! } else { ! virXMLError(VIR_ERR_NO_OS, nam, 0); ! goto error; ! } } xmlXPathFreeObject(obj);
1289c1289 < if self.infoIsSet('bootloader') and not self.infoIsSet('image'): --- > if self.infoIsSet('bootloader') and not self.is_kernel_set(): 1773a1774,1785 > def is_kernel_set(self): > if self.info["image"] is None: > log.debug("No image set") > return False > img = self.info["image"] > kernel = sxp.child_value(img, "kernel", None) > if kernel is None: > log.debug("No kernel set") > return False > log.debug("FOund kernel") > return True >